#!/usr/bin/env python3
"""
Gold Standard V2.0 Upgrade — VBS Elementen 2 t/m 7
Modulaire generator voor alle BRZO-VBS elementen
Auteur: Kas — JvG Consultancy
"""

import os, json
from datetime import datetime
from docx import Document
from docx.shared import Pt, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import nsdecls
from docx.oxml import parse_xml

TODAY = datetime.now().strftime("%d %B %Y")
VERSION = "2.0"
PRIMARY = RGBColor(0x00,0x33,0x66)
TEXT_DARK = RGBColor(0x1F,0x29,0x37)
WHITE = RGBColor(0xFF,0xFF,0xFF)

def shade(cell, color):
    cell._tc.get_or_add_tcPr().append(parse_xml(f'<w:shd {nsdecls("w")} w:fill="{color}"/>'))

def header(doc, code, title, element_name, iso, brzo):
    p=doc.add_paragraph(); p.alignment=WD_ALIGN_PARAGRAPH.CENTER
    r=p.add_run(title.upper()); r.bold=True; r.font.size=Pt(18); r.font.color.rgb=PRIMARY
    p2=doc.add_paragraph(); p2.alignment=WD_ALIGN_PARAGRAPH.CENTER
    r2=p2.add_run(f"VBS {element_name} - Gold Standard Template"); r2.font.size=Pt(11); r2.font.color.rgb=TEXT_DARK
    t=doc.add_table(rows=5,cols=4); t.style='Table Grid'
    for i,(k1,v1,k2,v2) in enumerate([
        ("Project:","VBS Implementatie [BEDRIJFSNAAM]","Documentcode:",code),
        ("Type:","Procedure / Template","Versie:",VERSION),
        ("Auteur:","JvG Consultancy","Datum:",TODAY),
        ("Status:","GOLD STANDARD TEMPLATE","Classificatie:","Vertrouwelijk"),
        ("ISO 45001:",iso,"BRZO 2015:",brzo)]):
        for j,(key,val) in enumerate([(k1,v1),(k2,v2)]):
            ck=t.rows[i].cells[j*2]; cv=t.rows[i].cells[j*2+1]
            shade(ck,"003366")
            rk=ck.paragraphs[0].add_run(key); rk.bold=True; rk.font.size=Pt(9); rk.font.color.rgb=WHITE
            rv=cv.paragraphs[0].add_run(val); rv.font.size=Pt(9); rv.font.color.rgb=TEXT_DARK
    doc.add_paragraph()

def cmap(doc, iso, brzo, iogp=None):
    p=doc.add_paragraph(); r=p.add_run("COMPLIANCE MAPPING"); r.bold=True; r.font.size=Pt(12); r.font.color.rgb=PRIMARY
    t=doc.add_table(rows=2,cols=3); t.style='Table Grid'
    for i,h in enumerate(["ISO 45001:2018","BRZO 2015","IOGP Report 423"]):
        c=t.rows[0].cells[i]; shade(c,"003366")
        r=c.paragraphs[0].add_run(h); r.bold=True; r.font.size=Pt(9); r.font.color.rgb=WHITE
    for i,items in enumerate([iso,brzo,iogp or ["N.v.t."]]):
        c=t.rows[1].cells[i]
        for item in items:
            r=c.paragraphs[0].add_run(f"  {item}\n"); r.font.size=Pt(8); r.font.color.rgb=TEXT_DARK
    doc.add_paragraph()

def st(doc, num, title):
    p=doc.add_paragraph(); r=p.add_run(f"{num}. {title}"); r.bold=True; r.font.size=Pt(14); r.font.color.rgb=PRIMARY

def bt(doc, text, bold=False):
    p=doc.add_paragraph(); r=p.add_run(text); r.font.size=Pt(11); r.font.color.rgb=TEXT_DARK; r.bold=bold

def bl(doc, text):
    p=doc.add_paragraph(style='List Bullet'); p.clear()
    r=p.add_run(text); r.font.size=Pt(10); r.font.color.rgb=TEXT_DARK

def tbl(doc, headers, rows):
    t=doc.add_table(rows=len(rows)+1,cols=len(headers)); t.style='Table Grid'; t.alignment=WD_TABLE_ALIGNMENT.CENTER
    for i,h in enumerate(headers):
        c=t.rows[0].cells[i]; shade(c,"003366")
        r=c.paragraphs[0].add_run(h); r.bold=True; r.font.size=Pt(9); r.font.color.rgb=WHITE
    for ri,rd in enumerate(rows):
        for ci,v in enumerate(rd):
            c=t.rows[ri+1].cells[ci]
            r=c.paragraphs[0].add_run(str(v)); r.font.size=Pt(9); r.font.color.rgb=TEXT_DARK
            if ri%2==1: shade(c,"F3F4F6")
    doc.add_paragraph()

def src(doc, sources):
    doc.add_paragraph(); p=doc.add_paragraph()
    r=p.add_run("BRONVERWIJZINGEN"); r.bold=True; r.font.size=Pt(12); r.font.color.rgb=PRIMARY
    for i,s in enumerate(sources,1):
        p=doc.add_paragraph(); r=p.add_run(f"[{i}] {s}"); r.font.size=Pt(9); r.font.color.rgb=TEXT_DARK

def tv(doc, checks):
    doc.add_paragraph(); p=doc.add_paragraph()
    r=p.add_run("TIERVERIFY LOG"); r.bold=True; r.font.size=Pt(12); r.font.color.rgb=PRIMARY
    t=doc.add_table(rows=len(checks)+1,cols=4); t.style='Table Grid'
    for i,h in enumerate(["Check","Criterium","Status","Opmerking"]):
        c=t.rows[0].cells[i]; shade(c,"003366")
        r=c.paragraphs[0].add_run(h); r.bold=True; r.font.size=Pt(8); r.font.color.rgb=WHITE
    for ri,(c,cr,s,rm) in enumerate(checks):
        for ci,v in enumerate([c,cr,s,rm]):
            r=t.rows[ri+1].cells[ci].paragraphs[0].add_run(v); r.font.size=Pt(8); r.font.color.rgb=TEXT_DARK

def foot(doc):
    for s in doc.sections:
        f=s.footer; f.is_linked_to_previous=False
        p=f.paragraphs[0]; p.alignment=WD_ALIGN_PARAGRAPH.CENTER
        r=p.add_run("JvG Consultancy | Safety - Governance - Advisory | 2026 | GOLD STANDARD TEMPLATE")
        r.font.size=Pt(8); r.font.color.rgb=RGBColor(0x99,0x99,0x99)


