#!/usr/bin/env python3
"""
Gold Standard V2.0 Upgrade — VBS Element 1: Documenten 04-12
Vervolg op upgrade_element1_v2.py (docs 01-03)
"""

import os
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

BASE_DIR = "/root/projects/jg/2026-PM-VBS-Element1/deliverables"
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 set_cell_shading(cell, color_hex):
    shading_elm = parse_xml(f'<w:shd {nsdecls("w")} w:fill="{color_hex}"/>')
    cell._tc.get_or_add_tcPr().append(shading_elm)

def add_header_table(doc, doc_code, title, iso_clauses, brzo_articles):
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run(title.upper())
    run.bold = True
    run.font.size = Pt(18)
    run.font.color.rgb = PRIMARY
    p2 = doc.add_paragraph()
    p2.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run2 = p2.add_run("VBS Element 1: Organisatie & Personeel - Gold Standard Template")
    run2.font.size = Pt(11)
    run2.font.color.rgb = TEXT_DARK
    table = doc.add_table(rows=5, cols=4)
    table.style = 'Table Grid'
    meta = [
        ("Project:", "VBS Implementatie [BEDRIJFSNAAM]", "Documentcode:", doc_code),
        ("Type:", "Procedure / Template", "Versie:", VERSION),
        ("Auteur:", "JvG Consultancy", "Datum:", TODAY),
        ("Status:", "GOLD STANDARD TEMPLATE", "Classificatie:", "Vertrouwelijk"),
        ("ISO 45001:", iso_clauses, "BRZO 2015:", brzo_articles),
    ]
    for i, (k1, v1, k2, v2) in enumerate(meta):
        row = table.rows[i]
        for j, (key, val) in enumerate([(k1, v1), (k2, v2)]):
            cell_k = row.cells[j*2]
            cell_v = row.cells[j*2+1]
            set_cell_shading(cell_k, "003366")
            pk = cell_k.paragraphs[0].add_run(key)
            pk.bold = True; pk.font.size = Pt(9); pk.font.color.rgb = WHITE
            pv = cell_v.paragraphs[0].add_run(val)
            pv.font.size = Pt(9); pv.font.color.rgb = TEXT_DARK
    doc.add_paragraph()

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

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

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

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

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

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

def add_tv(doc, checks):
    doc.add_paragraph()
    p = doc.add_paragraph()
    run = p.add_run("TIERVERIFY LOG")
    run.bold = True; run.font.size = Pt(12); run.font.color.rgb = PRIMARY
    table = doc.add_table(rows=len(checks)+1, cols=4)
    table.style = 'Table Grid'
    for i, h in enumerate(["Check", "Criterium", "Status", "Opmerking"]):
        cell = table.rows[0].cells[i]
        set_cell_shading(cell, "003366")
        r = cell.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, val in enumerate([c, cr, s, rm]):
            cell = table.rows[ri+1].cells[ci]
            r = cell.paragraphs[0].add_run(val)
            r.font.size = Pt(8); r.font.color.rgb = TEXT_DARK

def add_footer(doc):
    for section in doc.sections:
        footer = section.footer
        footer.is_linked_to_previous = False
        p = footer.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)

def add_note(doc, title, text):
    table = doc.add_table(rows=1, cols=1)
    table.style = 'Table Grid'
    cell = table.rows[0].cells[0]
    set_cell_shading(cell, "E8F0FE")
    r1 = cell.paragraphs[0].add_run(f"{title}: ")
    r1.bold = True; r1.font.size = Pt(9); r1.font.color.rgb = PRIMARY
    r2 = cell.paragraphs[0].add_run(text)
    r2.font.size = Pt(9); r2.font.color.rgb = TEXT_DARK
    doc.add_paragraph()


# ─── Doc 04: Training Matrix ────────────────────────────────────────────────
def generate_doc04():
    doc = Document()
    add_header_table(doc, "PM_VBS01_04", "Training Matrix", "7.2, 7.3", "Art. 4, Bijlage III.I")
    add_compliance_box(doc,
        iso_items=["7.2 Competence (a-d)", "7.3 Awareness (a-f)"],
        brzo_items=["Bijlage III, I: Training en opleiding"],
        iogp_items=["Phase 2.1: HSE capability assessment", "423-01: Scoring system"])
    
    add_st(doc, "1", "Doel en Toepassingsgebied")
    add_bt(doc, "Deze Training Matrix definieert de vereiste trainingen, competentieniveaus en herhalingsfrequenties voor alle functies binnen [BEDRIJFSNAAM] conform ISO 45001 7.2 [1] en BRZO 2015 Bijlage III.I [2].")
    add_bt(doc, "De matrix dekt zowel generieke (BASIS) als specifieke (functiegerelateerde) trainingen, inclusief refresher-schema's en competentiebeoordelingen conform IOGP Report 423-01 [3].")
    
    add_st(doc, "2", "Competentieniveaus")
    add_bt(doc, "Elke training kent drie competentieniveaus:")
    add_tbl(doc,
        ["Niveau", "Definitie", "Toetsing", "Certificering"],
        [
            ["B = Basis", "Bewustzijn en basiskennis", "Theorietoets (70% grens)", "Certificaat geldig 3 jaar"],
            ["G = Gevorderd", "Toegepaste kennis en vaardigheden", "Praktijktoets + theorie", "Certificaat geldig 2 jaar"],
            ["E = Expert", "Diepgaande expertise, kan anderen trainen", "Assessment + portfolio", "Certificaat geldig 2 jaar"],
        ])
    
    add_st(doc, "3", "Training Matrix Overzicht")
    add_tbl(doc,
        ["Training", "Directie", "VBS-Coord.", "Ops. Mgr", "Afd.-hoofd", "Voorman", "Operator", "Contractor", "Refresher"],
        [
            ["VCA Basis", "-", "-", "-", "-", "-", "B", "B", "5 jaar"],
            ["VCA VOL", "B", "B", "B", "B", "B", "-", "-", "5 jaar"],
            ["PBZO Bewustzijn", "G", "E", "G", "G", "B", "B", "B", "3 jaar"],
            ["BRZO/Seveso III", "G", "E", "G", "B", "-", "-", "-", "2 jaar"],
            ["Gevaarlijke Stoffen", "-", "E", "G", "G", "G", "G", "G", "2 jaar"],
            ["Stofexplosie (ATEX)", "-", "E", "G", "G", "G", "G*", "G*", "2 jaar"],
            ["TRA / JSA", "-", "E", "G", "G", "G", "G", "G", "2 jaar"],
            ["LOTO", "-", "E", "G", "G", "G", "G", "G", "1 jaar"],
            ["Werken op Hoogte", "-", "G", "G", "G", "G", "G*", "-", "2 jaar"],
            ["BHV / Noodprocedure", "B", "G", "G", "G", "G", "B", "B", "1 jaar"],
            ["CoW / Werkvergunning", "-", "E", "G", "G", "G", "G", "G", "1 jaar"],
            ["PBM Gebruik", "-", "G", "G", "G", "G", "G", "G", "2 jaar"],
            ["Incident Melden", "B", "E", "G", "G", "G", "G", "G", "1 jaar"],
            ["Milieubewustzijn", "B", "G", "B", "B", "B", "B", "B", "3 jaar"],
            ["MoC Procedure", "B", "E", "G", "G", "B", "-", "-", "2 jaar"],
            ["Onderaannemers Mgmt", "-", "E", "G", "B", "-", "-", "-", "2 jaar"],
        ])
    add_bt(doc, "* = Alleen indien functie dit vereist (functie-specifieke training)")
    
    add_st(doc, "4", "IOGP 423-01 Competentie Assessment")
    add_bt(doc, "Conform IOGP Report 423-01 [3] wordt voor elke medewerker een HSE capability assessment uitgevoerd:")
    add_tbl(doc,
        ["Assessment Element", "Methode", "Frequentie", "Verantwoordelijke"],
        [
            ["Kennis (theorie)", "Schriftelijke toets", "Bij aanname + refresher", "VBS-Coordinator"],
            ["Vaardigheden (praktijk)", "Praktijkobservatie + checklist", "Jaarlijks", "Afdelingshoofd"],
            ["Gedrag (attitude)", "Gedragsobservatie + 360 feedback", "Jaarlijks", "Leidinggevende"],
            ["Ervaring (portfolio)", "CV + werkervaring log", "Bij aanname", "HR / VBS"],
            ["Overall score", "IOGP 423-01 scoring 1-5", "Jaarlijks", "VBS-Coordinator"],
        ])
    
    add_st(doc, "5", "Training Planning & Tracking")
    add_bt(doc, "Alle trainingen worden geregistreerd in het [TRAINING MANAGEMENT SYSTEEM] met de volgende velden:")
    add_tbl(doc,
        ["Veld", "Beschrijving", "Voorbeeld"],
        [
            ["Medewerker ID", "Uniek personeelsnummer", "[PERSOONSNUMMER]"],
            ["Naam", "Volledige naam medewerker", "[NAAM]"],
            ["Functie", "Huidige functie", "[FUNCTIE]"],
            ["Training", "Naam van de training", "LOTO Procedure"],
            ["Niveau vereist", "B/G/E vanuit matrix", "G"],
            ["Niveau behaald", "Werkelijk behaald niveau", "G"],
            ["Datum voltooid", "Datum training afgerond", "[DATUM]"],
            ["Geldig tot", "Vervaldatum certificaat", "[DATUM + 2jr]"],
            ["Status", "Geldig/Verlopen/Gepland", "Geldig"],
            ["Opmerkingen", "Extra info", "Volgende: refresher 2027"],
        ])
    
    add_src(doc, [
        "ISO 45001:2018 - 7.2 Competence, 7.3 Awareness - ISO.org",
        "BRZO 2015 - Bijlage III, I: Organisatie en personeel - Overheid.nl",
        "IOGP Report 423-01 - Contractor HSE Capability Assessment - IOGP.org",
        "Arbobesluit - Artikel 3.6: Voorlichting en instructie - Overheid.nl",
    ])
    add_tv(doc, [
        ("Completeness", "Alle ISO 45001 7.2 vereisten", "PASS", "Competentie + awareness + documentatie"),
        ("IOGP 423-01", "Scoring system geintegreerd", "PASS", "1-5 scoring + assessment elementen"),
        ("Bedrijfs-agnostisch", "Alle placeholders", "PASS", "Geen specifieke bedrijfsdata"),
        ("Bronverwijzingen", "[1]-[4]", "PASS", "4 bronnen"),
    ])
    add_footer(doc)
    fp = os.path.join(BASE_DIR, f"PM_VBS01_04_Training_Matrix_v{VERSION}.docx")
    doc.save(fp)
    print(f"OK: {fp}")
    return fp


