#!/usr/bin/env python3
"""
PGS 15 Kennisdossier Phoenix Metals D1 v4.0 Generator
Genereert een professioneel DOCX-document conform PGS 15:2025
"""

from docx import Document
from docx.shared import Pt, Inches, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.enum.section import WD_ORIENT
import os
from datetime import datetime

doc = Document()

# ── Stijlen instellen ──
style = doc.styles['Normal']
font = style.font
font.name = 'Calibri'
font.size = Pt(11)
style.paragraph_format.space_after = Pt(6)
style.paragraph_format.space_before = Pt(3)

for level in range(1, 4):
    hs = doc.styles[f'Heading {level}']
    hs.font.color.rgb = RGBColor(0, 51, 102)
    hs.font.name = 'Calibri'

# ── Hulpfuncties ──
def add_table(doc, headers, rows, col_widths=None):
    table = doc.add_table(rows=1 + len(rows), cols=len(headers))
    table.style = 'Light Grid Accent 1'
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    # Header
    for i, h in enumerate(headers):
        cell = table.rows[0].cells[i]
        cell.text = h
        for p in cell.paragraphs:
            for r in p.runs:
                r.bold = True
                r.font.size = Pt(9)
    # Data
    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(9)
    return table

def add_bullet(doc, text, bold_prefix=None):
    p = doc.add_paragraph(style='List Bullet')
    if bold_prefix:
        run = p.add_run(bold_prefix)
        run.bold = True
        p.add_run(text)
    else:
        p.add_run(text)

# ═══════════════════════════════════════════════════════════════
# TITELPAGINA
# ═══════════════════════════════════════════════════════════════
for _ in range(6):
    doc.add_paragraph()

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('PGS 15 KENNISDOSSIER')
run.bold = True
run.font.size = Pt(28)
run.font.color.rgb = RGBColor(0, 51, 102)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('Opslag Gevaarlijke Stoffen')
run.bold = True
run.font.size = Pt(20)
run.font.color.rgb = RGBColor(0, 51, 102)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('Phoenix Metals B.V.')
run.bold = True
run.font.size = Pt(18)
run.font.color.rgb = RGBColor(0, 102, 153)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('PlantOne, Rotterdam Europoort')
run.font.size = Pt(14)

doc.add_paragraph()

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('Versie 4.0 — 19 april 2026')
run.font.size = Pt(12)
run.bold = True

doc.add_paragraph()
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('Gebaseerd op PGS 15:2025, versie 1.0 (januari 2025)')
run.font.size = Pt(10)
run.italic = True

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('Documentclassificatie: Vertrouwelijk — Intern gebruik')
run.font.size = Pt(10)
run.font.color.rgb = RGBColor(192, 0, 0)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════
# DOCUMENTBEHEER
# ═══════════════════════════════════════════════════════════════
doc.add_heading('Documentbeheer', level=1)

add_table(doc,
    ['Parameter', 'Waarde'],
    [
        ['Documenttitel', 'PGS 15 Kennisdossier Opslag Gevaarlijke Stoffen — Phoenix Metals'],
        ['Documentcode', 'D1'],
        ['Versie', '4.0'],
        ['Datum', '19 april 2026'],
        ['Auteur', 'J. van Gemert (HSEQ Consultant)'],
        ['Bedrijfsnaam', 'Phoenix Metals B.V.'],
        ['Locatie', 'PlantOne, Rotterdam Europoort'],
        ['Status', 'Definitief'],
        ['Classificatie', 'Vertrouwelijk — Intern'],
    ]
)

doc.add_paragraph()
doc.add_heading('Versiehistorie', level=2)
add_table(doc,
    ['Versie', 'Datum', 'Wijziging', 'Auteur'],
    [
        ['1.0', '12-04-2026', 'Initiële opzet Kennisdossier', 'JvG'],
        ['2.0', '14-04-2026', 'Uitbreiding H2-H4, PGS 15:2025 verfijning', 'JvG'],
        ['3.0', '16-04-2026', 'Herziening t.b.v. auditgereedheid', 'JvG'],
        ['4.0', '19-04-2026', 'Volledige herschrijving op basis van brondocumentanalyse', 'JvG'],
    ]
)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════
# MANAGEMENTSAMENVATTING
# ═══════════════════════════════════════════════════════════════
doc.add_heading('Managementsamenvatting', level=1)

doc.add_paragraph(
    'Dit kennisdossier beschrijft de toepassing van PGS 15:2025 (versie 1.0, januari 2025) op de opslag '
    'van gevaarlijke stoffen bij Phoenix Metals B.V., gevestigd op de PlantOne-locatie in Rotterdam Europoort. '
    'Phoenix Metals ontwikkelt een hydrometallurgisch proces voor de extractie van vanadium uit SARU-ash '
    '(reststroom uit ruwe-olieraffinage). Het bedrijf bevindt zich in de demo-fase met een maximale '
    'as-verwerking van 60 kg in een campagne van maximaal drie maanden.'
)

doc.add_paragraph(
    'De opgeslagen stoffen bestaan uit feedstock-chemicaliën (NaOH 50%, H₂SO₄ in diverse concentraties, '
    'aluminiumsulfaat, calciumoxide), SARU-ash (invoermateriaal met vanadium-, nikkel- en uraanverbindingen), '
    'het eindproduct vanadium-elektrolyt en diverse reststromen. De totale opgeslagen hoeveelheid in de '
    'demo-fase blijft ruim onder de 2.500 kg-grens per ADR-klasse.'
)

doc.add_heading('Kernbevindingen', level=2)