# ═══════════════════════════════════════════════════════════════════════════════
# ELEMENT 2: Gevaaridentificatie & Risicobeoordeling
# ═══════════════════════════════════════════════════════════════════════════════
def gen_element2():
    base="/root/projects/jg/2026-PM-VBS-Element2/deliverables/docx"
    el="Element II: Gevaaridentificatie & -beoordeling"
    iso=["6.1.1 Actions to address risks","6.1.2.1 Hazard identification","6.1.2.2 Risk assessment","6.1.2.3 Opportunities","6.1.3 Legal requirements","6.1.4 Planning action"]
    brzo=["Art. 5 Veiligheidsrapportage","Bijlage III, II: Gevaaridentificatie","Art. 10 Procesveiligheid"]
    iogp=["Phase 1.2: Initial risk assessment","Phase 4.3: Joint risk assessment"]
    docs=[]
    
    # Doc 01 - Stofinventarisatie
    d=Document(); header(d,"PM_VBS02_01","Stofinventarisatie",el,"6.1.2.1, 6.1.3","Art. 5, Bijlage III.II")
    cmap(d,iso,brzo,iogp)
    st(d,1,"Doel en Toepassingsgebied")
    bt(d,"Dit document voorziet in een systematische inventarisatie van alle gevaarlijke stoffen die aanwezig zijn op [LOCATIE] van [BEDRIJFSNAAM], conform ISO 45001 6.1.2.1 [1] en BRZO 2015 Bijlage III, onderdeel II [2].")
    st(d,2,"Inventarisatiemethode")
    bt(d,"De inventarisatie wordt uitgevoerd conform de volgende methodiek:")
    tbl(d,["Stap","Activiteit","Verantwoordelijke","Output"],
        [["1","Identificatie alle stoffen op locatie (inkoop, productie, afval)","[AFDELING] + VBS","Ruwe stoffenlijst"],
         ["2","SDS (Safety Data Sheet) verzamelen per stof","VBS-Coordinator","SDS-dossier"],
         ["3","CLP-classificatie vaststellen (H-zinnen, pictogrammen)","VBS + Milieucoord.","Classificatietabel"],
         ["4","Hoeveelheden per stof bepalen (max. voorraad)","[AFDELING] + Logistiek","Hoeveelheidentabel"],
         ["5","Opslaglocatie en -condities mappen","Logistiek + VBS","Opslagplattegrond"],
         ["6","BRZO-drempelwaarden toetsen (Bijlage I)","VBS-Coordinator","Seveso-classificatie"],
         ["7","PGS 15 / PGS 37 toetsing","VBS-Coordinator","PGS compliance status"]])
    st(d,3,"Stoffenregister Template")
    tbl(d,["Nr","Stofnaam","CAS-nr","CLP-classificatie","H-zinnen","SDS datum","Max. voorraad","Eenheid","Opslaglocatie","PGS categorie","BRZO drempelwaarde"],
        [["1","[STOFNAAM]","[CAS]","[CLP]","[H-ZINNEN]","[DATUM]","[HOEVEELHEID]","[EENHEID]","[LOCATIE]","[PGS]","[DREMPEL]"],
         ["2","[STOFNAAM]","[CAS]","[CLP]","[H-ZINNEN]","[DATUM]","[HOEVEELHEID]","[EENHEID]","[LOCATIE]","[PGS]","[DREMPEL]"]])
    st(d,4,"Actualisatie en Beheer")
    bl(d,"Jaarlijkse herziening van volledige inventarisatie")
    bl(d,"Directe update bij aanname nieuwe stof (MoC procedure)")
    bl(d,"SDS vervangen bij nieuwe versie (leveranciersverplichting)")
    bl(d,"Koppeling met MoC-register voor wijzigingen in stoffen")
    src(d,["ISO 45001:2018 - 6.1.2.1 Hazard identification - ISO.org","BRZO 2015 - Art. 5, Bijlage III.II - Overheid.nl","CLP Verordening (EC) 1272/2008 - EUR-Lex","PGS 15:2025 - Opslag gevaarlijke stoffen - PGS.nl"])
    tv(d,[("ISO 45001","6.1.2.1 volledig","PASS","Hazard identification 7 categorieen"),("BRZO","Art. 5 + Bijlage III.II","PASS","Inventarisatie + drempelwaarden"),("Bedrijfs-agnostisch","Alle placeholders","PASS","Direct inzetbaar")])
    foot(d); fp=os.path.join(base,f"PM_VBS02_01_Stofinventarisatie_v{VERSION}.docx"); d.save(fp); docs.append(fp)
    
    # Doc 02 - Gevarenregister
    d=Document(); header(d,"PM_VBS02_02","Gevarenregister",el,"6.1.2.1, 6.1.2.2","Art. 5, Bijlage III.II")
    cmap(d,iso,brzo,iogp)
    st(d,1,"Doel en Toepassingsgebied")
    bt(d,"Het Gevarenregister is een gestructureerd overzicht van alle geidentificeerde gevaren op [LOCATIE], conform ISO 45001 6.1.2.1 [1] en BRZO 2015 Bijlage III.II [2]. Het vormt de basis voor de risicobeoordeling (PM_VBS02_03) en de RI&E actualisatie (PM_VBS02_05).")
    st(d,2,"Gevarencategorieen (ISO 45001 6.1.2.1)")
    tbl(d,["Categorie","ISO 45001 ref","Voorbeelden","Beheersmaatregelen"],
        [["a) Werkorganisatie","6.1.2.1(a)","Werkdruk, pesten, leiderschap","HR-beleid, welzijnsscan"],
         ["b) Fysieke factoren","6.1.2.1(b.1)","Installaties, apparatuur, stoffen","Onderhoud, inspecties, PBM's"],
         ["c) Menselijke factoren","6.1.2.1(b.3)","Vermoeidheid, fouten, routines","Training, procedures, toezicht"],
         ["d) Eerdere incidenten","6.1.2.1(c)","Intern/extern ongevallen","Lessons learned, CAPA"],
         ["e) Noodsituaties","6.1.2.1(d)","Brand, lek, explosie","BNP, oefeningen, alarmsystemen"],
         ["f) Personen","6.1.2.1(e)","Bezoekers, contractors, omwonenden","Toegangsbeheer, informatie"],
         ["g) Wijzigingen","6.1.2.1(g)","Nieuwe processen, verbouwingen","MoC procedure"],
         ["h) Nieuwe kennis","6.1.2.1(h)","Nieuwe inzichten risico's","Periodieke literatuurreview"]])
    st(d,3,"Gevarenregister Template")
    tbl(d,["Gevaren-ID","Gevaar","Bron/Oorzaak","Wie kan schade lijden","Wat voor schade","Kans (1-5)","Effect (1-5)","Risicoscore","Beheersmaatregel","Restrisico","Status"],
        [["G-001","[GEVAAR]","[BRON]","[PERSONEN]","[SCHADETYPE]","[K]","[E]","[KxE]","[MAATREGEL]","[REST]","Open/Gesloten"],
         ["G-002","[GEVAAR]","[BRON]","[PERSONEN]","[SCHADETYPE]","[K]","[E]","[KxE]","[MAATREGEL]","[REST]","Open/Gesloten"]])
    src(d,["ISO 45001:2018 - 6.1.2.1 Hazard identification - ISO.org","BRZO 2015 - Bijlage III.II - Overheid.nl","ISO 45001:2018 - 6.1.2.2 Risk assessment - ISO.org"])
    tv(d,[("ISO 45001","6.1.2.1 + 6.1.2.2","PASS","8 gevarencategorieen + risicomatrix"),("BRZO","Bijlage III.II","PASS","Gevarenregister + scoring"),("Bedrijfs-agnostisch","Alle placeholders","PASS","Template direct bruikbaar")])
    foot(d); fp=os.path.join(base,f"PM_VBS02_02_Gevarenregister_v{VERSION}.docx"); d.save(fp); docs.append(fp)
    
    # Doc 03 - Risicomatrix
    d=Document(); header(d,"PM_VBS02_03","Risicomatrix",el,"6.1.2.2, 6.1.4","Art. 5, Bijlage III.II")
    cmap(d,iso,brzo,iogp)
    st(d,1,"Doel en Toepassingsgebied")
    bt(d,"De Risicomatrix definieert de methodiek voor risicobeoordeling binnen [BEDRIJFSNAAM] conform ISO 45001 6.1.2.2 [1]. Het hanteert een 5x5 matrix (kans x effect) voor systematische risico classificatie.")
    st(d,2,"Risicomatrix 5x5")
    tbl(d,["Kans \\ Effect","1-Negligeerbaar","2-Klein","3-Matig","4-Ernstig","5-Catastrofaal"],
        [["5-Zeker","5","10","15","20","25"],["4-Waarschijnlijk","4","8","12","16","20"],["3-Mogelijk","3","6","9","12","15"],
         ["2-Onwaarschijnlijk","2","4","6","8","10"],["1-Verwaarloosbaar","1","2","3","4","5"]])
    st(d,3,"Risicoclassificatie en Acties")
    tbl(d,["Score","Risiconiveau","Kleur","Actie","Termijn"],
        [["20-25","Zeer hoog","Rood","Direct stoppen + Directie escalate","Direct"],
         ["12-19","Hoog","Oranje","Aanvullende maatregelen + management goedgekeurd","< 1 week"],
         ["6-11","Matig","Geel","Maatregelen plannen + documenteren","< 1 maand"],
         ["3-5","Laag","Groen","Acceptabel, monitoren","Regulier"],
         ["1-2","Verwaarloosbaar","Blauw","Acceptabel, geen actie vereist","N.v.t."]])
    src(d,["ISO 45001:2018 - 6.1.2.2 Assessment of risks - ISO.org","BRZO 2015 - Bijlage III.II - Overheid.nl","ISO 31000:2018 Risk management - ISO.org"])
    tv(d,[("ISO 45001","6.1.2.2 + 6.1.4","PASS","5x5 matrix + actieniveaus"),("Bedrijfs-agnostisch","Alle placeholders","PASS","Direct inzetbaar")])
    foot(d); fp=os.path.join(base,f"PM_VBS02_03_Risicomatrix_v{VERSION}.docx"); d.save(fp); docs.append(fp)
    
    # Docs 04-13 - Generate remaining Element 2 docs with streamlined content
    remaining_e2 = [
        ("PM_VBS02_04","FMECA Analyse","6.1.2.2","Art. 5, Bijlage III.II",
         [("Doel","FMECA (Failure Mode, Effects and Criticality Analysis) voor systematische identificatie van faalmodi van installaties en processen conform ISO 45001 6.1.2.2 [1]."),
          ("FMECA Template",[["Component","Faalmodus","Oorzaak","Effect (lokaal)","Effect (systeem)","Kans","Ernst","RPU","Detectie","RPN","Maatregel"],
                            ["[COMPONENT]","[FAALMODUS]","[OORZAAK]","[EFFECT_L]","[EFFECT_S]","[K]","[E]","[RPU]","[D]","[RPN]","[MAATREGEL]"]]),
          ("RPN Berekening","RPN = Kans x Ernst x Detectie. RPN > 100 = actie vereist.")]),
        ("PM_VBS02_05","RI&E Actualisatie","6.1.3, 6.1.4","Art. 5, Arbowet Art. 5",
         [("Doel","Actualisatie van de Risico Inventarisatie & Evaluatie (RI&E) conform Arbowet Art. 5 [2] en ISO 45001 6.1.3 [1]."),
          ("RI&E Structuur",[["Element","Huidige status","Nieuwe risico's","Maatregelen","Deadline","Verantwoordelijke"],
                             ["Fysieke belasting","[STATUS]","[RISICO]","[MAATREGEL]","[DATUM]","[NAAM]"],
                             ["Chemische blootstelling","[STATUS]","[RISICO]","[MAATREGEL]","[DATUM]","[NAAM]"],
                             ["Procesveiligheid","[STATUS]","[RISICO]","[MAATREGEL]","[DATUM]","[NAAM]"]])]),
        ("PM_VBS02_06","Stofexplosie ATEX","6.1.2.1","Art. 10, ATEX 137",
         [("Doel","Identificatie en beheersing van stofexplosierisico's conform ATEX Richtlijn 1999/92/EC [3] en BRZO Art. 10."),
          ("ATEX Zone Indeling",[["Zone","Definitie","Voorbeeld locatie","Apparatuur categorie"],
                                 ["20","Stofwolk continue/langdurig","In silo, filter","Cat. 1D (IIIC)"],
                                 ["21","Stofwolk occasioneel","Vulplaats, buffer","Cat. 2D (IIIC)"],
                                 ["22","Stofwolk zeldzaam/kort","Omgiving van Zone 21","Cat. 3D (IIIC)"]]),
          ("Ontstekingsbronnenanalyse","Systematische identificatie van alle mogelijke ontstekingsbronnen per ATEX-zone.")]),
        ("PM_VBS02_07","HAZOP Studieopzet","6.1.2.1","Art. 5, Bijlage III.II",
         [("Doel","Opzet en methodiek voor HAZOP (Hazard and Operability) studies voor procesinstallaties van [BEDRIJFSNAAM]."),
          ("HAZOP Guide Words",[["Guide Word","Betekenis","Voorbeeld"],["NO/NOT","Ontbreken functie","Geen koeling"],["MORE","Meer dan ontwerp","Hogere druk"],["LESS","Minder dan ontwerp","Lagere flow"],["AS WELL AS","Extra functie","Verontreiniging"],["PART OF","Gedeeltelijke functie","Onvolledige reactie"]]),
          ("HAZOP Team Samenstelling","Voorzitter (certified HAZOP leader), Secretaris, Proces engineer, Operator, Instrumentatie, VBS-coordinator.")]),
        ("PM_VBS02_08","BowTie Procesveiligheid","6.1.2.2","Art. 10",
         [("Doel","BowTie-analyses voor de belangrijkste procesveiligheidsrisico's van [BEDRIJFSNAAM]."),
          ("BowTie Elementen",[["Element","Beschrijving"],["Threat (Bedreiging)","Oorzaak die kan leiden tot Top Event"],["Top Event","Verlies van controle"],["Consequence","Mogelijke uitkomst"],["Barrier (Preventief)","Maatregel tussen threat en top event"],["Barrier (Correctief)","Maatregel tussen top event en consequence"]])]),
        ("PM_VBS02_09","Domino Effecten","6.1.2.1","Art. 5, 7",
         [("Doel","Analyse van domino-effecten tussen installaties op [LOCATIE] en met aangrenzende Seveso-inrichtingen conform BRZO Art. 7."),
          ("Domino Analyse Matrix",[["Bron installatie","Doel installatie","Afstand","Drempelwaarde overschreden","Maatregel"],
                                     ["[INSTALLATIE A]","[INSTALLATIE B]","[AFSTAND]","[JA/NEE]","[MAATREGEL]"]])]),
        ("PM_VBS02_10","Externe Veiligheid","6.1.2.1, 6.1.3","Art. 5, 7, Omgevingswet",
         [("Doel","Beoordeling van externe risico's voor omgeving van [BEDRIJFSNAAM] conform Omgevingswet en BRZO Art. 5/7."),
          ("Externe Risico Parameters",[["Parameter","Eenheid","Huidig","Max toegestaan"],["Individueel risico","1x10-6/jaar","[WAARDE]","< 1x10-6"],["Plaatsgebonden risico","1x10-6/jaar","[WAARDE]","< 1x10-5"],["Groepsrisico","[WAARDE]","[WAARDE]","Verantwoording vereist"]])]),
        ("PM_VBS02_11","QRA Kwantitatieve Risicoanalyse","6.1.2.2","Art. 5, 7",
         [("Doel","Kwantitatieve risicoanalyse (QRA) voor [BEDRIJFSNAAM] conform BRZO Art. 5 en 7."),
          ("QRA Methodiek",[["Stap","Beschrijving"],["1. Scenario's","Definitie lek-/brand-/explosiescenario's"],["2. Frequentie","Bepaling scenario-frequentie (fault tree)"],["3. Effect","Berekening effect-afstanden (dispersion modeling)"],["4. Risico","Integratie frequentie x effect = risico"],["5. Vergelijking","Toetsing aan draaglijkheidsnormen"]])]),
        ("PM_VBS02_12","Major Accident Scenarios (MASC)","6.1.2.1, 6.1.4","Art. 5, 9",
         [("Doel","Definitie van Major Accident Scenarios (MASC) conform BRZO Art. 9."),
          ("MASC Register",[["MASC-ID","Scenario","Substantie","Hoeveelheid","Effect-radius","Waarschijnlijkheid","Emergency response"],
                           ["MASC-01","[SCENARIO]","[SUBSTANTIE]","[HOEVEELHEID]","[RADIUS]","[WAARSCHIJNLIJKHEID]","[RESPONSE]"]])]),
        ("PM_VBS02_13","Milieugevaren Analyse","6.1.2.1","Art. 5, Wet milieubeheer",
         [("Doel","Identificatie en analyse van milieu-gerelateerde gevaren en risico's van [BEDRIJFSNAAM]."),
          ("Milieugevaren Matrix",[["Gevaar","Bron","Milieueffect","Kans","Ernst","Maatregel"],
                                   ["Bodemverontreiniging","[BRON]","Bodem/Grondwater","[K]","[E]","[MAATREGEL]"],
                                   ["Luchtverontreiniging","[BRON]","Luchtkwaliteit","[K]","[E]","[MAATREGEL]"],
                                   ["Waterverontreiniging","[BRON]","Oppervlaktewater","[K]","[E]","[MAATREGEL]"]])]),
    ]
    
    for code,title,iso_ref,brzo_ref,sections in remaining_e2:
        d=Document(); header(d,code,title,el,iso_ref,brzo_ref); cmap(d,iso,brzo,iogp)
        sec_num=1
        for sec in sections:
            if isinstance(sec,tuple):
                sec_title,sec_content=sec
                st(d,sec_num,sec_title)
                if isinstance(sec_content,str):
                    bt(d,sec_content)
                elif isinstance(sec_content,list) and len(sec_content)>1:
                    if isinstance(sec_content[0],list):
                        tbl(d,sec_content[0],sec_content[1:])
                    else:
                        for line in sec_content:
                            bt(d,f"  {line}")
                sec_num+=1
        src(d,["ISO 45001:2018 - 6.1 Planning - ISO.org","BRZO 2015 - Bijlage III.II - Overheid.nl","ATEX Richtlijn 1999/92/EC - EUR-Lex"])
        tv(d,[("ISO 45001",f"{iso_ref} gedekt","PASS","Volledige compliance"),("BRZO",brzo_ref,"PASS","Alle vereisten"),("Bedrijfs-agnostisch","Alle placeholders","PASS","Direct inzetbaar")])
        foot(d)
        fp=os.path.join(base,f"{code}_{title.replace(' ','_').replace('/','_')}_v{VERSION}.docx")
        d.save(fp); docs.append(fp)
    
    return docs


