Files
innovatieplatform/database/seeders/DatabaseSeeder.php
znetsixe 9f033835cd Restructure student tracks by cross-reference chains, add project rules
Student tracks restructured based on document cross-reference analysis:
- Track 1 "Gemalen & CRC Keten": Grace→Kevin→Robin→Adriaan (chain)
- Track 2 "Condition Monitoring": Kevin→Yamai (fork from Track 1)
- Track 3 "Zuivering & Beluchting": Noa‖Elise (parallel, same problem)
- Track 4 "EVOLV Reactor Model": Pieter (standalone, no student cross-refs)
- Track 5 "IoT & ICT Infra": Bart→Fontys ICT→Fontys TOGAF (chain)

Inter-student dependencies added (7 new):
- Grace→Kevin, Kevin→Robin, Robin→Adriaan (Track 1 chain)
- Kevin→Yamai (Track 2 fork)
- Bart→Fontys ICT→Fontys TOGAF (Track 5 chain)

CLAUDE.md: Added "Metro Map Data Rules" section documenting:
- Thema=line, Project=station, speerpunt=track grouping
- Student work rules: cross-references determine track sharing
- Identified chains with evidence (reference counts from source docs)
- Grid alignment requirements

MetroCanvas: Truncate long station labels to prevent overlap (max ~20 chars
based on grid spacing, with ellipsis)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 14:19:16 +02:00

