diff --git a/.dockerignore b/.dockerignore index 44ef498..b70fca0 100644 --- a/.dockerignore +++ b/.dockerignore @@ -9,3 +9,17 @@ client/dist README.md uploads storage +# Les sauvegardes et secrets ne doivent jamais entrer dans une image de build. +**/backups +**/*backup* +**/.ssh +**/.manus-logs +**/__pycache__ +**/*.pyc +**/*.sql.gz +**/*.bundle +**/*.zip +**/*.tar +**/*.tar.gz +**/*.pem +**/*.key diff --git a/client/src/pages/InvoiceDetail.tsx b/client/src/pages/InvoiceDetail.tsx index 492b4e2..2a00417 100644 --- a/client/src/pages/InvoiceDetail.tsx +++ b/client/src/pages/InvoiceDetail.tsx @@ -66,6 +66,21 @@ export default function InvoiceDetail() { const upsertLearningMutation = trpc.learnings.upsert.useMutation(); + // Le premier clic ajoute le litige, puis ouvre la saisie du commentaire. + const markDisputeMutation = trpc.invoices.setDispute.useMutation({ + onSuccess: async () => { + utils.invoices.getById.setData({ id: invoiceId }, current => current ? { ...current, isDisputed: 1 } : current); + setDisputeDialogOpen(true); + toast.success("Facture ajoutée aux litiges"); + await Promise.all([ + utils.invoices.getById.invalidate({ id: invoiceId }), + utils.invoices.list.invalidate(), + utils.invoices.listDisputes.invalidate(), + ]); + }, + onError: error => toast.error(error.message || "Impossible d’ajouter cette facture aux litiges"), + }); + const updateMutation = trpc.invoices.update.useMutation({ onSuccess: () => { toast.success("Facture mise à jour avec succès"); @@ -198,7 +213,10 @@ export default function InvoiceDetail() {
-