ldc-mesbr-app/app/Console/Commands/CustomersClaims.php
2026-10-28 13:23:49 +01:00

123 lines
3.7 KiB
PHP

<?php
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
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'customers:claims {--siteId=?} {destCampaignId} {destCouponId}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$destCampaignId = $this->argument('destCampaignId');
$destCampaign = Campagne::findOrFail($destCampaignId);
$destCouponId = $this->argument('destCouponId');
$destCoupon = Coupon::findOrFail($destCouponId);
$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(fn() => $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(fn() => $this->ask('Enter customer email'), 'required|email|min:1|max:255');
$crmHashcode = $this->validateInput(fn() => $this->ask('Enter customer hashcode'), 'required|string|min:1|max:36');
$crmCountry = $this->validateInput(fn() => $this->ask('Enter customer country ISO code'), 'required|numeric|in:56,250,442');
$date = $this->validateInput(fn() => $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 = 0;
foreach ($contacts as $contact) {
$claimDate = \Illuminate\Support\Facades\Date::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) {
$toAdd += $content->panier_content_printed;
}
}
}
$qty = $this->validateInput(fn() => $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;
}
}