#!/usr/bin/env python3
"""Genereer Audit Toolkit v3.0 (4 DOCX bestanden)"""
import os, datetime
from docx import Document
from docx.shared import Inches, Pt, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT

BASE = "/root/projects/jg/2026-pgs15-phoenix-metals"
DOCX_DIR = f"{BASE}/deliverables/docx"
LOGO_PATH = "/root/projects/jg/assets/branding/jvg-logo-white-medium.png"
NOW = datetime.datetime.now().strftime("%d %B %Y")

def make_doc(title, subtitle=""):
    doc = Document()
    style = doc.styles['Normal']
    style.font.name = 'Calibri'
    style.font.size = Pt(11)
    for lv in range(1,4):
        hs = doc.styles[f'Heading {lv}']
        hs.font.color.rgb = RGBColor(0,51,102)
        hs.font.name = 'Calibri'
    sec = doc.sections[0]
    sec.top_margin = Cm(2.5)
    sec.bottom_margin = Cm(2)
    hdr = sec.header
    if os.path.exists(LOGO_PATH):
        hp = hdr.paragraphs[0]
        hp.alignment = WD_ALIGN_PARAGRAPH.RIGHT
        run = hp.add_run()
        run.add_picture(LOGO_PATH, width=Inches(1.5))
    ftr = sec.footer
    fp = ftr.paragraphs[0]
    fp.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = fp.add_run(f"JvG Consultancy — {title}")
    run.font.size = Pt(8)
    run.font.color.rgb = RGBColor(128,128,128)
    doc.add_paragraph("")
    doc.add_paragraph("")
    tp = doc.add_paragraph()
    tp.alignment = WD_ALIGN_PARAGRAPH.CENTER
    r = tp.add_run(title)
    r.bold = True; r.font.size = Pt(24); r.font.color.rgb = RGBColor(0,51,102)
    if subtitle:
        sp = doc.add_paragraph()
        sp.alignment = WD_ALIGN_PARAGRAPH.CENTER
        r = sp.add_run(subtitle)
        r.font.size = Pt(14); r.font.color.rgb = RGBColor(80,80,80)
    dp = doc.add_paragraph()
    dp.alignment = WD_ALIGN_PARAGRAPH.CENTER
    r = dp.add_run(f"Phoenix Metals B.V. — Plant One Rotterdam\n{NOW}")
    r.font.size = Pt(11); r.font.color.rgb = RGBColor(100,100,100)
    doc.add_paragraph("")
    c = doc.add_paragraph()
    c.alignment = WD_ALIGN_PARAGRAPH.CENTER
    r = c.add_run("CONFIDENTIAL — JvG Consultancy")
    r.font.size = Pt(9); r.font.color.rgb = RGBColor(180,0,0)
    doc.add_page_break()
    return doc

def add_tbl(doc, headers, rows):
    t = doc.add_table(rows=1+len(rows), cols=len(headers))
    t.style = 'Light Grid Accent 1'
    for i,h in enumerate(headers):
        c = t.rows[0].cells[i]; c.text = h
        for p in c.paragraphs:
            for r in p.runs: r.bold = True; r.font.size = Pt(9)
    for ri,row in enumerate(rows):
        for ci,val in enumerate(row):
            t.rows[ri+1].cells[ci].text = str(val)
            for p in t.rows[ri+1].cells[ci].paragraphs:
                for r in p.runs: r.font.size = Pt(9)
    return t

def bul(doc, text):
    doc.add_paragraph(text, style='List Bullet')