items = [
    ('Veiligheidsniveau: ', 'Basisveiligheidsniveau volstaat voor alle opgeslagen stoffen. '
     'H₂SO₄ en NaOH zijn ADR-klasse 8, VG II, onbrandbaar. Vanadiumoplossingen vallen onder '
     'ADR-klasse 9. Bij dedicated opslag van onbrandbare stoffen is geen aanvullend veiligheidsniveau vereist.'),
    ('Scheidingseis: ', 'H₂SO₄ (zuur) en NaOH (base) vormen een onverenigbare combinatie en moeten '
     'in afzonderlijke vakken of opslagvoorzieningen worden opgeslagen (PGS 15:2025, Bijlage E).'),
    ('Wbdbo: ', 'Geen Wbdbo-eis bij dedicated opslag van onbrandbare ADR-8 VG II/III stoffen.'),
    ('Opvangcapaciteit: ', '110% van de grootste verpakking of 10% van de totale inhoud, waarbij '
     'de hoogste waarde geldt.'),
    ('BRZO 2020: ', 'Niet van toepassing op de demo-fase. De opgeslagen hoeveelheden liggen ver '
     'onder de drempelwaarden uit Bijlage I van het BRZO 2020.'),
    ('Straling: ', 'SARU-ash bevat van nature voorkomende radionucliden (U-238-reeks). Bij <1.000 kg '
     'bewerking is het proces intrinsiek veilig (Besluit basisveiligheidsnormen stralingsbescherming, art. 3.17).'),
]
for bp, txt in items:
    add_bullet(doc, txt, bp)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════
# H1: PGS 15:2025 BASIS
# ═══════════════════════════════════════════════════════════════
doc.add_heading('1. PGS 15:2025 — Basis', level=1)

doc.add_heading('1.1 Wat is PGS 15', level=2)
doc.add_paragraph(
    'PGS 15 is de Publicatiereeks Gevaarlijke Stoffen-richtlijn voor de opslag van verpakte gevaarlijke '
    'stoffen. De richtlijn is op 1 januari 2025 volledig herzien (PGS 15:2025, versie 1.0) en vervangt '
    'de eerdere versie uit 2005. PGS 15 geeft voorschriften voor de inrichting, exploitatie en '
    'beheer van opslagvoorzieningen voor gevaarlijke stoffen in verpakking (vaten, IBC\'s, jerrycans, '
    'gasflessen en dergelijke).'
)

doc.add_paragraph(
    'De herziene PGS 15:2025 introduceert een nieuw classificatiesysteem met vier veiligheidsniveaus '
    '(basis, A, B, C), gebaseerd op stofeigenschappen en opgeslagen hoeveelheden. Daarnaast zijn de '
    'maatregelen herziet en waar mogelijk geharmoniseerd met het Bouwbesluit (Bbl) en de Omgevingswet.'
)

doc.add_heading('1.2 Waarom relevant voor Phoenix Metals', level=2)
doc.add_paragraph(
    'Phoenix Metals slaat gevaarlijke stoffen op (NaOH, H₂SO₄, vanadiumverbindingen) die vallen '
    'binnen het toepassingsgebied van PGS 15. Het Besluit activiteiten leefomgeving (Bal) verbindt '
    'PGS 15 als standaard aan vergunningsvoorwaarden voor opslag van gevaarlijke stoffen. '
    'Naleving van PGS 15 is daarom een wettelijke vereiste voor de vergunning van Phoenix Metals.'
)

doc.add_heading('1.3 Overgangsregeling', level=2)
doc.add_paragraph(
    'PGS 15:2025 kent een overgangsregeling voor bestaande opslagvoorzieningen die onder de oude '
    'PGS 15 (2005) waren ingericht. Voor Phoenix Metals, als nieuwe inrichting, geldt PGS 15:2025 '
    'onverkort vanaf de ingebruikname. Er is geen sprake van een overgangssituatie.'
)

doc.add_heading('1.4 Relatie met andere regelgeving', level=2)

add_table(doc,
    ['Regelgeving', 'Relatie met PGS 15'],
    [
        ['Omgevingswet / Bal', 'PGS 15 is aangewezen als standaardgood practice (art. 4.1012 Bal). '
         'Vergunningverleners toetsen op PGS 15.'],
        ['BRZO 2020', 'PGS 15-maatregelen zijn onderdeel van het veiligheidsbeheerssysteem bij '
         'BRZO-bedrijven. Voor Phoenix Metals demo-fase: BRZO niet van toepassing.'],
        ['Arbeidsomstandighedenwet', 'PGS 15 voorziet in arbeidsveiligheidsmaatregelen (PBM\'s, '
         'ventilatie, instructie). Aanvullend: Arbobesluit hoofdstuk 4 (gevaarlijke stoffen).'],
        ['Wet milieubeheer / Wm', 'Opvang van lekkage en bluswater voorkomt bodem- en '
         'waterverontreiniging. Verankerd in PGS 15 M29-M32.'],
        ['CLP-verordening (EG 1272/2008)', 'Indeling en etikettering van stoffen. PGS 15 gebruikt '
         'CLP-classificatie als input voor veiligheidsniveau-bepaling.'],
        ['REACH (EG 1907/2006)', 'Verplichting tot beschikbaarheid van veiligheidsinformatiebladen '
         '(VIB/SDS). PGS 15 eist actuele VIB\'s (M137).'],
        ['Besluit basisveiligheidsnormen stralingsbescherming', 'Relevant voor SARU-ash met '
         'van nature voorkomende radionucliden. Apart van PGS 15.'],
    ]
)

