189 lines
6.2 KiB
PHP
189 lines
6.2 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;
|
|
use CouponTrait;
|
|
use LogTrait;
|
|
|
|
protected $logSource;
|
|
protected $logAction;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->logAction = LogActions::updatebasket();
|
|
}
|
|
|
|
public function updateBasket(Request $request)
|
|
{
|
|
$this->logSource = isset($request->admin) ? 'ADMIN' : 'API';
|
|
|
|
// ---- Contrôle des paramètres
|
|
$error = false;
|
|
if (
|
|
(!isset($request->customer_hashcode) || $request->customer_hashcode == "") ||
|
|
(!isset($request->refcamp) || $request->refcamp == "") ||
|
|
(!isset($request->refsite) || $request->refsite == "") ||
|
|
(!isset($request->panier) || $request->panier == "")
|
|
) {
|
|
$error = true;
|
|
}
|
|
|
|
|
|
$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)) {
|
|
$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'
|
|
]);
|
|
}
|
|
|
|
$panier = $request->panier;
|
|
$panierTab = explode(",", $panier);
|
|
$coupons = array();
|
|
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();
|
|
}
|
|
|
|
// ---- Préparation message de log avec coupons
|
|
if (isset($coupons)) {
|
|
$panierCoupons = array();
|
|
foreach ($coupons as $code => $qty) {
|
|
array_push($panierCoupons, ['cp_code' => $code, 'qty' => $qty]);
|
|
}
|
|
}
|
|
|
|
if ($error) {
|
|
$this->writeLogErrorWrongRequestParameters(
|
|
$request->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'
|
|
]);
|
|
}
|
|
|
|
// ---- Récupération du Customer
|
|
$customer = Customers::where(['hashcode' => $request->customer_hashcode])->first();
|
|
|
|
// ---- Ajout/MAJ du panier
|
|
$panier = Basket::where(['campagne_id' => $refcamp, 'customer_id' => $customer->id])->first();
|
|
if ($panier) {
|
|
foreach ($coupons as $couponCode => $quantity) {
|
|
$camp = Campagne::where('camp_id', $panier->campagne_id)->first();
|
|
$cp = $camp->coupons()->where('coupon_code', $couponCode)->first();
|
|
if ($cp) {
|
|
$panierContent = BasketContent::where(['basket_id' => $panier->id, 'coupon_id' => $cp->coupon_id])->first();
|
|
if ($panierContent) {
|
|
$panierContent->quantity = $quantity + $panierContent->quantity;
|
|
// MAJ du contenu
|
|
$panierContent->save();
|
|
} else {
|
|
// Ajout du contenu
|
|
$this->addContentToBasket($panier, $cp, $quantity);
|
|
}
|
|
}
|
|
}//end foreach
|
|
} else {
|
|
// Ajout du panier et du contenu
|
|
$panier = new Basket();
|
|
$panier->ref = Str::uuid();
|
|
$panier->campagne()->associate($refcamp);
|
|
$panier->customer()->associate($customer);
|
|
$panier->save();
|
|
|
|
foreach ($coupons as $couponCode => $quantity) {
|
|
$cp = $campagne->coupons()->where('coupon_code', $couponCode)->first();
|
|
if ($cp) {
|
|
// Ajout du contenu
|
|
$this->addContentToBasket($panier, $cp, $quantity);
|
|
}
|
|
}
|
|
}//end if
|
|
|
|
$this->writeLogSuccessBasketCreated(
|
|
$request->refcamp,
|
|
$request->customer_hashcode,
|
|
$request->refsite,
|
|
$request->panier,
|
|
$panierCoupons
|
|
);
|
|
|
|
return response()->json([
|
|
'Statut' => 'OK',
|
|
'Panier' => $panier
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Add a content line for a given basket.
|
|
*
|
|
* @param Basket $basket Related basket.
|
|
* @param Coupon $coupon The coupon that will be added to the basket.
|
|
* @param integer $quantity The quantity of coupons.
|
|
* @return void
|
|
*/
|
|
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();
|
|
}
|
|
}
|
|
}
|