#!/usr/bin/env python3
"""Generate PGS 15 Veilig Werken HSEQ — Phoenix Metals D2 v4.0"""

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.enum.section import WD_ORIENT
from docx.oxml.ns import qn
import os

doc = Document()

# --- Style setup ---
style = doc.styles['Normal']
font = style.font
font.name = 'Calibri'
font.size = Pt(11)
style.paragraph_format.space_after = Pt(6)

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

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
    })
    shading.append(shd)

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:
            p.alignment = WD_ALIGN_PARAGRAPH.CENTER
            for run in p.runs:
                run.bold = True
                run.font.size = Pt(9)
                run.font.color.rgb = RGBColor(255, 255, 255)
        set_cell_shading(cell, '003366')
    # Data rows
    for r_idx, row in enumerate(rows):
        for c_idx, val in enumerate(row):
            cell = table.rows[r_idx + 1].cells[c_idx]
            cell.text = str(val)
            for p in cell.paragraphs:
                for run in p.runs:
                    run.font.size = Pt(9)
    return table

def add_bold_para(doc, text):
    p = doc.add_paragraph()
    run = p.add_run(text)
    run.bold = True
    run.font.size = Pt(11)
    return p

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

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

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

doc.add_paragraph()

ver = doc.add_paragraph()
ver.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = ver.add_run('Document D2 — Versie 4.0')
run.font.size = Pt(16)
run.font.color.rgb = RGBColor(80, 80, 80)

doc.add_paragraph()
meta = doc.add_paragraph()
meta.alignment = WD_ALIGN_PARAGRAPH.CENTER
meta.add_run('Datum: 19 april 2026\n').font.size = Pt(12)
meta.add_run('Status: Definitief\n').font.size = Pt(12)
meta.add_run('Classificatie: Vertrouwelijk\n').font.size = Pt(12)
meta.add_run('Verwijzing: PGS 15:2025 versie 1.0\n').font.size = Pt(12)
meta.add_run('Locatie: Plant One Rotterdam B.V.').font.size = Pt(12)

doc.add_page_break()

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

doc.add_paragraph(
    'Dit document definieert het HSEQ-framework voor veilig werken bij opslag en handling van '
    'gevaarlijke stoffen bij Phoenix Metals B.V., gehuisvest bij Plant One Rotterdam B.V. (POR). '
    'Het kader is conform PGS 15:2025 (versie 1.0, januari 2025) en de geldende arbeids- en '
    'milieuwetgeving (Arbowet, Omgevingswet, Besluit basisveiligheidsnormen stralingsbescherming).'
)

doc.add_paragraph(
    'Phoenix Metals hanteert een hydrometallurgisch proces voor de extractie van vanadium uit '
    'SARU-ash (Soot Ash Removal Unit reststroom). De primaire gevaarlijke stoffen zijn zwavelzuur '
    '(H₂SO₄, diverse concentraties), natriumhydroxide (NaOH 50%) en vanadiumhoudende oplossingen. '
    'De SARU-ash bevat van nature voorkomende radionucliden (U-238-reeks, Th-232-reeks) waardoor '
    'naast chemische en fysische risico\'s ook radiologische aspecten worden beheerst.'
)

add_bold_para(doc, 'Kernrichtlijnen:')
bullets = [
    'Alle stoffen vallen onder ADR-klasse 8 (bijtend) en klasse 9 (milieugevaarlijk). Het vereiste veiligheidsniveau is basisniveau bij dedicated opslag van onbrandbare stoffen.',
    'H₂SO₄ en NaOH vormen een onverenigbare combinatie: strikt gescheiden opslag conform PGS 15 Bijlage E.',
    'SARU-ash bevat CMR-stoffen (vanadiumverbindingen) en radionucliden: specifieke PBM\'s en handling-procedures vereist.',
    'Opvangcapaciteit: 110% van grootste verpakking of 10% van totale inhoud (wat groter is).',
    'Alle werkzaamheden vereisen een goedgekeurde TRA (Taak Risico Analyse) en LMRA (Laatste Minuut Risico Analyse).',
    'Radiologische aspecten: <60 kg totaal, 3,5 kg per batch → intrinsiek veilig conform Besluit basisveiligheidsnormen stralingsbescherming art. 3.17.',
]
for b in bullets:
    doc.add_paragraph(b, style='List Bullet')

doc.add_page_break()

# ==================== H1: RISICO-INVENTARISATIE ====================
doc.add_heading('1. Risico-inventarisatie Opslag & Handling', level=1)

doc.add_heading('1.1 Stoffenoverzicht', level=2)
doc.add_paragraph(
    'Onderstaand overzicht bevat alle geregistreerde gevaarlijke stoffen conform het Chemicals Master '
    'Register (v2.1.0, 29 november 2024) met CLP-indeling en MAC-waarden.'
)

add_table(doc,
    ['#', 'Stof', 'CAS', 'ADR/PG', 'Concentratie', 'Hoeveelheid', 'Verpakking', 'Locatie', 'CLP H-zinnen'],
    [
        ['1', 'NaOH oplossing', '1310-73-2', '8 / II', '50%', '4×25L = 100L', 'Jerrycan', 'Rack lab', 'H290, H314'],
        ['2', 'H₂SO₄', '7664-93-9', '8 / II', '75%', '3×10L = 30L', 'Jerrycan', 'Rack lab', 'H290, H314'],
        ['3', 'H₂SO₄', '7664-93-9', '8 / II', '50%', '7×10L = 70L', 'Jerrycan', 'Rack lab', 'H290, H314'],
        ['4', 'H₂SO₄', '7664-93-9', '8 / II', '25%', '4×25L = 100L', 'Jerrycan', 'Rack lab', 'H290, H314'],
        ['5', 'Aluminiumsulfaat', '7784-31-8', 'N/A', '—', '2×2,5kg = 5kg', 'Canister', 'Rack lab', 'N/A'],
        ['6', 'Calciumoxide', '1305-78-8', 'N/A', '—', '2×5kg = 10kg', 'Canister', 'Rack lab', 'H315, H318'],
        ['7', 'SARU-ash (vanadiumhoudend)', '—', '9†', '—', '≤60 kg totaal', 'Big-bag/IBC', 'Procesruimte', 'H351††, H410'],
    ],
)
doc.add_paragraph('† ADR-klasse 9 voor vanadiumoplossingen (UN 3082). SARU-ash als vaste stof: beoordeling per SDS.')
doc.add_paragraph('†† Vanadiumverbindingen (V₂O₅): Carc. 2 (H351 — verdacht van kankerverwekkendheid).')
doc.add_paragraph('Bron: Chemicals Master Register v2.1.0, MSDS Carl Roth, Factsheet SARU Ash v1.0.')

