logAction = LogActions::updatebasket(); $this->logSource = 'API'; } public function updateBasket(Request $request) { // Validate required parameters $requiredParams = ['customer_hashcode', 'refcamp', 'refsite', 'panier']; $error = false; foreach ($requiredParams as $param) { if (empty($request->{$param})) { $error = true; break; } } if ($error) { $this->writeLogErrorWrongRequestParameters( $request->refcamp ?? null, $request->customer_hashcode ?? null, $request->refsite ?? null, $request->panier ?? null ); return response()->json([ 'Statut' => 'KO', 'Code' => 101, 'Message' => 'Des paramètres de la requête sont mal renseignés ou non présents' ]); } // Validate campaign $refcamp = $request->refcamp; $campagne = Campagne::where('camp_id', $refcamp)->first(); if (!$campagne || $campagne->camp_published == 0 || !in_array($campagne->camp_type->value, [1, 3])) { $this->writeLogErrorIncorrectCampaign($refcamp); return response()->json([ 'Statut' => 'KO', 'Code' => 103, 'Message' => 'La campagne n\'existe pas ou n\'est pas un panier' ]); } $refsite = $request->refsite; if ($refsite != $campagne->camp_siteId) { return response()->json([ 'Statut' => 'KO', 'Code' => 103, 'Message' => 'La campagne ne correspond à aucune campagnes du site' ]); } // Parse panier $panierTab = explode(",", $request->panier); $coupons = []; foreach ($panierTab as $item) { $pos = strpos($item, ")"); if ($pos === false) { $error = true; break; } $quantity = str_replace("(", "", substr($item, 0, $pos)); $couponCode = substr($item, $pos + 1); if (is_numeric($quantity) && is_numeric($couponCode) && $quantity > 0) { if (isset($coupons[$couponCode])) { $coupons[$couponCode] += $quantity; } else { $coupons[$couponCode] = $quantity; } } } if (empty($coupons)) { die(); } if ($error) { $this->writeLogErrorWrongRequestParameters( $refcamp, $request->customer_hashcode, $campagne->camp_siteId, $request->panier ); return response()->json([ 'Statut' => 'KO', 'Code' => 101, 'Message' => 'Des paramètres de la requête sont mal renseignés ou non présents' ]); } // Prepare panierCoupons for logging $panierCoupons = []; foreach ($coupons as $code => $qty) { $panierCoupons[] = ['cp_code' => $code, 'qty' => $qty]; } // Retrieve customer $customer = Customers::where('hashcode', $request->customer_hashcode)->first(); // Retrieve or create basket $basket = Basket::where(['campagne_id' => $refcamp, 'customer_id' => $customer->id])->first(); if ($basket) { $camp = Campagne::where('camp_id', $basket->campagne_id)->first(); foreach ($coupons as $couponCode => $quantity) { $cp = $camp->coupons()->where('coupon_code', $couponCode)->first(); if ($cp) { $basketContent = BasketContent::where(['basket_id' => $basket->id, 'coupon_id' => $cp->coupon_id])->first(); if ($basketContent) { $basketContent->quantity += $quantity; $basketContent->save(); } else { $this->addContentToBasket($basket, $cp, $quantity); } } } } else { $basket = new Basket(); $basket->uuid = (string) Str::uuid(); $basket->campagne()->associate($refcamp); $basket->customer()->associate($customer); $basket->save(); foreach ($coupons as $couponCode => $quantity) { $cp = $campagne->coupons()->where('coupon_code', $couponCode)->first(); if ($cp) { $this->addContentToBasket($basket, $cp, $quantity); } } } // Log success $this->writeLogSuccessBasketCreated( $refcamp, $request->customer_hashcode, $refsite, $request->panier, $panierCoupons ); return response()->json([ 'Statut' => 'OK', 'Panier' => $basket ]); } private function addContentToBasket(Basket $basket, Coupon $coupon, int $quantity): void { if ($quantity > 0) { $newBasketContent = new BasketContent(); $newBasketContent->basket_id = $basket->id; $newBasketContent->coupon_id = $coupon->coupon_id; $newBasketContent->quantity = $quantity; $newBasketContent->save(); } } }