Audit stampe SafeOps - 2026-07-25¶
Obiettivo¶
Allineare progressivamente le stampe SafeOps alla nuova logica trasversale:
- tenant-aware;
- branding corretto per Safecondo/Besant e futuri tenant;
- template versionati dove serve;
- output persistito con
DocumentoVersion; - fallback tracciato;
- niente invii email impliciti durante la generazione.
Stato per famiglia¶
| Famiglia stampa | Entry point | Motore | Persistenza/versioning | Branding tenant | Stato |
|---|---|---|---|---|---|
| RAS finale | run_ras_final_print_job |
verticale ReportLab v2 oppure snapshot cristallizzato | si, persist_ras_outputs |
si, Safecondo/Besant | allineato |
| RAS v2 / nuova stampa | run_ras_reportlab_v2_job |
ReportLab v2 | si, persist_ras_outputs + libretto |
parziale tramite payload RAS | quasi allineato |
| Bozza RAS | run_ras_draft_print_job |
DOCX template + conversione PDF + schede verticali con fallback legacy | si, PDF + DOCX + versioni | usa _build_ras_print_payload_for_doc |
primo allineamento completato |
| DOCX RAS | run_ras_draft_docx_job, run_ras_libretto_docx_job |
DOCX template registry/mapping | si, persist_ras_docx_output |
dipende dal template/payload | tracciamento template completato |
| NC RAS | print_nc_report |
ReportLab dedicato | si, documento + versione | si, via branding RAS | primo allineamento completato |
| Assemblea RAS | _run_ras_assemblea_pdf_job |
ReportLab dedicato | si, documento + versione | si, header/footer tenant-aware | primo allineamento completato |
| IDS-A PDF demo | run_ras_ids_a_pdf_demo_job |
HTML + WeasyPrint | solo StoredFile, non DocumentoVersion |
specifico IDS-A | fuori standard |
| Offerte/preventivi RAS | _build_ras_offer_order_pdf_bytes |
document-engine esterno con fallback DOCX locale | si per preventivi/moduli/firmati ufficiali | Besant parziale | primo versioning completato |
| Formazione preventivo | _write_training_quote_pdf_tmp |
ReportLab | temporaneo + flusso offerta | tenant branding dedicato formazione | separato, ok per ora |
| Formazione attestati/registri | app/modules/formazione/services.py |
ReportLab | si in alcune funzioni | tenant branding formazione | audit separato |
Evidenze principali¶
RAS finale¶
File: app/services/print_engine/base.py
Il finale e' ora il riferimento migliore:
- usa
_render_ras_final_outputs; - supporta renderer verticale;
- fallback legacy/DOCX tracciato;
- Besant ha default branding dedicato;
- Safecondo e Besant hanno registry
ras/ras_master/v35.
Nota: se il RAS e' gia cristallizzato, il finale riusa lo snapshot congelato. Ora viene tracciato come render_engine=crystallized_snapshot.
Bozza RAS / DOCX RAS¶
File: app/services/print_engine/base.py
La bozza usa ora questo flusso:
- DOCX template da
_resolve_ras_master_template_path; - conversione DOCX -> PDF;
- schede verticali quando il tenant e' abilitato al verticale;
- fallback automatico a
render_ras_section_pdfslegacy se il verticale fallisce; - salvataggio versionato.
- metadata
render_engine,render_engine_version,template_version_ide motore schede salvati sul documento.
Rischio residuo: il master bozza resta DOCX modificabile e quindi puo' differire dal PDF finale verticale, ma le schede sono allineate al renderer finale.
NC RAS¶
File: app/modules/documentale/views.py
File: app/services/print_engine/renderers/ras_non_conformita.py
La stampa NC e':
- generata inline via
send_file, mantenendo l'esperienza esistente; - salvata anche come
Documento; - versionata con
DocumentoVersion; - collegata a categoria
RASeRAS Non conformita; - header/footer tenant-aware con dati branding;
- nessuna
TemplateRegistry.
Rischio residuo: non usa ancora una TemplateRegistry, perche' il layout e' ReportLab puro.
Assemblea RAS¶
File: app/modules/documentale/views.py
File: app/services/print_engine/renderers/ras_assemblea.py
La stampa assemblea e':
- persistita come documento;
- versionata con
_create_document_version; - ha renderer ReportLab dedicato;
- usa branding tenant/logo in header/footer;
- registra
print_engine_version; - non usa registry template.
Rischio residuo: non usa ancora una TemplateRegistry, perche' il layout e' ReportLab puro.
IDS-A PDF demo¶
File: app/modules/commerciale/views.py
Il PDF IDS-A:
- usa template HTML + WeasyPrint;
- salva solo in
StoredFile; - sostituisce il precedente disattivandolo;
- non crea
DocumentoVersion; - e' volutamente specifico IDS.
Rischio: non va mischiato subito con Safecondo/Besant; serve decidere se resta demo IDS o diventa stampa ufficiale.
Offerte/preventivi RAS¶
File: app/modules/commerciale/views.py
Il flusso ordine/preventivo RAS:
- prova document-engine esterno;
- per Safecondo/Besant usa DOCX locale con logo tenant, evitando il logo Extra del document-engine;
- se il document-engine viene usato e fallisce, usa fallback locale DOCX e lo traccia nei metadata;
- Besant ha branding parziale gia introdotto;
- preventivi, moduli ordine e caricamenti firmati ufficiali creano
DocumentoVersion; - aperture preview offerta restano inline quando non si consolida un documento.
Rischio residuo: duplicazione di logica tra motore esterno, fallback locale e documentale SafeOps; il document-engine va allineato per non usare template/logo Extra come default.
Priorita consigliata¶
- Formazione
- audit separato, perche' ha gia un modello branding proprio e flussi WooCommerce.
Decisioni mancanti¶
- Le NC devono essere sempre archiviate nel documentale o solo quando l'utente clicca "salva"?
- La bozza RAS deve diventare identica al finale verticale o restare DOCX modificabile?
- IDS-A resta una demo interna o diventa output ufficiale?
- Le offerte RAS devono passare sempre dal document-engine o SafeOps deve avere fallback ufficiale versionato?
Prossimo passo operativo¶
Validare graficamente il branding Offerte/preventivi RAS sui tenant reali:
- rendere il branding sempre tenant-aware;
- verificare Safecondo e Besant;
- decidere se la preview inline deve anche consolidare una versione.