doc.add_heading('1.2 MAC-waarden', level=2)
add_table(doc,
    ['Stof', 'MAC-waarde (TWA 8u)', 'MAC-waarde (STEL 15min)', 'Eenheid', 'Bron'],
    [
        ['H₂SO₄ (nevel)', '0,05', '0,1', 'mg/m³', 'SER-gr 2024'],
        ['NaOH (nevel/aerosol)', '2,0', '—', 'mg/m³', 'SER-gr 2024'],
        ['V₂O₅ (inadembare stof)', '0,05', '0,05', 'mg/m³', 'SER-gr 2024 (CMR)'],
        ['V₂O₅ (nevel)', '0,05', '0,05', 'mg/m³', 'SER-gr 2024 (CMR)'],
    ],
)

doc.add_heading('1.3 Blootstellingsscenario\'s', level=2)
doc.add_paragraph(
    'De volgende scenario\'s zijn geïdentificeerd als potentieel blootstellingsmomenten:'
)
add_table(doc,
    ['Scenario', 'Omschrijving', 'Betrokken stoffen', 'Blootstellingsroute', 'Frequentie'],
    [
        ['S1: Laden/lossen', 'Ontvangst en transfer van jerrycans, IBC\'s en big-bags', 'H₂SO₄, NaOH, ash', 'Dermaal, oculair, inhalatie', 'Per levering'],
        ['S2: Verpompen vloeistoffen', 'Transfer H₂SO₄ en NaOH van opslag naar proces', 'H₂SO₄, NaOH', 'Dermaal, oculair', 'Per batch'],
        ['S3: Bemonstering', 'Monstername uit processtroom en opslag', 'H₂SO₄, NaOH, vanadiumoplossingen', 'Dermaal, oculair, inhalatie', 'Per batch'],
        ['S4: IBC/vat-handling', 'Uitwisseling en positionering IBC\'s en vaten', 'H₂SO₄, NaOH', 'Dermaal, oculair', 'Per levering/batch'],
        ['S5: Ash handling', 'Inladen, doseren en afvoeren SARU-ash', 'SARU-ash (CMR + radionucliden)', 'Inhalatie, dermaal, ingestie, radiologisch', 'Per batch (3,5 kg)'],
        ['S6: Lekkage/spillage', 'Ongepland vrijkomen bij leidingbreuk, verpakkingfalen', 'H₂SO₄, NaOH, vanadiumoplossingen', 'Dermaal, oculair, inhalatie', 'Onvoorspelbaar'],
    ],
)

doc.add_heading('1.4 Risicoklassen per scenario', level=2)
add_table(doc,
    ['Scenario', 'Chemisch risico', 'Fysisch risico', 'Radiologisch risico', 'Overall risicoklasse'],
    [
        ['S1: Laden/lossen', 'Hoog (bijtend)', 'Laag (ergonomie)', 'Gemiddeld (ash)', 'HOOG'],
        ['S2: Verpompen', 'Hoog (bijtend, druk)', 'Gemiddeld (druk)', '—', 'HOOG'],
        ['S3: Bemonstering', 'Gemiddeld (bijtend)', 'Laag', 'Gemiddeld (ash)', 'GEMIDDELD'],
        ['S4: IBC-handling', 'Hoog (bijtend)', 'Gemiddeld (tillen)', '—', 'HOOG'],
        ['S5: Ash handling', 'Hoog (CMR + bijtend)', 'Gemiddeld (stof)', 'Gemiddeld (NORM)', 'HOOG'],
        ['S6: Lekkage', 'Zeer hoog (bijtend, reactief)', 'Gemiddeld (glad)', 'Gemiddeld (ash)', 'ZEER HOOG'],
    ],
)

doc.add_page_break()

# ==================== H2: OPSLAGVEILIGHEID ====================
doc.add_heading('2. Opslagveiligheid volgens PGS 15:2025', level=1)

doc.add_heading('2.1 Veiligheidsniveau', level=2)
doc.add_paragraph(
    'Phoenix Metals slaat uitsluitend onbrandbare, niet brandonderhoudende stoffen op van ADR-klasse 8 '
    '(VG II) en ADR-klasse 9. Conform PGS 15:2025 tabel 6 geldt uitsluitend het basisveiligheidsniveau. '
    'Geen aanvullend veiligheidsniveau (A, B of C) vereist bij dedicated opslag.'
)

doc.add_heading('2.2 Basismaatregelen', level=2)
add_table(doc,
    ['Maatregel', 'PGS 15 ref.', 'Eis', 'Phoenix Metals toepassing'],
    [
        ['Opvangvoorziening (lekbeker)', 'M30', '110% grootste verpakking of 10% totaal', 'Lekbak onder elk rack, bestand tegen H₂SO₄ en NaOH'],
        ['Ventilatie', 'M30, M35', 'Adequate ventilatie bij dampvormende stoffen', 'Mechanische ventilatie in opslagruimte; natuurlijke ventilatie voldoet bij lage dampdruk'],
        ['Constructieve eisen', 'M24–M27', 'Geen Wbdbo-eis bij dedicated onbrandbaar', 'Toepasselijk; wel brandwerende scheiding met aangrenzende ruimtes'],
        ['Verdieping', 'M17', 'Geen beperking voor onbrandbaar ADR-8 VG II/III', 'Vrijgesteld; opslag op begane grond aanbevolen'],
        ['Max. oppervlak', 'M15', '1.000 m² (<20.000 kg) zonder VBB', 'Ruim voldoende voor huidige voorraden'],
        ['Toegangsbeperking', 'M36', 'Alleen bevoegd personeel', 'Afgesloten opslagruimte, toegang via machtiging'],
        ['Ontstekingsbronnen', 'M68, M134', 'Rook- en vuurverbod binnen 2 m', 'Pictogrammen en huisregels afgehangen'],
    ],
)