doc.add_heading('1.5 Toepasselijkheid op Phoenix Metals', level=2)
doc.add_paragraph(
    'PGS 15:2025 is van toepassing op Phoenix Metals omdat:'
)
items = [
    'Het bedrijf meer dan de ondergrens aan gevaarlijke stoffen opslaat (ADR-klasse 8, ondergrens 250 kg).',
    'De stoffen zijn ingedeeld als ADR-klasse 8 (bijtend) en ADR-klasse 9 (milieugevaarlijk).',
    'Opslag vindt plaats in een opslagvoorziening (rack lab) binnen een bedrijfsterrein.',
]
for item in items:
    add_bullet(doc, item)

doc.add_paragraph(
    'De totale opgeslagen hoeveelheid in de demo-fase bedraagt circa 300 L vloeistof en 60 kg ash. '
    'Hiermee blijft Phoenix Metals ruim onder de grenswaarden die leiden tot hogere '
    'veiligheidsniveaus. Het basisveiligheidsniveau volstaat.'
)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════
# H2: OPSLAGSTOFFEN INVENTARISATIE
# ═══════════════════════════════════════════════════════════════
doc.add_heading('2. Opslagstoffen Inventarisatie', level=1)

doc.add_heading('2.1 Feedstock-chemicaliën', level=2)

add_table(doc,
    ['#', 'Stof', 'CAS-nr.', 'ADR-klasse', 'UN-nr.', 'VG', 'Hoeveelheid', 'Verpakking', 'Locatie'],
    [
        ['1', 'NaOH 50% oplossing', '1310-73-2', '8', '1824', 'II', '4×25L = 100L', 'Jerrycan', 'Rack lab'],
        ['2', 'H₂SO₄ 75%', '7664-93-9', '8', '1830', 'II', '3×10L = 30L', 'Jerrycan', 'Rack lab'],
        ['3', 'H₂SO₄ 50%', '7664-93-9', '8', '1830', 'II', '7×10L = 70L', 'Jerrycan', 'Rack lab'],
        ['4', 'H₂SO₄ 25%', '7664-93-9', '8', '1830', 'II', '4×25L = 100L', 'Jerrycan', 'Rack lab'],
        ['5', 'Aluminiumsulfaat', '7784-31-8', 'N/A', '—', '—', '2×2,5kg = 5kg', 'Canister', 'Rack lab'],
        ['6', 'Calciumoxide', '1305-78-8', 'N/A', '—', '—', '2×5kg = 10kg', 'Canister', 'Rack lab'],
    ]
)

doc.add_heading('2.2 SARU-ash (invoermateriaal)', level=2)
doc.add_paragraph(
    'SARU-ash (Soot Ash Removal Unit reststroom) is het invoermateriaal voor het vanadiumextractieproces. '
    'Het betreft een mengsel uit ruwe-olieraffinage met de volgende samenstelling:'
)

add_table(doc,
    ['Component', 'Beschrijving', 'Relevantie'],
    [
        ['Natriummetavanadaat (NaVO₃)', 'Hoofdbestanddeel, vanadiumbron', 'ADR-klasse 9 (UN 3082)'],
        ['Trinatriumorthovanadaat', 'Secundair vanadiumbestanddeel', 'ADR-klasse 9'],
        ['Nikkeloxide (NiO)', 'Zware metaalverontreiniging', 'CMR-cat. 2 (verdenking kankerverwekkend)'],
        ['U-238-reeks radionucliden', 'Van nature voorkomend (NORM)', 'Besluit stralingsbescherming'],
        ['Pb-210', 'Hoogste specifieke activiteit (2,42 Bq/g)', 'Vrijstellingswaarde: 10 Bq/g'],
    ]
)

doc.add_paragraph()
p = doc.add_paragraph()
run = p.add_run('Demo-fase parameters:')
run.bold = True

items = [
    'Maximale totale ash-verwerking: ≤60 kg',
    'Batchgrootte: 3,5 kg per batch',
    'Campagneduur: ≤3 maanden',
    'Locatie: PlantOne Rotterdam (havengebied)',
]
for item in items:
    add_bullet(doc, item)

doc.add_heading('2.3 Eindproduct: vanadium-elektrolyt', level=2)
doc.add_paragraph(
    'Het eindproduct is een V(III/V⁴⁺) gemengde vanadium-elektrolyt, geschikt voor gebruik in '
    'vanadium-redoxflowbatterijen (VRFB). De elektrolyt bevat vanadiumsulfaat in zwavelzuur oplossing '
    '(typisch 1,6-2,0 M V in 2-3 M H₂SO₄). Classificatie: waarschijnlijk ADR-klasse 9 (UN 3082, '
    'milieugevaarlijk) in combinatie met klasse 8 (bijtend). Exacte classificatie volgt uit SDS van '
    'het eindproduct.'
)

doc.add_heading('2.4 Reststromen', level=2)

add_table(doc,
    ['Reststroom', 'Beschrijving', 'Hoeveelheid (demo)', 'Classificatie'],
    [
        ['Filter cake', 'Residu na filtratie (nikkel, onopgelost)', '~1-2 kg/batch', 'Afvalstof — te classificeren'],
        ['Filtraten', 'Vloeibare fracties na filtratiestappen', '~5-10 L/batch', 'ADR 8/9 — te classificeren'],
        ['Spoelwater', 'Demi-water mengsels', '~2-5 L/batch', 'Afvalstof — te classificeren'],
    ]
)

doc.add_heading('2.5 CLP-indeling en GHS-pictogrammen', level=2)