# ═══ 1. Basishandleiding v3.0 ═══
def gen_basishandleiding():
    doc = make_doc("PGS-15 Basishandleiding", "v3.0 — PGS 15:2025 Nieuwe Stijl")
    
    doc.add_heading("Inhoudsopgave", 1)
    for t in ["1. Inleiding","2. Wat is PGS 15:2025","3. Toepassingsgebied en Ondergrenzen",
              "4. Veiligheidsniveaus","5. Scenariostudie (S1-S16)","6. Doelen (D1-D13)",
              "7. Maatregelenoverzicht (M1-M167)","8. Specifieke eisen Phoenix Metals",
              "9. Relatie met wetgeving","10. Begrippenlijst"]:
        doc.add_paragraph(t)
    doc.add_page_break()

    doc.add_heading("1. Inleiding", 1)
    doc.add_paragraph("Deze basishandleiding (v3.0) geeft een uitgebreid overzicht van PGS 15:2025 Nieuwe Stijl, specifiek toegespitst op Phoenix Metals B.V., Plant One Rotterdam. Versie 3.0 is volledig geüpdatet naar de PGS 15:2025 voorschriften (versie 1.0, januari 2025).")
    
    doc.add_heading("2. Wat is PGS 15:2025", 1)
    doc.add_paragraph("PGS 15 is de Nederlandse richtlijn voor opslag van verpakte gevaarlijke stoffen. De editie 2025 introduceert de 'Nieuwe Stijl' methodiek met een risicogebaseerde structuur:")
    bul(doc, "Scenario's (S1-S16): beschrijven wat er mis kan gaan (oorzaak + gevolg)")
    bul(doc, "Doelen (D1-D13): wat bereikt moet worden")
    bul(doc, "Maatregelen (M1-M167 + MW1): concrete acties om doelen te bereiken")
    bul(doc, "4 veiligheidsniveaus: Basis, A, B, C")
    bul(doc, "12 nieuwe maatregelen ten opzichte van PGS 15:2021")

    doc.add_heading("3. Toepassingsgebied en Ondergrenzen", 1)
    doc.add_paragraph("PGS 15 is van toepassing op opslag van gevaarlijke stoffen in verpakkingen (jerrycans, vaten, IBC's, gasflessen, tankcontainers).")
    doc.add_heading("3.1 Ondergrenzen Phoenix Metals", 2)
    add_tbl(doc, ["Stofklasse","Verpakkingsgroep","Ondergrens"],[
        ["ADR 8 (H₂SO₄, NaOH)","VG II","250 kg"],["ADR 9 (Vanadium)","Alle","250 kg"],
    ])
    doc.add_paragraph("Bij overschrijding gelden ALLE maatregelen voor ALLE stoffen in de opslagvoorziening.")

    doc.add_heading("4. Veiligheidsniveaus", 1)
    doc.add_paragraph("Het vereiste veiligheidsniveau is afhankelijk van stofeigenschappen en hoeveelheid:")
    add_tbl(doc, ["Niveau","Omschrijving","Phoenix Metals"],[
        ["Basis","Minimale set maatregelen, altijd van toepassing","✅ VAN TOEPASSING"],
        ["A","Aanvullend: branddetectie, VBB, blusleiding","Niet nodig (onbrandbaar)"],
        ["B","Combinatie brand- en toxiciteitsmaatregelen","Niet nodig"],
        ["C","Strengste niveau, grote hoeveelheden","Niet nodig"],
    ])
    doc.add_paragraph("Phoenix Metals: BASISVEILIGHEIDSNIVEAU volstaat omdat H₂SO₄, NaOH en vanadiumoplossingen onbrandbaar/niet brandonderhoudend zijn bij dedicated opslag.")

    doc.add_heading("5. Scenariostudie (S1-S16)", 1)
    doc.add_heading("5.1 Oorzaakscenario's", 2)
    add_tbl(doc, ["#","Scenario","Relevant PM"],[
        ["S1","Verpakking aangereden → stof vrij","Ja"],["S2","Verpakking valt en faalt","Ja"],
        ["S3","Stelling bezwijkt","Ja"],["S4","Verkeerde stapeling","Ja"],
        ["S5","Veroudering verpakking","Ja"],["S6","Over-/onderdruk","Laag"],
        ["S7","Fouten bij openen/monstername","Ja"],["S8","Brand in opslag (extern)","Laag"],
        ["S9","Brand binnen locatie (buiten opslag)","Laag"],["S10","Brand buiten locatie","Laag"],
    ])
    doc.add_heading("5.2 Gevolgscenario's", 2)
    add_tbl(doc, ["#","Scenario","Relevant PM"],[
        ["S11","Vrijkomen gevaarlijke stof","Ja — KRITIEK"],["S12","Verspreiding damp/vloeistof","Ja"],
        ["S13","Brand in opslag","Laag"],["S14","Escalatie brand binnen","Laag"],
        ["S15","Escalatie brand omgeving","Laag"],["S16","Stofspecifieke scenario's","Ja"],
    ])

    doc.add_heading("6. Doelen (D1-D13)", 1)
    add_tbl(doc, ["#","Doel","Relevantie PM"],[
        ["D1","Voorkomen aanrijding","Ja"],["D2","Fysieke bescherming opslaglocatie","Ja"],
        ["D3","Juiste opslag in juiste voorziening","Ja — KRITIEK"],["D4","Voorkomen gevaar na lekkage","Ja — KRITIEK"],
        ["D5","Adequate reactie bij nood","Ja"],["D6","Hulpdiensten adequaat optreden","Ja"],
        ["D7","Voorkomen verspreiding","Ja — KRITIEK"],["D8","Voorkomen ontsteking","Laag (onbrandbaar)"],
        ["D9","Voorkomen brand in opslag","Laag"],["D10","Compartimenteren","Laag"],
        ["D11","Brand beheersen","Laag"],["D12","Brand (semi)automatisch blussen","N.v.t."],
        ["D13","Stofspecifieke risico's beheersen","Ja — KRITIEK"],
    ])

    doc.add_heading("7. Maatregelenoverzicht (M1-M167)", 1)
    doc.add_paragraph("PGS 15:2025 bevat 167 maatregelen (M1-M167) plus één milieuwelvaartmaatregel (MW1). Hieronder de meest relevante voor Phoenix Metals:")
    add_tbl(doc, ["Maatregel","Onderwerp","Kern"],[
        ["M14","Werkvoorraad","Max 1 aangebroken + 1 nieuwe per stof"],["M15","Max oppervlak","1.000 m² (<20 ton) of 2.500 m² (>20 ton)"],
        ["M17","Opslag verdieping","Geen beperking voor onbrandbaar ADR-8/9"],
        ["M21","Wbdbo","Geen eis bij dedicated onbrandbaar ADR-8/9"],
        ["M29","Verspreiding voorkomen","Geen verbinding met riool/oppervlaktewater"],
        ["M30","Opvangcapaciteit","110% grootste verpakking of 10% totaal"],
        ["M32","Bluswateropvang","ADR-8: 50%, ADR-9: 100% (bij VN-A)"],
        ["M36","Onderhoud","Adequaat onderhouden, gebreken direct verhelpen"],
        ["M45","Inspectie verpakkingen","Controle bij ontvangst en opslag"],
        ["M68","Ontstekingsbronnen","Rook-/vuurverbod binnen 2 m"],
        ["M85","Deskundigheid","Medewerkers deskundig en bekend met gevaren"],
        ["M95","Brandblusmiddelen","Min 2× 6 kg poederblusser"],
        ["M115","Noodplan","Intern noodplan bij bepaalde hoeveelheden"],
        ["M116-117","Stoffenlijst + plattegrond","Actueel, hardcopy aan brandweer"],
        ["M119","Opruimen gemorst","Snel opruimen, materialen beschikbaar"],
        ["M120","Lekkage-instructie","Procedure aanwezig, actueel"],
        ["M121","Calamiteiteninstructie","Zichtbaar bij toegang"],
        ["M134","Rookverbod","Duidelijk gemaakt met pictogram"],
        ["M135-136","Etikettering","ADR-symbolen 20×20 cm, CLP-pictogrammen"],
        ["M137","SDS","Beschikbaar voor alle stoffen"],
    ])

    doc.add_heading("8. Specifieke eisen Phoenix Metals", 1)
    doc.add_paragraph("Samenvatting PGS 15:2025 eisen voor Phoenix Metals:")
    add_tbl(doc, ["Aspect","Eis"],[
        ["ADR-classificatie","H₂SO₄=Klasse 8 VG II; NaOH=Klasse 8 VG II; Vanadium=Klasse 9"],
        ["Veiligheidsniveau","BASIS (onbrandbaar, dedicated)"],
        ["Wbdbo","Geen eis"],["Opvang","110% grootste verpakking of 10% totaal"],
        ["Scheiding","H₂SO₄ en NaOH GESCHEIDEN (zuur+base)"],["Verdieping","Geen beperking"],
        ["PBM's","Zuurbestendig, veiligheidsbril, beschermkleding"],
        ["Neutralisatiemiddelen","Soda (voor H₂SO₄), citroenzuur (voor NaOH)"],
        ["Branddetectie","Niet verplicht (basisniveau)"],["Signalering","ADR-etiket 8, rookverbod, bevoegd personeel"],
    ])

    doc.add_heading("9. Relatie met wetgeving", 1)
    add_tbl(doc, ["Wet/Regelgeving","Relevante artikelen"],[
        ["Omgevingswet (Bal)","Art. 3.27, 4.1012"],["Arbeidsomstandighedenwet","Art. 5, Arbobesluit hoofdstuk 4"],
        ["Wet veiligheidsregio's","Art. 10, 25, 31"],["CLP-verordening","EG 1272/2008"],
        ["REACH","EG 1907/2006"],["Bbl","Brandcompartimentering, bereikbaarheid"],
        ["ADR","Classificatie, verpakking, scheiding"],
    ])

    doc.add_heading("10. Begrippenlijst", 1)
    add_tbl(doc, ["Begrip","Definitie"],[
        ["Wbdbo","Weerstand tegen branddoorslag en brandoverslag (minuten)"],
        ["Brandcompartiment","Ruimte begrensd door brandwerende constructies"],
        ["Vak","Afgescheiden gedeelte binnen opslagvoorziening"],
        ["Werkvoorraad","Voorraad noodzakelijk voor bedrijfsvoering"],
        ["VBB-installatie","Vastopgestelde brandbeheersings- en brandblussysteem"],
    ])

    fp = f"{DOCX_DIR}/PGS15_Basishandleiding_v3.0.docx"
    doc.save(fp)
    print(f"✅ Basishandleiding v3.0: {fp}")

