91 lines
4.2 KiB
PHP
91 lines
4.2 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Requests;
|
|
|
|
use Illuminate\Foundation\Http\FormRequest;
|
|
|
|
class StoreQuoteRequest extends FormRequest
|
|
{
|
|
public function authorize(): bool
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public function rules(): array
|
|
{
|
|
return [
|
|
'client_id' => 'nullable|exists:clients,id',
|
|
'sous_traitant_id' => 'nullable|exists:sous_traitants,id',
|
|
'group_id' => 'nullable|exists:client_groups,id',
|
|
'status' => 'required|in:brouillon,envoye,accepte,refuse,expire,annule',
|
|
'quote_date' => 'required|date',
|
|
'valid_until' => 'nullable|date|after_or_equal:quote_date',
|
|
'currency' => 'required|string|size:3',
|
|
'total_ht' => 'required|numeric|min:0',
|
|
'total_tva' => 'required|numeric|min:0',
|
|
'total_ttc' => 'required|numeric|min:0',
|
|
'lines' => 'required|array|min:1',
|
|
'lines.*.product_id' => 'nullable|exists:products,id',
|
|
'lines.*.packaging_id' => 'nullable|exists:product_packagings,id',
|
|
'lines.*.packages_qty' => 'nullable|numeric|min:0',
|
|
'lines.*.units_qty' => 'nullable|numeric|min:0',
|
|
'lines.*.description' => 'required|string',
|
|
'lines.*.qty_base' => 'nullable|numeric|min:0',
|
|
'lines.*.unit_price' => 'required|numeric|min:0',
|
|
'lines.*.unit_price_per_package' => 'nullable|numeric|min:0',
|
|
'lines.*.tva_rate_id' => 'nullable|exists:tva_rates,id',
|
|
'lines.*.discount_pct' => 'required|numeric|min:0|max:100',
|
|
'lines.*.total_ht' => 'required|numeric|min:0',
|
|
];
|
|
}
|
|
|
|
public function withValidator($validator): void
|
|
{
|
|
$validator->after(function ($validator) {
|
|
$hasClient = filled($this->input('client_id'));
|
|
$hasSousTraitant = filled($this->input('sous_traitant_id'));
|
|
$hasGroup = filled($this->input('group_id'));
|
|
|
|
if (! $hasClient && ! $hasSousTraitant && ! $hasGroup) {
|
|
$message = 'Un client, un sous-traitant ou un groupe de clients est obligatoire.';
|
|
$validator->errors()->add('client_id', $message);
|
|
$validator->errors()->add('sous_traitant_id', $message);
|
|
$validator->errors()->add('group_id', $message);
|
|
}
|
|
|
|
if ((int) $hasClient + (int) $hasSousTraitant + (int) $hasGroup > 1) {
|
|
$message = 'Selectionnez soit un client, soit un sous-traitant, soit un groupe de clients.';
|
|
$validator->errors()->add('client_id', $message);
|
|
$validator->errors()->add('sous_traitant_id', $message);
|
|
$validator->errors()->add('group_id', $message);
|
|
}
|
|
});
|
|
}
|
|
|
|
public function messages(): array
|
|
{
|
|
return [
|
|
'client_id.exists' => 'Le client selectionne est invalide.',
|
|
'sous_traitant_id.exists' => 'Le sous-traitant selectionne est invalide.',
|
|
'group_id.exists' => 'Le groupe selectionne est invalide.',
|
|
'status.required' => 'Le statut est obligatoire.',
|
|
'status.in' => 'Le statut selectionne est invalide.',
|
|
'quote_date.required' => 'La date du devis est obligatoire.',
|
|
'quote_date.date' => 'La date du devis n est pas valide.',
|
|
'valid_until.date' => 'La date de validite n est pas valide.',
|
|
'valid_until.after_or_equal' => 'La date de validite doit etre posterieure ou egale a la date du devis.',
|
|
'currency.required' => 'La devise est obligatoire.',
|
|
'currency.size' => 'La devise doit comporter 3 caracteres.',
|
|
'total_ht.required' => 'Le total HT est obligatoire.',
|
|
'total_ht.numeric' => 'Le total HT doit etre un nombre.',
|
|
'total_ht.min' => 'Le total HT ne peut pas etre negatif.',
|
|
'total_tva.required' => 'Le total TVA est obligatoire.',
|
|
'total_tva.numeric' => 'Le total TVA doit etre un nombre.',
|
|
'total_tva.min' => 'Le total TVA ne peut pas etre negatif.',
|
|
'total_ttc.required' => 'Le total TTC est obligatoire.',
|
|
'total_ttc.numeric' => 'Le total TTC doit etre un nombre.',
|
|
'total_ttc.min' => 'Le total TTC ne peut pas etre negatif.',
|
|
];
|
|
}
|
|
}
|