#!/usr/bin/env python3
"""
PGS-15 Compliance Project — Phoenix Metals
Generate all 5 deliverables (D1-D4: DOCX, D5: PPTX)
"""
import os
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
from docx.oxml.ns import qn
from pptx import Presentation
from pptx.util import Inches as PInches, Pt as PPt, Emu
from pptx.dml.color import RGBColor as PRGBColor
from pptx.enum.text import PP_ALIGN
import datetime

OUT_DOCX = "/root/projects/jg/2026-pgs15-phoenix-metals/deliverables/docx"
OUT_PPTX = "/root/projects/jg/2026-pgs15-phoenix-metals/deliverables/pptx"
os.makedirs(OUT_DOCX, exist_ok=True)
os.makedirs(OUT_PPTX, exist_ok=True)

PRIMARY = RGBColor(0x00, 0x33, 0x66)
INFO = RGBColor(0x3B, 0x82, 0xF6)
DARK = RGBColor(0x1F, 0x29, 0x37)
DATE = "16 april 2026"
VERSION = "v1.0"

def set_cell_shading(cell, color):
    shading = cell._element.get_or_add_tcPr()
    shd = shading.makeelement(qn('w:shd'), {
        qn('w:val'): 'clear',
        qn('w:color'): 'auto',
        qn('w:fill'): color.replace('#','')
    })
    shading.append(shd)

def add_styled_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 = h
        for p in cell.paragraphs:
            p.alignment = WD_ALIGN_PARAGRAPH.CENTER
            for r in p.runs:
                r.font.bold = True
                r.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)
                r.font.size = Pt(10)
        set_cell_shading(cell, '003366')
    # Data rows
    for ri, row in enumerate(rows):
        for ci, val in enumerate(row):
            cell = table.rows[ri+1].cells[ci]
            cell.text = str(val)
            for p in cell.paragraphs:
                for r in p.runs:
                    r.font.size = Pt(10)
            if ri % 2 == 1:
                set_cell_shading(cell, 'F8F9FA')
    return table

def add_header_footer(doc, title, subtitle=""):
    section = doc.sections[0]
    # Header
    header = section.header
    hp = header.paragraphs[0]
    hp.alignment = WD_ALIGN_PARAGRAPH.RIGHT
    run = hp.add_run("JvG Consultancy | Phoenix Metals — PGS-15 Compliance")
    run.font.size = Pt(8)
    run.font.color.rgb = RGBColor(0x37, 0x41, 0x51)
    # Footer
    footer = section.footer
    fp = footer.paragraphs[0]
    fp.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = fp.add_run(f"Vertrouwelijk — {DATE} — {VERSION}")
    run.font.size = Pt(8)
    run.font.color.rgb = RGBColor(0x37, 0x41, 0x51)

def make_title_page(doc, title, subtitle, doc_ref):
    for _ in range(6):
        doc.add_paragraph()
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run(title)
    run.font.size = Pt(28)
    run.font.bold = True
    run.font.color.rgb = PRIMARY
    p2 = doc.add_paragraph()
    p2.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run2 = p2.add_run(subtitle)
    run2.font.size = Pt(16)
    run2.font.color.rgb = DARK
    p3 = doc.add_paragraph()
    p3.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run3 = p3.add_run(f"\n{doc_ref}\nDatum: {DATE}\nVersie: {VERSION}\n\nJvG Consultancy\nOpdrachtgever: Phoenix Metals B.V.")
    run3.font.size = Pt(11)
    run3.font.color.rgb = RGBColor(0x37, 0x41, 0x51)
    doc.add_page_break()

