#!/usr/bin/env python3
"""Generate PGS 15 D3 Veiligheidsinfo & Documentatie — Phoenix Metals v4.0"""

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

doc = Document()

# ── Styles ──────────────────────────────────────────────────────
style = doc.styles['Normal']
font = style.font
font.name = 'Calibri'
font.size = Pt(11)
font.color.rgb = RGBColor(0x2D, 0x2D, 0x2D)

for level in range(1, 4):
    hs = doc.styles[f'Heading {level}']
    hs.font.color.rgb = RGBColor(0x00, 0x3C, 0x71)  # Phoenix dark blue
    hs.font.name = 'Calibri'

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

# ═══════════════════════════════════════════════════════════════
# TITELPAGINA
# ═══════════════════════════════════════════════════════════════
doc.add_paragraph('\n\n\n')
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run('PGS 15 Veiligheidsinfo & Documentatie')
r.bold = True
r.font.size = Pt(28)
r.font.color.rgb = RGBColor(0x00, 0x3C, 0x71)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run('Phoenix Metals B.V.')
r.bold = True
r.font.size = Pt(20)
r.font.color.rgb = RGBColor(0x00, 0x3C, 0x71)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run('Versie 4.0 — 19 april 2026')
r.font.size = Pt(14)
r.font.color.rgb = RGBColor(0x55, 0x55, 0x55)

doc.add_paragraph()
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run('D3 — Veiligheidsinformatie & Documentatie\nOpslag van Gevaarlijke Stoffen conform PGS 15:2025')
r.font.size = Pt(12)
r.font.color.rgb = RGBColor(0x55, 0x55, 0x55)

doc.add_paragraph('\n\n')
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run('Locatie: Plant One Rotterdam\nClassificatie: Vertrouwelijk — Intern gebruik')
r.font.size = Pt(10)
r.font.color.rgb = RGBColor(0x88, 0x88, 0x88)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run('Document-ID: PM-D3-V4.0 | Status: Definitief')
r.font.size = Pt(10)
r.font.color.rgb = RGBColor(0x88, 0x88, 0x88)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════
# VERSIEBEHEER
# ═══════════════════════════════════════════════════════════════
doc.add_heading('Versiebeheer', level=2)
add_table(doc,
    ['Versie', 'Datum', 'Auteur', 'Wijzigingen'],
    [
        ['1.0', '14-04-2026', 'HSEQ Specialist', 'Initiële opstelling'],
        ['2.0', '15-04-2026', 'HSEQ Specialist', 'Uitbreiding SDS-overzicht en calamiteitenplan'],
        ['3.0', '17-04-2026', 'HSEQ Specialist', 'Herziening conform PGS 15:2025 volledige extractie'],
        ['4.0', '19-04-2026', 'HSEQ Specialist', 'Volledige herschrijving — PGS 15:2025 documentatievereisten, SARU ash, signalering'],
    ])

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

doc.add_paragraph(
    'Dit document (D3) beschrijft de veiligheidsinformatie en documentatievereisten voor de opslag '
    'van gevaarlijke stoffen bij Phoenix Metals B.V., locatie Plant One Rotterdam. Het is opgesteld '
    'conform de eisen van PGS 15:2025 (Publicatiereeks Gevaarlijke Stoffen, versie 1.0, januari 2025) '
    'en dient als leidend kader voor alle documentatie rondom opslag, etikettering, calamiteitenplannen '
    'en documentbeheer.'
)

doc.add_paragraph(
    'Phoenix Metals hanteert de volgende gevaarlijke stoffen in het kader van PGS 15: zwavelzuur '
    '(H₂SO₄, ADR-klasse 8), natriumhydroxide (NaOH, ADR-klasse 8), aluminiumsulfaat, calciumoxide '
    'en SARU ash bevattende vanadiumverbindingen (ADR-klasse 9) met daarnaast CMR- en NORM-eigenschappen. '
    'De totale opslaghoeveelheid valt onder het basisveiligheidsniveau van PGS 15:2025.'
)

doc.add_heading('Kernconclusies', level=3)
bullets = [
    'Alle verplichte documenten conform PGS 15:2025 M116, M120, M121, M137 zijn geïnventariseerd en grotendeels voorhanden.',
    'SDS\'en (Veiligheidsinformatiebladen) zijn beschikbaar voor NaOH 50%, H₂SO₄ 25-75% en vanadiumconcentraat. Een eigen SDS voor SARU ash is in ontwikkeling.',
    'Etikettering en signalering moeten worden uitgebreid met GHS-pictogrammen en NORM-waarschuwingen conform PGS 15:2025 M135-M136.',
    'Het bestaande Bedrijfsnoodplan (BNP) van Phoenix Metals fungeert als calamiteitenplan; aanvulling met stofspecifieke lekkageprocedures is noodzakelijk.',
    'RI&E en TRA\'s zijn deels geïnventariseerd; volledige afronding is vereist voor compliance.',
    'Documentbeheer conform procedure PE-210-04-NL (V14) is operationeel en waarborgt versiebeheer en archivering.',
]
for b in bullets:
    doc.add_paragraph(b, style='List Bullet')

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════
# H1: DOCUMENTATIEVERPLICHTINGEN PGS 15:2025
# ═══════════════════════════════════════════════════════════════
doc.add_heading('1. Documentatieverplichtingen PGS 15:2025', level=1)

