Add price list management across the API, store, services, routes, navigation, and sales views. Support quotes for either a client or a client group, including PDF download and nullable client validation for group-based recipients. Extend client groups to manage assigned clients directly from the form and detail views, and refresh supplier, intervention, stock, and order screens with updated interactions and layouts.
97 lines
4.1 KiB
PHP
97 lines
4.1 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Requests;
|
|
|
|
use Illuminate\Foundation\Http\FormRequest;
|
|
|
|
class StoreQuoteRequest extends FormRequest
|
|
{
|
|
/**
|
|
* Determine if the user is authorized to make this request.
|
|
*/
|
|
public function authorize(): bool
|
|
{
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Get the validation rules that apply to the request.
|
|
*
|
|
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
|
|
*/
|
|
public function rules(): array
|
|
{
|
|
return [
|
|
'client_id' => 'nullable|exists:clients,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'));
|
|
$hasGroup = filled($this->input('group_id'));
|
|
|
|
if (! $hasClient && ! $hasGroup) {
|
|
$message = 'Un client ou un groupe de clients est obligatoire.';
|
|
|
|
$validator->errors()->add('client_id', $message);
|
|
$validator->errors()->add('group_id', $message);
|
|
}
|
|
|
|
if ($hasClient && $hasGroup) {
|
|
$message = 'Sélectionnez soit un client, soit un groupe de clients.';
|
|
|
|
$validator->errors()->add('client_id', $message);
|
|
$validator->errors()->add('group_id', $message);
|
|
}
|
|
});
|
|
}
|
|
|
|
public function messages(): array
|
|
{
|
|
return [
|
|
'client_id.nullable' => 'Le client sélectionné est invalide.',
|
|
'client_id.exists' => 'Le client sélectionné est invalide.',
|
|
'group_id.exists' => 'Le groupe sélectionné est invalide.',
|
|
'status.required' => 'Le statut est obligatoire.',
|
|
'status.in' => 'Le statut sélectionné 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 validité n\'est pas valide.',
|
|
'valid_until.after_or_equal' => 'La date de validité doit être postérieure ou égale à la date du devis.',
|
|
'currency.required' => 'La devise est obligatoire.',
|
|
'currency.size' => 'La devise doit comporter 3 caractères.',
|
|
'total_ht.required' => 'Le total HT est obligatoire.',
|
|
'total_ht.numeric' => 'Le total HT doit être un nombre.',
|
|
'total_ht.min' => 'Le total HT ne peut pas être négatif.',
|
|
'total_tva.required' => 'Le total TVA est obligatoire.',
|
|
'total_tva.numeric' => 'Le total TVA doit être un nombre.',
|
|
'total_tva.min' => 'Le total TVA ne peut pas être négatif.',
|
|
'total_ttc.required' => 'Le total TTC est obligatoire.',
|
|
'total_ttc.numeric' => 'Le total TTC doit être un nombre.',
|
|
'total_ttc.min' => 'Le total TTC ne peut pas être négatif.',
|
|
];
|
|
}
|
|
}
|