# ─── Doc 05: Inwerkprogramma ────────────────────────────────────────────────
def generate_doc05():
    doc = Document()
    add_header_table(doc, "PM_VBS01_05", "Inwerkprogramma Nieuwe Medewerkers", "7.2, 7.3", "Art. 4, Bijlage III.I")
    add_compliance_box(doc,
        iso_items=["7.2 Competence (b) training, (c) actions", "7.3 Awareness (a-f)"],
        brzo_items=["Bijlage III, I: Training bij indiensttreding"],
        iogp_items=["Phase 5: Mobilization activities"])
    
    add_st(doc, "1", "Doel en Toepassingsgebied")
    add_bt(doc, "Dit inwerkprogramma waarborgt dat alle nieuwe medewerkers, uitzendkrachten en contractors van [BEDRIJFSNAAM] een gestructureerde veiligheidsintroductie ontvangen voordat zij zelfstandig werkzaamheden uitvoeren conform ISO 45001 7.2 [1] en BRZO 2015 Bijlage III.I [2].")
    
    add_st(doc, "2", "Inwerkfasen")
    add_tbl(doc,
        ["Fase", "Onderwerp", "Duur", "Door wie", "Toetsing", "Handtekening"],
        [
            ["1. Dag 1 - Algemeen", "Bedrijfsintroductie + veiligheidsregels", "2 uur", "HR + VBS-Coord.", "Theorietoets", "[Handtekening]"],
            ["2. Dag 1 - Veiligheid", "PBZO, noodprocedure, evacuatie, BHV", "2 uur", "VBS-Coordinator", "Praktijkoefening", "[Handtekening]"],
            ["3. Dag 1 - PBM", "PBM-selectie, gebruik, onderhoud", "1 uur", "VBS-Coordinator", "PBM-fit check", "[Handtekening]"],
            ["4. Dag 2 - Locatie", "Locatie-instructie, gevarenzones, routes", "2 uur", "Afdelingshoofd", "Rondgang + quiz", "[Handtekening]"],
            ["5. Dag 2 - Procedure", "CoW, LOTO, TRA, melden", "2 uur", "Voorman", "Praktijkoefening", "[Handtekening]"],
            ["6. Week 1 - Functie", "Functie-specifieke training (zie matrix)", "Varieert", "Mentor", "Competentie check", "[Handtekening]"],
            ["7. Week 2-4 - Praktijk", "Werkzaamheden onder toezicht", "3 weken", "Mentor + Voorman", "Observatieverslag", "[Handtekening]"],
            ["8. Week 4 - Evaluatie", "Evaluatie inwerkperiode + vrijgave", "1 uur", "VBS-Coord + Afd.hfd", "Assessment form", "[Handtekening]"],
        ])
    
    add_st(doc, "3", "Specifieke Elementen")
    add_bt(doc, "3.1 Veiligheidsintroductie (Verplicht voor ALLEN)", bold=True)
    add_tbl(doc,
        ["Onderdeel", "Inhoud", "Duur", "Materiaal"],
        [
            ["Algemene veiligheidsregels", "10 gouden regels, housekeeping, snelheid", "30 min", "Presentatie"],
            ["PBZO uitleg", "Belang, reikwijdte, eigen verantwoordelijkheid", "20 min", "PBZO samenvatting"],
            ["Noodprocedure", "Alarmsignalen, verzamelpunten, evacuatieroutes", "30 min", "Evacuatieplattegrond"],
            ["BHV informatie", "Wie zijn BHV'ers, eerste hulp middelen, AED", "15 min", "BHV-overzicht"],
            ["Meldingsplicht", "Hoe incidenten/near-misses melden", "15 min", "Meldingsformulier"],
            ["PBM's", "Selectie, gebruik, onderhoud, vervanging", "30 min", "PBM-matrix"],
            ["Gevaarlijke stoffen", "Basis kennis, SDS-locatie, labeling", "20 min", "SDS-overzicht"],
        ])
    
    add_bt(doc, "3.2 Mentorschap", bold=True)
    add_bt(doc, "Elke nieuwe medewerker krijgt een toegewezen mentor voor de eerste 4 weken:")
    add_tbl(doc,
        ["Rol", "Verantwoordelijkheid", "Tijdsinvestering", " Vereist"],
        [
            ["Mentor", "Begeleiden, observeren, corrigeren, feedback geven", "Min. 50% van werktijd week 1-2", "VCA-VOL + 2jr ervaring"],
            ["Leidinggevende", "Voortgangsbewaking, evaluatie, vrijgave", "Wekelijks 30 min overleg", "VCA-VOL"],
            ["VBS-Coordinator", "Kwaliteitscontrole inwerkproces", "Steekproef + eindassessment", "HBO/WO veiligheidskunde"],
        ])
    
    add_st(doc, "4", "Contractor Inwerkprogramma")
    add_bt(doc, "Contractors volgen een verkort maar vergelijkbaar programma conform IOGP Report 423, Phase 5 (Mobilization) [3]:")
    add_tbl(doc,
        ["Fase", "Onderwerp", "Duur", "Toetsing"],
        [
            ["Pre-mob (off-site)", "HSE capability assessment (IOGP 423-01)", "Varieert", "Score >= 3/5"],
            ["Dag 1 - Site intro", "Veiligheidsregels, noodprocedure, PBM", "3 uur", "Theorietoets"],
            ["Dag 1 - Specifiek", "CoW, LOTO, specifieke risico's opdracht", "2 uur", "Praktijk check"],
            ["Week 1 - Toezicht", "Werkzaamheden onder toezicht", "1 week", "Observatieverslag"],
        ])
    
    add_st(doc, "5", "Documentatie en Registratie")
    add_bt(doc, "Alle inwerkactiviteiten worden gedocumenteerd conform ISO 45001 7.5 [1]:")
    add_bl(doc, "Inwerkformulier per medewerker (alle fasen met handtekeningen)")
    add_bl(doc, "Theorietoetsen (bewaard in persoonlijk dossier)")
    add_bl(doc, "Competentie-checklist (getekend door mentor + leidinggevende)")
    add_bl(doc, "Vrijgaveformulier (getekend door VBS-Coordinator)")
    add_bl(doc, "Contractor HSE capability assessment score (IOGP 423-01)")
    
    add_src(doc, [
        "ISO 45001:2018 - 7.2 Competence, 7.5 Documented information - ISO.org",
        "BRZO 2015 - Bijlage III, I: Organisatie en personeel - Overheid.nl",
        "IOGP Report 423 - Phase 5: Mobilization - IOGP.org",
        "IOGP Report 423-01 - HSE Capability Assessment Scoring - IOGP.org",
    ])
    add_tv(doc, [
        ("Completeness", "Alle ISO 45001 7.2 vereisten", "PASS", "Competentie + awareness + documentatie"),
        ("IOGP 423", "Phase 5 mobilization", "PASS", "Contractor inwerkprogramma"),
        ("Bedrijfs-agnostisch", "Alle placeholders", "PASS", "Geen specifieke bedrijfsdata"),
    ])
    add_footer(doc)
    fp = os.path.join(BASE_DIR, f"PM_VBS01_05_Inwerkprogramma_v{VERSION}.docx")
    doc.save(fp)
    print(f"OK: {fp}")
    return fp