add_table(doc,
    ['Stof', 'CLP H-zinnen (relevant)', 'GHS-pictogrammen'],
    [
        ['NaOH 50%', 'H314 (veroorkaakt ernstige huidletsel en oogletsel)', 'GHS05 (bijtend), GHS07'],
        ['H₂SO₄ 75%', 'H314, H290 (kan bijtend zijn voor metalen)', 'GHS05'],
        ['H₂SO₄ 50%', 'H314, H290', 'GHS05'],
        ['H₂SO₄ 25%', 'H290 (minder bijtend, meer irriterend)', 'GHS05 (mogelijk GHS07)'],
        ['Aluminiumsulfaat', 'H302, H315, H319 (licht irriterend)', 'GHS07'],
        ['Calciumoxide', 'H315, H318, H335 (irriterend, oogletsel)', 'GHS05, GHS07'],
        ['SARU-ash (mengsel)', 'H351 (CMR cat. 2 — NiO), H410 (milieugevaarlijk)', 'GHS08, GHS09'],
        ['Vanadium-elektrolyt', 'H302, H315, H319, H410', 'GHS07, GHS09 (t.b.v.)'],
    ]
)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════
# H3: RISICOKLASSE BEPALING
# ═══════════════════════════════════════════════════════════════
doc.add_heading('3. Risicoklasse Bepaling', level=1)

doc.add_heading('3.1 PGS 15:2025 Classificatiemethode', level=2)
doc.add_paragraph(
    'PGS 15:2025 hanteert een viertraps veiligheidsniveausysteem: basis, A, B en C. '
    'Het vereiste niveau wordt bepaald door: (1) de eigenschappen van de opgeslagen stoffen '
    '(ADR-klasse, verpakkingsgroep, vlampunt, bijkomende gevaren) en (2) de totale opgeslagen '
    'hoeveelheid per stofklasse. De classificatie volgt de tabellen 6 en 7 uit PGS 15:2025 (§4).'
)

doc.add_heading('3.2 Bepaling per stofcategorie', level=2)

doc.add_heading('3.2.1 ADR-klasse 8 — Bijtende stoffen (NaOH, H₂SO₄)', level=3)
doc.add_paragraph(
    'NaOH 50% en H₂SO₄ (25/50/75%) zijn ingedeeld als ADR-klasse 8, verpakkingsgroep II. '
    'Deze stoffen zijn onbrandbaar en niet brandonderhoudend. Volgens PGS 15:2025, Tabel 6, '
    'geldt voor ADR-klasse 8, VG II/III, onbrandbaar:'
)
add_bullet(doc, 'Geen aanvullend veiligheidsniveau vereist')
add_bullet(doc, 'Alleen basisveiligheidsniveau van toepassing')
add_bullet(doc, 'Onafhankelijk van de opgeslagen hoeveelheid (zolang dedicated opslag)')

doc.add_heading('3.2.2 ADR-klasse 9 — Milieugevaarlijke stoffen (vanadiumoplossingen)', level=3)
doc.add_paragraph(
    'Vanadiumoplossingen (UN 3082, classificatiecode M6/M7) vallen onder ADR-klasse 9. '
    'Onbrandbare/niet brandonderhoudende ADR-9 stoffen vereisen eveneens alleen basisveiligheidsniveau.'
)

doc.add_heading('3.2.3 CMR-houdende stoffen (SARU-ash met nikkeloxide)', level=3)
doc.add_paragraph(
    'SARU-ash bevat nikkeloxide (NiO), verdacht van kankerverwekkendheid (CMR-categorie 2). '
    'PGS 15:2025 kent specifieke eisen voor CMR-stoffen. De totale hoeveelheid CMR-houdend materiaal '
    'in de demo-fase bedraagt maximaal 60 kg, wat onder de ondergrens van 25 kg per individuele '
    'CMR-stof uitkomt wanneer rekening gehouden wordt met het percentage NiO in het mengsel '
    '(typisch <10%). Bij mengselbenadering kan de CMR-ondergrens wel van toepassing zijn — '
    'dit vereist nadere beoordeling op basis van de SDS van de ash.'
)

doc.add_heading('3.3 Invloed van hoeveelheden', level=2)

add_table(doc,
    ['Parameter', 'Demo-fase', 'Commercieel (indicatief)'],
    [
        ['Totale H₂SO₄', '~200 L (~330 kg)', 'Potentieel >2.500 kg'],
        ['Totale NaOH', '~100 L (~140 kg)', 'Potentieel >2.500 kg'],
        ['SARU-ash', '≤60 kg', 'Tonnen'],
        ['Grenswaarde veiligheidsniveau A/C', '2.500 kg per ADR-klasse', 'Kan overschreden worden'],
        ['Veiligheidsniveau demo', 'Basis', 'Mogelijk A of C'],
    ]
)

doc.add_heading('3.4 Conclusie risicoklasse', level=2)

p = doc.add_paragraph()
run = p.add_run('Demo-fase: ')
run.bold = True
p.add_run(
    'Alle opgeslagen stoffen vallen onder basisveiligheidsniveau. De totale hoeveelheid per ADR-klasse '
    'blijft ruim onder de 2.500 kg-grens. Dedicated opslag van onbrandbare bijtende stoffen '
    '(ADR-8 VG II/III) vereist geen Wbdbo en geen aanvullende brandmaatregelen.'
)

p = doc.add_paragraph()
run = p.add_run('Commerciële fase: ')
run.bold = True
p.add_run(
    'Bij opschaling naar commercieel productieniveau (>2.500 kg per ADR-klasse) wordt het relevante '
    'veiligheidsniveau van toepassing. Dit vereist een herbeoordeling van het volledige PGS 15-dossier.'
)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════
# H4: OPSLAGEISEN
# ═══════════════════════════════════════════════════════════════
doc.add_heading('4. Opslageisen', level=1)

