[FEAT] #384 p.6 — Matrice RACI sulle policy + R/A obbligatorie in approvazione

Sezione 'Matrice RACI' nel dettaglio policy: assegnazione ruoli organigramma
(org_roles) alle responsabilita R/A/C/I via infrastruttura RACI esistente
(raci_assignments, object_type='procedure'). In bozza libera; PolicyController::approve
ora richiede almeno un ruolo R e uno A (422 RACI_REQUIRED). Nessuna migrazione.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
DevEnv nis2-agile
2026-06-18 19:37:51 +02:00
co-authored by Claude Opus 4.8
parent cb238e8380
commit 99bd293745
3 changed files with 146 additions and 1 deletions
@@ -237,6 +237,25 @@ class PolicyController extends BaseController
{
$this->requireOrgRole(['org_admin']);
// Ticket #384 punto 6 — gate RACI: in approvazione R e A sono obbligatorie
// (in bozza l'assegnazione resta libera). Usa l'infrastruttura RACI esistente
// (raci_assignments, object_type='procedure' -> policy_id). Decisione di design
// del richiedente super_admin: NON e' un vincolo normativo, e' una regola di prodotto.
$assignedRaci = Database::fetchAll(
"SELECT DISTINCT raci FROM raci_assignments
WHERE organization_id = ? AND object_type = 'procedure' AND object_id = ?",
[$this->getCurrentOrgId(), $id]
);
$present = array_column($assignedRaci, 'raci');
$missing = array_values(array_diff(['R', 'A'], $present));
if (!empty($missing)) {
$this->jsonError(
'Per approvare la policy assegna nella Matrice RACI almeno un ruolo ' . implode(' e uno ', $missing) . '.',
422,
'RACI_REQUIRED'
);
}
Database::update('policies', [
'status' => 'approved',
'approved_by' => $this->getCurrentUserId(),