 DevEnv nis2-agileandClaude Opus 4.8
|
5368b0a61c
|
[FEAT] A4 Fase 4.2 — Competenze (skill/requisiti ruolo/gap) + alert→azione NCR+CAPA
Secondo modulo del modello relazionale A4 (docs/DESIGN_A4_RELATIONAL.md).
Backend:
- Migration 042 (docs/sql/042_competences.sql) + runner aggiornato (scripts/migrate-a4.php).
4 tabelle additive/idempotenti: skills (org-owned o globali), role_skills
(competenze richieste dal ruolo, UNIQUE role+skill), user_skills (possedute,
UNIQUE org+user+skill), skill_course_map. APPLICATA su prod (nis2-db v8.0.45,
TLSv1.3).
- CompetenceController (route 'competences'): catalog, skills CRUD, roleSkills,
userSkills, skillCourses (map/unmap), gapGrid (richiesto−posseduto per ruolo
con titolare), openAction. Multi-tenancy + anti-IDOR + livelli 1-5; competenze
globali in sola lettura per gli utenti org.
- alert→azione: openAction RIUSA il workflow NCR/CAPA reale (la tabella azioni è
capa_actions figlia di non_conformities, NON 'corrective_actions' che non
esiste): crea NCR (source='management_review', source_entity_type='competence_gap',
source_entity_id=role_skills.id) + capa_actions figlia. Anti-duplicato sul gap.
Zero ALTER alle tabelle esistenti. Ancoraggio PR.AT-01/02, GV.RR-04, art.24 D.Lgs.
Frontend:
- competenze.html (4 schede: Catalogo, Requisiti per ruolo, Competenze persone,
Gap & azioni) + js/competenze.js. Bootstrap Italia V2. CTA "Assegna corso"
(riuso /training/assign) e "Apri non conformità".
- Voce sidebar "Competenze" (common.js + common-bi.js + BI_PAGES) + nav.competences
i18n IT/EN. api.js: metodi comp* + assignTraining.
Help/KB/PWA:
- help.js: guida contestuale 'competences' (schede, calcolo gap, PR.AT-01/02,
GV.RR-04, art.24 D.Lgs., disclaimer no-parere-legale) + mappa pagina.
- sw.js: nome cache nis2-shell-v1.17.0 (allineamento PWA).
- Design doc corretto (rettifica capa_actions vs corrective_actions) + avanzamento 4.1/4.2.
Cache-buster: ?v=20260618 dei 5 JS condivisi su 32 HTML. version.json 1.16.0 -> 1.17.0.
Smoke E2E su prod (fpm reale): catalogo, requisito, competenza, gap=2, openAction
(NCR+CAPA), anti-dup 409, mappatura corso — tutti verdi; dati di test ripuliti.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-15 19:01:32 +02:00 |
|
 DevEnv nis2-agileandClaude Opus 4.8
|
8540b53cb2
|
[FEAT] A4 Fase 4.1 — Organigramma (org_roles): ruoli/gerarchia + nodo governance Art.23
Primo modulo del modello relazionale A4 (docs/DESIGN_A4_RELATIONAL.md).
Backend:
- Migration 041 (docs/sql/041_org_roles.sql) + runner scripts/migrate-a4.php.
Tabella org_roles additiva/idempotente: gerarchia self-FK (parent_role_id),
titolare (holder_user_id), is_governance_body (organi amministrazione/direttivi
Art.23 D.Lgs.138/2024), description (GV.RR-02). APPLICATA su prod (container
nis2-db v8.0.45, TLSv1.3, 11 col, 4 FK).
- OrgRoleController: list (flat+tree arricchiti), get, create, update, delete,
assignableUsers. Multi-tenancy ancorata a getCurrentOrgId(), anti-IDOR
(id+organization_id), prevenzione cicli nella gerarchia, holder = membro org,
delete bloccato se ha figli (409). Route registrate in public/index.php.
Frontend:
- public/organigramma.html + js/organigramma.js: vista ad albero (badge governance,
titolare/vacante), editor crea/modifica/elimina con select padre anti-ciclo,
"crea struttura di base". Bootstrap Italia V2.
- Voce sidebar "Organigramma" (common.js + common-bi.js) + nav.org_chart i18n IT/EN.
- api.js: metodi orgRole* (wrapper _acn).
Help/KB:
- help.js: guida contestuale 'org' (cosa rappresenta, nodo Art.23, come si usa,
fonti certe D.Lgs.138/2024 art.23 + GV.RR-02 best practice, disclaimer no-parere-legale).
Cache-buster: bump ?v=20260617 dei 5 JS condivisi su tutte le 32 HTML referenti.
version.json 1.15.2 -> 1.16.0. Smoke E2E su prod (fpm reale): login, CRUD, tree,
anti-ciclo (422), delete-con-figli (409), cleanup tutti verdi.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-15 18:05:56 +02:00 |
|