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)
- Nuova pagina RendicontazioniMie: dashboard beneficiario con pratiche esistenti
+ applications CONTRACT_SIGNED ready_to_start in tabella unificata
- Nuova pagina PraticaRendicontazioneEdit: form compilazione completo
+ riepilogo finanziario live (erogato, totale, cap, remissione spettante)
+ requisiti per invio con semafori live (gate check refresh on mount)
+ sezione regime IVA con update inline
+ fatture per categoria con dialog add + tabella + delete (per B1/B2/B3)
+ dipendenti ULA con dialog add (CF, contratto, FTE, periodo, allegato)
+ documenti richiesti con upload simulato (prompt nome file)
+ submit con confermazione, disabilitato finche' gate non passa
- Nuova pagina DevSwitchUser: impersonate sandbox-only per superadmin
- Voce sidebar "Le mie rendicontazioni" per ROLE_BENEFICIARY
- Voce sidebar "Dev: cambia utente" per ROLE_SUPER_ADMIN
- Service esteso con 12 metodi pratiche + impersonate
- Aggiunta voce 'Rendicontazione' in AppSidebar (id 21, icon pi-receipt)
- Nuova pagina RendicontazioneHome: dashboard con tabella bandi + stato schema
(Non creato / Bozza / Pubblicato) + azioni Crea/Modifica per ciascuno
- Nuova pagina BandoRendicontazioneSchemaEdit: form strutturato 6 sezioni
(importi/periodo, IVA, categorie, ULA, documenti, regole gate) con
salva bozza + pubblica, read-only dopo pubblicazione
- Nuovo service modules/rendicontazione/service/rendicontazioneService.js
(client fetch verso rendicontazione-api, JWT dallo store Zustand)
- 2 nuove route /rendicontazione e /bandi/:id/rendicontazione-schema
(gate su ROLE_SUPER_ADMIN)
- Bottone 'Schema rendicontazione' aggiunto in BandoEdit come shortcut
- Patch NotificationsSidebar per disabilitare WSS se REACT_APP_ENABLE_WEBSOCKET=0
(evita errori CORS in sandbox senza RabbitMQ)
UI coerente col codebase: appPage/appPageSection/appForm/appForm__cols/
fieldsRepeater, p-fluid per width input, h1+p in header con border-left