diff --git a/backend-compliance/compliance/api/agent_compliance_check_routes.py b/backend-compliance/compliance/api/agent_compliance_check_routes.py index 6c05f815..c782ce59 100644 --- a/backend-compliance/compliance/api/agent_compliance_check_routes.py +++ b/backend-compliance/compliance/api/agent_compliance_check_routes.py @@ -207,6 +207,28 @@ async def get_snapshot(snapshot_id: str): db.close() +@router.get("/snapshots/{snapshot_id}/pdf") +async def export_snapshot_pdf(snapshot_id: str): + """P88 — PDF-Export der Audit-Mail. Liefert application/pdf.""" + from fastapi import HTTPException + from fastapi.responses import Response + from database import SessionLocal + from compliance.services.mail_pdf_export import render_snapshot_as_pdf + db = SessionLocal() + try: + pdf = render_snapshot_as_pdf(db, snapshot_id) + finally: + db.close() + if not pdf: + raise HTTPException(404, f"Snapshot {snapshot_id} nicht gefunden " + "oder PDF-Render fehlgeschlagen.") + fname = f"breakpilot-audit-{snapshot_id[:8]}.pdf" + return Response( + content=pdf, media_type="application/pdf", + headers={"Content-Disposition": f'attachment; filename="{fname}"'}, + ) + + @router.post("/snapshots/{snapshot_id}/replay") async def replay_snapshot( snapshot_id: str, diff --git a/backend-compliance/compliance/services/check_replay.py b/backend-compliance/compliance/services/check_replay.py index c913131c..13170cf2 100644 --- a/backend-compliance/compliance/services/check_replay.py +++ b/backend-compliance/compliance/services/check_replay.py @@ -200,6 +200,7 @@ def replay_from_snapshot( "sections": section_sizes, "mail_sent": False, "preview": full_html[:500] + "..." if len(full_html) > 500 else full_html, + "full_html": full_html, # P88 PDF-Export braucht das volle HTML. } if recipient and not dry_run: diff --git a/backend-compliance/compliance/services/mail_pdf_export.py b/backend-compliance/compliance/services/mail_pdf_export.py new file mode 100644 index 00000000..42ce38f1 --- /dev/null +++ b/backend-compliance/compliance/services/mail_pdf_export.py @@ -0,0 +1,86 @@ +""" +P88 — PDF-Export der Audit-Mail. + +Rendert dieselbe HTML wie die Mail via WeasyPrint zu PDF. Endpoint: +GET /api/compliance/agent/snapshots/{snapshot_id}/pdf → application/pdf + +Verwendung: +- GF/Lawyer-Uebergabe (kein E-Mail-Programm noetig) +- Archivierung +- Mandatsausgabe an externen Berater +""" + +from __future__ import annotations + +import logging +from datetime import datetime, timezone + +from sqlalchemy.orm import Session + +from compliance.services.check_replay import replay_from_snapshot + +logger = logging.getLogger(__name__) + +_PDF_WRAPPER_HEAD = """ +