feat: Ajouter invoice_type et payment_method aux factures de saisie tableau

- Ajouter invoice_type='paie_mensuelle' et payment_method='sepa' au payload de saisie tableau
- Modifier l'API bulk-create pour accepter et stocker ces champs
- Améliorer les messages de notification paie_mensuelle :
  * Toujours afficher 'Votre facture pour la période XXX est disponible'
  * Utiliser 'du mois' comme fallback si period_label est vide
  * Appliquer le changement aux deux routes (notify et bulk-notify)
This commit is contained in:
odentas 2025-12-04 22:24:54 +01:00
parent 13d844921e
commit 5bff842a8c
4 changed files with 28 additions and 22 deletions

View file

@ -679,22 +679,22 @@ export default function SaisieTableauFacturesPage() {
setIsLoading(true);
try {
const payload = rows.map(r => ({
org_id: r.org_id,
numero: r.numero,
periode: r.periode || null,
date: r.date || null,
due_date: r.due_date || null,
payment_date: r.payment_date || null,
sepa_day: r.sepa_day || null,
montant_ht: Number(r.montant_ht) || 0,
montant_ttc: Number(r.montant_ttc) || 0,
statut: r.statut,
notes: r.notes || null,
pdf_s3_key: r.pdf_s3_key || null,
}));
const result = await api<{ created: number }>("/staff/facturation/bulk-create", {
const payload = rows.map(r => ({
org_id: r.org_id,
numero: r.numero,
periode: r.periode || null,
date: r.date || null,
due_date: r.due_date || null,
payment_date: r.payment_date || null,
sepa_day: r.sepa_day || null,
montant_ht: Number(r.montant_ht) || 0,
montant_ttc: Number(r.montant_ttc) || 0,
statut: r.statut,
notes: r.notes || null,
pdf_s3_key: r.pdf_s3_key || null,
invoice_type: 'paie_mensuelle',
payment_method: 'sepa',
})); const result = await api<{ created: number }>("/staff/facturation/bulk-create", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ invoices: payload }),

View file

@ -25,13 +25,13 @@ async function isStaffUser(supabase: any, userId: string): Promise<boolean> {
function buildInvoiceCustomMessage(invoice: any): string {
switch (invoice.invoice_type) {
case 'paie_mensuelle':
const periodText = invoice.period_label || 'du mois';
// Cas spécial pour les paiements par virement
if (invoice.payment_method === 'virement') {
const periodText = invoice.period_label ? `pour la période ${invoice.period_label}` : 'mensuelle';
return `Votre facture ${periodText} est disponible. Vous trouverez ci-dessous nos coordonnées bancaires pour le virement.`;
return `Votre facture pour la période ${periodText} est disponible. Vous trouverez ci-dessous nos coordonnées bancaires pour le virement.`;
}
// Cas normal (SEPA)
return invoice.period_label ? `Votre facture pour la période ${invoice.period_label} est disponible et sera prélevée à la date indiquée ci-dessous.` : `Votre facture mensuelle est disponible et sera prélevée à la date indiquée ci-dessous`;
return `Votre facture pour la période ${periodText} est disponible et sera prélevée à la date indiquée ci-dessous.`;
case 'paie_ouverture':
return `Votre facture d'ouverture de compte est disponible et sera prélevée à la date indiquée ci-dessous`;
case 'studio_site_web':

View file

@ -33,6 +33,8 @@ type InvoicePayload = {
statut: string;
notes?: string | null;
pdf_s3_key?: string | null;
invoice_type?: string | null;
payment_method?: string | null;
};
// POST - Création en masse de factures
@ -91,6 +93,8 @@ export async function POST(req: Request) {
statut: invoice.statut || 'emise',
notes: invoice.notes || null,
pdf_s3_key: invoice.pdf_s3_key || null,
invoice_type: invoice.invoice_type || null,
payment_method: invoice.payment_method || null,
});
}
});
@ -117,6 +121,8 @@ export async function POST(req: Request) {
status: inv.statut,
notes: inv.notes,
pdf_s3_key: inv.pdf_s3_key,
invoice_type: inv.invoice_type,
payment_method: inv.payment_method,
created_at: new Date().toISOString(),
updated_at: new Date().toISOString(),
}));

View file

@ -25,13 +25,13 @@ async function isStaffUser(supabase: any, userId: string): Promise<boolean> {
function buildInvoiceCustomMessage(invoice: any): string {
switch (invoice.invoice_type) {
case 'paie_mensuelle':
const periodText = invoice.period_label || 'du mois';
// Cas spécial pour les paiements par virement
if (invoice.payment_method === 'virement') {
const periodText = invoice.period_label ? `pour la période ${invoice.period_label}` : 'mensuelle';
return `Votre facture ${periodText} est disponible. Vous trouverez ci-dessous nos coordonnées bancaires pour le virement.`;
return `Votre facture pour la période ${periodText} est disponible. Vous trouverez ci-dessous nos coordonnées bancaires pour le virement.`;
}
// Cas normal (SEPA)
return invoice.period_label ? `Votre facture pour la période ${invoice.period_label} est disponible et sera prélevée à la date indiquée ci-dessous.` : `Votre facture mensuelle est disponible et sera prélevée à la date indiquée ci-dessous`;
return `Votre facture pour la période ${periodText} est disponible et sera prélevée à la date indiquée ci-dessous.`;
case 'paie_ouverture':
return `Votre facture d'ouverture de compte est disponible et sera prélevée à la date indiquée ci-dessous`;
case 'studio_site_web':