2025-11-12 16:35:16 +01:00
< ? php
namespace App\Http\Controllers\Api\v0 ;
use Illuminate\Http\Request ;
use App\Models\Panier ;
use App\Models\Campagne ;
use App\Models\Coupon ;
use App\Models\Contact ;
use App\Http\Controllers\Controller ;
use App\Models\Site ;
use App\Models\Log ;
use App\Models\PanierContent ;
use App\Traits\CouponTrait ;
use App\Traits\ThanksTrait ;
class PanierController extends Controller
{
use ThanksTrait ;
use CouponTrait ;
public function updateBasket ( Request $request )
{
if ( isset ( $request -> admin )) {
$source = 'ADMIN' ;
} else {
$source = 'API' ;
}
// ---- INIT du log
$log = new Log ();
$log -> log_action = config ( 'constants.updatebasket' );
$log -> log_source = $source ;
if ( isset ( $request -> basketid )) {
$basketid = $request -> basketid ;
if ( $basketid != '' ) {
$panier = Panier :: where ( 'panier_ref' , $basketid ) -> first ();
if ( ! $panier ) {
$log -> log_params = json_encode ([ 'basketid' => $basketid ]);
$log -> log_statut = 'NOK' ;
$log -> log_message = " Le panier n'existe pas " ;
$log -> save ();
return response () -> json ([
'Statut' => 'KO' ,
'Code' => 106 ,
'Message' => 'Le panier n\'existe pas'
]);
}
if ( isset ( $request -> panier ) && $request -> panier != " " ) {
$panier = $request -> panier ;
$panierTab = explode ( " , " , $panier );
2026-10-28 12:27:46 +01:00
$coupons = [];
2025-11-12 16:35:16 +01:00
foreach ( $panierTab as $panier ) {
$pos = strpos ( $panier , " ) " );
if ( $pos === false || substr_count ( $panier , " ) " ) != 1 ) {
$log -> log_params = json_encode ([ 'basketid' => $basketid , 'panier' => $panier ]);
$log -> log_statut = 'NOK' ;
$log -> log_message = " Des paramètres de la requête sont mal renseignés ou non présents " ;
$log -> save ();
return response () -> json ([
'Statut' => 'KO' ,
'Code' => 101 ,
'Message' => 'Des paramètres de la requête sont mal renseignés ou non présents'
]);
}
$quantity = substr ( $panier , 0 , $pos );
$quantity = str_replace ( " ( " , " " , $quantity );
$couponCode = substr ( $panier , $pos + 1 );
if ( is_numeric ( $quantity ) && is_numeric ( $couponCode )) {
if ( isset ( $coupons [ $couponCode ])) {
$coupons [ $couponCode ] = $coupons [ $couponCode ] + $quantity ;
} else {
$coupons [ $couponCode ] = $quantity ;
}
} else {
$log -> log_params = json_encode ([ 'basketid' => $basketid , 'panier' => $panier ]);
$log -> log_statut = 'NOK' ;
$log -> log_message = " Des paramètres de la requête sont mal renseignés ou non présents " ;
$log -> save ();
return response () -> json ([
'Statut' => 'KO' ,
'Code' => 101 ,
'Message' => 'Des paramètres de la requête sont mal renseignés ou non présents'
]);
}
} //end foreach
// ---- Préparation message de log avec coupons
2026-10-28 12:27:46 +01:00
$panierCoupons = [];
2025-11-12 16:35:16 +01:00
foreach ( $coupons as $code => $qty ) {
array_push ( $panierCoupons , [ 'cp_code' => $code , 'qty' => $qty ]);
}
if ( count ( $coupons ) == 0 ) {
die ();
}
} else {
$log -> log_params = json_encode ([ 'basketid' => $basketid , 'panier' => $panier ]);
$log -> log_statut = 'NOK' ;
$log -> log_message = " Des paramètres de la requête sont mal renseignés ou non présents " ;
$log -> save ();
return response () -> json ([
'Statut' => 'KO' ,
'Code' => 101 ,
'Message' => 'Des paramètres de la requête sont mal renseignés ou non présents'
]);
} //end if
// ---- MAJ du panier
$panier = Panier :: where ( 'panier_ref' , $basketid ) -> first ();
if ( $panier ) {
foreach ( $coupons as $couponCode => $quantity ) {
$cp = Coupon :: where ( 'coupon_code' , $couponCode ) -> first ();
$exists = $cp -> campagnes -> contains ( $panier -> panier_campId );
if ( $cp && $exists ) {
$site = $cp -> coupon_siteId ;
$panierContent = PanierContent :: where ([ 'panier_content_panierId' => $panier -> panier_id , 'panier_content_couponId' => $cp -> coupon_id ]) -> first ();
if ( $panierContent ) {
$quantity += $panierContent -> panier_content_quantity ;
if ( $quantity <= 0 ) {
$quantity = 0 ;
}
// MAJ du contenu
$panierContent -> panier_content_quantity = $quantity ;
$panierContent -> save ();
} else {
// Ajout du contenu
if ( $quantity > 0 ) {
$panierNewContent = new PanierContent ();
$panierNewContent -> panier_content_panierId = $panier -> panier_id ;
$panierNewContent -> panier_content_couponId = $cp -> coupon_id ;
$panierNewContent -> panier_content_quantity = $quantity ;
$panierNewContent -> save ();
}
}
} else {
$log -> log_params = json_encode ([ 'refcamp' => $request -> refcamp , 'refadherent' => $request -> refadherent , 'refsite' => $request -> refsite , 'nom' => $request -> nom , 'prenom' => $request -> prenom , 'email' => $request -> email , 'code postal' => $request -> code_postal , 'commune' => $request -> commune , 'panier' => $request -> panier ]);
$log -> log_statut = 'NOK' ;
$log -> log_message = " Le coupon ne correspond pas aux coupons liés a la campagne " ;
$log -> save ();
return response () -> json ([
'Statut' => 'KO' ,
'Code' => 110 ,
'Message' => 'Le coupon ne correspond pas aux coupons liés a la campagne'
]);
} //end if
} //end foreach
// MAJ du status du panier
$qty = $panier -> panierContents () -> sum ( 'panier_content_quantity' );
if ( $qty == 0 ) {
$panier_pending = 0 ;
} else {
$panier_pending = 1 ;
}
$panier -> panier_pending = $panier_pending ;
$panier -> save ();
$campagne = Campagne :: where ([ 'camp_id' => $panier -> panier_campId ]) -> first ();
$log -> log_refsite = $campagne -> camp_siteId ;
$log -> log_contactId = $panier -> panier_contactId ;
$log -> log_params = json_encode ([ 'refcamp' => $panier -> panier_campId , 'basketid' => $basketid , 'panier' => $panier ]);
$log -> log_statut = 'OK' ;
$log -> log_message = json_encode ([ 'Message' => 'Le panier a bien été créé/mis à jour' , 'Coupons' => $panierCoupons ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES );
$log -> save ();
$contact = Contact :: where ([ 'contact_id' => $panier -> panier_contactId ]) -> first ();
$site = Site :: where ([ 'site_id' => $campagne -> camp_siteId ]) -> first ();
if ( isset ( $contact -> contact_nom ) && isset ( $site -> site_nom )) {
if ( $panier -> panier_pending == 1 ) {
$encours = " oui " ;
} else {
$encours = " non " ;
}
$response = new \stdClass ();
$response -> Site = $site -> site_nom . " ( " . $site -> site_id . " ) " ;
$response -> Campagne = $campagne -> camp_name . " ( " . $campagne -> camp_id . " ) " ;
$response -> Panier = $panier -> panier_ref ;
$response -> DateCreation = date ( " d/m/Y " , strtotime ( $panier -> panier_createdate ));
$response -> EnCours = $encours ;
$response -> Nom = $contact -> contact_nom ;
$response -> Prenom = $contact -> contact_prenom ;
$response -> Email = $contact -> contact_email ;
$response -> CodePostal = $contact -> contact_cp ;
$response -> Commune = $contact -> contact_ville ;
$allPanierContent = $panier -> panierContents () -> get ();
foreach ( $allPanierContent as $panierContent ) {
$panCont = [];
$coupon = Coupon :: where ([ 'coupon_id' => $panierContent -> panier_content_couponId ]) -> first ();
if ( $coupon ) {
array_push ( $panCont , $coupon -> coupon_code . " - " . $coupon -> coupon_name . " (x " . $panierContent -> panier_content_quantity . " ) " );
}
}
$response -> panierContent = $panCont ;
return response () -> json ([
'Statut' => 'OK' ,
'Panier' => $response
]);
} else {
return response () -> json ([
'Statut' => 'OK' ,
'Panier' => $panier
]);
} //end if
} else {
$log -> log_params = json_encode ([ 'basketid' => $basketid , 'panier' => $panier ]);
$log -> log_statut = 'NOK' ;
$log -> log_message = " Le panier n'existe pas " ;
$log -> save ();
return response () -> json ([
'Statut' => 'KO' ,
'Code' => 106 ,
'Message' => 'Le panier n\'existe pas'
]);
} //end if
} else {
$log -> log_params = json_encode ([ 'basketid' => $basketid , 'panier' => $panier ]);
$log -> log_statut = 'NOK' ;
$log -> log_message = " Le panier n'existe pas " ;
$log -> save ();
return response () -> json ([
'Statut' => 'KO' ,
'Code' => 106 ,
'Message' => 'Le panier n\'existe pas'
]);
} //end if
} else {
// ---- Contrôle des paramètres
$error = false ;
if ( isset ( $request -> refcamp ) && $request -> refcamp != " " ) {
$refcamp = $request -> refcamp ;
$campagne = Campagne :: where ([ 'camp_id' => $refcamp ]) -> first ();
if ( ! $campagne || $campagne -> camp_published == 0 || ( $campagne -> camp_type -> value != 1 && $campagne -> camp_type -> value != 3 )) {
$log -> log_params = json_encode ([ 'refcamp' => $refcamp ]);
$log -> log_statut = 'NOK' ;
$log -> log_message = " La campagne n'existe pas ou n'est pas un panier " ;
$log -> save ();
return response () -> json ([
'Statut' => 'KO' ,
'Code' => 103 ,
'Message' => 'La campagne n\'existe pas ou n\'est pas un panier'
]);
}
} else {
$error = true ;
}
if ( isset ( $request -> refadherent ) && $request -> refadherent != " " ) {
$refadherent = $request -> refadherent ;
} else {
$error = true ;
}
if ( isset ( $request -> nom ) && $request -> nom != " " ) {
$nom = $request -> nom ;
} else {
$error = true ;
}
if ( isset ( $request -> refsite ) && $request -> refsite != " " ) {
$refsite = $request -> refsite ;
if ( $refsite != $campagne -> camp_siteId ) {
return response () -> json ([
'Statut' => 'KO' ,
'Code' => 103 ,
'Message' => 'La campagne ne correspond à aucune campagnes du site'
]);
}
} else {
$error = true ;
}
if ( isset ( $request -> prenom ) && $request -> prenom != " " ) {
$prenom = $request -> prenom ;
} else {
$error = true ;
}
if ( isset ( $request -> email ) && $request -> email != " " && filter_var ( $request -> email , FILTER_VALIDATE_EMAIL )) {
$email = $request -> email ;
} else {
$error = true ;
}
if ( isset ( $request -> code_postal ) && $request -> code_postal != " " ) {
$code_postal = $request -> code_postal ;
} else {
$error = true ;
}
if ( isset ( $request -> commune ) && $request -> commune != " " ) {
$commune = $request -> commune ;
} else {
$error = true ;
}
if ( isset ( $request -> pays ) && $request -> pays != " " ) {
if ( filter_var ( $request -> pays , FILTER_VALIDATE_INT )) {
$pays = $request -> pays ;
} else {
$error = true ;
}
} else {
$pays = 250 ;
}
if ( isset ( $request -> panier ) && $request -> panier != " " ) {
$panier = $request -> panier ;
$panierTab = explode ( " , " , $panier );
2026-10-28 12:27:46 +01:00
$coupons = [];
2025-11-12 16:35:16 +01:00
foreach ( $panierTab as $panier ) {
$pos = strpos ( $panier , " ) " );
if ( $pos === false ) {
$error = true ;
}
$quantity = substr ( $panier , 0 , $pos );
$quantity = str_replace ( " ( " , " " , $quantity );
$couponCode = substr ( $panier , $pos + 1 );
if ( is_numeric ( $quantity ) && is_numeric ( $couponCode ) && $quantity > 0 ) {
if ( isset ( $coupons [ $couponCode ])) {
$coupons [ $couponCode ] = $coupons [ $couponCode ] + $quantity ;
} else {
$coupons [ $couponCode ] = $quantity ;
}
}
}
if ( count ( $coupons ) == 0 ) {
die ();
}
} else {
$error = true ;
} //end if
// ---- Préparation message de log avec coupons
if ( isset ( $coupons )) {
2026-10-28 12:27:46 +01:00
$panierCoupons = [];
2025-11-12 16:35:16 +01:00
foreach ( $coupons as $code => $qty ) {
array_push ( $panierCoupons , [ 'cp_code' => $code , 'qty' => $qty ]);
}
}
if ( $error ) {
$log -> log_params = json_encode ([ 'refcamp' => $request -> refcamp , 'refadherent' => $request -> refadherent , 'refsite' => $request -> refsite , 'nom' => $request -> nom , 'prenom' => $request -> prenom , 'email' => $request -> email , 'code postal' => $request -> code_postal , 'commune' => $request -> commune , 'panier' => $request -> panier ]);
$log -> log_statut = 'NOK' ;
$log -> log_message = " Des paramètres de la requête sont mal renseignés ou non présents " ;
$log -> save ();
return response () -> json ([
'Statut' => 'KO' ,
'Code' => 101 ,
'Message' => 'Des paramètres de la requête sont mal renseignés ou non présents'
]);
}
// ---- Ajout/MAJ du contact
$contact = Contact :: where ([ 'contact_siteId' => $refsite , 'contact_ref' => $refadherent ]) -> first ();
if ( $contact ) {
// ---- Mise à jour du contact
$contact -> contact_prenom = $prenom ;
$contact -> contact_nom = $nom ;
$contact -> contact_email = $email ;
$contact -> contact_cp = $code_postal ;
$contact -> contact_ville = $commune ;
$contact -> contact_country = $pays ;
$contact -> contact_updatedate = date ( 'Y-m-d H:i:s' );
} else {
// ---- Création du contact
$site = Site :: where ( 'site_id' , $refsite ) -> first ();
if ( $site ) {
$contact = new Contact ();
$contact -> contact_nom = $nom ;
$contact -> contact_prenom = $prenom ;
$contact -> contact_ref = $refadherent ;
$contact -> contact_email = $email ;
$contact -> contact_cp = $code_postal ;
$contact -> contact_ville = $commune ;
$contact -> contact_country = $pays ;
$contact -> contact_siteId = $refsite ;
$contact -> contact_hash = strtoupper ( md5 ( uniqid ( time (), true )));
} else {
$log -> log_params = json_encode ([ 'refcamp' => $request -> refcamp , 'refadherent' => $request -> refadherent , 'refsite' => $request -> refsite , 'nom' => $request -> nom , 'prenom' => $request -> prenom , 'email' => $request -> email , 'code postal' => $request -> code_postal , 'commune' => $request -> commune , 'panier' => $request -> panier ]);
$log -> log_statut = 'NOK' ;
$log -> log_message = " Le site spécifié n'existe pas " ;
$log -> save ();
return response () -> json ([
'Statut' => 'KO' ,
'Code' => 102 ,
'Message' => 'Le site spécifié n\'existe pas'
]);
} //end if
} //end if
if ( ! $contact -> save ()) {
$log -> log_params = json_encode ([ 'refcamp' => $request -> refcamp , 'refadherent' => $request -> refadherent , 'refsite' => $request -> refsite , 'nom' => $request -> nom , 'prenom' => $request -> prenom , 'email' => $request -> email , 'code postal' => $request -> code_postal , 'commune' => $request -> commune , 'panier' => $request -> panier ]);
$log -> log_statut = 'NOK' ;
$log -> log_message = " Une erreur est survenue " ;
$log -> save ();
return response () -> json ([
'Statut' => 'KO' ,
'Code' => 109 ,
'Message' => 'Une erreur est survenue'
]);
}
// ---- Ajout/MAJ du panier
$panier = Panier :: where ([ 'panier_campId' => $refcamp , 'panier_contactId' => $contact -> contact_id , 'panier_pending' => 1 ]) -> first ();
if ( $panier ) {
foreach ( $coupons as $couponCode => $quantity ) {
$camp = Campagne :: where ( 'camp_id' , $panier -> panier_campId ) -> first ();
$cp = $camp -> coupons () -> where ( 'coupon_code' , $couponCode ) -> first ();
if ( $cp ) {
$panierContent = PanierContent :: where ([ 'panier_content_panierId' => $panier -> panier_id , 'panier_content_couponId' => $cp -> coupon_id ]) -> first ();
if ( $panierContent ) {
// $quantity += $panierContent->panier_content_quantity;
$panierContent -> panier_content_quantity = $quantity + $panierContent -> panier_content_quantity ;
// MAJ du contenu
$panierContent -> save ();
// $panierContent->update(['panier_content_quantity', $quantity]);
} else {
// Ajout du contenu
if ( $quantity > 0 ) {
$panierNewContent = new PanierContent ();
$panierNewContent -> panier_content_panierId = $panier -> panier_id ;
$panierNewContent -> panier_content_couponId = $cp -> coupon_id ;
$panierNewContent -> panier_content_quantity = $quantity ;
$panierNewContent -> save ();
}
}
}
} //end foreach
} else {
// Ajout du panier et du contenu
$panierRef = strtoupper ( md5 ( uniqid ( time (), true )));
$panier = new Panier ();
$panier -> panier_ref = $panierRef ;
$panier -> panier_campId = $refcamp ;
$panier -> panier_contactId = $contact -> contact_id ;
$panier -> panier_createdate = date ( 'Y-m-d H:i:s' );
$panier -> save ();
foreach ( $coupons as $couponCode => $quantity ) {
$cp = $campagne -> coupons () -> where ( 'coupon_code' , $couponCode ) -> first ();
if ( $cp ) {
// Ajout du contenu
if ( $quantity > 0 ) {
$panierNewContent = new PanierContent ();
$panierNewContent -> panier_content_panierId = $panier -> panier_id ;
$panierNewContent -> panier_content_couponId = $cp -> coupon_id ;
$panierNewContent -> panier_content_quantity = $quantity ;
$panierNewContent -> save ();
}
}
}
} //end if
$log -> log_params = json_encode ([ 'refcamp' => $request -> refcamp , 'refadherent' => $request -> refadherent , 'refsite' => $request -> refsite , 'nom' => $request -> nom , 'prenom' => $request -> prenom , 'email' => $request -> email , 'code postal' => $request -> code_postal , 'commune' => $request -> commune , 'panier' => $request -> panier ]);
$log -> log_contactId = $panier -> panier_contactId ;
$log -> log_refsite = $request -> refsite ;
$log -> log_statut = 'OK' ;
$log -> log_message = json_encode ([ 'Message' => 'Le panier a bien été créé/mis à jour' , 'Coupons' => $panierCoupons ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES );
$log -> save ();
$contact = Contact :: where ([ 'contact_id' => $panier -> panier_contactId ]) -> first ();
$site = Site :: where ([ 'site_id' => $campagne -> camp_siteId ]) -> first ();
if ( isset ( $contact -> contact_nom ) && isset ( $site -> site_nom )) {
if ( $panier -> panier_pending == 1 ) {
$encours = " oui " ;
} else {
$encours = " non " ;
}
$response = new \stdClass ();
$response -> Site = $site -> site_nom . " ( " . $site -> site_id . " ) " ;
$response -> Campagne = $campagne -> camp_name . " ( " . $campagne -> camp_id . " ) " ;
$response -> Panier = $panier -> panier_ref ;
$response -> DateCreation = date ( " d/m/Y " , strtotime ( $panier -> panier_createdate ));
$response -> EnCours = $encours ;
$response -> Nom = $contact -> contact_nom ;
$response -> Prenom = $contact -> contact_prenom ;
$response -> Email = $contact -> contact_email ;
$response -> CodePostal = $contact -> contact_cp ;
$response -> Commune = $contact -> contact_ville ;
$allPanierContent = $panier -> panierContents () -> get ();
$panCont = [];
foreach ( $allPanierContent as $panierContent ) {
$coupon = Coupon :: where ([ 'coupon_id' => $panierContent -> panier_content_couponId ]) -> first ();
if ( $coupon ) {
array_push ( $panCont , $coupon -> coupon_code . " - " . $coupon -> coupon_name . " (x " . $panierContent -> panier_content_quantity . " ) " );
}
}
$response -> panierContent = $panCont ;
return response () -> json ([
'Statut' => 'OK' ,
'Panier' => $response
]);
} else {
return response () -> json ([
'Statut' => 'OK' ,
'Panier' => $panier
]);
} //end if
} //end if
}
}