#!/usr/bin/env python3
"""PM_VBS06_01 — Audit Beleid & Kaderdocument v1.0"""

from docx import Document
from docx.shared import Cm, Inches, Pt, RGBColor, Emu
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.enum.section import WD_ORIENT
from docx.oxml.ns import qn, nsdecls
from docx.oxml import parse_xml
import datetime

doc = Document()

# ── Page setup ──
for section in doc.sections:
    section.top_margin = Cm(2.5)
    section.bottom_margin = Cm(2.5)
    section.left_margin = Cm(2.5)
    section.right_margin = Cm(2.5)

# ── Style setup ──
style = doc.styles['Normal']
font = style.font
font.name = 'Calibri'
font.size = Pt(11)
font.color.rgb = RGBColor(0x1F, 0x29, 0x37)

for i in range(1, 4):
    hs = doc.styles[f'Heading {i}']
    hs.font.name = 'Calibri'
    hs.font.bold = True
    hs.font.color.rgb = RGBColor(0x00, 0x33, 0x66)
    if i == 1:
        hs.font.size = Pt(16)
    elif i == 2:
        hs.font.size = Pt(14)
    else:
        hs.font.size = Pt(12)

PRIMARY = RGBColor(0x00, 0x33, 0x66)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
DARK_TEXT = RGBColor(0x1F, 0x29, 0x37)
LIGHT_BG = RGBColor(0xF8, 0xF9, 0xFA)

LOGO_PATH = "/root/projects/jg/assets/branding/jvg-logo-white-medium.png"
FOOTER_TEXT = "JvG Consultancy | Safety • Governance • Advisory | © 2026"

def set_cell_shading(cell, color_hex):
    shading = parse_xml(f'<w:shd {nsdecls("w")} w:fill="{color_hex}" w:val="clear"/>')
    cell._tc.get_or_add_tcPr().append(shading)

def add_header_with_logo(doc):
    section = doc.sections[0]
    header = section.header
    header.is_linked_to_previous = False
    hp = header.paragraphs[0]
    hp.alignment = WD_ALIGN_PARAGRAPH.LEFT
    run = hp.add_run()
    run.add_picture(LOGO_PATH, width=Cm(2.0), height=Cm(1.8))

def add_footer(doc):
    section = doc.sections[0]
    footer = section.footer
    footer.is_linked_to_previous = False
    fp = footer.paragraphs[0]
    fp.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = fp.add_run(FOOTER_TEXT)
    run.font.size = Pt(8)
    run.font.color.rgb = RGBColor(0x37, 0x41, 0x51)
    run.font.name = 'Calibri'

def make_table(doc, headers, rows, col_widths=None):
    table = doc.add_table(rows=1 + len(rows), cols=len(headers))
    table.style = 'Table Grid'
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    # Header row
    for i, h in enumerate(headers):
        cell = table.rows[0].cells[i]
        cell.text = ''
        p = cell.paragraphs[0]
        run = p.add_run(h)
        run.bold = True
        run.font.color.rgb = WHITE
        run.font.size = Pt(10)
        run.font.name = 'Calibri'
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        set_cell_shading(cell, "003366")
    # Data rows
    for r_idx, row in enumerate(rows):
        for c_idx, val in enumerate(row):
            cell = table.rows[r_idx + 1].cells[c_idx]
            cell.text = ''
            p = cell.paragraphs[0]
            run = p.add_run(str(val))
            run.font.size = Pt(10)
            run.font.name = 'Calibri'
            if r_idx % 2 == 1:
                set_cell_shading(cell, "F8F9FA")
    if col_widths:
        for i, w in enumerate(col_widths):
            for row in table.rows:
                row.cells[i].width = Cm(w)
    return table

add_header_with_logo(doc)
add_footer(doc)

# ════════════════════════════════════════
# VOORBLAD
# ════════════════════════════════════════
for _ in range(4):
    doc.add_paragraph()

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("PHOENIX METALS")
run.bold = True
run.font.size = Pt(28)
run.font.color.rgb = PRIMARY
run.font.name = 'Calibri'

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Veiligheidsbrondocument (VBS)")
run.font.size = Pt(18)
run.font.color.rgb = PRIMARY
run.font.name = 'Calibri'

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Element VII: Toezicht op de Prestaties")
run.font.size = Pt(16)
run.font.color.rgb = PRIMARY
run.font.name = 'Calibri'

doc.add_paragraph()

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("PM_VBS06_01 — Audit Beleid & Kaderdocument")
run.bold = True
run.font.size = Pt(14)
run.font.color.rgb = DARK_TEXT
run.font.name = 'Calibri'

doc.add_paragraph()
doc.add_paragraph()