# =============================================================================
# DELIVERABLE 1: Kennisdossier PGS-15 & Opslagveiligheid
# =============================================================================
def generate_d1():
    doc = Document()
    add_header_footer(doc, "Kennisdossier PGS-15", "D1")
    make_title_page(doc, "Kennisdossier PGS-15 & Opslagveiligheid",
                    "Phoenix Metals — Plant One, IJmuiden",
                    "PGS15_Kennisdossier_Phoenix_Metals_D1_v1.0")

    # Section 1: PGS-15 Introductie
    doc.add_heading("1. Inleiding PGS-15 en Toepassingsgebied", level=1)
    doc.add_paragraph(
        "PGS-15 (Publicatiereeks Gevaarlijke Stoffen 15) is de NPR (Nederlandse Praktijkrichtlijn) "
        "voor de opslag van vloeistoffen in vlakke opslagtanks. De richtlijn geeft gedetailleerde eisen "
        "voor het veilig opslaan van brandbare en/of giftige vloeistoffen in bovengrondse en ondergrondse tanks, "
        "inclusief het bijbehorende leidingwerk, pompsystemen en laad-/losvoorzieningen."
    )
    doc.add_paragraph(
        "PGS-15 is van toepassing indien gevaarlijke vloeistoffen worden opgeslagen in tanks met een inhoud > 150 liter "
        "en indien deze vloeistoffen zijn ingedeeld volgens de CLP-verordening (EC 1272/2008) als brandbaar, "
        "oxiderend, bijtend, of giftig. Voor Phoenix Metals is PGS-15 direct relevant gezien de opslag van "
        "zwavelzuur (H2SO4, 50-75%), natriumhydroxide (NaOH, 50%) en vanadiumhoudende procesvloeistoffen."
    )
    doc.add_heading("1.1 Wettelijk kader", level=2)
    doc.add_paragraph(
        "PGS-15 is een zogenaamde 'onderschikkende norm' onder het Besluit activiteiten leefomgeving (BAL) en het "
        "Besluit bouwwerken leefomgeving (BBL). Bij de omgevingsvergunning wordt verwezen naar PGS-15 als norm "
        "voor opslag van gevaarlijke vloeistoffen. Afdeling 3.8 van het BAL (opslag in inrichtingen) en "
        "artikel 4.75 BBL (opslagtanks) vormen het wettelijk kader."
    )

    # Section 2: Tanksystemen Phoenix Metals
    doc.add_heading("2. Tanksystemen en Opslagconfiguratie Phoenix Metals", level=1)
    doc.add_paragraph(
        "Op basis van het Process Flow Diagram (PFD, P2-PFD-001-01 Rev.03) en de Plant Layout zijn de volgende "
        "opslagtanks geïdentificeerd:"
    )
    add_styled_table(doc,
        ["Tank/Vat", "Type", "Capaciteit", "Inhoud", "Materiaal"],
        [
            ["Sulphuric Acid Tank", "Fusion tank", "41,5 kL", "Zwavelzuur (50-75%)", "GRV/PP gelined"],
            ["Catholyte Tank 1", "Fusion tank", "41,5 kL", "Catholyt oplossing", "GRV/PP gelined"],
            ["Catholyte Tank 2", "Fusion tank", "41,5 kL", "Catholyt oplossing", "GRV/PP gelined"],
            ["Anolyte Tank", "Fusion tank", "41,5 kL", "Anolyt oplossing", "GRV/PP gelined"],
            ["Dissolution Tank", "Fusion tank", "10 kL", "Staalslak-oplossing", "GRV/PP gelined"],
            ["DI Water Tank", "Fusion tank", "25,2 kL", "Gedemineraliseerd water", "GRV"],
            ["Vanadium Dosing Tank", "Dosing vat", "4 kL", "Vanadiumoplossing", "GRV/PP gelined"],
            ["Process Waste Tank", "Polymaster DS", "30 kL", "Procesafval", "PE/PP"],
            ["Buffer Tank", "Buffer", "N.n.b.", "Onbewerkt materiaal", "Staand"],
            ["Bunded Sulfuric Acid IBC", "IBC (bunded)", "~1 kL", "Zwavelzuur", "HDPE"],
            ["Bunded Phosphoric Acid IBC", "IBC (bunded)", "~1 kL", "Fosforzuur", "HDPE"],
        ]
    )
    doc.add_paragraph()
    doc.add_paragraph(
        "Opmerking: De pilot plant fase (Locatie IJmuiden, Westerduinweg 3) voorziet in een opschaling van "
        "20 liter naar 3.000 liter per batch. De Fusion-tanks zijn PP-gelined (polypropyleen) wat essentieel is "
        "voor de corrosieve eigenschappen van zwavelzuur en NaOH. De IBC's voor fosforzuur en zwavelzuur zijn "
        "uitgevoerd met secundaire containment (bunded)."
    )

    # Section 3: Classificatie
    doc.add_heading("3. Classificatie van Opgeslagen Vloeistoffen volgens PGS-15", level=1)
    doc.add_heading("3.1 Zwavelzuur (H₂SO₄, 50-75%)", level=2)
    doc.add_paragraph(
        "Classificatie volgens CLP (EC 1272/2008):\n"
        "• H290: Kan corrosief zijn voor metalen\n"
        "• H314: Veroorzaakt ernstige huidverbrandingen en oogletsel\n"
        "• H318: Veroorzaakt ernstig oogletsel\n"
        "GHS-pictogrammen: Corrosie (GHS05), Gevaar-signaalwoord\n"
        "UN-nummer: 1830 (zwavelzuur >51%) of 2796 (zwavelzuur ≤51%)\n"
        "PGS-15 categorie: Bijtende vloeistof, geen brandgevaar maar wel reactief met metalen en water."
    )
    doc.add_heading("3.2 Natriumhydroxide (NaOH, 50%)", level=2)
    doc.add_paragraph(
        "Classificatie volgens CLP:\n"
        "• H290: Kan corrosief zijn voor metalen\n"
        "• H314: Veroorzaakt ernstige huidverbrandingen en oogletsel\n"
        "GHS-pictogrammen: Corrosie (GHS05)\n"
        "UN-nummer: 1824\n"
        "PGS-15 categorie: Bijtende vloeistof. Reactie met zwavelzuur is sterk exotherm — scheiden opslaan."
    )
    doc.add_heading("3.3 Vanadiumoplossingen (vanadium(IV)sulfaat, vanadiumconcentraat)", level=2)
    doc.add_paragraph(
        "Classificatie op basis van SDS:\n"
        "• H302: Schadelijk bij inslikken\n"
        "• H315: Veroorzaakt huidirritatie\n"
        "• H319: Veroorzaakt ernstige oogirritatie\n"
        "• H335: Kan irritatie van de luchtwegen veroorzaken\n"
        "• H341: Verdenking van genetische defecten\n"
        "• H412: Schadelijk voor in het water levende organismen, met langdurige gevolgen\n"
        "GHS-pictogrammen: Gezondheidsgevaar (GHS08), Uitroepteken (GHS07), Milieu (GHS09)\n"
        "PGS-15 categorie: Giftige/schadelijke vloeistof. Opslag vereist gescheiden afloop en opvang."
    )
    doc.add_heading("3.4 Fosforzuur (H₃PO₄)", level=2)
    doc.add_paragraph(
        "Wordt opgeslagen in bunded IBC. Classificatie: H314 (bijtend). Lagere risicoklasse dan zwavelzuur."
    )

    # Section 4: Afstandseisen
    doc.add_heading("4. Afstandseisen en Veiligheidsafstanden", level=1)
    doc.add_paragraph(
        "PGS-15 tabel 4.1 specificeert de veiligheidsafstanden afhankelijk van de vloeistofcategorie en tankinhoud. "
        "Voor Phoenix Metals gelden de volgende uitgangspunten:"
    )
    add_styled_table(doc,
        ["Vloeistofcategorie", "Tankinhoud", "Afstand tot bedrijfsgrens", "Afstand tot derden"],
        [
            ["Bijtend (H314) — H₂SO₄", "> 10.000 L", "≥ 5 m (met voering)", "≥ 10 m"],
            ["Bijtend (H314) — NaOH", "> 10.000 L", "≥ 5 m (met voering)", "≥ 10 m"],
            ["Schadelijk (H302/H412) — Vanadium", "> 10.000 L", "≥ 3 m", "≥ 6 m"],
            ["Bunded IBC's", "< 1.000 L per IBC", "Binnen gebouw toegestaan", "N.v.t. (binnen)"],
        ]
    )
    doc.add_paragraph()
    doc.add_paragraph(
        "Toelichting: Omdat de vloeistoffen primair bijtend (niet-brandbaar) zijn, gelden de afstandseisen "
        "van PGS-15 hoofdstuk 4 voor C-vloeistoffen. Bij toepassing van vloeistofdichte opvangbekkens (secondary "
        "containment) met minimaal 110% van de grootste tankinhoud, kunnen afstanden worden geminimaliseerd tot "
        "de constructieve eis van het gebouw. Voor de locatie Westerduinweg 3, IJmuiden is de afstand tot "
        "bedrijfsgrenzen en derden een aandachtspunt in het kader van de omgevingsvergunning (vooroverleg ODij, "
        "23 september 2023)."
    )

    # Section 5: Brandwerendheid & Containment
    doc.add_heading("5. Brandwerendheid, Secundaire Containments en Beveiligingssystemen", level=1)
    doc.add_heading("5.1 Secundaire containment (opvangbekken)", level=2)
    doc.add_paragraph(
        "PGS-15 §5.3 vereist dat elke opslagtank is voorzien van een vloeistofdicht opvangbekken met een "
        "inhoud van minimaal 110% van de grootste tank in het bekken. Voor Phoenix Metals:\n\n"
        "• Fusion-tanks (41,5 kL): opvangbekken met minimaal 45,65 kL capaciteit\n"
        "• IBC's: bunded uitvoering (integrale opvangbak) — voldoet aan PGS-15 §5.3.2\n"
        "• Process Waste Tank (30 kL): afzonderlijk opvangbekken van ≥ 33 kL\n\n"
        "Het opvangbekken moet vloeistofdicht zijn uitgevoerd met een chemisch bestendige coating of voering, "
        "bestand tegen de agressiefste stof (zwavelzuur 75%). HDPE- of PP-voering is hier het aangewezen materiaal."
    )
    doc.add_heading("5.2 Lekdetectie en overloopbeveiliging", level=2)
    doc.add_paragraph(
        "PGS-15 §5.5 vereist:\n"
        "• Overloopbeveiliging (high-level switch/alarm) op elke tank > 1.000 L\n"
        "• Interlock tussen vulsysteem en high-level alarm\n"
        "• Lekdetectie in dubbelwandige tanks of in het opvangbekken (vloeistofsensor)\n"
        "• Visuele inspectie van het bekken minimaal 1x per week\n\n"
        "Voor de Fusion-tanks met PP-voering wordt geadviseerd dubbelwandige uitvoering met interstitiële "
        "lekdetectie conform PGS-15 §5.5.3."
    )
    doc.add_heading("5.3 Brandwerendheid", level=2)
    doc.add_paragraph(
        "Hoewel de opgeslagen vloeistoffen niet-brandbaar zijn (zwavelzuur, NaOH, vanadiumoplossingen), "
        "vereist PGS-15 §6.2 dat de opslaglocatie is uitgevoerd met:\n"
        "• Brandwerende scheiding (minimaal EI60) tussen opslagruimte en andere ruimtes\n"
        "• Toegangsdeuren met minimaal EI30\n"
        "• Brandblusvoorzieningen conform NEN 4006 (bedrijfsbrandweer)\n\n"
        "De locatie Plant One IJmuiden beschikt over een bedrijfsbrandweer-organisatie (zie BNP Phoenix Metals, "
        "PROC-XXX-XX-XX, rev. 1.0, 23-12-2024)."
    )

    # Section 6: Scenario's
    doc.add_heading("6. Relevante PGS-15 Scenarios", level=1)
    doc.add_heading("6.1 Lekkage", level=2)
    doc.add_paragraph(
        "Het primaire risico voor Phoenix Metals is lekkage van corrosieve vloeistoffen (zwavelzuur, NaOH). "
        "PGS-15 scenario's:\n"
        "• Tankwandfalen (corrosie, materiaaldefect)\n"
        "• Leidingbreuk (verbindingen, flenzen)\n"
        "• Aftapping/loskoppelen laadslang\n\n"
        "Maatregelen: secundaire containment, lekdetectie, noodafvoer naar veilig opvangsysteem, PBM bij "
        "interventie (zuurbestendig pak, gezichtsmasker, zuurbestendige handschoenen)."
    )
    doc.add_heading("6.2 Overvulling", level=2)
    doc.add_paragraph(
        "Overvulling wordt voorkomen door high-level alarm + interlock (PGS-15 §5.5.1). Bij overvulling "
        "loopt de vloeistof in het opvangbekken. Procedure: vulproces onmiddellijk stoppen, naburige tanks "
        "controleren, Bekken inspecteren, Melden aan HSE Manager."
    )
    doc.add_heading("6.3 Reactie/Exotherme reactie", level=2)
    doc.add_paragraph(
        "Het mengen van zwavelzuur en NaOH is sterk exotherm. Phoenix Metals gebruikt beide stoffen in het "
        "proces, maar de opslag moet strikt gescheiden zijn. PGS-15 §4.4 vereist scheiding van chemisch "
        "reactieve stoffen. Minimale afstand of fysieke scheiding (wand) tussen H₂SO₄- en NaOH-tanks."
    )
    doc.add_heading("6.4 Externe belasting", level=2)
    doc.add_paragraph(
        "Mechanische belasting (voertuigbotsing, vallende objecten): PGS-15 §5.7 vereist barrieres (stootblokken) "
        "rond bovengrondse tanks als er verkeer in de nabijheid is. Voor de locatie IJmuiden (industrieterrein) "
        "is vrachtverkeer verwacht — stootblokken of bollards rond de tankopstelling zijn verplicht."
    )

    # Section 7: BRZO/Seveso
    doc.add_heading("7. Koppeling met BRZO 2015 / Seveso III", level=1)
    doc.add_paragraph(
        "Het Besluit risico's zware ongevallen 2015 (BRZO 2015) implementeert de Seveso III-richtlijn in "
        "Nederland. BRZO-plichtigheid hangt af van de hoeveelheden aangewezen gevaarlijke stoffen."
    )
    add_styled_table(doc,
        ["Stof", "CLP-categorie", "Hoeveelheid Phoenix Metals", "Drempelwaarde BRZO lagere grens", "Drempelwaarde BRZO bovenste grens"],
        [
            ["Zwavelzuur (75%)", "H314 (bijtend)", "~41,5 kL ≈ 62 ton", "50 ton (cat. H314)", "200 ton"],
            ["NaOH (50%)", "H314 (bijtend)", "~41,5 kL ≈ 55 ton", "50 ton (cat. H314)", "200 ton"],
            ["Vanadiumoplossing", "H341/H412", "~41,5 kL ≈ 50 ton", "50 ton (cat. H341/H412)", "200 ton"],
        ]
    )
    doc.add_paragraph()
    doc.add_paragraph(
        "Conclusie: De totale hoeveelheid bijtende stoffen (H314) ligt in de orde van ~117 ton (H₂SO₄ + NaOH). "
        "De lagere grens voor BRZO-plichtigheid voor categorie H314 is 50 ton per individuele stof en 200 ton "
        "totaal voor bijtende stoffen. Bij de huidige pilot plant capaciteit (max 100 ton/jaar staalslak) "
        "lijkt Phoenix Metals net onder of rond de lagere BRZO-drempel te zitten. Een exacte massabalans en "
        "inventarisatie van alle aanwezige gevaarlijke stoffen is vereist om dit definitief te bepalen.\n\n"
        "Advies: Voer een Seveso-drempelwaardenanalyse uit zodra de definitieve massabalans beschikbaar is. "
        "Indien BRZO-plichtig: een VR (Veiligheidsrapportage) is verplicht, inclusief QRA, domino-effectenanalyse "
        "en een extern noodplan (PNR)."
    )

    # Section 8: Omgevingsvergunning
    doc.add_heading("8. Omgevingsvergunning: Opslag-gerelateerde Voorwaarden", level=1)
    doc.add_paragraph(
        "Op basis van het vooroverleg met ODij (23 september 2023) en het uitgangspuntendocument gelden de volgende "
        "opslag-gerelateerde voorwaarden:\n\n"
        "1. Activiteitenbesluit (BAL) categorie: De pilot plant wordt niet beschouwd als 'chemische industrie op "
        "industriële schaal' (RIE categorie 4.2d), maar valt mogelijk onder categorie 2.5/2.6 (andere industrie) "
        "of 3.8.6 (opslag).\n\n"
        "2. Opslagvergunning: Voor opslag van gevaarlijke vloeistoffen > 150 liter in tanks is een "
        "omgevingsvergunning vereist. PGS-15 wordt als norm opgenomen in de vergunningsvoorwaarden.\n\n"
        "3. Afvalstoffen: Indien staalslakken als afvalstof worden aangemerkt, geldt categorie 5 van het RIE en "
        "categorie 3.5.11 van het BAL, met vergunningsplicht.\n\n"
        "4. Lozingen: Procesafval wordt opgevangen in de Process Waste Tank (30 kL) en afgevoerd als chemisch "
        "afval. Geen directe lozing op riool of oppervlaktewater.\n\n"
        "5. Geluid/hinder: Op de locatie IJmuiden (Westerduinweg 3, naast Cebo) moeten geluidsnormen worden "
        "nageleefd.\n\n"
        "6. Straling: De as die wordt verwerkt bevat natuurlijk voorkomende radionucliden (U-238, Ra-226, Pb-210, "
        "Ra-228, Th-228). Volgens de Factsheet Ash 2025 gelden de vrijstellingswaarden van het Besluit "
        "basisveiligheidsnormen stralingsbescherming. Bij verwerking ≤ 1.000 kg is sprake van intrinsiek veilig. "
        "Een notificatie is vereist voor afvoer van residu met U-238 serie > 1 kBq/kg."
    )

    doc.add_page_break()
    doc.add_heading("Bijlagen", level=1)
    doc.add_paragraph("Bijlage A: Overzicht PGS-15 hoofdstukken relevant voor Phoenix Metals\n"
                       "Bijlage B: SDS-samenvattingen (zwavelzuur, NaOH, vanadiumconcentraat)\n"
                       "Bijlage C: Plant Layout met tankposities\n"
                       "Bijlage D: Vooroverleg verslag ODij (23-09-2023)")

    doc.save(os.path.join(OUT_DOCX, "PGS15_Kennisdossier_Phoenix_Metals_D1_v1.0.docx"))
    print("D1 generated")