doc.add_heading('2.3 Specifieke eisen per stofcategorie', level=2)

doc.add_heading('2.3.1 H₂SO₄ (ADR-klasse 8, zuur)', level=3)
bullets = [
    'Opslag gescheiden van NaOH en andere basen (PGS 15 Bijlage E).',
    'Opvangvoorziening bestand tegen zwavelzuur (geen ongecoat staal).',
    'Neutralisatiemiddel beschikbaar: natriumcarbonaat (soda) of kalk.',
    'Nooddouche en oogdoucher binnen 10 seconden loopafstand.',
    'Opslag vorstvrij; geen kristallisatierisico bij H₂SO₄ concentraties >25%.',
]
for b in bullets:
    doc.add_paragraph(b, style='List Bullet')

doc.add_heading('2.3.2 NaOH 50% (ADR-klasse 8, base)', level=3)
bullets = [
    'Opslag gescheiden van H₂SO₄ en andere zuren (PGS 15 Bijlage E).',
    'Temperatuurbeheersing verplicht: >12°C om kristallisatie te voorkomen (vriespunt ~12°C bij 50%).',
    'Aanbevolen opslagtemperatuur: >15°C met temperatuurbewaking en alarm.',
    'Verwarmingstracing op leidingen indien blootgesteld aan lage temperaturen.',
    'Neutralisatiemiddel beschikbaar: citroenzuur of verdund azijnzuur.',
    'Nooddouche en oogdoucher binnen 10 seconden loopafstand.',
]
for b in bullets:
    doc.add_paragraph(b, style='List Bullet')

doc.add_heading('2.3.3 SARU-ash / Vanadium (ADR-klasse 9, CMR)', level=3)
bullets = [
    'Categorie: onbrandbaar, niet brandonderhoudend → basisveiligheidsniveau.',
    'Bevat vanadiumverbindingen (V₂O₅): Carc. 2 (H351) → CMR-stof.',
    'Bevat van nature voorkomende radionucliden: U-238, Ra-226, Pb-210, Ra-228, Th-228.',
    'Bluswateropvang: 100% van nominale capaciteit bij veiligheidsniveau A (milieugevaarlijkheid).',
    'Opslag in afgesloten big-bag/IBC, beschermd tegen stofverspreiding.',
    '≤60 kg totaal, 3,5 kg per batch → intrinsiek veilig (Besluit basisveiligheidsnormen art. 3.17).',
    'Notificatieplicht bij afvoer: U-238-reeks >1 kBq/kg.',
    'Stralingsdeskundige (SBD Van Driel BV) betrokken bij RI&E en afvoer.',
]
for b in bullets:
    doc.add_paragraph(b, style='List Bullet')

doc.add_heading('2.4 Segregatiematrix', level=2)
doc.add_paragraph(
    'Onderstaande matrix toont de segregatievereisten tussen de bij Phoenix Metals aanwezige '
    'stofcategorieën, conform PGS 15:2025 Bijlage E.'
)
add_table(doc,
    ['', 'H₂SO₄ (Klasse 8, zuur)', 'NaOH (Klasse 8, base)', 'Vanadium/ADR 9', 'SARU-ash (CMR)'],
    [
        ['H₂SO₄ (Klasse 8, zuur)', '—', 'GESCHEIDEN ✕', 'Geen scheiding', 'Vakscheiding'],
        ['NaOH (Klasse 8, base)', 'GESCHEIDEN ✕', '—', 'Beoordeling nodig', 'Vakscheiding'],
        ['Vanadium/ADR 9', 'Geen scheiding', 'Beoordeling nodig', '—', 'Geen scheiding'],
        ['SARU-ash (CMR)', 'Vakscheiding', 'Vakscheiding', 'Geen scheiding', '—'],
    ],
)
doc.add_paragraph('✕ Kritieke scheiding: H₂SO₄ en NaOH reageren sterk exotherm. Onafhankelijke vakken of aparte opslagvoorzieningen vereist.')

doc.add_heading('2.5 Opslag per verpakkingtype', level=2)
add_table(doc,
    ['Verpakking', 'Toepassing', 'Specifieke eisen'],
    [
        ['Jerrycan (10–25L)', 'H₂SO₄, NaOH', 'In lekbak, gestapeld max. 2 hoog, etiket zichtbaar'],
        ['IBC (600–1000L)', 'Vloeistoffen bij opschaling', 'Opvang 110% in lekbak, accesibles voor heftruck'],
        ['Big-bag', 'SARU-ash', 'Gesloten, stofdicht, op pallet, beschermd tegen vocht'],
        ['Canister', 'Aluminiumsulfaat, CaO', 'In lekbak, droge opslag'],
    ],
)

doc.add_page_break()

# ==================== H3: HANDLING PROCEDURES ====================
doc.add_heading('3. Handling Procedures', level=1)

doc.add_heading('3.1 Algemene voorwaarden', level=2)
bullets = [
    'Alle handling-werkzaamheden vereisen een goedgekeurde TRA (Taak Risico Analyse).',
    'Werknemers zijn getraind en bekend met gevaren (PGS 15 M85, Arbobesluit hoofdstuk 4).',
    'PBM\'s conform PBM-matrix (Hoofdstuk 4) dragen vóór aanvang werkzaamheden.',
    'Nooddouche en oogdoucher gecontroleerd vóór aanvang.',
    'Procedure PE-240-01: geen stof in gebruik zonder vooraf goedgekeurde HSE-beoordeling.',
    'LMRA (Laatste Minuut Risico Analyse) uitvoeren vóór elke shift/werkzaamheid.',
]
for b in bullets:
    doc.add_paragraph(b, style='List Bullet')

