156 lines
5.7 KiB
PHP
156 lines
5.7 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Requests\Fo;
|
|
|
|
use App\Models\Code;
|
|
use App\Models\Participation;
|
|
use App\Models\Product;
|
|
use App\Models\Settings;
|
|
use Illuminate\Contracts\Database\Eloquent\Builder;
|
|
use Illuminate\Foundation\Http\FormRequest;
|
|
use Illuminate\Support\Facades\Gate;
|
|
use Illuminate\Support\Str;
|
|
use Kwaadpepper\Serial\Exceptions\SerialCasterException;
|
|
|
|
class ParticipateRequest extends FormRequest
|
|
{
|
|
/**
|
|
* Determine if the user is authorized to make this request.
|
|
*
|
|
* @return boolean
|
|
*/
|
|
public function authorize()
|
|
{
|
|
return Gate::check('participate', Participation::class);
|
|
}
|
|
|
|
/**
|
|
* Prepare the data for validation.
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function prepareForValidation()
|
|
{
|
|
try {
|
|
$this->merge([
|
|
'code' => Code::query()->where('id', Code::serialToInt(
|
|
Str::upper(\strval($this->code))
|
|
))->first() ?? false,
|
|
]);
|
|
} catch (SerialCasterException) {
|
|
// * Provoquer l'affichage code incorrect.
|
|
$this->merge([
|
|
'code' => false,
|
|
]);
|
|
} finally {
|
|
$this->merge([
|
|
'code_ean' => (string)$this->string('code_ean')->padLeft(13, '0'),
|
|
'accept_rules' => $this->boolean('accept_rules')
|
|
]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get the validation rules that apply to the request.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function rules()
|
|
{
|
|
/** @var \App\Models\Settings */
|
|
$settings = app(Settings::class);
|
|
|
|
$rules = [
|
|
'accept_rules' => 'required|boolean|accepted',
|
|
'serial' => [
|
|
'required',
|
|
// phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed
|
|
function ($attribute, $value, $fail) use ($settings) {
|
|
// ? Le Code unique est resolved ?
|
|
if ($value === false or !\is_object($value) or \get_class($value) !== Code::class) {
|
|
$fail(trans('Code unique incorrect, veuillez réessayer.'));
|
|
return;
|
|
}
|
|
/** @var \App\Models\Code $value */
|
|
// ? Code unique déjà trop utilisé ?
|
|
if ($value->code_used) {
|
|
$fail(trans('Ce code unique n\'est plus utilisable.'));
|
|
return;
|
|
}
|
|
|
|
/** Request réutilisable */
|
|
$participationQuery = Participation::query()
|
|
->whereHas('code', fn (Builder $q) => $q->where('id', $value->id));
|
|
|
|
/** @var \App\Models\Customer */
|
|
$customer = auth('frontend')->user();
|
|
|
|
// * Check si l'utilisateur n'a pas déjà utilisé ce code.
|
|
$query = (clone $participationQuery)->whereHas(
|
|
'customer',
|
|
fn (Builder $q) => $q->where('id', $customer->id)
|
|
);
|
|
// ! Une seule participation avec un code donné par joueur
|
|
if ($query->exists()) {
|
|
$fail(trans('Vous avez déjà utilisé ce code unique.'));
|
|
return;
|
|
}
|
|
|
|
// * Gestion du nombre d'utilisation d'un code.
|
|
// ? Le code unique à été trop utilisé ?
|
|
if ((clone $participationQuery)->count() >= $settings->nb_unique_code_use) {
|
|
$value->code_used = true;
|
|
$value->saveOrFail();
|
|
$fail(trans('Ce code unique n\'est plus utilisable.'));
|
|
return;
|
|
}
|
|
}
|
|
]
|
|
];
|
|
|
|
/**
|
|
* * Check si les codes ean sont utilisés, auquel cas
|
|
* * on test celui envoyé pour savoir s'il est correct.
|
|
* Modif demande vincent :
|
|
* Tester code ean existe avec 13, puis 8 puis 7 chars
|
|
* Si le code EAN est trouvé dans la liste, alors on prend l'objet correspondant,
|
|
* sinon on prend le premier objet qui contient les 7 1er chiffres (cas des EAN pds)
|
|
*
|
|
* Dans la base chaque code ean doit être rentré dans sa valeur absolue
|
|
* càd que les code ean 8 sont de longueur 8, 7 de longueur7 et 13 de longueur 13.
|
|
*/
|
|
// ? Does the game use EAN Codes ?
|
|
if ($settings->use_ean_codes) {
|
|
$rules = \array_merge($rules, ['code_ean' => [
|
|
'required',
|
|
// phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed
|
|
function ($attribute, $value, $fail) {
|
|
// * Union pour faire des recherches séparée en une seule requête.
|
|
// ! code_ean is already str_padded to 13
|
|
$productQuery = Product::query()->where('code_ean', $this->post('code_ean'))
|
|
->union(Product::where('code_ean', Str::limit($this->post('code_ean'), 8, '')))
|
|
->union(Product::where('code_ean', Str::limit($this->post('code_ean'), 7, '')));
|
|
|
|
if (!$productQuery->exists()) {
|
|
$fail(trans('Le code barre entré est incorrect, veuillez réessayer.'));
|
|
}
|
|
}
|
|
]]);
|
|
}
|
|
return $rules;
|
|
}
|
|
|
|
/**
|
|
* Get custom attributes for validator errors.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function attributes()
|
|
{
|
|
return [
|
|
'code_ean' => \trans('code barre'),
|
|
'serial' => \trans('code unique'),
|
|
'accept_rules' => \trans('règlements du jeu'),
|
|
];
|
|
}
|
|
}
|