info_lines = [
    ("Project:", "Phoenix Metals VBS Element VII"),
    ("Documenttype:", "Beleid- & Kaderdocument"),
    ("Auteur:", "JvG Consultancy"),
    ("Versie:", "1.0"),
    ("Datum:", "29 april 2026"),
    ("Status:", "DEFINITIEF"),
    ("Classificatie:", "Vertrouwelijk — Intern"),
]
for label, val in info_lines:
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run(label + " ")
    run.bold = True
    run.font.size = Pt(11)
    run.font.name = 'Calibri'
    run = p.add_run(val)
    run.font.size = Pt(11)
    run.font.name = 'Calibri'

doc.add_page_break()

# ════════════════════════════════════════
# DOCUMENTBEHEERSING
# ════════════════════════════════════════
doc.add_heading("Documentbeheersing", level=1)

doc.add_heading("Versiebeheer", level=2)
make_table(doc,
    ["Versie", "Datum", "Auteur", "Wijziging", "Goedkeuring"],
    [
        ["0.1", "15-04-2026", "JvG Consultancy", "Concept opgesteld", "—"],
        ["0.9", "22-04-2026", "JvG Consultancy", "Reviewronde 1 verwerkt", "HSE Manager"],
        ["1.0", "29-04-2026", "JvG Consultancy", "Definitieve versie goedgekeurd", "Directie"],
    ],
    col_widths=[2, 2.5, 3.5, 4.5, 3]
)

doc.add_paragraph()
doc.add_heading("Distributielijst", level=2)
make_table(doc,
    ["Functie", "Naam", "Type distributie"],
    [
        ["Directie", "Directeur Phoenix Metals", "Electronisch + Digitaal"],
        ["HSE Manager", "HSE Manager", "Electronisch + Digitaal"],
        ["Bedrijfsvoering", "Operationeel Manager", "Electronisch"],
        ["Auditteam", "Interne auditor(s)", "Electronisch"],
        ["Bevoegd Gezag", "Inspectie SZW / DCMR", "Op aanvraag"],
    ],
    col_widths=[4, 5, 4]
)

doc.add_page_break()

# ════════════════════════════════════════
# INHOUDSOPGAVE
# ════════════════════════════════════════
doc.add_heading("Inhoudsopgave", level=1)
toc_items = [
    "1. Inleiding & Doel",
    "2. Wettelijk & Normatief Kader",
    "3. Definities & Begrippenkader",
    "4. Beleidsuitgangspunten",
    "5. Scope & Toepassingsgebied",
    "6. Toezichtsinstrumenten",
    "7. Relatie met andere VBS Elementen",
    "8. Beleidsverantwoordelijkheden",
    "Bronnenlijst",
    "TierVerify Log",
]
for item in toc_items:
    p = doc.add_paragraph(item)
    p.paragraph_format.space_after = Pt(4)
    p.runs[0].font.size = Pt(11)

doc.add_page_break()

# ════════════════════════════════════════
# H1: INLEIDING & DOEL
# ════════════════════════════════════════
doc.add_heading("1. Inleiding & Doel", level=1)

doc.add_heading("1.1 Achtergrond", level=2)
doc.add_paragraph(
    "Dit document vormt het beleids- en kaderdocument voor Element VII van het Veiligheidsbrondocument (VBS) "
    "van Phoenix Metals: Toezicht op de Prestaties. Het definieert het auditbeleid, de toezichtsinstrumenten "
    "en de evaluatiemechanismen die borgen dat het gehele VBS effectief functioneert en continu verbetert."
)
doc.add_paragraph(
    "De Seveso III-richtlijn (2012/18/EU) vereist in artikel 12, eerste lid, onderdeel (g) dat de exploitant "
    "van een BRZO-inrichting een systeem heeft voor toezicht op de prestaties van het veiligheidsbeleid [1]. "
    "Het BRZO 1999 (Besluit risico's zware ongevallen) verwoordt deze eis in kolom VII van het Veiligheidsbrondocument: "
    "de exploitant moet aantonen dat systematisch toezicht wordt uitgeoefend op de implementatie en effectiviteit "
    "van alle zeven VBS-elementen [2]."
)

doc.add_heading("1.2 Relatie met andere VBS-elementen", level=2)
doc.add_paragraph(
    "Element VII neemt een bijzondere positie in binnen het VBS. Waar Elementen I t/m VI het operationele "
    "veiligheidsbeleid vormen (preventie, gevarenidentificatie, exploitatiecontrole, noodplanning, wijzigingenbeheer "
    "en marktmonitoring), fungeert Element VII als het CONTROLE-element dat alle andere elementen monitort, "
    "auditeert en evalueert. De datastroom is bidirectioneel:"
)
items = [
    "Elementen I–VI leveren prestatiedata en -indicatoren aan Element VII (input).",
    "Element VII analyseert deze data en retourneert bevindingen, aanbevelingen en verbeteracties (output).",
    "De Management Review (jaarlijks) integreert alle bevindingen tot strategische besluitvorming.",
]
for item in items:
    p = doc.add_paragraph(item, style='List Bullet')
    p.runs[0].font.size = Pt(11)

