2021-04-20 11:16:34 +02:00
< ? php
namespace App\Http\Controllers\Api\v1 ;
2025-11-12 16:35:16 +01:00
use App\Models\Calendrier ;
use App\Models\Campagne ;
2025-08-05 14:47:02 +02:00
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 ;
2025-08-05 14:47:02 +02:00
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 ;
2025-08-05 14:47:02 +02:00
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
2025-08-05 14:47:02 +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' ]);
2025-08-05 14:47:02 +02:00
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 ) {
2026-06-11 16:51:49 +02:00
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 )
]);
}
2025-08-05 14:47:02 +02:00
/**
* 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 ) {
2026-06-11 16:51:49 +02:00
if ( $calendar -> isPublished ()) {
2025-08-05 14:47:02 +02:00
$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 [] = [
2025-08-05 14:47:02 +02:00
'quantity' => $content -> quantity ,
2025-08-14 17:05:09 +02:00
'printed' => $content -> printed ,
2025-08-05 14:47:02 +02:00
'coupon' => new CouponsResource ( $coupon )
2025-08-14 17:05:09 +02:00
];
2025-08-05 14:47:02 +02:00
}
}
}
return new StatusResource ([
'status' => " OK " ,
2025-11-05 21:09:05 +01:00
'ref' => $basket -> uuid ,
2025-08-05 14:47:02 +02:00
'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
}