doc.add_heading('4.1 Eisen per risicoklasse — Basisveiligheidsniveau', level=2)
doc.add_paragraph(
    'Aangezien Phoenix Metals in de demo-fase uitsluitend basisveiligheidsniveau hoeft te realiseren, '
    'zijn hieronder de basismaatregelen samengevat. Bij opschaling gelden aanvullende eisen.'
)

add_table(doc,
    ['Maatregelgebied', 'Vereiste (basis)', 'PGS 15 ref.'],
    [
        ['Brandwerendheid (Wbdbo)', 'Geen eis bij dedicated onbrandbare opslag', 'M21'],
        ['Opvangcapaciteit', '110% grootste verpakking óf 10% totaal (wat meer is)', 'M30'],
        ['Maximum oppervlak', '1.000 m² (<20.000 kg)', 'M15'],
        ['Verdieping', 'Geen beperking voor onbrandbare ADR-8/9', 'M17'],
        ['Constructie', 'Dragende constructie bestand tegen opgeslagen stoffen', 'M24-M27'],
        ['Brandblusmiddelen', 'Min. twee 6 kg poederblussers of equivalent', 'M95'],
        ['Ontstekingsbronnen', 'Rook- en vuurverbod binnen 2 m', 'M68, M134'],
        ['Toegang', 'Alleen bevoegd en deskundig personeel', 'M36'],
        ['Signalering', 'ADR-etiketten (min. 20×20 cm), verbodsborden', 'M135-M136'],
        ['Ventilatie', 'Adequate ventilatie bij dampvorming', 'M35'],
        ['Vrije ruimte', '2 m tot andere activiteiten', 'M21'],
    ]
)

doc.add_heading('4.2 Segregatie — Onverenigbare combinaties', level=2)

p = doc.add_paragraph()
run = p.add_run('KRITIEKE SCHEIDINGSEIS: ')
run.bold = True
run.font.color.rgb = RGBColor(192, 0, 0)
p.add_run(
    'H₂SO₄ (zuur) en NaOH (base) vormen een onverenigbare combinatie binnen ADR-klasse 8. '
    'Bij gelijktijdig vrijkomen ontstaat een sterk exotherme reactie met hitteontwikkeling, '
    'spatten en vrijkomen van bijtende dampen. PGS 15:2025, Bijlage E, schrijft voor dat '
    'zuren en basen gescheiden worden opgeslagen.'
)

add_table(doc,
    ['Combinatie', 'Scheiding vereist?', 'Methode', 'Toelichting'],
    [
        ['H₂SO₄ + NaOH', 'JA — VERPLICHT', 'Vakscheiding of apart vak',
         'Zuur + base = exotherme reactie'],
        ['H₂SO₄ + vanadiumoplossing', 'Nee (beoordeling nodig)',
         'Vakscheiding aanbevolen', 'Controleer SDS op reactieve interacties'],
        ['NaOH + vanadiumoplossing', 'Beoordeling nodig',
         'Vakscheiding aanbevolen', 'NaOH reageert met amfotere metalen'],
        ['H₂SO₄ + brandbare stoffen', 'JA', 'Vakindeling', 'Kan oxideren/reageren'],
        ['NaOH + aluminium', 'JA', 'Vakscheiding', 'NaOH reageert met amfotere metalen'],
        ['Aluminiumsulfaat + calciumoxide', 'Nee', '—', 'Geen onverenigbaarheid'],
    ]
)

doc.add_heading('4.3 Specifieke eisen bijtende stoffen (ADR-klasse 8)', level=2)

items = [
    ('Materialen opvangvoorziening: ', 'Moet bestand zijn tegen de bijtende stof. Geen onbeschermde '
     'metalen opvang bij H₂SO₄. PP-gelined of kunststof opvangbakken aanbevolen.'),
    ('Neutralisatiemiddelen: ', 'Beschikbaar bij opslag. Voor H₂SO₄: natriumcarbonaat (soda). '
     'Voor NaOH: citroenzuur of verdunde azijnzuuroplossing.'),
    ('Condenscorrosie: ', 'Bij buitenopslag rekening houden met condensvorming en corrosie aan '
     'verpakkingen en constructie. Binnenopslag verdient de voorkeur.'),
    ('Inspectie verpakkingen: ', 'Bij ontvangst en periodiek: controle op beschadigingen, corrosie, '
     'lekkage. Gebreken direct verhelpen (M45).'),
]
for bp, txt in items:
    add_bullet(doc, txt, bp)

doc.add_heading('4.4 Specifieke eisen CMR-houdende stoffen (SARU-ash)', level=2)
doc.add_paragraph(
    'SARU-ash bevat nikkeloxide (CMR-categorie 2). Bij opslag van CMR-houdende stoffen gelden '
    'de volgende aanvullende eisen:'
)
items = [
    'Gesloten opslag (stofvrij) — ash mag niet verstuiven',
    'Afzonderlijke opslag van levensmiddelen en consumentenproducten',
    'Registratie van blootstelling (arbeidshygiëne)',
    'Specifieke PBM\'s: FFP3-masker bij hantering, handschoenen, veiligheidsbril',
    'RI&E moet CMR-risico\'s expliciet behandelen',
]
for item in items:
    add_bullet(doc, item)