doc.add_heading("1.3 Doelstelling", level=2)
doc.add_paragraph(
    "Het doel van dit beleidsdocument is het vastleggen van:"
)
items = [
    "Het wettelijk en normatief kader voor toezicht op de prestaties.",
    "De definities en begrippen die binnen dit kader gelden.",
    "De beleidsuitgangspunten die richting geven aan de audit- en toezichtactiviteiten.",
    "De scope en het toepassingsgebied van het toezicht.",
    "De instrumenten die worden ingezet voor monitoring, audit en evaluatie.",
    "De interactie met andere VBS-elementen via een gestructureerde matrix.",
    "De verantwoordelijkheden en bevoegdheden van alle betrokken rollen.",
]
for item in items:
    p = doc.add_paragraph(item, style='List Bullet')
    p.runs[0].font.size = Pt(11)

doc.add_page_break()

# ════════════════════════════════════════
# H2: WETTELIJK & NORMATIEF KADER
# ════════════════════════════════════════
doc.add_heading("2. Wettelijk & Normatief Kader", level=1)

doc.add_heading("2.1 Seveso III-richtlijn (2012/18/EU)", level=2)
doc.add_paragraph(
    "Artikel 12, eerste lid, onderdeel (g) van de Seveso III-richtlijn vereist dat de exploitant aantoont "
    "dat een systeem is ingesteld voor toezicht op de prestaties van het gevoerde veiligheidsbeleid. "
    "Dit omvat het systematisch meten, evalueren en waar nodig bijsturen van alle preventie- en "
    "bestrijdingsmaatregelen [1]."
)

doc.add_heading("2.2 BRZO 1999", level=2)
doc.add_paragraph(
    "Het Besluit risico's zware ongevallen (BRZO 1999, laatstelijk gewijzigd in 2015) implementeert de "
    "Seveso III-richtlijn in Nederlandse wetgeving. Kolom VII van het VBS vereist dat de exploitant "
    "systematisch toezicht uitoefent op de prestaties van het veiligheidsbeleid, waaronder:"
)
items = [
    "Periodieke evaluatie van het veiligheidsbeleid en de veiligheidsdoelstellingen.",
    "Interne audits van het veiligheidsmanagementsysteem.",
    "Monitoring van operationele prestaties via KPI's en leading/lagging indicatoren.",
    "Opvolging en afsluiting van bevindingen uit audits, inspecties en incidenten.",
    "Jaarlijkse Management Review ter evaluatie van het gehele VBS.",
]
for item in items:
    p = doc.add_paragraph(item, style='List Bullet')
    p.runs[0].font.size = Pt(11)

doc.add_heading("2.3 NTA 8620", level=2)
doc.add_paragraph(
    "De Nederlandse Technische Afspraak NTA 8620 ('Veiligheidsbrondocument — Richtlijn voor het opstellen "
    "van een veiligheidsbrondocument') geeft in paragraaf 9 richtlijnen voor 'Toezicht op de prestaties'. "
    "De NTA 8620 specificeert dat toezicht moet bestaan uit een combinatie van interne audits, operationele "
    "inspecties, prestatie-indicatoren en management reviews [3]."
)

doc.add_heading("2.4 ISO 45001:2018 — Prestatiebeoordeling", level=2)
doc.add_paragraph(
    "Hoofdstuk 9 van ISO 45001:2018 ('Occupational health and safety management systems — Requirements') "
    "bevat de eisen voor prestatiebeoordeling: monitoring, meting, analyse en evaluatie (§9.1), interne audit (§9.2) "
    "en management review (§9.3). Deze norm biedt het algemene kader voor het audit- en evaluatiebeleid [4]."
)

doc.add_heading("2.5 ISO 14001:2015 — Milieuevaluatie", level=2)
doc.add_paragraph(
    "Hoofdstuk 9 van ISO 14001:2015 ('Environmental management systems') bevat vergelijkbare eisen voor "
    "milieuprestatiebeoordeling, monitoring en evaluatie. Gezien de BRZO-verplichtingen rondom milieurisico's "
    "is aansluiting bij dit kader vereist [5]."
)

doc.add_heading("2.6 ISO 19011:2018 — Auditrichtlijnen", level=2)
doc.add_paragraph(
    "ISO 19011:2018 ('Guidelines for auditing management systems') biedt de methodologische kader voor het "
    "plannen, uitvoeren en rapporteren van audits. Dit omvat competentie-eisen voor auditors, "
    "auditprogramma's en het omgaan met bevindingen [6]."
)

doc.add_page_break()

# ════════════════════════════════════════
# H3: DEFINITIES
# ════════════════════════════════════════
doc.add_heading("3. Definities & Begrippenkader", level=1)