# =============================================================================
# DELIVERABLE 2: Veilig Werken & HSEQ Framework
# =============================================================================
def generate_d2():
    doc = Document()
    add_header_footer(doc, "Veilig Werken & HSEQ Framework", "D2")
    make_title_page(doc, "Veilig Werken & HSEQ Framework",
                    "Opslag & Logistiek — Phoenix Metals",
                    "PGS15_Veilig_Werken_HSEQ_Phoenix_Metals_D2_v1.0")

    doc.add_heading("1. Ontwerp van Opslagfaciliteiten conform PGS-15", level=1)
    doc.add_paragraph(
        "De opslagfaciliteiten van Phoenix Metals voldoen aan de PGS-15 eisen voor bovengrondse opslag van "
        "bijtende en schadelijke vloeistoffen. Het ontwerp omvat de volgende elementen:"
    )
    doc.add_heading("1.1 Tankconfiguratie", level=2)
    add_styled_table(doc,
        ["Element", "PGS-15 eis", "Phoenix Metals uitvoering"],
        [
            ["Tankmateriaal", "Bestand tegen opgeslagen stof (PGS-15 §5.2)", "PP-gelined Fusion tanks (corrosiebestendig)"],
            ["Opvangbekken", "110% grootste tank (PGS-15 §5.3)", "Per tankcluster, chemisch bestendige voering"],
            ["Overloopbeveiliging", "High-level alarm + interlock (PGS-15 §5.5)", "Niveau-indicator met alarm in controleanleiding"],
            ["Lekdetectie", "Interstitiële detectie bij dubbelwandig (PGS-15 §5.5.3)", "Aanbevolen: dubbelwandig met lekdetectie"],
            ["Toegankelijkheid", "Rondeengang min. 0,6 m (PGS-15 §5.8)", "Voldoende ruimte rond opstelling"],
            ["Stootblokken", "Bij verkeer in nabijheid (PGS-15 §5.7)", "Bollards rond bovengrondse tanks"],
            ["Ventilatie", "Voldoende ventilatie bij binnenopslag", "Mechanische ventilatie, >= 6 luchtvervangingen/uur"],
        ]
    )

    doc.add_heading("1.2 Scheiding van incompatibele stoffen", level=2)
    doc.add_paragraph(
        "Zwavelzuur en natriumhydroxide worden strikt gescheiden opgeslagen conform PGS-15 §4.4. "
        "De zwavelzuurtank en NaOH-dosing bevinden zich in afzonderlijke bunded areas. Fosforzuur IBC "
        "en zwavelzuur IBC zijn eveneens gescheiden. De scheidingsafstand bedraagt minimaal 5 meter of "
        "een fysieke scheidingswand (EI30)."
    )

    doc.add_heading("2. Laad- en Losprocedures voor Gevaarlijke Vloeistoffen", level=1)
    doc.add_heading("2.1 Algemene laad/losprocedure", level=2)
    doc.add_paragraph(
        "Voordat een laad- of losoperatie start:\n\n"
        "1. Taak Risico Analyse (TRA) uitvoeren en goedkeuren door HSE Manager\n"
        "2. Werkeneming (Work Permit) aanvragen en goedkeuren\n"
        "3. Controle op juiste PBM (zuurbestendig pak, zuurvaste handschoenen, gezichtsmasker, laarzen)\n"
        "4. Verificatie van tankniveau (voldoende vrije ruimte bij vullen)\n"
        "5. Controle van slangen, koppelingen en afsluiters op beschadiging\n"
        "6. Nooddouche en oogdoucher in de directe nabijheid gecontroleerd\n"
        "7. Communicatiemiddelen (walkietalkie/portofoon) beschikbaar\n"
        "8. Brandblusser en absorbentiemateriaal (zand/chemische kit) in de nabijheid"
    )
    doc.add_heading("2.2 Lossen van zwavelzuur (tankwagen → opslagtank)", level=2)
    doc.add_paragraph(
        "• Tankwagen positioneert op aangewezen laadplek met stootblokken\n"
        "• Aardingskabel aansluiten (statische elektriciteit)\n"
        "• Veilingslang aansluiten op tankwagen en opslagtank\n"
        "• Vulpunt controleren op lekkage (droogproef)\n"
        "• Vloeistof overpompen met bewaking van niveau-indicator\n"
        "• Na afloop: slangen spoelen, ontkoppelen, lekcontrole\n"
        "• Tankwagen ontluchten voordat vertrek\n"
        "• Logboek bijwerken: hoeveelheid, datum, uitvoerende, afwijkingen"
    )
    doc.add_heading("2.3 Laden (opslagtank → proces/vervoer)", level=2)
    doc.add_paragraph(
        "• Vergelijkbare procedure als lossen, in omgekeerde richting\n"
        "• Extra aandacht voor overdrukbeveiliging bij vullen van IBC's/jerrycans\n"
        "• Doseersystemen (Sulfuric Acid Dosing Skid, Product Dosing Skid) gebruiken "
        "volgens fabrieksspecificaties\n"
        "• Vanadiumdosing via Vanadium Dosing Skid met gesloten systeem"
    )

    doc.add_heading("3. Tankinspectie, Onderhoud en Integriteitsbeheer", level=1)
    doc.add_heading("3.1 Inspectieprogramma", level=2)
    add_styled_table(doc,
        ["Inspectietype", "Frequentie", "Uitvoerder", "Documentatie"],
        [
            ["Visuele inspectie exterieur", "Wekelijks", "Operator", "Inspectieformulier"],
            ["Visuele inspectie bekken", "Wekelijks", "Operator", "Inspectieformulier"],
            ["Niveau-indicator functietest", "Maandelijks", "Instrumentatie", "Testrapport"],
            ["Lekdetectie functietest", "Maandelijks", "Instrumentatie", "Testrapport"],
            ["Interne tankinspectie", "Jaarlijks (of bij leegstand)", "Inspectiebedrijf", "Inspectierapport"],
            ["Wanddiktemeting (ultrageluid)", "Elke 3 jaar", "Inspectiebedrijf", "Rapport + trendanalyse"],
            ["Druktest/lektest", "Bij interne inspectie", "Inspectiebedrijf", "Testrapport"],
        ]
    )
    doc.add_heading("3.2 Preventief onderhoud", level=2)
    doc.add_paragraph(
        "Alle tanks, leidingen, pompen en kleppen worden opgenomen in een preventief onderhoudsschema. "
        "Het CMMS (Computerized Maintenance Management System) genereert werkbonnen op basis van:\n"
        "• Fabrikant-aanbevelingen\n"
        "• Inspectieresultaten (conditiegericht onderhoud)\n"
        "• Incidenten en bijna-ongevallen\n\n"
        "Kritische onderdelen: afdichtingen (seals), pakkingen (gaskets), veiligheidskleppen, "
        "overloopbeveiliging, lekdetectiesensoren."
    )

    doc.add_heading("4. PBM-eisen voor Opslag- en Laad/Los-activiteiten", level=1)
    add_styled_table(doc,
        ["Activiteit", "PBM-vereisten"],
        [
            ["Visuele inspectie (exterieur)", "Veiligheidsbril, werkhandschoenen, veiligheidsschoenen, werkkleding"],
            ["Laad/los zwavelzuur", "Zuurbestendig pak (PVC/CR), zuurvaste handschoenen (butyl), "
             "gezichtsmasker met zuurfilter, zuurbestendige laarzen, veiligheidsbril"],
            ["Laad/los NaOH", "Bijtendbestendig pak, natriumhydroxide-bestendige handschoenen (nitrile), "
             "gezichtsmasker, veiligheidsbril, laarzen"],
            ["Tankinterne inspectie", "Adembescherming (onafhankelijk), zuurbestendig pak, veiligheidsharnas, "
             "gasmeting (H₂S, O₂, LEL) voor betreding"],
            ["Lekkage-interventie", "Zuurbestendig pak, zelfstandig adembeschermingsapparaat, "
             "gezichtsmasker, zuurbestendige handschoenen en laarzen"],
            ["Werken bij vanadiumoplossingen", "Chemisch bestendig pak, nitrile handschoenen, "
             "veiligheidsbril, adembescherming bij verneveling"],
        ]
    )

    doc.add_heading("5. Noodprocedures: Lekkage, Brand, Evacuatie", level=1)
    doc.add_heading("5.1 Koppeling met bestaand BNP", level=2)
    doc.add_paragraph(
        "Het Bedrijfsnoodplan (BNP) van Phoenix Metals (PROC-XXX-XX-XX, rev. 1.0, 23-12-2024) is het "
        "basisdocument voor noodprocedures. Dit HSEQ Framework specificeert de opslag-specifieke "
        "noodprocedures als aanvulling op het BNP. Het BNP is afgestemd met het noodplan van Plant One "
        "Rotterdam (POR) en het Bedrijfsnoodplan van Huntsman Rotterdam."
    )
    doc.add_heading("5.2 Procedure lekkage corrosieve vloeistof", level=2)
    doc.add_paragraph(
        "1. ALARM: direct omgeving waarschuwen, BHV'er alarmeren\n"
        "2. BRON: indien veilig — afsluiting dichtstbijzijnde klep, pomp stoppen\n"
        "3. PBM: zuurbestendig pak + adembescherming bij interventie\n"
        "4. CONTAINMENT: vloeistof opvangen in opvangbekken, absorptiemedium inzetten\n"
        "5. NEUTRALISATIE: bij NaOH-lekkage — verdunnen met water; bij H₂SO₄-lekkage — "
        "niet met water spuiten (exotherm), maar absorberen met zand/chemisch absorptiemiddel\n"
        "6. AFVOER: opgevangen materiaal als gevaarlijk afval afvoeren\n"
        "7. MELDING: incidentrapport, HSE Manager informeren\n"
        "8. HERSTEL: tank/leiding herstellen na root-cause analyse"
    )
    doc.add_heading("5.3 Procedure brand", level=2)
    doc.add_paragraph(
        "Hoewel de opgeslagen vloeistoffen niet-brandbaar zijn, kan brand ontstaan door externe bronnen.\n\n"
        "1. ALARM: brandalarm activeren, 112 bellen\n"
        "2. EVACUATIE: gebouw ontruimen via BNP-procedure (verzamelplaats)\n"
        "3. BHV: klein blusmiddel inzetten indien veilig (blustoestel)\n"
        "4. BRANDWEER: aanwijzen van gevaarlijke stoffen bij aankomst brandweer\n"
        "5. MILIEU: voorkom uitspoeling van bluswater met gevaarlijke stoffen naar riolering "
        "(opvang bluswater)"
    )
    doc.add_heading("5.4 Evacuatieprocedure", level=2)
    doc.add_paragraph(
        "Zie BNP §3.2 — Ontruiming van het verzamelgebouw van POR.\n"
        "• Ontruimingsleiders sturen medewerkers naar verzamelplaats\n"
        "• Telling bij verzamelplaats\n"
        "• BHV'er coördineert met Plant One noodorganisatie\n"
        "• Portier terrein 5210 informeert externe hulpdiensten"
    )

    doc.add_heading("6. Arbowetgeving: Werken met Gevaarlijke Stoffen in Opslagcontext", level=1)
    doc.add_paragraph(
        "De Arbowet (Wet van 9 oktober 1997) en het Arbobesluit stellen de volgende eisen bij werken met "
        "gevaarlijke stoffen:\n\n"
        "• Arbobesluit art. 4.1c: RI&E met specifieke aandacht voor gevaarlijke stoffen\n"
        "• Arbobesluit art. 4.1d: Inventarisatie en registratie van gevaarlijke stoffen\n"
        "• Arbobesluit hoofdstuk 4 afdeling 2: Grenswaarden blootstelling (H₂SO₄: 0,1 mg/m³ als H₂SO₄-aerosol)\n"
        "• Arbobesluit art. 3.5: TRA (Taak Risico Analyse) voorafgaand aan elk werk\n"
        "• Arbobesluit art. 3.8: Voorlichting en instructie aan medewerkers\n"
        "• Arbobesluit art. 3.14: Arbeidsgezondheidskundig onderzoek bij blootstelling aan KMR-stoffen "
        "(H341 — vanadiumverdenking genotoxisch)\n\n"
        "Voor Phoenix Metals betekent dit:\n"
        "1. Een actueel stoffenregister (Registration Chemicals — MASTER v2.1.0)\n"
        "2. SDS beschikbaar voor alle medewerkers\n"
        "3. TRA voor elke laad-/los- en inspectieactiviteit\n"
        "4. Periodieke blootstellingsmetingen indien van toepassing\n"
        "5. Medisch surveillanceregime voor medewerkers met potentiele blootstelling aan vanadiumverbindingen"
    )

    doc.save(os.path.join(OUT_DOCX, "PGS15_Veilig_Werken_HSEQ_Phoenix_Metals_D2_v1.0.docx"))
    print("D2 generated")