doc.add_heading('1.1 Wettelijk kader', level=2)
doc.add_paragraph(
    'PGS 15:2025 stelt expliciete documentatievereisten aan bedrijven die gevaarlijke stoffen opslaan. '
    'Deze vereisten vloeien voort uit de Omgevingswet (Bosbesluit activiteiten leefomgeving — Bal), de '
    'Arbeidsomstandighedenwet (Arbowet), REACH (EG 1907/2006) en de CLP-verordening (EG 1272/2008). '
    'Phoenix Metals valt onder het toepassingsgebied van PGS 15 op basis van de opslag van ADR-klasse 8 '
    'en 9 stoffen boven de ondergrens van 250 kg (PGS 15 Tabel 2).'
)

doc.add_heading('1.2 Verplichte documenten overzicht', level=2)
doc.add_paragraph(
    'De volgende tabel toont alle documenten die PGS 15:2025 verplicht stelt voor opslag van gevaarlijke stoffen, '
    'met verwijzing naar de relevante PGS 15-maatregel en de status bij Phoenix Metals.'
)

add_table(doc,
    ['Document', 'PGS 15 Maatregel', 'Beschrijving', 'Status Phoenix Metals'],
    [
        ['Stoffenlijst', 'M116', 'Actueel overzicht van alle opgeslagen gevaarlijke stoffen met hoeveelheden en locaties', '✅ Beschikbaar (Chemicals Master v2.1.0)'],
        ['Veiligheidsinformatiebladen (SDS)', 'M137', 'SDS conform REACH voor elke opgeslagen stof, actueel en toegankelijk', '✅ Beschikbaar (zie H2)'],
        ['Plattegrond opslaglocatie', 'M116', 'Actuele plattegrond met ligging stoffen, voorzieningen, vluchtroutes', '⚠️ Voorhanden, actualiseren bij lay-outwijzigingen'],
        ['Calamiteiteninstructie', 'M121', 'Zichtbaar bij toegang tot opslagvoorziening; contactgegevens instanties', '✅ Opgenomen in BNP'],
        ['Lekkage-instructie', 'M120', 'Procedure bij lekkage per stof; actueel gehouden', '⚠️ In ontwikkeling (stofspecifiek)'],
        ['Noodplan / Calamiteitenplan', 'M115', 'Intern noodplan voor opslag boven bepaalde hoeveelheden', '✅ BNP V1 beschikbaar'],
        ['RI&E', 'Arbowet art. 5', 'Risico-inventarisatie en -evaluatie', '⚠️ Gedeeltelijk geïnventariseerd'],
        ['TRA\'s', 'PGS 15 M1', 'Taak Risico Analyse per opslag/handling activiteit', '⚠️ Procedure beschikbaar, TRA\'s deels uitgevoerd'],
        ['Vergunningen', 'Bal art. 4.1012', 'Omgevingsvergunning voor opslag gevaarlijke stoffen', '⚠️ In aanvraag'],
        ['Keuringsrapporten', 'M36', 'Documentatie van alle keuringen en inspecties', '✅ Via document control'],
        ['UPD (indien VBB)', 'M99', 'Uitgangspuntendocument voor brandbeheersing', 'Niet van toepassing (geen VBB vereist)'],
    ],
    col_widths=[4, 2.5, 5, 4.5])

doc.add_heading('1.3 Informatievoorziening aan brandweer', level=2)
doc.add_paragraph(
    'PGS 15:2025 M116-M118 vereist dat de stoffenlijst en plattegrond als hardcopy beschikbaar zijn '
    'voor de brandweer. Phoenix Metals deelt deze informatie via het bedrijfsnoodplan van Plant One '
    'Rotterdam (POR), dat als brandweerplichtig bedrijf is aangemerkt. De portiersloge fungeert als '
    'calamiteitenpost waar de stoffenlijst en aanrijdroute voor de brandweer beschikbaar zijn.'
)

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════
# H2: VEILIGHEIDSINFORMATIEBLADEN (SDS/VIB)
# ═══════════════════════════════════════════════════════════════
doc.add_heading('2. Veiligheidsinformatiebladen (SDS/VIB)', level=1)

doc.add_heading('2.1 PGS 15:2025 eisen aan SDS\'en', level=2)
doc.add_paragraph(
    'PGS 15:2025 M137 vereist dat voor alle opgeslagen gevaarlijke stoffen een actueel '
    'Veiligheidsinformatieblad (SDS, Safety Data Sheet) conform REACH-artikel 31 beschikbaar is. '
    'De SDS moet:')
for item in [
    'Binnen 24 uur na aanvraag beschikbaar worden gesteld aan medewerkers',
    'Actueel worden gehouden (minimal elke 3 jaar geëvalueerd of bij nieuwe classificatie)',
    'Toegankelijk zijn op of nabij de opslaglocatie',
    'In de taal van de werknemers beschikbaar zijn (Nederlands en/of Engels)',
]:
    doc.add_paragraph(item, style='List Bullet')