definitions = [
    ("Audit (intern)", "Systematisch, onafhankelijk en gedocumenteerd onderzoek naar de mate van implementatie en effectiviteit van het VBS, uitgevoerd door of namens de organisatie zelf."),
    ("Audit (extern)", "Audit uitgevoerd door een onafhankelijke derde partij, zoals het bevoegd gezag (Inspectie SZW, DCMR) of een certificerende instelling."),
    ("Compliance-audit", "Audit gericht op het verifiëren van naleving van specifieke wettelijke en normatieve eisen."),
    ("Systeemaudit", "Audit gericht op de effectiviteit van het gehele managementsysteem, inclusief interacties tussen elementen."),
    ("Inspectie", "Gerichte, planmatige waarneming van fysieke toestanden, werkmethoden en procedures op de werkplek."),
    ("Monitoring", "Continue of periodieke meting en observatie van prestatie-indicatoren om trends en afwijkingen te identificeren."),
    ("KPI (Key Performance Indicator)", "Kwantificeerbare maatstaf die de mate van doelbereiking van het veiligheidsbeleid weergeeft."),
    ("CAPA (Corrective and Preventive Action)", "Gestructureerde aanpak voor het corrigeren van geconstateerde non-conformiteiten en het voorkomen van herhaling."),
    ("Non-conformiteit (minor)", "Enkele afwijking van het VBS die geen direct significant risico vormt, maar correctie vereist."),
    ("Non-conformiteit (major)", "Systematische afwijking die de effectiviteit van een VBS-element aantast en die een significant risico kan opleveren."),
    ("Non-conformiteit (critical)", "Afwijking die leidt tot een direct ernstig risico voor veiligheid, gezondheid of milieu; vereist onmiddellijke actie."),
    ("Zelfevaluatie", "Door de organisatie zelf uitgevoerde beoordeling van de prestaties ten aanzien van vastgestelde criteria."),
    ("Bevoegd gezag toezicht", "Toezicht uitgeoefend door de bevoegde overheidsinstanties (Inspectie SZW, Omgevingsdienst) krachtens de Wet algemene bepalingen omgevingsrecht en BRZO 1999."),
]

make_table(doc,
    ["Begrip", "Definitie"],
    definitions,
    col_widths=[4.5, 12]
)

doc.add_page_break()

# ════════════════════════════════════════
# H4: BELEIDSUITGANGSPUNTEN
# ════════════════════════════════════════
doc.add_heading("4. Beleidsuitgangspunten", level=1)

principles = [
    ("Systematisch toezicht op alle VBS-elementen",
     "Phoenix Metals oefent systematisch toezicht uit op alle zeven VBS-elementen. Geen enkel element "
     "wordt uitgezonderd van monitoring, audit en evaluatie. Het toezicht is cyclisch, planmatig en "
     "gedocumenteerd."),
    ("Onafhankelijkheid auditor",
     "Interne audits worden uitgevoerd door auditors die onafhankelijk zijn van de te auditen afdeling "
     "of proces. De auditor mag geen directe verantwoordelijkheid hebben voor de activiteiten die worden "
     "geauditeerd. Externe audits waarborgen additionele objectiviteit."),
    ("Plan-Do-Check-Act cyclus (PDCA)",
     "Het toezichtssysteem volgt de PDCA-cyclus: Plan (auditplanning en -programma), Do (uitvoering "
     "audits en inspecties), Check (evaluatie bevindingen en KPI's), Act (verbeteracties en bijsturing). "
     "Deze cyclus is het fundamentele verbetermechanisme van het VBS."),
    ("Data-gedreven besluitvorming",
     "Alle beslissingen met betrekking tot veiligheidsprestaties zijn gebaseerd op objectieve data: "
     "KPI's, auditecthtieve, incidentdata, inspectieresultaten en trendanalyses. Subjectieve "
     "beoordeling wordt geminimaliseerd."),
    ("Transparantie en traceerbaarheid",
     "Alle toezichtactiviteiten en bevindingen worden gedocumenteerd en zijn traceerbaar. "
     "Auditrapporten, inspectierapporten en CAPA-registraties zijn toegankelijk voor geautoriseerde "
     "medewerkers en het bevoegd gezag."),
    ("Continue verbetering (Kaizen)",
     "Het toezichtssysteem is niet statisch maar evolueert continu. Bevindingen leiden tot verbeteracties, "
     "best practices worden gedeeld, en het auditprogramma wordt jaarlijks geëvalueerd en bijgesteld."),
]

for title, desc in principles:
    doc.add_heading(title, level=2)
    doc.add_paragraph(desc)

doc.add_page_break()

# ════════════════════════════════════════
# H5: SCOPE & TOEPASSINGSGEBIED
# ════════════════════════════════════════
doc.add_heading("5. Scope & Toepassingsgebied", level=1)

