Cerfa mécénat rempli envoyé par email à la confirmation du paiement
Quand un paiement « mécénat » est confirmé, l'email de confirmation porte en pièce jointe le reçu fiscal (cerfa 11580*05) rempli du bénévole, avec une phrase l'annonçant dans le corps. Généré en tâche de fond : un échec de génération envoie l'email sans pièce jointe plutôt que rien. - build_message/send acceptent des pièces jointes - app/mecenat/receipts.py : passage Volunteer → MecenatReceipt, partagé avec l'export coordination - modèle cerfa remplacé par une version pré-remplie avec l'association (organisme bénéficiaire, cases 200/978, signature) ; position de la date du versement ajustée Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
5675e1d220
commit
5a0209ce43
@@ -81,6 +81,12 @@ from app.email import (
|
||||
send,
|
||||
)
|
||||
from app.forms import verify_hcaptcha
|
||||
from app.mecenat import (
|
||||
RECEIPT_FILENAME,
|
||||
MecenatReceipt,
|
||||
generate_mecenat_receipts_pdf,
|
||||
receipt_for,
|
||||
)
|
||||
from app.models import (
|
||||
Account,
|
||||
Artist,
|
||||
@@ -822,21 +828,48 @@ def _promote_pending(
|
||||
session.commit()
|
||||
|
||||
if volunteer.email:
|
||||
# Paiement « mécénat » (adresse postale saisie) : le cerfa rempli part
|
||||
# en pièce jointe du même email — voir `_send_paid_confirmation`.
|
||||
receipt = receipt_for(volunteer) if volunteer.mecenat_address else None
|
||||
subject, body = render_registration_paid_confirmation(
|
||||
first_name=volunteer.first_name,
|
||||
label=volunteer.fee_payment_label or "",
|
||||
amount=volunteer.fee_amount or 0,
|
||||
with_mecenat_receipt=receipt is not None,
|
||||
)
|
||||
background.add_task(
|
||||
send,
|
||||
_send_paid_confirmation,
|
||||
volunteer.email,
|
||||
subject,
|
||||
body,
|
||||
logo=edition_logo(session, edition.id),
|
||||
receipt=receipt,
|
||||
)
|
||||
return volunteer
|
||||
|
||||
|
||||
def _send_paid_confirmation(
|
||||
to: str,
|
||||
subject: str,
|
||||
body: str,
|
||||
*,
|
||||
logo: tuple[bytes, str] | None,
|
||||
receipt: MecenatReceipt | None,
|
||||
) -> None:
|
||||
"""Tâche de fond : génère le cerfa (si mécénat) puis envoie. Best effort
|
||||
comme le reste des emails — un échec de génération du PDF ne doit pas
|
||||
priver le bénévole de sa confirmation, qui part alors sans pièce jointe
|
||||
(la coordination garde l'export des reçus pour le lui renvoyer)."""
|
||||
attachments = []
|
||||
if receipt is not None:
|
||||
try:
|
||||
pdf = generate_mecenat_receipts_pdf([receipt])
|
||||
attachments.append((pdf, "application/pdf", RECEIPT_FILENAME))
|
||||
except Exception:
|
||||
logger.exception("Reçu fiscal mécénat non généré — email envoyé sans pièce jointe")
|
||||
send(to, subject, body, logo=logo, attachments=attachments)
|
||||
|
||||
|
||||
def _apply_pending_checkout_result(
|
||||
session: Session,
|
||||
edition: Edition,
|
||||
|
||||
@@ -30,7 +30,7 @@ from app.auth.deps import (
|
||||
)
|
||||
from app.db import get_session
|
||||
from app.exporting import generate_volunteers_xlsx
|
||||
from app.mecenat import MecenatReceipt, generate_mecenat_receipts_pdf
|
||||
from app.mecenat import generate_mecenat_receipts_pdf, receipt_for
|
||||
from app.models import (
|
||||
Account,
|
||||
Artist,
|
||||
@@ -247,19 +247,7 @@ def export_mecenat_receipts(
|
||||
status_code=422, detail={"code": "mecenat.no_receipts"}
|
||||
)
|
||||
|
||||
receipts = [
|
||||
MecenatReceipt(
|
||||
last_name=v.last_name,
|
||||
first_name=v.first_name,
|
||||
address=v.mecenat_address or "",
|
||||
postal_code=v.mecenat_postal_code or "",
|
||||
city=v.mecenat_city or "",
|
||||
country=v.mecenat_country or "",
|
||||
amount=v.fee_amount or 0.0,
|
||||
payment_date=(v.fee_paid_at or v.created_at).date(),
|
||||
)
|
||||
for v in volunteers
|
||||
]
|
||||
receipts = [receipt_for(v) for v in volunteers]
|
||||
content = generate_mecenat_receipts_pdf(receipts)
|
||||
return Response(
|
||||
content=content,
|
||||
|
||||
Reference in New Issue
Block a user