doc.add_heading('2.2 Overzicht beschikbare SDS\'en', level=2)
add_table(doc,
    ['Stof', 'CAS-nummer', 'Leverancier', 'SDS Versie', 'Taal', 'Status'],
    [
        ['H₂SO₄ 25-75%', '7664-93-9', 'Carl Roth', 'Versie 1', 'EN', '✅ Beschikbaar'],
        ['NaOH 50%', '1310-73-2', 'Carl Roth', 'Versie 1', 'EN', '✅ Beschikbaar'],
        ['Vanadiumconcentraat', '—', '—', '—', '—', '⚠️ Foutief bestand — correctie nodig'],
        ['Aluminiumsulfaat', '7784-31-8', 'Carl Roth', '—', '—', '⚠️ Opvragen bij leverancier'],
        ['Calciumoxide', '1305-78-8', 'Carl Roth', '—', '—', '⚠️ Opvragen bij leverancier'],
        ['SARU Ash (eigen SDS)', 'Mengsel', 'Phoenix Metals', 'In ontwikkeling', 'NL/EN', '❌ Nog opstellen'],
    ])

doc.add_heading('2.3 Stofspecifieke SDS-informatie', level=2)

doc.add_heading('2.3.1 Zwavelzuur (H₂SO₄) 25-75%', level=3)
add_table(doc,
    ['Parameter', 'Waarde'],
    [
        ['ADR-klasse', '8 (Bijtend)'],
        ['UN-nummer', 'UN 1830 (>51%) / UN 2796 (≤51%)'],
        ['Verpakkingsgroep', 'II'],
        ['CLP-classificatie', 'Skin Corr. 1A, Eye Damage 1, Met. Corr. 1'],
        ['H-zinnen', 'H290, H314'],
        ['Reacties', 'Exotherm met water, basen, metalen'],
        ['Opslag', 'Vorstvrij, droog, gescheiden van basen en oxiderende stoffen'],
        ['PBM\'s', 'Zuurbestendige handschoenen, veiligheidsbril/face shield, beschermkleding'],
    ])

doc.add_heading('2.3.2 Natriumhydroxide (NaOH) 50%', level=3)
add_table(doc,
    ['Parameter', 'Waarde'],
    [
        ['ADR-klasse', '8 (Bijtend)'],
        ['UN-nummer', 'UN 1824'],
        ['Verpakkingsgroep', 'II'],
        ['CLP-classificatie', 'Skin Corr. 1A, Eye Damage 1, Met. Corr. 1'],
        ['H-zinnen', 'H290, H314'],
        ['Kristallisatierisico', 'Bij <12°C → temperatuurbewaking + verwarmingstracing vereist'],
        ['Reacties', 'Sterk exotherm met zuren'],
        ['Opslag', 'Vorstvrij (>15°C), gescheiden van zuren'],
        ['PBM\'s', 'Nitril/neopreen handschoenen, veiligheidsbril, beschermkleding'],
    ])

doc.add_heading('2.3.3 SARU Ash — Eigen SDS-ontwikkeling', level=3)
doc.add_paragraph(
    'SARU ash (Soot Ash Removal Unit reststroom) is een mengsel van natriummetavanadaat, '
    'trinatriumorthovanadaat en nikkeloxide afkomstig uit ruwe-olieraffinage. De stof bezit een '
    'dubbele bijzonderheid:'
)
for item in [
    'CMR-eigenschappen: Vanadiumverbindingen zijn geclassificeerd als mogelijk kankerverwekkend (CLP Cat. 2). Nikkeloxide is een bekend carcinogeen (Cat. 1B).',
    'NORM-eigenschappen: Bevat van nature voorkomende radionucliden (U-238 reeks, Th-232 reeks) met activiteitsniveaus tot 2,42 Bq/g (Pb-210).',
]:
    doc.add_paragraph(item, style='List Bullet')

doc.add_paragraph(
    'Conform het Besluit basisveiligheidsnormen stralingsbescherming (art. 3.17) geldt bij bewerking '
    'van <1.000 kg een intrinsiek veilige situatie. Phoenix Metals bewerkt maximaal 60 kg ash in '
    'totaal, 3,5 kg per batch. Desalniettemin vereist REACH een eigen SDS voor dit mengsel, inclusief '
    'radiologische karakterisering en CMR-classificatie. Stralingsdeskundige SBD Van Driel BV is '
    'betrokken bij de risicobeoordeling.'
)

doc.add_heading('2.4 Procedure: SDS raadplegen, actualiseren, distribueren', level=2)
doc.add_paragraph('De volgende procedure is van toepassing op het beheer van SDS\'en bij Phoenix Metals:')
steps = [
    'Aanvraag nieuwe stof: HSE-beoordeling via PE-240-01 voordat de stof wordt aangeschaft. De leverancier dient een SDS conform REACH te leveren.',
    'Registratie: SDS wordt geregistreerd in het Chemicals Master Register (v2.1.0) met versienummer en ontvangstdatum.',
    'Toegankelijkheid: SDS\'en zijn fysiek beschikbaar in het lab (rack lab) en digitaal via het documentbeheersysteem.',
    'Actualisatie: Minimaal elke 3 jaar wordt gecontroleerd of de SDS nog actueel is. Bij nieuwe classificatie of nieuwe kennis wordt de SDS onmiddellijk bijgewerkt.',
    'Distributie: Nieuwe of gewijzigde SDS\'en worden direct gecommuniceerd aan alle medewerkers die met de betreffende stof werken.',
    'Eigen SDS: Voor mengsels die Phoenix Metals zelf produceert (zoals SARU ash verwerking) wordt een eigen SDS opgesteld conform REACH Bijlage II.',
]
for i, s in enumerate(steps, 1):
    doc.add_paragraph(f'{i}. {s}')

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════
# H3: OPSLAGLABELING & SIGNALERING
# ═══════════════════════════════════════════════════════════════
doc.add_heading('3. Opslaglabeling & Signalering', level=1)

