feat(rendicontazione): lato istruttore - queue + review + soccorso istruttorio
Backend (rendicontazione-api):
- 4 nuove colonne su remission_practice: assigned_instructor_id, reviewed_at,
reviewed_by, rejection_reason, approved_remission
- Nuova tabella remission_amendment_request (id, practice_id, request_text,
scope jsonb, deadline, status AWAITING/RESPONSE_RECEIVED/CLOSED/EXPIRED,
response_text, audit cols)
- Router instructor.py con 8 endpoint:
GET /instructor/queue (SUBMITTED pool + UNDER_REVIEW/AWAITING_AMENDMENT assigned,
o tutto se manager/superadmin)
GET /instructor/{id} (practice + gate_check + amendments)
POST /instructor/{id}/claim (SUBMITTED -> UNDER_REVIEW)
POST /instructor/{id}/approve (approved_remission opz, default = remission_due calcolato)
POST /instructor/{id}/reject (rejection_reason min 10 char)
POST /instructor/{id}/amendment (crea soccorso: request_text + deadline)
POST /instructor/{id}/amendment/{aid}/close (chiude soccorso, pratica torna UNDER_REVIEW)
POST /instructor/{id}/amendment/{aid}/respond-beneficiary (benef risponde)
- GET /{id} ora ritorna anche amendments (per beneficiario)
Frontend:
- Pagina IstruttoriaQueue (125 righe): coda pratiche con stato, istruttore
assegnato, erogato, remission_due calcolata, azioni contestuali
- Pagina IstruttoriaPratica (483 righe): dettaglio pratica readonly per istruttore,
riepilogo esteso, amendments panel con chiudi, gate check, fatture/ULA/docs,
3 Dialog per approva/respingi/soccorso
- PraticaRendicontazioneEdit esteso con sezione 'Richieste di soccorso istruttorio'
visibile al beneficiario + Dialog rispondi con request_text dell'istruttore
- Sidebar: voce 'Istruttoria rendicontazioni' per EVALUATE_APPLICATIONS
(pre_instructor + instructor_manager)
- Routes /istruttoria e /istruttoria/:id con gate sui tre ruoli
Test end-to-end OK: benef crea+submit, istruttore claim+amendment, benef risponde,
istruttore chiude+approva -> APPROVED remission 8500 EUR su NAPOLI SAS (erogato 17000).
Utenti sandbox creati:
- istruttore@sandbox.local / istruttore123 (ROLE_PRE_INSTRUCTOR)
- manager@sandbox.local / manager123 (ROLE_INSTRUCTOR_MANAGER)
This commit is contained in:
@@ -19,6 +19,8 @@ import RendicontazioneHome from './modules/rendicontazione/pages/Rendicontazione
|
||||
import RendicontazioniMie from './modules/rendicontazione/pages/RendicontazioniMie';
|
||||
import PraticaRendicontazioneEdit from './modules/rendicontazione/pages/PraticaRendicontazioneEdit';
|
||||
import DevSwitchUser from './modules/rendicontazione/pages/DevSwitchUser';
|
||||
import IstruttoriaQueue from './modules/rendicontazione/pages/IstruttoriaQueue';
|
||||
import IstruttoriaPratica from './modules/rendicontazione/pages/IstruttoriaPratica';
|
||||
import BandoFlowEdit from './pages/BandoFlowEdit';
|
||||
import Imieibandi from './pages/Imieibandi';
|
||||
import BandoApplication from './pages/BandoApplication';
|
||||
@@ -171,6 +173,20 @@ const routes = ({ role, chosenCompanyId }) => {
|
||||
<Route path="/dev-switch-user" element={<DefaultLayout>
|
||||
{'ROLE_SUPER_ADMIN' === role ? <DevSwitchUser/> : <PageNotFound/>}
|
||||
</DefaultLayout>}/>
|
||||
<Route path="/istruttoria" element={<DefaultLayout>
|
||||
{'ROLE_PRE_INSTRUCTOR' === role ? <IstruttoriaQueue/> : null}
|
||||
{'ROLE_INSTRUCTOR_MANAGER' === role ? <IstruttoriaQueue/> : null}
|
||||
{'ROLE_SUPER_ADMIN' === role ? <IstruttoriaQueue/> : null}
|
||||
{'ROLE_BENEFICIARY' === role ? <PageNotFound/> : null}
|
||||
{'ROLE_CONFIDI' === role ? <PageNotFound/> : null}
|
||||
</DefaultLayout>}/>
|
||||
<Route path="/istruttoria/:id" element={<DefaultLayout>
|
||||
{'ROLE_PRE_INSTRUCTOR' === role ? <IstruttoriaPratica/> : null}
|
||||
{'ROLE_INSTRUCTOR_MANAGER' === role ? <IstruttoriaPratica/> : null}
|
||||
{'ROLE_SUPER_ADMIN' === role ? <IstruttoriaPratica/> : null}
|
||||
{'ROLE_BENEFICIARY' === role ? <PageNotFound/> : null}
|
||||
{'ROLE_CONFIDI' === role ? <PageNotFound/> : null}
|
||||
</DefaultLayout>}/>
|
||||
<Route path="/bandi-osservati" element={<DefaultLayout>
|
||||
{'ROLE_SUPER_ADMIN' === role ? <PageNotFound/> : null}
|
||||
{'ROLE_BENEFICIARY' === role ? <BandiPreferredBeneficiario/> : null}
|
||||
|
||||
Reference in New Issue
Block a user