# ═══ 2. Audit Procedure v3.0 ═══
def gen_audit_procedure():
    doc = make_doc("PGS-15 Audit Procedure", "v3.0 — PGS 15:2025 Nieuwe Stijl")
    
    doc.add_heading("Inhoudsopgave", 1)
    for t in ["1. Doel en Toepassingsgebied","2. Auditplanning","3. Auditteam","4. Uitvoeringsmethodiek",
              "5. Scenariogerichte Audit (S1-S16)","6. Bevindingenclassificatie","7. Rapportage","8. CAPA-Procedure","9. Opvolging"]:
        doc.add_paragraph(t)
    doc.add_page_break()

    doc.add_heading("1. Doel en Toepassingsgebied", 1)
    doc.add_paragraph("Deze procedure beschrijft de methodiek voor interne en externe audits op PGS 15:2025 naleving bij Phoenix Metals B.V.")
    doc.add_paragraph("Frequentie: intern minimaal jaarlijks; extern bij vergunningsvereiste of BRZO-plichtigheid.")

    doc.add_heading("2. Auditplanning", 1)
    doc.add_paragraph("Jaarlijks wordt een auditplan opgesteld door de HSE Manager, goedgekeurd door de Plant Manager. Het plan bevat:")
    bul(doc, "Scope: welke PGS 15:2025 maatregelen worden geaudit")
    bul(doc, "Planning: data, auditors, locaties")
    bul(doc, "Voorbereiding: documentenreview vooraf")

    doc.add_heading("3. Auditteam", 1)
    add_tbl(doc, ["Rol","Verantwoordelijkheid","Bevoegdheid"],[
        ["Lead Auditor","Leiding, planning, rapportage","PGS-15 deskundig, auditor-opleiding"],
        ["Auditor","Uitvoering veldinspectie + documentenreview","PGS-15 basiskennis"],
        ["Technical Specialist","Stofspecifieke beoordeling","Chemische veiligheid expertise"],
    ])

    doc.add_heading("4. Uitvoeringsmethodiek", 1)
    doc.add_paragraph("Drie methoden worden gecombineerd:")
    bul(doc, "Documentenreview: controle stoffenlijst, SDS, keuringsrapporten, plattegrond, instructies")
    bul(doc, "Veldinspectie: visuele controle opslag, etikettering, PBM's, opvang, scheiding, borden")
    bul(doc, "Interviews: medewerkers bevragen over procedures, gevaren, noodmaatregelen")

    doc.add_heading("5. Scenariogerichte Audit (S1-S16)", 1)
    doc.add_paragraph("De v3.0 audit is scenariogericht: per relevant scenario wordt gecontroleerd of de bijbehorende maatregelen adequaat zijn geïmplementeerd.")
    add_tbl(doc, ["Scenario","Auditfocus","PM Relevantie"],[
        ["S1: Aanrijding","Botsbeveiliging, verkeersrouting, pallets","Hoog"],
        ["S2: Val schade","Stabling, stabiliteit, verpakkingstoestand","Hoog"],
        ["S3: Stelling bezwijken","Constructieve sterkte, belasting","Medium"],
        ["S4: Verkeerde stapeling","Stapelvoorschriften, training","Medium"],
        ["S5: Veroudering","Inspectieronde, corrosiecontrole","Hoog"],
        ["S7: Menselijke fout","Training, procedures, supervisie","Hoog"],
        ["S11: Vrijkomen stof","Opvang, lekdetectie, neutralisatie","Hoog — KRITIEK"],
        ["S12: Verspreiding","Ventilatie, opvang, geen rioolverbinding","Hoog"],
        ["S16: Stofspecifiek","Scheiding zuur/base, temperatuur NaOH","Hoog — KRITIEK"],
    ])

    doc.add_heading("6. Bevindingenclassificatie", 1)
    add_tbl(doc, ["Classificatie","Definitie","Termijn actie"],[
        ["Major Non-Conformity","Systematisch falen of acuut risico","Onmiddellijk (48 uur)"],
        ["Minor Non-Conformity","Isoléerde afwijking, geen acuut risico","30 dagen"],
        ["Observation","Verbetersuggestie, geen afwijking","Volgende auditcyclus"],
        ["Best Practice","Positieve bevinding","Delen met organisatie"],
    ])

    doc.add_heading("7. Rapportage", 1)
    doc.add_paragraph("Het audrapport wordt opgesteld conform het Audit Rapport Template v3.0 en bevat:")
    bul(doc, "Executive summary met totaalscore conformiteit")
    bul(doc, "Bevindingen per scenario/maatregel met classificatie")
    bul(doc, "CAPA-actieplan met eigenaren en deadlines")
    bul(doc, "Goedkeuring door Plant Manager")

    doc.add_heading("8. CAPA-Procedure", 1)
    doc.add_paragraph("Corrective and Preventive Actions:")
    bul(doc, "Elke non-conformiteit krijgt een CAPA-formulier")
    bul(doc, "Root-cause analyse verplicht bij major non-conformities")
    bul(doc, "Eigenaar toegewezen + deadline")
    bul(doc, "Verificatie uitgevoerde acties door Lead Auditor")
    bul(doc, "Effectiviteitscontrole na 3 maanden")

    doc.add_heading("9. Opvolging", 1)
    doc.add_paragraph("Het auditrapport wordt besproken in het HSE-overleg. Openstaande CAPA's worden opgevolgd tot afsluiting. Jaarlijks wordt een trendanalyse uitgevoerd.")

    fp = f"{DOCX_DIR}/PGS15_Audit_Procedure_v3.0.docx"
    doc.save(fp)
    print(f"✅ Audit Procedure v3.0: {fp}")