doc.add_heading('3.2 Laden/lossen procedure', level=2)
steps = [
    ('Voorbereiding', 'TRA goedgekeurd, PBM aangetrokken, lekbak gereed, absorptiemateriaal standby, nooddouche getest.'),
    ('Ontvangst controle', 'Verpakking visueel inspecteren op beschadiging, lekkage, etikettering. Afwijzing bij defect.'),
    ('Transfer', 'Jerrycans/IBC\'s met heftruck of handmatig verplaatsen. Max. tillimiet 25 kg per persoon. Bij zwaarder: hulpmiddelen.'),
    ('Plaatsing', 'H₂SO₄ in zuur-vak, NaOH in base-vak. Afstand minimaal 2 m tussen vakken. Etiket naar buiten.'),
    ('Registratie', 'Ontvangst genoteerd in Chemicals Master Register. Batchnummer, datum, hoeveelheid, conditie.'),
    ('Afsluiting', 'Werkruimte schoon, lekbak geplaatst, PBM opgeruimd, aftekenen in logboek.'),
]
for step, desc in steps:
    add_bold_para(doc, f'Stap: {step}')
    doc.add_paragraph(desc)

doc.add_heading('3.3 Verpompen van vloeistoffen', level=2)

doc.add_heading('3.3.1 H₂SO₄ verpomping', level=3)
add_table(doc,
    ['Parameter', 'Specificatie'],
    [
        ['Medium', 'H₂SO₄ 25%, 50% of 75%'],
        ['Verpompingsmethode', 'Chemisch bestendige membraanpomp (PTFE/EPDM afdichting)'],
        ['Leidingmateriaal', 'PTFE-gelegerd, HDPE of PVDF — geen ongecoat staal'],
        ['Snelheid', 'Laag debiet om spatten te minimaliseren'],
        ['Druk', 'Max. 2 bar werkdruk; overdrukbeveiliging op ontvangstvat'],
        ['Aansluitingen', 'Snelkoppelingen met automatisch afsluitend ventiel (dry-break)'],
        ['PBM minimum', 'Zuurbestendige handschoenen (nitril, EN 374), veiligheidsbril, face shield, zuurbestendig schort/voorschoot, laarzen'],
    ],
)

doc.add_heading('3.3.2 NaOH verpomping', level=3)
add_table(doc,
    ['Parameter', 'Specificatie'],
    [
        ['Medium', 'NaOH 50% oplossing'],
        ['Verpompingsmethode', 'Chemisch bestendige membraanpomp (EPDM/Kalrez afdichting)'],
        ['Leidingmateriaal', 'HDPE, PP of PVDF — NaOH-compatibel'],
        ['Temperatuur', 'Leiding >12°C (verwarmingstracing indien buitenopstelling)'],
        ['Snelheid', 'Laag debiet; exotherme reactie bij menging altijd voorkomen'],
        ['Aansluitingen', 'Dry-break snelkoppelingen'],
        ['PBM minimum', 'Bijtwering handschoenen (neopreen/nitril, EN 374), veiligheidsbril, face shield, beschermkleding, laarzen'],
    ],
)

doc.add_heading('3.4 Ash handling (CMR + radionucliden)', level=2)
doc.add_paragraph(
    'SARU-ash bevat vanadiumverbindingen (Carc. 2, H351) en van nature voorkomende radionucliden '
    '(NORM). Speciale voorzorgsmaatregelen vereist.'
)

add_bold_para(doc, 'Dosering:')
bullets = [
    'Max. 3,5 kg per batch; totaal ≤60 kg over campagne (≤3 maanden).',
    'Stofvrije dosering: gesloten transportsysteem (schroeftransport of vacuümsysteem) met HEPA-filtratie.',
    'Indien handmatig doseren: FFP3-masker (EN 149), afgesloten beschermkleding (type 5/6), nitril handschoenen.',
    'Werken in afzuigkap of met lokale afzuiging bij opening big-bag.',
    'Geen eten, drinken of roken in de ash-handling zone.',
]
for b in bullets:
    doc.add_paragraph(b, style='List Bullet')

add_bold_para(doc, 'Radiologische beheersing:')
bullets = [
    'Activiteitsniveaus: U-238 (0,07 Bq/g), Ra-226 (0,32), Pb-210 (2,42), Ra-228 (0,27), Th-228 (0,18).',
    'Alle waarden onder vrijstellingsgrenzen (Besluit basisveiligheidsnormen art. 3.17).',
    'Persoonlijke dosismeting niet vereist bij <1 mSv/jaar (categorie A/B werkers niet van toepassing).',
    'Stralingsdeskundige (SBD Van Driel BV) betrokken bij RI&E, notificatie en afvoer.',
    'Afvoer ash-residu: notificatieplicht indien U-238-reeks >1 kBq/kg.',
]
for b in bullets:
    doc.add_paragraph(b, style='List Bullet')

doc.add_heading('3.5 Bemonstering', level=2)
steps = [
    'TRA goedgekeurd voor bemonstering van specifieke stof/stroom.',
    'PBM aangetrokken conform PBM-matrix (minimaal handschoenen, bril, face shield).',
    'Monsterfles geschikt voor betreffende stof (HDPE voor zuren/basen, glas met PTFE-dop voor analyses).',
    'Bemonstering via voorziende afnamepunt (niet via open vat/IBC).',
    'Monsterfles onmiddellijk sluiten en etiketteren (stof, datum, batch, concentratie).',
    'Naspoelen/opschonen afnamepunt; gemorst materiaal onmiddellijk opruimen.',
    'Monster logboek bijwerken.',
]
for s in steps:
    doc.add_paragraph(s, style='List Bullet')

doc.add_heading('3.6 IBC/vat uitwisseling', level=2)
steps = [
    'Leeg IBC/vat afsluiten met dop/deksel vóór transport.',
    'Visuele controle lekbak onder IBC: vrij van restanten, intact.',
    'Heftruck met IBC-grijper of vorkverlenger gebruiken. Geen tilwerk boven 25 kg.',
    'Nieuw IBC/vat plaatsen in lekbak, aansluiten op leidingsysteem (dry-break).',
    'Druktest uitvoeren op aansluitingen vóór vulling/verpomping.',
    'Oud IBC/vat afvoeren conform afvalprotocol (ADR-voorschriften voor lege verpakkingen).',
]
for s in steps:
    doc.add_paragraph(s, style='List Bullet')