doc.add_heading('3.1 PGS 15:2025 etiketteringseisen', level=2)
doc.add_paragraph(
    'PGS 15:2025 M135-M136 stelt dat aan de buitenzijde van elke opslagvoorziening de relevante '
    'ADR-symbolen moeten zijn aangebracht met een minimumformaat van 20×20 cm. Daarnaast gelden de '
    'volgende vereisten:'
)
for item in [
    'ADR-etiketten (minimaal 20×20 cm) aan buitenzijde opslagvoorziening, zichtbaar bij toegang',
    'CLP-pictogrammen voor stoffen zonder ADR-equivalent',
    'Verbodsbord "Vuur, open vlam en roken verboden" conform NEN-EN-ISO 7010 en NEN 3011 (M68, M134)',
    'Signalering van leidingen en tanks conform NEN-EN-ISO 20560',
    'Etiketten op individuele verpakkingen conform CLP/ADR-vereisten',
]:
    doc.add_paragraph(item, style='List Bullet')

doc.add_heading('3.2 GHS-pictogrammen per opslaglocatie', level=2)
doc.add_paragraph(
    'De volgende tabel toont de vereiste GHS/ADR-pictogrammen per opslaglocatie bij Phoenix Metals.'
)
add_table(doc,
    ['Locatie', 'Stof(fen)', 'ADR-etiket', 'GHS-pictogrammen', 'Aanvullende signalering'],
    [
        ['Rack Lab — Zuurvak', 'H₂SO₄ 25%, 50%, 75%', 'Klasse 8 (bijtend)', 'SGH05 (corrosief), SGH07 (irriterend)', 'Nooddouche + oogdouche in nabijheid'],
        ['Rack Lab — Basevak', 'NaOH 50%', 'Klasse 8 (bijtend)', 'SGH05 (corrosief), SGH07 (irriterend)', 'Temperatuurmonitoring >12°C'],
        ['Rack Lab — Algemeen', 'Aluminiumsulfaat, Calciumoxide', 'Geen ADR', 'SGH07 (irriterend)', 'Reageert met water (CaO)'],
        ['Verwerking SARU ash', 'SARU ash (V, Ni, radionucliden)', 'Klasse 9 (milieugevaarlijk)', 'SGH06 (giftig), SGH05, SGH09 (milieugevaarlijk)', 'NORM-waarschuwing + CMR-pictogram'],
    ])

doc.add_heading('3.3 Waarschuwingsborden', level=2)
doc.add_paragraph(
    'Naast de GHS-pictogrammen zijn de volgende waarschuwingsborden vereist of aanbevolen:'
)
add_table(doc,
    ['Type bord', 'Locatie', 'Symbool/Norm', 'Toelichting'],
    [
        ['Brandwerend', 'Toegang opslagruimte', 'NEN-EN-ISO 7010', 'Indien Wbdbo-eis van toepassing'],
        ['Bijtend (corrosief)', 'Buitenzijde opslagruimte', 'ADR-etiket 8 / GHS SGH05', 'Verplicht voor H₂SO₄ en NaOH'],
        ['Giftig', 'SARU ash verwerkingslocatie', 'GHS SGH06', 'Vanadium- en nikkelverbindingen'],
        ['CMR', 'SARU ash verwerkingslocatie', 'Aanvullend pictogram', 'Kankerverwekkend (Cat. 1B/2)'],
        ['NORM / Straling', 'SARU ash opslaglocatie', 'IAEA stralingssymbool', 'Van nature voorkomende radionucliden'],
        ['Milieugevaarlijk', 'SARU ash opslag', 'ADR-etiket 9 / GHS SGH09', 'UN 3082 (milieugevaarlijk)'],
        ['Rookverbod', 'Alle opslaglocaties + 2m zone', 'NEN-EN-ISO 7010 P002', 'Verplicht conform M68, M134'],
        ['Nooddouche', 'Nabij zuur/base opslag', 'NEN-EN-ISO 7010 E009', 'Verplicht conform SDS H₂SO₄/NaOH'],
        ['Vluchtroute', 'Opslagruimte', 'NEN-EN-ISO 7010', 'Verplicht — opslag niet in vluchtroute (M130)'],
    ])

doc.add_heading('3.4 Opslagruimte signalering volgens PGS 15', level=2)
doc.add_paragraph(
    'PGS 15:2025 stelt aanvullende signaleringseisen voor de inrichting van de opslagruimte zelf:'
)
for item in [
    'Vloermarkering: 2 meter vrije ruimte tot andere activiteiten bij onbrandbare ADR-8/9 opslag, duidelijk zichtbaar op vloer (M21).',
    'Vakindeling: Fysieke scheiding tussen zuurvak en basevak door middel van lekbak, muurtje of afstand.',
    'Toegang: Opslagvoorziening toegankelijk voor bevoegd en deskundig personeel (M36). Onbevoegden worden geweerd.',
    'Verlichting: Voldoende verlichting voor veilig hanteren en inspectie.',
    'Inventarisatiebord: Actueel overzicht van opgeslagen stoffen per vak aan de wand.',
]:
    doc.add_paragraph(item, style='List Bullet')

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════
# H4: CALAMITEITENPLAN
# ═══════════════════════════════════════════════════════════════
doc.add_heading('4. Calamiteitenplan', level=1)