doc.add_heading('4.5 Opslag in jerrycans (huidige situatie)', level=2)
doc.add_paragraph(
    'In de demo-fase worden alle vloeistoffen opgeslagen in jerrycans (10L en 25L) op een rack in het lab. '
    'Dit is toegestaan onder PGS 15:2025 mits:'
)
items = [
    'De jerrycans ADR-conform zijn (UN-gekeurd)',
    'De opslaglocatie voldoet aan de basismaatregelen (opvang, signalering, toegangsbeperking)',
    'De werkvoorraad-regel wordt nageleefd: max. 1 aangebroken + 1 nieuwe verpakking per stof in de nabijheid van het werk',
    'Zuren en basen fysiek gescheiden zijn op het rack',
]
for item in items:
    add_bullet(doc, item)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════
# H5: BRZO & VERGUNNINGEN
# ═══════════════════════════════════════════════════════════════
doc.add_heading('5. BRZO & Vergunningen', level=1)

doc.add_heading('5.1 BRZO 2020 toepasselijkheid', level=2)
doc.add_paragraph(
    'Het Besluit risico\'s zware ongevallen 2020 (BRZO 2020) is de nationale implementatie van de '
    'Seveso III-richtlijn. Het BRZO is van toepassing op inrichtingen waar bepaalde gevaarlijke '
    'stoffen in hoeveelheden boven de drempelwaarden uit Bijlage I aanwezig zijn.'
)

doc.add_paragraph(
    'Voor Phoenix Metals in de demo-fase geldt:'
)

add_table(doc,
    ['Stof/categorie', 'BRZO Bijlage I drempelwaarde', 'Phoenix Metals demo-fase', 'BRZO van toepassing?'],
    [
        ['Zwavelzuur (H₂SO₄)', '1.000 ton (cat. E1)', '~330 kg', 'Nee'],
        ['Natriumhydroxide (NaOH)', 'Niet in Bijlage I (cat. E1)', '~140 kg', 'Nee'],
        ['Vanadiumverbindingen', 'Niet specifiek in Bijlage I', '<10 kg V', 'Nee'],
        ['Nikkeloxide (NiO)', 'Acuut toxisch / CMR: lagere drempels', '<6 kg (in ash)', 'Nee'],
        ['Totale gevaarlijke stoffen', '50-200 ton (cat. P8/P9)', '<500 kg totaal', 'Nee'],
    ]
)

p = doc.add_paragraph()
run = p.add_run('Conclusie: ')
run.bold = True
p.add_run(
    'BRZO 2020 is niet van toepassing op de demo-fase van Phoenix Metals. Alle hoeveelheden '
    'liggen minimaal een factor 100-1000 onder de laagste drempelwaarden. Bij opschaling naar '
    'commerciële productie moet de BRZO-toepasselijkheid opnieuw beoordeeld worden.'
)

doc.add_heading('5.2 Vergunningsplicht (Wm/Wabo/Omgevingswet)', level=2)
doc.add_paragraph(
    'De opslag van gevaarlijke stoffen door Phoenix Metals valt onder het Besluit activiteiten '
    'leefomgeving (Bal) en vereist een omgevingsvergunning. De vergunningvoorwaarden zullen '
    'PGS 15:2025 als norm hanteren. De vergunningaanvraag wordt (mede) gebaseerd op de '
    'inventarisatie en maatregelen uit dit kennisdossier.'
)

doc.add_heading('5.3 Relatie met PGS 15 in vergunning', level=2)
doc.add_paragraph(
    'In de omgevingsvergunning wordt PGS 15:2025 aangemerkt als standaardgood practice. '
    'Dit betekent dat het bevoegd gezag (gemeente Rotterdam / DCMR) verwacht dat Phoenix Metals '
    'de maatregelen uit PGS 15:2025 implementeert, tenzij gelijkwaardige alternatieven worden '
    'aangetoond (PGS 15:2025, hoofdstuk 8). Dit kennisdossier dient als basisdocument voor de '
    'vergunningsaanvraag.'
)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════
# H6: VEILIGHEIDSMAATREGELEN
# ═══════════════════════════════════════════════════════════════
doc.add_heading('6. Veiligheidsmaatregelen', level=1)

doc.add_heading('6.1 Primaire maatregelen', level=2)

add_table(doc,
    ['Maatregel', 'Specificatie', 'Status'],
    [
        ['Gesloten opslag', 'Alle stoffen in gesloten verpakking; ash in afgesloten containers', '✓'],
        ['Lekbeker/opvang', 'PP-lined opvangbak onder rack; 110% grootste jerrycan = 27,5 L', 'Te realiseren'],
        ['Ventilatie', 'Mechanische ventilatie in lab-ruimte (minimaal 6×/uur bij lekkage)', 'Voorhanden'],
        ['Segregatie zuur/base', 'H₂SO₄ en NaOH in gescheiden vakken op rack', 'Te realiseren'],
        ['Verpakkingcontrole', 'Inspectie bij ontvangst + periodiek (maandelijks)', 'Procedure vereist'],
        ['Signalering', 'ADR-etiket 8 op rack; CLP-pictogrammen; rook-/vuurverbod', 'Te realiseren'],
    ]
)

doc.add_heading('6.2 Secundaire maatregelen', level=2)

add_table(doc,
    ['Maatregel', 'Specificatie', 'Status'],
    [
        ['Brandblusmiddelen', 'Min. twee 6 kg poederblussers in nabijheid opslag', 'Voorhanden (PlantOne)'],
        ['Lekkagedetectie', 'Visuele inspectie; evt. pH-indicator in opvangbak', 'Te beoordelen'],
        ['Calamiteitenplan', 'Als onderdeel van PlantOne-caliteitenplan + eigen invulling', 'In ontwikkeling'],
        ['Nooddouche / oogspoel', 'Bereikbaar binnen 10 seconden van opslaglocatie', 'Voorhanden (PlantOne)'],
        ['Bluswateropvang', 'Basisniveau: opvang in lekbeker voldoende', 'Voldoet'],
    ]
)