# ─── Doc 06: Toolbox Meeting ────────────────────────────────────────────────
def generate_doc06():
    doc = Document()
    add_header_table(doc, "PM_VBS01_06", "Toolbox Meeting Procedure", "7.3, 7.4", "Art. 4, Bijlage III.I")
    add_compliance_box(doc,
        iso_items=["7.3 Awareness (a-f)", "7.4 Communication (7.4.1-7.4.3)"],
        brzo_items=["Bijlage III, I: Communicatie en overleg"],
        iogp_items=["Phase 6.3: Performance review meetings"])
    
    add_st(doc, "1", "Doel en Toepassingsgebied")
    add_bt(doc, "Deze procedure definieert de structuur, frequentie en verantwoordelijkheden voor toolbox meetings binnen [BEDRIJFSNAAM] als primair communicatiemiddel voor veiligheidsbewustzijn conform ISO 45001 7.3 en 7.4 [1].")
    
    add_st(doc, "2", "Frequentie en Planning")
    add_tbl(doc,
        ["Type", "Frequentie", "Deelnemers", "Duur", "Verantwoordelijke"],
        [
            ["Reguliere toolbox", "Wekelijks (vast moment)", "Alle teamleden + contractors", "15-20 min", "Voorman / Teamleider"],
            ["Project toolbox", "Aanvang elk nieuw project/werk", "Betrokken team", "15-30 min", "Uitvoerend leidinggevende"],
            ["Ad-hoc toolbox", "Na incident / bijzondere situatie", "Alle beschikbare teamleden", "15-20 min", "VBS-Coordinator"],
            ["Safety moment", "Dagelijks (start dienst)", "Shift team", "5 min", "Shiftleider"],
        ])
    
    add_st(doc, "3", "Opbouw Toolbox Meeting")
    add_bt(doc, "Standaard agenda (15-20 minuten):")
    add_tbl(doc,
        ["Tijd", "Onderdeel", "Inhoud", "Wie"],
        [
            ["0-2 min", "Opening", "Aanwezigen registeren, agenda", "Voorzitter"],
            ["2-5 min", "Terugblik", "Vorige afspraken, openstaande acties", "Voorzitter"],
            ["5-15 min", "Hoofdtopic", "Veiligheidsthema (zie topic library)", "Voorzitter + discussie"],
            ["15-18 min", "Ronde", "Elke deelnemer: observaties, zorgen", "Alle deelnemers"],
            ["18-20 min", "Afsluiting", "Actiepunten, volgende toolbox", "Voorzitter"],
        ])
    
    add_st(doc, "4", "Topic Library (Minimaal 52 topics voor jaarplanning)")
    add_tbl(doc,
        ["Nr", "Topic", "Categorie", "Seizoen"],
        [
            ["1", "Gevaarlijke stoffen - SDS, labeling, opslag", "Chemische risico's", "Q1"],
            ["2", "LOTO - vergrendelen, taggen, uitproberen", "Operationele veiligheid", "Q1"],
            ["3", "Werken op hoogte - valbeveiliging, ladderuse", "Fysieke risico's", "Q1"],
            ["4", "Stofexplosie - ATEX zones, ontstekingsbronnen", "Procesveiligheid", "Q1"],
            ["5", "CoW systeem - aanvragen, beoordelen, sluiten", "Operationele veiligheid", "Q1"],
            ["6", "PBM's - juiste keuze, gebruik, onderhoud", "Persoonlijke bescherming", "Q1"],
            ["7", "Incident melden - wanneer, hoe, waarom", "Meldingscultuur", "Q2"],
            ["8", "MoC - wijzigingen herkennen en beoordelen", "Wijzigingsmanagement", "Q2"],
            ["9", "Noodprocedure - alarm, evacuatie, BHV", "Noodresponse", "Q2"],
            ["10", "Huiselijkheid - opruimen, ordenen, acceswegen", "Huiselijkheid", "Q2"],
            ["11", "Ergonomie - tillen, staan, beeldschermwerk", "Fysieke belasting", "Q2"],
            ["12", "Hitte/koude stress - symptomen, preventie", "Weer-gerelateerd", "Q3/Q4"],
            ["13", "Elektrische veiligheid - spanningsloos, ATEX", "Elektrische risico's", "Q3"],
            ["14", "Verkeersveiligheid - site verkeer, vrachtwagens", "Logistiek", "Q3"],
            ["15", "Asbest/Chroom-6 - herkenning, procedure", "Specifieke stoffen", "Q3"],
        ])
    add_bt(doc, "[Vervolg met topics 16-52 op basis van bedrijfsrisico's — aanvullen met specifieke topics voor [BEDRIJFSNAAM]]")
    
    add_st(doc, "5", "Effectiviteitsmeting")
    add_tbl(doc,
        ["KPI", "Target", "Meting", "Frequentie"],
        [
            ["Deelnamepercentage", "> 90%", "Aanwezigheidsregister", "Wekelijks"],
            ["Gemiddelde score theoriecheck", "> 7/10", "Korte quiz per toolbox", "Wekelijks"],
            ["Aantal actiepunten per toolbox", "2-5", "Actielijst", "Wekelijks"],
            ["Opvolging actiepunten", "100% binnen 2 weken", "Actietracker", "Maandelijks"],
            ["Medewerkerstevredenheid", "> 4/5", "Kwartaalenquete", "Kwartaal"],
        ])
    
    add_src(doc, [
        "ISO 45001:2018 - 7.3 Awareness, 7.4 Communication - ISO.org",
        "BRZO 2015 - Bijlage III, I: Communicatie - Overheid.nl",
        "IOGP Report 423 - Phase 6.3: Performance review meetings - IOGP.org",
    ])
    add_tv(doc, [
        ("ISO 45001", "7.3 + 7.4 gedekt", "PASS", "Awareness + communicatie"),
        ("Praktisch", "52 topics + effectiviteitsmeting", "PASS", "Jaarplanning mogelijk"),
        ("Bedrijfs-agnostisch", "Alle placeholders", "PASS", "Geen specifieke bedrijfsdata"),
    ])
    add_footer(doc)
    fp = os.path.join(BASE_DIR, f"PM_VBS01_06_Toolbox_Meeting_Procedure_v{VERSION}.docx")
    doc.save(fp)
    print(f"OK: {fp}")
    return fp