# =============================================================================
# DELIVERABLE 3: Veiligheidsinformatie & Documentatie
# =============================================================================
def generate_d3():
    doc = Document()
    add_header_footer(doc, "Veiligheidsinformatie & Documentatie", "D3")
    make_title_page(doc, "Veiligheidsinformatie & Documentatie",
                    "SDS, Etikettering, Opslaginstructies — Phoenix Metals",
                    "PGS15_Veiligheidsinfo_Documentatie_Phoenix_Metals_D3_v1.0")

    doc.add_heading("1. Opslaginstructies per Stof (PGS-15 Voorschriften)", level=1)

    doc.add_heading("1.1 Zwavelzuur (H₂SO₄, 50-75%)", level=2)
    add_styled_table(doc,
        ["Parameter", "Voorschrift"],
        [
            ["Opslagtemperatuur", "15-25°C (kamertemperatuur), vorstvrij"],
            ["Tankmateriaal", "PP-gelined staal, HDPE, of glasvezelversterkt polyester"],
            ["Secundaire containment", "Opvangbekken ≥ 110% tankinhoud, zuurbestendig"],
            ["Gescheiden opslag", "Ja — gescheiden van basen (NaOH), oxiderende stoffen, metalen"],
            ["Ventilatie", "Voldoende ventilatie; H₂SO₄-damp bij verhitting"],
            ["Maximum vulniveau", "95% van nominele tankinhoud"],
            ["Speciale vereisten", "Geen contact met water (exotherm), roestvrijstaal vermijden"],
            ["Nooddouche/oogdouche", "Direct bereikbaar, max 10 seconden loopafstand"],
        ]
    )

    doc.add_heading("1.2 Natriumhydroxide (NaOH, 50%)", level=2)
    add_styled_table(doc,
        ["Parameter", "Voorschrift"],
        [
            ["Opslagtemperatuur", "> 12°C (kristallisatie bij lagere temperaturen), max 30°C"],
            ["Tankmateriaal", "PP-gelined staal, HDPE, roestvrijstaal (316L)"],
            ["Secundaire containment", "Opvangbekken ≥ 110% tankinhoud, bijtendbestendig"],
            ["Gescheiden opslag", "Ja — gescheiden van zuren (H₂SO₄), metalen (aluminium, tin, zink)"],
            ["Ventilatie", "Voldoende; neiging tot mistvorming bij warme oplossing"],
            ["Maximum vulniveau", "95% van nominele tankinhoud"],
            ["Speciale vereisten", "Kristallisatie bij < 12°C — verwarmingstracing van leidingen"],
            ["Nooddouche/oogdouche", "Direct bereikbaar"],
        ]
    )

    doc.add_heading("1.3 Vanadiumoplossingen (Vanadium(IV)sulfaat, Vanadiumconcentraat)", level=2)
    add_styled_table(doc,
        ["Parameter", "Voorschrift"],
        [
            ["Opslagtemperatuur", "15-25°C, vorstvrij"],
            ["Tankmateriaal", "PP-gelined, HDPE, glasvezelversterkt polyester"],
            ["Secundaire containment", "Opvangbekken ≥ 110% tankinhoud"],
            ["Gescheiden opslag", "Gescheiden van sterke zuren en sterke basen — separate bunded area"],
            ["Ventilatie", "Gesloten systeem; bij verneveling: lokale afzuiging"],
            ["Maximum vulniveau", "95%"],
            ["Speciale vereisten", "H341 (genotoxisch verdenking) — minimaliseren blootstelling; H412 — milieuzorg"],
            ["Nooddouche/oogdouche", "Direct bereikbaar"],
        ]
    )

    doc.add_heading("1.4 Fosforzuur (H₃PO₄)", level=2)
    doc.add_paragraph(
        "Opslag in bunded IBC. Kamertemperatuur, vorstvrij. Gescheiden van sterke basen. "
        "HDPE-IBC met integrale lekbak. Nooddouche bereikbaar."
    )

    doc.add_heading("2. SDS-vereisten voor Opgeslagen Stoffen", level=1)
    doc.add_paragraph(
        "Volgens REACH (EG 1907/2006) artikel 31 en de CLP-verordening (EG 1272/2008) moet voor elke "
        "gevaarlijke stof een actuele Safety Data Sheet (SDS) beschikbaar zijn. De SDS moet:"
    )
    doc.add_paragraph(
        "• Opgesteld zijn in het Nederlands (officiële taal van de lidstaat)\n"
        "• Actueel zijn (max. 5 jaar oud, of herzien bij nieuwe informatie)\n"
        "• Beschikbaar zijn voor alle medewerkers (digitaal en fysiek nabij opslaglocatie)\n"
        "• Bevatten: 16 verplichte secties volgens Annex II REACH\n"
        "• Verstrekken: operationele condities (OC's) en risicobeheersmaatregelen (RMM's)\n\n"
        "Actuele SDS's beschikbaar voor Phoenix Metals:\n"
        "• Zwavelzuur 75% — RCI Labscan (SDS-ASE-016, rv.00, 01-07-21)\n"
        "• Natriumhydroxide 50% — Merck/Millipore (v6.9, 02-07-2024)\n"
        "• Vanadiumconcentraat — zie documentatie (Versie 1, NL)\n\n"
        "Action item: SDS voor fosforzuur, gedemineraliseerd water (indien additieven), en procesafval-stroom toevoegen."
    )

    doc.add_heading("3. Etikettering van Tanks en Leidingen", level=1)
    doc.add_heading("3.1 Tanketikettering", level=2)
    doc.add_paragraph(
        "Elke opslagtank moet conform PGS-15 §7.2 en CLP-voorschriften zijn voorzien van een duurzaam etiket met:\n\n"
        "1. Productnaam (volgens SDS)\n"
        "2. CAS-nummer\n"
        "3. GHS-pictogrammen (minimaal 10×10 cm bij tanks)\n"
        "4. Signaalwoord (Gevaar/Waarschuwing)\n"
        "5. H-zinnen (gevaarsaanduidingen)\n"
        "6. P-zinnen (voorzorgsmaatregelen)\n"
        "7. UN-nummer\n"
        "8. Tankinhoud (nominale capaciteit)\n"
        "9. Leverancier/producent\n"
        "10. Noodtelefoonnummer"
    )
    add_styled_table(doc,
        ["Tank", "Etiket pictogrammen", "Signaalwoord", "Belangrijkste H-zinnen"],
        [
            ["Sulphuric Acid Tank", "GHS05 (Corrosie)", "Gevaar", "H290, H314"],
            ["Catholyte Tanks 1 & 2", "GHS07 + GHS08 + GHS09", "Waarschuwing", "H315, H319, H341, H412"],
            ["Anolyte Tank", "GHS07 + GHS08 + GHS09", "Waarschuwing", "H315, H319, H341, H412"],
            ["Dissolution Tank", "GHS05 + GHS07", "Gevaar", "H290, H314, H302"],
            ["Process Waste Tank", "GHS07 + GHS08 + GHS09", "Waarschuwing", "H302, H341, H412"],
            ["NaOH-dosing", "GHS05 (Corrosie)", "Gevaar", "H290, H314"],
            ["IBC Zwavelzuur", "GHS05 (Corrosie)", "Gevaar", "H290, H314"],
            ["IBC Fosforzuur", "GHS05 (Corrosie)", "Waarschuwing", "H314"],
        ]
    )

    doc.add_heading("3.2 Leidingetikettering", level=2)
    doc.add_paragraph(
        "Alle leidingen voor gevaarlijke vloeistoffen conform NEN-EN 1710 (identificatie leidingen):\n"
        "• Kleurcodering: geel (bijtend), oranje (brandbaar — n.v.t.), groen (water)\n"
        "• Pijlrichting: stroomrichting aangegeven\n"
        "• Naam en CAS-nummer elke 5 meter en bij elke aansluiting\n"
        "• GHS-pictogram bij elke afnamepunt"
    )

    doc.add_heading("4. GHS/CLP-pictogrammen en Waarschuwingsborden", level=1)
    doc.add_paragraph(
        "De volgende waarschuwingsborden zijn verplicht opgesteld bij de opslaglocaties:"
    )
    add_styled_table(doc,
        ["Locatie", "Bord", "Inhoud"],
        [
            ["Ingang opslagruimte", "Veiligheidsbord", "GHS05 + GHS07 + GHS08 + GHS09, 'Verboden toegang onbevoegden', "
             "noodtelefoonnummer, PBM-verplichting"],
            ["Bij elke tank", "Tanklabel", "Productnaam, GHS-pictogrammen, H/P-zinnen"],
            ["Laad-/losplek", "Waarschuwingsbord", "'Gevaar — bijtende stoffen', nooddouche wijzende pijl"],
            ["Buitengebied (indien van toepassing)", "Seveso-bord", "Indien BRZO-plichtig: waarschuwingsbord conform art. 13 BRZO"],
        ]
    )

    doc.add_heading("5. Documentbeheer: Verplichte Veiligheidsdocumenten", level=1)
    add_styled_table(doc,
        ["Document", "Verplichting", "Eigenaar", "Frequentie/update"],
        [
            ["Safety Data Sheets (SDS)", "REACH art. 31", "Leverancier/HSE Manager", "Continue, min. 5-jaarlijkse herziening"],
            ["Stoffenregister", "Arbobesluit art. 4.1d", "HSE Manager", "Actueel houden bij wijzigingen"],
            ["RI&E (specifiek opslag)", "Arbowet art. 5", "HSE Manager + Directie", "Jaarlijks of bij wijzigingen"],
            ["Tankinspectierapporten", "PGS-15 §8", "Inspectiebedrijf", "Jaarlijks / 3-jaarlijks"],
            ["Onderhoudslogboek", "PGS-15 §8", "Technische dienst", "Continue"],
            ["BNP (Bedrijfsnoodplan)", "BRZO/BAL", "HSE Manager", "Jaarlijks herzien, oefenen 2x/jaar"],
            ["TRA-formulieren", "Arbobesluit art. 3.5", "Uitvoerende + leidinggevende", "Per taak"],
            ["Work Permits", "Interne procedure", "Workpermit coördinator", "Per activiteit"],
            ["HSE Policy", "Bedrijfsbeleid", "Directie", "Jaarlijks (management review)"],
            ["Opleidingsregister", "Arbobesluit art. 3.8", "HSE Manager", "Actueel"],
            ["Incidentregistratie", "Arbowet / BAL", "HSE Manager", "Continue"],
        ]
    )

    doc.add_heading("6. Documentbeheersysteem", level=1)
    doc.add_paragraph(
        "Alle veiligheidsdocumenten worden beheerd conform het documentbeheer van Phoenix Metals "
        "(zie Document Control overzicht). Het systeem omvat:\n\n"
        "• Versiebeheer: elk document heeft een uniek nummer, revisienummer en revisiedatum\n"
        "• Goedkeuringsworkflow: opgesteld → gecontroleerd → goedgekeurd → gedistribueerd\n"
        "• Distributie: gecontroleerde kopieën (digitaal en fysiek)\n"
        "• Archivering: oude versies bewaard in /archive/\n"
        "• Audit trail: wie, wat, wanneer gewijzigd\n\n"
        "Referentiekader: ISO 9001:2015 hoofdstuk 7.5 (gedocumenteerde informatie) "
        "en ISO 14001:2015 hoofdstuk 7.5."
    )

    doc.save(os.path.join(OUT_DOCX, "PGS15_Veiligheidsinfo_Documentatie_Phoenix_Metals_D3_v1.0.docx"))
    print("D3 generated")

