ldc-mesbr-app/app/Http/Controllers/Api/v1/CustomerController.php

251 lines
8.5 KiB
PHP
Raw Permalink Normal View History

2021-04-20 11:16:34 +02:00
<?php
namespace App\Http\Controllers\Api\v1;
use App\Models\Calendrier;
use App\Models\Campagne;
use App\Enums\CampaignTypes;
2021-04-20 19:51:30 +02:00
use App\Http\Requests\Customers\StoreRequest;
use App\Http\Resources\CustomersResource;
2021-04-20 11:16:34 +02:00
use App\Http\Resources\StatusResource;
2021-04-20 19:51:30 +02:00
use App\Models\Customers;
2021-04-20 11:16:34 +02:00
use App\Http\Controllers\Controller;
use App\Http\Requests\Customers\BasketRequest;
2021-08-05 12:06:24 +02:00
use App\Http\Requests\Customers\MurRequest;
use App\Http\Resources\CouponsResource;
use App\Traits\CouponTrait;
2025-08-14 17:05:09 +02:00
use App\Traits\GenerateBR;
2021-04-20 19:51:30 +02:00
use Illuminate\Support\Facades\Log;
2021-08-05 12:06:24 +02:00
use Illuminate\Support\Facades\Request;
2021-04-20 11:16:34 +02:00
class CustomerController extends Controller
{
2021-08-05 12:06:24 +02:00
use CouponTrait;
use GenerateBR;
2021-08-05 12:06:24 +02:00
2021-04-20 11:16:34 +02:00
/**
* 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.
*
2021-04-20 19:51:30 +02:00
* @param StoreRequest $request
* @return CustomersResource | StatusResource
2021-04-20 11:16:34 +02:00
*/
2021-04-20 19:51:30 +02:00
public function store(StoreRequest $request)
2021-04-20 11:16:34 +02:00
{
2021-06-29 16:04:22 +02:00
$datas = $request->validated();
2021-04-20 19:51:30 +02:00
try {
2021-06-29 16:04:22 +02:00
$customer = Customers::where([
2021-08-13 11:48:06 +02:00
['hashcode', $datas['hashcode']],
2021-06-29 16:04:22 +02:00
['email', $datas['email']]
])->firstOrNew();
$customer->fill($datas);
2021-04-20 19:51:30 +02:00
$customer->saveOrFail();
return new CustomersResource($customer);
2021-04-27 17:29:47 +02:00
} catch (\Throwable $e) {
2021-04-20 19:51:30 +02:00
Log::critical($e->getMessage());
return new StatusResource(['status' => 'KO', 'code' => '500', 'message' => 'Server Error.']);
}
2021-04-20 11:16:34 +02:00
}
/**
* Display the specified resource.
*
2025-04-03 09:30:16 +02:00
* @param integer $id
2021-04-20 11:16:34 +02:00
* @return StatusResource
*/
public function show($id)
{
return new StatusResource(['status' => 'KO', 'code' => '501', 'message' => 'Not Implemented']);
}
/**
* Show the form for editing the specified resource.
*
2025-04-03 09:30:16 +02:00
* @param integer $id
2021-04-20 11:16:34 +02:00
* @return StatusResource
*/
public function edit($id)
{
return new StatusResource(['status' => 'KO', 'code' => '501', 'message' => 'Not Implemented']);
}
/**
* Update the specified resource in storage.
*
2021-06-29 16:04:22 +02:00
* @param Request $request
* @return StatusResource
2021-04-20 11:16:34 +02:00
*/
2021-06-29 16:04:22 +02:00
public function update(Request $request)
2021-04-20 11:16:34 +02:00
{
2021-06-29 16:04:22 +02:00
return new StatusResource(['status' => 'KO', 'code' => '501', 'message' => 'Not Implemented']);
2021-04-20 11:16:34 +02:00
}
/**
* Remove the specified resource from storage.
*
2025-04-03 09:30:16 +02:00
* @param integer $id
2021-04-20 11:16:34 +02:00
* @return StatusResource
*/
public function destroy($id)
{
return new StatusResource(['status' => 'KO', 'code' => '501', 'message' => 'Not Implemented']);
}
2021-08-05 12:06:24 +02:00
/**
* Recupere le contenu d'un mur pour une campagne et un user
* @param MurRequest $request
* @return StatusResource
* @throws ValidationException
*/
2021-08-05 12:06:24 +02:00
public function mur(MurRequest $request)
{
$datas = $request->validated();
2021-08-13 11:48:06 +02:00
$customer = Customers::where('hashcode', $datas['hashcode'])->first();
2021-08-05 12:06:24 +02:00
$campagne = Campagne::find($datas['refcamp']);
if (!$campagne->camp_type->equals(CampaignTypes::mur())) {
return new StatusResource(['status' => 'KO', 'code' => 404, 'message' => 'Campaign is not mur.']);
}
2021-08-05 12:06:24 +02:00
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()) {
2021-08-05 12:06:24 +02:00
$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;
}
2025-04-03 09:30:16 +02:00
}//end foreach
2021-08-05 12:06:24 +02:00
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;
2025-08-14 17:05:09 +02:00
$coupons[] = [
'quantity' => $content->quantity,
2025-08-14 17:05:09 +02:00
'printed' => $content->printed,
'coupon' => new CouponsResource($coupon)
2025-08-14 17:05:09 +02:00
];
}
}
}
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
]);
}
2021-04-20 11:16:34 +02:00
}