doc.add_heading('4.1 PGS 15:2025 vereisten voor calamiteitenplan', level=2)
doc.add_paragraph(
    'PGS 15:2025 vereist de volgende calamiteitengerelateerde voorzieningen en documenten:'
)
add_table(doc,
    ['Maatregel', 'Vereiste', 'Toepasselijk Phoenix Metals'],
    [
        ['M115 — Noodplan', 'Intern noodplan bij opslag boven bepaalde hoeveelheden', '✅ BNP V1 beschikbaar'],
        ['M120 — Lekkage-instructie', 'Procedure bij lekkage, actueel gehouden, medewerkers op de hoogte', '⚠️ Stofspecifieke procedures in ontwikkeling'],
        ['M121 — Calamiteiteninstructie', 'Zichtbaar bij toegang/portier, contactgegevens instanties', '✅ Opgenomen in BNP + portiersloge'],
        ['M122 — Calamiteitenploeg', 'Beschikbaar bij containeropslag', 'Niet van toepassing (geen tankcontainers)'],
        ['M95 — Brandblusmiddelen', 'Minimaal twee 6 kg poederblussers of equivalent', '✅ Via POR voorzieningen'],
    ])

doc.add_heading('4.2 Opstelling calamiteitenplan Phoenix Metals', level=2)
doc.add_paragraph(
    'Het Bedrijfsnoodplan (BNP) van Phoenix Metals, locatie Plant One Rotterdam (V1), is een toevoeging '
    'op het BNP van POR en Huntsman Rotterdam. De calamiteitenorganisatie kent de volgende structuur:'
)
add_table(doc,
    ['Rol', 'Verantwoordelijkheid', 'Escalatie'],
    [
        ['Workpermit Coördinator', 'Eerste melding, werkactivities stoppen', '→ Piketfunctionaris'],
        ['Piketfunctionaris', 'Beoordeling situatie, BHV inzetten', '→ Hoofd BHV'],
        ['Ontruimingsleiders', 'Ontruiming projectenkantoor en gebouwen', '→ Verzamelpunt'],
        ['BHV\'ers', 'Eerste hulp, brandbestrijding, ontruiming', '→ Gezamenlijke Brandweer'],
        ['Portier terrein 5210', '24/24h bereikbaar, loge als calamiteitenpost', '→ Externe hulpdiensten'],
        ['Hoofd BHV', 'Coördinatie tot overname door OVD', '→ Gezamenlijke Brandweer'],
        ['Gezamenlijke Brandweer', 'Overname commando bij OVD-aankomst', '→ Regionaal'],
    ])

doc.add_heading('4.3 Lekkageprocedures per stof', level=2)
doc.add_paragraph(
    'De volgende stofspecifieke lekkageprocedures dienen te worden opgesteld en beschikbaar gesteld '
    'bij de opslaglocatie conform PGS 15 M120:'
)

doc.add_heading('4.3.1 Lekkage H₂SO₄ (zwavelzuur)', level=3)
add_table(doc,
    ['Stap', 'Actie'],
    [
        ['1. Alarm', 'Waarschuw collega\'s, meld bij Workpermit Coördinator. Bij grote lekkage: BHV inschakelen.'],
        ['2. Bescherming', 'PBM\'s aan: zuurbestendige handschoenen, veiligheidsbril/face shield, beschermkleding.'],
        ['3. Containment', 'Voorkom verspreiding naar riolering/oppervlaktewater (M29). Opvangbak/lekbak gebruiken.'],
        ['4. Neutralisatie', 'Absorberen met zuur-bestendig absorbens. Neutraliseren met natriumcarbonaat (soda) of kalk.'],
        ['5. Opruiming', 'Geabsorbeerde stof verzamelen in AF2-gecertificeerde container. Afvoeren als gevaarlijk afval.'],
        ['6. Ventilatie', 'Zorg voor ventilatie; dampen zijn bijtend.'],
        ['7. Registratie', 'Incident documenteren in incidentenregister. Oorzaak analyseren.'],
    ])

doc.add_heading('4.3.2 Lekkage NaOH (natriumhydroxide)', level=3)
add_table(doc,
    ['Stap', 'Actie'],
    [
        ['1. Alarm', 'Waarschuw collega\'s, meld bij Workpermit Coördinator. Bij grote lekkage: BHV inschakelen.'],
        ['2. Bescherming', 'PBM\'s aan: nitril/neopreen handschoenen, veiligheidsbril/face shield, beschermkleding.'],
        ['3. Containment', 'Voorkom verspreiding. Opvangbak gebruiken.'],
        ['4. Neutralisatie', 'Absorberen met base-bestendig absorbens. Neutraliseren met zwak zuur (citroenzuur of azijnzuuroplossing).'],
        ['5. Opruiming', 'Geabsorbeerde stof verzamelen in AF2-gecertificeerde container. Afvoeren als gevaarlijk afval.'],
        ['6. Ventilatie', 'Zorg voor ventilatie; dampen zijn bijtend.'],
        ['7. Registratie', 'Incident documenteren in incidentenregister. Oorzaak analyseren.'],
    ])

