#!/usr/bin/env python3
"""Generate T13 Safety Observation Process e-learning HTML."""
import os, json
import random
from datetime import datetime

OUTPUT = "/root/projects/jg/2026-PM-eLearning/deliverables/PM_EL_T13_Safety_Observation_Process_eLearning_v1.1.html"
os.makedirs(os.path.dirname(OUTPUT), exist_ok=True)

modules = [
    {
        "title": "Introductie Safety Observation Process",
        "content": [
            "Safety Observation is een gestructureerde methode om veilig gedrag en onveilige situaties op de werkvloer systematisch te observeren, registreren en bespreken. Het is een essentieel onderdeel van Behavioral Based Safety (BBS) en vormt de ruggengraat van de veiligheidscultuur bij Phoenix Metals B.V. Waar traditionele veiligheidsinspecties zich richten op naleving van regels en controles van installaties, richt Safety Observation zich op het gedrag van medewerkers en de interactie tussen mens en werkomgeving. Het verschil is fundamenteel: een inspectie beoordeelt de staat van de installatie, een observation beoordeelt hoe mensen met die installatie omgaan.",
            "Het verschil tussen een safety observation en een inspectie is fundamenteel. Een inspectie is een formele, vaak periodieke controle van apparatuur, procedures en fysieke omstandigheden tegen een checklist of norm. Een safety observation is een continu proces waarbij leidinggevenden en collega's bewust kijken naar hoe werk wordt uitgevoerd, met als doel het gesprek aan te gaan over veiligheid. Waar een inspectie leidt tot een rapport met bevindingen, leidt een observation tot een dialoog over gedrag. Deze dialoog is waar de echte verandering plaatsvindt.",
            "Bij Phoenix Metals B.V. werken we met V₂O₅ (vanadiumpentoxide, Repr. 1B, Carc. 2), H₂SO₄ (zwavelzuur, bijtend) en NaOH (natriumhydroxide, bijtend). Deze stoffen vereisen een veiligheidscultuur die verder gaat dan regels alleen. Een medewerker die zijn PBM's correct draagt, maar een collega niet aanspreekt op onveilig gedrag, heeft de safety observation-gedachte nog niet volledig omarmd. Het gaat om collectieve verantwoordelijkheid: we houden elkaar scherp.",
            "De kern van het Safety Observation Process bij Phoenix Metals is: zien, bespreken, leren en verbeteren. Elke observation is een kans om veilig gedrag te bevestigen (positieve versterking) of onveilig gedrag te corrigeren (constructieve feedback). Beide zijn even belangrijk. Studies tonen aan dat een verhouding van minimaal 3:1 (positief:correctief) nodig is voor een effectieve veiligheidscultuur. Dit is geen willekeurig getal maar gebaseerd op uitgebreid psychologisch onderzoek naar gedragsverandering.",
            "Dit onderdeel van de training (TR-303-03) behandelt het volledige Safety Observation Process: van de theoretische basis via de praktische uitvoering tot de registratie en analyse van observations. Na afloop begrijp je jouw rol in het BBS-programma van Phoenix Metals en kun je effectief deelnemen aan safety observations. Je kent de STOP-methode, je kunt feedback geven, je weet hoe je observations registreert en je begrijpt hoe observations bijdragen aan een veiligere werkomgeving."
        ],
        "wistje": "Wist je dat bedrijven met een actief BBS-programma gemiddeld 40-60% minder ongevallen ervaren dan bedrijven zonder? Uit onderzoek van DuPont (2004) blijkt dat 96% van alle ongevallen wordt veroorzaakt door onveilig gedrag, niet door onveilige omstandigheden. Dit onderstreept het belang van gedragsobservatie boven puur technische inspecties.",
        "praktijk": "Bij Phoenix Metals observeren we dagelijks in de installatie. Stijn van Zelst (MD) heeft bepaald dat elke leidinggevende minimaal 2 safety observations per week uitvoert. Deze worden geregistreerd in het Safety Observation Formulier (SOF) en besproken in de wekelijkse toolbox-meeting. Het doel is trendanalyse: als we zien dat bepaalde onveilige gedragingen structureel voorkomen, pakken we de oorzaak aan.",
        "vraag": "Wat is het belangrijkste verschil tussen een safety observation en een veiligheidsinspectie?",
        "opties": ["Een inspectie is formeel; een observation is een gesprek over gedrag", "Er is geen verschil", "Een observation is alleen voor leidinggevenden", "Een inspectie is minder belangrijk dan een observation"],
        "correct": 0
    },
    {
        "title": "Unsafe Acts vs Unsafe Conditions",
        "content": [
            "Onveilige acties (unsafe acts) en onveilige omstandigheden (unsafe conditions) zijn de twee hoofdcategorieën van veiligheidsrisico's. Een unsafe act is een gedraging of handeling die het risico op een incident vergroot. Denk aan: het niet dragen van veiligheidsbril bij het hanteren van H₂SO₄, het overslaan van een lockout/tagout procedure, of het werken op hoogte zonder valbeveiliging. Een unsafe condition is een fysieke toestand van de werkomgeving die gevaar oplevert: een lekkende pijpleiding, een ontbrekende leuning, slechte verlichting of een gladde vloer.",
            "Volgens de Heinrich-triangle (Herbert William Heinrich, 1931) is de verhouding tussen unsafe acts, unsafe conditions, near misses en ongevallen ongeveer 300:29:1:1. Dit betekent dat voor elk ernstig ongeval er honderden unsafe acts en conditions zijn die we kunnen observeren en aanpakken vóór het tot een incident komt. Door systematisch unsafe acts en conditions te observeren en aan te pakken, verkleinen we de kans op incidenten aanzienlijk. Deze theorie is de basis van het Safety Observation Process.",
            "Bij Phoenix Metals is het herkennen van unsafe acts extra belangrijk vanwege de specifieke risico's van onze stoffen. Het openen van een reactordeksel zonder de juiste procedure is een unsafe act met potentieel fatale gevolgen bij aanwezigheid van V₂O₅-stof. Het niet controleren van de pH-waarde voor het afvoeren van een NaOH-houdende stroom is een unsafe act die kan leiden tot corrosie of milieu-incidenten. Elke unsafe act in onze omgeving kan escaleren tot een Seveso-relevant incident.",
            "Unsafe conditions bij Phoenix Metals omvatten: corrosie aan leidingen door H₂SO₄-blootstelling, accumulatie van V₂O₅-stof op loopbruggen, onvoldoende ventilatie in gesloten ruimtes, en versleten afdichtingen op pompstellen. Tijdens safety observations zoeken we bewust naar deze conditions. Ze zijn vaak het resultaat van uitgesteld onderhoud of veranderingen in het proces die niet zijn geëvalueerd op veiligheidsaspecten.",
            "De interactie tussen unsafe acts en unsafe conditions is cruciaal. Een medewerker die zonder handschoenen werkt aan een H₂SO₄-doseersysteem (unsafe act) op een locatie met een lekkende flens (unsafe condition) loopt een vermenigvuldigd risico. Het Safety Observation Process richt zich op beide dimensies. We observeren niet alleen wat mensen doen, maar ook in welke omgeving ze het doen. Deze holistische benadering is essentieel voor een effectief veiligheidsmanagement."
        ],
        "wistje": "Wist je dat de Heinrich-triangle inmiddels is verfijnd door modern onderzoek? Waar Heinrich uitging van een vaste verhouding, toont recent onderzoek aan dat de verhouding varieert per industrie en bedrijfscultuur. In de procesindustrie is de verhouding vaak minder gunstig door de aanwezigheid van gevaarlijke stoffen zoals V₂O₅ en H₂SO₄.",
        "praktijk": "Phoenix Metals hanteert een gecategoriseerde observation-lijst. Unsafe acts worden genoteerd met gedragscode (bijv. PBM-01 = geen veiligheidsbril, PROC-03 = procedure niet gevolgd). Unsafe conditions krijgen een locatiecode en risicoclassificatie (1-5). Dit stelt ons in staat trends per categorie te analyseren en gericht maatregelen te nemen.",
        "vraag": "Welke combinatie levert het hoogste risico op?",
        "opties": ["Unsafe act + unsafe condition tegelijkertijd", "Alleen een unsafe act", "Alleen een unsafe condition", "Geen van beide is gevaarlijk bij Phoenix Metals"],
        "correct": 0
    },
    {
        "title": "De STOP-methode: Look-Think-Act",
        "content": [
            "De STOP-methode (Safety Training Observation Program) is een bewezen techniek voor het uitvoeren van safety observations. Het acroniem staat voor: Stop, Look, Think, Act. Deze vier stappen zorgen voor een gestructureerde en doordachte benadering van elke observation. Bij Phoenix Metals gebruiken we deze methode als basis voor alle safety observations op zowel PlantOne IJmuiden als Rotterdam.",
            "STAP 1 — STOP: Neem bewust de tijd om te pauzeren en je over te geven aan de observatie. Schakel afleidingen uit, leg andere taken weg en focus op wat er om je heen gebeurt. Vaak zijn we zo gefocust op onze eigen taak dat we onveilige situaties niet opmerken. Stoppen betekent: ik kijk nu bewust naar veiligheid. Dit is een keuze, geen toeval. Het vereist discipline om deze keuze bewust te maken, vooral tijdens drukke productieperiodes.",
            "STAP 2 — LOOK: Observeer systematisch wat er gebeurt. Kijk naar medewerker(s), werkplek, gereedschappen, PBM's, procedures. Gebruik een mentale checklist: Worden de juiste PBM's gedragen? Is de werkplek opgeruimd? Worden procedures gevolgd? Zijn er afwijkingen? Let op details: een half gezichtsmasker dat niet goed aansluit bij V₂O₅-handling, een gereedschap dat op de verkeerde plek ligt, een medewerker die afgeleid lijkt. Elke detail kan het verschil maken.",
            "STAP 3 — THINK: Analyseer wat je hebt gezien. Is het veilig of onveilig? Wat is het mogelijke gevolg? Hoe ernstig is het risico? Is het een eenmalige afwijking of een structureel probleem? Bedenk ook de context: is de medewerker onder tijdsdruk? Ontbreekt er materiaal? Is de procedure onduidelijk? Het denken-stadium is essentieel om tot een goed oordeel te komen. Voorkom dat je impulsief reageert op basis van een eerste indruk.",
            "STAP 4 — ACT: Neem actie op basis van je analyse. Dit kan een positieve bevestiging zijn ('Goed gezien dat je je gezichtsmasker controleert voor je de reactor opent!') of een correctieve interventie ('Ik zie dat je geen zuurbestendige handschoenen draagt bij het hanteren van H₂SO₄. Laten we dat nu even oplossen en bespreken waarom dit belangrijk is.'). Act betekent ook: registreer de observation in het formulier."
        ],
        "wistje": "Wist je dat de STOP-methode oorspronkelijk is ontwikkeld door DuPont in de jaren '80? Het bedrijf reduceerde hun ongevalscijfer met meer dan 90% na implementatie van het programma. De methode is inmiddels wereldwijd de standaard in de (petro)chemische industrie en wordt gebruikt door bedrijven als Shell, BASF en Dow Chemical.",
        "praktijk": "Bij Phoenix Metals trainen we alle medewerkers in de STOP-methode. Elke maand oefenen we met praktijksituaties op de vloer. Bijvoorbeeld: een operator is bezig met het vullen van een reactor met V₂O₅-poeder. De observer volgt de STOP-stappen en noteert bevindingen. Na afloop bespreken ze de observation. Dit doen we met alle 8 functies in de organisatie.",
        "vraag": "Wat is de juiste volgorde van de STOP-methode?",
        "opties": ["Stop → Look → Think → Act", "Look → Stop → Act → Think", "Act → Think → Look → Stop", "Think → Stop → Look → Act"],
        "correct": 0
    },
    {
        "title": "Feedback Geven: Positief en Corrigerend",
        "content": [
            "Feedback is de kern van elke safety observation. Zonder feedback is een observation slechts een waarneming. Met feedback wordt het een leermoment. Effectieve feedback kent twee vormen: positieve feedback (bevestiging van veilig gedrag) en corrigerende feedback (aanspreekking op onveilig gedrag). Beide vormen vereisen specifieke vaardigheden en een juiste instelling. De kunst is om beide soorten feedback op een constructieve manier te geven.",
            "Positieve feedback is minstens zo belangrijk als corrigerende feedback, maar wordt vaak vergeten. Waarom? Omdat veilig gedrag 'normaal' is en we geneigd zijn alleen afwijkingen op te merken. Echter, positieve feedback versterkt het gewenste gedrag en motiveert medewerkers om veilig te blijven werken. Een simpel 'Goed dat je je PBM's draagt' of 'Ik zag dat je de procedure perfect volgde bij het afsluiten van de NaOH-pomp' kan een enorm verschil maken in de veiligheidscultuur.",
            "Corrigerende feedback vereist meer vaardigheid. Het doel is gedragsverandering, niet beschaming. De GROW-methode (Goal, Reality, Options, Will) kan helpen: stel de vraag wat het veiligheidsdoel is, bespreek de huidige realiteit, onderzoek opties voor verbetering en spreek af wat de medewerker zal doen. Belangrijk: focus op het gedrag, niet op de persoon. Zeg niet 'Jij bent onvoorzichtig', maar 'Ik zag dat je de leuning niet gebruikte op de loopbrug. Wat is daar de reden van?'",
            "De SBI-methode (Situation-Behavior-Impact) is een effectieve structuur: 'Toen je vanmiddag het H₂SO₄-doseersysteem reinigde [Situation], zag ik dat je geen zuurbestendige handschoenen droeg [Behavior]. Het risico is dat je huid in contact komt met geconcentreerd zwavelzuur, wat direct ernstige brandwonden veroorzaakt [Impact]. Laten we ervoor zorgen dat je altijd de juiste handschoenen pakt.' Deze structuur maakt feedback specifiek en begrijpelijk.",
            "Timing is cruciaal. Geef feedback zo snel mogelijk na de observation, bij voorkeur direct ter plekke. Hoe langer je wacht, hoe minder effectief de feedback wordt. Vermijd echter feedback geven als je emotioneel bent. Kies het juiste moment en de juiste setting: positieve feedback kan openbaar (versterkt de boodschap voor anderen), corrigerende feedback bij voorkeur één-op-één (beschermt de waardigheid van de medewerker)."
        ],
        "wistje": "Wist je dat onderzoek aantoont dat een verhouding van minimaal 3 positieve feedback-momenten per 1 correctief moment nodig is om een cultuur van vertrouwen te bouwen? In veel bedrijven is deze verhouding omgekeerd, wat leidt tot een strafcultuur waarin medewerkers observations gaan vermijden en incidenten verbergen.",
        "praktijk": "Phoenix Metals streeft naar een 4:1 verhouding (positief:correctief). In de wekelijkse toolbox-meeting delen we minimaal 4 positieve observations. Leidinggevenden krijgen training in feedback-technieken. Stijn van Zelst benadrukt: 'Elke observation is een kans om iemand beter te maken, niet om iemand af te straffen.'",
        "vraag": "Wat is de aanbevolen verhouding tussen positieve en corrigerende feedback?",
        "opties": ["Minimaal 3:1 (positief:correctief)", "1:1 is voldoende", "Alleen correctieve feedback is nodig", "1:3 (positief:correctief)"],
        "correct": 0
    },
    {
        "title": "Registratie en het Safety Observation Formulier",
        "content": [
            "Elke safety observation wordt geregistreerd in het Safety Observation Formulier (SOF). Dit formulier is het instrument waarmee we observations vastleggen, analyseren en opvolgen. Het SOF bevat de volgende velden: datum/tijd, locatie (PlantOne IJmuiden of Rotterdam), naam observer, naam geobserveerde medewerker (optioneel bij anonieme observations), type (unsafe act/unsafe condition/veilig gedrag), beschrijving, risicoclassificatie, genomen actie en opvolging.",
            "Het correct invullen van het SOF is essentieel voor de kwaliteit van de data. Een vage beschrijving als 'medewerker werkte onveilig' is nutteloos. Een goede beschrijving is specifiek: 'Medewerker opende het inspectieluik van reactor R-201 zonder eerst de LOTO-procedure uit te voeren. Geen lockout tag aanwezig. V₂O₅-stofwolk zichtbaar bij opening. Direct actie ondernomen: werk stilgelegd, procedure herstart.' Dit niveau van detail maakt trending en analyse mogelijk.",
            "Bij Phoenix Metals gebruiken we een digitaal SOF-systeem dat toegankelijk is via de tablets op de werkvloer. Het systeem bevat voorgedefinieerde categorieën voor zowel acts als conditions, gekoppeld aan de specifieke risico's van onze installatie. Denk aan categorieën als: PBM-gebruik, procedure-naleving, huisvesting/huishouding, ergonomie, elektrische veiligheid, werken op hoogte, en omgang met gevaarlijke stoffen (V₂O₅, H₂SO₄, NaOH).",
            "De risicoclassificatie op het SOF volgt de Phoenix Metals Risk Matrix (5x5): waarschijnlijkheid (1=zeldzaam tot 5=veelvoorkomend) maal ernst (1=verwaarloosbaar tot 5=catastrofaal). Een risicoscore van 15+ vereist directe actie en melding aan de HSEQ-coördinator. Scores tussen 8-14 vereisen actie binnen 24 uur. Scores onder 8 worden opgenomen in de wekelijkse trending. Dit classificatiesysteem zorgt ervoor dat we onze beperkte middelen inzetten waar het meest nodig is.",
            "Anonieme observations zijn bij Phoenix Metals toegestaan en worden zelfs aangemoedigd. Niet elke medewerker voelt zich comfortabel bij het direct aanspreken van een collega of leidinggevende. Het SOF-systeem biedt de optie om anoniem een observation in te dienen. Deze worden met dezelfde prioriteit behandeld als naam-observations. Dit is een belangrijk element van de no-blame cultuur."
        ],
        "wistje": "Wist je dat bedrijven die digitale observation-formulieren gebruiken gemiddeld 3x meer observations registreren dan bedrijven met papieren formulieren? De laagdrempeligheid van een tablet-formulier op de vloer maakt het verschil. Phoenix Metals heeft dit in 2025 geïmplementeerd en zag het aantal observations stijgen van gemiddeld 8 per week naar 25 per week.",
        "praktijk": "Elke maandagochtend analyseert de HSEQ-coördinator alle SOF's van de afgelopen week. De resultaten worden gepresenteerd in de toolbox-meeting op dinsdag. Trends worden weergegeven op het veiligheidsbord bij de kleedkamers. Het doel: transparantie over wat we zien, wat we doen en wat we verbeteren.",
        "vraag": "Wat is het minimaal vereiste detailniveau bij het invullen van een Safety Observation Formulier?",
        "opties": ["Specifieke beschrijving van gedrag/situatie, locatie, risico en genomen actie", "Een korte opmerking volstaat", "Alleen de naam van de medewerker", "Alleen de datum en locatie"],
        "correct": 0
    },
    {
        "title": "Trending en Analyse van Observations",
        "content": [
            "Het verzamelen van safety observations is slechts de eerste stap. De ware kracht zit in het analyseren van trends over tijd. Trending stelt Phoenix Metals in staat om patronen te herkennen: welke onveilige gedragingen komen het meest voor? Op welke locaties worden de meeste observations gedaan? Zijn er seizoenspatronen? Zijn er specifieke teams of shifts die opvallen? Deze inzichten sturen ons preventiebeleid.",
            "De maandelijkse trending-rapportage bij Phoenix Metals bevat minimaal: totaal aantal observations (per type: positief/unsafe act/unsafe condition), top-5 categorieën van unsafe acts, top-5 locaties met de meeste observations, verhouding positief:correctief per team, trend over de afgelopen 12 maanden (lijngrafiek), en het aantal openstaande opvolgacties. Deze rapportage wordt besproken in het maandelijkse veiligheidscomité onder leiding van Stijn van Zelst.",
            "Een belangrijk analytisch instrument is de 'Heatmap': een visuele weergave van waar observations plaatsvinden op de installatie. Bij Phoenix Metals zien we bijvoorbeeld dat het reactorgebied (waar V₂O₅ wordt verwerkt) een disproportioneel aantal observations genereert rondom PBM-gebruik. Dit leidt tot gerichte acties: extra PBM-training, betere beschikbaarheid van maskers, en een herziening van de PBM-matrix voor dit gebied.",
            "Benchmarking is een ander analytisch instrument. Phoenix Metals vergelijkt zijn observation-data met branche- en eigen historische data. De Industry Standard voor het aantal observations per medewerker per maand is 2-4. Phoenix Metals streeft naar het bovensegment: 4 observations per medewerker per maand. We meten niet alleen kwantiteit maar ook kwaliteit: het percentage observations met volledig ingevulde opvolging.",
            "Predictive analytics is de volgende stap. Door observation-data te combineren met andere data (onderhoudslogs, near-miss rapportages, weerdata, productieschema's) kunnen we voorspellen waar en wanneer risico's waarschijnlijk toenemen. Bijvoorbeeld: als we zien dat observations rondom procedure-naleving stijgen in de periode na een onderhoudsstop, kunnen we proactief extra toolbox-sessies plannen."
        ],
        "wistje": "Wist je dat de metaalindustrie wereldwijd toonaangevend is in het gebruik van predictive analytics voor veiligheid? Bedrijven als ArcelorMittal en Tata Steel gebruiken AI-modellen die observation-data combineren met productiedata om risico's te voorspellen met een nauwkeurigheid van meer dan 80%.",
        "praktijk": "Phoenix Metals publiceert maandelijks een Safety Observation Dashboard op het intranet. Het dashboard toont real-time data uit het SOF-systeem. Alle medewerkers hebben toegang. Transparantie is een kernwaarde: we verbergen geen cijfers maar gebruiken ze als hefboom voor verbetering.",
        "vraag": "Wat is het belangrijkste doel van trending en analyse van safety observations?",
        "opties": ["Patronen herkennen en gericht maatregelen nemen", "Medewerkers controleren en bestraffen", "Rapporten produceren voor de directie", "Aantonen dat we voldoende observations doen"],
        "correct": 0
    },
    {
        "title": "Koppeling met KPI's en Leading Indicators",
        "content": [
            "Safety observations zijn een zogenaamde 'leading indicator': een voorspellende indicator die aangeeft hoe het met de veiligheidscultuur is gesteld vóórdat er een incident plaatsvindt. Dit in tegenstelling tot 'lagging indicators' zoals ongevallencijfers, die pas na het feit meten. Phoenix Metals gebruikt beide typen indicatoren in een gebalanceerde KPI-set voor veiligheid.",
            "De leading indicator KPI's voor safety observations bij Phoenix Metals zijn: (1) Observatiedichtheid = aantal observations per medewerker per maand (doel: ≥4), (2) Positiefratio = percentage positieve observations (doel: ≥75%), (3) Opvolgingspercentage = percentage observations met volledig afgeronde opvolging (doel: ≥90%), (4) Gemiddelde reactietijd = tijd tussen observation en afgeronde actie (doel: <48 uur), (5) Dekkingsgraad = percentage medewerkers dat minimaal 1x per maand wordt geobserveerd (doel: 100%).",
            "Deze KPI's worden maandelijks gerapporteerd aan het management en kwartaalklijks besproken in het Management Review. Stijn van Zelst stelt: 'De KPI's zijn geen doel op zich, maar een barometer van onze veiligheidscultuur. Als de positiefratio daalt, is dat een signaal dat we meer moeten investeren in positieve feedback. Als het opvolgingspercentage daalt, moet de organisatiecapaciteit voor opvolging worden vergroot.'",
            "De koppeling tussen observations en incidenten is empirisch aangetoond. Onderzoek toont aan dat een stijging in het aantal observations (met voldoende kwaliteit) leidt tot een daling van het aantal near misses en incidenten met 20-40% binnen 6-12 maanden. Dit is de business case voor safety observations: investeren in observatie levert een meetbare veiligheidswinst op.",
            "De KPI's worden ook gebruikt in de samenwerking met opdrachtgevers. Veel klanten in de (petro)chemische industrie eisen inzicht in het veiligheidsmanagement van hun leveranciers. Phoenix Metals kan met zijn observation-KPI's aantonen dat we een proactieve veiligheidscultuur hebben. Dit is een concurrentievoordeel."
        ],
        "wistje": "Wist je dat de term 'leading indicator' afkomstig is uit de economie? Net als economische leading indicators (zoals bouwvergunningen) voorspellen, voorspelen veiligheids-leading indicators de toekomstige veiligheidsprestaties.",
        "praktijk": "Elke vrijdag wordt de KPI-kaart bijgewerkt op het veiligheidsbord. Medewerkers kunnen zien hoe we scoren op elke indicator. Bij afwijkingen wordt in de toolbox-meeting uitgelegd wat de oorzaak is en welke actie wordt ondernomen. Dit creëert betrokkenheid bij alle 8 functies.",
        "vraag": "Wat is het verschil tussen een leading en een lagging indicator?",
        "opties": ["Leading = voorspellend (vóór incident); Lagging = achteraf (na incident)", "Leading is minder belangrijk dan lagging", "Er is geen verschil", "Lagging is voorspellend; leading is achteraf"],
        "correct": 0
    },
    {
        "title": "De No-Blame Cultuur",
        "content": [
            "De no-blame cultuur is de basis waarop het hele Safety Observation Process rust. Zonder no-blame cultuur durven medewerkers geen observations te doen, durven ze geen onveilig gedrag aan te spreken en durven ze geen near misses te rapporteren. De no-blame cultuur betekent niet dat alles kan en mag — het betekent dat we fouten zien als leermomenten, niet als strafmomenten.",
            "Er is een belangrijk onderscheid tussen 'no-blame' en 'no-accountability'. No-blame betekent niet dat medewerkers niet verantwoordelijk zijn voor hun gedrag. Het betekent dat de eerste reactie op een fout of onveilig situatie gericht is op begrijpen en verbeteren, niet op straffen. Als een medewerker herhaaldelijk bewust veiligheidsregels overtreedt, is er wel degelijk sprake van accountability. De grens ligt bij opzet en roekeloosheid versus een eerlijke fout of gebrek aan kennis.",
            "Just Culture is het model dat Phoenix Metals hanteert. Dit model, ontwikkeld door James Reason, onderscheidt drie categorieën gedrag: (1) Menselijke fout (human error) — onbedoeld, verdient empathie en systeemverbetering, (2) At-risk gedrag — bewuste afweging met onvoldoende risicobesef, verdient coaching, (3) Reckless gedrag — bewuste schending van bekende regels, verdient disciplinaire maatregel. Elke observation wordt beoordeeld in dit kader.",
            "Bij Phoenix Metals passen we de Just Culture als volgt toe: als een operator per ongeluk een klep openzet in de verkeerde volgorde bij het V₂O₅-proces (human error), onderzoeken we de procedure, de training en de interface. Was de procedure duidelijk? Was de training voldoende? Was de klep correct gelabeld? De medewerker wordt niet gestraft maar krijgt bij-training. Als dezelfde operator echter bewust een bypass activeert op het veiligheidssysteem (reckless), is disciplinaire actie aangewezen.",
            "De no-blame cultuur begint bij de top. Stijn van Zelst (MD) heeft expliciet verklaard: 'Fouten maken mag. Fouten verbergen niet.' Dit statement is de basis van de veiligheidscultuur bij Phoenix Metals. Elke leidinggevende wordt getraind in het toepassen van de Just Culture en in het geven van constructieve feedback."
        ],
        "wistje": "Wist je dat bedrijven met een sterke Just Culturecultuur tot 60% minder incidenten ervaren? Uit onderzoek van Boeing (2015) blijkt dat werknemers in een Just Cultuur 3x eerder onveilige situaties rapporteren dan in een strafcultuur, omdat ze weten dat de focus ligt op oplossingen, niet op schuldvraagstukken.",
        "praktijk": "Stijn van Zelst (MD) heeft de Just Culture expliciet geïntegreerd in ons veiligheidsbeleid. Er is een onafhankelijke reviewcommissie die alle incidenten beoordeelt volgens het Just Culture-model. Deze commissie bestaat uit medewerkers uit verschillende functies, niet alleen managers. Dit zorgt voor objectiviteit en begrip voor de complexiteit van ons werk.",
        "vraag": "Wat is het verschil tussen menselijke fout en roekeloos gedrag?",
        "opties": ["Menselijke fout = onbedoeld; roekeloos = bewust schending", "Menselijke fout = altijd te vermijden; roekeloos = acceptabel", "Er is geen verschil", "Menselijke fout = strafbaar; roekeloos = acceptabel"],
        "correct": 0
    },
    {
        "title": "De Rol van Leidinggevenden",
        "content": [
            "Leidinggevenden bij Phoenix Metals hebben een cruciale rol in het Safety Observation Process. Ze zijn niet alleen verantwoordelijk voor het uitvoeren van observations, maar ook voor het creëren en onderhouden van de veiligheidscultuur. De leidinggevende is het voorbeeld: als de manager veilig gedrag laat zien, volgen medewerkers automatisch. Dit heet 'behavioral leadership'.",
            "De rol van leidinggevenden omvat: (1) Het zelf uitvoeren van safety observations (minimaal 2 per week), (2) Het stimuleren en coachen van teamleden om observations te doen, (3) Het bespreken van observation-resultaten in teamvergaderingen, (4) Het zorgen voor opvolging van acties, (5) Het tonen van zichtbare commitment aan veiligheid (visible leadership), en (6) Het zetten van de standaarden voor veiligheidsgedrag.",
            "Visible leadership is misschien wel het belangrijkste aspect. Een manager die dagelijks veiligheid bespreekt, die zelf veilig gedrag toont, die vragen stelt over veiligheid tijdens walk-throughs, en die tijd investeert in veiligheidstrainingen, creëert een cultuur waarin veiligheid prioriteit heeft. Visible leadership is geen 'extra taak' maar het kernvak van elke manager bij Phoenix Metals.",
            "De HSEQ-coördinator ondersteunt leidinggevenden door: het beschikbaar stellen van trainingen, het analyseren van observation-data, het identificeren van trends, en het voorstellen van gerichte acties. Samen vormen leidinggevenden en de HSEQ-coördinator een 'veiligheidsteam' dat continu verbeterd.",
            "De relatie tussen leidinggevenden en medewerkers is essentieel. Een cultuur waarin medewerkers durven zeggen 'Mijn manager stelt vragen over veiligheid, controleert niet' is een gezonde cultuur. Dit betekent dat de focus ligt op collectieve verantwoordelijkheid, niet op hiërarchische controle. De manager is coach, niet controller.",
            "Leidinggevenden worden getraind in safety observation door middel van 'train-the-trainer' sessies. Elke leidinggevende leert de STOP-methode, feedback geven, observation-formulieren invullen en data analyseren. Deze training wordt periodiek herhaald om de vaardigheden scherp te houden. De training is praktisch: we oefenen met echte situaties op de vloer van PlantOne en Rotterdam."
        ],
        "wistje": "Wist je dat onderzoek aantoont dat visible leadership de belangrijkste factor is voor veiligheidscultuur? Een studie van DeJoy et al. (2010) liet zien dat leidinggevenden die minimaal 30% van hun tijd besteden aan veiligheid, teams hebben met 40% minder incidenten. Het gaat niet om hoeveel tijd besteed wordt, maar hoe effectief die tijd ingezet wordt.",
        "praktijk": "Bij Phoenix Metals hebben we een 'Safety Leadership Dashboard' voor managers. Dit dashboard toont: eigen observaties, team-observaties, trends in het team, en openstaande acties. De managers ontvangen wekelijks een rapport en bespreken dit in hun team. Dit zorgt voor continu aandacht voor veiligheid, niet alleen bij audits of incidenten.",
        "vraag": "Wat is de belangrijkste rol van een leidinggevende in het Safety Observation Process?",
        "opties": ["Zichtbaar commitment tonen en veiligheid bevorderen", "Incidenten onderzoeken en bestraffen", "Observations alleen uitvoeren, niet bespreken", "Regels opstellen en handhaven"],
        "correct": 0
    },
    {
        "title": "Continuous Improvement en BBS Programma",
        "content": [
            "Continuous improvement (continue verbetering) is de drijvende kracht achter het Safety Observation Process bij Phoenix Metals. We geloven in de filosofie van Plan-Do-Check-Act: plannen observaties, uitvoeren op de vloer, resultaten analyseren, en verbeteringen implementeren. Deze cyclus zorgt ervoor dat we onze veiligheidscultuur voortdurend ontwikkelen en aanpassen aan veranderende omstandigheden.",
            "Het Behavioral Based Safety (BBS) programma van Phoenix Metals is integraal verbonden met het Safety Observation Process. Het BBS-programma omvat: (1) Veiligheidsobservaties en feedback, (2) Gedrags-veiligheidsteams, (3) Risicoperceptietraining, (4) Proactieve veiligheidsbetrokkenheid, en (5) Continue verbetering van systemen. Het BBS-programma wordt kwartaal-lijks geëvalueerd op effectiviteit.",
            "Veiligheidsbetrokkenheid is een sleutelcomponent van ons BBS-programma. Medewerkers worden aangemoedigd om: (1) Actief deel te nemen aan observations, (2) Veiligheidsinitiatieven voor te stellen, (3) Vragen te stellen over veiligheid, en (4) Feedback te geven op veiligheidsprocedures. Betrokkenheid meten we via de 'Employee Safety Engagement Survey' die elk kwartaal wordt uitgevoerd.",
            "Het Veiligheidscomité van Phoenix Metals, onder leiding van Stijn van Zelst, fungeert als stuurgroep voor het BBS-programma. Het comité bestaat uit vertegenwoordigers van alle 8 functies en komt maandelijks bijeen om de voortgang te bespreken, prioriteiten te bepalen en acties te monitoren. De beslissingen van het comité worden communiceerd via het intranet en teamvergaderingen.",
            "Veiligheid is geen doel, maar een reis. Bij Phoenix Metals richten we ons op voortdurende verbetering door: (1) Maandelijkse trending-analyses, (2) Kwartaal-lijks BBS-teamoverleg, (3) Halfjaarlijkse veiligheidsaudits, (4) Jaarlijkse updates van het veiligheidsbeleid, en (5) Proactieve implementatie van nieuwe veiligheidsnormen en technologieën. Deze aanpak zorgt ervoor dat we voorop blijven lopen in veiligheidsmanagement."
        ],
        "wistje": "Wist je dat companies met een actief BBS-programma hun totale ongevallencijfer met gemiddeld 40% kunnen verlagen? Volgens onderzoek van Marsh McLennan (2021) bedrijven met een doorgedreven BBS-programma niet alleen minder incidenten hebben, maar ook een betere bedrijfsprestaties en hogere medewerkerstevredenheid ervaren.",
        "praktijk": "Elk half jaar organiseren we een 'Safety Improvement Workshop' waarin medewerkers leiders en HSEQ specifieke verbeteringsvoorstellen doen op basis van observation-data. Bijvoorbeeld: na het zien van meerdere unsafe acts bij het werken met chemische stoffen, hebben we een nieuwe PBM-training ontwikkeld met meer praktijkonderdelen. Deze wordt vervolgens geëvalueerd op effectiviteit.",
        "vraag": "Wat is het belangrijkste doel van het BBS-programma bij Phoenix Metals?",
        "opties": ["Gedragsverandering en cultuurverbetering", "Automatisering van veiligheidscontroles", "Voldoen aan wettelijke verplichtingen", "Reductie van directe kosten"],
        "correct": 0
    }
]