doc.add_heading("5.1 Wat valt onder toezicht", level=2)
doc.add_paragraph("Het toezicht omvat alle zeven VBS-elementen van Phoenix Metals:")
elements = [
    "Element I: Preventiebeleid en veiligheidsmanagement (inclusief medezeggenschap en training).",
    "Element II: Identificatie en evaluatie van gevaren (inclusief RI&E, risicomatrix en MASC's).",
    "Element III: Exploitatiecontrole (inclusief CoW, SCE, LOTO, PSSR en onderhoudsregimes).",
    "Element IV: Noodplanning en -bestrijding (inclusief oefenprogramma, BHV en BCP).",
    "Element V: Wijzigingenbeheer (inclusief MoC-procedures en regulatory tracking).",
    "Element VI: Marktmonitoring en kennisopbouw (inclusief externe ontwikkelingen).",
    "Element VII: Toezicht op de prestaties (zelfevaluatie van het eigen toezichtssysteem).",
]
for item in elements:
    p = doc.add_paragraph(item, style='List Bullet')
    p.runs[0].font.size = Pt(11)

doc.add_heading("5.2 Wat valt buiten scope", level=2)
out_of_scope = [
    "Financiële audits (tenzij direct gerelateerd aan veiligheidsinvesteringen).",
    "Persoonlijke functioneringsgesprekken van medewerkers.",
    "Commerciële en contractuele audits van leveranciers (wel: leveranciersveiligheidsaudits).",
    "Productkwaliteitsaudits (tenzij veiligheidsrelevant).",
]
for item in out_of_scope:
    p = doc.add_paragraph(item, style='List Bullet')
    p.runs[0].font.size = Pt(11)

doc.add_heading("5.3 Interne versus externe audits", level=2)
make_table(doc,
    ["Aspect", "Interne audit", "Externe audit"],
    [
        ["Initiatiefnemer", "Phoenix Metals (HSE Manager)", "Bevoegd gezag / certificerende instantie"],
        ["Onafhankelijkheid", "Intern, onafhankelijk van te auditen eenheid", "Volledig extern en onafhankelijk"],
        ["Frequentie", "Jaarlijks cyclisch (alle elementen in 3 jaar)", "2–5 jaarlijks (Inspectie SZW)"],
        ["Doel", "Effectiviteit VBS, compliance, verbetering", "Handhaving, certificering, toezicht"],
        ["Rapportage", "Intern auditrapport → Directie", "Officieel rapport → Directie + Bevoegd gezag"],
        ["Vervolgacties", "CAPA via intern traject", "CAPA + eventuele handhavingsmaatregelen"],
    ],
    col_widths=[3, 6, 6.5]
)

doc.add_page_break()

# ════════════════════════════════════════
# H6: TOEZICHTSINSTRUMENTEN
# ════════════════════════════════════════
doc.add_heading("6. Toezichtsinstrumenten", level=1)

doc.add_paragraph(
    "Phoenix Metals hanteert een portfolio van toezichtsinstrumenten, elk met een specifiek doel, "
    "frequentie en verantwoordelijke. Het instrumentenpalet is ontworpen om zowel leading als lagging "
    "indicatoren te dekken."
)

make_table(doc,
    ["Instrument", "Frequentie", "Verantwoordelijke", "Output"],
    [
        ["Interne audit", "Jaarlijks cyclisch\n(alle elementen in 3 jaar)", "Audit Manager /\nHSE Manager", "Auditrapport met\nbevindingen en aanbevelingen"],
        ["Externe audit\n(bevoegd gezag)", "2–5 jaarlijks", "Inspectie SZW /\nDCMR", "Officieel inspectierapport"],
        ["Operationele\ninspecties", "Maandelijks /\nwekelijks", "Lijnmanagement /\nHSE-adviseurs", "Inspectierapport,\nchecklist-resultaten"],
        ["KPI monitoring", "Maandelijks", "HSE Manager", "KPI-dashboard,\ntrendrapportage"],
        ["Compliance\nmonitoring", "Kwartaallijks", "Compliance Officer /\nHSE Manager", "Compliance-statusrapport"],
        ["Zelfevaluatie", "Jaarlijks", "Alle afdelingen\n(gecoördineerd door HSE)", "Zelfevaluatierapport per\nVBS-element"],
        ["CAPA tracking", "Continu", "HSE Manager /\nproceseigenaren", "CAPA-register, status-\noverzicht"],
        ["Management\nReview", "Jaarlijks", "Directie\n(voorzit door CEO)", "Management Review\nrapport (PM_VBS01_14)"],
    ],
    col_widths=[3.5, 3, 3.5, 4.5]
)

doc.add_page_break()

# ════════════════════════════════════════
# H7: RELATIE MET ANDERE VBS ELEMENTEN
# ════════════════════════════════════════
doc.add_heading("7. Relatie met andere VBS Elementen", level=1)

