217 lines
7.4 KiB
PHP
217 lines
7.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Requests\Fo\Customers;
|
|
|
|
use App\Models\Settings;
|
|
use App\Repositories\Fo\CrmRepository;
|
|
use App\Rules\IsAdult;
|
|
use Illuminate\Foundation\Http\FormRequest;
|
|
use Illuminate\Validation\Validator;
|
|
use Illuminate\Support\Arr;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Validation\Rule;
|
|
use Illuminate\Validation\Rules\Password;
|
|
use Kwaadpepper\Enum\Rules\EnumIsValidRule;
|
|
use LDC\LDCCRM\Enums\Country;
|
|
use LDC\LDCCRM\Models\Customer as CrmCustomer;
|
|
|
|
class CreateAccountRequest extends FormRequest
|
|
{
|
|
/**
|
|
* Determine if the user is authorized to make this request.
|
|
*
|
|
* @return boolean
|
|
*/
|
|
public function authorize(): bool
|
|
{
|
|
return Auth::guard('frontend')->check();
|
|
}
|
|
|
|
/**
|
|
* Prepare the data for validation.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function prepareForValidation(): void
|
|
{
|
|
$this->merge([
|
|
'phone' => $this->input('phone'),
|
|
'opt_in' => $this->boolean('opt_in'),
|
|
'ok_cgv' => $this->boolean('ok_cgv')
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Get the validation rules that apply to the request.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function rules(): array
|
|
{
|
|
/** @var \App\Models\Settings $settings */
|
|
$settings = app(Settings::class);
|
|
|
|
/** @var \App\Models\Customer|null */
|
|
$authUser = auth('frontend')->user();
|
|
$countryCode = null;
|
|
|
|
$countryCode = $this->integer('country') != 0 ?
|
|
$this->integer('country') : ($authUser ?
|
|
(new CrmRepository())->fetchCrmCustomer($authUser)->country->value : 0);
|
|
$countryRules = match ($countryCode) {
|
|
Country::belgium()->value => [
|
|
'phone' => 'phone:BE',
|
|
'postal_code' => 'postal_code:BE',
|
|
],
|
|
Country::luxembourg()->value => [
|
|
'phone' => 'phone:LU',
|
|
'postal_code' => 'postal_code:LU',
|
|
],
|
|
default => [
|
|
'phone' => 'phone:FR',
|
|
'postal_code' => 'postal_code:FR',
|
|
]
|
|
};
|
|
|
|
return [
|
|
'lastname' => 'required|string|max:255',
|
|
'firstname' => 'required|string|max:255',
|
|
'phone' => [
|
|
'nullable',
|
|
'max:255',
|
|
$countryRules['phone'],
|
|
],
|
|
'address' => 'required|string|min:1|max:255',
|
|
'address2' => 'nullable|string|min:1|max:255',
|
|
'postal_code' => [
|
|
'required',
|
|
'string',
|
|
'min:1',
|
|
$countryRules['postal_code'],
|
|
],
|
|
'city' => 'required|string|min:2|max:255',
|
|
'birth_date' => ['required', new IsAdult(trans('Vous devez être majeur pour vous inscrire.'))],
|
|
'country' => [
|
|
'required',
|
|
new EnumIsValidRule(Country::class),
|
|
Rule::in($settings->getAuthorizedCountries()),
|
|
],
|
|
'email' => [
|
|
'required',
|
|
'email:rfc,dns,spoof',
|
|
'max:255',
|
|
'unique:customers,email',
|
|
],
|
|
'password' => [
|
|
'required',
|
|
'confirmed',
|
|
Password::min(8)->mixedCase()
|
|
->numbers()->symbols()->uncompromised()
|
|
],
|
|
'ok_cgv' => 'accepted',
|
|
'opt_in' => 'required|boolean',
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Get the "after" validation callables for the request.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function after(): array
|
|
{
|
|
return [
|
|
function (Validator $validator) {
|
|
if (CrmCustomer::findWithEmail((string)$this->input('email'))) {
|
|
$validator->errors()->add(
|
|
'email',
|
|
'Un compte existe déjà avec cette adresse dans le CRM.'
|
|
);
|
|
}
|
|
},
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Get custom attributes for validator errors.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function attributes(): array
|
|
{
|
|
return [
|
|
'lastname' => trans('validation.attributes.first_name'),
|
|
'firstname' => trans('validation.attributes.first_name'),
|
|
'phone' => trans('validation.attributes.phone'),
|
|
'address' => trans('validation.attributes.line_address_1'),
|
|
'address2' => trans('validation.attributes.line_address_2'),
|
|
'country' => trans('validation.attributes.country'),
|
|
'postal_code' => trans('validation.attributes.postal_code'),
|
|
'city' => trans('validation.attributes.city'),
|
|
'birth_date' => trans('validation.attributes.date_of_birth'),
|
|
'email' => trans('validation.attributes.email'),
|
|
'password' => trans('validation.attributes.password'),
|
|
'password_confirmation' => trans('validation.attributes.password_confirmation'),
|
|
'ok_cgv' => trans('conditions d\'utilisation'),
|
|
'opt_in' => trans('newsletter'),
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Get custom messages for validator errors.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function messages(): array
|
|
{
|
|
$messages = [
|
|
'postal_code' => trans('validation.postal_code', [
|
|
'countries' => \implode(', ', Country::getValidCountriesLabel()),
|
|
'examples' => 72000
|
|
]),
|
|
'phone.phone' => trans('validation.phone', [
|
|
'countries' => \implode(', ', Country::getValidCountriesLabel())
|
|
]),
|
|
'email.unique' => trans('Un compte existe déjà avec cette adresse.'),
|
|
'ok_cgv.accepted' => trans('Vous devez accepter les conditions d\'utilisation du site pour continuer.')
|
|
];
|
|
|
|
$messages = match ($this->integer('country')) {
|
|
Country::belgium()->value => array_merge(
|
|
$messages,
|
|
[
|
|
'postal_code' => trans('validation.postal_code', [
|
|
'countries' => Country::belgium()->label,
|
|
'examples' => 1000
|
|
]),
|
|
]
|
|
),
|
|
Country::luxembourg()->value => array_merge(
|
|
$messages,
|
|
[
|
|
'postal_code' => trans('validation.postal_code', [
|
|
'countries' => Country::luxembourg()->label,
|
|
'examples' => 1111
|
|
]),
|
|
]
|
|
),
|
|
default => array_merge(
|
|
$messages,
|
|
[
|
|
'postal_code' => trans('validation.postal_code', [
|
|
'countries' => \implode(', ', Arr::except(
|
|
Country::getValidCountriesLabel(),
|
|
[
|
|
array_search(Country::belgium()->label, Country::getValidCountriesLabel()),
|
|
array_search(Country::luxembourg()->label, Country::getValidCountriesLabel()),
|
|
]
|
|
)),
|
|
'examples' => 72000
|
|
]),
|
|
]
|
|
),
|
|
}; //end match
|
|
|
|
return $messages;
|
|
}
|
|
}
|