import vine from '@vinejs/vine' const INVOICE_STATUSES = [ 'pending', 'awaiting_user_confirmation', 'in_relance', 'paid', 'litigation', 'cancelled', ] as const /** * Filtres GET /invoices?status=&q=&clientId=&page= */ export const listInvoicesValidator = vine.create({ status: vine.enum([...INVOICE_STATUSES, 'all'] as const).optional(), q: vine.string().maxLength(120).optional(), clientId: vine.string().uuid().optional(), page: vine.number().min(1).optional(), }) /** * POST /invoices — saisie manuelle. * * Le SPA peut envoyer : * - clientId d'un client existant (combobox a sélectionné une fiche), OU * - clientName seul → on tente de matcher par nom, sinon création à la * volée mais alors clientEmail est REQUIS (pivot produit, cf. Client). * * On ne peut pas exprimer "email requis si pas de match" en Vine pur, donc * c'est le contrôleur qui retourne 422 `client_email_required` si besoin. */ export const createInvoiceValidator = vine.create({ clientId: vine.string().uuid().optional(), clientName: vine.string().minLength(2).maxLength(120), clientEmail: vine.string().email().nullable().optional(), numero: vine.string().minLength(1).maxLength(50), amountTtcCents: vine.number().min(1), issueDate: vine.string().regex(/^\d{4}-\d{2}-\d{2}T/), dueDate: vine.string().regex(/^\d{4}-\d{2}-\d{2}T/), planId: vine.string().uuid().nullable().optional(), })