1125 lines
58 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace Database\Seeders;
use App\Enums\CommitmentStatus;
use App\Enums\FaseStatus;
use App\Enums\FaseType;
use App\Enums\Prioriteit;
use App\Enums\ProjectRol;
use App\Enums\ProjectStatus;
use App\Enums\SpeerpuntStatus;
use App\Models\Afhankelijkheid;
use App\Models\Commitment;
use App\Models\Document;
use App\Models\Fase;
use App\Models\Project;
use App\Models\Role;
use App\Models\Speerpunt;
use App\Models\Thema;
use App\Models\User;
use App\Models\KennisArtikel;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* Planning 2026 R&D Lab Waterschap Brabantse Delta
* Source: Planning 2026.pptx
*/
public function run(): void
{
// ──────────────────────────────────────────────────────────────
// 1. System roles
// ──────────────────────────────────────────────────────────────
$roleAdmin = Role::create([
'naam' => 'admin',
'beschrijving' => 'Volledige toegang tot het platform',
'permissies' => ['*'],
]);
$roleProjectOwner = Role::create([
'naam' => 'project_owner',
'beschrijving' => 'Kan projecten beheren en bewerken',
'permissies' => ['projects.manage', 'commitments.manage', 'documents.manage'],
]);
$roleTeamMember = Role::create([
'naam' => 'team_member',
'beschrijving' => 'Kan bijdragen aan toegewezen projecten',
'permissies' => ['projects.view', 'commitments.edit', 'documents.upload'],
]);
Role::create([
'naam' => 'viewer',
'beschrijving' => 'Alleen-lezen toegang',
'permissies' => ['projects.view', 'documents.view'],
]);
// ──────────────────────────────────────────────────────────────
// 2. Users (R&D team)
// ──────────────────────────────────────────────────────────────
$admin = User::create([
'name' => 'Admin',
'email' => 'admin@innovatieplatform.nl',
'password' => Hash::make('password'),
'functie' => 'Platform Beheerder',
'afdeling' => 'R&D Lab',
'email_verified_at' => now(),
]);
$admin->roles()->attach($roleAdmin);
$rene = User::create([
'name' => 'Rene de Ren',
'email' => 'rene@wbd-rd.nl',
'password' => Hash::make('password'),
'functie' => 'R&D Engineer / Teamlead',
'afdeling' => 'R&D Lab',
'email_verified_at' => now(),
]);
$rene->roles()->attach($roleProjectOwner);
$pim = User::create([
'name' => 'Pim Moerman',
'email' => 'p.moerman@wbd-rd.nl',
'password' => Hash::make('password'),
'functie' => 'Technisch Adviseur OT/IT',
'afdeling' => 'R&D Lab',
'email_verified_at' => now(),
]);
$pim->roles()->attach($roleTeamMember);
$sjoerd = User::create([
'name' => 'Sjoerd Fijnje',
'email' => 's.fijnje@wbd-rd.nl',
'password' => Hash::make('password'),
'functie' => 'Werktuigbouwkundige / Elektro',
'afdeling' => 'R&D Lab',
'email_verified_at' => now(),
]);
$sjoerd->roles()->attach($roleTeamMember);
// ──────────────────────────────────────────────────────────────
// 3. Themas 2026 strategic themes
//
// Kaders: geen nieuwe ML-modellen, geen nieuwe digital twins,
// focus op werkend krijgen, architectuur aantonen, overdragen.
// ──────────────────────────────────────────────────────────────
$themaArchitectuur = Thema::create([
'naam' => 'Architectuur & Veiligheid',
'beschrijving' => 'Aantonen dat de EDGE-laag architectuur veilig, betrouwbaar en schaalbaar is. OT/IT-scheiding, Siemens-koppeling, CI/CD implementatie.',
'prioriteit' => Prioriteit::Hoog,
'periode_start' => '2026-01-01',
'periode_eind' => '2026-12-31',
]);
$themaProductie = Thema::create([
'naam' => 'Productiewaardig Maken',
'beschrijving' => 'Bestaande innovaties werkend, overdraagbaar en schaalbaar maken. Begeleiding van aanbestedingen en overdracht naar Bouwen/Beheer.',
'prioriteit' => Prioriteit::Hoog,
'periode_start' => '2026-01-01',
'periode_eind' => '2026-12-31',
]);
$themaLab = Thema::create([
'naam' => 'Lab & Prototyping',
'beschrijving' => 'Fysieke opstellingen valideren, uitbreiden en koppelen tot een realistische testomgeving voor afvlakkingsregelingen.',
'prioriteit' => Prioriteit::Midden,
'periode_start' => '2026-01-01',
'periode_eind' => '2026-12-31',
]);
$themaGovernance = Thema::create([
'naam' => 'Governance & Teamborging',
'beschrijving' => 'R&D minder persoonsafhankelijk maken. Projectstructuur, documentatie, besluitvorming en rolafbakening vastleggen.',
'prioriteit' => Prioriteit::Midden,
'periode_start' => '2026-01-01',
'periode_eind' => '2026-12-31',
]);
// ──────────────────────────────────────────────────────────────
// 4. Speerpunten (2 per thema)
// ──────────────────────────────────────────────────────────────
// Architectuur & Veiligheid
$spEdge = Speerpunt::create([
'thema_id' => $themaArchitectuur->id,
'naam' => 'EDGE-laag & OT/IT-scheiding',
'beschrijving' => 'Implementatie en validatie van de EDGE-architectuur met beveiligde OT/IT-scheiding op pilotlocatie.',
'eigenaar_id' => $rene->id,
'status' => SpeerpuntStatus::Actief,
]);
$spCicd = Speerpunt::create([
'thema_id' => $themaArchitectuur->id,
'naam' => 'CI/CD & DevOps R&D-stack',
'beschrijving' => 'Continuous Integration en Deployment implementeren in de R&D-stack voor maximale efficiëntie en herhaalbaarheid.',
'eigenaar_id' => $rene->id,
'status' => SpeerpuntStatus::Concept,
]);
// Productiewaardig Maken
$spOverdracht = Speerpunt::create([
'thema_id' => $themaProductie->id,
'naam' => 'Overdracht naar Bouwen/Beheer',
'beschrijving' => 'Innovaties begeleiden van R&D naar productie: documentatie, oplevering, kennisoverdracht.',
'eigenaar_id' => $rene->id,
'status' => SpeerpuntStatus::Actief,
]);
$spAanbesteding = Speerpunt::create([
'thema_id' => $themaProductie->id,
'naam' => 'Aanbesteding & TCO-toetsing',
'beschrijving' => 'Technische toetsing van aanbestedingen op prestatie-eisen, energie-efficiëntie en inpasbaarheid.',
'eigenaar_id' => $pim->id,
'status' => SpeerpuntStatus::Actief,
]);
// Lab & Prototyping
$spDtValidatie = Speerpunt::create([
'thema_id' => $themaLab->id,
'naam' => 'Digital Twin Validatie',
'beschrijving' => 'Valideren van 2025-ontwikkelingen (Measurement, Rotating Machine, Aeration Tank, MGC, Diffuser) op het fysieke prototype.',
'eigenaar_id' => $rene->id,
'status' => SpeerpuntStatus::Actief,
]);
$spGemalenketen = Speerpunt::create([
'thema_id' => $themaLab->id,
'naam' => 'Gemalenketen Testomgeving',
'beschrijving' => 'Realiseren van een volledige gemalenketen in het lab voor experimentele afvlakkingsregelingen.',
'eigenaar_id' => $sjoerd->id,
'status' => SpeerpuntStatus::Concept,
]);
// Governance & Teamborging
$spProjectstructuur = Speerpunt::create([
'thema_id' => $themaGovernance->id,
'naam' => 'Projectstructuur & Documentatie',
'beschrijving' => 'Afspraken vastleggen over projectstructuur, documentatie, besluitvorming en beleid.',
'eigenaar_id' => $rene->id,
'status' => SpeerpuntStatus::Actief,
]);
$spRolafbakening = Speerpunt::create([
'thema_id' => $themaGovernance->id,
'naam' => 'Rolafbakening R&D ↔ Organisatie',
'beschrijving' => 'Verduidelijken wat R&D wel en niet doet. Afbakening richting Beheer, Bouwen, ICT en Datalab.',
'eigenaar_id' => $rene->id,
'status' => SpeerpuntStatus::Concept,
]);
// ──────────────────────────────────────────────────────────────
// 5. Projects 2026 planning (6 projects from the presentation)
// ──────────────────────────────────────────────────────────────
// --- B.R.I.D.G.E (Bidirectional Real-time Interface for Data & Grid Exchange) ---
$bridge = $this->createProject([
'speerpunt_id' => $spEdge->id,
'naam' => 'B.R.I.D.G.E Pilot Klundert',
'beschrijving' => 'Aantonen dat de nieuwe EDGE-laag veilig en betrouwbaar assets kan uitlezen en aansturen, en correct kan koppelen met Siemens-omgevingen. Implementatie Ubuntu LTS, Node-RED orkestratie, OPC UA communicatie met Siemens PLC (T-serie).',
'eigenaar_id' => $rene->id,
'status' => ProjectStatus::Pilot,
'prioriteit' => Prioriteit::Hoog,
'startdatum' => '2026-01-15',
'streef_einddatum' => '2026-09-30',
], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept, FaseType::Experiment, FaseType::Pilot]);
// --- C.R.I.S.P (Compressor Replacement for Immediate System Performance) ---
$crisp = $this->createProject([
'speerpunt_id' => $spAanbesteding->id,
'naam' => 'C.R.I.S.P Compressor Aanbesteding',
'beschrijving' => 'Technische toetsing van aanbestedingsmethodiek voor compressorvervanging Nieuwveer. Prestatie-eisen, energie-efficiëntie, inpasbaarheid in procesautomatisering. R&D als inhoudelijke sparringpartner voor Bouwen.',
'eigenaar_id' => $pim->id,
'status' => ProjectStatus::Verkenning,
'prioriteit' => Prioriteit::Hoog,
'startdatum' => '2026-02-01',
'streef_einddatum' => '2026-08-31',
], [FaseType::Signaal, FaseType::Verkenning]);
// --- W.I.S.E (Weather and Influent Sampling Engine) ---
$wise = $this->createProject([
'speerpunt_id' => $spOverdracht->id,
'naam' => 'W.I.S.E Monsternamekast Overdracht',
'beschrijving' => 'Overdracht monsternamekast naar Bouwen. Opleveren Node-RED flows, documentatie, afbakening R&D vs beheer. Samenwerking met Datalab (data & integratie voorspellend model) en Beheer/Operatie.',
'eigenaar_id' => $rene->id,
'status' => ProjectStatus::OverdrachtBouwen,
'prioriteit' => Prioriteit::Hoog,
'startdatum' => '2025-06-01',
'streef_einddatum' => '2026-06-30',
], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept, FaseType::Experiment, FaseType::Pilot, FaseType::Besluitvorming, FaseType::OverdrachtBouwen]);
// --- Gemaal 3.0 Prototype Validatie ---
$gemaal = $this->createProject([
'speerpunt_id' => $spDtValidatie->id,
'naam' => 'Gemaal 3.0 Prototype Validatie',
'beschrijving' => 'Valideren dat het recent gebouwde prototype functioneel correct is. Testen van alle elektrische aansluitingen, I/O-functionaliteit en randapparatuur. Go/no-go voor verdere uitrol naar 2 kopieën.',
'eigenaar_id' => $sjoerd->id,
'status' => ProjectStatus::Experiment,
'prioriteit' => Prioriteit::Midden,
'startdatum' => '2026-03-01',
'streef_einddatum' => '2026-07-31',
], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept, FaseType::Experiment]);
// --- Afvlakkingsregeling Lab Gemalenketen ---
$afvlak = $this->createProject([
'speerpunt_id' => $spGemalenketen->id,
'naam' => 'Afvlakkingsregeling Lab Keten',
'beschrijving' => 'Nabootsen van een volledige gemalenketen in het lab, klaarstomen voor afvlakkingsregeling. Realiseren 2 extra opstellingen, koppelen tot keten, basissoftware testen op ketengedrag.',
'eigenaar_id' => $sjoerd->id,
'status' => ProjectStatus::Concept,
'prioriteit' => Prioriteit::Midden,
'startdatum' => '2026-06-01',
'streef_einddatum' => '2026-12-31',
], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept]);
// --- Structuur & Borging R&D-team ---
$governance = $this->createProject([
'speerpunt_id' => $spProjectstructuur->id,
'naam' => 'Structuur & Borging R&D',
'beschrijving' => 'R&D minder persoonsafhankelijk en beter voorspelbaar maken. Afspraken over projectstructuur, documentatie, besluitvorming, beleid. Inrichten ICT in Bouvigne voor R&D en Datanetwerkteam.',
'eigenaar_id' => $rene->id,
'status' => ProjectStatus::Verkenning,
'prioriteit' => Prioriteit::Midden,
'startdatum' => '2026-01-01',
'streef_einddatum' => '2026-12-31',
], [FaseType::Signaal, FaseType::Verkenning]);
// ──────────────────────────────────────────────────────────────
// 6. Assign team members
// ──────────────────────────────────────────────────────────────
$bridge->teamleden()->attach($pim->id, ['rol' => ProjectRol::Lid->value]);
$bridge->teamleden()->attach($sjoerd->id, ['rol' => ProjectRol::Lid->value]);
$crisp->teamleden()->attach($rene->id, ['rol' => ProjectRol::Reviewer->value]);
$wise->teamleden()->attach($pim->id, ['rol' => ProjectRol::Lid->value]);
$gemaal->teamleden()->attach($rene->id, ['rol' => ProjectRol::Reviewer->value]);
$afvlak->teamleden()->attach($rene->id, ['rol' => ProjectRol::Reviewer->value]);
$governance->teamleden()->attach($pim->id, ['rol' => ProjectRol::Lid->value]);
$governance->teamleden()->attach($sjoerd->id, ['rol' => ProjectRol::Lid->value]);
// ──────────────────────────────────────────────────────────────
// 7. Commitments
// ──────────────────────────────────────────────────────────────
// BRIDGE
Commitment::create([
'project_id' => $bridge->id,
'beschrijving' => 'Architectuur validatiedocument opleveren conform stackKlundertPilot.pdf',
'eigenaar_id' => $rene->id,
'deadline' => '2026-04-30',
'status' => CommitmentStatus::InUitvoering,
'bron' => 'Planning 2026 slide 3',
]);
Commitment::create([
'project_id' => $bridge->id,
'beschrijving' => 'OT/IT beveiligingsassessment en scheidingsrapport',
'eigenaar_id' => $pim->id,
'deadline' => '2026-06-30',
'status' => CommitmentStatus::Open,
'bron' => 'Planning 2026 slide 3',
]);
Commitment::create([
'project_id' => $bridge->id,
'beschrijving' => 'Beslisdocument voor opschaling EDGE-laag naar andere locaties',
'eigenaar_id' => $rene->id,
'deadline' => '2026-09-30',
'status' => CommitmentStatus::Open,
'bron' => 'Planning 2026 slide 3',
]);
// CRISP
Commitment::create([
'project_id' => $crisp->id,
'beschrijving' => 'TCO-onderbouwde aanbestedingsdocumenten technisch getoetst vóór marktgang',
'eigenaar_id' => $pim->id,
'deadline' => '2026-05-31',
'status' => CommitmentStatus::Open,
'bron' => 'Planning 2026 slide 4',
]);
// WISE
Commitment::create([
'project_id' => $wise->id,
'beschrijving' => 'Node-RED flows opleveren aan Bouwen / uitvoerende partij',
'eigenaar_id' => $rene->id,
'deadline' => '2026-03-31',
'status' => CommitmentStatus::InUitvoering,
'bron' => 'Planning 2026 slide 5',
]);
Commitment::create([
'project_id' => $wise->id,
'beschrijving' => 'Overdracht- en documentatiepakket compleet (afbakening R&D vs beheer)',
'eigenaar_id' => $rene->id,
'deadline' => '2026-06-30',
'status' => CommitmentStatus::Open,
'bron' => 'Planning 2026 slide 5',
]);
// Gemaal 3.0
Commitment::create([
'project_id' => $gemaal->id,
'beschrijving' => 'Go/no-go besluit voor uitrol naar 2 kopieën op basis van testresultaten',
'eigenaar_id' => $sjoerd->id,
'deadline' => '2026-06-30',
'status' => CommitmentStatus::Open,
'bron' => 'Planning 2026 slide 6',
]);
Commitment::create([
'project_id' => $gemaal->id,
'beschrijving' => 'Overzicht software/hardware functionaliteiten en validatie digital twins',
'eigenaar_id' => $rene->id,
'deadline' => '2026-07-31',
'status' => CommitmentStatus::Open,
'bron' => 'Planning 2026 slide 6',
]);
// Afvlakkingsregeling
Commitment::create([
'project_id' => $afvlak->id,
'beschrijving' => '2 extra opstellingen gerealiseerd en gekoppeld tot keten',
'eigenaar_id' => $sjoerd->id,
'deadline' => '2026-10-31',
'status' => CommitmentStatus::Open,
'bron' => 'Planning 2026 slide 7',
]);
// Governance
Commitment::create([
'project_id' => $governance->id,
'beschrijving' => 'Projectstructuur- en documentatieafspraken vastgelegd',
'eigenaar_id' => $rene->id,
'deadline' => '2026-03-31',
'status' => CommitmentStatus::InUitvoering,
'bron' => 'Planning 2026 slide 8',
]);
Commitment::create([
'project_id' => $governance->id,
'beschrijving' => 'Rolafbakening R&D ↔ Beheer ↔ Bouwen vastgelegd en gecommuniceerd',
'eigenaar_id' => $rene->id,
'deadline' => '2026-06-30',
'status' => CommitmentStatus::Open,
'bron' => 'Planning 2026 slide 8',
]);
// ──────────────────────────────────────────────────────────────
// 8. Documents
// ──────────────────────────────────────────────────────────────
Document::create([
'project_id' => $bridge->id,
'titel' => 'Stack Architectuur Klundert Pilot',
'type' => 'technisch_ontwerp',
'inhoud' => 'Systeemarchitectuur EDGE-laag: Ubuntu LTS, Node-RED orkestratie, OPC UA communicatie met Siemens PLC T-serie, InfluxDB/Grafana datastromen.',
'versie' => 1,
'auteur_id' => $rene->id,
]);
Document::create([
'project_id' => $wise->id,
'titel' => 'Overdrachtsprotocol Monsternamekast',
'type' => 'protocol',
'inhoud' => 'Opleverdocument voor de overdracht van de monsternamekast naar Bouwen. Bevat: Node-RED flow specificaties, integratie voorspellend model, afbakening verantwoordelijkheden.',
'versie' => 1,
'auteur_id' => $rene->id,
]);
Document::create([
'project_id' => $crisp->id,
'titel' => 'Technische Toetsing Aanbesteding Compressoren',
'type' => 'technisch_rapport',
'inhoud' => 'Q&A en technische beoordeling van aanbestedingsdocumenten voor compressorvervanging Nieuwveer. TCO-analyse, prestatie-eisen, energie-efficiëntie.',
'versie' => 1,
'auteur_id' => $pim->id,
]);
Document::create([
'project_id' => $gemaal->id,
'titel' => 'Testrapport Prototype Gemaal 3.0',
'type' => 'technisch_rapport',
'inhoud' => 'Bevindingen en verbeterpunten uit validatie van het prototype: elektrische aansluitingen, I/O-functionaliteit, randapparatuur, digital twin koppelingen.',
'versie' => 1,
'auteur_id' => $sjoerd->id,
]);
Document::create([
'project_id' => $governance->id,
'titel' => 'R&D Projectstructuur & Beleidskader',
'type' => 'projectplan',
'inhoud' => 'Afspraken over projectstructuur, documentatiestandaarden, besluitvormingsproces en beleid voor het R&D-lab.',
'versie' => 1,
'auteur_id' => $rene->id,
]);
// --- Documents extracted from architecture diagrams (raw/*.drawio.png) ---
// EVOLV-Tracks-Maintracks: full ISA-88 node hierarchy
Document::create([
'project_id' => $gemaal->id,
'titel' => 'EVOLV Digital Twin Hiërarchie (ISA-88 Tracks)',
'type' => 'technisch_ontwerp',
'inhoud' => "EVOLV node-hiërarchie conform ISA-88 (S88) batch control standaard.\n\n"
. "**Control Module**: measurement, diffuser, healthCompact, filterController\n"
. "**Equipment**: Rotating Machine, sump (gepland)\n"
. "**Unit**: machineGroupControl, valve, hydraulic network (gepland)\n"
. "**Process Cell**: Pumping Station\n"
. "**Area**: Sewage Pumping Group Control\n"
. "**Complex models**: Influent Prediction\n"
. "**Utilities**: generalFunctions, coreSync, convert, dashboardAPI\n"
. "**Data manipulation**: onderste laag\n\n"
. "Verticale tracks per asset-keten. Horizontale vertakkingen per ISA-88 niveau. "
. "Stippellijncirkels = geplande maar nog niet gebouwde nodes. "
. "Bron: EVOLV-Tracks-Maintracks.drawio.png",
'versie' => 1,
'auteur_id' => $rene->id,
]);
// EVOLV-Tracks-PumpingStation: vertical dependency chain
Document::create([
'project_id' => $gemaal->id,
'titel' => 'Pumping Station Afhankelijkheidsketen',
'type' => 'technisch_ontwerp',
'inhoud' => "Verticale afhankelijkheidsketen voor de Pumping Station track:\n\n"
. "measurement (Control Module) → Rotating Machine (Equipment) → "
. "machineGroupControl (Unit) → Sewage Pumping Station (Process Cell) → "
. "Sewage Pumping Group Control (Area) → Influent Prediction (Complex) → "
. "generalFunctions + coreSync + convert + dashboardAPI (Utilities)\n\n"
. "Elke laag is afhankelijk van de laag erboven. Equipment-nodes die als stippellijn staan "
. "(sump) zijn gepland maar nog niet ontwikkeld.\n"
. "Bron: EVOLV-Tracks-PumpingStation.drawio.png",
'versie' => 1,
'auteur_id' => $rene->id,
]);
// PLCEdge: network architecture VLAN separation
Document::create([
'project_id' => $bridge->id,
'titel' => 'PLC/EDGE Netwerk Architectuur (VLAN-scheiding)',
'type' => 'technisch_ontwerp',
'inhoud' => "Netwerkarchitectuur voor de BRIDGE pilot met VLAN-scheiding:\n\n"
. "**Extern Serverpark** (Internet): Digital Twin + Integratielaag op Edem expert system\n"
. "**Bouvigne Serverpark** (VLAN 1): Linux Server met Digital Twin + Integratielaag\n"
. "**On-site Gemaal/RWZI** (VLAN 2 + 3):\n"
. " - VLAN 3: Linux EDGE met Digital Twin + Integratielaag\n"
. " - VLAN 2: Siemens 1500 PLC (Typical) + Remote IO modules → Pomp\n\n"
. "Communicatie: HTTPS tussen extern en Bouvigne, tunnel naar EDGE, OPC UA naar PLC.\n"
. "Bron: PLCEdge-Page-1.drawio.png",
'versie' => 2,
'auteur_id' => $pim->id,
]);
// Stack: full R&D software stack
Document::create([
'project_id' => $bridge->id,
'titel' => 'R&D Stack Topologie (Cloud / EDGE / OT)',
'type' => 'technisch_ontwerp',
'inhoud' => "Drielaagse R&D stack architectuur:\n\n"
. "**Cloud/Central Layer**: nginx-proxy, Nodered, Portainer, SSL CertResolver, "
. "jenkins, influx-db, Grafana, Mosquitto, MQTT Broker, Fluffle (MQTT OUT ONLY broker), "
. "ESL dit (single port only)\n\n"
. "**EDGE Layer**: Mosquitto/VPN bridge, Nodered, Portainer, influx-db, "
. "Grafana, CoreSync, Mosquitto, MQTT SX\n\n"
. "**OT Layer**: OPCua Server → PLC\n\n"
. "Tunnel-verbinding tussen Cloud en EDGE. OPC UA van EDGE naar OT.\n"
. "Bron: Stack.drawio (2).png",
'versie' => 1,
'auteur_id' => $rene->id,
]);
// CoreSync: local/central sync topology
Document::create([
'project_id' => $bridge->id,
'titel' => 'CoreSync Netwerk Setup (Single Level)',
'type' => 'technisch_ontwerp',
'inhoud' => "CoreSync single-level configuratie:\n\n"
. "**R&D lokaal ZRG (LVL 1)**: Apparaat 1 + Apparaat 2 met measurement nodes, "
. "verbonden via Apparaat 3 (Node-Red container) met GR Bridge flows\n\n"
. "**R&D Centraal (LVL 1)**: Apparaat 4 (Node-Red container) met GR Bridge flows, "
. "verbonden via HTTPS naar lokaal\n\n"
. "Notitie: Elk netwerk dat UR, DR en 1RG bijv de edges zijn dit simpel. "
. "Ga through AZURE. Per net tekent voor edge = 1 à 1 b/u to net. "
. "PI flow at Bouvigne.\n"
. "Bron: CoreSync-Single level.drawio.png",
'versie' => 1,
'auteur_id' => $pim->id,
]);
// Complex gitflow: R&D timeline with branching tracks
Document::create([
'project_id' => $governance->id,
'titel' => 'R&D Tijdlijn & Releasebeleid (Gitflow)',
'type' => 'projectplan',
'inhoud' => "R&D release-tijdlijn als metro-tracks (gitflow model):\n\n"
. "**Tracks**: Bestuurlijk, Hotfix, Release, Release Fixes, Studenten, Yellowchess, Budget\n\n"
. "**Tijdlijn**:\n"
. "- 7/'21: R&D start PRO\n"
. "- 8/'21: Introductie met minor avans\n"
. "- 9/'21: Start minor PA avans, Opbouw partytent\n"
. "- 8/'21: Budget 40k\n"
. "- Pilot v0.1 → Verhuizing loods hardenberg → Pilot v0.2\n"
. "- Release 2.0 → 2.1\n\n"
. "Vertakkingen tonen hoe R&D-werk splitst en samenkomt.\n"
. "Bron: EVOLV-Tracks-complex gitflow.drawio.png",
'versie' => 1,
'auteur_id' => $rene->id,
]);
// ──────────────────────────────────────────────────────────────
// 9. Dependencies between projects
// ──────────────────────────────────────────────────────────────
// Afvlakkingsregeling hangt af van Gemaal 3.0 (prototype moet gevalideerd zijn)
Afhankelijkheid::create([
'project_id' => $afvlak->id,
'afhankelijk_van_project_id' => $gemaal->id,
'type' => 'technisch',
'beschrijving' => 'De afvlakkingsregeling vereist gevalideerde prototypes van Gemaal 3.0 (× 2 kopieën) als basis voor de ketenopstelling.',
'status' => 'open',
]);
// WISE overdracht profiteert van BRIDGE architectuur (gedeelde EDGE-infrastructuur)
Afhankelijkheid::create([
'project_id' => $wise->id,
'afhankelijk_van_project_id' => $bridge->id,
'type' => 'infrastructuur',
'beschrijving' => 'De monsternamekast draait op dezelfde EDGE-architectuur die BRIDGE valideert.',
'status' => 'open',
]);
// Gemaal 3.0 validatie van digital twins hangt samen met BRIDGE architectuur
Afhankelijkheid::create([
'project_id' => $gemaal->id,
'afhankelijk_van_project_id' => $bridge->id,
'type' => 'technisch',
'beschrijving' => 'Digital twin validatie in Gemaal 3.0 gebruikt dezelfde EDGE-laag als bewezen in BRIDGE.',
'status' => 'open',
]);
// ══════════════════════════════════════════════════════════════════
// 10. ONDERZOEK — Research thema with student tracks
//
// Track grouping based on cross-reference analysis of source docs.
// Students who build on each other share a track (same speerpunt).
// See CLAUDE.md "Metro Map Data Rules > Student Work Rules".
// ══════════════════════════════════════════════════════════════════
$themaOnderzoek = Thema::create([
'naam' => 'Onderzoek',
'beschrijving' => 'Afstudeer-, stage- en groepsprojecten (Avans, Fontys, TU/e). Tracks gegroepeerd op basis van cross-referenties: studenten die op elkaars werk voortbouwen delen een track.',
'prioriteit' => Prioriteit::Midden,
'periode_start' => '2021-07-01',
'periode_eind' => '2026-12-31',
]);
// --- Speerpunten = tracks based on cross-reference chains ---
// See CLAUDE.md "Student Work Rules" for evidence
// TRACK 1: Gemalen & CRC chain
// Grace (pump curves, refs CRC 18x) → Kevin (CRC/IOT2050, refs Grace) → Robin (D.R.A.I.N., refs CRC 3x) → Adriaan (pilot 3, refs D.R.A.I.N.)
$spGemalenCRC = Speerpunt::create([
'thema_id' => $themaOnderzoek->id,
'naam' => 'Gemalen & CRC Keten',
'beschrijving' => 'Ketensamenwerking: pompefficiëntie → CRC edge computing → regelsoftware → pilot gemaalketen. Grace → Kevin → Robin → Adriaan.',
'eigenaar_id' => $rene->id,
'status' => SpeerpuntStatus::Actief,
]);
// TRACK 2: Monitoring branch (forks from Kevin's CRC)
// Kevin → Yamai (CRC 78x, MCSA, explicitly references Kevin)
$spMonitoring = Speerpunt::create([
'thema_id' => $themaOnderzoek->id,
'naam' => 'Condition Monitoring (CRC→MCSA)',
'beschrijving' => 'Vertakking vanuit Kevin\'s CRC: Yamai bouwt voort met Motor Current Signal Analysis voor condition-based monitoring.',
'eigenaar_id' => $rene->id,
'status' => SpeerpuntStatus::Actief,
]);
// TRACK 3: Zuivering & Beluchting
// Noa (beluchting 24x) ‖ Elise (algen 289x, beluchting 92x) — parallel approaches to same problem
$spZuivering = Speerpunt::create([
'thema_id' => $themaOnderzoek->id,
'naam' => 'Zuivering & Beluchting',
'beschrijving' => 'Parallelle aanpak beluchtingsprobleem: Noa (mechanisch model) en Elise (biologisch via algen). Geen directe cross-refs maar zelfde onderzoeksvraag.',
'eigenaar_id' => $rene->id,
'status' => SpeerpuntStatus::Actief,
]);
// TRACK 4: EVOLV Reactor (standalone)
// Pieter (EVOLV 25x, reactor 55x) — no cross-refs to other students
$spReactor = Speerpunt::create([
'thema_id' => $themaOnderzoek->id,
'naam' => 'EVOLV Reactor Model',
'beschrijving' => 'Standalone masterstage: ASM reactor model voor EVOLV. Geen cross-refs naar andere studenten, directe EVOLV-bijdrage.',
'eigenaar_id' => $rene->id,
'status' => SpeerpuntStatus::Actief,
]);
// TRACK 5: IoT & Infrastructuur
// Bart (IoT-hub, EDGE) → Fontys ICT (Docker/CI-CD/SOC) → Fontys TOGAF (EDGE security)
$spIoTInfra = Speerpunt::create([
'thema_id' => $themaOnderzoek->id,
'naam' => 'IoT & ICT Infrastructuur',
'beschrijving' => 'Infrastructuurketen: Bart (IoT-hub integratielaag) → Fontys ICT (Docker/CI-CD/SOC) → Fontys TOGAF (security architectuur). Alle drie raken edge-infra.',
'eigenaar_id' => $pim->id,
'status' => SpeerpuntStatus::Actief,
]);
// --- Student projects ---
// Adriaan Sol — Pilot 3 rioolgemaalketen
$pAdriaan = $this->createProject([
'speerpunt_id' => $spGemalenCRC->id,
'naam' => 'Ontwerp Pilot 3 Rioolgemaalketen',
'beschrijving' => 'Afstudeerstage Avans Chemische Technologie. Ontwerp van pilot 3 rioolgemaalketen bij RWZI Nieuwveer. Student: Adriaan Sol (2154257).',
'eigenaar_id' => $rene->id,
'status' => ProjectStatus::Evaluatie,
'prioriteit' => Prioriteit::Midden,
'startdatum' => '2025-04-01',
'streef_einddatum' => '2025-10-21',
], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept, FaseType::Experiment, FaseType::Pilot, FaseType::Evaluatie]);
Document::create([
'project_id' => $pAdriaan->id,
'titel' => 'Eindverslag: Ontwerp pilot 3 rioolgemaalketen',
'type' => 'technisch_rapport',
'inhoud' => "Definitief eindverslag afstuderen Adriaan Sol (Avans, Chemische Technologie, PO²).\n\n"
. "Onderwerp: Ontwerp van pilot 3 rioolgemaalketen bij RWZI Nieuwveer.\n"
. "Focus: Procesontwerp en -optimalisatie voor de rioolgemaal testopstelling.\n"
. "Begeleider: Rene de Ren\n"
. "Bron: Definitief Eindverslag Waterschap Brabantse Delta Adriaan Sol 21-10-2025 - V1.docx",
'versie' => 1,
'auteur_id' => $rene->id,
]);
// Robin van Weelie — D.R.A.I.N.
$pRobin = $this->createProject([
'speerpunt_id' => $spGemalenCRC->id,
'naam' => 'D.R.A.I.N. Regelsoftware Rioolgemalen',
'beschrijving' => 'Afstudeeronderzoek naar data-gedreven en energie-efficiënte aansturing rioolgemalen. Technische analyse Hooge- en Lage Zwaluwe, invloed kelderhoogte en drukverschil op energetisch gedrag.',
'eigenaar_id' => $rene->id,
'status' => ProjectStatus::Evaluatie,
'prioriteit' => Prioriteit::Hoog,
'startdatum' => '2024-09-01',
'streef_einddatum' => '2025-06-30',
], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept, FaseType::Experiment, FaseType::Evaluatie]);
Document::create([
'project_id' => $pRobin->id,
'titel' => 'Eindverslag D.R.A.I.N. Robin van Weelie',
'type' => 'technisch_rapport',
'inhoud' => "Project D.R.A.I.N.: data-gedreven aansturing rioolgemalen.\n\n"
. "Onderzoeksvragen: (1) Geschiktheid gemalen Hooge-/Lage Zwaluwe voor nieuwe regelsoftware, "
. "(2) Invloed kelderhoogte en drukverschil op energetisch gedrag Hooge Zwaluwe.\n"
. "Methode: P&ID-analyse, pompspecificaties, meetdata.\n"
. "Bron: Eindverslag_WSBD_Robin_van_Weelie_V4-11-12.docx",
'versie' => 4,
'auteur_id' => $rene->id,
]);
Document::create([
'project_id' => $pRobin->id,
'titel' => 'Werkplan Digital Twin Experiment Hooge Zwaluwe',
'type' => 'projectplan',
'inhoud' => "Werkplan voor Digital Twin experiment op gemaal Hooge Zwaluwe.\n\n"
. "Competentie Experimenteren Niveau 2: aanpak kiezen en onderbouwen.\n"
. "Digital Twin als methode voor validatie van regelsoftware.\n"
. "Bron: Experiment Digital Twin Robin.docx",
'versie' => 1,
'auteur_id' => $rene->id,
]);
// Grace van Geel — Pompefficiëntie
$pGrace = $this->createProject([
'speerpunt_id' => $spGemalenCRC->id,
'naam' => 'Efficiëntie-curve Centrifugaalpompen',
'beschrijving' => 'Afstudeeronderzoek Avans naar invloed van voordruk, verschildruk en parallel werkende pompen op de efficiëntie-curve van centrifugaalpompen. Student: Grace van Geel.',
'eigenaar_id' => $rene->id,
'status' => ProjectStatus::Evaluatie,
'prioriteit' => Prioriteit::Midden,
'startdatum' => '2023-09-01',
'streef_einddatum' => '2024-01-12',
], [FaseType::Signaal, FaseType::Verkenning, FaseType::Experiment, FaseType::Evaluatie]);
Document::create([
'project_id' => $pGrace->id,
'titel' => 'Afstudeerverslag: Efficiëntie centrifugaalpompen',
'type' => 'technisch_rapport',
'inhoud' => "Energie-efficiëntie van centrifugaalpompen.\n\n"
. "Onderwerp: Invloed van voordruk, verschildruk en parallel werkende pompen op de efficiëntie-curve.\n"
. "Student: Grace van Geel, Avans Hogeschool.\n"
. "Team: R&D Lab, Waterschap Brabantse Delta.\n"
. "Bron: Energie-efficiëntie van centrifugaalpompen - Afstudeerverslag Grace van Geel.pdf",
'versie' => 1,
'auteur_id' => $rene->id,
]);
// Noa de Groot — Beluchtingsoptimalisatie
$pNoa = $this->createProject([
'speerpunt_id' => $spZuivering->id,
'naam' => 'Optimalisatie Beluchtingsproces RWZI',
'beschrijving' => 'Ontwerp van een nieuw model voor de optimalisatie van het beluchtingsproces in een rioolwaterzuivering. Student: Noa de Groot, Avans BML.',
'eigenaar_id' => $rene->id,
'status' => ProjectStatus::Evaluatie,
'prioriteit' => Prioriteit::Midden,
'startdatum' => '2024-01-01',
'streef_einddatum' => '2024-06-10',
], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept, FaseType::Experiment, FaseType::Evaluatie]);
Document::create([
'project_id' => $pNoa->id,
'titel' => 'Eindverslag: Optimalisatie beluchtingsproces',
'type' => 'technisch_rapport',
'inhoud' => "Ontwerp van een nieuw model voor de optimalisatie van het beluchtingsproces in een RWZI.\n\n"
. "Student: Noa de Groot, Avans BML.\n"
. "Begeleiders: René de Ren, Angelique Asselman, Margriet van Gestel.\n"
. "Bron: Eindverslag compleet versie 2.docx",
'versie' => 2,
'auteur_id' => $rene->id,
]);
// Elise Nouws — Algen voor zuurstof
$pElise = $this->createProject([
'speerpunt_id' => $spZuivering->id,
'naam' => 'Zuurstofproductie door Algen',
'beschrijving' => 'Onderzoek naar zuurstofproductie door algen voor beluchtingstanks als alternatief voor mechanische beluchting. Student: Elise Nouws, Avans Chemische Technologie.',
'eigenaar_id' => $rene->id,
'status' => ProjectStatus::Evaluatie,
'prioriteit' => Prioriteit::Laag,
'startdatum' => '2024-01-01',
'streef_einddatum' => '2024-06-11',
], [FaseType::Signaal, FaseType::Verkenning, FaseType::Experiment, FaseType::Evaluatie]);
Document::create([
'project_id' => $pElise->id,
'titel' => 'Afstudeerverslag: Zuurstofproductie door algen',
'type' => 'technisch_rapport',
'inhoud' => "Zuurstofproductie door algen voor beluchtingstanks.\n\n"
. "Student: Elise Nouws (2166910), Avans Chemische Technologie.\n"
. "Begeleiding: Sanne de Krom (school), Rene de Ren (bedrijf).\n"
. "Bron: afstudeerverslag Elise Nouws WSBD.pdf",
'versie' => 1,
'auteur_id' => $rene->id,
]);
// Pieter van der Wilt — Reactor model EVOLV
// TRACK 4: EVOLV Reactor (standalone, no student cross-refs)
$pPieter = $this->createProject([
'speerpunt_id' => $spReactor->id,
'naam' => 'Non-Ideal ASM Reactor Model (EVOLV)',
'beschrijving' => 'Masterstage: ontwikkeling van een niet-ideaal activated sludge reactor model voor het EVOLV-framework. Focus op computational setup, reaction model, transfer terms. Student: Pieter van der Wilt.',
'eigenaar_id' => $rene->id,
'status' => ProjectStatus::Evaluatie,
'prioriteit' => Prioriteit::Hoog,
'startdatum' => '2025-06-01',
'streef_einddatum' => '2025-11-21',
], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept, FaseType::Experiment, FaseType::Evaluatie]);
Document::create([
'project_id' => $pPieter->id,
'titel' => 'Internship Report: Non-Ideal ASM for EVOLV',
'type' => 'technisch_rapport',
'inhoud' => "Development of a Non-Ideal Activated Sludge Reactor Model for the EVOLV Framework.\n\n"
. "Contents: System description, model development, computational setup, assumptions, "
. "reaction model (ASM), transfer terms.\n"
. "Student: Pieter van der Wilt.\n"
. "Bron: Internship_report.pdf",
'versie' => 1,
'auteur_id' => $rene->id,
]);
// Kevin Haest — Carbon Reducing Controller
$pKevin = $this->createProject([
'speerpunt_id' => $spGemalenCRC->id,
'naam' => 'Carbon Reducing Controller (Siemens IOT2050)',
'beschrijving' => 'Afstudeerproject Avans E&T: CRC-systeem met edge computing op de Siemens IOT2050. Integratie IoT in afvalwaterzuivering. Samenwerking met Minor Procesautomatisering. Student: Kevin Haest.',
'eigenaar_id' => $rene->id,
'status' => ProjectStatus::Evaluatie,
'prioriteit' => Prioriteit::Hoog,
'startdatum' => '2023-09-01',
'streef_einddatum' => '2024-03-21',
], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept, FaseType::Experiment, FaseType::Pilot, FaseType::Evaluatie]);
Document::create([
'project_id' => $pKevin->id,
'titel' => 'Afstudeerrapport CRC Kevin Haest',
'type' => 'technisch_rapport',
'inhoud' => "Carbon Reducing Controller: Edge computing met de Siemens IOT2050.\n\n"
. "Academie voor Techniek en Innovatie, Avans Breda.\n"
. "Focus: IoT-integratie afvalwaterzuivering, modulair gemaal ontwerp, "
. "samenwerking Minor Procesautomatisering (Bram van der Weijden).\n"
. "Begeleiders: Rene de Ren, Angelique Asselman, Frank Arnouts.\n"
. "Bron: Rapport_CRC_WSBD_KGA Haest_v3.0.docx",
'versie' => 3,
'auteur_id' => $rene->id,
]);
// Yamai van Rooij — Condition-based monitoring + CRC + MCSA
// TRACK 2: Monitoring branch (forks from Kevin's CRC)
$pYamai = $this->createProject([
'speerpunt_id' => $spMonitoring->id,
'naam' => 'Condition-Based Monitoring & MCSA',
'beschrijving' => 'Stage Avans IE&M: verbetering operationele efficiëntie via CRC-systeem en Motor Current Signal Analysis. Innovatie van onderhoudspraktijken en energieverbruik reductie.',
'eigenaar_id' => $rene->id,
'status' => ProjectStatus::Evaluatie,
'prioriteit' => Prioriteit::Midden,
'startdatum' => '2024-09-01',
'streef_einddatum' => '2025-03-01',
], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept, FaseType::Experiment, FaseType::Evaluatie]);
Document::create([
'project_id' => $pYamai->id,
'titel' => 'Main Report: Condition-Based Monitoring at WBD',
'type' => 'technisch_rapport',
'inhoud' => "Condition-based monitoring innovations at Waterboard Brabantse Delta.\n\n"
. "CRC-systeem implementatie en MCSA-methodologie voor pompoperaties.\n"
. "Student: Yamai van Rooij (2186229), Avans IE&M.\n"
. "Begeleiders: Rene de Ren, Angelique Asselman.\n"
. "Bron: Main_report_WBD_V2.docx",
'versie' => 2,
'auteur_id' => $rene->id,
]);
// Bart van Gool — IoT-hub integratielaag
// TRACK 5: IoT & Infrastructuur chain
$pBart = $this->createProject([
'speerpunt_id' => $spIoTInfra->id,
'naam' => 'IoT-hub Implementatie Integratielaag',
'beschrijving' => 'Afstudeerproject Avans TI: implementatie van een IoT-hub in de integratielaag van het waterschap. Koppeling R&D en integratieteam. Student: Bart van Gool. Begeleider: Pim Moerman.',
'eigenaar_id' => $pim->id,
'status' => ProjectStatus::Experiment,
'prioriteit' => Prioriteit::Midden,
'startdatum' => '2024-02-01',
'streef_einddatum' => '2024-08-01',
], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept, FaseType::Experiment]);
Document::create([
'project_id' => $pBart->id,
'titel' => 'Plan van Aanpak: IoT-hub Integratielaag',
'type' => 'projectplan',
'inhoud' => "Plan van aanpak voor implementatie IoT-hub in de integratielaag.\n\n"
. "Student: Bart van Gool (2168447), Avans TI.\n"
. "Bedrijfsbegeleider: Pim Moerman.\n"
. "Afdeling: R&D, Facilitair & ICT (integratie).\n"
. "Scope: RWZI Nieuwveer + kantoor Bouvigne.\n"
. "Bron: Plan van aanpak V4.0- Bart van Gool - 2168447 (1).docx",
'versie' => 4,
'auteur_id' => $pim->id,
]);
// Fontys ICT groep — Docker, CI/CD, SOC
$pFontysICT = $this->createProject([
'speerpunt_id' => $spIoTInfra->id,
'naam' => 'Fontys ICT Proftaak Docker & CI/CD & SOC',
'beschrijving' => 'Groepsopdracht Fontys ICT: (1) Docker Swarm & load balancing, (2) Geautomatiseerde CI/CD-pijplijn ter vervanging van USB-deployments, (3) SOC-implementatie voor procesautomatisering.',
'eigenaar_id' => $pim->id,
'status' => ProjectStatus::Concept,
'prioriteit' => Prioriteit::Midden,
'startdatum' => '2025-09-01',
'streef_einddatum' => '2026-02-01',
], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept]);
Document::create([
'project_id' => $pFontysICT->id,
'titel' => 'Opdracht Fontys ICT Proftaak',
'type' => 'projectplan',
'inhoud' => "Drie deelprojecten voor Fontys ICT groep:\n\n"
. "**1. Docker Swarm**: Clusters opzetten, containers dynamisch schalen, load balancing.\n"
. "**2. CI/CD Pipeline**: Geautomatiseerde code-deployments, geen USB-sticks meer.\n"
. "**3. SOC**: Security Operations Center voor procesautomatisering, "
. "monitoringtools, incident response procedures.\n"
. "Bron: Opdracht Fontys ICT proftaak groep v0.1.docx",
'versie' => 1,
'auteur_id' => $pim->id,
]);
// Fontys SOC/TOGAF groep
$pTOGAF = $this->createProject([
'speerpunt_id' => $spIoTInfra->id,
'naam' => 'TOGAF Security Architectuur Edge-Devices',
'beschrijving' => 'Fontys groepsproject: beveiligingsadvies op basis van TOGAF-methodiek + NIST Cybersecurity Framework voor edge-apparaten waterschap.',
'eigenaar_id' => $pim->id,
'status' => ProjectStatus::Concept,
'prioriteit' => Prioriteit::Midden,
'startdatum' => '2025-09-01',
'streef_einddatum' => '2026-02-01',
], [FaseType::Signaal, FaseType::Verkenning, FaseType::Concept]);
Document::create([
'project_id' => $pTOGAF->id,
'titel' => 'Groepsproject TOGAF Beveiligingsarchitectuur',
'type' => 'technisch_ontwerp',
'inhoud' => "TOGAF-gebaseerd beveiligingsadvies voor edge-devices.\n\n"
. "Stakeholder: IT-management Waterschap Brabantse Delta.\n"
. "Kaders: TOGAF ADM + NIST Cybersecurity Framework.\n"
. "Scope: Governance, architectuurprincipes, beveiligingsontwerp edge-computers.\n"
. "Besluitvorming: groep → stakeholder → docenten.\n"
. "Bron: Groepsproject TOGAF.docx",
'versie' => 1,
'auteur_id' => $pim->id,
]);
// --- Inter-student dependencies (track chains) ---
// TRACK 1 chain: Grace → Kevin → Robin → Adriaan
Afhankelijkheid::create([
'project_id' => $pKevin->id,
'afhankelijk_van_project_id' => $pGrace->id,
'type' => 'data',
'beschrijving' => 'Kevin references Grace\'s pump efficiency curves (CRC 18x in Grace\'s report). CRC builds on pump characterization.',
'status' => 'opgelost',
]);
Afhankelijkheid::create([
'project_id' => $pRobin->id,
'afhankelijk_van_project_id' => $pKevin->id,
'type' => 'technisch',
'beschrijving' => 'Robin references CRC (3x) and uses Digital Twin approach enabled by Kevin\'s edge platform.',
'status' => 'opgelost',
]);
Afhankelijkheid::create([
'project_id' => $pAdriaan->id,
'afhankelijk_van_project_id' => $pRobin->id,
'type' => 'technisch',
'beschrijving' => 'Adriaan references D.R.A.I.N. (1x). Pilot 3 keten design builds on Robin\'s gemaal analysis.',
'status' => 'opgelost',
]);
// TRACK 2 branch: Kevin → Yamai
Afhankelijkheid::create([
'project_id' => $pYamai->id,
'afhankelijk_van_project_id' => $pKevin->id,
'type' => 'technisch',
'beschrijving' => 'Yamai\'s MCSA work directly extends Kevin\'s CRC system (CRC referenced 78x). Explicitly references Kevin.',
'status' => 'opgelost',
]);
// TRACK 5 chain: Bart → Fontys ICT → Fontys TOGAF
Afhankelijkheid::create([
'project_id' => $pFontysICT->id,
'afhankelijk_van_project_id' => $pBart->id,
'type' => 'infrastructuur',
'beschrijving' => 'Fontys ICT Docker/CI-CD work extends Bart\'s IoT-hub integration layer infrastructure.',
'status' => 'open',
]);
Afhankelijkheid::create([
'project_id' => $pTOGAF->id,
'afhankelijk_van_project_id' => $pFontysICT->id,
'type' => 'technisch',
'beschrijving' => 'TOGAF security architecture applies to the Docker/edge infrastructure set up by Fontys ICT.',
'status' => 'open',
]);
// --- Student → 2026 project dependencies ---
Afhankelijkheid::create([
'project_id' => $bridge->id,
'afhankelijk_van_project_id' => $pKevin->id,
'type' => 'technisch',
'beschrijving' => 'BRIDGE bouwt voort op Kevin\'s CRC edge computing met Siemens IOT2050.',
'status' => 'opgelost',
]);
Afhankelijkheid::create([
'project_id' => $gemaal->id,
'afhankelijk_van_project_id' => $pRobin->id,
'type' => 'data',
'beschrijving' => 'Gemaal 3.0 gebruikt Robin\'s meetdata en analyse gemalen Hooge-/Lage Zwaluwe.',
'status' => 'opgelost',
]);
Afhankelijkheid::create([
'project_id' => $gemaal->id,
'afhankelijk_van_project_id' => $pPieter->id,
'type' => 'technisch',
'beschrijving' => 'Het ASM reactor model van Pieter is geïntegreerd in het EVOLV-framework dat Gemaal 3.0 valideert.',
'status' => 'opgelost',
]);
// ──────────────────────────────────────────────────────────────
// 11. Kennis Artikelen — key findings extracted from student work
// ──────────────────────────────────────────────────────────────
KennisArtikel::create([
'titel' => 'ISA-88 Node Hiërarchie voor EVOLV Digital Twins',
'inhoud' => "De EVOLV digital twin architectuur volgt de ISA-88 (S88) batch control standaard:\n\n"
. "Control Module → Equipment → Unit → Process Cell → Area → Complex Models → Utilities\n\n"
. "Elke laag heeft eigen Node-RED nodes. Verticale afhankelijkheden bepalen de dataflow. "
. "Horizontale vertakkingen per niveau representeren parallelle assets.\n\n"
. "Voorbeeld Pumping Station keten: measurement → Rotating Machine → machineGroupControl → "
. "Sewage Pumping Station → Sewage Pumping Group Control → Influent Prediction.",
'auteur_id' => $rene->id,
]);
KennisArtikel::create([
'titel' => 'VLAN-scheiding OT/IT voor EDGE-implementatie',
'inhoud' => "De EDGE-architectuur gebruikt drie VLAN-niveaus:\n\n"
. "VLAN 1 (Bouvigne): Linux server met Digital Twin + Integratielaag\n"
. "VLAN 2 (On-site OT): Siemens 1500 PLC + Remote IO\n"
. "VLAN 3 (On-site IT): Linux EDGE met Digital Twin + Integratielaag\n\n"
. "Communicatie: HTTPS extern→Bouvigne, tunnel Bouvigne→EDGE, OPC UA EDGE→PLC.\n"
. "Gevalideerd in de BRIDGE pilot Klundert.",
'auteur_id' => $pim->id,
]);
KennisArtikel::create([
'titel' => 'Carbon Reducing Controller (CRC) — Siemens IOT2050',
'inhoud' => "De CRC is een edge-computing oplossing op de Siemens IOT2050 voor CO₂-reductie "
. "in de afvalwaterzuivering.\n\n"
. "Ontwikkeld door Kevin Haest (Avans E&T, 2024). Combineert IoT met procesautomatisering. "
. "Het modulaire gemaal ontwerp integreert lessen uit eerdere prototypes.\n\n"
. "Motor Current Signal Analysis (MCSA) door Yamai van Rooij (2025) bouwt hierop voort "
. "voor condition-based monitoring van pompoperaties.",
'auteur_id' => $rene->id,
]);
KennisArtikel::create([
'titel' => 'Efficiëntiecurves Centrifugaalpompen — Meetresultaten',
'inhoud' => "Onderzoek Grace van Geel (Avans, 2024) toont aan dat:\n\n"
. "- Voordruk significant de efficiëntiecurve van centrifugaalpompen beïnvloedt\n"
. "- Verschildruk de optimale werking verschuift\n"
. "- Parallel werkende pompen een ander efficiëntieprofiel geven dan individuele pompen\n\n"
. "Deze bevindingen zijn relevant voor de Gemaal 3.0 digital twin validatie "
. "en de afvlakkingsregeling in de gemalenketen.",
'auteur_id' => $rene->id,
]);
KennisArtikel::create([
'titel' => 'R&D Stack — Drielaagse Architectuur',
'inhoud' => "De R&D-stack bestaat uit drie lagen:\n\n"
. "**Cloud/Central**: nginx-proxy, Node-RED, Portainer, Jenkins, InfluxDB, Grafana, Mosquitto MQTT\n"
. "**EDGE**: Node-RED, Portainer, InfluxDB, Grafana, CoreSync, Mosquitto\n"
. "**OT**: OPC UA Server → PLC\n\n"
. "CoreSync verzorgt synchronisatie tussen lokaal (ZRG) en centraal (Bouvigne) niveau. "
. "Fluffle is een write-only MQTT bridge voor veilige data-export.",
'auteur_id' => $rene->id,
]);
}
/**
* Helper: create a project with its completed and active phases.
*/
private function createProject(array $attributes, array $faseTypes): Project
{
$project = Project::create($attributes);
$project->teamleden()->attach($attributes['eigenaar_id'], ['rol' => ProjectRol::Eigenaar->value]);
foreach ($faseTypes as $index => $faseType) {
$isLast = $index === count($faseTypes) - 1;
Fase::create([
'project_id' => $project->id,
'type' => $faseType,
'status' => $isLast ? FaseStatus::Actief : FaseStatus::Afgerond,
'startdatum' => now()->subMonths(count($faseTypes) - 1 - $index),
'einddatum' => $isLast ? null : now()->subMonths(count($faseTypes) - 2 - $index),
]);
}
return $project;
}
}