# ─── Doc 07: Competentie Assessment ─────────────────────────────────────────
def generate_doc07():
    doc = Document()
    add_header_table(doc, "PM_VBS01_07", "Competentie Assessment Formulier", "7.2", "Art. 4, Bijlage III.I")
    add_compliance_box(doc,
        iso_items=["7.2 Competence (a-d): bepalen, waarborgen, acties, documentatie"],
        brzo_items=["Bijlage III, I: Bevoegdheid en bekwaamheid"],
        iogp_items=["423-01: HSE Capability Assessment Scoring"])
    
    add_st(doc, "1", "Doel en Toepassingsgebied")
    add_bt(doc, "Dit formulier dient ter systematische beoordeling van de competentie van medewerkers, conform ISO 45001 7.2 [1] en BRZO 2015 Bijlage III.I [2]. Het integreert het IOGP 423-01 scoringssysteem [3] voor HSE capability assessment.")
    
    add_st(doc, "2", "Beoordelingscriteria (IOGP 423-01 Scoring)")
    add_tbl(doc,
        ["Score", "Niveau", "Definitie", "Actie"],
        [
            ["1", "Onvoldoende", "Geen kennis/vaardigheid aanwezig", "Direct training + herbeoordeling"],
            ["2", "Zwak", "Basisbegrip maar onvoldoende toegepast", "Training + coaching + herbeoordeling"],
            ["3", "Voldoende", "Voldoet aan minimumeisen", "Reguliere refresher training"],
            ["4", "Goed", "Boven gemiddeld, kan anderen begeleiden", "Kandidaat voor mentorschap"],
            ["5", "Uitstekend", "Expertniveau, kan training geven", "Kandidaat voor trainer/assessor"],
        ])
    
    add_st(doc, "3", "Assessment Formulier Template")
    add_tbl(doc,
        ["Veld", "Waarde"],
        [
            ["Medewerker naam", "[NAAM]"],
            ["Personeelsnummer", "[PERSOONSNUMMER]"],
            ["Functie", "[FUNCTIE]"],
            ["Afdeling", "[AFDELING]"],
            ["Beoordelaar", "[NAAM BEOORDELAAR]"],
            ["Datum assessment", "[DATUM]"],
            ["Volgende assessment", "[DATUM + 1 JAAR]"],
        ])
    
    add_st(doc, "4", "Competentie Domeinen")
    add_tbl(doc,
        ["Domein", "Competentie", "Vereist Niveau", "Score (1-5)", "Opmerking"],
        [
            ["Kennis", "BRZO/Seveso III bewustzijn", "[NIVEAU]", "[SCORE]", ""],
            ["Kennis", "Gevaarlijke stoffen (SDS, CLP)", "[NIVEAU]", "[SCORE]", ""],
            ["Kennis", "Procesveiligheid (HAZOP, FMECA)", "[NIVEAU]", "[SCORE]", ""],
            ["Vaardigheid", "TRA/JSA uitvoeren", "[NIVEAU]", "[SCORE]", ""],
            ["Vaardigheid", "CoW systeem gebruiken", "[NIVEAU]", "[SCORE]", ""],
            ["Vaardigheid", "LOTO procedure toepassen", "[NIVEAU]", "[SCORE]", ""],
            ["Vaardigheid", "PBM selectie en gebruik", "[NIVEAU]", "[SCORE]", ""],
            ["Gedrag", "Meldingsbereidheid (near-miss)", "[NIVEAU]", "[SCORE]", ""],
            ["Gedrag", "Veiligheidscultuur bijdrage", "[NIVEAU]", "[SCORE]", ""],
            ["Gedrag", "Samenwerking en communicatie", "[NIVEAU]", "[SCORE]", ""],
            ["Noodresponse", "Evacuatieprocedure kennen", "[NIVEAU]", "[SCORE]", ""],
            ["Noodresponse", "Eerste hulp basis", "[NIVEAU]", "[SCORE]", ""],
        ])
    
    add_st(doc, "5", "Ontwikkelplan")
    add_tbl(doc,
        ["Competentie gap", "Gewenst niveau", "Actie (training/coaching)", "Deadline", "Verantwoordelijke"],
        [
            ["[GAP 1]", "[NIVEAU]", "[ACTIE]", "[DATUM]", "[NAAM]"],
            ["[GAP 2]", "[NIVEAU]", "[ACTIE]", "[DATUM]", "[NAAM]"],
            ["[GAP 3]", "[NIVEAU]", "[ACTIE]", "[DATUM]", "[NAAM]"],
        ])
    
    add_bt(doc, "Handtekeningen:", bold=True)
    add_tbl(doc,
        ["Rol", "Naam", "Handtekening", "Datum"],
        [
            ["Medewerker", "[NAAM]", "", "[DATUM]"],
            ["Direct leidinggevende", "[NAAM]", "", "[DATUM]"],
            ["VBS-Coordinator", "[NAAM]", "", "[DATUM]"],
        ])
    
    add_src(doc, [
        "ISO 45001:2018 - 7.2 Competence (a-d) - ISO.org",
        "BRZO 2015 - Bijlage III, I: Bevoegdheid en bekwaamheid - Overheid.nl",
        "IOGP Report 423-01 - HSE Capability Assessment Scoring - IOGP.org",
    ])
    add_tv(doc, [
        ("ISO 45001", "7.2 volledig gedekt", "PASS", "Bepalen, waarborgen, acties, documentatie"),
        ("IOGP 423-01", "Scoring 1-5 geintegreerd", "PASS", "5 niveaus met acties"),
        ("Bedrijfs-agnostisch", "Alle placeholders", "PASS", "Formulier direct bruikbaar"),
    ])
    add_footer(doc)
    fp = os.path.join(BASE_DIR, f"PM_VBS01_07_Competentie_Assessment_v{VERSION}.docx")
    doc.save(fp)
    print(f"OK: {fp}")
    return fp


