feat(istruttoria UI): verifica riga-per-riga con thumbs up/down/occhio/download/rettifica

Replica il workflow del foglio Excel originale dell'istruttoria Gepafin.
Pattern preso da DomandaEditPreInstructor/components/ListOfFiles.

Pagina IstruttoriaPratica riscritta (858 righe):

RIEPILOGO FINANZIARIO esteso:
- Totale dichiarato (dal beneficiario)
- Totale verificato (somma AMMESSA + PARZIALE istruttore)
- Cap remissione (min(50% erogato, 12500))
- Remissione da riconoscere (da verificato)
- Residuo da restituire (erogato - remissione)

VERIFICA FATTURE per categoria con appPageSection__list:
- Ogni fattura come row con numero, fornitore, date, descrizione, Tag stato
- Tag rosso 'Date fuori periodo' se invoice_in_period=false O payment_in_period=false
- Riga dichiarato + riga verificato (se presente)
- Note rettifica evidenziate con barra arancione
- 5 pulsanti icona: eye (anteprima PDF) + download + pencil (rettifica con dialog)
  + thumbs-up AMMESSA + thumbs-down RESPINTA
- Thumbs up/down = ammissione/rifiuto rapido senza rettifica
- Pencil = dialog con dichiarato readonly + verificato editabile + note obbligatorie -> PARZIALE

VERIFICA ULA:
- Stesso pattern: eye/download/pencil/up/down
- Rettifica FTE (0-1) con note

VERIFICA DOCUMENTI:
- eye/download/thumbs-up VALIDO
- clock SCADUTO (apre dialog con motivazione)
- thumbs-down NON_VALIDO (apre dialog con motivazione)

VERBALE ISTRUTTORIA finale (visibile in UNDER_REVIEW/AWAITING_AMENDMENT):
- 3 checkbox: documentazione completa, ULA>1, erogato in range
- Textarea note sintetiche con save onBlur

Approva disabilitato finché tutte le righe hanno status != PENDING.
Anteprima PDF: dialog con placeholder sandbox (file reale sarà in prod).
Download: toast stub (in prod scarica dal storage).
This commit is contained in:
BFLOWS Sandbox
2026-04-18 11:03:15 +02:00
parent 115f31bdef
commit 61cdfbd06b
3 changed files with 569 additions and 151 deletions

View File

@@ -61,6 +61,7 @@ const schemaJsonToForm = (j) => {
return {
amount_min: gate.amount_range?.min ?? 5000,
amount_max: gate.amount_range?.max ?? 25000,
period_start: gate.period_start ? new Date(gate.period_start) : null,
period_end: gate.period_end ? new Date(gate.period_end) : null,
period_start_rule: gate.period_start_rule ?? 'erogato_date',
iva_regimes_allowed: ivaAllowed,
@@ -125,6 +126,7 @@ const formToSchemaJson = (f, base = null) => {
cap_absolute: f.cap_absolute,
iva_ordinario_imponibile_only: f.iva_ordinario_imponibile_only,
period_start_rule: f.period_start_rule,
period_start: fmtDate(f.period_start),
period_end: fmtDate(f.period_end),
require_at_least_one_invoice_per_nonzero_category: f.require_invoice_per_category,
require_ula_above_threshold: f.require_ula_above_threshold,
@@ -333,13 +335,19 @@ const BandoRendicontazioneSchemaEdit = () => {
</div>
<div className="appForm__cols">
<div className="appForm__field">
<label>{__('Periodo di ammissibilità — inizio','gepafin')}</label>
<label>{__('Inizio periodo — regola','gepafin')}</label>
<Dropdown value={form.period_start_rule}
onChange={(e) => update({period_start_rule: e.value})}
options={PERIOD_START_RULES} disabled={readOnly} />
</div>
<div className="appForm__field">
<label>{__('Periodo di ammissibilità — fine','gepafin')}</label>
<label>{__('Inizio periodo — data (se fissa)','gepafin')}</label>
<Calendar value={form.period_start} onChange={(e) => update({period_start: e.value})}
dateFormat="dd/mm/yy" showIcon disabled={readOnly} />
<small className="text-color-secondary">{__("Usata dalla verifica date fatture. Compila se la regola non è 'data erogazione'.",'gepafin')}</small>
</div>
<div className="appForm__field">
<label>{__('Fine periodo','gepafin')}</label>
<Calendar value={form.period_end} onChange={(e) => update({period_end: e.value})}
dateFormat="dd/mm/yy" showIcon disabled={readOnly} />
</div>