# ═══ 3. Audit Checklist v3.0 ═══
def gen_audit_checklist():
    doc = make_doc("PGS-15 Audit Checklist", "v3.0 — Maatregelen M1-M167")
    
    doc.add_heading("Instructie", 1)
    doc.add_paragraph("Markeer per item: ✅ Conform / ❌ Non-conform / ➖ N.v.t. / ⚠️ Actie vereist")
    doc.add_paragraph("Bevindingen noteren in kolom 'Opmerkingen'. Koppel aan CAPA-formulier bij non-conformiteiten.")
    
    sections_data = [
        ("1. Algemene Opslageisen", [
            ("M1","Opslagvoorziening duidelijk aangeduid","☐"),
            ("M3","Opslagvoorziening is brandcompartiment","☐"),
            ("M14","Werkvoorraad: max 1+1 per stof","☐"),
            ("M15","Max oppervlak niet overschreden","☐"),
            ("M17","Hoeveelheid per verdieping conform","☐"),
        ]),
        ("2. Bouwkundige Eisen", [
            ("M21","Wbdbo conform vereist niveau","☐"),
            ("M24","Brandwerendheid draagconstructie","☐"),
            ("M25","Constructies voldoen aan NEN 6069","☐"),
            ("M27","Dak niet-brandgevaarlijk materiaal","☐"),
        ]),
        ("3. Opvangvoorzieningen", [
            ("M29","Geen verbinding riool/oppervlaktewater","☐"),
            ("M30","Opvangcapaciteit 110%/10%","☐"),
            ("M31","Terrein afschot naar opvang","☐"),
            ("M32","Bluswateropvang conform (indien VN-A)","☐"),
        ]),
        ("4. Scheiding en Vakindeling", [
            ("—","H₂SO₄ en NaOH gescheiden opgeslagen","☐"),
            ("—","Scheiding conform Bijlage E PGS 15","☐"),
            ("—","Vakindeling/vakscheiding fysiek aanwezig","☐"),
            ("—","Onverenigbare combinaties geïdentificeerd","☐"),
        ]),
        ("5. Brandveiligheid", [
            ("M68","Rook-/vuurverbod binnen 2m","☐"),
            ("M71-73","Explosieveiligheidsdocument (indien van toepassing)","☐"),
            ("M95","Brandblusmiddelen aanwezig (2×6kg)","☐"),
            ("M96","Branddetectie (indien VN-A)","☐"),
            ("M134","Verbodsborden aanwezig","☐"),
        ]),
        ("6. Arbeidsveiligheid", [
            ("M85","Medewerkers deskundig, getraind","☐"),
            ("M85","PBM's adequaat en beschikbaar","☐"),
            ("M88","PBM-matrix actualiteit","☐"),
            ("—","Nooddouche + oogdoucher bereikbaar (<10 sec)","☐"),
        ]),
        ("7. Milieuveiligheid", [
            ("M119","Absorptie/neutralisatiemiddelen beschikbaar","☐"),
            ("—","Soda voor H₂SO₄ beschikbaar","☐"),
            ("—","Citroenzuur voor NaOH beschikbaar","☐"),
        ]),
        ("8. Etikettering en Signalering", [
            ("M135","ADR-etiketten buitenzijde (min 20×20cm)","☐"),
            ("M135","GHS-pictogrammen op tanks (min 10×10cm)","☐"),
            ("M136","Leidingetikettering conform NEN-EN-ISO 20560","☐"),
            ("—","10 verplichte elementen per tanketiket","☐"),
            ("—","Signaalwoorden correct (GEVAAR/WAARSCHUWING)","☐"),
        ]),
        ("9. Documenten", [
            ("M116","Stoffenlijst actueel","☐"),
            ("M116","Plattegrond opslag actueel","☐"),
            ("M117","Stoffenlijst + plattegrond aan brandweer","☐"),
            ("M120","Lekkage-instructie aanwezig + actueel","☐"),
            ("M121","Calamiteiteninstructie zichtbaar bij toegang","☐"),
            ("M137","SDS beschikbaar voor ALLE stoffen","☐"),
            ("—","11 verplichte documenttypen compleet","☐"),
        ]),
        ("10. Temperatuurbewaking (NaOH-specifiek)", [
            ("M30","Temperatuursensoren functioneel","☐"),
            ("—","Alarm bij <12°C geconfigureerd","☐"),
            ("—","Verwarmingstracing functioneel","☐"),
            ("—","SCADA-log actief","☐"),
        ]),
        ("11. Lekdetectie", [
            ("M29","Lekdetectiesystemen functioneel","☐"),
            ("—","Maandelijkse functionele test uitgevoerd","☐"),
            ("—","Interstitiële sensoren (dubbelwandig) OK","☐"),
        ]),
        ("12. Onderhoud en Keuring", [
            ("M36","Opslagvoorziening adequaat onderhouden","☐"),
            ("M36","Gebreken direct verholpen","☐"),
            ("M45","Inspectie verpakkingen bij ontvangst + opslag","☐"),
            ("—","Keuringsrapporten gearchiveerd","☐"),
        ]),
    ]
    
    for section_title, items in sections_data:
        doc.add_heading(section_title, 1)
        add_tbl(doc, ["Maatregel","Controlepunt","Status","Opmerkingen"],
                [[m, desc, status, ""] for m, desc, status in items])
        doc.add_paragraph("")

    doc.add_page_break()
    doc.add_heading("Samenvatting Audit", 1)
    add_tbl(doc, ["Item","Waarde"],[
        ["Auditdatum",""],["Auditor(s)",""],["Scope",""],
        ["Totaal items gecontroleerd",""],["Conform",""],["Non-conform",""],
        ["N.v.t.",""],["Conformiteitspercentage",""],
    ])
    doc.add_paragraph("")
    doc.add_paragraph("Handtekening Lead Auditor: _______________  Datum: _______________")
    doc.add_paragraph("Handtekening Plant Manager: _______________  Datum: _______________")

    fp = f"{DOCX_DIR}/PGS15_Audit_Checklist_v3.0.docx"
    doc.save(fp)
    print(f"✅ Audit Checklist v3.0: {fp}")