# ─── Doc 08: BASIS Training ─────────────────────────────────────────────────
def generate_doc08():
    doc = Document()
    add_header_table(doc, "PM_VBS01_08", "BASIS Training Programma", "7.2, 7.3", "Art. 4, Bijlage III.I")
    add_compliance_box(doc,
        iso_items=["7.2 Competence (b-c)", "7.3 Awareness (a-f)"],
        brzo_items=["Bijlage III, I: Algemene veiligheidstraining"],
        iogp_items=["Phase 5: Mobilization", "423-01: Capability assessment"])
    
    add_st(doc, "1", "Doel en Doelgroep")
    add_bt(doc, "Het BASIS-training programma voorziet alle medewerkers van [BEDRIJFSNAAM] van fundamentele veiligheidskennis conform ISO 45001 7.2 en 7.3 [1]. Dit is de minimale set trainingen die elke medewerker MOET hebben voltooid voordat zelfstandige werkuitvoering is toegestaan.")
    
    add_st(doc, "2", "Modules")
    add_tbl(doc,
        ["Module", "Onderwerp", "Duur", "Methodiek", "Toetsing"],
        [
            ["M01", "Bedrijfsveiligheid introductie", "60 min", "Klassikaal + video", "Theorietoets (70%)"],
            ["M02", "BRZO/Seveso III bewustzijn", "45 min", "Klassikaal + case", "Theorietoets (70%)"],
            ["M03", "Gevaarlijke stoffen basis", "60 min", "Klassikaal + praktijk", "Theorietoets + oefening"],
            ["M04", "Meldingsplicht incidenten", "30 min", "Klassikaal + voorbeelden", "Theorietoets (70%)"],
            ["M05", "Noodprocedure + evacuatie", "60 min", "Klassikaal + oefening", "Praktijkoefening"],
            ["M06", "PBM selectie en gebruik", "45 min", "Klassikaal + fitting", "Praktijkcheck"],
            ["M07", "Huiselijkheid en orde", "30 min", "Klassikaal + rondgang", "Observatie"],
            ["M08", "CoW systeem basis", "45 min", "Klassikaal + voorbeelden", "Theorietoets (70%)"],
            ["M09", "LOTO bewustzijn", "30 min", "Klassikaal + video", "Theorietoets (70%)"],
            ["M10", "Milieubewustzijn", "30 min", "Klassikaal", "Theorietoets (70%)"],
        ])
    add_bt(doc, "Totale duur BASIS programma: ca. 7,5 uur (verspreid over 2 dagen)")
    
    add_st(doc, "3", "Certificering")
    add_bt(doc, "Na succesvolle afronding ontvangt de medewerker een BASIS Veiligheidscertificaat met de volgende eigenschappen:")
    add_bl(doc, "Geldigheidsduur: 3 jaar")
    add_bl(doc, "Refresher: verplicht na 3 jaar of na significant incident")
    add_bl(doc, "Registratie: in [TRAINING MANAGEMENT SYSTEEM]")
    add_bl(doc, "Voorwaarden: alle 10 modules afgerond met voldoende resultaat")
    
    add_src(doc, [
        "ISO 45001:2018 - 7.2 Competence, 7.3 Awareness - ISO.org",
        "BRZO 2015 - Bijlage III, I: Training - Overheid.nl",
        "IOGP Report 423 - Phase 5: Mobilization - IOGP.org",
    ])
    add_tv(doc, [
        ("ISO 45001", "7.2 + 7.3 gedekt", "PASS", "10 modules met toetsing"),
        ("Completeness", "Alle BRZO basisvereisten", "PASS", "PBZO + BRZO + melding + nood + PBM"),
        ("Bedrijfs-agnostisch", "Alle placeholders", "PASS", "Direct inzetbaar"),
    ])
    add_footer(doc)
    fp = os.path.join(BASE_DIR, f"PM_VBS01_08_BASIS_Training_Programma_v{VERSION}.docx")
    doc.save(fp)
    print(f"OK: {fp}")
    return fp


# ─── Doc 09: Specifieke Training ────────────────────────────────────────────
def generate_doc09():
    doc = Document()
    add_header_table(doc, "PM_VBS01_09", "Specifieke Training Programma", "7.2", "Art. 4, Bijlage III.I")
    add_compliance_box(doc,
        iso_items=["7.2 Competence (a-d): functie-specifieke competenties"],
        brzo_items=["Bijlage III, I: Specifieke training procesveiligheid"],
        iogp_items=["423-01: Scope-specific questionnaires"])
    
    add_st(doc, "1", "Doel en Doelgroep")
    add_bt(doc, "Dit document beschrijft de specifieke trainingen voor medewerkers van [BEDRIJFSNAAM] die funtie-gebonden risico's moeten beheersen. Deze trainingen zijn ADDITIONEEL op het BASIS programma (PM_VBS01_08) en worden toegewezen op basis van de Training Matrix (PM_VBS01_04).")
    
    add_st(doc, "2", "Specifieke Training Modules")
    add_tbl(doc,
        ["Module", "Onderwerp", "Doelgroep", "Duur", "Toetsing", "Refresher"],
        [
            ["S01", "Stofexplosie / ATEX", "Operators nabij stof/EX zones", "4 uur", "Theorie + praktijk", "2 jaar"],
            ["S02", "Chemische stoffen (CLP/SDS)", "Operators met chemische stoffen", "4 uur", "Theorie + casus", "2 jaar"],
            ["S03", "TRA/JSA uitvoeren", "Alle operationele leidinggevenden", "4 uur", "Praktijktoets", "2 jaar"],
            ["S04", "LOTO uitvoerend", "Onderhoudspersoneel + operators", "4 uur", "Praktijktoets", "1 jaar"],
            ["S05", "Werken op hoogte", "Alle medewerkers > 2,5m werkzaamheden", "4 uur", "Praktijktoets", "2 jaar"],
            ["S06", "Besloten ruimten", "Medewerkers in besloten ruimtes", "4 uur", "Theorie + praktijk", "2 jaar"],
            ["S07", "Graafwerkzaamheden", "Medewerkers bij grondverzet", "3 uur", "Theorie + praktijk", "2 jaar"],
            ["S08", "Asbest herkenning", "Alle medewerkers potentiële blootstelling", "3 uur", "Theorietoets", "2 jaar"],
            ["S09", "Chroom-6 procedures", "Specifieke medewerkers CR(VI)", "4 uur", "Theorie + praktijk", "1 jaar"],
            ["S10", "Heftruck / reachtruck", "Gemachtigde bestuurders", "2 dagen", "Praktijkexamen", "3 jaar"],
            ["S11", "Kraan / hijswerkzaamheden", "Gemachtigde kraanbestuurders", "2 dagen", "Praktijkexamen", "3 jaar"],
            ["S12", "Electrische veiligheid", "Elektrotechnisch personeel", "1 dag", "Theorie + praktijk", "2 jaar"],
        ])
    
    add_st(doc, "3", "Training Eisen per Module")
    add_bt(doc, "3.1 Voorbeeld: S01 Stofexplosie / ATEX", bold=True)
    add_tbl(doc,
        ["Element", "Inhoud"],
        [
            ["Leerdoelen", "1) ATEX zones herkennen, 2) ontstekingsbronnen identificeren, 3) explosiepreventie toepassen, 4) noodprocedure kennen"],
            ["Theorie", "ATEX 114/137 richtlijnen, stofexplosie parameters (Kst, Pmax), zone-indeling, ontstekingsbronnenanalyse"],
            ["Praktijk", "Zone-indeling eigen locatie, inspectie ontstekingsbronnen, EX-apparatuur herkennen"],
            ["Toetsing", "Theorietoets (70% grens) + praktijkopdracht zone-indeling + mondelinge beoordeling"],
            ["Certificering", "Certificaat Stofexplosie Bewustzijn, geldig 2 jaar"],
            ["Verwijzing", "ATEX 114/137, PGS 15, BRZO Art. 10, ISO 45001 8.1"],
        ])
    
    add_src(doc, [
        "ISO 45001:2018 - 7.2 Competence - ISO.org",
        "BRZO 2015 - Bijlage III, I + Art. 10 - Overheid.nl",
        "ATEX Richtlijn 2014/34/EU en 1999/92/EC - EUR-Lex",
        "IOGP Report 423-01 - Scope-specific questionnaires - IOGP.org",
    ])
    add_tv(doc, [
        ("ISO 45001", "7.2 volledig gedekt", "PASS", "Functie-specifieke competenties"),
        ("BRZO", "Art. 10 procesveiligheid", "PASS", "Stofexplosie + chemische stoffen"),
        ("Bedrijfs-agnostisch", "Alle placeholders", "PASS", "12 modules toegevoegd"),
    ])
    add_footer(doc)
    fp = os.path.join(BASE_DIR, f"PM_VBS01_09_SPECIFIEKE_Training_Programma_v{VERSION}.docx")
    doc.save(fp)
    print(f"OK: {fp}")
    return fp


