espace-paie-odentas/BULK_SEPA_UPDATE_FEATURE.md

6.8 KiB

Fonctionnalité de Modification en Masse des Dates de Factures

Résumé

Cette fonctionnalité permet aux utilisateurs staff de modifier en masse différents types de dates sur plusieurs factures en même temps depuis la page /staff/facturation :

  • Date de prélèvement SEPA (sepa_day)
  • Date de facture (invoice_date)
  • Date d'échéance (due_date)

Fonctionnalités implémentées

Interface utilisateur

  1. Checkboxes de sélection :

    • Une checkbox "Tout sélectionner" dans l'en-tête du tableau
    • Une checkbox par ligne de facture pour la sélection individuelle
  2. Bandeau d'actions :

    • Apparaît automatiquement quand au moins une facture est sélectionnée
    • Affiche le nombre de factures sélectionnées
    • Contient trois boutons d'action :
      • "Modifier date facture" (vert) - Met à jour invoice_date
      • "Modifier date échéance" (orange) - Met à jour due_date
      • "Modifier date SEPA" (bleu) - Met à jour sepa_day
    • Bouton "Annuler" pour effacer la sélection
  3. Modals de saisie :

    • Interface dédiée pour chaque type de date
    • Validation côté client appropriée selon le type de date
    • Gestion des états de chargement
    • Messages de confirmation et d'erreur

Backend

  1. APIs de mise à jour en masse :
    • /api/staff/facturation/bulk-update-sepa - Pour les dates SEPA
    • /api/staff/facturation/bulk-update-invoice-date - Pour les dates de facture
    • /api/staff/facturation/bulk-update-due-date - Pour les dates d'échéance
    • Endpoints POST protégés (accès staff uniquement)
    • Validation des données d'entrée
    • Validation de sécurité (limite de 100 factures par batch)
    • Mise à jour atomique dans Supabase
    • Gestion d'erreurs complète

Architecture technique

Frontend

  • Fichier modifié : app/(app)/staff/facturation/page.tsx
  • Nouvelles dépendances : Icône Calendar de Lucide React
  • État React :
    • selectedInvoices: Set<string> pour les factures sélectionnées
    • showSepaModal: boolean pour l'affichage du modal SEPA
    • showInvoiceDateModal: boolean pour l'affichage du modal de date de facture
    • showDueDateModal: boolean pour l'affichage du modal de date d'échéance
    • newSepaDate: string pour la nouvelle date SEPA
    • newInvoiceDate: string pour la nouvelle date de facture
    • newDueDate: string pour la nouvelle date d'échéance

Backend

  • Nouveaux fichiers :
    • app/api/staff/facturation/bulk-update-sepa/route.ts
    • app/api/staff/facturation/bulk-update-invoice-date/route.ts
    • app/api/staff/facturation/bulk-update-due-date/route.ts
  • Méthode : POST pour tous les endpoints
  • Protection : Vérification du statut staff
  • Base de données : Table invoices

Utilisation

  1. Aller sur /staff/facturation
  2. Cocher les factures concernées (individuellement ou toutes)
  3. Choisir l'action souhaitée dans le bandeau qui apparaît :
    • Modifier date facture : Change la date d'émission de la facture
    • Modifier date échéance : Change la date limite de paiement
    • Modifier date SEPA : Change la date de prélèvement automatique
  4. Sélectionner la nouvelle date dans le modal correspondant
  5. Confirmer l'action

Spécificités par type de date

Date de facture (invoice_date)

  • Couleur : Vert
  • Champ DB : invoice_date
  • Validation : Format de date valide
  • Restrictions : Aucune restriction de date passée

Date d'échéance (due_date)

  • Couleur : Orange
  • Champ DB : due_date
  • Validation : Format de date valide
  • Restrictions : Aucune restriction de date passée

Date SEPA (sepa_day)

  • Couleur : Bleu
  • Champ DB : sepa_day
  • Validation : Format de date valide + date future obligatoire
  • Restrictions : Date ne peut pas être dans le passé

Sécurité et validations

  • Accès restreint aux utilisateurs staff uniquement
  • Validation de format de date (YYYY-MM-DD) pour tous les types
  • Validation que la date SEPA n'est pas dans le passé
  • Limite de 100 factures par mise à jour
  • Vérification de l'existence des factures avant mise à jour
  • Mise à jour atomique avec rollback en cas d'erreur
  • Journalisation des opérations

Messages d'erreur gérés

Erreurs communes à tous les endpoints

  • invalid_invoice_ids : IDs de factures invalides
  • invalid_date_format : Format de date incorrect
  • too_many_invoices : Trop de factures (>100)
  • some_invoices_not_found : Certaines factures n'existent pas
  • unauthorized : Utilisateur non connecté
  • forbidden : Accès non autorisé (non-staff)

Erreurs spécifiques par type

  • invalid_sepa_date : Date SEPA invalide
  • date_in_past : Date SEPA dans le passé (uniquement pour SEPA)
  • invalid_invoice_date : Date de facture invalide
  • invalid_due_date : Date d'échéance invalide

Tests recommandés

  1. Test de sélection :

    • Sélection individuelle de factures
    • Sélection/désélection globale
    • Annulation de sélection
  2. Test de validation par type de date :

    • Date SEPA : Date dans le passé (doit échouer), Date future (doit réussir)
    • Date facture : Date passée/future (doivent réussir)
    • Date échéance : Date passée/future (doivent réussir)
    • Format de date invalide pour tous les types
  3. Test de sécurité :

    • Accès non-staff (doit échouer)
    • Trop de factures sélectionnées (doit échouer)
  4. Test de mise à jour :

    • Mise à jour réussie pour chaque type de date
    • Rafraîchissement automatique des données
    • Messages de succès/erreur appropriés
  5. Test d'UI :

    • Affichage/masquage correct des modals
    • Couleurs distinctives des boutons
    • States de chargement
    • Nettoyage des formulaires après annulation

Interface utilisateur

Bandeau d'actions

[X factures sélectionnées]  [Modifier date facture] [Modifier date échéance] [Modifier date SEPA] [Annuler]
                              ↑ Vert                 ↑ Orange                ↑ Bleu              ↑ Gris

Couleurs des boutons

  • 🟢 Vert (bg-green-600) : Date de facture
  • 🟠 Orange (bg-orange-600) : Date d'échéance
  • 🔵 Bleu (bg-blue-600) : Date SEPA
  • Gris (bg-gray-500) : Annuler

Notes techniques

  • La fonctionnalité utilise React Query pour la gestion des mutations et le cache
  • Les modals utilisent un overlay avec position: fixed et z-index élevé
  • Les styles suivent la convention Tailwind CSS existante du projet
  • L'API suit les patterns de sécurité existants du projet
  • Chaque type de date a son propre endpoint pour une meilleure modularité
  • La validation côté client empêche les soumissions invalides
  • La validation côté serveur assure la sécurité des données