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

187 lines
5.9 KiB
PHP

<?php
namespace App\Http\Controllers\Api\v1;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use App\Campagne;
use App\Coupon;
use App\Enums\LogActions;
use App\Http\Controllers\Controller;
use App\Models\Basket;
use App\Models\BasketContent;
use App\Models\Customers;
use App\Traits\CouponTrait;
use App\Traits\ThanksTrait;
use App\Traits\LogTrait;
class BasketController extends Controller
{
use ThanksTrait, CouponTrait, LogTrait;
protected $logSource;
protected $logAction;
public function __construct()
{
$this->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->ref = (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();
}
}
}