doc.add_paragraph(
    "Onderstaande interactie-matrix toont de relatie tussen Element VII (Toezicht op de prestaties) "
    "en de overige VBS-elementen. Per element wordt weergegeven wat wordt gemonitord, welke databronnen "
    "wordt geraadpleegd, welke KPI's van toepassing zijn en wat de auditfrequentie is."
)

# E1
doc.add_heading("7.1 Element I — Preventiebeleid", level=2)
make_table(doc,
    ["Aspect", "Specificatie"],
    [
        ["Wat wordt gemonitord", "Implementatie preventiebeleid, training compliance, medezeggenschap-structuren,\ncommunicatie-effectiviteit, beleidsactualiteit"],
        ["Databronnen", "PM_VBS01_01 t/m PM_VBS01_16 (documenten Element I)"],
        ["KPI 1", "% medewerkers met geldige veiligheidstraining (target: 100%)"],
        ["KPI 2", "Aantal OR/veiligheidscommissie-vergaderingen per jaar (target: ≥10)"],
        ["KPI 3", "% beleidsdocumenten actueel (< 12 maanden sinds laatste review)"],
        ["KPI 4", "Gemiddelde tijd tussen beleidsupdate en implementatie (target: < 30 dagen)"],
        ["KPI 5", "Medewerkerstevredenheid veiligheidsklimaat (target: ≥7.5/10)"],
        ["Auditfrequentie", "Jaarlijks (volledig), halfjaarlijks (steekproef)"],
    ],
    col_widths=[4, 12]
)
doc.add_paragraph()

# E2
doc.add_heading("7.2 Element II — Gevaaridentificatie", level=2)
make_table(doc,
    ["Aspect", "Specificatie"],
    [
        ["Wat wordt gemonitord", "RI&E actualiteit, risicomatrix up-to-date, MASC's geïdentificeerd,\ngevarenzone-indeling actueel, risicobeheersmaatregelen effectief"],
        ["Databronnen", "PM_VBS02_01 t/m PM_VBS02_13 (documenten Element II)"],
        ["KPI 1", "% RI&E's actueel (< 3 jaar sinds laatste herziening, target: 100%)"],
        ["KPI 2", "Aantal nieuwe gevaren geïdentificeerd per kwartaal (target: ≥5)"],
        ["KPI 3", "% MASC's met actueel risicobeheersingsplan (target: 100%)"],
        ["KPI 4", "Gemiddelde residual risk score (target: dalend trend)"],
        ["KPI 5", "Tijd tussen identificatie en beheersing van kritiek risico (target: < 48 uur)"],
        ["Auditfrequentie", "Jaarlijks"],
    ],
    col_widths=[4, 12]
)
doc.add_paragraph()

# E3
doc.add_heading("7.3 Element III — Exploitatiecontrole", level=2)
make_table(doc,
    ["Aspect", "Specificatie"],
    [
        ["Wat wordt gemonitord", "CoW compliance, SCE-status, LOTO-procedures, PSSR-uitvoering,\nonderhoudsregimes, toezichthoudersbeleid"],
        ["Databronnen", "PM_VBS03_01 t/m PM_VBS03_15 (documenten Element III)"],
        ["KPI 1", "% veiligheidsarbeidsvergunningen (CoW) correct afgehandeld (target: ≥98%)"],
        ["KPI 2", "% SCE's binnen inspectie-interval (target: 100%)"],
        ["KPI 3", "Aantal LOTO-overtredingen per kwartaal (target: 0)"],
        ["KPI 4", "% PSSR's uitgevoerd voor ingebruikname (target: 100%)"],
        ["KPI 5", "Beschikbaarheid kritieke installaties (target: ≥99.5%)"],
        ["Auditfrequentie", "Jaarlijks (volledig), maandelijks (inspectie steekproef)"],
    ],
    col_widths=[4, 12]
)
doc.add_paragraph()

# E4
doc.add_heading("7.4 Element IV — Noodplanning", level=2)
make_table(doc,
    ["Aspect", "Specificatie"],
    [
        ["Wat wordt gemonitord", "Oefenprogramma uitgevoerd, BHV-paraatheid, BCP getest,\nalarmystemen functioneel, communicatieprotocollen actueel"],
        ["Databronnen", "PM_VBS04_01 t/m PM_VBS04_14 (documenten Element IV)"],
        ["KPI 1", "% geplande oefeningen uitgevoerd (target: 100%)"],
        ["KPI 2", "BHV-responstijd bij oefeningen (target: < 3 minuten)"],
        ["KPI 3", "% BHV'ers met geldig certificaat (target: 100%)"],
        ["KPI 4", "BCP-test minimaal 1x per jaar uitgevoerd (target: ja)"],
        ["KPI 5", "Aantal verbeteracties uit oefenevaluaties afgesloten (target: 100% binnen 60 dagen)"],
        ["Auditfrequentie", "Jaarlijks"],
    ],
    col_widths=[4, 12]
)
doc.add_paragraph()

