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'), ]; } }