doc.add_page_break()

# ==================== H4: PBM-MATRIX ====================
doc.add_heading('4. PBM-Matrix', level=1)

doc.add_heading('4.1 Volledige PBM-matrix per werkzaamheid', level=2)
add_table(doc,
    ['Werkzaamheid', 'Handschoenen', 'Oogbescherming', 'Adembescherming', 'Beschermkleding', 'Laarzen', 'Overig'],
    [
        ['Laden/lossen H₂SO₄', 'Nitril EN374 (zuurbest.)', 'Veiligheidsbril + face shield', 'Niet vereist (lage dampdruk)', 'Zuurbestendig schort', 'Zuurbestendig', '—'],
        ['Laden/lossen NaOH', 'Neopreen EN374 (bijtwering)', 'Veiligheidsbril + face shield', 'Niet vereist (lage dampdruk)', 'Beschermend schort', 'Chemiebestendig', '—'],
        ['Verpompen H₂SO₄', 'Nitril EN374', 'Veiligheidsbril + face shield', 'Niet vereist', 'Zuurbestendig pak (type 3/4)', 'Zuurbestendig', 'Nooddouche bereikbaar'],
        ['Verpompen NaOH', 'Neopreen EN374', 'Veiligheidsbril + face shield', 'Niet vereist', 'Beschermend pak (type 3/4)', 'Chemiebestendig', 'Nooddouche bereikbaar'],
        ['Bemonstering', 'Nitril EN374', 'Veiligheidsbril', 'FFP2 bij verneveling', 'Schort/labcoat', 'Veiligheidslaars', 'Monsterfles HDPE'],
        ['Ash handling', 'Nitril EN374 (dubbel)', 'Veiligheidsbril + face shield', 'FFP3 (EN 149)', 'Type 5/6 overall (dispos.)', 'Veiligheidslaars', 'Haarnet, overschoenen'],
        ['Lekkage H₂SO₄', 'Nitril EN374 (zuurbest.)', 'Face shield', 'Halfmasker ABEK', 'Zuurbestendig pak type 3', 'Zuurbestendig', 'Absorptiemateriaal'],
        ['Lekkage NaOH', 'Neopreen EN374', 'Face shield', 'Halfmasker ABEK', 'Beschermend pak type 3', 'Chemiebestendig', 'Neutralisatiemiddel'],
        ['Lekkage ash', 'Nitril EN374 (dubbel)', 'Face shield', 'FFP3 + halfmasker', 'Type 5/6 overall', 'Veiligheidslaars', 'HEPA-stofzuiger'],
        ['Brandbestrijding', 'Hittebestendig', 'Vlamwerend face shield', 'SCBA/Zelfredder', 'Brandweeroverall', 'Brandweerlaars', 'Blusmiddelen'],
    ],
)

doc.add_heading('4.2 Minimaal vereiste PBM\'s (algemeen)', level=2)
add_table(doc,
    ['PBM-categorie', 'Minimaal vereiste', 'Norm', 'Vervangingsfrequentie'],
    [
        ['Handschoenen', 'Nitril EN374 (zuur + base bestendig)', 'NEN-EN ISO 374', 'Direct bij beschadiging; max. 6 maanden'],
        ['Oogbescherming', 'Veiligheidsbril (spatdicht)', 'NEN-EN 166', 'Bij krassen/beschadiging'],
        ['Face shield', 'Gelaatsscherm voor chemicaliën', 'NEN-EN 166', 'Bij krassen/beschadiging'],
        ['Adembescherming', 'FFP3 (CMR-stoffen)', 'NEN-EN 149', 'Eenmalig gebruik; bij verzadiging'],
        ['Beschermkleding', 'Chemisch beschermend type 3/4 of 5/6', 'NEN-EN 14605 / 13034', 'Na gebruik of bij contaminatie'],
        ['Veiligheidslaarzen', 'Zuur-/basebestendig, stalen neus', 'NEN-EN ISO 20345', 'Bij slijtage/beschadiging'],
    ],
)

doc.add_heading('4.3 Specifieke PBM\'s voor CMR-stoffen', level=2)
doc.add_paragraph(
    'Voor werkzaamheden met vanadiumverbindingen (V₂O₅, SARU-ash) gelden aanvullende eisen '
    'op grond van de CMR-classificatie (Carc. 2, H351) en de aanwezigheid van radionucliden:'
)
bullets = [
    'Adembescherming: altijd FFP3 (EN 149) bij mogelijke blootstelling aan stof/nevel. Geen FFP1 of FFP2.',
    'Dubbele handschoenen: binnenhandschoen nitril, buitenhandschoen neopreen.',
    'Overall: wegwerp type 5/6 (bescherming tegen vaste deeltjes). Na gebruik als potentieel besmet afval afvoeren.',
    'Overschoenen: wegwerp, om verspreiding van contaminatie te voorkomen.',
    'Haarnet/kap: bij ash handling ter voorkoming van contaminatie hoofd/haren.',
    'Geen hergebruik van beschermkleding na ash handling: disposabel of wasprotocol via goedgekeurde leverancier.',
]
for b in bullets:
    doc.add_paragraph(b, style='List Bullet')

doc.add_heading('4.4 PBM-onderhoud en inspectie', level=2)
add_table(doc,
    ['PBM', 'Inspectie', 'Frequentie', 'Verantwoordelijke'],
    [
        ['Handschoenen', 'Visueel op scheuren, porositeit, verharding', 'Voor elk gebruik', 'Gebruiker'],
        ['Veiligheidsbril', 'Krassen, bandjes, pasvorm', 'Wekelijks + voor gebruik', 'Gebruiker'],
        ['Face shield', 'Krassen, bevestiging', 'Voor elk gebruik', 'Gebruiker'],
        ['FFP3 maskers', 'Geldigheidsdatum, beschadiging verpakking', 'Voor elk gebruik', 'Gebruiker'],
        ['Beschermkleding', 'Naden, sluitingen, chemische degradatie', 'Voor elk gebruik', 'Gebruiker'],
        ['Laarzen', 'Zool, stalen neus, chemische aantasting', 'Maandelijks', 'HSE-coördinator'],
        ['SCBA/Zelfredder', 'Drukfles, masker, ventielen', 'Maandelijks + jaarlijks keuring', 'HSE-coördinator'],
    ],
)

