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:
@@ -238,3 +238,38 @@ const extendInstructor = {
|
||||
};
|
||||
|
||||
Object.assign(RendicontazioneService, extendInstructor);
|
||||
|
||||
|
||||
// ====================== VERIFICA SINGOLA RIGA ISTRUTTORE ======================
|
||||
|
||||
const extendVerify = {
|
||||
verifyInvoice(practiceId, invoiceId, body, onSuccess, onError) {
|
||||
fetch(`${BASE_URL}/api/remission-practices/instructor/${practiceId}/invoices/${invoiceId}/verify`, {
|
||||
method: 'PUT', mode: 'cors', headers: buildHeaders(),
|
||||
body: JSON.stringify(body)
|
||||
}).then(r => handleResponse(r, onSuccess, onError)).catch(e => handleError(e, onError));
|
||||
},
|
||||
|
||||
verifyUlaEmployee(practiceId, empId, body, onSuccess, onError) {
|
||||
fetch(`${BASE_URL}/api/remission-practices/instructor/${practiceId}/ula-employees/${empId}/verify`, {
|
||||
method: 'PUT', mode: 'cors', headers: buildHeaders(),
|
||||
body: JSON.stringify(body)
|
||||
}).then(r => handleResponse(r, onSuccess, onError)).catch(e => handleError(e, onError));
|
||||
},
|
||||
|
||||
verifyDocument(practiceId, docCode, body, onSuccess, onError) {
|
||||
fetch(`${BASE_URL}/api/remission-practices/instructor/${practiceId}/documents/${docCode}/verify`, {
|
||||
method: 'PUT', mode: 'cors', headers: buildHeaders(),
|
||||
body: JSON.stringify(body)
|
||||
}).then(r => handleResponse(r, onSuccess, onError)).catch(e => handleError(e, onError));
|
||||
},
|
||||
|
||||
setInstructorFinalNotes(practiceId, body, onSuccess, onError) {
|
||||
fetch(`${BASE_URL}/api/remission-practices/instructor/${practiceId}/final-notes`, {
|
||||
method: 'PUT', mode: 'cors', headers: buildHeaders(),
|
||||
body: JSON.stringify(body)
|
||||
}).then(r => handleResponse(r, onSuccess, onError)).catch(e => handleError(e, onError));
|
||||
}
|
||||
};
|
||||
|
||||
Object.assign(RendicontazioneService, extendVerify);
|
||||
|
||||
Reference in New Issue
Block a user