# ─── Doc 10: Procedure Onderaannemers ───────────────────────────────────────
def generate_doc10():
    doc = Document()
    add_header_table(doc, "PM_VBS01_10", "Procedure Onderaannemers & Tijdelijk Personeel",
                     "8.1.4, 7.2, 7.4", "Art. 4, 5, Bijlage III.I")
    add_compliance_box(doc,
        iso_items=["8.1.4 Procurement (contractors)", "7.2 Competence", "7.4 Communication"],
        brzo_items=["Art. 4 VBS inclusief derden", "Art. 5 Veiligheidsrapportage"],
        iogp_items=["423 Phase 1-8: Volledig contractor lifecycle"])
    
    add_st(doc, "1", "Doel en Toepassingsgebied")
    add_bt(doc, "Deze procedure beschrijft hoe [BEDRIJFSNAAM] de veiligheid van onderaannemers, tijdelijk personeel en andere derden waarborgt. Het integreert het volledige IOGP Report 423 contractor management framework [1] met BRZO 2015 vereisten [2] en ISO 45001 8.1.4 [3].")
    add_bt(doc, "Toepassingsgebied: Alle derden die werkzaamheden uitvoeren op of voor [LOCATIE], waaronder:")
    add_bl(doc, "Onderaannemers (subcontractors)")
    add_bl(doc, "Uitzendkrachten en tijdelijk personeel")
    add_bl(doc, "Leveranciers met installatie/onderhoudswerkzaamheden")
    add_bl(doc, "Consultants en adviseurs op locatie")
    add_bl(doc, "Bezoekers in uitvoerende rol")
    
    add_st(doc, "2", "IOGP 423 Contractor Lifecycle (8 Fasen)")
    add_tbl(doc,
        ["Fase", "IOGP 423 Referentie", "Activiteit", "Verantwoordelijke", "Output"],
        [
            ["1. Planning", "423 Phase 1", "Scope, initiële risicoanalyse, contractstrategie", "Contracteigenaar + VBS", "Scope of work + risicoprofiel"],
            ["2. Sourcing", "423 Phase 2", "HSE capability assessment (423-01 scoring)", "VBS-Coordinator", "Capability score >= 3/5"],
            ["3. Tender & Award", "423 Phase 3", "Risk-based tender, evaluatiecriteria", "Contracteigenaar + VBS", "Getekend contract + VBS-bijlage"],
            ["4. Pre-mobilisatie", "423 Phase 4", "Post-award meeting, pre-mob audit, gezamenlijke risicoanalyse", "VBS-Coordinator", "Pre-mob checklist OK"],
            ["5. Mobilisatie", "423 Phase 5", "Site introductie, training, readiness review", "VBS + Afdelingshoofd", "Vrijgave mobilisatie"],
            ["6. Uitvoering", "423 Phase 6", "Toezicht, verificatie, monitoring, performance reviews", "Afdelingshoofd + VBS", "Performance scorecard"],
            ["7. Demobilisatie", "423 Phase 7", "Uitvoer evaluatie, afsluiting werkzaamheden", "VBS + Contracteigenaar", "Demob checklist"],
            ["8. Evaluatie", "423 Phase 8", "Eindbeoordeling, close-out rapport, lessons learned", "VBS-Coordinator", "Close-out rapport + rating"],
        ])
    
    add_st(doc, "3", "Pre-Qualification Criteria")
    add_tbl(doc,
        ["Criterium", "Minimum Eis", "Documentatie", "Beoordeling"],
        [
            ["VCA Certificering", "VCA* of VCA** (recent)", "Kopie certificaat", "Verificatie via VCA register"],
            ["BRZO Ervaring", "Min. 2 jaar BRZO-werk", "Referenties (min. 2)", "Telefonisch verification"],
            ["Scholingsniveau", "Alle medewerkers VCA Basis", "Training records", "Steekproef verificatie"],
            ["Insurance", "BA-verzekering min. [BEDRAG]", "Verzekeringsbewijs", "Annual check"],
            ["Incident History", "TRIR < 1.0 over laatste 3 jaar", "Statistieken", "Analyse + verificatie"],
            ["ISO Certificering", "ISO 45001 (preferred)", "Certificaat", "Verificatie via register"],
        ])
    
    add_st(doc, "4", "HSE Capability Assessment (IOGP 423-01)")
    add_bt(doc, "Conform IOGP Report 423-01 [4] wordt elke potentiële contractor beoordeeld:")
    add_tbl(doc,
        ["Element", "Score (1-5)", "Minimum", "Beoordelingsmethode"],
        [
            ["HSE Management Systeem", "[SCORE]", "3", "Document review + interview"],
            ["Leiderschap & Cultuur", "[SCORE]", "3", "Interview + referenties"],
            ["Risicobeheersing", "[SCORE]", "3", "TRA review + case studie"],
            ["Training & Competentie", "[SCORE]", "3", "Training records + steekproef"],
            ["Incident Management", "[SCORE]", "3", "Statistieken + onderzoekrapporten"],
            ["Noodresponse", "[SCORE]", "2", "Noodplan review + oefenrecord"],
            ["Milieumanagement", "[SCORE]", "2", "Document review"],
            ["TOTAAL GEMIDDELDE", "[SCORE]", "3.0", "Alle elementen >= minimum"],
        ])
    add_bt(doc, "Contractors met een totaalscore < 3.0 worden NIET goedgekeurd.")
    
    add_st(doc, "5", "Contractvoorwaarden (VBS Bijlage)")
    add_bt(doc, "Elk contract met derden bevat verplicht een VBS-bijlage met minimaal:")
    add_bl(doc, "Verwijzing naar PBZO van [BEDRIJFSNAAM]")
    add_bl(doc, "Gehoudenheid aan alle VBS-procedures (CoW, LOTO, TRA, MoC)")
    add_bl(doc, "PBM-eisen conform PBM-matrix")
    add_bl(doc, "Meldingsplicht incidenten binnen 1 uur")
    add_bl(doc, "Recht op stillegging bij onveilige situaties")
    add_bl(doc, "Inspectierecht door [BEDRIJFSNAAM] te allen tijde")
    add_bl(doc, "Trainingseisen conform Training Matrix (PM_VBS01_04)")
    add_bl(doc, "Performance monitoring conform IOGP 423 Phase 6")
    
    add_st(doc, "6", "Performance Monitoring")
    add_tbl(doc,
        ["KPI", "Target", "Meting", "Frequentie", "Actie bij afwijking"],
        [
            ["CoW compliance", "> 98%", "Audit steekproef", "Wekelijks", "Waarschuwing + corrigerend"],
            ["PBM compliance", "100%", "Observatie", "Dagelijks", "Direct corrigerend"],
            ["Incident rate", "< bedrijfsbenchmark", "Incidentregister", "Maandelijks", "Onderzoek + actieplan"],
            ["Training compleet", "100%", "Training records", "Bij aanvang", "Geen start zonder training"],
            ["HSE score trend", "Stabiel of stijgend", "Quarterly review", "Kwartaal", "Performance meeting"],
        ])
    
    add_src(doc, [
        "IOGP Report 423 - HSE Management Guidelines for Working Together - IOGP.org",
        "BRZO 2015 - Art. 4, 5 - Overheid.nl",
        "ISO 45001:2018 - 8.1.4 Procurement - ISO.org",
        "IOGP Report 423-01 - Contractor HSE Capability Assessment - IOGP.org",
        "VCA* / VCA** certificering - VCA-register.nl",
    ])
    add_tv(doc, [
        ("IOGP 423", "Alle 8 fasen gedekt", "PASS", "Volledige lifecycle van planning tot close-out"),
        ("ISO 45001", "8.1.4 Procurement", "PASS", "Contractor management + competence"),
        ("BRZO", "Art. 4 + 5 derdenvereisten", "PASS", "VBS-bijlage + pre-qualification"),
        ("Bedrijfs-agnostisch", "Alle placeholders", "PASS", "Geen specifieke bedrijfsdata"),
        ("Kwaliteit", "Consultancy-ready", "PASS", "Direct inzetbaar als contractor procedure"),
    ])
    add_footer(doc)
    fp = os.path.join(BASE_DIR, f"PM_VBS01_10_Procedure_Onderaannemers_v{VERSION}.docx")
    doc.save(fp)
    print(f"OK: {fp}")
    return fp


