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:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user