Numéro d'ordre unique sur chaque reçu fiscal mécénat
Volunteer.mecenat_receipt_number (migration 0020, unique) : année du paiement + rang sur 5 chiffres (202600001…), une seule numérotation pour toutes les éditions, repartant à 1 chaque année. Attribué à la confirmation du paiement, ou au premier export pour les bénévoles payés avant (dans l'ordre des paiements), puis jamais réattribué — un reçu regénéré garde son numéro. Attribution sérialisée par un verrou pg_advisory_xact_lock (webhook et sondage peuvent confirmer deux paiements à la fois). Imprimé centré dans la case « Numéro d'ordre du reçu » en page 1 du cerfa. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
5a0209ce43
commit
ccd769d04e
@@ -221,7 +221,16 @@ les tables sauf les tables d'association.
|
||||
signature (page 2) sont **pré-remplis dans le modèle PDF lui-même** par
|
||||
l'association (pas en base) : changer d'association = remplacer le
|
||||
fichier, en gardant la même mise en page (les coordonnées de l'overlay
|
||||
n'ont été mesurées que sur ce document).
|
||||
n'ont été mesurées que sur ce document). **Numéro d'ordre** du reçu
|
||||
(case en haut de la page 1) : `Volunteer.mecenat_receipt_number`, unique,
|
||||
`AAAA` (année du paiement) + rang sur 5 chiffres (`202600001`), une seule
|
||||
numérotation pour toutes les éditions, repartant à 1 chaque année —
|
||||
attribué à la confirmation du paiement (`_promote_pending`) ou, pour un
|
||||
bénévole qui n'en a pas encore, au premier export (dans l'ordre des
|
||||
paiements), puis **jamais réattribué** (un reçu regénéré garde son
|
||||
numéro). `app/mecenat/receipts.py:assign_receipt_number`, sérialisé par
|
||||
un verrou `pg_advisory_xact_lock` (webhook et sondage peuvent confirmer
|
||||
deux paiements à la fois).
|
||||
`pypdf` (nouvelle dépendance) fusionne l'overlay ReportLab sur la page du
|
||||
modèle. Bouton « Reçus mécénat (PDF) » sur l'écran de configuration des
|
||||
bénévoles, même mécanique de téléchargement que l'export Excel ;
|
||||
@@ -833,6 +842,7 @@ Aucune dépendance locale requise hors Docker.
|
||||
| 31 | Revue de sécurité : logo des emails en pièce jointe inline au lieu d'une URL (fuyait le `access_token` du formulaire public à tout destinataire — régression de l'étape 27, aucun test ne couvrait le rendu HTML du logo), sujet retiré du log de remise des emails (pouvait porter le nom d'un bénévole via un modèle personnalisé), image du formulaire public revalidée par décodage réel (`PIL`, pas seulement le `Content-Type` déclaré) avant stockage — évite qu'une fausse image fasse échouer la génération des badges/feuilles de poste, export Excel des bénévoles protégé contre l'injection de formule (CWE-1236, `app/exporting/xlsx.py:_safe_text`), sondage du statut de paiement en attente limité en fréquence par jeton (`pending_status_limiter`, évite un abus de l'API SumUp), `pyjwt` mis à jour (CVE listées non exploitables ici — HS256 à secret statique uniquement, jamais de JWKS — mais autant ne pas rester sur une version vulnérable) | à valider |
|
||||
| 32 | Formulaire public : astérisque rouge sur les champs obligatoires (`RequiredMark`, `FieldLabel required`) et légende « * champ obligatoire » | à valider |
|
||||
| 33 | Cerfa mécénat rempli envoyé en pièce jointe de l'email de confirmation une fois le paiement confirmé (`build_message(attachments=…)`, `app/mecenat/receipts.py`) ; modèle cerfa pré-rempli avec l'association et sa signature | à valider |
|
||||
| 34 | Numéro d'ordre unique sur chaque reçu fiscal mécénat (`Volunteer.mecenat_receipt_number`, `202600001`…, migration `0020`), attribué au paiement ou au premier export puis figé | à valider |
|
||||
|
||||
**Reste hors périmètre** (modèle prêt à les accueillir) : SMS, constructeur
|
||||
de formulaire, pointage sur site, IA. Frontend : squelette + 6 écrans +
|
||||
|
||||
Reference in New Issue
Block a user