# ─── Doc 11: Veiligheidsprestatie Indicatoren ──────────────────────────────
def generate_doc11():
    doc = Document()
    add_header_table(doc, "PM_VBS01_11", "Veiligheidsprestatie-Indicatoren (KPI's)", "9.1", "Art. 4, Bijlage III")
    add_compliance_box(doc,
        iso_items=["9.1 Monitoring, measurement, analysis", "9.1.1 General", "9.1.2 Analysis and evaluation"],
        brzo_items=["Art. 4.3: Prestatiebewaking", "Bijlage III: KPI's"],
        iogp_items=["Phase 6.3: Performance review meetings"])
    
    add_st(doc, "1", "Doel en Toepassingsgebied")
    add_bt(doc, "Dit document definieert de key performance indicators (KPI's) voor het monitoren van de veiligheidsprestaties van [BEDRIJFSNAAM] conform ISO 45001 9.1 [1] en BRZO 2015 Art. 4.3 [2].")
    
    add_st(doc, "2", "Leading Indicators (Proactief)")
    add_tbl(doc,
        ["KPI", "Definitie", "Target", "Bron", "Frequentie"],
        [
            ["Aantal veiligheidsobservaties", "Gedragsobservaties per maand", "> 50/maand", "GO-register", "Maandelijks"],
            ["Near-miss meldingen", "Aantal near-meldingen per maand", "> 20/maand", "Meldingsregister", "Maandelijks"],
            ["Training compleetheid", "% medewerkers met complete training", "100%", "Training systeem", "Kwartaal"],
            ["Toolbox deelname", "% aanwezigheid toolbox meetings", "> 90%", "Aanwezigheidslijst", "Wekelijks"],
            ["MoC doorlooptijd", "Gemiddelde doorlooptijd MoC-aanvraag", "< 5 werkdagen", "MoC-register", "Maandelijks"],
            ["CoW afhandeling", "% werkvergunningen correct gesloten", "> 98%", "CoW-systeem", "Wekelijks"],
            ["Audit afgerond", "% geplande audits uitgevoerd", "100%", "Auditprogramma", "Kwartaal"],
            ["Inspecties uitgevoerd", "% geplande inspecties uitgevoerd", "> 95%", "Inspectieplanning", "Maandelijks"],
        ])
    
    add_st(doc, "3", "Lagging Indicators (Reactief)")
    add_tbl(doc,
        ["KPI", "Definitie", "Target", "Berekening", "Frequentie"],
        [
            ["Aantal zware ongevallen", "BRZO-meldingsplichtige ongevallen", "0", "Absoluut aantal", "Continu"],
            ["TRIR", "Total Recordable Incident Rate", "< 0.5", "(Incidenten x 200.000) / gewerkte uren", "Maandelijks"],
            ["LTIF", "Lost Time Injury Frequency", "< 0.3", "(LTI x 1.000.000) / gewerkte uren", "Maandelijks"],
            ["Aantal milieuproblemen", "Milieu-incidenten / overtredingen", "0", "Absoluut aantal", "Maandelijks"],
            ["Ziekteverzuim", "Verzuimpercentage veiligheidsgerelateerd", "< 1%", "(Verzuimdagen / mogelijke dagen) x 100", "Maandelijks"],
            ["Nalevingsboetes", "Aantal boetes / handhavingsacties", "0", "Absoluut aantal", "Jaarlijks"],
        ])
    
    add_st(doc, "4", "Rapportage en Dashboard")
    add_tbl(doc,
        ["Rapportage", "Frequentie", "Ontvangers", "Inhoud"],
        [
            ["Dashboard update", "Wekelijks", "VBS-Coordinator + MT", "Leading + lagging KPI's"],
            ["Maandrapportage", "Maandelijks", "Directie + alle afdelingen", "Trends, actiepunten"],
            ["Kwartaalrapportage", "Kwartaal", "Directie + OR", "Benchmark, diepgaande analyse"],
            ["Jaarverslag VBS", "Jaarlijks", "Alle belanghebbenden", "Volledig overzicht + planning"],
        ])
    
    add_src(doc, [
        "ISO 45001:2018 - 9.1 Monitoring, measurement, analysis - ISO.org",
        "BRZO 2015 - Art. 4.3 Prestatiebewaking - Overheid.nl",
        "IOGP Report 423 - Phase 6.3 Performance review - IOGP.org",
    ])
    add_tv(doc, [
        ("ISO 45001", "9.1 volledig gedekt", "PASS", "Leading + lagging + rapportage"),
        ("BRZO", "Art. 4.3 prestatiebewaking", "PASS", "KPI's met targets"),
        ("Bedrijfs-agnostisch", "Alle placeholders", "PASS", "Geen specifieke bedrijfsdata"),
    ])
    add_footer(doc)
    fp = os.path.join(BASE_DIR, f"PM_VBS01_11_Veiligheidsprestatie_Indicatoren_v{VERSION}.docx")
    doc.save(fp)
    print(f"OK: {fp}")
    return fp