# ═══ 4. Audit Rapport Template v3.0 ═══
def gen_audit_rapport():
    doc = make_doc("PGS-15 Audit Rapport Template", "v3.0 — PGS 15:2025")
    
    doc.add_heading("Auditidentificatie", 1)
    add_tbl(doc, ["Veld","Waarde"],[
        ["Bedrijf","Phoenix Metals B.V."],["Locatie","Plant One Rotterdam"],
        ["Auditdatum","[datum]"],["Lead Auditor","[naam]"],
        ["Auditor(s)","[namen]"],["Scope","PGS 15:2025 naleving"],
        ["Audittype","☐ Intern  ☐ Extern"],["Referentienummer","[nummer]"],
    ])

    doc.add_page_break()
    doc.add_heading("Executive Summary", 1)
    doc.add_paragraph("[Samenvatting van de belangrijkste bevindingen, conformiteitspercentage en overall oordeel]")
    doc.add_paragraph("Conformiteitspercentage: _____%")
    doc.add_paragraph("Overall oordeel: ☐ Volledig conform  ☐ Grotendeels conform  ☐ Gedeeltelijk conform  ☐ Niet conform")

    doc.add_heading("1. Scope en Methodiek", 1)
    doc.add_paragraph("[Beschrijving van de audit scope, toegepaste methodiek en referentiedocumenten]")

    doc.add_heading("2. Bevindingen per Thema", 1)
    
    themes = [
        ("2.1 Bouwkundige eisen (M21-M27)", "Wbdbo, constructies, brandwerendheid"),
        ("2.2 Opvangvoorzieningen (M29-M32)", "Opvangcapaciteit, bluswateropvang, verspreiding"),
        ("2.3 Scheiding en vakindeling (Bijlage E)", "Zuur/base scheiding, onverenigbare combinaties"),
        ("2.4 Brandveiligheid (M68, M95-M99, M134)", "Ontstekingsbronnen, blusmiddelen, detectie"),
        ("2.5 Arbeidsveiligheid (M85, M88)", "PBM's, deskundigheid, training"),
        ("2.6 Etikettering (M135-M136)", "Tanks, leidingen, borden, GHS-pictogrammen"),
        ("2.7 Documenten (M115-M121, M137)", "SDS, stoffenlijst, plattegrond, instructies"),
        ("2.8 Stofspecifieke eisen", "Temperatuur NaOH, corrosie H₂SO₄, milieu vanadium"),
        ("2.9 Onderhoud en inspectie (M36-M38, M45)", "Onderhoudsprogramma, keuringen"),
        ("2.10 Scenariogerichte beoordeling", "S1-S16 relevantie en maatregelen"),
    ]
    
    for theme, scope in themes:
        doc.add_heading(theme, 2)
        add_tbl(doc, ["Bevinding","Maatregel","Classificatie","Opmerking"],[
            ["[beschrijving]","[M-nummer]","☐ Major ☐ Minor ☐ Obs",""],
        ])
        doc.add_paragraph("")

    doc.add_page_break()
    doc.add_heading("3. CAPA-Actieplan", 1)
    doc.add_paragraph("Alle non-conformiteiten worden hieronder opgevolgd:")
    for i in range(8):
        add_tbl(doc, ["CAPA #",f"NC-{i+1:03d}"],[["Omschrijving","[non-conformiteit]"],
                ["Maatregel","[M-nummer]"],["Root cause","[oorzaak]"],
                ["Correctieve actie","[actie]"],["Preventieve actie","[actie]"],
                ["Eigenaar","[naam]"],["Deadline","[datum]"],["Status","☐ Open ☐ In uitvoering ☐ Gesloten"]])
        doc.add_paragraph("")

    doc.add_heading("4. Conclusie en Aanbevelingen", 1)
    doc.add_paragraph("[Conclusie over PGS 15:2025 naleving en aanbevelingen voor verbetering]")

    doc.add_page_break()
    doc.add_heading("5. Goedkeuring", 1)
    doc.add_paragraph("")
    add_tbl(doc, ["Rol","Naam","Handtekening","Datum"],[
        ["Lead Auditor","","",""],["Plant Manager","","",""],
        ["HSE Manager","","",""],
    ])

    fp = f"{DOCX_DIR}/PGS15_Audit_Rapport_Template_v3.0.docx"
    doc.save(fp)
    print(f"✅ Audit Rapport Template v3.0: {fp}")

# ═══ RUN ═══
gen_basishandleiding()
gen_audit_procedure()
gen_audit_checklist()
gen_audit_rapport()
