Repository navigation
feat(25-6-b): le PDF d'une facture est figé — une pièce émise ne change plus (closes #387) - #506
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…he (refs #387) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… constante, sites du manuel, cas limites (refs #387) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e (refs #387) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…garde du manuel admin, gardes structurelles (refs #387) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tion P3 (refs #387) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ersion, six erreurs nommées (refs #387) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… cours (refs #387) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…efs #387) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Service unique issued_invoice_pdf (téléchargement et e-mail) : facture
figée → fichier relu et empreinte vérifiée ; validée non figée → rendu
dans la langue du client, écrit sous KESH_DOCUMENTS_DIR, posé par un
UPDATE conditionnel (pdf_storage_path IS NULL, status, version) avec
l'audit invoice.pdf_frozen dans la même transaction. Fichier absent →
410 INVOICE_PDF_GONE ; altéré → 500. Refigeage Admin
(POST /invoices/{id}/pdf/refreeze, audit invoice.pdf_refrozen). La
dévalidation détache. Liste unique des colonnes d'Invoice. Export CSV
(pdf_sha256, pdf_frozen_at, pdf_language). Fiche facture : bouton PDF
pour une annulée figée, mention du gel, refigeage après un 410.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…387) Garde d'export : pdf_storage_path écartée avec son motif. Spec E2E du PDF figé (montage : compte bancaire principal). Manuels FR (gel, refigeage, sauvegarde du répertoire des documents) régénérés, CHANGELOG [0.12.1], README, docs/testing.md. Gates : backend 2583/2583, frontend 853/853, E2E 227 passés + 9 échecs attendus (KF-029 x7, KF-051 x2). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… (refs #387) B1 : une facture annulée figée ne s'envoie plus par e-mail. M1 : le toast du 410 nomme le fichier (message du serveur, pas du catalogue). M2 : la note de l'export dit que les PDF émis n'y sont pas. L3 : l'import de l'inbox ne supprime plus un fichier archivé partagé. Bouton de refigeage réservé aux factures validées, retiré après un téléchargement réussi. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, refus de PDF partagé (refs #387) Marques d'isolation Fluent retirées des messages d'erreur ; 410 d'une facture annulée sans promesse de refigeage ; garde d'envoi tenue par le service ; facture relue à chaque tentative ; fiche relue après refigeage. pdfErrorMessage partagé par les fiches facture et avoir (« trop de lignes » affichait { $count } brut, défaut antérieur). Tests : clé d'API, langue du document, 410 d'une annulée ; manuels (HEAD, restauration). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ge, relecture isolée (refs #387) Une facture figée entre deux tentatives est adoptée ; la garde d'envoi vaut aussi à l'adoption. Refus du refigeage : statut avant empreinte. Relecture de la fiche après refigeage isolée de son try. CHANGELOG (clé d'API, HEAD, annulée, restauration), décompte de P1 corrigé. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…(refs #387) Gates complets : backend 2588/2588, frontend 862/862, E2E 229 passés + 9 échecs attendus (KF-029 x7, KF-051 x2). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ure-archive # Conflicts: # CHANGELOG.md # _bmad-output/implementation-artifacts/sprint-status.yaml # docs/manual/fr/user-manual.pdf # frontend/src/lib/shared/i18n-keys.test.ts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #387.
Ce qui change
Le PDF d'une facture ne change plus après son émission. Il était régénéré à chaque téléchargement, à partir des données du moment : modifier ses coordonnées, l'adresse du client ou la mise en page modifiait aussi les factures déjà envoyées, et deux téléchargements ne rendaient jamais le même fichier.
KESH_DOCUMENTS_DIRet en garde l'empreinte SHA-256. Ensuite, chaque téléchargement et chaque envoi rendent ce même fichier, octet pour octet. Le gel est audité (invoice.pdf_frozen) au nom de l'acteur : utilisateur, consultation comprise, ou clé d'API.routes/issued_invoice_pdf.rs. L'ancienne fonction de rendu direct est retirée.UPDATEconditionnel (pdf_storage_path IS NULL,status = 'validated',versionlue au rendu), dans une transaction avec son audit. Une seule nouvelle tentative, puis 409INVOICE_CHANGED.INVOICE_PDF_GONE, dont le message nomme le fichier à restaurer. Fichier altéré → 500, rien n'est servi. Jamais de régénération silencieuse.POST /api/v1/invoices/{id}/pdf/refreeze. Il produit un nouveau document quand le fichier a disparu ; l'auditinvoice.pdf_refrozengarde les deux empreintes. Il est impossible pour une facture annulée.invoices.csvgagnepdf_sha256,pdf_frozen_atetpdf_language, insérés avantversion..keshbackupne contient pas les fichiers ([CR] La sauvegarde .keshbackup doit emporter les fichiers — justificatifs et PDF figés #503).Migration
20261003000001_invoices_frozen_pdf.sql: quatre colonnes nullables et une contrainte tout-ou-rien. Elle est non breaking (ADD COLUMNnullable), sans bump demin_required.Corrigé en route (revue)
{ $count }brut sur les fiches facture et avoir (défaut antérieur). Les deux fiches partagent désormaisshared/utils/pdf-error.ts.Revue et gates
25-6-b-review-prompt-p1…p4.md.main(25-6-a) : backend 2602/2602, frontend 889/889, build OK, E2E complet 233 passés, 9 échecs attendus (KF-029 ×7, KF-051 ×2 avant 12:00 UTC).Hors périmètre
.keshbackup: [CR] La sauvegarde .keshbackup doit emporter les fichiers — justificatifs et PDF figés #503.rounding_amountdans la liste unique des colonnes d'Invoice(invoice_columns!), et les compteurs de migrations (migrations_upgrade_path, audit d'idempotence).🤖 Generated with Claude Code