133 lines
3.9 KiB
PHP
133 lines
3.9 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(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 = 0;
|
|
foreach ($contacts as $contact) {
|
|
$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) {
|
|
$toAdd += $content->panier_content_printed;
|
|
}
|
|
}
|
|
}
|
|
|
|
$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;
|
|
}
|
|
}
|