00ef1eb1e01b617632afbe25534e2ee6622d5ad6
5 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
00ef1eb1e0 |
feat(ar1-admin): bottone Anteprima PDF wirato a BE /admin/ar1-templates/:id/preview-pdf
Rimosso toast 'TODO' dal bottone eye icon in Tab Template. Ora:
1. chiama Ar1Service.previewTemplatePdf(row.id) (nuovo metodo, ritorna Blob)
2. crea URL.createObjectURL + window.open('_blank')
3. revokeObjectURL dopo 60s (cleanup)
4. toast info iniziale 'Generazione anteprima...' + error toast su fail
Service: +1 metodo previewTemplatePdf(templateId) che torna Promise<Blob>
usando buildHeadersMultipart (nessun Content-Type per risposta binaria).
|
||
|
|
4a719ded5b |
feat(ar1-admin): riscrittura italiana + 5 tab con Testi PEC + editor form-based
Riscrittura completa di Ar1AdminConfig.js (490 -> 888 LOC) con UI italianizzata,
labels parlanti, editor form-based per layout template, tab 'Testi comunicazioni'
con editor dei 5 template email + anteprima server-side.
CAMBIAMENTI FUNZIONALI:
Tab 1 Template:
- 'In uso' (ACTIVE/DRAFT) vs 'Archiviati' ora in DUE Card separate, non mescolati
- Nomi varianti in italiano ('A1 — Persona Giuridica (societa, ente)', ecc)
- Status tag italiano ('In uso', 'Archiviato', 'Bozza')
- Editor layout: DEFAULT modalita form (Brand/Header/Intro/Privacy con campi
espliciti nome, logo_url, colori primario+accento, titoli, saluto, corpo
introduttivo, URL privacy, testo piede). Toggle 'Modalita avanzata (JSON raw)'
per chi vuole editare tutto il layout_config.
- Bottone 'Anteprima PDF' presente (placeholder toast TODO — endpoint BE da wirare)
- Bottone 'Nuova versione' eredita automaticamente layout_config da ACTIVE corrente
Tab 2 Policy:
- Tutti i label tradotti in italiano con help text inline per ogni campo
- Dropdown 'Categoria documento aziendale' da GET /admin/document-categories
(cross-schema read a gepafin_schema.document_category) invece di InputNumber
raw. Mostra 'DURC — Documento Unico...', 'ANTIRICICLAGGIO — Dichiarazione...'
- Switch con descrizioni espanse (cosa fa, quando si attiva)
- Divider visivo tra campi numerici e switch booleani
Tab 3 Regole reminder:
- Colonna 'Regola' con label italiano parlante + kind tecnico in sottotitolo
- Colonna 'Quando parte' calcolata dinamicamente: '30 giorni PRIMA',
'Il giorno della scadenza', '5 giorni DOPO', ecc
- Colonna 'Ricorrenza' formattata ('una tantum' vs 'ogni 30 giorni')
- Dialog edit: Dropdown PEC_KIND_OPTIONS con 5 etichette italiane (kind
disabled se editing esistente), help text inline sul campo offset_days
che cambia live ('3 giorni prima della scadenza' / 'giorno della scadenza'
/ '3 giorni dopo la scadenza')
Tab 4 Invio massivo:
- Label italiano 'Solo aziende con AR1 scaduta' / 'Solo aziende senza AR1'
- Pulsante 'Anteprima (non invia)' con toast descrittivo
- Pulsante 'Invia PEC' richiede ConfirmDialog
- Messaggio warning giallo chiarisce che la PEC sara dispatchata dal BE Gepafin
- Box esito con matched / marked_for_pec / company_ids (trimmato a 30+…)
Tab 5 Testi comunicazioni (NUOVO):
- Banner info + elenco variabili supportate come Tag cliccabili (7 variabili)
- DataTable 5 righe: Tipo comunicazione (label IT + kind mono) / Oggetto /
Versione (Tag 'v1', 'v2', ...) / Aggiornato il / Azione 'Modifica'
- Dialog edit massimizzabile: subject + body_html (textarea monospace 10
righe) + body_text fallback (5 righe) + note interne
- Bottone 'Anteprima (dati di esempio)' chiama POST /admin/ar1-email-templates/
{kind}/preview e mostra rendering HTML interpolato (dangerouslySetInnerHTML)
con subject renderizzato + body in box stile email
- Save bump version lato BE (toast 'Testo aggiornato (version N)')
SERVICE:
ar1Service.js esteso da 213 -> 247 LOC:
+ listDocumentCategories (GET /admin/document-categories)
+ listEmailTemplates / getEmailTemplate / updateEmailTemplate /
previewEmailTemplate (4 metodi admin email)
VALIDAZIONE:
Parse-check @babel/parser plugin JSX: 2/2 OK (service + Ar1AdminConfig).
Hot-reload CRA webpack compiled with 1 warning (solo unused-vars pre-esistenti).
COSE NON ANCORA FATTE (next):
- Endpoint BE POST /admin/ar1-templates/:id/preview per anteprima PDF
(wiring FE: rimuovere toast TODO dentro openEditLayout/tplActiveActionsTpl)
- Test manuale dal browser con hard-refresh
|
||
|
|
dbed5963b2 |
fix(ar1): Ar1Wizard crash su activeQuadro undefined (7 guard)
Bug: TypeError 'Cannot read properties of undefined (reading id)' su Ar1Wizard.js:358 al click Avanti. Causa: activeIndex poteva uscire fuori range quadri.length (es. dopo re-render con schema_snapshot diverso, o race tra saveQuadro e setForm+setActiveIndex). Gli onClick/onBlur accedevano a activeQuadro.id senza controllo null. Fix: 1. clamp safeIndex = Math.max(0, Math.min(activeIndex, quadri.length - 1)) 2. activeQuadro = quadri[safeIndex] (invece di activeIndex diretto) 3. isLastStep usa safeIndex 4. Steps.activeIndex usa safeIndex; onSelect clampa e.index 5. Bottone Indietro: guard 'if (!isReadonly && activeQuadro)' + Math.max(0,...) 6. Bottone Avanti: guard + Math.min(quadri.length-1,...) 7. Card onBlur: guard su activeQuadro 8. submitFinale: return se !activeQuadro, usa activeQuadro invece di quadri[activeIndex] 9. early return se quadri.length === 0 (template senza quadri editabili) Parse check OK. Webpack compiled 1 warning (vecchio, non nostro). |
||
|
|
7c508e743b |
feat(ar1-admin): pagina superadmin Configurazione AR1 (pattern Rendicontazione)
Seconda voce sidebar per superadmin, pattern identico a Rendicontazione:
- benef (APPLY_CALLS) -> 'Dichiarazione AR1' -> /ar1 (compilazione)
- superadmin (MANAGE_TENDERS) -> 'Configurazione AR1' -> /ar1-admin (config)
service/ar1Service.js: +11 metodi admin (adminList/Get Templates, adminUpdateLayout,
adminNewVersion, adminGet/Update Policy, CRUD PecSchedule, adminBulkRecompilation).
pages/Ar1AdminConfig.js (532 LOC): 4 tab PrimeReact TabView:
1. Template AR1: DataTable 3 varianti, badge status ACTIVE/DRAFT/ARCHIVED,
drawer detail con textarea JSON layout_config editabile + save,
bottone 'nuova versione' con modale (semver regex + activate_now)
2. Policy: form con InputNumber/InputSwitch/Checkbox per 6 campi policy
(validity_days 30-1825, popup_dismiss_hours 1-168, popup_force_on_expired,
auto_archive_on_company_document, company_document_category_id, allow_bulk)
3. Regole Reminder PEC: DataTable CRUD con dialog edit, Chips, InputSwitch
4. Invio Massivo PEC: 4 filtri (only_expired, only_missing, company_ids Chips,
expired_before Calendar) + dry-run counter + confirm dialog + submit live
Sidebar: voce id=23 'Configurazione AR1' icon 'pi pi-cog' href '/ar1-admin'
permessi MANAGE_TENDERS (accanto a 'Rendicontazione').
Routes: /ar1-admin solo ROLE_SUPER_ADMIN, altri ruoli -> PageNotFound.
Parse check @babel/parser+JSX: 4 OK / 0 FAIL. Webpack compiled 1 warning (vecchio,
unrelated).
|
||
|
|
46ee801bd0 |
feat(ar1): modulo Dichiarazione AR1 Adeguata Verifica D.Lgs.231/2007
Nuovo modulo FE speculare a rendicontazione. Integrazione con microservizio
ar1-compiler (AX41:18091, 26 endpoint live, JWT HS512 condiviso con GEPAFIN-BE).
FILE CREATI (1159 LOC):
src/modules/ar1/service/ar1Service.js (166 LOC)
Client HTTP pattern 1:1 da rendicontazioneService.js. Metodi:
- getStatusForCompany (pubblico, per compliance modal)
- createDraft / getForm / listFormsForCompany / updateQuadri
- submitForSignature / deleteForm
- generatePdf / downloadPdfUnsigned / downloadPdfSigned
- uploadSignature (multipart) / reVerifySignature
- archiveToCompanyDocument (manuale, solitamente auto)
src/modules/ar1/components/Ar1StatusTag.js (26 LOC)
Badge PrimeReact Tag per 9 stati (MISSING/DRAFT/AWAITING_SIGNATURE/SIGNED/
VERIFIED/VALID/APPROACHING/EXPIRED/SUPERSEDED) con severity+icon specifici.
src/modules/ar1/components/Ar1ComplianceModal.js (137 LOC)
Dialog al login se azienda ha AR1 MISSING/EXPIRED (bloccante, no dismiss)
o APPROACHING (dismissable 24h via sessionStorage). CTA 'Compila ora'
naviga a /ar1. Da montare nel layout principale con <Ar1ComplianceModal
companyId={userCompanyId} />.
src/modules/ar1/pages/Ar1Home.js (248 LOC)
Pagina principale beneficiario. Card status con countdown + CTA dinamici
(Compila/Riprendi/Firma/Rinnova). DataTable storico con azioni per riga
(riprendi, firma, elimina, scarica firmato). Dialog scelta variante per
nuovo form (A1/A2/A3).
src/modules/ar1/pages/Ar1Wizard.js (372 LOC)
Wizard data-driven: legge schema_snapshot del form e genera step/field
dinamicamente. Un step PrimeReact Steps per ogni quadro. Auto-save onBlur
via PUT /quadri. 7 renderer type-aware:
- text/email (uppercase CF regex)
- textarea
- date (Calendar it-IT)
- checkbox
- radio (opzioni string o {label,value})
- enum (Dropdown)
- yes_no_with_note (RadioButton SI/NO + textarea condizionale)
Handler row_type per Quadro B titolari effettivi (array fino a max_rows).
Handler upload_slots per Quadro F allegati. Nested_full per Quadro C LR
e D esecutore con sezione 'Dettaglio aggiuntivo'.
Solo DRAFT editabile, AWAITING_SIGNATURE+ in sola lettura.
Submit finale invia PUT /quadri + PUT /submit-for-signature e naviga
a /ar1/signature/:id.
src/modules/ar1/pages/Ar1Signature.js (210 LOC)
Pagina firma:
Step 1: genera PDF + download unsigned (filename AR1_A1_da-firmare.pdf)
Step 2: FileUpload PDF firmato (.pdf PAdES o .p7m CAdES, 50MB max)
→ DocVerify call (toast 'Verifica in corso, fino a 60s')
→ 4 outcome con toast specifici:
VERIFIED → success + redirect Home
SIGNED_NOT_VERIFIED → warn 'verifica manuale'
SIGNED_DOCVERIFY_UNAVAILABLE → warn 'DocVerify down'
NO_SIGNATURE_DETECTED → error 'Firmare prima il PDF'
Card 'Dettagli verifica' con firmatario/CF/metodo/scadenza se VERIFIED.
INTEGRAZIONE (pattern identico a rendicontazione):
src/layouts/DefaultLayout/components/AppSidebar/index.js
Aggiunta voce sidebar:
label: 'Dichiarazione AR1', icon: 'pi pi-id-card', href: '/ar1', id: 22,
enable: intersection(permissions, ['APPLY_CALLS', 'APPLY_CONFIDI_CALLS']).length
src/routes.js
Import Ar1Home/Ar1Wizard/Ar1Signature.
3 route con pattern ruoli:
/ar1 → BENEFICIARY/SUPER_ADMIN: Ar1Home, altri: PageNotFound
/ar1/wizard/:formId → BENEFICIARY/SUPER_ADMIN: Ar1Wizard
/ar1/signature/:formId → BENEFICIARY/SUPER_ADMIN: Ar1Signature
.env
+ REACT_APP_AR1_API_URL=http://78.46.41.91:18091
+ REACT_APP_RENDICONTAZIONE_API_URL=http://78.46.41.91:18090
VALIDAZIONE:
8 file @babel/parser parse-check con plugin JSX: 8 OK / 0 FAIL.
PROSSIMI STEP (non in questo commit):
- Rinaldo integra Ar1ComplianceModal nel layout principale post-login
- Rinaldo deploya DocVerify sul server BFLOWS/Gepafin e configura
AR1_DOCVERIFY_URL nel microservizio ar1-compiler (senza DocVerify,
degrada gracefully a SIGNED senza VERIFIED)
- BE Spring Ar1AmendmentPoller (4.5h, bundle in /tmp/rinaldo-bundle-ar1.zip)
|