doc.add_heading('4.3.3 Lekkage SARU ash', level=3)
add_table(doc,
    ['Stap', 'Actie'],
    [
        ['1. Alarm', 'Waarschuw collega\'s, meld bij Workpermit Coördinator. BHV inschakelen.'],
        ['2. Bescherming', 'PBM\'s: handschoenen, veiligheidsbril, beschermkleding, FFP3 masker (stof). Stralingshygiëne toepassen.'],
        ['3. Containment', 'Stofvrij maken. Voorkom inademing en huidcontact. Niet spreiden.'],
        ['4. Opruiming', 'Voorzichtige verwijdering met stofzuiger (HEPA-filter) of natte doek. Afval als potentieel radioactief/CMR classificeren.'],
        ['5. Straling', 'Bij twijfel: stralingsdeskundige (SBD Van Driel BV) inschakelen. Contaminatiemeting uitvoeren.'],
        ['6. Afvoer', 'Afvoer conform Besluit basisveiligheidsnormen stralingsbescherming. Notificatieplicht bij >1 kBq/kg.'],
        ['7. Registratie', 'Incident documenteren. Stralingsexpositie registreren.'],
    ])

doc.add_heading('4.4 Brandbestrijding', level=2)
doc.add_paragraph(
    'H₂SO₄ en NaOH zijn onbrandbaar (ADR-klasse 8, onbrandbaar/niet brandonderhoudend). '
    'Explosieveiligheid is niet direct relevant voor dedicated opslag. Desalniettemin gelden de '
    'volgende brandbestrijdingsmaatregelen:'
)
for item in [
    'Brandblusmiddelen: Minimaal twee 6 kg poederblussers (M95) of equivalent, afgestemd op de aanwezige stoffen.',
    'Geen brandbare materialen binnen 2 m van opslagvoorziening (M134).',
    'Rook- en vuurverbod binnen opslagvoorziening en binnen 2 m (M68).',
    'Bij brand in de omgeving: opslagvoorziening koelen met waterstraal. Bijtende dampen bij verwarming van H₂SO₄.',
    'Bluswateropvang: Voorkomen dat bluswater met bijtende stoffen in rioilering/oppervlaktewater terechtkomt (M29, M31).',
]:
    doc.add_paragraph(item, style='List Bullet')

doc.add_heading('4.5 Alarmprocedure en evacuatie', level=2)
doc.add_paragraph(
    'De alarmprocedure van Phoenix Metals is vastgelegd in het BNP en volgt de volgende stappen:'
)
steps = [
    'Ontdekking incident → Workpermit Coördistrator informeert direct Piketfunctionaris.',
    'Piketfunctionaris beoordeelt ernst → Indien nodig: BHV inschakelen, ontruiming initiëren.',
    'Ontruiming: Ontruimingsleiders sturen medewerkers via vluchtroutes naar verzamelpunt.',
    'Portier (24/24h): Loge fungeert als calamiteitenpost, registreert aanwezigen, regelt toegang hulpdiensten.',
    'Hoofd BHV: Coördineert intern tot overname door Gezamenlijke Brandweer/OVD.',
    'Communicatie: Portofoons voor interne communicatie. Stoffenlijst en aanrijdroute beschikbaar voor brandweer.',
]
for i, s in enumerate(steps, 1):
    doc.add_paragraph(f'{i}. {s}')

doc.add_heading('4.6 Oefenschema', level=2)
doc.add_paragraph(
    'Conform PGS 15:2025 §7.4.3 en de Arbowet worden periodieke oefeningen georganiseerd:'
)
add_table(doc,
    ['Type oefening', 'Frequentie', 'Doel', 'Verantwoordelijke'],
    [
        ['BHV ontruimingsoefening', '2× per jaar', 'Testen ontruimingsprocedure en vluchtroutes', 'Hoofd BHV'],
        ['Lekkage-oefening H₂SO₄/NaOH', '1× per jaar', 'Testen stofspecifieke lekkageprocedure + neutralisatie', 'HSE Manager'],
        ['Brandbestrijding', '1× per jaar', 'Testen blusmiddelen en communicatie', 'BHV Coordinator'],
        ['SARU ash incident', '1× per jaar', 'Testen CMR/NORM-procedure + stralingshygiëne', 'HSE Manager + stralingsdeskundige'],
        ['Volledige calamiteitenoefening', '1× per jaar', 'Integratie met POR/Huntsman BNP', 'Piketfunctionaris'],
        ['Na-incident evaluatie', 'Na elk incident', 'Lessen trekken, procedures bijstellen', 'HSE Manager'],
    ])

doc.add_page_break()

# ═══════════════════════════════════════════════════════════════
# H5: RI&E & TRA DOCUMENTATIE
# ═══════════════════════════════════════════════════════════════
doc.add_heading('5. RI&E & TRA Documentatie', level=1)

doc.add_heading('5.1 RI&E opslag gevaarlijke stoffen', level=2)
doc.add_paragraph(
    'De Risico-Inventarisatie en -Evaluatie (RI&E) is verplicht conform de Arbeidsomstandighedenwet '
    '(art. 5) en Arbobesluit (art. 2.15). Voor de opslag van gevaarlijke stoffen moet de RI&E minimaal '
    'bevatten:'
)
for item in [
    'Inventarisatie van alle gevaarlijke stoffen op de werkplek (overeenkomstig Chemicals Master Register)',
    'Beoordeling van gezondheids- en veiligheidsrisico\'s per stof (blootstelling, brand, reactie)',
    'Bepaling van beheersmaatregelen (PBM\'s, ventilatie, scheiding, opvang)',
    'Evaluatie van de effectiviteit van beheersmaatregelen',
    'Plan van aanpak met termijnen en verantwoordelijken',
]:
    doc.add_paragraph(item, style='List Bullet')