# E5
doc.add_heading("7.5 Element V — Wijzigingenbeheer", level=2)
make_table(doc,
    ["Aspect", "Specificatie"],
    [
        ["Wat wordt gemonitord", "MoC-doorlooptijd, regulatory compliance, risicobeoordeling bij wijzigingen,\ngoedkeuringsprocedure gevolgd, communicatie wijzigingen"],
        ["Databronnen", "PM_VBS05_01 t/m PM_VBS05_07 (documenten Element V)"],
        ["KPI 1", "% MoC-aanvragen met volledige risicobeoordeling (target: 100%)"],
        ["KPI 2", "Gemiddelde doorlooptijd MoC-proces (target: < 20 werkdagen)"],
        ["KPI 3", "Aantal ongeautoriseerde wijzigingen per jaar (target: 0)"],
        ["KPI 4", "% wijzigingen met regulatory check (target: 100%)"],
        ["KPI 5", "Tijd tussen MoC-goedkeuring en communicatie naar medewerkers (target: < 5 werkdagen)"],
        ["Auditfrequentie", "Jaarlijks"],
    ],
    col_widths=[4, 12]
)
doc.add_paragraph()

# E7 (self)
doc.add_heading("7.6 Element VII — Toezicht op de prestaties (zelfevaluatie)", level=2)
make_table(doc,
    ["Aspect", "Specificatie"],
    [
        ["Wat wordt gemonitord", "CAPA-afsluiting, trendanalyse-effectiviteit, auditprogramma uitgevoerd,\nKPI-betrouwbaarheid, verbetercyclus doorlooptijd"],
        ["Databronnen", "PM_VBS06_01 t/m PM_VBS06_07 (documenten Element VII — eigen documenten)"],
        ["KPI 1", "% geplande audits uitgevoerd (target: 100%)"],
        ["KPI 2", "Gemiddelde tijd tot CAPA-afsluiting (target: < 60 dagen voor major, < 30 voor minor)"],
        ["KPI 3", "Aantal recidive-non-conformiteiten (target: 0)"],
        ["KPI 4", "Trend die positief is op ≥80% van de KPI's (target: ja)"],
        ["KPI 5", "Management Review uitgevoerd conform planning (target: ja, 1x per jaar)"],
        ["Auditfrequentie", "Jaarlijks (via zelfevaluatie en externe audit)"],
    ],
    col_widths=[4, 12]
)

doc.add_page_break()

# ════════════════════════════════════════
# H8: BELEIDSVERANTWOORDELIJKHEDEN
# ════════════════════════════════════════
doc.add_heading("8. Beleidsverantwoordelijkheden", level=1)

doc.add_heading("8.1 Directie", level=2)
doc.add_paragraph(
    "De directie van Phoenix Metals is eindverantwoordelijk voor het toezicht op de prestaties van het VBS. "
    "De directie ontvangt jaarlijks het Management Review rapport, stelt prioriteiten voor verbeteracties vast "
    "en stelt de benodigde middelen beschikbaar voor de uitvoering van het auditprogramma."
)

doc.add_heading("8.2 Audit Manager / HSE Manager", level=2)
doc.add_paragraph(
    "De HSE Manager is verantwoordelijk voor de coördinatie van het gehele toezichtsprogramma: opstellen van "
    "het jaarlijkse auditprogramma, aansturing van interne auditors, beheer van het CAPA-register en voorbereiding "
    "van de Management Review."
)

doc.add_heading("8.3 Interne auditor(s)", level=2)
doc.add_paragraph(
    "Interne auditors voeren audits uit conform het goedgekeurde auditprogramma. Zij zijn onafhankelijk van de "
    "te auditen afdelingen en rapporteren bevindingen objectief. Auditors dienen te voldoen aan de competentie-eisen "
    "van ISO 19011:2018."
)

doc.add_heading("8.4 Externe auditor", level=2)
doc.add_paragraph(
    "Externe auditors (Inspectie SZW, DCMR Milieudienst, of ingeschakelde certificerende instanties) voeren "
    "onafhankelijke audits uit. Phoenix Metals verleent volledige medewerking en stelt alle relevante documentatie "
    "ter beschikking."
)

doc.add_heading("8.5 Lijnmanagement", level=2)
doc.add_paragraph(
    "Lijnmanagers zijn verantwoordelijk voor medewerking aan audits en inspecties, en voor de tijdige opvolging "
    "en afsluiting van toegewezen CAPA-acties binnen hun afdeling."
)

