Plan d'Implémentation - Paiements & Relances
📋 Vue d'ensemble
Ce plan détaille l'implémentation du système de paiements & relances pour améliorer la gestion des factures en retard et automatiser les relances.
Dernière mise à jour : 2026-01-27
✅ Progrès d'Implémentation
Phase 1 : Détection automatique OVERDUE ✅ COMPLÉTÉ
-
✅ Service créé :
backend/src/billing/invoice-overdue/invoice-overdue.service.ts- Méthode
markOverdueInvoices()pour détecter et marquer les factures en retard - Méthode
markInvoiceAsOverdue()pour marquer une facture spécifique - Validation des transitions avec
BillingLifecycleValidator - Réconciliation des paiements avant marquage OVERDUE
- Méthode
-
✅ Scheduler créé :
backend/src/billing/invoice-overdue/invoice-overdue.scheduler.ts- Job quotidien à 4h du matin (
@Cron("0 4 * * *")) - Utilise
executeWithTimeoutAndRetrypour la gestion des timeouts - Logging structuré avec scope "INVOICE_OVERDUE_SCHEDULER"
- Job quotidien à 4h du matin (
-
✅ Intégration : Services ajoutés à
BillingCoreModuleetBillingModule
Phase 2 : Système de relances ✅ COMPLÉTÉ (Backend)
-
✅ Migration créée :
infra/liquibase/changes/0141_create_invoice_reminders/- Table
invoice_remindersavec tous les champs nécessaires - Indexes pour performance
- Foreign key vers
invoices(id, owner_id)
- Table
-
✅ Service créé :
backend/src/billing/reminders/invoice-reminders.service.tsgetRemindersForInvoice()- Récupérer l'historique des relancesshouldSendReminder()- Calculer si une relance doit être envoyéesendReminder()- Envoyer une relance (automatique ou manuelle)sendAutomaticReminders()- Envoyer toutes les relances automatiques- Utilise le template
payment-reminderavec remplacement de variables - Génère des liens client portail pour le paiement
- Crée des notifications pour l'utilisateur
-
✅ Scheduler créé :
backend/src/billing/reminders/invoice-reminders.scheduler.ts- Job quotidien à 5h du matin (
@Cron("0 5 * * *")) - S'exécute après la détection OVERDUE (4h)
- Job quotidien à 5h du matin (
-
✅ Contrôleur créé :
backend/src/billing/reminders/invoice-reminders.controller.tsGET /invoices/:invoiceId/reminders- Historique des relancesPOST /invoices/:invoiceId/reminders- Envoyer une relance manuelle
-
✅ Types de base de données :
InvoiceReminderTableajouté àdatabase.types.ts -
⏳ Frontend : À faire (voir Phase 4)
Phase 3 : Amélioration PayPal ✅ COMPLÉTÉ
-
✅ Service de notifications créé :
backend/src/paypal/paypal-notification.service.tssendPaymentSuccessEmailToOwner()- Notification au propriétaire de la facturesendPaymentSuccessEmailToClient()- Notification au client (contact)sendPaymentFailedEmailToOwner()- Notification d'échec au propriétairesendPaymentPendingEmail()- Notification de paiement en attente
-
✅ Webhooks améliorés :
backend/src/paypal/paypal-webhooks.controller.ts- Logging détaillé avec scope "PAYPAL_WEBHOOK"
- Logging des détails de signature webhook (pour debugging)
- Gestion améliorée des erreurs avec contexte complet
- Support des statuts PENDING, FAILED, DECLINED
- Notifications automatiques intégrées dans le webhook
- Logging des événements non gérés pour monitoring
-
✅ Intégration dans le service de paiement :
backend/src/paypal/paypal-payment.service.ts- Notification PENDING lors de la création d'un paiement
- Notifications SUCCESS/FAILED lors de la capture manuelle
Phase 4 : Interface Frontend ✅ COMPLÉTÉ
-
✅ Hook créé :
frontend/src/client/quotes-invoices/useInvoiceReminders.tsuseInvoiceReminders()- Récupérer l'historique des relances pour une factureuseSendInvoiceReminder()- Envoyer une relance manuelle- Invalidation automatique des queries après envoi
-
✅ Composant créé :
frontend/src/pages/invoices/InvoiceViewPage/components/RemindersSection.tsx- Affichage de l'historique des relances envoyées
- Bouton pour envoyer une relance manuelle (visible uniquement pour factures OVERDUE)
- Badge "Manuelle" pour les relances envoyées manuellement
- Affichage des détails (numéro, date, destinataire, sujet)
- Section masquée si facture non-overdue et aucune relance envoyée
-
✅ Intégration : Composant ajouté à
InvoiceView.tsx- Section affichée après la description de la facture
- Utilise les traductions i18n (fr-FR, en-US)
-
✅ Traductions ajoutées :
sessions.quotesInvoices.invoices.reminders.*danstranslation.json(fr et en)
Phase 6 : Configuration des relances ✅ COMPLÉTÉ
-
✅ Migration créée :
infra/liquibase/changes/0142_create_user_reminder_settings/- Table
user_reminder_settingspour personnaliser les paramètres par utilisateur - Champs :
enabled,first_reminder_days,second_reminder_days,third_reminder_days,max_reminders,reminder_template_key - Valeurs par défaut : 7, 14, 30 jours, max 3 relances
- Table
-
✅ Types de base de données :
UserReminderSettingsTableajouté àdatabase.types.ts -
✅ Service mis à jour :
backend/src/billing/reminders/invoice-reminders.service.ts- Fonction
getReminderSettings()pour récupérer les settings utilisateur (avec fallback sur defaults) shouldSendReminder()utilise maintenant les settings utilisateursendReminder()utilise le template configuré par l'utilisateur- Les valeurs par défaut sont utilisées si l'utilisateur n'a pas de settings personnalisés
- Méthodes
getReminderSettingsForUser()etupdateReminderSettingsForUser()pour gérer les settings
- Fonction
-
✅ Contrôleur créé :
backend/src/billing/reminders/invoice-reminders.controller.tsReminderSettingsControlleravec endpoints :GET /reminder-settings- Récupérer les settings de l'utilisateurPOST /reminder-settings- Mettre à jour les settings de l'utilisateur
- Validation avec Zod (
updateReminderSettingsSchema)
-
✅ DTO créé :
backend/src/billing/reminders/dto/update-reminder-settings.dto.ts- Validation Zod pour les paramètres de relances
-
✅ Hooks React Query créés :
frontend/src/client/billing/useReminderSettings.tsuseReminderSettings()- Récupérer les settingsuseUpdateReminderSettings()- Mettre à jour les settings
-
✅ Page de settings créée :
frontend/src/pages/settings/ReminderSettingsPage/ReminderSettingsPage.tsx- Formulaire avec Switch pour activer/désactiver
- Inputs pour les délais (J+7, J+14, J+30)
- Input pour le nombre max de relances
- Design cohérent avec les autres pages de settings
-
✅ Route ajoutée :
/settings/remindersdanssettings.routes.tsx -
✅ Navigation ajoutée :
- Lien dans
UserMenuMobile(menu mobile) - Lien dans
UserDropdown(menu desktop)
- Lien dans
-
✅ Traductions ajoutées :
settings.reminders.*danstranslation.json(fr et en)settings.tabs.reminderspour le menu
✅ État Actuel
Ce qui existe déjà
-
Paiements partiels ✅
- Statut
PARTIALLY_PAIDimplémenté PaymentReconciliationServicecalcule automatiquementbalance_due- Support des paiements multiples par facture
- Statut
-
Intégration PayPal ✅
- Création de paiements via PayPal Orders
- Webhooks pour capturer les paiements
- Stockage des paiements dans
paypal_payments
-
Intégration Stripe ✅
- Création de Payment Intents
- Webhooks pour synchroniser les statuts
- Stockage des paiements dans
stripe_payments
-
Template de relance ✅
- Template email
payment-reminder.htmlexiste - Notification type
PAYMENT_LATEdéfini
- Template email
Ce qui manque
- ❌ Job périodique pour marquer OVERDUE : Pas de scheduler pour détecter automatiquement les factures en retard