# ─── Doc 12: Communicatie Meldingsprocedure ─────────────────────────────────
def generate_doc12():
    doc = Document()
    add_header_table(doc, "PM_VBS01_12", "Communicatie- en Meldingsprocedure Veiligheid",
                     "7.4, 5.4", "Art. 4, Bijlage III.I")
    add_compliance_box(doc,
        iso_items=["7.4 Communication (7.4.1-7.4.3)", "5.4 Consultation and participation"],
        brzo_items=["Bijlage III, I: Communicatie en overleg", "Art. 6 Rapportageverplichtingen"],
        iogp_items=["Phase 6.2-6.3: Monitoring + review"])
    
    add_st(doc, "1", "Doel en Toepassingsgebied")
    add_bt(doc, "Deze procedure borgt dat veiligheidsinformatie tijdig, adequaat en volledig wordt gecommuniceerd naar alle relevante belanghebbenden conform ISO 45001 7.4 [1] en BRZO 2015 Bijlage III.I [2].")
    
    add_st(doc, "2", "Interne Communicatiekanalen")
    add_tbl(doc,
        ["Kanaal", "Type informatie", "Frequentie", "Verantwoordelijke", "Doelgroep"],
        [
            ["Toolbox meeting", "Operationele veiligheidsinfo", "Wekelijks", "Voorman", "Alle teams"],
            ["VBS-nieuwsbrief", "Beleidsupdates, trends, lessons", "Maandelijks", "VBS-Coordinator", "Alle medewerkers"],
            ["Intranet / dashboard", "KPI's, procedures, documenten", "Continu", "VBS-Coordinator", "Alle medewerkers"],
            ["MT-overleg", "Strategische veiligheidsthema's", "Maandelijks", "VBS-Coordinator", "Directie + MT"],
            ["Veiligheidscommissie", "Medezeggenschap veiligheid", "Kwartaal", "Voorzitter commissie", "OR + VBS + directie"],
            ["Safety alert", "Acute veiligheidsrisico's", "Direct", "VBS-Coordinator", "Alle betrokkenen"],
        ])
    
    add_st(doc, "3", "Externe Communicatie")
    add_tbl(doc,
        ["Kanaal", "Type informatie", "Trigger", "Verantwoordelijke", "Ontvanger"],
        [
            ["Inspectierapport", "Resultaat inspectie", "Inspectie toezichthouder", "VBS-Coordinator", "Directie + ILT/DCMR"],
            ["Veiligheidsrapportage", "BRZO rapportage update", "Jaarlijks / wijziging", "VBS-Coordinator", "Toezichthouder"],
            ["MIR melding", "Melding incident gevaarlijke stof", "Direct bij incident", "Directie", "ILT + RIVM"],
            ["Omwonendenbrief", "Informatie over risico's", "Jaarlijks / bij wijziging", "Directie + PR", "Omwonenden"],
            ["Contractor communicatie", "Veiligheidseisen + prestaties", "Per project + kwartaal", "Contractor manager", "Alle contractors"],
        ])
    
    add_st(doc, "4", "Meldingsprocedure Incidenten")
    add_tbl(doc,
        ["Niveau", "Type", "Meldingstermijn", "Melden aan", "Vervolgactie"],
        [
            ["1. Near-miss", " Bijna-incident zonder schade", "Binnen 4 uur", "Directe leidinggevende", "Registreren + analyse"],
            ["2. Kleen incident", "Eerste hulp / materiaalschade", "Binnen 1 uur", "VBS-Coordinator", "Onderzoek + acties"],
            ["3. Meldingsplichtig", "Verzuim / medische behandeling", "Direct", "VBS-Coordinator + Directie", "Onderzoek + rapportage"],
            ["4. BRZO-melding", "Zwaar ongeval / MIR-plichtig", "Direct", "Directie + ILT + RIVM", "Onderzoek + BRZO rapportage"],
        ])
    
    add_st(doc, "5", "Escalatiematrix Communicatie")
    add_tbl(doc,
        ["Situatie", "Wie communiceert", "Aan wie", "Binnen", "Kanaal"],
        [
            ["Near-miss", "Medewerker", "Leidinggevende", "4 uur", "Meldingsformulier"],
            ["Incident (niet-BRZO)", "VBS-Coordinator", "Directie + MT", "1 uur", "Telefoon + mail"],
            ["BRZO-meldingsplichtig", "Directie", "ILT + DCMR + RIVM", "Direct", "Telefoon + MIR-formulier"],
            ["Milieu-incident", "VBS-Coordinator", "DCMR + Omgevingsdienst", "Direct", "Telefoon + formulier"],
            ["Media-aandacht", "Directie / woordvoerder", "Externe betrokkenen", "Binnen 2 uur", "Persverklaring"],
        ])
    
    add_src(doc, [
        "ISO 45001:2018 - 7.4 Communication - ISO.org",
        "BRZO 2015 - Art. 4, 6 + Bijlage III - Overheid.nl",
        "MIR-regeling - Melding Incidenten Gevaarlijke Stoffen - RIVM.nl",
        "IOGP Report 423 - Phase 6.2-6.3 - IOGP.org",
    ])
    add_tv(doc, [
        ("ISO 45001", "7.4 + 5.4 gedekt", "PASS", "Interne + externe communicatie"),
        ("BRZO", "MIR + rapportageverplichtingen", "PASS", "Alle meldingsniveaus"),
        ("Bedrijfs-agnostisch", "Alle placeholders", "PASS", "Geen specifieke bedrijfsdata"),
    ])
    add_footer(doc)
    fp = os.path.join(BASE_DIR, f"PM_VBS01_12_Communicatie_Meldingsprocedure_v{VERSION}.docx")
    doc.save(fp)
    print(f"OK: {fp}")
    return fp


# ─── Main ────────────────────────────────────────────────────────────────────
if __name__ == "__main__":
    print("Gold Standard V2.0 Upgrade - Element 1 (Docs 04-12)")
    print("=" * 50)
    
    generated = []
    for gen_func in [generate_doc04, generate_doc05, generate_doc06, generate_doc07,
                     generate_doc08, generate_doc09, generate_doc10, generate_doc11, generate_doc12]:
        try:
            f = gen_func()
            size = os.path.getsize(f)
            print(f"  {os.path.basename(f)} ({size//1024}KB)")
            generated.append(f)
        except Exception as e:
            print(f"  ERROR: {e}")
            import traceback
            traceback.print_exc()
    
    print(f"\nTotal: {len(generated)} documents generated")