doc.add_page_break()

# ==================== H5: NOODPROCEDURES ====================
doc.add_heading('5. Noodprocedures', level=1)

doc.add_heading('5.1 Algemene noodprocedure', level=2)
steps = [
    ('STAP 1: Alarm', 'Constatering → direct alarm slaan. Medewerkers waarschuwen. Noodnummer bellen (intern + 112 bij levensgevaar).'),
    ('STAP 2: Eigen veiligheid', 'PBM aangetrokken? Afstand nemen. Niet zelf helden spelen bij onbeheersbare situatie.'),
    ('STAP 3: Bron afsluiten', 'Indien veilig: pomp stoppen, klep sluiten, verpakking rechtop zetten.'),
    ('STAP 4: Evacuatie', 'Bij onbeheersbare situatie: evacuatie via vluchtroute naar verzamelpunt.'),
    ('STAP 5: Hulpdiensten', 'Inlichten over betrokken stoffen (SDS beschikbaar stellen), hoeveelheden en windrichting.'),
    ('STAP 6: Nazorg', 'Blootgestelde personen naar nooddouche/oogdouche. Eerste hulp toepassen. Medische hulp inschakelen.'),
]
for step, desc in steps:
    add_bold_para(doc, step)
    doc.add_paragraph(desc)

doc.add_heading('5.2 Lekkage vloeistoffen — H₂SO₄', level=2)
add_table(doc,
    ['Fase', 'Actie'],
    [
        ['Direct', 'PBM aan: nitril handschoenen, face shield, zuurbestendige kleding, laarzen'],
        ['Direct', 'Bron isoleren: pomp stoppen, klep sluiten (indien veilig)'],
        ['Direct', 'Gemorste zone afbakenen, toegang verhinderen'],
        ['Opruiming', 'Absorptiemateriaal (zuurbestendig) aanbrengen of neutraliseren met natriumcarbonaat (soda)'],
        ['Opruiming', 'Nooit met water spoelen bij geconcentreerd H₂SO₄ (exotherme reactie!) — eerst neutraliseren'],
        ['Afvoer', 'Geabsorbeerd materiaal in geëtiketteerd afvalvat (ADR-klasse 8)'],
        ['Nazorg', 'Besmette oppervlakken naspoelen met overvloedig water (na neutralisatie)'],
        ['Rapportage', 'Incident melden conform HSE-beleid; root-cause analyse'],
    ],
)

doc.add_heading('5.3 Lekkage vloeistoffen — NaOH', level=2)
add_table(doc,
    ['Fase', 'Actie'],
    [
        ['Direct', 'PBM aan: neopreen handschoenen, face shield, beschermkleding, laarzen'],
        ['Direct', 'Bron isoleren; lekbak controleren'],
        ['Opruiming', 'Neutraliseren met citroenzuur of verdund azijnzuur'],
        ['Opruiming', 'Absorptiemateriaal (basebestendig) aanbrengen'],
        ['Afvoer', 'Geabsorbeerd materiaal in geëtiketteerd afvalvat'],
        ['Nazorg', 'Opruimen en naspoelen met water'],
        ['Rapportage', 'Incident melden; root-cause analyse'],
    ],
)

doc.add_heading('5.4 Lekkage ash (CMR + radiologisch)', level=2)
doc.add_paragraph('⚠️ ASH BEVAT CMR-STOFFEN EN RADIONUCLIDEN — STRENGERE PROCEDURE:')
add_table(doc,
    ['Fase', 'Actie'],
    [
        ['Direct', 'PBM aan: dubbele handschoenen, FFP3 masker, face shield, wegwerp overall type 5/6, overschoenen'],
        ['Direct', 'Stofverspreiding voorkomen: ventilatie uit, deuren sluiten'],
        ['Direct', 'Zone afbakenen; onbevoegden weren'],
        ['Opruiming', 'Stofzuigen met HEPA-stofzuiger (geen bezem! stofverspreiding!)'],
        ['Opruiming', 'Alternatief: vochtig maken met fijne spray (géén grote hoeveelheid water) en veger+schop'],
        ['Afvoer', 'HEPA-zak/afvalzak dubbel verpakken; etiket: "CMR-afval, vanadiumhoudend, NORM"'],
        ['Afvoer', 'Notificatie stralingsdeskundige indien >1 kBq/kg U-238-reeks'],
        ['Contaminatie', 'Persoonlijke besmetting: kleding uit, wassen met water, wisselkleding aan'],
        ['Rapportage', 'Incident melden; stralingsdeskundige informeren; eventueel dosismetrie'],
    ],
)

doc.add_heading('5.5 Brand (PGS 15 brandbestrijding)', level=2)
doc.add_paragraph(
    'H₂SO₄ en NaOH zijn onbrandbaar. Brandscenario is uitsluitend relevant bij externe brand '
    'of aanwezigheid van brandbare verpakkingen/materialen.'
)
bullets = [
    'Brandblusmiddelen: minimaal twee 6 kg poederblussers (ABC) conform PGS 15 M95.',
    'Bij brand in opslagruimte: brandweer alarmeren, evacueren, geen eigen bluspoging bij twijfel.',
    'Bluswateropvang: voorkomen dat bluswater met H₂SO₄/NaOH in riolering terechtkomt (PGS 15 M29, M32).',
    'ADR-klasse 8: bluswateropvang 50% van nominale capaciteit bij veiligheidsniveau A.',
    'Nooit water op geconcentreerd H₂SO₄: spatten door exotherme reactie.',
]
for b in bullets:
    doc.add_paragraph(b, style='List Bullet')

