From c0a33ef2ab392e79ec83e9031ae6c255f80716b4 Mon Sep 17 00:00:00 2001 From: Vincent BRIDIER Date: Tue, 25 Nov 2025 11:33:58 +0100 Subject: [PATCH] feat: Update claim command, unit tests OK --- app/Console/Commands/CustomersClaims.php | 108 ++++++++++++------ .../Controllers/Api/v1/BasketController.php | 12 +- app/Models/Basket.php | 4 +- 3 files changed, 85 insertions(+), 39 deletions(-) diff --git a/app/Console/Commands/CustomersClaims.php b/app/Console/Commands/CustomersClaims.php index a5d1eb0..23d98bc 100644 --- a/app/Console/Commands/CustomersClaims.php +++ b/app/Console/Commands/CustomersClaims.php @@ -2,9 +2,15 @@ namespace App\Console\Commands; +use App\Models\Basket; +use App\Models\Campagne; use App\Models\Contact; +use App\Models\Coupon; +use App\Models\Customers; +use App\Models\Site; use Carbon\Carbon; use Illuminate\Console\Command; +use Illuminate\Support\Facades\Validator; class CustomersClaims extends Command { @@ -13,7 +19,7 @@ class CustomersClaims extends Command * * @var string */ - protected $signature = 'customers:claims'; + protected $signature = 'customers:claims {--siteId=?} {destCampaignId} {destCouponId}'; /** * The console command description. @@ -39,51 +45,89 @@ class CustomersClaims extends Command */ public function handle() { - $siteId = 'LGL89'; - $claims = [ - 'natacha.larche@orange.fr' => '01/10/2025', - 'delphine.byon@hotmail.fr' => '30/09/2025', - 'aurel_del@hotmail.fr' => '27/09/2025', - 'katy.lancelot@orange.fr' => '26/09/2025' - ]; + $destCampaignId = $this->argument('destCampaignId'); + $destCampaign = Campagne::findOrFail($destCampaignId); - $emails = array_keys($claims); + $destCouponId = $this->argument('destCouponId'); + $destCoupon = Coupon::findOrFail($destCouponId); - // On récupère les contact dont l'identifiant est un ID de CRM - $contacts = Contact::whereIn('contact_email', $emails) - ->where('contact_siteId', '=', $siteId) + $siteIdArg = $this->option('siteId'); + if (is_null($siteIdArg)) { + $this->table( + ['ID', 'Site ID', 'Label'], + Site::all(['id', 'site_id', 'site_nom'])->toArray() + ); + + $site = $this->validateInput(function () { + return $this->ask('Enter site model id'); + }, 'required|numeric|min:1|max:50|exists:site,id'); + + $site = Site::find($site); + } else { + $site = Site::find($siteIdArg); + } + + $email = $this->validateInput(function () { + return $this->ask('Enter customer email'); + }, 'required|email|min:1|max:255'); + + $crmHashcode = $this->validateInput(function () { + return $this->ask('Enter customer hashcode'); + }, 'required|string|min:1|max:36'); + + $crmCountry = $this->validateInput(function () { + return $this->ask('Enter customer country ISO code'); + }, 'required|numeric|in:56,250,442'); + + $date = $this->validateInput(function () { + return $this->ask('Enter claim date'); + }, 'required|date_format:d/m/Y'); + + $contacts = Contact::where('contact_email', $email) + ->where('contact_siteId', '=', $site->site_id) ->get(); - $toAdd = []; - - // Pour chaque contact + $toAdd = 0; foreach ($contacts as $contact) { - - $claimDate = Carbon::createFromFormat('d/m/Y', $claims[$contact->contact_email])->format('Y-m-d'); - + $claimDate = Carbon::createFromFormat('d/m/Y', $date)->format('Y-m-d'); // On vient chercher les paniers dont la date de création est >= à la date de la récla $paniers = $contact->paniers()->where('panier_createdate', '>=', $claimDate)->get(); - foreach ($paniers as $panier) { foreach ($panier->panierContents as $content) { - $contactEmail = $contact->contact_email; - $campId = $panier->panier_campId; - $couponId = $content->panier_content_couponId; - - if (!isset($toAdd[$contactEmail][$campId])) { - $toAdd[$contactEmail][$campId] = []; - } - if (!isset($toAdd[$contactEmail][$campId][$couponId])) { - $toAdd[$contactEmail][$campId][$couponId] = 0; - } - - $toAdd[$contactEmail][$campId][$couponId] += $content->panier_content_printed; + $toAdd += $content->panier_content_printed; } } } - dd($toAdd); + $qty = $this->validateInput(function () use ($toAdd) { + return $this->ask('Enter quantity to add', $toAdd); + }, 'required|numeric|max:20'); + + $customer = Customers::firstOrNew([ + 'hashcode' => $crmHashcode, + 'email' => $email, + 'country' => $crmCountry, + ]); + $customer->saveOrFail(); + + $basket = Basket::updateContent($destCampaign, [$destCoupon->coupon_id => $qty], $customer); + + $this->info(url()->route("fo.basket.show", $basket)); return 0; } + + private function validateInput($method, $rules) + { + $value = $method(); // Ask user input + $validator = Validator::make(['input' => $value], ['input' => $rules]); + + if ($validator->fails()) { + foreach ($validator->errors()->all() as $error) { + $this->warn($error); + } + return $this->validateInput($method, $rules); // Retry + } + return $value; + } } diff --git a/app/Http/Controllers/Api/v1/BasketController.php b/app/Http/Controllers/Api/v1/BasketController.php index e808f4c..6456e59 100644 --- a/app/Http/Controllers/Api/v1/BasketController.php +++ b/app/Http/Controllers/Api/v1/BasketController.php @@ -7,6 +7,7 @@ use App\Models\Campagne; use App\Enums\LogActions; use App\Http\Controllers\Controller; use App\Models\Basket; +use App\Models\Coupon; use App\Models\Customers; use App\Traits\CouponTrait; use App\Traits\ThanksTrait; @@ -88,10 +89,11 @@ class BasketController extends Controller $couponCode = substr($item, $pos + 1); if (is_numeric($quantity) && is_numeric($couponCode) && $quantity > 0) { - if (isset($coupons[$couponCode])) { - $coupons[$couponCode] += $quantity; + $coupon = Coupon::where('coupon_code', $couponCode)->first(); + if (isset($coupons[$coupon->coupon_id])) { + $coupons[$coupon->coupon_id] += $quantity; } else { - $coupons[$couponCode] = $quantity; + $coupons[$coupon->coupon_id] = $quantity; } } } @@ -117,8 +119,8 @@ class BasketController extends Controller // Prepare panierCoupons for logging $panierCoupons = []; - foreach ($coupons as $code => $qty) { - $panierCoupons[] = ['cp_code' => $code, 'qty' => $qty]; + foreach ($coupons as $coupon_id => $qty) { + $panierCoupons[] = ['coupon_id' => $coupon_id, 'qty' => $qty]; } // Retrieve customer diff --git a/app/Models/Basket.php b/app/Models/Basket.php index c4807c4..958256b 100644 --- a/app/Models/Basket.php +++ b/app/Models/Basket.php @@ -56,8 +56,8 @@ class Basket extends Model $basket->save(); } - foreach ($coupons as $couponCode => $quantity) { - $associatedCoupon = $campagne->coupons()->where('coupon_code', $couponCode)->first(); + foreach ($coupons as $couponId => $quantity) { + $associatedCoupon = $campagne->coupons()->where('coupon_id', $couponId)->first(); if ($associatedCoupon) { $basketContent = BasketContent::where(['basket_id' => $basket->id, 'coupon_id' => $associatedCoupon->coupon_id])->first();