# Generate HTML content
modules_html = ""
for i, module in enumerate(modules):
    modules_html += f"""
    <div class="module" id="module-{i}">
        <h2 class="module-title">{module["title"]}</h2>
        <div class="content">
            <p>{module["content"][0]}</p>
            <p>{module["content"][1]}</p>
            <p>{module["content"][2]}</p>
            <p>{module["content"][3]}</p>
            <p>{module["content"][4]}</p>
            
            <div class="wistje">
                <h3>📖 Wist je dat?</h3>
                <p>{module["wistje"]}</p>
            </div>
            
            <div class="praktijk">
                <h3>🏭 Phoenix Metals Praktijk</h3>
                <p>{module["praktijk"]}</p>
            </div>
            
            <div class="question">
                <h3>Controlevraag:</h3>
                <p>{module["vraag"]}</p>
                <div class="options">
                    <label class="option">
                        <input type="radio" name="q{i}" value="0">
                        {module["opties"][0]}
                    </label>
                    <label class="option">
                        <input type="radio" name="q{i}" value="1">
                        {module["opties"][1]}
                    </label>
                    <label class="option">
                        <input type="radio" name="q{i}" value="2">
                        {module["opties"][2]}
                    </label>
                    <label class="option">
                        <input type="radio" name="q{i}" value="3">
                        {module["opties"][3]}
                    </label>
                </div>
            </div>
        </div>
    </div>
"""