doc.add_paragraph(
    'De huidige RI&E-inventarisatie van Phoenix Metals is gedeeltelijk uitgevoerd. De secties '
    'binnenklimaat, beeldschermwerk en werkdruk zijn geïnventariseerd. De risicobeoordeling voor '
    'opslag van gevaarlijke stoffen (H₂SO₄, NaOH, SARU ash) dient nog te worden afgerond.'
)

doc.add_heading('5.2 TRA\'s per opslag/handling activiteit', level=2)
doc.add_paragraph(
    'Taak Risico Analyses (TRA\'s) zijn verplicht bij werkzaamheden met gevaarlijke stoffen in '
    'opslagruimten, conform PGS 15 M1 (taken door bevoegde personen). De TRA-procedure '
    '(HS-P-0008) omvat:'
)
steps = [
    'Taakbeschrijving: Welke handeling wordt uitgevoerd?',
    'Identificatie gevaren: Welke gevaren zijn aanwezig per stap?',
    'Risicobeoordeling: Waarschijnlijkheid × effect (risicomatrix).',
    'Beheersmaatregelen: Welke maatregelen reduceren het risico tot aanvaardbaar niveau?',
    'Restrisico beoordeling: Is het resterende risico aanvaardbaar?',
    'Goedkeuring: TRA akkoord door bevoegd persoon voordat werkzaamheden starten.',
]
for i, s in enumerate(steps, 1):
    doc.add_paragraph(f'{i}. {s}')

doc.add_paragraph('De volgende TRA\'s dienen te worden opgesteld of zijn reeds beschikbaar:')
add_table(doc,
    ['TRA', 'Activiteit', 'Status', 'Opmerking'],
    [
        ['TRA-001', 'Ontvangst en inspectie verpakkingen H₂SO₄', '⚠️ Opstellen', 'Controle beschadiging, lekkage, etiket'],
        ['TRA-002', 'Ontvangst en inspectie verpakkingen NaOH', '⚠️ Opstellen', 'Controle kristallisatie, temperatuur'],
        ['TRA-003', 'Hanteren en verplaatsen jerrycans', '⚠️ Opstellen', 'Tillen, verplaatsen, stapelen'],
        ['TRA-004', 'Openen en afuiten H₂SO₄ jerrycans', '⚠️ Opstellen', 'Blootstelling spatten, dampen'],
        ['TRA-005', 'Openen en afuiten NaOH jerrycans', '⚠️ Opstellen', 'Blootstelling spatten, dampen'],
        ['TRA-006', 'Verwerking SARU ash (3,5 kg batch)', '⚠️ Opstellen', 'CMR + NORM + stofblootstelling'],
        ['TRA-007', 'Lekkage opruiming H₂SO₄', '⚠️ Opstellen', 'Neutralisatie + absorptie'],
        ['TRA-008', 'Lekkage opruiming NaOH', '⚠️ Opstellen', 'Neutralisatie + absorptie'],
        ['TRA-009', 'Lekkage opruiming SARU ash', '⚠️ Opstellen', 'Stralingshygiëne + HEPA afzuiging'],
        ['TRA-010', 'Opruimen en schoonmaken opslagruimte', '⚠️ Opstellen', 'Contactresidu, afvoer afval'],
    ])

doc.add_heading('5.3 Evaluatie en actualisatie cyclus', level=2)
doc.add_paragraph(
    'RI&E en TRA\'s worden periodiek geëvalueerd en geactualiseerd conform de volgende cyclus:'
)
add_table(doc,
    ['Moment', 'Actie', 'Verantwoordelijke'],
    [
        ['Minimaal 1× per jaar', 'Volledige RI&E-herbeoordeling', 'HSE Manager'],
        ['Bij nieuwe stof in opslag', 'Aanvullende RI&E + TRA', 'HSE Manager'],
        ['Na incident of bijna-ongeval', 'TRA-actualisatie + RI&E-anpassing', 'HSE Manager'],
        ['Bij wijziging opslaglay-out', 'TRA\'s herzien', 'HSE Manager'],
        ['Bij wijziging wetgeving (PGS 15)', 'Volledige RI&E-actualisatie', 'HSE Manager'],
        ['Na elke uitgevoerde TRA', 'Evaluie effectiviteit beheersmaatregelen', 'Uitvoerder + HSE'],
    ])

doc.add_page_break()

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

doc.add_heading('6.1 Document control procedure', level=2)
doc.add_paragraph(
    'Alle PGS 15-gerelateerde documenten bij Phoenix Metals vallen onder de document control procedure '
    'PE-210-04-NL (V14). Deze procedure definieert de regels voor het opstellen, wijzigen, goedkeuren '
    'en archiveren van voorschrijvende documenten van het managementsysteem.'
)

doc.add_paragraph('De goedkeuringsroute kent drie niveaus:')
for item in [
    'Opsteller: Stelt document op of werkt het bij',
    'Reviewer: Beoordeelt inhoudelijke juistheid en compleetheid',
    'Goedkeurder: Geeft definitieve goedkeuring en vrijgave',
]:
    doc.add_paragraph(item, style='List Bullet')

doc.add_paragraph(
    'Distributie verloopt via gecontroleerde distributie: elk document heeft een gedefinieerde '
    'distributielijst en wordt niet ongedocumenteerd gekopieerd. Dit waarborgt dat alle medewerkers '
    'werken met de meest actuele versie.'
)