doc.add_heading('5.6 Eerste hulp per blootstellingstype', level=2)
add_table(doc,
    ['Blootstelling', 'Eerste hulp'],
    [
        ['H₂SO₄ — huidcontact', 'Onmiddellijk 15 minuten spoelen met overvloedig water. Besmette kleding verwijderen. Nooddouche. Arts raadplegen.'],
        ['H₂SO₄ — oogcontact', 'Onmiddellijk 15 minuten spoelen met water (oogdouche). Beide ogen open houden. Direct oogarts.'],
        ['H₂SO₄ — inademing', 'Slachtoffer naar frisse lucht. Bij benauwdheid: 112. Mond-op-mond beademing met masker.'],
        ['NaOH — huidcontact', 'Onmiddellijk 15 minuten spoelen met overvloedig water. Besmette kleding verwijderen. Arts raadplegen.'],
        ['NaOH — oogcontact', 'Onmiddellijk 15 minuten spoelen (oogdouche). Direct oogarts. Permanente schade mogelijk.'],
        ['NaOH — inademing', 'Naar frisse lucht. Bij benauwdheid: 112.'],
        ['Ash (V₂O₅) — inademing', 'Naar frisse lucht. Bij klachten: arts raadplegen. Langdurige blootstelling: longarts.'],
        ['Ash — huidcontact', 'Spoelen met water. Kleding wisselen.'],
        ['Ash — ingestie', 'Mond spoelen. Niet laten braken. Arts raadplegen.'],
    ],
)

doc.add_heading('5.7 Evacuatie', level=2)
bullets = [
    'Evacuatieplan conform bedrijfsnoodplan (BNP) Plant One Rotterdam.',
    'Verzamelpunt: [aan te vullen conform BNP POR].',
    'Bij chemische lekkage: loodrecht op windrichting evacueren.',
    'Bij radiologisch incident: zone verlaten, stralingsdeskundige inschakelen, wisselkleding.',
    'Telprocedure:所有人 op verzamelpunt tellen → afdelingshoofd meldt aan crisiscoördinator.',
    'Brandweer inlichten over aanwezige stoffen (SDS-map bij ingang).',
]
for b in bullets:
    doc.add_paragraph(b, style='List Bullet')

doc.add_page_break()

# ==================== H6: TRA & LMRA ====================
doc.add_heading('6. TRA & LMRA', level=1)

doc.add_heading('6.1 Taak Risico Analyse (TRA)', level=2)
doc.add_paragraph(
    'Elke werkzaamheid met gevaarlijke stoffen vereist een goedgekeurde TRA conform procedure '
    'HS-P-0008 (Taak Risico Analyse, Plant One Rotterdam). De TRA wordt uitgevoerd door de '
    'uitvoerende medewerker(s) en goedgekeurd door de HSE-coördinator.'
)

doc.add_heading('6.1.1 TRA-matrix per activiteit', level=3)
add_table(doc,
    ['Activiteit', 'Gevaar', 'Risico (voor maatregelen)', 'Beheersmaatregelen', 'Restrisico'],
    [
        ['Laden/lossen H₂SO₄', 'Bijtende stof, spatten', 'Hoog', 'PBM, lekbak, dry-break, training', 'Laag'],
        ['Laden/lossen NaOH', 'Bijtende stof, spatten', 'Hoog', 'PBM, lekbak, dry-break, training', 'Laag'],
        ['Verpompen H₂SO₄', 'Bijtend, druk, lekkage leiding', 'Hoog', 'Chemisch bestendige pomp, overdrukbeveiliging, PBM', 'Laag'],
        ['Verpompen NaOH', 'Bijtend, kristallisatie, druk', 'Hoog', 'Verwarmingstracing, PBM, drukbewaking', 'Laag'],
        ['Ash dosering', 'CMR (stof), NORM', 'Hoog', 'FFP3, gesloten systeem, HEPA, dubbele handschoenen', 'Laag'],
        ['Bemonstering', 'Bijtend, spatten', 'Gemiddeld', 'PBM, afnamepunt, procedures', 'Laag'],
        ['IBC-uitwisseling', 'Bijtend (restanten), ergonomie', 'Gemiddeld', 'Lekbak, hefmiddelen, PBM', 'Laag'],
        ['Lekkage H₂SO₄', 'Zeer bijtend, exotherm met water', 'Zeer hoog', 'Noodprocedure, neutralisatie, PBM', 'Gemiddeld'],
        ['Lekkage NaOH', 'Bijtend, reactief met zuur', 'Zeer hoog', 'Noodprocedure, neutralisatie, PBM', 'Gemiddeld'],
        ['Lekkage ash', 'CMR, radiologisch, stof', 'Zeer hoog', 'HEPA-stofzuiger, FFP3, overall type 5/6', 'Gemiddeld'],
    ],
)

doc.add_heading('6.2 LMRA-checklist (dagelijks gebruik)', level=2)
doc.add_paragraph(
    'De LMRA (Laatste Minuut Risico Analyse) wordt uitgevoerd vóór aanvang van elke werkzaamheid. '
    'Beantwoord onderstaande vragen. Bij één of meer "Nee": werk NIET starten en HSE-coördinator inschakelen.'
)
add_table(doc,
    ['#', 'Vraag', 'Ja/Nee'],
    [
        ['1', 'Ben ik bekend met de gevaren van de stoffen waarmee ik werk?', '☐'],
        ['2', 'Is de TRA goedgekeurd en beschikbaar?', '☐'],
        ['3', 'Draag ik de juiste PBM\'s conform de PBM-matrix?', '☐'],
        ['4', 'Is de nooddouche getest en bereikbaar (<10 sec loopafstand)?', '☐'],
        ['5', 'Zijn absorptie- en neutralisatiemiddelen beschikbaar?', '☐'],
        ['6', 'Zijn lekbakken leeg en intact?', '☐'],
        ['7', 'Zijn leidingen en aansluitingen visueel geïnspecteerd (geen lekkage, corrosie)?', '☐'],
        ['8', 'Is de werkplek schoon en vrij van obstakels?', '☐'],
        ['9', 'Zijn SDS/VIB\'s bereikbaar bij de werkplek?', '☐'],
        ['10', 'Weet ik waar de vluchtroute en het verzamelpunt zijn?', '☐'],
        ['11', 'Is er een collega aanwezig die kan helpen bij een noodsituatie?', '☐'],
        ['12', 'Is de ventilatie functioneel (indien van toepassing)?', '☐'],
    ],
)