# Current date
current_date = datetime.now().strftime("%d-%m-%Y")

# Final HTML
html_content = f"""<!DOCTYPE html>
<html lang="nl">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Phoenix Metals - Safety Observation Process eLearning</title>
    <style>
        :root {{
            --primary: #003366;
            --secondary: #1a5276;
            --background: #e8f4f8;
            --accent: #f39c12;
            --error: #e74c3c;
            --success: #27ae60;
            --text: #1F2937;
        }}
        
        * {{
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }}
        
        body {{
            font-family: 'Calibri', Arial, sans-serif;
            background-color: var(--background);
            color: var(--text);
            line-height: 1.6;
            position: relative;
        }}
        
        .container {{
            max-width: 1200px;
            margin: 0 auto;
            padding: 20px;
            background-color: white;
            box-shadow: 0 0 10px rgba(0,0,0,0.1);
            margin-top: 20px;
            margin-bottom: 20px;
            border-radius: 8px;
        }}
        
        header {{
            background-color: var(--primary);
            color: white;
            padding: 30px 0;
            text-align: center;
            margin-bottom: 30px;
        }}
        
        h1 {{
            font-size: 2.5rem;
            margin-bottom: 10px;
        }}
        
        .subtitle {{
            font-size: 1.2rem;
            opacity: 0.9;
        }}
        
        .progress-container {{
            position: sticky;
            top: 0;
            background-color: white;
            padding: 15px 0;
            box-shadow: 0 2px 5px rgba(0,0,0,0.1);
            z-index: 1000;
        }}
        
        .progress-bar {{
            width: 100%;
            height: 10px;
            background-color: #e0e0e0;
            border-radius: 5px;
            overflow: hidden;
            margin-top: 10px;
        }}
        
        .progress {{
            height: 100%;
            background-color: var(--accent);
            transition: width 0.3s ease;
        }}
        
        .module {{
            background-color: white;
            padding: 30px;
            margin-bottom: 30px;
            border-radius: 8px;
            box-shadow: 0 2px 5px rgba(0,0,0,0.05);
            border-left: 5px solid var(--primary);
        }}
        
        .module-title {{
            font-size: 1.8rem;
            color: var(--primary);
            margin-bottom: 20px;
            padding-bottom: 10px;
            border-bottom: 2px solid var(--background);
        }}
        
        .content p {{
            margin-bottom: 15px;
            font-size: 1.1rem;
            line-height: 1.7;
        }}
        
        .wistje {{
            background-color: var(--background);
            padding: 20px;
            border-radius: 8px;
            margin: 20px 0;
            border-left: 4px solid var(--accent);
        }}
        
        .wistje h3 {{
            color: var(--accent);
            margin-bottom: 10px;
            font-size: 1.2rem;
        }}
        
        .praktijk {{
            background-color: rgba(42, 157, 143, 0.1);
            padding: 20px;
            border-radius: 8px;
            margin: 20px 0;
            border-left: 4px solid var(--success);
        }}
        
        .praktijk h3 {{
            color: var(--success);
            margin-bottom: 10px;
            font-size: 1.2rem;
        }}
        
        .quiz-container {{
            background-color: #f9f9f9;
            padding: 25px;
            border-radius: 8px;
            margin: 30px 0;
        }}
        
        .question {{
            margin-bottom: 20px;
        }}
        
        .question h3 {{
            color: var(--primary);
            margin-bottom: 15px;
            font-size: 1.3rem;
        }}
        
        .options {{
            margin-left: 20px;
        }}
        
        .option {{
            margin-bottom: 10px;
            display: flex;
            align-items: center;
            cursor: pointer;
            padding: 10px;
            border-radius: 5px;
            transition: background-color 0.2s;
        }}
        
        .option:hover {{
            background-color: #f0f0f0;
        }}
        
        .option input[type="radio"] {{
            margin-right: 10px;
            transform: scale(1.2);
        }}
        
        .btn {{
            background-color: var(--primary);
            color: white;
            padding: 12px 30px;
            border: none;
            border-radius: 5px;
            font-size: 1rem;
            cursor: pointer;
            transition: background-color 0.3s;
            display: inline-block;
            margin-top: 20px;
        }}
        
        .btn:hover {{
            background-color: var(--secondary);
        }}
        
        .certificate {{
            background-color: #f9f9f9;
            padding: 30px;
            border-radius: 8px;
            text-align: center;
            margin: 30px 0;
            display: none;
        }}
        
        .certificate h2 {{
            color: var(--primary);
            margin-bottom: 20px;
        }}
        
        .certificate p {{
            margin-bottom: 15px;
            font-size: 1.1rem;
        }}
        
        footer {{
            background-color: var(--primary);
            color: white;
            padding: 20px 0;
            text-align: center;
            margin-top: 40px;
        }}
        
        #modulesContent {{
            display: none;
        }}
        
        #welcome {{
            text-align: center;
            padding: 40px 20px;
        }}
        
        .welcome p {{
            margin-bottom: 15px;
        }}
    </style>
</head>
<body>
    <div class="progress-container">
        <div class="progress-bar">
            <div class="progress" id="progressBar" style="width: 0%"></div>
        </div>
    </div>
    
    <header>
        <h1>Phoenix Metals B.V.</h1>
        <div class="subtitle">Safety Observation Process eLearning</div>
    </header>
    
    <div class="container">
        <div class="welcome" id="welcome">
            <h2>Welkom bij de e-learning over Safety Observation Process</h2>
            <p>Deze e-learning behandelt het Safety Observation Process bij Phoenix Metals B.V., een essentieel onderdeel van ons Behavioral Based Safety (BBS) programma. Na het voltooien van deze e-learning begrijp je hoe je effectief observations kunt uitvoeren, feedback kunt geven en hoe dit bijdraagt aan een veiligere werkomgeving.</p>
            <p>Lange duur: ongeveer 60-90 minuten. Klik door de modules, lees aandachtig en beantwoord de vragen aan het einde om je certificaat te ontvangen.</p>
            <button class="btn" onclick="document.getElementById('welcome').style.display = 'none'; document.getElementById('modulesContent').style.display = 'block'; document.getElementById('module-0').scrollIntoView({{ behavior: 'smooth' }});">Start e-learning</button>
        </div>
        
        <div id="modulesContent">
            {modules_html}
            
            <div class="quiz-container">
                <h2>Toets: Safety Observation Process</h2>
                <p>Beantwoord de volgende vragen. Je moet 80% goed hebben om te slagen.</p>
                
                {"".join([f"""
                <div class="question">
                    <h3>Module {i+1}: {module["title"]}</h3>
                    <p>{module["vraag"]}</p>
                    <div class="options">
                        <label class="option">
                            <input type="radio" name="q{i+1}" value="0">
                            {module["opties"][0]}
                        </label>
                        <label class="option">
                            <input type="radio" name="q{i+1}" value="1">
                            {module["opties"][1]}
                        </label>
                        <label class="option">
                            <input type="radio" name="q{i+1}" value="2">
                            {module["opties"][2]}
                        </label>
                        <label class="option">
                            <input type="radio" name="q{i+1}" value="3">
                            {module["opties"][3]}
                        </label>
                    </div>
                </div>
                """ for i, module in enumerate(modules)])}
                
                <button class="btn" onclick="checkQuiz()">Beantwoord alle vragen</button>
            </div>
            
            <div class="certificate" id="certificate">
                <h2>Certificaat</h2>
                <p>Je hebt de e-learning Safety Observation Process succesvol afgerond!</p>
                <p>Certificaatnummer: PM_T13_{datetime.now().strftime("%Y%m%d")}_{random.randint(1000,9999)}</p>
                <p>Uitgereikt aan: [Je naam]</p>
                <p>Datum: {current_date}</p>
                <button class="btn" onclick="window.print()">Certificaat afdrukken</button>
            </div>
        </div>
    </div>
    
    <footer>
        <p>JvG Consultancy | Safety • Governance • Advisory | © 2026</p>
    </footer>
    
    <script>
        function updateProgress() {{
            const progress = ((window.currentModule || 0) + 1) / {len(modules)} * 100;
            document.getElementById('progressBar').style.width = progress + '%';
        }}
        
        function checkQuiz() {{
            let correct = 0;
            let total = {len(modules)};
            
            // Check each answer
            {len(modules)}.forEach((module, index) => {{
                const correctAnswer = {module["correct"]};
                const selected = document.querySelector(`input[name="q${{index + 1}}"]:checked`);
                
                if (selected && parseInt(selected.value) === correctAnswer) {{
                    correct++;
                }}
            }});
            
            const percentage = Math.round((correct / total) * 100);
            
            if (percentage >= 80) {{
                alert(`Gefeliciteerd! Je hebt ${{correct}}/${{total}} vragen (${{percentage}}%) goed beantwoord. Je certificaat wordt getoond.`);
                document.querySelector('.quiz-container').style.display = 'none';
                document.getElementById('certificate').style.display = 'block';
                document.getElementById('certificate').scrollIntoView({{ behavior: 'smooth' }});
            }} else {{
                alert(`Je hebt ${{correct}}/${{total}} vragen (${{percentage}}%) goed beantwoord. Je moet minimaal 80% goed hebben. Probeer het opnieuw.`);
            }}
        }}
        
        // Add navigation buttons to modules
        document.addEventListener('DOMContentLoaded', function() {{
            const modules = document.querySelectorAll('.module');
            
            modules.forEach((module, index) => {{
                if (index < modules.length - 1) {{
                    const nextBtn = document.createElement('button');
                    nextBtn.className = 'btn';
                    nextBtn.textContent = 'Volgende module';
                    nextBtn.style.marginTop = '20px';
                    nextBtn.onclick = function() {{
                        window.currentModule = index + 1;
                        updateProgress();
                        modules[index + 1].scrollIntoView({{ behavior: 'smooth' }});
                    }};
                    module.appendChild(nextBtn);
                }} else {{
                    const quizBtn = document.createElement('button');
                    quizBtn.className = 'btn';
                    quizBtn.textContent = 'Naar de toets';
                    quizBtn.style.marginTop = '20px';
                    quizBtn.onclick = function() {{
                        document.querySelector('.quiz-container').scrollIntoView({{ behavior: 'smooth' }});
                    }};
                    module.appendChild(quizBtn);
                }}
            }});
        }});
    </script>
</body>
</html>
"""

# Write the HTML file
with open(OUTPUT, 'w', encoding='utf-8') as f:
    f.write(html_content)

print(f"T13 HTML file generated: {OUTPUT}")
print(f"File size: {os.path.getsize(OUTPUT)} bytes")

if os.path.getsize(OUTPUT) >= 30000:
    print("✅ File size requirement met (≥30 KB)")
else:
    print("❌ File size too small (<30 KB)")