'required|exists:clients,id', 'invoice_id' => 'nullable|exists:invoices,id', 'group_id' => 'nullable|exists:client_groups,id', 'status' => 'required|in:brouillon,emis,applique,annule', 'avoir_date' => 'required|date', 'due_date' => 'nullable|date|after_or_equal:avoir_date', 'currency' => 'required|string|size:3', 'total_ht' => 'required|numeric', 'total_tva' => 'required|numeric', 'total_ttc' => 'required|numeric', 'reason_type' => 'required|in:remboursement_total,remboursement_partiel,reduction,erreur_facturation,retour_marchandise,accord_commercial,autre', 'reason_description' => 'nullable|string', 'e_invoice_status' => 'nullable|in:cree,transmis,accepte,refuse,en_litige,acquitte,archive', 'refund_status' => 'nullable|in:non_rembourse,en_cours,partiellement_rembourse,rembourse,compense', 'refund_date' => 'nullable|date', 'refund_method' => 'nullable|in:virement,cheque,carte_credit,compensation_future,autre', 'compensation_invoice_id' => 'nullable|exists:invoices,id', 'compensation_amount' => 'nullable|numeric|min:0', 'lines' => 'required|array|min:1', 'lines.*.product_id' => 'nullable|exists:products,id', 'lines.*.invoice_line_id' => 'nullable|exists:invoice_lines,id', 'lines.*.description' => 'required|string', 'lines.*.quantity' => 'required|numeric', 'lines.*.unit_price' => 'required|numeric', 'lines.*.tva_rate' => 'required|numeric', 'lines.*.total_ht' => 'required|numeric', 'lines.*.total_tva' => 'required|numeric', 'lines.*.total_ttc' => 'required|numeric', 'lines.*.notes' => 'nullable|string', ]; } }