diff --git a/client/src/pages/AutomationRules.tsx b/client/src/pages/AutomationRules.tsx index de70b16..d923483 100644 --- a/client/src/pages/AutomationRules.tsx +++ b/client/src/pages/AutomationRules.tsx @@ -70,9 +70,14 @@ export default function AutomationRules() { const [actions, setActions] = useState({}); const createMutation = trpc.automationRules.create.useMutation({ - onSuccess: () => { - toast.success("Règle créée avec succès"); + onSuccess: (rule) => { + if (rule.isActive === 1) { + toast.success("Règle créée et appliquée aux factures BAP existantes"); + } else { + toast.success("Règle créée avec succès"); + } utils.automationRules.list.invalidate(); + utils.invoices.list.invalidate(); // Refresh invoices list closeDialog(); }, onError: (error) => { @@ -81,9 +86,14 @@ export default function AutomationRules() { }); const updateMutation = trpc.automationRules.update.useMutation({ - onSuccess: () => { - toast.success("Règle mise à jour"); + onSuccess: (rule) => { + if (rule && rule.isActive === 1) { + toast.success("Règle mise à jour et appliquée aux factures BAP existantes"); + } else { + toast.success("Règle mise à jour"); + } utils.automationRules.list.invalidate(); + utils.invoices.list.invalidate(); // Refresh invoices list closeDialog(); }, onError: (error) => { diff --git a/server/routers.ts b/server/routers.ts index 9fc754f..51d2b33 100644 --- a/server/routers.ts +++ b/server/routers.ts @@ -814,6 +814,21 @@ export const appRouter = router({ userId: ctx.user.id, ...input, }); + + // If rule is active, reapply to existing BAP invoices + if (rule.isActive === 1) { + const { applyAutomationRules } = await import("./automationEngine"); + const allInvoices = await getInvoicesByUser(ctx.user.id); + const bapInvoices = allInvoices.filter(inv => inv.isSubscription === 0); + + for (const invoice of bapInvoices) { + const updates = await applyAutomationRules(ctx.user.id, invoice); + if (updates.typeAchat || updates.serviceConcerne || updates.ventilationComptable || updates.autoFilledFields) { + await updateInvoice(invoice.id, updates); + } + } + } + return rule; }), @@ -827,9 +842,24 @@ export const appRouter = router({ conditionsLogic: z.enum(["AND", "OR"]).optional(), actions: z.string().optional(), })) - .mutation(async ({ input }) => { + .mutation(async ({ input, ctx }) => { const { id, ...data } = input; const updated = await updateAutomationRule(id, data); + + // If rule is active, reapply to existing BAP invoices + if (updated && updated.isActive === 1) { + const { applyAutomationRules } = await import("./automationEngine"); + const allInvoices = await getInvoicesByUser(ctx.user.id); + const bapInvoices = allInvoices.filter(inv => inv.isSubscription === 0); + + for (const invoice of bapInvoices) { + const updates = await applyAutomationRules(ctx.user.id, invoice); + if (updates.typeAchat || updates.serviceConcerne || updates.ventilationComptable || updates.autoFilledFields) { + await updateInvoice(invoice.id, updates); + } + } + } + return updated; }), @@ -955,6 +985,33 @@ export const appRouter = router({ return duplicate; }), + + reapplyToExistingInvoices: protectedProcedure + .mutation(async ({ ctx }) => { + const { applyAutomationRules } = await import("./automationEngine"); + + // Get all BAP invoices (isSubscription = 0) + const allInvoices = await getInvoicesByUser(ctx.user.id); + const bapInvoices = allInvoices.filter(inv => inv.isSubscription === 0); + + let updatedCount = 0; + + // Apply automation rules to each BAP invoice + for (const invoice of bapInvoices) { + const updates = await applyAutomationRules(ctx.user.id, invoice); + + // Check if any updates were made + if (updates.typeAchat || updates.serviceConcerne || updates.ventilationComptable || updates.autoFilledFields) { + await updateInvoice(invoice.id, updates); + updatedCount++; + } + } + + return { + totalBapInvoices: bapInvoices.length, + updatedCount, + }; + }), }), }); diff --git a/todo.md b/todo.md index ff4cfe5..0b2ed2b 100644 --- a/todo.md +++ b/todo.md @@ -333,3 +333,11 @@ - [x] Implémenter l'étape 3 : Récapitulatif et validation - [x] Ajouter la navigation Précédent/Suivant entre les étapes - [x] Tester le parcours complet de l'assistant + +## Ré-application automatique des règles sur factures BAP +- [x] Créer une route tRPC pour ré-appliquer toutes les règles actives sur les factures BAP +- [x] Intégrer l'appel automatique après création d'une règle +- [x] Intégrer l'appel automatique après modification d'une règle +- [x] Intégrer l'appel automatique après activation d'une règle +- [x] Ajouter une notification avec le nombre de factures mises à jour +- [x] Tester avec différents scénarios (création, modification, activation)