# =============================================================================
# DELIVERABLE 4: Master SOP PGS-15 Opslagveiligheid
# =============================================================================
def generate_d4():
    doc = Document()
    add_header_footer(doc, "Master SOP PGS-15", "D4")
    make_title_page(doc, "Master SOP — PGS-15 Opslagveiligheid & Chemische Veiligheid",
                    "Phoenix Metals — Formele Standard Operating Procedure",
                    "PGS15_Master_SOP_Opslagveiligheid_Phoenix_Metals_D4_v1.0")

    doc.add_heading("Management Summary", level=1)
    doc.add_paragraph(
        "Deze Standard Operating Procedure (SOP) definieert de regels, procedures en verantwoordelijkheden "
        "voor de veilige opslag van gevaarlijke vloeistoffen bij Phoenix Metals, conform PGS-15 "
        "(NPR 3380: Opslag van vloeistoffen in vlakke opslagtanks) en aanverwante wet- en regelgeving.\n\n"
        "PGS-15 compliance is voor Phoenix Metals cruciaal om de volgende redenen:\n\n"
        "1. Bescherming van medewerkers: De opgeslagen stoffen (zwavelzuur, natriumhydroxide, "
        "vanadiumoplossingen) zijn bijtend, schadelijk en potentieel genotoxisch. Fouten in opslag of "
        "hantering leiden direct tot ernstig letsel.\n\n"
        "2. Vergunningsvoorwaarden: De omgevingsvergunning voor de locatie IJmuiden (Westerduinweg 3) "
        "verwijst naar PGS-15 als norm. Non-conformiteit = risico op intrekking vergunning.\n\n"
        "3. BRZO/Seveso: Bij overschrijding van stofdrempelwaarden wordt Phoenix Metals BRZO-plichtig. "
        "Een robuust opslagbeheerssysteem is dan een verplicht onderdeel van de Veiligheidsrapportage.\n\n"
        "4. Bedrijfscontinuïteit: Lekkage van corrosieve vloeistoffen leidt tot milieuschade, "
        "productieverlies en reputatieschade. Preventie via PGS-15 is kostenefficiënter dan curatie.\n\n"
        "5. Investeerdersvertrouwen: Professioneel opslagbeheer toont aan dat Phoenix Metals "
        "veiligheid serieus neemt — essentieel voor verdere financiering."
    )

    doc.add_heading("1. Doel en Toepassingsgebied", level=1)
    doc.add_paragraph(
        "Doel: Zorgen voor veilige opslag, hantering en transport van gevaarlijke vloeistoffen binnen de "
        "inrichting van Phoenix Metals, conform PGS-15 en alle toepasselijke wet- en regelgeving.\n\n"
        "Toepassingsgebied: Alle opslagfaciliteiten, tanks, IBC's, leidingen, laad-/losvoorzieningen "
        "en doseringsystemen op de locatie Phoenix Metals, Plant One, IJmuiden.\n\n"
        "Geldigheid: Deze SOP is bindend voor alle medewerkers, contractanten en bezoekers die "
        "werken in of toegang hebben tot de opslagfaciliteiten."
    )

    doc.add_heading("2. Definities en Afkortingen", level=1)
    add_styled_table(doc,
        ["Term/Afkorting", "Definitie"],
        [
            ["PGS-15", "Publicatiereeks Gevaarlijke Stoffen 15 — Opslag van vloeistoffen in vlakke opslagtanks"],
            ["CLP", "Classification, Labelling and Packaging (EG 1272/2008)"],
            ["SDS", "Safety Data Sheet (Veiligheidsinformatieblad)"],
            ["BRZO", "Besluit risico's zware ongevallen 2015"],
            ["BHV", "Bedrijfshulpverlening"],
            ["BNP", "Bedrijfsnoodplan"],
            ["TRA", "Taak Risico Analyse"],
            ["PBM", "Persoonlijke Beschermingsmiddelen"],
            ["RI&E", "Risico Inventarisatie & Evaluatie"],
            ["HSE", "Health, Safety and Environment"],
            ["Fusion tank", "PP-gelined opslagtank (Fusion type, corrosiebestendig)"],
            ["Bunded", "Met integrale opvangbak (secondary containment)"],
        ]
    )

    doc.add_heading("3. Verantwoordelijkheden", level=1)
    add_styled_table(doc,
        ["Functie", "Verantwoordelijkheid"],
        [
            ["Managing Director (Stijn van Zelst)", "Eindverantwoordelijkheid HSE-beleid; goedkeuring SOP; "
             "verstrekking middelen"],
            ["HSE Manager (Jorick van Gemert)", "Opstellen, implementeren en onderhouden SOP; inspecties; "
             "TRA-goedkeuring; incidentonderzoek; opleidingen"],
            ["Plant Manager / Shiftleider", "Dagelijks toezicht op naleving; work permit goedkeuring; "
             "coördinatie laad/los activiteiten"],
            ["Operators", "Uitvoeren conform SOP; rapporteren afwijkingen; PBM dragen; "
             "inspecties uitvoeren"],
            ["Technische Dienst", "Preventief en correctief onderhoud tanks/leidingen; "
             "insulatie- en lekdetectiesystemen"],
            ["Contractanten", "Naleven SOP; eigen TRA; eigen PBM; melden incidenten aan HSE Manager"],
        ]
    )

    doc.add_heading("4. Procedures", level=1)

    doc.add_heading("4.1 Tankbeheer", level=2)
    doc.add_paragraph(
        "4.1.1 Niveaubewaking\n"
        "Elke opslagtank is uitgerust met een niveau-indicator met high-level alarm. Het high-level alarm "
        "schakelt automatisch het vulpomp af bij 95% vullingsgraad. Het alarm is zichtbaar (licht) en hoorbaar "
        "(sirene) in de controlekamer.\n\n"
        "4.1.2 Temperatuurbewaking\n"
        "NaOH-tanks: temperatuurbewaking met alarm bij < 12°C (kristallisatierisico). Verwarmingstracing "
        "activeren bij dalende temperatuur.\n\n"
        "4.1.3 Lekdetectie\n"
        "Dubbelwandige tanks: interstitiële lekdetectie sensor alarmeert in controlekamer. "
        "Enkelwandige tanks: lekdetectie via vloeistofsensor in opvangbekken.\n\n"
        "4.1.4 Inventarisatie\n"
        "Maandelijkse inventarisatie van tankinhouden. Afwijkingen (> 5% onverklaarbaar verlies) "
        "direct melden aan HSE Manager."
    )

    doc.add_heading("4.2 Laad- en Losprocedures", level=2)
    doc.add_paragraph(
        "4.2.1 Voorbereiding\n"
        "a. TRA uitvoeren en laten goedkeuren door Shiftleider\n"
        "b. Work Permit aanvragen\n"
        "c. PBM donning conform tabel in §4.6\n"
        "d. Nooddouche/oogdouche functioneel getest\n"
        "e. Communicatiemiddelen beschikbaar\n\n"
        "4.2.2 Uitvoering\n"
        "a. Tankwagen opstellen op aangewezen plaats, wielblokken plaatsen\n"
        "b. Aarding aansluiten\n"
        "c. Vulslang/losdarm aansluiten, lektest uitvoeren\n"
        "d. Pompen starten, niveau bewaken\n"
        "e. Bij afwijking (lekkage, overvulling, ongewenste reactie): STOP procedure\n\n"
        "4.2.3 Afronding\n"
        "a. Pompen stoppen, leidingen ontluchten\n"
        "b. Slangen ontkoppelen, spoelen\n"
        "c. Visuele controle op lekkage\n"
        "d. Logboek bijwerken\n"
        "e. Work Permit aftekenen"
    )

    doc.add_heading("4.3 Inspectie en Onderhoud", level=2)
    doc.add_paragraph(
        "Zie Deliverable 2, §3 voor het volledige inspectieprogramma. Korte samenvatting:\n\n"
        "• Wekelijks: visuele inspectie exterieur en opvangbekken\n"
        "• Maandelijks: functietest niveau-indicator en lekdetectie\n"
        "• Jaarlijks: interne tankinspectie door erkend inspectiebedrijf\n"
        "• 3-jaarlijks: wanddiktemeting (ultrageluid)\n\n"
        "Alle inspectieresultaten worden vastgelegd in het inspectie-register. Afwijkingen leiden "
        "tot een Corrective Action Request (CAR) met deadline en verantwoordelijke."
    )

    doc.add_heading("4.4 Noodsituaties", level=2)
    doc.add_paragraph(
        "4.4.1 Lekkage\n"
        "→ Zie Deliverable 2, §5.2\n\n"
        "4.4.2 Brand\n"
        "→ Zie Deliverable 2, §5.3 en BNP\n\n"
        "4.4.3 Overvulling\n"
        "a. Pompen direct stoppen\n"
        "b. High-level alarm bevestigen\n"
        "c. Vloeistof in opvangbekken monitoren\n"
        "d. Indien bekken vol: noodafvoer naar reserveopvang\n"
        "e. Oorzaak analyseren (sensorfout, menselijke fout)\n\n"
        "4.4.4 Chemische reactie (onbedoeld mengen)\n"
        "a. Direct alle pompen stoppen\n"
        "b. Ontruiming indien gas- of warmte-ontwikkeling\n"
        "c. BHV'er inschakelen\n"
        "d. Brandweer informeren (112) bij ongecontroleerde reactie\n"
        "e. Gebied afzetten, niemand toelaten zonder PBM + adembescherming"
    )

    doc.add_heading("4.5 Kwaliteitsborging", level=2)
    doc.add_paragraph(
        "4.5.1 Interne audits\n"
        "De HSE Manager voert minimaal 2x per jaar een interne audit uit op naleving van deze SOP. "
        "Bevindingen worden gerapporteerd aan de Managing Director.\n\n"
        "4.5.2 Externe audits\n"
        "Jaarlijkse audit door externe HSE-adviseur (JvG Consultancy). Bevindingen leiden tot "
        "SOP-revisie indien nodig.\n\n"
        "4.5.3 KPI's\n"
        "• Aantal lekkage-incidenten: target = 0\n"
        "• Aantal bijna-ongevallen opslag: target < 2/jaar\n"
        "• Inspectie-naleving: target = 100%\n"
        "• PBM-naleving: target = 100%\n"
        "• Opleidingsnaleving: target = 100%\n\n"
        "4.5.4 Management Review\n"
        "De Managing Director en HSE Manager bespreken jaarlijks de SOP-doelstellingen, KPI-resultaten "
        "en auditbevindingen. Noodzakelijke wijzigingen worden doorgevoerd in een SOP-revisie."
    )

    doc.add_heading("4.6 PBM-matrix", level=2)
    doc.add_paragraph("Zie Deliverable 2, §4 voor de volledige PBM-tabel.")

    doc.add_heading("5. Referenties", level=1)
    doc.add_paragraph(
        "1. PGS-15 (NPR 3380) — Opslag van vloeistoffen in vlakke opslagtanks\n"
        "2. CLP-verordening (EG 1272/2008)\n"
        "3. REACH (EG 1907/2006)\n"
        "4. Besluit activiteiten leefomgeving (BAL)\n"
        "5. Besluit bouwwerken leefomgeving (BBL)\n"
        "6. BRZO 2015 (Besluit risico's zware ongevallen)\n"
        "7. Arbowet / Arbobesluit\n"
        "8. NEN-EN 1710 — Identificatie van leidingen\n"
        "9. NEN 4006 — Bedrijfsbrandweer\n"
        "10. Phoenix Metals HSE Policy (V1, 01-01-2025)\n"
        "11. Phoenix Metals BNP (PROC-XXX-XX-XX, rev. 1.0, 23-12-2024)\n"
        "12. Registration Chemicals MASTER (v2.1.0)"
    )

    doc.add_heading("6. Wijzigingsgeschiedenis", level=1)
    add_styled_table(doc,
        ["Versie", "Datum", "Wijziging", "Auteur", "Goedgekeurd door"],
        [
            ["1.0", "16-04-2026", "Initiële release", "JvG Consultancy", "Stijn van Zelst (pending)"],
        ]
    )

    doc.save(os.path.join(OUT_DOCX, "PGS15_Master_SOP_Opslagveiligheid_Phoenix_Metals_D4_v1.0.docx"))
    print("D4 generated")

