250 lines
8.5 KiB
PHP
250 lines
8.5 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api\v1;
|
|
|
|
use App\Models\Calendrier;
|
|
use App\Models\Campagne;
|
|
use App\Enums\CampaignTypes;
|
|
use App\Http\Requests\Customers\StoreRequest;
|
|
use App\Http\Resources\CustomersResource;
|
|
use App\Http\Resources\StatusResource;
|
|
use App\Models\Customers;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Requests\Customers\BasketRequest;
|
|
use App\Http\Requests\Customers\MurRequest;
|
|
use App\Http\Resources\CouponsResource;
|
|
use App\Traits\CouponTrait;
|
|
use App\Traits\GenerateBR;
|
|
use Illuminate\Support\Facades\Log;
|
|
use Illuminate\Support\Facades\Request;
|
|
|
|
class CustomerController extends Controller
|
|
{
|
|
use CouponTrait;
|
|
use GenerateBR;
|
|
|
|
/**
|
|
* Display a listing of the resource.
|
|
*
|
|
* @return StatusResource
|
|
*/
|
|
public function index()
|
|
{
|
|
return new StatusResource(['status' => 'KO', 'code' => '501', 'message' => 'Not Implemented']);
|
|
}
|
|
|
|
/**
|
|
* Show the form for creating a new resource.
|
|
*
|
|
* @return StatusResource
|
|
*/
|
|
public function create()
|
|
{
|
|
return new StatusResource(['status' => 'KO', 'code' => '501', 'message' => 'Not Implemented']);
|
|
}
|
|
|
|
/**
|
|
* Store a newly created resource in storage.
|
|
*
|
|
* @param StoreRequest $request
|
|
* @return CustomersResource | StatusResource
|
|
*/
|
|
public function store(StoreRequest $request)
|
|
{
|
|
$datas = $request->validated();
|
|
try {
|
|
$customer = Customers::where([
|
|
['hashcode', $datas['hashcode']],
|
|
['email', $datas['email']]
|
|
])->firstOrNew();
|
|
$customer->fill($datas);
|
|
$customer->saveOrFail();
|
|
|
|
return new CustomersResource($customer);
|
|
} catch (\Throwable $e) {
|
|
Log::critical($e->getMessage());
|
|
return new StatusResource(['status' => 'KO', 'code' => '500', 'message' => 'Server Error.']);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Display the specified resource.
|
|
*
|
|
* @param integer $id
|
|
* @return StatusResource
|
|
*/
|
|
public function show($id)
|
|
{
|
|
return new StatusResource(['status' => 'KO', 'code' => '501', 'message' => 'Not Implemented']);
|
|
}
|
|
|
|
/**
|
|
* Show the form for editing the specified resource.
|
|
*
|
|
* @param integer $id
|
|
* @return StatusResource
|
|
*/
|
|
public function edit($id)
|
|
{
|
|
return new StatusResource(['status' => 'KO', 'code' => '501', 'message' => 'Not Implemented']);
|
|
}
|
|
|
|
/**
|
|
* Update the specified resource in storage.
|
|
*
|
|
* @param Request $request
|
|
* @return StatusResource
|
|
*/
|
|
public function update(Request $request)
|
|
{
|
|
return new StatusResource(['status' => 'KO', 'code' => '501', 'message' => 'Not Implemented']);
|
|
}
|
|
|
|
/**
|
|
* Remove the specified resource from storage.
|
|
*
|
|
* @param integer $id
|
|
* @return StatusResource
|
|
*/
|
|
public function destroy($id)
|
|
{
|
|
return new StatusResource(['status' => 'KO', 'code' => '501', 'message' => 'Not Implemented']);
|
|
}
|
|
|
|
/**
|
|
* Recupere le contenu d'un mur pour une campagne et un user
|
|
* @param MurRequest $request
|
|
* @return StatusResource
|
|
* @throws ValidationException
|
|
*/
|
|
public function mur(MurRequest $request)
|
|
{
|
|
$datas = $request->validated();
|
|
|
|
$customer = Customers::where('hashcode', $datas['hashcode'])->first();
|
|
$campagne = Campagne::find($datas['refcamp']);
|
|
|
|
if (!$campagne->camp_type->equals(CampaignTypes::mur())) {
|
|
return new StatusResource(['status' => 'KO', 'code' => 404, 'message' => 'Campaign is not mur.']);
|
|
}
|
|
if ($campagne->camp_published === 0) {
|
|
return new StatusResource(['status' => 'KO', 'code' => 404, 'message' => 'Campaign not found.']);
|
|
}
|
|
|
|
$coupons = $campagne->coupons()->whereRaw("coupon_published = 1 AND (coupon_mindatediffusion IS NULL OR coupon_mindatediffusion <= NOW()) AND (coupon_maxdatediffusion IS NULL OR coupon_maxdatediffusion >= NOW()) AND (coupon_maxdatevalidity IS NULL OR coupon_maxdatevalidity >= NOW())")->get();
|
|
|
|
$montantDispo = 0;
|
|
$montantTotal = 0;
|
|
|
|
// TODO : Improve
|
|
foreach ($coupons as $key => $coupon) {
|
|
// ---- Contrôle des calendriers de diffusion
|
|
$calendars = Calendrier::where(['calendrier_couponId' => $coupon->coupon_id])->get();
|
|
if (!$calendars->isEmpty()) {
|
|
$pub = false;
|
|
foreach ($calendars as $calendar) {
|
|
if ($calendar->isPublished()) {
|
|
$pub = true;
|
|
}
|
|
}
|
|
if (!$pub) {
|
|
$coupons->forget($key);
|
|
continue;
|
|
}
|
|
}
|
|
|
|
// Available for user
|
|
$coupon->isUsed = $this->isUsed($coupon, $campagne, $customer);
|
|
|
|
$montantTotal += $coupon->coupon_value;
|
|
if (!$coupon->isUsed) {
|
|
$montantDispo += $coupon->coupon_value;
|
|
}
|
|
}//end foreach
|
|
|
|
return new StatusResource([
|
|
'status' => "OK",
|
|
'name' => $campagne->camp_name,
|
|
'limited_printing' => $campagne->camp_limitedPrinting,
|
|
'total' => count($coupons),
|
|
'available_amount' => $montantDispo,
|
|
'total_amount' => $montantTotal,
|
|
'coupons' => CouponsResource::collection($coupons)
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Recupere le contenu d'un panier pour une campagne et un user
|
|
* @param BasketRequest $request
|
|
* @return StatusResource
|
|
* @throws ValidationException
|
|
*/
|
|
public function basket(BasketRequest $request)
|
|
{
|
|
$montantDispo = 0;
|
|
$montantTotal = 0;
|
|
$nbCoupons = 0;
|
|
$couponTotal = 0;
|
|
$coupons = [];
|
|
|
|
$datas = $request->validated();
|
|
|
|
$customer = Customers::where('hashcode', $datas['hashcode'])->first();
|
|
$campagne = Campagne::find($datas['refcamp']);
|
|
|
|
if (!$campagne->camp_type->equals(CampaignTypes::panier())) {
|
|
return new StatusResource(['status' => 'KO', 'code' => 404, 'message' => 'Campaign is not basket.']);
|
|
}
|
|
if ($campagne->camp_published === 0) {
|
|
return new StatusResource(['status' => 'KO', 'code' => 404, 'message' => 'Campaign not found.']);
|
|
}
|
|
$basket = $customer->baskets()->where('campagne_id', $campagne->camp_id)->first();
|
|
if (is_null($basket)) {
|
|
return new StatusResource(['status' => 'KO', 'code' => 404, 'message' => 'Basket not found.']);
|
|
}
|
|
|
|
foreach ($basket->contents as $content)
|
|
{
|
|
$published = true;
|
|
$nbCoupons += $content->quantity;
|
|
$couponTotal += $content->printed;
|
|
$montantTotal += ($content->coupon->coupon_value * $content->printed);
|
|
$coupon = $content->coupon()->whereRaw("coupon_published = 1 AND (coupon_mindatediffusion IS NULL OR coupon_mindatediffusion <= NOW()) AND (coupon_maxdatediffusion IS NULL OR coupon_maxdatediffusion >= NOW()) AND (coupon_maxdatevalidity IS NULL OR coupon_maxdatevalidity >= NOW())")->first();
|
|
if (!is_null($coupon))
|
|
{
|
|
// ---- Contrôle des calendriers de diffusion
|
|
$calendars = Calendrier::where(['calendrier_couponId' => $coupon->coupon_id])->get();
|
|
if (!$calendars->isEmpty()) {
|
|
$published = false;
|
|
foreach ($calendars as $calendar) {
|
|
if ($calendar->isPublished()) {
|
|
$published = true;
|
|
}
|
|
}
|
|
}
|
|
if ($published){
|
|
$montantDispo += ($coupon->coupon_value * $content->quantity);
|
|
$montantTotal += ($coupon->coupon_value * $content->quantity);
|
|
$couponTotal += $content->quantity;
|
|
$coupons[] = [
|
|
'quantity' => $content->quantity,
|
|
'printed' => $content->printed,
|
|
'coupon' => new CouponsResource($coupon)
|
|
];
|
|
}
|
|
}
|
|
}
|
|
|
|
return new StatusResource([
|
|
'status' => "OK",
|
|
'ref' => $basket->uuid,
|
|
'name' => $campagne->camp_name,
|
|
'limited_printing' => $campagne->camp_limitedPrinting,
|
|
'available_coupon' => $nbCoupons,
|
|
'available_amount' => $montantDispo,
|
|
'total_coupon' => $couponTotal,
|
|
'total_amount' => $montantTotal,
|
|
'coupons' => $coupons
|
|
]);
|
|
}
|
|
}
|