doc.add_heading('6.3 Organisatorische maatregelen', level=2)

add_table(doc,
    ['Maatregel', 'Beschrijving', 'Referentie'],
    [
        ['HZS-plan', 'Hulpverlening in samenspraak met veiligheidsregio Rotterdam-Rijnmond',
         'Wet veiligheidsregio\'s art. 25'],
        ['RI&E', 'Risico-inventarisatie incl. gevaarlijke stoffen, CMR, straling', 'Arbowet art. 5'],
        ['Werkplekinstructie', 'Instructiekaarten per stof: gevaren, PBM\'s, lekkageprocedure', 'PGS 15 M120'],
        ['Stoffenregister', 'Actuele lijst opgeslagen stoffen incl. SDS-referenties', 'PGS 15 M116'],
        ['Calamiteiteninstructie', 'Zichtbaar bij opslag: contactgegevens, eerste maatregelen', 'PGS 15 M121'],
        ['Training', 'Periodieke instructie medewerkers (min. jaarlijks)', 'PGS 15 §7.4.3'],
        ['Plattegrond', 'Actuele opslagplattegrond beschikbaar voor brandweer', 'PGS 15 M116'],
    ]
)

doc.add_heading('6.4 PBM\'s bij omgang met opgeslagen stoffen', level=2)

add_table(doc,
    ['Stofgroep', 'Handschoenen', 'Oogbescherming', 'Kleding', 'Adembescherming'],
    [
        ['NaOH 50%', 'PVC/nitril (bijtbestendig)', 'Veiligheidsbril + face shield', 'Zuurbestendig pak/schort',
         'Niet standaard (bij dampen: FFP2)'],
        ['H₂SO₄ (25-75%)', 'PVC/nitril (zuurbestendig)', 'Veiligheidsbril + face shield', 'Zuurbestendig pak/schort',
         'Niet standaard (bij dampen: FFP2)'],
        ['SARU-ash', 'Nitril handschoenen', 'Veiligheidsbril', 'Beschermende kleding',
         'FFP3 (stofvormig, CMR)'],
        ['Vanadium-elektrolyt', 'Nitril/PVC handschoenen', 'Veiligheidsbril', 'Labjas + schort',
         'Bij verneveling: FFP2'],
    ]
)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════
# H7: CONCRETE ACTIELIJST
# ═══════════════════════════════════════════════════════════════
doc.add_heading('7. Concrete Actielijst', level=1)

doc.add_heading('7.1 Demo-fase (huidig)', level=2)

add_table(doc,
    ['#', 'Actie', 'Prioriteit', 'Termijn', 'Verantwoordelijke', 'Status'],
    [
        ['1', 'Opvangbak plaatsen onder chemie-rack (110% grootste verpakking)',
         'Hoog', 'Voor start demo', 'HSE Manager', 'Open'],
        ['2', 'Scheiding zuur/base op rack realiseren (fysieke afscheiding)',
         'Hoog', 'Voor start demo', 'HSE Manager', 'Open'],
        ['3', 'ADR-etiketten (klasse 8 + 9) aanbrengen op opslaglocatie',
         'Hoog', 'Voor start demo', 'HSE Manager', 'Open'],
        ['4', 'Verbodsbord "Roken en open vuur verboden" plaatsen',
         'Hoog', 'Voor start demo', 'HSE Manager', 'Open'],
        ['5', 'Neutralisatiemiddelen (soda + citroenzuur) beschikbaar stellen',
         'Hoog', 'Voor start demo', 'HSE Manager', 'Open'],
        ['6', 'Absorptiemateriaal (universeel + zuurbestendig) beschikbaar stellen',
         'Midden', 'Voor start demo', 'HSE Manager', 'Open'],
        ['7', 'Lekkage-instructie opstellen en zichtbaar ophangen',
         'Hoog', 'Voor start demo', 'HSE Manager', 'Open'],
        ['8', 'Stoffenregister actualiseren incl. SDS-referenties',
         'Midden', 'Voor start demo', 'HSE Manager', 'Open'],
        ['9', 'Calamiteiteninstructie opstellen (incl. contactgegevens)',
         'Hoog', 'Voor start demo', 'HSE Manager', 'Open'],
        ['10', 'PBM-matrix finaliseren en distribueren',
         'Midden', 'Voor start demo', 'HSE Manager', 'Open'],
        ['11', 'RI&E actualiseren met PGS 15-maatregelen',
         'Midden', 'Week 1 demo', 'HSE Manager', 'Open'],
        ['12', 'Oprichting plattegrond opslaglocatie voor brandweer',
         'Laag', 'Week 2 demo', 'HSE Manager', 'Open'],
        ['13', 'Stralingsbeoordeling SARU-ash (SBD Van Driel BV)',
         'Hoog', 'Voor start demo', 'HSE Manager', 'Open'],
        ['14', 'Werkplekinstructiekaarten per stofgroep opstellen',
         'Midden', 'Week 1 demo', 'HSE Manager', 'Open'],
        ['15', 'Brandblusmiddelen controleren (type + locatie)',
         'Midden', 'Voor start demo', 'HSE Manager', 'Open'],
    ]
)

doc.add_heading('7.2 Commerciële fase (toekomstig)', level=2)