doc.add_heading('6.3 Hulplijst TRA', level=2)
doc.add_paragraph(
    'De hulplijst conform HS-F-0003 bevat de risicoclassificatie die wordt toegepast bij elke TRA:'
)
add_table(doc,
    ['Waarschijnlijkheid', 'Score', 'Toelichting'],
    [
        ['Zeer onwaarschijnlijk', '1', 'Nooit voorgekomen in de sector'],
        ['Onwaarschijnlijk', '2', 'Zelden voorgekomen in de sector'],
        ['Mogelijk', '3', 'Komt voor in de sector'],
        ['Waarschijnlijk', '4', 'Komt regelmatig voor'],
        ['Zeer waarschijnlijk', '5', 'Verwacht dat het zal gebeuren'],
    ],
)
doc.add_paragraph()
add_table(doc,
    ['Effect', 'Score', 'Toelichting'],
    [
        ['Te verwaarlozen', '1', 'Geen letsel, geen schade'],
        ['Gering', '2', 'Eerste hulp, kleine schade'],
        ['Gemiddeld', '3', 'Medische behandeling, significante schade'],
        ['Ernstig', '4', 'Ziekenhuisopname, grote schade'],
        ['Catastrofaal', '5', 'Dood of blijvende invaliditeit, catastrofale schade'],
    ],
)
doc.add_paragraph(
    'Risicoscore = Waarschijnlijkheid × Effect. Acceptabel: 1–6. Verdergaande maatregelen: 7–12. '
    'Niet acceptabel: 13–25. Bij score ≥13: werkzaamheid NIET starten zonder additionele beheersmaatregelen en '
    'goedkeuring HSE-coördinator.'
)

doc.add_page_break()

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

refs = [
    'PGS 15:2025 versie 1.0 — Opslag van verpakte gevaarlijke stoffen (januari 2025). Publicatiereeks Gevaarlijke Stoffen.',
    'Besluit bouwwerken leefomgeving (Bbl) — Brandcompartimentering, bereikbaarheid, bluswatervoorziening.',
    'Besluit kwaliteit leefomgeving (Bkl) — Externe veiligheidsafstanden.',
    'Arbeidsomstandighedenwet (Arbowet) — Art. 5 (RI&E), Arbobesluit hoofdstuk 4 (gevaarlijke stoffen).',
    'CLP-verordening (EG) 1272/2008 — Indeling, etikettering en verpakking van stoffen en mengsels.',
    'REACH (EG) 1907/2006 — Veiligheidsinformatiebladen (SDS/VIB).',
    'ADR 2025 — Accord européen relatif au transport international des marchandises Dangereuses par Route.',
    'Besluit basisveiligheidsnormen stralingsbescherming — Art. 2.2, 3.17, 3.20, 4.2, 7.1.',
    'Phoenix Metals — Chemicals Master Register v2.1.0 (29 november 2024).',
    'Phoenix Metals — MSDS Zwavelzuur 25–75% (Carl Roth).',
    'Phoenix Metals — MSDS Natriumhydroxide 50% (Carl Roth).',
    'Phoenix Metals — Factsheet SARU Ash v1.0 (LM van Langen, november 2024).',
    'Phoenix Metals — HSE Policy V1 (Stijn van Zelst, januari 2025).',
    'Phoenix Metals — PBM Beleid PS-201-NL V1.0.',
    'Phoenix Metals — PBM Matrix Draft 1.',
    'Phoenix Metals — Procedure PE-240-01: Aanvraag, beoordeling en goedkeuring gevaarlijke stoffen.',
    'Phoenix Metals — Procedure HS-P-0008: Taak Risico Analyse.',
    'Phoenix Metals — Formulier HS-F-0003: TRA met hulplijst.',
    'Phoenix Metals — RI&E Inventarisatie.',
    'Plant One Rotterdam — Bedrijfsnoodplan (BNP).',
    'NEN 6068, NEN 6069, NEN 2535, NEN 1594 — Brandveiligheidsnormen.',
    'NEN-EN 149, NEN-EN 166, NEN-EN 374, NEN-EN 14605, NEN-EN 13034, NEN-EN ISO 20345 — PBM-normen.',
    'SER-gr 2024 — Grenswaardenlijst MAC-waarden.',
]
for i, ref in enumerate(refs, 1):
    doc.add_paragraph(f'[{i}] {ref}', style='List Number')

doc.add_page_break()

# ==================== BIJLAGE A: SEPARATIE-SCHEMA ====================
doc.add_heading('Bijlage A: Opslagschema Phoenix Metals', level=1)
doc.add_paragraph(
    'Visuele weergave van de voorgestelde opslagindeling conform PGS 15:2025 segregatie-eisen.'
)
doc.add_paragraph()
add_table(doc,
    ['Zone', 'Links', 'Centraal (pad)', 'Rechts'],
    [
        ['Rack 1', 'H₂SO₄ 25% (4×25L)', '—', 'NaOH 50% (4×25L)'],
        ['Rack 2', 'H₂SO₄ 50% (7×10L) + H₂SO₄ 75% (3×10L)', '—', 'Aluminiumsulfaat + CaO'],
        ['Rack 3 (afgeschermd)', 'SARU-ash (≤60 kg, big-bag)', '—', 'Vanadiumoplossingen (indien van toepassing)'],
    ],
)
doc.add_paragraph(
    '⚠️ H₂SO₄ (links) en NaOH (rechts) strikt gescheiden. Minimaal 2 m afstand tussen vakken. '
    'Ash-opslag in afgeschermd rack met HEPA-afzuiging.'
)

# --- SAVE ---
out = '/root/projects/jg/2026-pgs15-phoenix-metals/deliverables/docx/PGS15_VeiligWerken_HSEQ_Phoenix_Metals_D2_v4.0.docx'
os.makedirs(os.path.dirname(out), exist_ok=True)
doc.save(out)
print(f'✅ Opgeslagen: {out}')