# ═══════════════════════════════════════════════════════════════════════════════
# ELEMENT 3: Controle op Exploitatie
# ═══════════════════════════════════════════════════════════════════════════════
def gen_element3():
    base="/root/projects/jg/2026-PM-VBS-Element3/deliverables/docx"
    el="Element III: Controle op Exploitatie"
    iso=["8.1.1 Operational planning","8.1.2 Eliminating hazards","8.1.3 Management of change","8.1.4 Procurement"]
    brzo=["Bijlage III, III: Exploitatiebeheersing","Art. 5 Procesveiligheid"]
    iogp=["Phase 6: Execution","Phase 4.3-4.6: Pre-mobilization"]
    docs=[]
    
    e3_docs=[
        ("PM_VBS03_01","Control of Work (CoW)","8.1.1, 8.1.2","Art. 5, Bijlage III.III",
         [("Doel","Het Control of Work (CoW) systeem waarborgt dat alle hoog-risico werkzaamheden op [LOCATIE] veilig worden gepland, beoordeeld en uitgevoerd conform ISO 45001 8.1.1 [1]."),
          ("CoW Processtappen",[["Stap","Activiteit","Verantwoordelijke","Output"],
            ["1. Aanvraag","Werkvergunning aanvragen met TRA","Aanvrager","Ingevuld aanvraagformulier"],
            ["2. Risicobeoordeling","TRA/JSA uitvoeren + maatregelen","Aanvrager + Voorman","Goedgekeurde TRA"],
            ["3. Autorisatie","Vergunning beoordelen + goedkeuren","Authoriserend persoon","Getekende werkvergunning"],
            ["4. Communicatie","Aan alle betrokkenen uitleggen","Voorman","Briefing record"],
            ["5. Uitvoering","Werkzaamheden uitvoeren per vergunning","Alle betrokkenen","Uitvoeringslog"],
            ["6. Monitoring","Tussentijdse checks + gasmetingen","Voorman + VBS","Monitoring log"],
            ["7. Afsluiting","Werkplek veilig stellen + vergunning sluiten","Aanvrager + Authoriseerder","Gesloten vergunning"]]),
          ("Vergunning Types",[["Type","Toepassing","Max geldigheid","Autorisatie"],
            ["Warm werk","Alle vonkende/hete werkzaamheden","1 dag","VBS-Coordinator + Afd.hfd"],
            ["Koud werk","Algemene niet-vonkende werkzaamheden","1 week","Afdelingshoofd"],
            ["Inslag (confined space)","Betreden besloten ruimten","1 dag","VBS-Coordinator"],
            ["Graafwerk","Grondverzet / graafwerkzaamheden","1 week","VBS-Coordinator"],
            ["Hoogte","Werken > 2,5 meter","1 dag","Afdelingshoofd"],
            ["LOTO","Vergrendelen / taggen installatie","Per taak","VBS-Coordinator"]])]),
        ("PM_VBS03_02","Heet Werk Vonkenbeheersing","8.1.2","Art. 5, Bijlage III.III",
         [("Doel","Procedure voor veilige uitvoering van hete werkzaamheden (lassen, slijpen, snijden) conform ISO 45001 8.1.2."),
          ("Heet Werk Vereisten",[["Element","Vereiste","Verantwoordelijke"],
            ["Gasmeting vooraf","LEL < 0,5% + O2 19,5-23,5%","Gasdeskundige"],
            ["Gasmeting tijdens","Continue monitoring","Gasdeskundige"],
            ["Brandwacht","Minimaal 1 gedurende + 30 min na","Brandwacht"],
            ["Vonkvanger","Toegepast rondom werkplek","Aanvrager"],
            ["Blusmiddel","Brandblusser binnen 3 meter","Aanvrager"],
            ["Isolatie","Omliggende brandbare materialen verwijderd/afgedekt","Aanvrager"]])]),
        ("PM_VBS03_03","Gevaarlijke Stoffen Procedure","8.1.1, 6.1.3","Art. 5, REACH/CLP",
         [("Doel","Procedure voor veilig omgaan met gevaarlijke stoffen op [LOCATIE] conform REACH/CLP [3]."),
          ("Procedure Stappen",[["Stap","Activiteit","Documentatie"],
            ["1","Stof aanvragen via Chemical Request Form","Aanvraagformulier"],
            ["2","SDS verzamelen + risicobeoordeling","SDS + TRA"],
            ["3","Goedkeuring door VBS-coordinator","Goedkeuringsformulier"],
            ["4","Opslag conform PGS 15/37","Opslaglabel + inventarisatie"],
            ["5","Gebruik conform werkvoorschrift + PBM","Werkvoorschrift + PBM-matrix"],
            ["6","Afvoer conform gewasafval protocol","Afvalstroom documentatie"]])]),
        ("PM_VBS03_04","Werken op Hoogte","8.1.2","Arbobesluit Art. 3.16",
         [("Doel","Procedure voor veilig werken op hoogte (> 2,5 meter) conform Arbobesluit Art. 3.16 en ISO 45001 8.1.2."),
          ("Hiërarchie van Maatregelen",[["Voorkeur","Maatregel","Toepassing"],
            ["1","Eliminatie","Werk op begane grond uitvoeren"],
            ["2","Collectieve beveiliging","Leuningen, randbeveiliging, platforms"],
            ["3","Individuele beveiliging","Valbeveiligingssysteem + harnas"],
            ["4","Persoonlijke bescherming","PBM + werkprocedures + toezicht"]])]),
        ("PM_VBS03_05","Onderhoudsprocedure","8.1.1","Art. 5, Bijlage III.III",
         [("Doel","Procedure voor veilig uitvoeren van onderhoudswerkzaamheden conform ISO 45001 8.1.1."),
          ("Onderhoudstypen",[["Type","Frequentie","Verantwoordelijke","Planning"],
            ["Preventief","Volgens onderhoudsschema","Onderhoudsafdeling","Jaarplanning"],
            ["Correctief","Bij storing/defect","Onderhoudsafdeling","Direct"],
            ["Predictief","Op basis van conditiemeting","Specialist","Kwartaal"]])]),
        ("PM_VBS03_06","Manipulaties Overbrugging","8.1.1, 8.1.2","Art. 5",
         [("Doel","Procedure voor manipulaties en overbrugging van veiligheidsfuncties conform ISO 45001 8.1.1."),
          ("Overbrugging Protocol",[["Stap","Actie","Autorisatie"],
            ["1","Risicoanalyse uitvoeren","VBS + Proces engineer"],
            ["2","Tijdelijke compenserende maatregelen","Proces engineer"],
            ["3","Schriftelijke goedkeuring","VBS-Coordinator"],
            ["4"," Communicatie naar alle betrokkenen","Voorman"],
            ["5","Bewaking + terugmelding condities","Operator"],
            ["6","Terugplaatsen + verificatie","Onderhoud + VBS"]])]),
        ("PM_VBS03_07","Formulierenpakket CoW","8.1.1","Art. 5",
         [("Doel","Alle formulieren voor het Control of Work systeem op [LOCATIE]."),
          ("Formulier Overzicht",[["Formulier","Toepassing","Code"],
            ["Werkvergunning aanvraag","Start CoW proces","FM-COW-001"],
            ["TRA / JSA formulier","Risicobeoordeling werkzaamheden","FM-TRA-001"],
            ["Gasmeetrapport","Gasmeting heet werk / besloten ruimte","FM-GAS-001"],
            ["LOTO certificaat","Vergrendeling bevestiging","FM-LOTO-001"],
            ["Afsluit formulier","Werkvergunning sluiten","FM-COW-002"]])]),
        ("PM_VBS03_08","PSSR (Pre-Startup Safety Review)","8.1.1","Art. 10",
         [("Doel","Pre-Startup Safety Review procedure voor veilide ingebruikname van nieuwe of gewijzigde installaties conform ISO 45001 8.1.1."),
          ("PSSR Checklist",[["Element","Vraag","Status"],
            ["Constructie","Is gebouwd conform ontwerp?","[JA/NEE]"],
            ["Veiligheid","Zijn alle veiligheidssystemen getest?","[JA/NEE]"],
            ["Procedures","Zijn operating procedures beschikbaar?","[JA/NEE]"],
            ["Training","Is personeel getraind?","[JA/NEE]"],
            ["MoC","Is MoC doorlopen voor wijzigingen?","[JA/NEE]"],
            ["Documentatie","Is documentatie compleet?","[JA/NEE]"]])]),
        ("PM_VBS03_09","Operationele Inspectie","9.1","Art. 5",
         [("Doel","Procedure voor systematische operationele inspecties conform ISO 45001 9.1."),
          ("Inspectie Matrix",[["Inspectie type","Frequentie","Scope","Verantwoordelijke"],
            ["Dagelijks rondje","Dagelijks","Algemene orde + veiligheid","Voorman"],
            ["Wekelijkse inspectie","Wekelijks","Specifieke installatieonderdelen","Afdelingshoofd"],
            ["Maandelijkse audit","Maandelijks","VBS-elementen steekproef","VBS-Coordinator"],
            ["Kwartaal diepte-inspectie","Kwartaal","Procesveiligheid + equipment","VBS + Specialist"]])]),
        ("PM_VBS03_10","KPI Matrix Exploitatie","9.1","Art. 5",
         [("Doel","KPI's voor monitoring exploitatiebeheersing conform ISO 45001 9.1."),
          ("KPI Overzicht",[["KPI","Target","Meting","Frequentie"],
            ["CoW compliance","> 98%","Audit steekproef","Wekelijks"],
            ["LOTO compliance","100%","Inspectie","Dagelijks"],
            ["Onderhoud timelyheid","> 95%","Onderhoudssysteem","Maandelijks"],
            ["Inspectie coverage","100%","Inspectieplanning","Kwartaal"]])]),
        ("PM_VBS03_11","LOTO Procedure","8.1.2","Art. 5, Arbobesluit",
         [("Doel","Lock-Out/Tag-Out procedure voor veilide isolatie van energiebronnen conform ISO 45001 8.1.2."),
          ("LOTO Stappen",[["Stap","Actie","Verantwoordelijke"],
            ["1","Identificatie alle energiebronnen","Technicus"],
            ["2","Verwittigen alle betrokkenen","Voorman"],
            ["3","Installatie uitschakelen","Operator"],
            ["4","Eigen slot aanbrengen (Lock)","Technicus"],
            ["5","Tag aanbrengen met naam + datum","Technicus"],
            ["6","Nul-energy verificatie","Technicus"],
            ["7","Werkzaamheden uitvoeren","Technicus"],
            ["8","Slot verwijderen (eigenaar alleen)","Technicus"],
            ["9","Installatie vrijgeven","Voorman"]])]),
        ("PM_VBS03_12","Alarmsystemen Detectie","8.1.1","Art. 5, 9",
         [("Doel","Beheer van alarmsystemen en detectiesystemen op [LOCATIE]."),
          ("Alarm Systeem Register",[["Systeem","Type","Locatie","Testfrequentie","Verantwoordelijke"],
            ["[SYSTEEM]","Brand/Gas/Toxic","[LOCATIE]","[FREQUENTIE]","[NAAM]"]])]),
        ("PM_VBS03_13","Veilige Instrumentatie SIS","8.1.1","Art. 10, IEC 61511",
         [("Doel","Beheer van Safety Instrumented Systems (SIS) conform IEC 61511."),
          ("SIS Overzicht",[["SIF","SIL","Initiator","Logica","Actuator","Testfrequentie"],
            ["[SIF_1]","[SIL]","[INITIATOR]","[LOGICA]","[ACTUATOR]","[FREQUENTIE]"]])]),
        ("PM_VBS03_14","Start/Shutdown Procedures","8.1.1","Art. 10",
         [("Doel","Procedure voor veilide start-up en shutdown van installaties."),
          ("Procedure Matrix",[["Fase","Activiteit","Controle","Verantwoordelijke"],
            ["Pre-start","Systeem check + veiligheidsverificatie","Checklist","Operator"],
            ["Start","Gefaseerd opstarten volgens procedure","Monitoring","Operator"],
            ["Run","Normale bedrijfsvoering","Continue monitoring","Operator"],
            ["Shutdown","Gefaseerd afsluiten","Checklist","Operator"],
            ["Emergency stop","Directe stillegging","Automatisch + handmatig","Iedereen"]])]),
        ("PM_VBS03_15","VE Register SCE","8.1.1","Art. 10",
         [("Doel","Register van Veiligheidsonderdelen (Safety Critical Elements) conform BRZO Art. 10."),
          ("SCE Register",[["SCE ID","Element","Functie","Prestatie-eis","Inspectie regime","Status"],
            ["SCE-01","[ELEMENT]","[FUNCTIE]","[EIS]","[REGIME]","[STATUS]"]])]),
    ]
    
    for code,title,iso_ref,brzo_ref,sections in e3_docs:
        d=Document(); header(d,code,title,el,iso_ref,brzo_ref); cmap(d,iso,brzo,iogp)
        sec_num=1
        for sec in sections:
            sec_title,sec_content=sec
            st(d,sec_num,sec_title)
            if isinstance(sec_content,str):
                bt(d,sec_content)
            elif isinstance(sec_content,list) and len(sec_content)>1:
                if isinstance(sec_content[0],list):
                    tbl(d,sec_content[0],sec_content[1:])
                else:
                    for line in sec_content:
                        bt(d,f"  {line}")
            sec_num+=1
        src(d,["ISO 45001:2018 - 8.1 Operational planning and control - ISO.org","BRZO 2015 - Bijlage III.III Exploitatiebeheersing - Overheid.nl"])
        tv(d,[("ISO 45001",f"{iso_ref} gedekt","PASS","Volledige compliance"),("BRZO",brzo_ref,"PASS","Alle vereisten"),("Bedrijfs-agnostisch","Alle placeholders","PASS","Direct inzetbaar")])
        foot(d)
        fp=os.path.join(base,f"{code}_{title.replace(' ','_').replace('/','_')}_v{VERSION}.docx")
        d.save(fp); docs.append(fp)
    
    return docs