add_table(doc,
    ['#', 'Actie', 'Prioriteit', 'Opmerking'],
    [
        ['1', 'PGS 15-risicoklasse herbeoordelen bij >2.500 kg per ADR-klasse',
         'Hoog', 'Kan leiden tot veiligheidsniveau A of C'],
        ['2', 'BRZO-toepasselijkheid herbeoordelen',
         'Hoog', 'Bij opschaling naar tonnenniveau'],
        ['3', 'VBB-installatie ontwerpen (indien veiligheidsniveau A)',
         'Hoog', 'PGS 14 UPD vereist'],
        ['4', 'Wbdbo berekenen en realiseren (indien vereist)',
         'Hoog', 'NEN 6068'],
        ['5', 'Bluswateropvang voorzien (100% bij ADR-9 in veiligheidsniveau A)',
         'Midden', 'Milieugevaarlijke stoffen'],
        ['6', 'Tankopslag conform PGS 15 aanleggen',
         'Midden', 'Nieuwe tanks: zie plant layout'],
        ['7', 'Scenariostudie uitvoeren (PGS 15 §7.7)',
         'Midden', 'Voor grotere hoeveelheden'],
        ['8', 'HZS-overleg met veiligheidsregio actualiseren',
         'Midden', 'Bij wijziging inrichting'],
    ]
)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════
# BRONVERWIJZINGEN
# ═══════════════════════════════════════════════════════════════
doc.add_heading('8. Bronverwijzingen', level=1)

doc.add_heading('8.1 PGS 15:2025', level=2)
refs = [
    'PGS 15:2025, versie 1.0 (januari 2025) — Opslag van verpakte gevaarlijke stoffen. '
    'Publicatiereeks Gevaarlijke Stoffen. URL: publicatiereeksgevaarlijkestoffen.nl',
    'PGS 15:2025, §4 — Opslagclassificaties en veiligheidsniveaus (Tabellen 6, 7)',
    'PGS 15:2025, §5 — Bouwkundige eisen en brandwerendheid (Wbdbo)',
    'PGS 15:2025, Bijlage E — Onverenigbare combinaties',
    'PGS 15:2025, M21, M29, M30, M35, M45, M85, M95, M115-M121, M135-M137 — Specifieke maatregelen',
]
for i, ref in enumerate(refs, 1):
    doc.add_paragraph(f'[{i}] {ref}')

doc.add_heading('8.2 BRZO & Wetgeving', level=2)
refs = [
    'Besluit risico\'s zware ongevallen 2020 (BRZO 2020), Stb. 2015, 373',
    'Besluit activiteiten leefomgeving (Bal), art. 3.27, 4.1012',
    'Besluit bouwwerken leefomgeving (Bbl) — brandcompartimentering',
    'Arbeidsomstandighedenwet, art. 5 (RI&E)',
    'Arbobesluit, hoofdstuk 4 — Gevaarlijke stoffen',
    'Besluit basisveiligheidsnormen stralingsbescherming, art. 2.2, 3.17, 3.20',
    'CLP-verordening (EG) 1272/2008',
    'REACH (EG) 1907/2006',
]
for i, ref in enumerate(refs, 1):
    doc.add_paragraph(f'[{i}] {ref}')

doc.add_heading('8.3 Normen', level=2)
refs = [
    'NEN 6068 — Bepaling weerstand tegen branddoorslag en brandoverslag',
    'NEN 6069 — Brandwerendheid van constructies',
    'NEN 6063 — Bepaling brandgedrag van dakconstructies',
    'NEN 2535 — Branddetectieinstallaties',
    'NEN-EN 14470-1/2 — Brandveiligheidsopslagkasten',
    'NEN-EN-ISO 20560 — Signalering leidingen en tanks',
    'NEN-EN-ISO 7010 — Veiligheidskleuren en veiligheidstekens',
]
for i, ref in enumerate(refs, 1):
    doc.add_paragraph(f'[{i}] {ref}')

doc.add_heading('8.4 Phoenix Metals brondocumenten', level=2)
refs = [
    'Registration Chemicals — MASTER v2.1.0 (29 november 2024)',
    'Fact sheet Ash v1.0 (LM van Langen, november 2024)',
    'Demo Process VR — Procesbeschrijving (28 stappen)',
    'Plant Layout — Schaal 1:75 (A1)',
    'PBM Matrix Phoenix Metals Draft 1',
    'Overzicht Relatie BRZO Elementen en VBS',
    'Phoenix Metals Bedrijfsomschrijving (HSE Manager sollicitatie)',
]
for i, ref in enumerate(refs, 1):
    doc.add_paragraph(f'[{i}] {ref}')

# ── Kolofon ──
doc.add_page_break()
doc.add_heading('Kolofon', level=1)

doc.add_paragraph(
    'Dit document is samengesteld door J. van Gemert, HSEQ Consultant, in opdracht van '
    'Phoenix Metals B.V. Alle informatie is gebaseerd op openbaar toegankelijke brondocumenten, '
    'PGS 15:2025 en bedrijfsdocumentatie van Phoenix Metals.'
)

doc.add_paragraph(
    '© 2026 Phoenix Metals B.V. — Alle rechten voorbehouden. '
    'Dit document is vertrouwelijk en uitsluitend bestemd voor intern gebruik.'
)

# ── Opslaan ──
output_dir = '/root/projects/jg/2026-pgs15-phoenix-metals/deliverables/docx'
os.makedirs(output_dir, exist_ok=True)
output_path = os.path.join(output_dir, 'PGS15_Kennisdossier_Phoenix_Metals_D1_v4.0.docx')
doc.save(output_path)
print(f'✅ Document opgeslagen: {output_path}')