doc.add_heading('6.2 Versiebeheer', level=2)
doc.add_paragraph('De volgende versiebeheerregels zijn van toepassing:')
for item in [
    'Elke wijziging resulteert in een nieuw versienummer (major.minor).',
    'Oudere versies worden NIET overschreven maar gearchiveerd.',
    'Het versienummer en de wijzigingsdatum zijn prominent op het document vermeld.',
    'Een wijzigingenlog (zie Versiebeheer tabel aan begin van dit document) documenteert alle revisies.',
    'Alleen de meest actuele versie is in omloop. Verouderde versies worden ingetrokken.',
]:
    doc.add_paragraph(item, style='List Bullet')

doc.add_heading('6.3 Archivering', level=2)
doc.add_paragraph(
    'Volledige documenthistorie wordt bewaard conform PE-210-04-NL. Gearchiveerde documenten zijn '
    'toegankelijk voor audit en inspectiedoeleinden. De archivering omvat:'
)
for item in [
    'Alle versies van elk document (inclusief ingetrokken versies)',
    'Goedkeuringshistorie (wie, wanneer, wat goedgekeurd)',
    'Distributiehistorie (wie heeft welke versie ontvangen)',
    'Keurings- en inspectierapporten (M36)',
    'Trainingsdocumentatie (§7.4.3)',
]:
    doc.add_paragraph(item, style='List Bullet')

doc.add_heading('6.4 Toegankelijkheid voor medewerkers en inspecties', level=2)
doc.add_paragraph(
    'PGS 15:2025 vereist dat documenten toegankelijk zijn voor medewerkers en toezichthouders. '
    'Phoenix Metals hanteert de volgende toegankelijkheidsmaatregelen:'
)
add_table(doc,
    ['Document', 'Locatie fysiek', 'Locatie digitaal', 'Toegankelijkheid'],
    [
        ['SDS\'en', 'Rack Lab (binder)', 'Documentbeheersysteem', 'Alle medewerkers, 24/7'],
        ['Stoffenlijst', 'Portiersloge + Rack Lab', 'Documentbeheersysteem', 'Medewerkers + brandweer'],
        ['Plattegrond', 'Portiersloge', 'Documentbeheersysteem', 'Medewerkers + brandweer'],
        ['Calamiteiteninstructie', 'Bij toegang opslagruimte', 'BNP document', 'Alle medewerkers + bezoekers'],
        ['Lekkage-instructie', 'Bij opslaglocatie', 'Documentbeheersysteem', 'Alle medewerkers'],
        ['BNP', 'Calamiteitenpost portiersloge', 'Documentbeheersysteem', 'BHV + piket'],
        ['RI&E', 'HSE Manager kantoor', 'Documentbeheersysteem', 'Medewerkers + inspectie'],
        ['TRA\'s', 'Bij relevante werkplek', 'Documentbeheersysteem', 'Uitvoerders + HSE'],
        ['Keuringsrapporten', 'HSE Manager kantoor', 'Documentbeheersysteem', 'Inspectie + audit'],
    ])

doc.add_page_break()

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

refs = [
    'PGS 15:2025 — Opslag van verpakte gevaarlijke stoffen, versie 1.0, januari 2025. Publicatiereeks Gevaarlijke Stoffen.',
    'Omgevingswet — Besluit activiteiten leefomgeving (Bal), artikelen 3.27, 4.1012.',
    'Arbeidsomstandighedenwet — Artikel 5 (RI&E), Arbobesluit hoofdstuk 4 (gevaarlijke stoffen), artikel 2.15.',
    'REACH — EG 1907/2006, artikel 31 (veiligheidsinformatiebladen), Bijlage II.',
    'CLP-verordening — EG 1272/2008 (indeling, etikettering, verpakking).',
    'ADR — Accord européen relatif au transport international des marchandises Dangereuses par Route.',
    'Besluit basisveiligheidsnormen stralingsbescherming — Artikelen 2.2, 3.17, 3.20, 4.2, 7.1.',
    'NEN-EN-ISO 7010 — Grafische symbolen — Veiligheidskleuren en veiligheidstekens.',
    'NEN 3011 — Veiligheidstekens op de werkplek.',
    'NEN-EN-ISO 20560 — Signalering leidingen en tanks.',
    'NEN 6068 — Bepaling weerstand tegen branddoorslag en brandoverslag.',
    'NEN 2535 — Branddetectie-installaties.',
    'Phoenix Metals B.V. — Registration Chemicals MASTER v2.1.0, 29 november 2024.',
    'Phoenix Metals B.V. — Procedure PE-240-01: Aanvraag, beoordeling en goedkeuring van gevaarlijke stoffen, V1.',
    'Phoenix Metals B.V. — Procedure PE-210-04-NL: Document control, V14.',
    'Phoenix Metals B.V. — Bedrijfsnoodplan (BNP) V1, locatie Plant One Rotterdam.',
    'Phoenix Metals B.V. — MSDS H₂SO₄ 25-75% (Carl Roth, Versie 1, EN).',
    'Phoenix Metals B.V. — MSDS NaOH 50% (Carl Roth, Versie 1, EN).',
    'Phoenix Metals B.V. — Factsheet SARU Ash, LM van Langen, v1.0 november 2024.',
    'Phoenix Metals B.V. — RI&E Inventarisatie (in uitvoering).',
    'Phoenix Metals B.V. — TRA Procedure HS-P-0008.',
    'Phoenix Metals B.V. — TRA Hulplijst HS-F-0003.',
]
for i, ref in enumerate(refs, 1):
    doc.add_paragraph(f'[{i}] {ref}')

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