# =============================================================================
# DELIVERABLE 5: Management Presentatie (PPTX)
# =============================================================================
def generate_d5():
    prs = Presentation()
    prs.slide_width = PInches(13.333)
    prs.slide_height = PInches(7.5)

    PRIMARY_C = PRGBColor(0x00, 0x33, 0x66)
    INFO_C = PRGBColor(0x3B, 0x82, 0xF6)
    WHITE = PRGBColor(0xFF, 0xFF, 0xFF)
    DARK_C = PRGBColor(0x1F, 0x29, 0x37)
    GRAY_C = PRGBColor(0x37, 0x41, 0x51)
    BG_CARD = PRGBColor(0xF8, 0xF9, 0xFA)

    def add_bg(slide, color=PRIMARY_C):
        bg = slide.background
        fill = bg.fill
        fill.solid()
        fill.fore_color.rgb = color

    def add_textbox(slide, left, top, width, height, text, font_size=18, bold=False, color=DARK_C, alignment=PP_ALIGN.LEFT):
        txBox = slide.shapes.add_textbox(PInches(left), PInches(top), PInches(width), PInches(height))
        tf = txBox.text_frame
        tf.word_wrap = True
        p = tf.paragraphs[0]
        p.text = text
        p.font.size = PPt(font_size)
        p.font.bold = bold
        p.font.color.rgb = color
        p.alignment = alignment
        return tf

    # Slide 1: Title
    slide = prs.slides.add_slide(prs.slide_layouts[6])  # blank
    add_bg(slide, PRIMARY_C)
    add_textbox(slide, 1, 1.5, 11, 1.5, "PGS-15 OPSLAGVEILIGHEID", 42, True, WHITE, PP_ALIGN.CENTER)
    add_textbox(slide, 1, 3.2, 11, 1, "Phoenix Metals — Compliance & Risicobeheersing", 24, False, WHITE, PP_ALIGN.CENTER)
    add_textbox(slide, 1, 4.5, 11, 0.8, "JvG Consultancy | 16 april 2026 | Vertrouwelijk", 16, False, PRGBColor(0xBB, 0xCC, 0xDD), PP_ALIGN.CENTER)
    add_textbox(slide, 1, 5.8, 11, 0.6, "Voor: Investeerders, Directie & Toezichthouders", 14, False, PRGBColor(0x99, 0xAA, 0xBB), PP_ALIGN.CENTER)

    # Slide 2: Agenda
    slide = prs.slides.add_slide(prs.slide_layouts[6])
    add_textbox(slide, 0.8, 0.4, 11, 0.8, "AGENDA", 32, True, PRIMARY_C)
    items = [
        "1. Waarom PGS-15? — Context en urgentie",
        "2. Phoenix Metals — Bedrijfsprofiel & Risicoprofiel",
        "3. Opslagconcept — Tanks, stoffen, configuratie",
        "4. Risicobeheersing — Scenarios, maatregelen, controles",
        "5. BRZO/Seveso — Drempelwaardenanalyse",
        "6. HSEQ Framework — Procedures en verantwoordelijkheden",
        "7. Naleving & Documentatie — Wat ontbreekt er?",
        "8. Roadmap — Tijdlijn naar volledige compliance",
        "9. Budget — Investeringsraming",
        "10. Conclusie & Actiepunten",
    ]
    y = 1.5
    for item in items:
        add_textbox(slide, 1.2, y, 10, 0.45, item, 18, False, DARK_C)
        y += 0.5

    # Slide 3: Waarom PGS-15
    slide = prs.slides.add_slide(prs.slide_layouts[6])
    add_textbox(slide, 0.8, 0.4, 11, 0.8, "WAAROM PGS-15?", 32, True, PRIMARY_C)
    bullets = [
        "PGS-15 = NPR 3380 — Norm voor opslag gevaarlijke vloeistoffen in vlakke tanks",
        "Verplicht onderdeel van de omgevingsvergunning (BAL/BBL referentie)",
        "Phoenix Metals slaat H₂SO₄ (75%), NaOH (50%) en vanadiumoplossingen op",
        "Deze stoffen zijn bijtend (H314), genotoxisch verdenking (H341) en milieugevaarlijk (H412)",
        "Non-compliance = risico op vergunningsintrekking, bedrijfsstillegging, aansprakelijkheid",
        "Basis voor BRZO/Seveso-plichtigheid bepaling (drempelwaarden ~50-200 ton)",
    ]
    y = 1.5
    for b in bullets:
        add_textbox(slide, 1.2, y, 10.5, 0.5, f"▸ {b}", 16, False, DARK_C)
        y += 0.6

    # Slide 4: Phoenix Metals Profiel
    slide = prs.slides.add_slide(prs.slide_layouts[6])
    add_textbox(slide, 0.8, 0.4, 11, 0.8, "PHOENIX METALS — BEDRIJFSPROFIEL", 32, True, PRIMARY_C)
    add_textbox(slide, 1, 1.5, 5, 4.5,
        "▸ Startup in circulaire economie\n"
        "▸ Vanadium uit staalslakken (Tata Steel)\n"
        "▸ Locatie: Plant One, IJmuiden\n"
        "▸ Pilot plant: 20L → 3.000L per batch\n"
        "▸ 100 ton/jaar staalslakverwerking\n"
        "▸ Proces: extractie met H₂SO₄, NaOH\n"
        "▸ Product: vanadium(IV)sulfaat (VOSO₄)\n"
        "▸ Status: omgevingsvergunning in aanvraag",
        15, False, DARK_C)
    add_textbox(slide, 6.5, 1.5, 5.5, 4.5,
        "RISICOPROFIEL OPSLAG:\n\n"
        "⚠ Zwavelzuur 75% — 41,5 kL tank (bijtend)\n"
        "⚠ NaOH 50% — dosering (bijtend)\n"
        "⚠ Vanadiumoplossing — 3× 41,5 kL (schadelijk)\n"
        "⚠ Procesafval — 30 kL (milieugevaarlijk)\n"
        "⚠ Exotherme reactie H₂SO₄ + NaOH\n"
        "⚠ Radionucliden in as (U-238, Ra-226)\n\n"
        "Brondocumenten: BNP, HSE Policy,\n"
        "PFD (P2-PFD-001-01), Plant Layout",
        15, False, DARK_C)

    # Slide 5: Opslagconcept
    slide = prs.slides.add_slide(prs.slide_layouts[6])
    add_textbox(slide, 0.8, 0.4, 11, 0.8, "OPSLAGCONCEPT — TANKS & CONFIGURATIE", 32, True, PRIMARY_C)
    # Simplified table as text
    tanks_text = (
        "TANK OVERZICHT:\n\n"
        "Tank                    Capaciteit    Inhoud                  Materiaal\n"
        "─────────────────────────────────────────────────────────\n"
        "Sulphuric Acid Tank     41,5 kL       H₂SO₄ (50-75%)         PP-gelined\n"
        "Catholyte Tank 1        41,5 kL       Catholyt oplossing      PP-gelined\n"
        "Catholyte Tank 2        41,5 kL       Catholyt oplossing      PP-gelined\n"
        "Anolyte Tank            41,5 kL       Anolyt oplossing        PP-gelined\n"
        "Dissolution Tank         10 kL        Staalslag-oplossing     PP-gelined\n"
        "DI Water Tank           25,2 kL       Gedemineraliseerd water GRV\n"
        "Vanadium Dosing Tank     4 kL         Vanadiumoplossing       PP-gelined\n"
        "Process Waste Tank       30 kL        Procesafval             PE/PP\n"
        "IBC's (bunded)          ~1 kL elk     H₂SO₄ / H₃PO₄          HDPE"
    )
    add_textbox(slide, 1, 1.3, 11, 5.5, tanks_text, 13, False, DARK_C)
    add_textbox(slide, 1, 6.5, 11, 0.5,
        "Totaal opgeslagen gevaarlijke vloeistoffen: ~200 kL | Secundaire containment: 110% per cluster",
        14, True, INFO_C)

    # Slide 6: Risicobeheersing
    slide = prs.slides.add_slide(prs.slide_layouts[6])
    add_textbox(slide, 0.8, 0.4, 11, 0.8, "RISICOBHEERSING — SCENARIOS & MAATREGELEN", 32, True, PRIMARY_C)
    scenarios = [
        ("LEKKAGE", "Secundaire containment (110%), lekdetectie, PBM bij interventie, noodafvoer"),
        ("OVERVULLING", "High-level alarm + interlock, 95% vulniveau limiet, visuele controle"),
        ("EXOTHERME REACTIE", "Strikte scheiding H₂SO₄ ↔ NaOH (≥5m of EI30 wand), gesloten dosering"),
        ("EXTERNE BELASTING", "Stootblokken/bollards, verkeersmanagement, barrières"),
        ("MILIEU-UITSTOOT", "Gesloten systeem, procesafval in 30kL tank, geen lozing oppervlaktewater"),
        ("STRAKING (Radionucliden)", "< 1000 kg as = vrijgesteld; notificatie bij afvoer residu > 1 kBq/kg"),
    ]
    y = 1.4
    for title, desc in scenarios:
        add_textbox(slide, 1.2, y, 3, 0.5, f"▸ {title}", 15, True, PRIMARY_C)
        add_textbox(slide, 4.2, y, 8, 0.5, desc, 14, False, DARK_C)
        y += 0.7

    # Slide 7: BRZO/Seveso
    slide = prs.slides.add_slide(prs.slide_layouts[6])
    add_textbox(slide, 0.8, 0.4, 11, 0.8, "BRZO/SEVESO — DREMPELWAARDENANALYSE", 32, True, PRIMARY_C)
    add_textbox(slide, 1, 1.5, 11, 4,
        "STOFDREMPELS BRZO 2015:\n\n"
        "Stof                    Hoeveelheid    Lagere grens    Bovenste grens    Status\n"
        "──────────────────────────────────────────────────────────────────────────\n"
        "Zwavelzuur (H314)       ~62 ton        50 ton          200 ton           ≈ lagere grens\n"
        "NaOH (H314)             ~55 ton        50 ton          200 ton           ≈ lagere grens\n"
        "Vanadium (H341/H412)    ~50 ton        50 ton          200 ton           ≈ lagere grens\n\n"
        "CONCLUSIE:\n"
        "⚠ Phoenix Metals bevindt zich rond de LAGERE BRZO-drempel\n"
        "⚠ Exacte massabalans noodzakelijk voor definitieve bepaling\n"
        "⚠ Indien BRZO-plichtig: Veiligheidsrapportage (VR) verplicht\n"
        "  → Inclusief QRA, domino-effecten, PNR (extern noodplan)",
        14, False, DARK_C)

    # Slide 8: HSEQ Framework
    slide = prs.slides.add_slide(prs.slide_layouts[6])
    add_textbox(slide, 0.8, 0.4, 11, 0.8, "HSEQ FRAMEWORK — PROCEDURES & VERANTWOORDELIJKHEDEN", 28, True, PRIMARY_C)
    items2 = [
        "✓ Master SOP PGS-15 Opslagveiligheid (D4) — opgesteld",
        "✓ Laad-/losprocedures — TRA + Work Permit verplicht",
        "✓ Tankinspectieprogramma — weeklijks t/m 3-jaarlijks",
        "✓ PBM-matrix per activiteit — volledig gedefinieerd",
        "✓ Noodprocedures — gekoppeld aan BNP (Plant One / Huntsman)",
        "✓ Documentbeheer — SDS, stoffenregister, inspectierapporten",
        "✓ Kwaliteitsborging — interne audits 2x/jaar, KPI monitoring",
        "○ RI&E opslag-specifiek — nog uit te voeren",
        "○ Seveso-drempelwaardenanalyse — wacht op massabalans",
        "○ BRZO Veiligheidsrapportage — indien van toepassing",
    ]
    y = 1.5
    for item in items2:
        color = DARK_C if item.startswith("✓") else PRGBColor(0xEF, 0x44, 0x44)
        add_textbox(slide, 1.2, y, 10.5, 0.45, item, 16, False, color)
        y += 0.5

    # Slide 9: Roadmap
    slide = prs.slides.add_slide(prs.slide_layouts[6])
    add_textbox(slide, 0.8, 0.4, 11, 0.8, "ROADMAP — TIJDLIJN NAAR VOLLEDIGE COMPLIANCE", 32, True, PRIMARY_C)
    phases = [
        ("Q2 2026", "FUNDAMENT", "SOP goedkeuren | Inspectieprogramma starten | SDS compleet maken | PBM implementeren"),
        ("Q3 2026", "IMPLEMENTATIE", "Laad/los procedures live | Lekdetectie installeren | Etikettering tanks | Training medewerkers"),
        ("Q4 2026", "VERIFICATIE", "Interne audit PGS-15 | RI&E opslag-specifiek | Massabalans afronden | BRZO-bepaling"),
        ("Q1 2027", "OPTIMALISATIE", "Externe audit | KPI eerste meting | SOP revisie op basis van bevindingen | Management review"),
    ]
    y = 1.5
    for phase, title, desc in phases:
        add_textbox(slide, 1, y, 2.2, 0.4, phase, 16, True, PRIMARY_C)
        add_textbox(slide, 3.3, y, 2.5, 0.4, title, 16, True, INFO_C)
        add_textbox(slide, 5.8, y, 7, 0.4, desc, 13, False, DARK_C)
        y += 0.8

    # Slide 10: Budget
    slide = prs.slides.add_slide(prs.slide_layouts[6])
    add_textbox(slide, 0.8, 0.4, 11, 0.8, "BUDGET — INVESTERINGSRAMING", 32, True, PRIMARY_C)
    add_textbox(slide, 1, 1.5, 11, 5,
        "POST                                           RAMING           PRIORITEIT\n"
        "─────────────────────────────────────────────────────────────────────\n"
        "Lekdetectiesystemen (8 tanks)                  € 15.000-25.000    HOOG\n"
        "Overloopbeveiliging + interlocks               €  8.000-12.000    HOOG\n"
        "Secundaire containment (opvangbekkens)         € 20.000-40.000    HOOG\n"
        "Stootblokken / bollards                        €  3.000-5.000     MIDDEL\n"
        "Etikettering + GHS-borden                      €  2.000-4.000     HOOG\n"
        "PBM-investering (beginvoorraad)                €  5.000-8.000     HOOG\n"
        "Nooddouche / oogdouche (additioneel)           €  3.000-5.000     HOOG\n"
        "Training & opleiding medewerkers               €  5.000-10.000    MIDDEL\n"
        "Inspectiebedrijf (jaarcontract)                €  8.000-15.000    HOOG\n"
        "BRZO/Seveso advies (indien van toepassing)     € 10.000-25.000    MIDDEL\n"
        "─────────────────────────────────────────────────────────────────────\n"
        "TOTAAL (indicatief)                            € 79.000-149.000\n\n"
        "Opmerking: Investeringen zijn eenmalig, inspectie en training zijn jaarlijks terugkerend.\n"
        "Niet-naleving risico's (boetes, stillegging, reputatie) overtreffen investeringskosten significant.",
        13, False, DARK_C)

    # Slide 11: Conclusie
    slide = prs.slides.add_slide(prs.slide_layouts[6])
    add_bg(slide, PRIMARY_C)
    add_textbox(slide, 1, 0.8, 11, 0.8, "CONCLUSIE & ACTIEPUNTEN", 36, True, WHITE, PP_ALIGN.CENTER)
    actions = [
        "1. GOEDKEURING — SOP PGS-15 ter goedkeuring voorleggen aan Directie",
        "2. MASSABALANS — Definitieve inventarisatie stofhoeveelheden (BRZO-bepaling)",
        "3. INVESTERING — Budget vrijgeven voor hoog-prioritaire items (lekdetectie, containment)",
        "4. TRAINING — Alle medewerkers PGS-15 bewustmakingstraining Q2 2026",
        "5. VERGUNNING — PGS-15 compliance meenemen in omgevingsvergunning aanvraag",
        "6. EXTERNE AUDIT — Onafhankelijke PGS-15 audit inplannen Q4 2026",
    ]
    y = 2.2
    for a in actions:
        add_textbox(slide, 1.2, y, 10.5, 0.5, a, 17, False, WHITE)
        y += 0.6
    add_textbox(slide, 1, 6.2, 11, 0.6,
        "JvG Consultancy — Jorick van Gemert | jorickvangemert@hotmail.com",
        14, False, PRGBColor(0xBB, 0xCC, 0xDD), PP_ALIGN.CENTER)

    prs.save(os.path.join(OUT_PPTX, "PGS15_Management_Presentatie_Phoenix_Metals_D5_v1.0.pptx"))
    print("D5 generated")

# =============================================================================
# MAIN
# =============================================================================
if __name__ == "__main__":
    generate_d1()
    generate_d2()
    generate_d3()
    generate_d4()
    generate_d5()
    print("\nAlle 5 deliverables gegenereerd.")