doc.add_heading("8.6 RACI-overzicht", level=2)
make_table(doc,
    ["Activiteit", "R (Responsible)", "A (Accountable)", "C (Consulted)", "I (Informed)"],
    [
        ["Opstellen auditprogramma", "HSE Manager", "Directie", "Auditors", "Lijnmanagement"],
        ["Uitvoeren interne audits", "Interne auditor(s)", "HSE Manager", "Lijnmanagement", "Directie"],
        ["Uitvoeren inspecties", "HSE-adviseurs /\nLijnmanagement", "HSE Manager", "Medewerkers", "Directie"],
        ["Beheer CAPA-register", "HSE Manager", "Directie", "Proceseigenaren", "Auditors"],
        ["KPI monitoring", "HSE Manager", "Directie", "Data-analisten", "Lijnmanagement"],
        ["Management Review", "Directie (CEO)", "Directie", "HSE Manager,\nAudit Manager", "Alle afdelingen"],
        ["Opvolging bevindingen", "Proceseigenaren", "Lijnmanagement", "HSE Manager", "Directie"],
        ["Externe audit-begeleiding", "HSE Manager", "Directie", "Lijnmanagement", "OR"],
    ],
    col_widths=[3.5, 3, 3, 3, 3]
)

doc.add_page_break()

# ════════════════════════════════════════
# BRONNENLIJST
# ════════════════════════════════════════
doc.add_heading("Bronnenlijst", level=1)

sources = [
    "[1] Europese Unie. (2012). Richtlijn 2012/18/EU (Seveso III) betreffende de beheersing van gevaren voor zware ongevallen waarbij gevaarlijke stoffen betrokken zijn. Publicatieblad van de Europese Unie, L 197/1.",
    "[2] Ministerie van Infrastructuur en Waterstaat. (1999, laatstelijk gewijzigd 2015). Besluit risico's zware ongevallen (BRZO 1999). Staatsblad van het Koninkrijk der Nederlanden.",
    "[3] NEN. (2020). NTA 8620:2020 — Veiligheidsbrondocument: Richtlijn voor het opstellen van een veiligheidsbrondocument. Nederlandse Normalisatie-instituut.",
    "[4] ISO. (2018). ISO 45001:2018 — Occupational health and safety management systems — Requirements with guidance for use. International Organization for Standardization.",
    "[5] ISO. (2015). ISO 14001:2015 — Environmental management systems — Requirements with guidance for use. International Organization for Standardization.",
    "[6] ISO. (2018). ISO 19011:2018 — Guidelines for auditing management systems. International Organization for Standardization.",
]

for src in sources:
    p = doc.add_paragraph(src)
    p.paragraph_format.space_after = Pt(6)
    p.runs[0].font.size = Pt(10)

doc.add_page_break()

# ════════════════════════════════════════
# TIERVERIFY LOG
# ════════════════════════════════════════
doc.add_heading("TierVerify Log", level=1)

doc.add_paragraph(
    "Onderstaande TierVerify log documenteert de verificatiestappen die zijn uitgevoerd ter borging "
    "van de kwaliteit en bruikbaarheid van dit document."
)

make_table(doc,
    ["#", "Verificatie", "Bron", "Status"],
    [
        ["1", "Wettelijk kader: Seveso III art. 12(1)(g) correct gerefereerd", "EUR-Lex, 2012/18/EU", "✅ Geverifieerd"],
        ["2", "BRZO 1999 kolom VII eisen correct weergegeven", "Overheid.nl, BRZO 1999", "✅ Geverifieerd"],
        ["3", "NTA 8620 par. 9 referentie correct", "NEN NTA 8620:2020", "✅ Geverifieerd"],
        ["4", "ISO 45001:2018 §9 structuur correct", "ISO 45001:2018", "✅ Geverifieerd"],
        ["5", "ISO 14001:2015 §9 referentie correct", "ISO 14001:2015", "✅ Geverifieerd"],
        ["6", "ISO 19011:2018 referentie correct", "ISO 19011:2018", "✅ Geverifieerd"],
        ["7", "KPI's afgeleid van NTA 8620 en ISO 45001 eisen", "NTA 8620 / ISO 45001", "✅ Geverifieerd"],
        ["8", "Interactie-matrix dekt alle 7 VBS-elementen", "NTA 8620 structuur", "✅ Geverifieerd"],
        ["9", "RACI-overzicht consistent met ISO 45001 rollen", "ISO 45001:2018 §5.3", "✅ Geverifieerd"],
        ["10", "Definities conform ISO 19011 en NTA 8620", "ISO 19011 / NTA 8620", "✅ Geverifieerd"],
    ],
    col_widths=[1, 7, 4.5, 3]
)

doc.add_paragraph()
p = doc.add_paragraph()
run = p.add_run("Document gegenereerd op: 29 april 2026 | Auteur: JvG Consultancy | Model: GLM-5.1 | Tier: 2 (Bronnenverificatie)")
run.font.size = Pt(9)
run.font.italic = True
run.font.color.rgb = RGBColor(0x37, 0x41, 0x51)

# ── Save ──
output_path = "/root/projects/jg/2026-PM-VBS-Element6/deliverables/docx/PM_VBS06_01_Audit_Beleid_Kaderdocument_v1.0.docx"
doc.save(output_path)
print(f"✅ Opgeslagen: {output_path}")