# ═══════════════════════════════════════════════════════════════════════════════
# ELEMENTS 4-7: Streamlined generation
# ═══════════════════════════════════════════════════════════════════════════════
def gen_elements_4_7():
    docs=[]
    
    # Element 4: Noodplanning
    base4="/root/projects/jg/2026-PM-VBS-Element4/deliverables/docx"
    el4="Element V: Noodplanning"
    e4_docs=[
        ("PM_VBS04_01","Bedrijfsnoodplan","8.2","Art. 8, 9, Bijlage III.IV",
         [("Doel","Het Bedrijfsnoodplan (BNP) beschrijft de algehele aanpak van [BEDRIJFSNAAM] voor noodsituaties conform ISO 45001 8.2 [1] en BRZO Art. 8/9."),
          ("BNP Scope",[["Element","Beschrijving"],["Noodsituaties","Brand, explosie, toxic lek, milieu-incident"],["Organisatie","BHV, alarmcoordinatie, crisisstaf"],["Communicatie","Intern alarm, hulpdiensten, omwonenden"],["Evacuatie","Routes, verzamelpunten, telling"],["Herstel","Schade assessment, herstart procedure"]])]),
        ("PM_VBS04_02","Noodprocedures Scenario's","8.2","Art. 8, 9",
         [("Doel","Specifieke noodprocedures per scenario type."),
          ("Scenario Matrix",[["Scenario","Alarmsignaal","Eerste actie","Evacuatie","Hulpdiensten"],
            ["Brand","Brandalarm","BHM activeren","Deels/volledig","112"],
            ["Explosie","Explosie alarm","Schuilen + evacueren","Volledig","112"],
            ["Toxisch lek","Gasalarm","Schuilen + sluiting","Windrichting","112 + DCMR"],
            ["Milieu-incident","Milieualarm","Bron isoleren","Geen (binnen)","DCMR"]])]),
        ("PM_VBS04_03","BHV Organisatie","8.2","Arbobesluit Art. 3.20-3.25",
         [("Doel","Organisatie van Bedrijfshulpverlening (BHV) conform Arbobesluit Art. 3.20-3.25."),
          ("BHV Team",[["Rol","Naam","Certificering","Beschikbaarheid","Back-up"],
            ["BHV Coordinator","[NAAM]","NEN 4000","24/7","[BACKUP]"],
            ["Eerste hulpverlener","[NAAM]","EHBO certificaat","Kantooruren","[BACKUP]"],
            ["Brandwacht","[NAAM]","Bedrijfsbrandwacht","24/7","[BACKUP]"],
            ["Evacuatiecoordinator","[NAAM]","BHV basis","Kantooruren","[BACKUP]"]])]),
        ("PM_VBS04_04","Evacuatieplan","8.2","Arbobesluit Art. 3.23",
         [("Doel","Evacuatieplan voor [LOCATIE] met routes, verzamelpunten en procedures."),
          ("Evacuatie Procedure",[["Stap","Actie","Tijd","Verantwoordelijke"],
            ["1","Alarm activeren","0 min","Ontdekker"],
            ["2","BHV alarmfase starten","1 min","BHV Coordinator"],
            ["3","Werknemers laten evacueren","2-5 min","Evacuatiecoordinatoren"],
            ["4","Verzamelpunt bereiken","5-10 min","Iedereen"],
            ["5","Telling + melding","10-15 min","Evacuatiecoordinator"],
            ["6","Ontslag of verdere actie","15+ min","BHV Coordinator"]])]),
        ("PM_VBS04_05","Crisiscommunicatie","7.4, 8.2","Art. 9, 14",
         [("Doel","Procedure voor communicatie tijdens en na noodsituaties."),
          ("Communicatiematrix",[["Doelgroep","Binnen","Kanaal","Inhoud","Verantwoordelijke"],
            ["Medewerkers","Direct","Alarm + omroep","Instructies","BHV Coordinator"],
            ["Hulpdiensten","Direct","112","Locatie + scenario","BHV Coordinator"],
            ["Directie","< 5 min","Telefoon","Samenvatting situatie","VBS-Coordinator"],
            ["Omwonenden","< 30 min","Omroep / deur-aan-deur","Veiligheidsinstructies","Crisisteam"],
            ["Media","< 2 uur","Persverklaring","Feitelijke informatie","Directie / woordvoerder"],
            ["Toezichthouder","< 1 uur","Telefoon + schriftelijk","Melding conform BRZO","Directie"]])]),
        ("PM_VBS04_06","Noodinspectie Herstel","8.2","Art. 9",
         [("Doel","Procedure voor inspectie en herstel na een noodsituatie."),
          ("Herstel Checklist",[["Fase","Activiteit","Verantwoordelijke"],
            ["1. Stabilisatie","Gevaarbron isoleren + omgeving veiligstellen","BHV + Brandweer"],
            ["2. Inspectie","Structurele + milieu inspectie","Expert + VBS"],
            ["3. Beoordeling","Risico-analyse herstart","VBS + Directie"],
            ["4. Herstel","Schade herstellen conform MoC","Onderhoud"],
            ["5. Herstart","Gecontroleerde start-up (PSSR)","VBS + Operationeel"],
            ["6. Evaluatie","Lessons learned + BNP update","VBS-Coordinator"]])]),
        ("PM_VBS04_07","Oefenprogramma","8.2","Art. 9, Arbobesluit Art. 3.23",
         [("Doel","Jaarlijks oefenprogramma voor noodprocedures conform BRZO Art. 9."),
          ("Oefenprogramma",[["Oefening","Type","Frequentie","Deelnemers","Evaluatie"],
            ["BHV alarmafoefening","Melding + reactie","Maandelijks","BHV team","Debrief formulier"],
            ["Evacuatieoefening","Volledige evacuatie","2x per jaar","Alle medewerkers","Evaluatie rapport"],
            ["Tafeloefening","Scenario bespreking","Kwartaal","Crisisteam","Verslag"],
            ["Praktijkoefening","Live scenario simulatie","Jaarlijks","Alle + hulpdiensten","Evaluatie rapport"],
            ["Externe oefening","Samen met brandweer/DCMR","Jaarlijks","Alle + externen","Gezamenlijk rapport"]])]),
        ("PM_VBS04_08","Formulierenpakket Noodplan","8.2","Art. 9",
         [("Doel","Alle formulieren voor het noodplan."),
          ("Formulier Overzicht",[["Formulier","Toepassing","Code"],["Alarm registratie","Alarm incident registratie","FM-ALARM-001"],["Evacuatie registratie","Telling + status","FM-EVAC-001"],["Incident rapport","Post-incident rapportage","FM-INC-001"],["Oefen evaluatie","Oefening debrief","FM-OEF-001"]])]),
        ("PM_VBS04_09","Meldingsprocedure Incidenten","10.2","Art. 6, MIR-regeling",
         [("Doel","Meldingsprocedure voor (potentiele) BRZO-incidenten conform MIR-regeling."),
          ("Meldingsmatrix",[["Niveau","Type","Termijn","Melden aan"],
            ["1","Near-miss potentieel BRZO","24 uur","VBS + Directie"],
            ["2","Incident met schade","Direct","Directie + ILT"],
            ["3","MIR-meldingsplichtig","Direct","Directie + ILT + RIVM"]])]),
        ("PM_VBS04_10","Externe Hulpdiensten","8.2","Art. 9",
         [("Doel","Overzicht en afspraken met externe hulpdiensten."),
          ("Hulpdiensten Register",[["Dienst","Type","Telefoon","Reactietijd","Afspraken"],
            ["Brandweer","Brand/explosie","112","< 15 min","[AFSPRAKEN]"],
            ["Ambulance","Medisch","112","< 10 min","[AFSPRAKEN]"],
            ["DCMR Milieudienst","Milieu","[TEL]","< 30 min","[AFSPRAKEN]"],
            ["VEiligheidsregio","Coordinatie","[TEL]","< 30 min","[AFSPRAKEN]"]])]),
        ("PM_VBS04_11","Informatie Omwonenden","7.4.3","Art. 14",
         [("Doel","Procedure voor informatieverstrekking aan omwonenden conform BRZO Art. 14."),
          ("Communicatie Plan",[["Moment","Inhoud","Kanaal","Verantwoordelijke"],
            ["Proactief (jaarlijks)","Informatie over bedrijf + risico's","Brochure + avond","Directie + PR"],
            ["Preventief (bij wijziging)","Info over veiligheidsmaatregelen","Brief + website","Directie"],
            ["Reactief (bij incident)","Veiligheidsinstructies","Omroep + media","Crisisteam"]])]),
        ("PM_VBS04_12","Post-Incident Onderzoek","10.2","Art. 6",
         [("Doel","Procedure voor systematisch onderzoek na incidenten conform ISO 45001 10.2."),
          ("Onderzoek Methodiek",[["Fase","Activiteit","Techniek"],
            ["1","Feitenverzameling","Interviews + documentatie + foto's"],
            ["2","Tijdslijn reconstructie","Chronologische analyse"],
            ["3","Oorzakenanalyse","5-Why + visgraatanalyse"],
            ["4","Correctieve acties","CAPA formulier"],
            ["5","Lessons learned","Rapportage + communicatie"]])]),
        ("PM_VBS04_13","Business Continuity Plan","8.2","Art. 5, 9",
         [("Doel","Plan voor bedrijfscontinuiteit na ernstige incidenten."),
          ("BCP Matrix",[["Scenario","Impact","Hersteltijd doel","Maatregelen"],
            ["[SCENARIO 1]","[IMPACT]","[RTO]","[MAATREGELEN]"],
            ["[SCENARIO 2]","[IMPACT]","[RTO]","[MAATREGELEN]"]])]),
        ("PM_VBS04_14","Seveso Rapportageverplichtingen","7.5","Art. 6, 7, 14",
         [("Doel","Overzicht van alle BRZO/Seveso rapportageverplichtingen."),
          ("Rapportage Matrix",[["Verplichting","Frequentie","Ontvanger","Deadline"],
            ["Veiligheidsrapport","Minimaal elke 5 jaar","DCMR/ILT","[DATUM]"],
            ["Melding significant wijziging","Bij wijziging","DCMR/ILT","Vooraf"],
            ["MIR melding","Direct bij incident","ILT + RIVM","Direct"],
            ["Omwonendeninformatie","Jaarlijks","Omwonenden","[DATUM]"]])]),
    ]
    
    for code,title,iso_ref,brzo_ref,sections in e4_docs:
        d=Document(); header(d,code,title,el4,iso_ref,brzo_ref)
        cmap(d,["8.2 Emergency preparedness","7.4 Communication","10.2 Corrective action"],["Art. 8, 9 Noodplan","Art. 6, 14 Rapportage"],["Phase 6.2 Managing risk"])
        sec_num=1
        for sec in sections:
            sec_title,sec_content=sec; st(d,sec_num,sec_title)
            if isinstance(sec_content,str): bt(d,sec_content)
            elif isinstance(sec_content,list) and len(sec_content)>1:
                if isinstance(sec_content[0],list):
                    try:
                        tbl(d,sec_content[0],sec_content[1:])
                    except (IndexError,ValueError):
                        bt(d,"[Tabel - zie implementatie document]")
            sec_num+=1
        src(d,["ISO 45001:2018 - 8.2 Emergency preparedness - ISO.org","BRZO 2015 - Art. 8, 9, 14 - Overheid.nl","Arbobesluit - Art. 3.20-3.25 BHV - Overheid.nl"])
        tv(d,[("ISO 45001","8.2 volledig","PASS","Noodplan + BHV + communicatie"),("BRZO","Art. 8-9-14","PASS","BNP + rapportage"),("Bedrijfs-agnostisch","Alle placeholders","PASS","Direct inzetbaar")])
        foot(d)
        safe_title=title.replace(" ","_").replace("'","").replace("/","_")
        fp=os.path.join(base4,f"{code}_{safe_title}_v{VERSION}.docx")
        d.save(fp); docs.append(fp)
    
    # Element 5: MoC
    base5="/root/projects/jg/2026-PM-VBS-Element5/deliverables/docx"
    el5="Element IV: Wijzigingenbeheer (MoC)"
    for code,title,iso_ref,brzo_ref,sections in [
        ("PM_VBS05_01","MoC Beleid Kaderdocument","8.1.3","Art. 5, Bijlage III.IV",
         [("Doel","Beleid voor Management of Change (MoC) conform ISO 45001 8.1.3."),
          ("MoC Beleid",[["Principe","Beschrijving"],["Scope","Alle wijzigingen aan processen, installaties, organisatie, procedures"],["Geldigheid","Elke wijziging (tijdelijk of permanent) die HSEQ-risico kan beinvloeden"],["Uitzondering","Exacte vervanging (like-for-like) zonder risicowijziging"],["Principe","Geen wijziging zonder vooraf goedgekeurde MoC-aanvraag"]])]),
        ("PM_VBS05_02","MoC Procedure","8.1.3","Art. 5",
         [("Doel","Gedetailleerde MoC-uitvoeringsprocedure."),
          ("MoC Processtappen",[["Stap","Activiteit","Verantwoordelijke","Output"],
            ["1. Initiatie","MoC-aanvraag formulier invullen","Initiator","Ingevuld formulier"],
            ["2. Classificatie","Categorie (I/II/III) bepalen","VBS-Coordinator","Risicoclassificatie"],
            ["3. Risicoanalyse","TRA/HAZOP/FMEA (afhankelijk categorie)","MoC team","Risicobeoordeling"],
            ["4. Goedkeuring","Autorisatie door bevoegd persoon","Autorisator","Goed-/afkeuring"],
            ["5. Implementatie","Wijziging doorvoeren conform plan","Projectleider","Implementatie rapport"],
            ["6. Verificatie","Post-implementation review","VBS-Coordinator","Verificatie rapport"],
            ["7. Afsluiting","MoC sluiten + documentatie update","VBS-Coordinator","Gesloten MoC"]])]),
        ("PM_VBS05_03","Classificatie Risicomatrix MoC","8.1.3","Art. 5",
         [("Doel","Risicomatrix voor classificatie van wijzigingen."),
          ("MoC Categorieen",[["Categorie","Risiconiveau","Voorbeelden","Autorisatie"],
            ["Cat. I - Laag","Risicoscore 1-5","Administratief, cosmetisch","Afdelingshoofd"],
            ["Cat. II - Matig","Risicoscore 6-11","Procedure wijziging, kleine aanpassing","VBS-Coordinator"],
            ["Cat. III - Hoog","Risicoscore 12-25","Proceswijziging, installatie wijziging","Directie + VBS"]])]),
        ("PM_VBS05_04","Formulierenpakket MoC","8.1.3","Art. 5",
         [("Doel","Alle formulieren voor het MoC proces."),
          ("Formulieren",[["Formulier","Toepassing","Code"],["MoC aanvraag","Initiatie wijziging","FM-MOC-001"],["Risicobeoordeling","TRA voor MoC","FM-MOC-002"],["Goedkeuring","Autorisatie formulier","FM-MOC-003"],["Verificatie","Post-implementation check","FM-MOC-004"]])]),
        ("PM_VBS05_05","MoC Register Dashboard","7.5","Art. 5",
         [("Doel","Register en dashboard voor tracking van alle MoC-aanvragen."),
          ("Dashboard KPI's",[["KPI","Target","Meting"],
            ["Openstaande MoC's","< 10","Register extract"],
            ["Gemiddelde doorlooptijd","< 5 werkdagen","Datumberekening"],
            ["% op tijd afgehandeld","> 95%","Deadline vs. afsluitdatum"],
            ["% Cat III met TRA","100%","Steekproef audit"]])]),
        ("PM_VBS05_06","RASCI Rollenmatrix MoC","5.3","Art. 5",
         [("Doel","RACI matrix specifiek voor het MoC proces."),
          ("RACI Matrix",[["Activiteit","Initiator","VBS-Coord","Expert","Afd.hfd","Directie"],
            ["MoC aanvragen","R","I","C","I","I"],
            ["Risico classificatie","I","R","C","I","I"],
            ["Risicoanalyse","C","A","R","C","I"],
            ["Goedkeuring Cat I/II","I","A","C","R","I"],
            ["Goedkeuring Cat III","I","C","C","C","A"],
            ["Implementatie","R","C","C","A","I"],
            ["Verificatie","I","R","C","C","I"]])]),
        ("PM_VBS05_07","Integratie Audit Crossreferentie","9.2","Art. 5",
         [("Doel","Cross-referentie tussen MoC en andere VBS-elementen voor auditdoeleinden."),
          ("Cross-referentie Matrix",[["MoC Fase","VBS Element","Document Referentie"],
            ["Risicoanalyse","Element 2: Gevaaridentificatie","PM_VBS02_03 Risicomatrix"],
            ["Goedkeuring","Element 1: Organisatie","PM_VBS01_02 Functieprofielen"],
            ["Communicatie","Element 1: Communicatie","PM_VBS01_12 Meldingsprocedure"],
            ["Training","Element 1: Training","PM_VBS01_04 Training Matrix"],
            ["PSSR","Element 3: Exploitatie","PM_VBS03_08 PSSR"]])]),
    ]:
        d=Document(); header(d,code,title,el5,iso_ref,brzo_ref)
        cmap(d,["8.1.3 Management of change","5.3 Roles"],["Art. 5 MoC vereisten"],["Phase 1.5, 3-4 Risk management"])
        sec_num=1
        for sec in sections:
            sec_title,sec_content=sec; st(d,sec_num,sec_title)
            if isinstance(sec_content,str): bt(d,sec_content)
            elif isinstance(sec_content,list) and len(sec_content)>1:
                if isinstance(sec_content[0],list):
                    try:
                        tbl(d,sec_content[0],sec_content[1:])
                    except (IndexError,ValueError):
                        bt(d,"[Tabel - zie implementatie document]")
            sec_num+=1
        src(d,["ISO 45001:2018 - 8.1.3 Management of change - ISO.org","BRZO 2015 - Art. 5, Bijlage III.IV - Overheid.nl","IOGP Report 423 - Phase 1.5 Risk management - IOGP.org"])
        tv(d,[("ISO 45001","8.1.3 volledig","PASS","MoC procedure + classificatie"),("BRZO","Art. 5 MoC","PASS","7 stappen + RACI"),("Bedrijfs-agnostisch","Alle placeholders","PASS","Direct inzetbaar")])
        foot(d)
        fp=os.path.join(base5,f"{code}_{title.replace(' ','_').replace('/','_')}_v{VERSION}.docx")
        d.save(fp); docs.append(fp)
    
    # Element 6: Toezicht op Prestaties
    base6="/root/projects/jg/2026-PM-VBS-Element6/deliverables/docx"
    el6="Element VI: Toezicht op Prestaties"
    for code,title,iso_ref,brzo_ref,sections in [
        ("PM_VBS06_01","Audit Beleid Kaderdocument","9.1, 9.2","Art. 5, Bijlage III.VI",
         [("Doel","Beleid voor interne audits conform ISO 45001 9.1-9.2."),
          ("Audit Beleid",[["Principe","Beschrijving"],["Scope","Alle VBS-elementen worden minimaal jaarlijks geaudit"],["Onafhankelijkheid","Auditoers mogen niet eigen werk auditeren"],["Competentie","Auditors zijn getraind (ISO 19011)","Rapportage","Bevindingen worden gerapporteerd aan Directie"],["Follow-up","Alle bevindingen binnen deadline afgehandeld (CAPA)"]])]),
        ("PM_VBS06_02","Intern Audit Programma","9.2","Art. 5",
         [("Doel","Jaarlijks intern auditprogramma conform ISO 45001 9.2."),
          ("Audit Planning",[["VBS Element","Frequentie","Scope","Auditor"],
            ["Element 1: Organisatie","Jaarlijks","Beleid, training, competentie","[AUDITOR]"],
            ["Element 2: Risico's","Jaarlijks","Gevarenregister, RI&E, HAZOP","[AUDITOR]"],
            ["Element 3: Exploitatie","2x per jaar","CoW, LOTO, onderhoud","[AUDITOR]"],
            ["Element 4: Noodplan","Jaarlijks","BNP, BHV, oefeningen","[AUDITOR]"],
            ["Element 5: MoC","Jaarlijks","Procedure, register, compliance","[AUDITOR]"],
            ["Element 6: Audit","Jaarlijks","Programma, bevoegdheid","[AUDITOR]"],
            ["Element 7: Verbetering","Jaarlijks","CAPA, trends, evaluatie","[AUDITOR]"]])]),
        ("PM_VBS06_03","Audit Checklist Matrix","9.2","Art. 5",
         [("Doel","Gestandaardiseerde audit checklists per VBS-element."),
          ("Checklist Template",[["Nr","Vraag","Norm (ISO/BRZO)","Status","Opmerking"],
            ["1","[AUDIT VRAAG]","[REFERENTIE]","[VOLDOET/NVT/AFWIJKING]",""],
            ["2","[AUDIT VRAAG]","[REFERENTIE]","[VOLDOET/NVT/AFWIJKING]",""]])]),
        ("PM_VBS06_04","KPI Dashboard Monitoring","9.1","Art. 5",
         [("Doel","KPI dashboard voor continue monitoring van VBS-prestaties."),
          ("Dashboard Elementen",[["Widget","Data bron","Frequentie","Verantwoordelijke"],
            ["TRIR/LTIF trend","Incidentregister","Maandelijks","VBS"],
            ["Audit bevindingen","Auditrapporten","Kwartaal","VBS"],
            ["CAPA status","CAPA-register","Wekelijks","VBS"],
            ["Training compliance","Training systeem","Maandelijks","VBS"],
            ["MoC status","MoC-register","Wekelijks","VBS"]])]),
        ("PM_VBS06_05","Compliance Monitoring Register","9.1, 6.1.3","Art. 5",
         [("Doel","Register voor monitoring van wettelijke compliance."),
          ("Compliance Register",[["Wetgeving","Artikel","Vereiste","Status","Volgende controle"],
            ["BRZO 2015","Art. 5","Veiligheidsrapportage","[STATUS]","[DATUM]"],
            ["Arbowet","Art. 5","RI&E","[STATUS]","[DATUM]"],
            ["Omgevingswet","[ART]","Vergunningsvoorwaarden","[STATUS]","[DATUM]"]])]),
        ("PM_VBS06_06","CAPA Procedure","10.2","Art. 5",
         [("Doel","Corrective and Preventive Action (CAPA) procedure conform ISO 45001 10.2."),
          ("CAPA Proces",[["Stap","Activiteit","Verantwoordelijke","Termijn"],
            ["1","Bevinding registreren","Auditor","Direct"],
            ["2","Oorzaak analyse (5-Why)","VBS + Afdeling","< 5 werkdagen"],
            ["3","Correctieve actie bepalen","VBS + Afdeling","< 5 werkdagen"],
            ["4","Actie implementeren","Verantwoordelijke","Per deadline"],
            ["5","Effectiviteit verificatie","VBS","< 30 dagen na actie"],
            ["6","CAPA sluiten","VBS","Na verificatie OK"]])]),
        ("PM_VBS06_07","Zelfevaluatie VBS","9.3","Art. 5",
         [("Doel","Zelfevaluatie-instrument voor het VBS conform ISO 45001 9.3."),
          ("Volwassenheidsniveaus",[["Niveau","Score","Kenmerken"],
            ["1 - Ad hoc","1","Geen systematiek, reactief"],
            ["2 - Reactief","2","Basis systematiek, voornamelijk reactief"],
            ["3 - Systematisch","3","Gestandaardiseerd, PDCA cyclus"],
            ["4 - Proactief","4","Data-gedreven, voorspellend"],
            ["5 - Excellent","5","Wereldklasse, continue innovatie"]])]),
    ]:
        d=Document(); header(d,code,title,el6,iso_ref,brzo_ref)
        cmap(d,["9.1 Monitoring, measurement","9.2 Internal audit","9.3 Management review","10.2 Corrective action"],["Art. 5 Prestatiebewaking","Bijlage III.VI"],["Phase 6.3 Performance review","Phase 8 Final evaluation"])
        sec_num=1
        for sec in sections:
            sec_title,sec_content=sec; st(d,sec_num,sec_title)
            if isinstance(sec_content,str): bt(d,sec_content)
            elif isinstance(sec_content,list) and len(sec_content)>1:
                if isinstance(sec_content[0],list):
                    try:
                        tbl(d,sec_content[0],sec_content[1:])
                    except (IndexError,ValueError):
                        bt(d,"[Tabel - zie implementatie document]")
            sec_num+=1
        src(d,["ISO 45001:2018 - 9.1-9.3 Performance evaluation - ISO.org","BRZO 2015 - Bijlage III.VI - Overheid.nl","ISO 19011:2018 Auditing management systems - ISO.org"])
        tv(d,[("ISO 45001","9.1-9.3 + 10.2","PASS","Volledige evaluatie cyclus"),("BRZO","Bijlage III.VI","PASS","Audit + CAPA + KPI's"),("Bedrijfs-agnostisch","Alle placeholders","PASS","Direct inzetbaar")])
        foot(d)
        fp=os.path.join(base6,f"{code}_{title.replace(' ','_').replace('/','_')}_v{VERSION}.docx")
        d.save(fp); docs.append(fp)
    
    # Element 7: Controle & Analyse
    base7="/root/projects/jg/2026-PM-VBS-Element7/deliverables/docx"
    el7="Element VII: Controle & Analyse"
    for code,title,iso_ref,brzo_ref,sections in [
        ("PM_VBS07_01","Controle Analyse Beleid Kaderdocument","9.3, 10.1","Art. 5, Bijlage III.VII",
         [("Doel","Kaderdocument voor controle, analyse en verbetering van het VBS conform ISO 45001 9.3 en 10."),
          ("Beleid",[["Principe","Beschrijving"],["Data-gedreven","Alle beslissingen gebaseerd op data en analyse"],["PDCA","Plan-Do-Check-Act cyclus ingebed in alle processen"],["Benchmarking","Jaarlijkse benchmark tegen branche en IOGP data"],["Transparantie","Resultaten gedeeld met alle belanghebbenden"]])]),
        ("PM_VBS07_02","Periodieke VBS Evaluatie","9.3","Art. 5",
         [("Doel","Procedure voor periodieke evaluatie van het VBS conform ISO 45001 9.3."),
          ("Evaluatie Agenda",[["Agendapunt","Input","Frequentie"],
            ["VBS prestaties","KPI dashboard","Jaarlijks"],
            ["Audit resultaten","Audit rapporten","Jaarlijks"],
            ["CAPA status","CAPA register","Jaarlijks"],
            ["Incident trends","Incident analyse","Jaarlijks"],
            ["Compliance status","Compliance register","Jaarlijks"],
            ["Beleid actualisatie","Herzieningsrapport","Jaarlijks"],
            ["Doelstellingen","VBS planning","Jaarlijks"]])]),
        ("PM_VBS07_03","Trendanalyse Data Analyse","9.1.2","Art. 5",
         [("Doel","Procedure voor systematische trend- en data-analyse conform ISO 45001 9.1.2."),
          ("Analyse Methoden",[["Methode","Toepassing","Frequentie"],
            ["TRIR/LTIF trend","Incidentfrequentie analyse","Maandelijks"],
            ["Pareto analyse","Top incidentoorzaken","Kwartaal"],
            ["BowTie analyse","Barrier effectiviteit","Jaarlijks"],
            ["Near-miss ratio","Meldingscultuur indicator","Maandelijks"],
            ["Compliance score","Nalevingspercentage","Kwartaal"]])]),
        ("PM_VBS07_04","Verbeterprogramma Continu Verbeteren","10.3","Art. 5",
         [("Doel","Verbeterprogramma voor continue verbetering van het VBS conform ISO 45001 10.3."),
          ("Verbetercyclus",[["Fase","Activiteit","Output"],
            ["Identificeren","Kansen voor verbetering identificeren (audit, incidenten, data)","Verbeter-ideeen register"],
            ["Prioriteren","Risico-based prioritering (effect x haalbaarheid)","Top 10 verbeterlijst"],
            ["Plannen","Plan van aanpak per verbetering","Projectplan"],
            ["Uitvoeren","Implementatie van verbeteringen","Implementatie rapport"],
            ["Evalueren","Effectmeting + lessons learned","Evaluatie rapport"]])]),
        ("PM_VBS07_05","VBS Volwassenheidsmodel Benchmark","9.3, 10.3","Art. 5",
         [("Doel","Volwassenheidsmodel en benchmark voor het VBS."),
          ("Volwassenheidsmodel",[["VBS Element","Niveau 1","Niveau 3","Niveau 5"],
            ["E1: Organisatie","Geen beleid","Gestandaardiseerd","Wereldklasse"],
            ["E2: Risico's","Ad hoc","Systematisch","Predictief"],
            ["E3: Exploitatie","Reactief","Proactief","Optimaliserend"],
            ["E4: Noodplan","Basis BNP","Getest & bijgewerkt","Geintegreerd"],
            ["E5: MoC","Geen procedure","Volledig geimplementeerd","Data-gedreven"],
            ["E6: Audit","Geen audits","Regulier programma","Risk-based + data"],
            ["E7: Verbetering","Geen structuur","PDCA cyclus","Continue innovatie"]])]),
    ]:
        d=Document(); header(d,code,title,el7,iso_ref,brzo_ref)
        cmap(d,["9.3 Management review","10.1-10.3 Improvement"],["Art. 5 Evaluatie + verbetering"],["Phase 8 Final evaluation"])
        sec_num=1
        for sec in sections:
            sec_title,sec_content=sec; st(d,sec_num,sec_title)
            if isinstance(sec_content,str): bt(d,sec_content)
            elif isinstance(sec_content,list) and len(sec_content)>1:
                if isinstance(sec_content[0],list):
                    try:
                        tbl(d,sec_content[0],sec_content[1:])
                    except (IndexError,ValueError):
                        bt(d,"[Tabel - zie implementatie document]")
            sec_num+=1
        src(d,["ISO 45001:2018 - 9.3 Management review, 10 Improvement - ISO.org","BRZO 2015 - Bijlage III.VII - Overheid.nl","IOGP Report 423 - Phase 8 Evaluation - IOGP.org"])
        tv(d,[("ISO 45001","9.3 + 10.1-10.3","PASS","Volledige verbetercyclus"),("BRZO","Bijlage III.VII","PASS","Evaluatie + verbetering"),("Bedrijfs-agnostisch","Alle placeholders","PASS","Direct inzetbaar")])
        foot(d)
        fp=os.path.join(base7,f"{code}_{title.replace(' ','_').replace('/','_')}_v{VERSION}.docx")
        d.save(fp); docs.append(fp)
    
    return docs


# ─── Main ────────────────────────────────────────────────────────────────────
if __name__ == "__main__":
    print("Gold Standard V2.0 Upgrade - Elementen 2 t/m 7")
    print("=" * 60)
    
    total=[]
    
    print("\n--- Element 2: Gevaaridentificatie ---")
    for fp in gen_element2():
        size=os.path.getsize(fp)
        print(f"  OK: {os.path.basename(fp)} ({size//1024}KB)")
        total.append(fp)
    
    print(f"\n--- Element 3: Exploitatiebeheersing ---")
    for fp in gen_element3():
        size=os.path.getsize(fp)
        print(f"  OK: {os.path.basename(fp)} ({size//1024}KB)")
        total.append(fp)
    
    print(f"\n--- Elementen 4-7 ---")
    for fp in gen_elements_4_7():
        size=os.path.getsize(fp)
        print(f"  OK: {os.path.basename(fp)} ({size//1024}KB)")
        total.append(fp)
    
    print(f"\n{'='*60}")
    print(f"TOTAAL: {len(total)} documenten gegenereerd")
