'DataCore Demo S.r.l.', 996002=>'NIS2 Sandbox Formazione S.r.l.']; $TARGETS = isset($opts['only']) ? array_intersect_key($ALL,[(int)$opts['only']=>1]) : $ALL; $USERCOLS=['owner_user_id','responsible_user_id','assigned_to','reported_by','created_by','uploaded_by','relevance_assessed_by','assessed_by','approved_by','reviewed_by','closed_by','user_id']; function cols($pdo,$t){ return $pdo->query("SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='$t' ORDER BY ORDINAL_POSITION")->fetchAll(PDO::FETCH_COLUMN); } function tableExists($pdo,$t){ return (int)$pdo->query("SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='$t'")->fetchColumn()>0; } function copyRow($pdo,$table,$row,$overrides,$uid,$USERCOLS){ static $cc=[]; if(!isset($cc[$table])) $cc[$table]=cols($pdo,$table); $data=[]; foreach($cc[$table] as $c){ if($c==='id'){ if(array_key_exists('id',$overrides)) $data['id']=$overrides['id']; continue; } if(array_key_exists($c,$overrides)){ $data[$c]=$overrides[$c]; continue; } $v=$row[$c]??null; if(in_array($c,$USERCOLS,true)&&$v!==null) $v=$uid; $data[$c]=$v; } $cl=implode(',',array_map(fn($x)=>"`$x`",array_keys($data))); $ph=implode(',',array_fill(0,count($data),'?')); $pdo->prepare("INSERT INTO `$table` ($cl) VALUES ($ph)")->execute(array_values($data)); return (int)$pdo->lastInsertId(); } $PC=[['assessments','assessment_responses','assessment_id'],['risks','risk_treatments','risk_id'],['incidents','incident_timeline','incident_id'],['training_courses','training_assignments','course_id'],['policies','policy_versions','policy_id']]; $SIMPLE=['compliance_controls','suppliers','assets']; $pdo->exec("SET FOREIGN_KEY_CHECKS=0"); foreach($TARGETS as $T=>$NAME){ $pdo->beginTransaction(); try { foreach($PC as [$par,$chi,$fk]){ if(tableExists($pdo,$chi)) $pdo->exec("DELETE FROM `$chi` WHERE `$fk` IN (SELECT id FROM `$par` WHERE organization_id=$T)"); } foreach(array_merge(array_column($PC,0),$SIMPLE) as $t){ if(tableExists($pdo,$t)) $pdo->exec("DELETE FROM `$t` WHERE organization_id=$T"); } $pdo->exec("DELETE FROM user_organizations WHERE organization_id=$T"); $pdo->exec("DELETE FROM users WHERE email='demo-$T@nis2-demo.local'"); $pdo->exec("DELETE FROM organizations WHERE id=$T"); $org=Database::fetchOne("SELECT * FROM organizations WHERE id=?",[$SRC]); copyRow($pdo,'organizations',$org,['id'=>$T,'name'=>$NAME],0,$USERCOLS); $uid=(int)copyRow($pdo,'users',['email'=>"demo-$T@nis2-demo.local",'full_name'=>"Demo NIS2 $T",'role'=>'org_admin','password_hash'=>password_hash(bin2hex(random_bytes(12)),PASSWORD_DEFAULT),'is_active'=>1],['email'=>"demo-$T@nis2-demo.local"],0,$USERCOLS); $pdo->prepare("INSERT INTO user_organizations (user_id,organization_id,role) VALUES (?,?,'org_admin')")->execute([$uid,$T]); foreach($PC as [$par,$chi,$fk]){ if(!tableExists($pdo,$par)) continue; foreach(Database::fetchAll("SELECT * FROM `$par` WHERE organization_id=? ORDER BY id",[$SRC]) as $r){ $newPar=copyRow($pdo,$par,$r,['organization_id'=>$T],$uid,$USERCOLS); if(tableExists($pdo,$chi)) foreach(Database::fetchAll("SELECT * FROM `$chi` WHERE `$fk`=? ORDER BY id",[$r['id']]) as $cr){ $ov=[$fk=>$newPar]; if(in_array('organization_id',cols($pdo,$chi),true)) $ov['organization_id']=$T; copyRow($pdo,$chi,$cr,$ov,$uid,$USERCOLS); } } } foreach($SIMPLE as $t){ if(!tableExists($pdo,$t)) continue; foreach(Database::fetchAll("SELECT * FROM `$t` WHERE organization_id=? ORDER BY id",[$SRC]) as $r) copyRow($pdo,$t,$r,['organization_id'=>$T],$uid,$USERCOLS); } $pdo->commit(); echo "ORG $T ($NAME): seed OK (uid demo=$uid)\n"; } catch(Throwable $ex){ $pdo->rollBack(); echo "ORG $T ERRORE ROLLBACK: ".$ex->getMessage()."\n"; } } $pdo->exec("SET FOREIGN_KEY_CHECKS=1"); echo "Seed dataset demo completato (".implode(',',array_keys($TARGETS)).").\n";