#!/usr/bin/env python3
"""Generate PGS 15 Master SOP Opslagveiligheid — Phoenix Metals v4.0 (DOCX)"""

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.oxml.ns import qn
from docx.oxml import OxmlElement
import datetime

doc = Document()

# --- Styles ---
style = doc.styles['Normal']
font = style.font
font.name = 'Calibri'
font.size = Pt(11)

def set_cell_shading(cell, color):
    shading = OxmlElement('w:shd')
    shading.set(qn('w:fill'), color)
    shading.set(qn('w:val'), 'clear')
    cell._tc.get_or_add_tcPr().append(shading)

def add_heading_styled(text, level=1):
    h = doc.add_heading(text, level=level)
    for run in h.runs:
        run.font.color.rgb = RGBColor(0, 51, 102)
    return h

def add_table(headers, rows, col_widths=None):
    table = doc.add_table(rows=1 + len(rows), cols=len(headers))
    table.style = 'Table Grid'
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    # Header
    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)
            if r_idx % 2 == 1:
                set_cell_shading(cell, 'E8F0FE')
    doc.add_paragraph()
    return table

def add_bullet(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)

def add_numbered(text):
    p = doc.add_paragraph(style='List Number')
    p.add_run(text)

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

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('PGS 15 MASTER SOP')
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('Opslagveiligheid')
run.bold = True
run.font.size = Pt(22)
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.font.size = Pt(16)
run.font.color.rgb = RGBColor(80, 80, 80)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('Versie 4.0 — April 2026')
run.font.size = Pt(14)
run.font.color.rgb = RGBColor(80, 80, 80)

doc.add_paragraph()

# Documentcode blok
add_table(
    ['Veld', 'Waarde'],
    [
        ['Documentcode', 'SOP-PGS15-PM-D4-v4.0'],
        ['Documenttitel', 'PGS 15 Master SOP Opslagveiligheid — Phoenix Metals'],
        ['Versie', '4.0'],
        ['Datum', '19 april 2026'],
        ['Status', 'Definitief'],
        ['Classificatie', 'Vertrouwelijk — Intern gebruik'],
    ]
)

add_table(
    ['Rol', 'Naam', 'Functie', 'Datum', 'Handtekening'],
    [
        ['Opsteller', 'Kas (HSEQ Divisie)', 'HSEQ Specialist', '19-04-2026', ''],
        ['Reviewer', 'J. Sitarzewski', 'Directeur', '', ''],
        ['Goedkeurder', 'J. Sitarzewski', 'Directeur', '', ''],
    ]
)

doc.add_page_break()

# ============================================================
# INHOUDSOPGAVE
# ============================================================
add_heading_styled('Inhoudsopgave', 1)
toc_items = [
    '1. Doel & Scope',
    '2. SOP-01: Opslaginventarisatie',
    '3. SOP-02: Opslagvoorschriften',
    '4. SOP-03: Laden & Lossen',
    '5. SOP-04: Lekbeker & Inspectie',
    '6. SOP-05: Calamiteitenprocedures',
    '7. SOP-06: Documentatie & Compliance',
    '8. Bijlagen',
    '9. Bronverwijzingen',
]
for item in toc_items:
    p = doc.add_paragraph(item)
    p.paragraph_format.space_after = Pt(2)

doc.add_page_break()

# ============================================================
# 1. DOEL & SCOPE
# ============================================================
add_heading_styled('1. Doel & Scope', 1)

add_heading_styled('1.1 Doel', 2)
doc.add_paragraph(
    'Deze Master Standard Operating Procedure (SOP) definieert de operationele procedures voor veilige opslag '
    'van gevaarlijke stoffen bij Phoenix Metals B.V., conform PGS 15:2025 (versie 1.0, januari 2025). '
    'Het document dient als primair referentiekader voor dagelijkse opslag- en handling-activiteiten.'
)

add_heading_styled('1.2 Scope', 2)
add_bullet('Alle opslag- en handling-activiteiten van gevaarlijke stoffen op Phoenix Metals locaties.')
add_bullet('Verpakte gevaarlijke stoffen: vaten, IBC\'s, jerrycans, canisters en gasflessen.')
add_bullet('ADR-klassen: primair klasse 8 (bijtend) en klasse 9 (milieugevaarlijk).')
add_bullet('Tijdelijke opslag, werkvoorraad en ontvangst/verzending.')

add_heading_styled('1.3 Toepasselijkheid', 2)
doc.add_paragraph(
    'Deze SOP is van toepassing op alle medewerkers, contractanten en bezoekers die betrokken zijn bij '
    'opslag, handling of transport van gevaarlijke stoffen op Phoenix Metals faciliteiten.'
)

add_heading_styled('1.4 Referentiekader', 2)
add_table(
    ['Document', 'Relevantie'],
    [
        ['PGS 15:2025 v1.0', 'Hoofdrichtlijn opslag verpakte gevaarlijke stoffen'],
        ['ADR 2025', 'Vervoer gevaarlijke stoffen over de weg'],
        ['CLP-verordening (EG 1272/2008)', 'Classificatie, etikettering, verpakking'],
        ['Arbowet / Arbobesluit', 'Arbeidsomstandigheden'],
        ['Omgevingswet / Bal', 'Milieuvergunningen en inrichtingen'],
        ['PE-240-01 (Phoenix Metals)', 'Procedure aanvraag/goedkeuring gevaarlijke stoffen'],
        ['PE-210-04 (Phoenix Metals)', 'Document control procedure'],
    ]
)

doc.add_page_break()

# ============================================================
# 2. SOP-01: OPSLAGINVENTARISATIE
# ============================================================
add_heading_styled('2. SOP-01: Opslaginventarisatie', 1)

add_heading_styled('2.1 Chemisch Register', 2)
doc.add_paragraph(
    'Phoenix Metals voert een centraal chemisch register (Registration Chemicals — MASTER, v2.1.0) '
    'met minimaal de volgende gegevens per stof:'
)
add_bullet('Stofnaam en synoniemen', 'Identificatie: ')
add_bullet('CAS-nummer', 'CAS: ')
add_bullet('ADR-klasse, UN-nummer, verpakkingsgroep', 'Classificatie: ')
add_bullet('CLP-gevarenaanduidingen (H- en P-zinnen)', 'CLP: ')
add_bullet('Hoeveelheid per locatie (kg/L)', 'Voorraad: ')
add_bullet('Verpakkingstype (jerrycan, IBC, vat, canister)', 'Verpakking: ')
add_bullet('Locatiecode (bijv. Rack lab)', 'Locatie: ')
add_bullet('Actuele SDS beschikbaar (ja/nee)', 'SDS: ')

add_heading_styled('2.2 Actueel Register — Phoenix Metals', 2)
doc.add_paragraph('Stand per 19 april 2026 (bron: Registration Chemicals MASTER v2.1.0):')

add_table(
    ['#', 'Stof', 'ADR', 'PG', 'CAS', 'Hoeveelheid', 'Verpakking', 'Locatie'],
    [
        ['1', 'NaOH 50%', '8', 'II', '1310-73-2', '4×25L = 100L', 'Jerrycan', 'Rack lab'],
        ['2', 'H₂SO₄ 75%', '8', 'II', '7664-93-9', '3×10L = 30L', 'Jerrycan', 'Rack lab'],
        ['3', 'H₂SO₄ 50%', '8', 'II', '7664-93-9', '7×10L = 70L', 'Jerrycan', 'Rack lab'],
        ['4', 'H₂SO₄ 25%', '8', 'II', '7664-93-9', '4×25L = 100L', 'Jerrycan', 'Rack lab'],
        ['5', 'Aluminiumsulfaat', 'N/A', 'N/A', '7784-31-8', '2×2,5kg = 5kg', 'Canister', 'Rack lab'],
        ['6', 'Calciumoxide', 'N/A', 'N/A', '1305-78-8', '2×5kg = 10kg', 'Canister', 'Rack lab'],
    ]
)
p = doc.add_paragraph()
run = p.add_run('Opmerking: ')
run.bold = True
p.add_run('Geen SVHC/ZZS-stoffen geregistreerd. Vanadiumoplossingen (UN 3082, ADR-klasse 9) worden toegevoegd bij operationele inzet.')

add_heading_styled('2.3 Maximum Hoeveelheden per Opslaglocatie', 2)
doc.add_paragraph(
    'PGS 15:2025 onderschrijdt geen absolute maxima per locatie, maar classificeert het vereiste veiligheidsniveau '
    'op basis van hoeveelheid en stofeigenschappen. Voor Phoenix Metals gelden de volgende grenswaarden:'
)

add_table(
    ['Parameter', 'Grenswaarde', 'Gevolg bij overschrijding'],
    [
        ['ADR-klasse 8+9, VG II/III', '>2.500 kg totaal', 'Veiligheidsniveau toename (Tabel 7 PGS 15)'],
        ['ADR-klasse 8 VG I, vlampunt 60–100°C', '>10.000 kg', 'Veiligheidsniveau A vereist'],
        ['Ondergrens PGS 15 toepassing', '250 kg (ADR-klasse 8/9 VG II/III)', 'PGS 15 wordt van toepassing'],
        ['Maximaal 4 basisopslagvoorzieningen', '>4 per bouwwerk', 'Aanvullend veiligheidsniveau (uitz. dedicated klasse 8/9)'],
    ]
)

add_heading_styled('2.4 Workflow Nieuwe Stof Toevoegen', 2)
doc.add_paragraph('Conform PE-240-01 (Procedure Aanvraag, Beoordeling en Goedkeuring):')
add_numbered('Aanvrager vult HSE Chemical Request Form (FM-240-01-02) in.')
add_numbered('HSE-beoordeling: ZZS-status, carcinogeniteit, reprotoxiciteit, sensibiliserende eigenschappen, brandgevaar, reactieve eigenschappen.')
add_numbered('Goedkeuring door HSE-functionaris + Directie.')
add_numbered('Opslaglocatie bepaald en goedgekeurd vóór inkoop.')
add_numbered('SDS opgevraagd bij leverancier en geregistreerd.')
add_numbered('Stof toegevoegd aan Registration Chemicals MASTER register.')
add_numbered('PBM-matrix geüpdatet conform stofeigenschappen.')
add_numbered('Indien afgekeurd: documentatie van afkeurcriteria bewaard.')

doc.add_page_break()

# ============================================================
# 3. SOP-02: OPSLAGVOORSCHRIFTEN
# ============================================================
add_heading_styled('3. SOP-02: Opslagvoorschriften', 1)

add_heading_styled('3.1 Algemene Opslagregels (PGS 15:2025)', 2)
add_bullet('Opslag uitsluitend in daartoe bestemde opslagvoorzieningen (brandcompartiment).')
add_bullet('Bodem vloeiend, vloeistofdicht en bestand tegen opgeslagen stoffen.')
add_bullet('Opvangvoorziening (lekbak/druppelbak) voor alle vloeistoffen — capaciteit ≥ grootste enkele verpakking.')
add_bullet('Vrije ruimte van minimaal 2 meter tot andere activiteiten, duidelijk gemarkeerd op vloer.')
add_bullet('Geen eet-, drink- of rookgedrag in opslagruimten.')
add_bullet('Beperkte toegang: alleen geautoriseerd personeel met juiste PBM\'s.')
add_bullet('Ventilatie: voldoende natuurlijke of mechanische ventilatie bij stoffen met dampen.')
add_bullet('Nooit stapelen boven maximaal toegestane stapelhoogte (verpakkingsvoorschrift).')

add_heading_styled('3.2 Veiligheidsniveau Phoenix Metals', 2)
doc.add_paragraph(
    'Op basis van de huidige stofinventaris (ADR-klasse 8 VG II, onbrandbaar; ADR-klasse 9, onbrandbaar) '
    'geldt voor Phoenix Metals uitsluitend het basisveiligheidsniveau, met de volgende uitzonderingsvoorwaarden:'
)
add_bullet('Dedicated opslag van onbrandbare/niet brandonderhoudende stoffen.')
add_bullet('Geen vermenging met brandbare of toxische stoffen.')
add_bullet('Indien samen opslag met andere ADR-klassen plaatsvindt → herbeoordeling veiligheidsniveau vereist.')

add_heading_styled('3.3 Segregatiematrix', 2)
doc.add_paragraph(
    'De segregatiematrix (Bijlage D) bepaalt welke stofcombinaties gescheiden opgeslagen moeten worden. '
    'Kernregels voor Phoenix Metals:'
)
add_table(
    ['', 'NaOH (ADR 8)', 'H₂SO₄ (ADR 8)', 'Vanadium (ADR 9)', 'Aluminiumsulfaat', 'Calciumoxide'],
    [
        ['NaOH (ADR 8)', '—', '⛔ NIET combineren', '✅ Gescheiden vak', '✅ Gescheiden vak', '⚠️ Afstand houden'],
        ['H₂SO₄ (ADR 8)', '⛔ NIET combineren', '—', '✅ Gescheiden vak', '✅ Gescheiden vak', '⚠️ Afstand houden'],
        ['Vanadium (ADR 9)', '✅ Gescheiden vak', '✅ Gescheiden vak', '—', '✅', '✅'],
        ['Aluminiumsulfaat', '✅ Gescheiden vak', '✅ Gescheiden vak', '✅', '—', '✅'],
        ['Calciumoxide', '⚠️ Afstand houden', '⚠️ Afstand houden', '✅', '✅', '—'],
    ]
)
p = doc.add_paragraph()
run = p.add_run('⛔ Zuren (H₂SO₄) en basen (NaOH) NOOIT in hetzelfde vak opslaan — reactiegevaar.')
run.bold = True
run.font.color.rgb = RGBColor(180, 0, 0)

add_heading_styled('3.4 Verpakkingsvoorschriften', 2)

add_heading_styled('3.4.1 Jerrycans', 3)
add_bullet('UN-gekeurde jerrycans (HDPE of gelijkwaardig).')
add_bullet('Maximaal 25L per jerrycan.')
add_bullet('Rechtopstaand opslaan, sluiting naar boven.')
add_bullet('Inspectie op scheuren, vervorming en lekkage bij elke toegang.')

add_heading_styled('3.4.2 IBC\'s', 3)
add_bullet('UN-gekeurd, conform ADR par. 6.5.')
add_bullet('Op vlakke, stabiele ondergrond.')
add_bullet('Opvangbak onder IBC met capaciteit ≥ inhoud IBC.')
add_bullet('Niet stapelen tenzij specifiek goedgekeurd.')

add_heading_styled('3.4.3 Vaten', 3)
add_bullet('UN-gekeurd, liggen op speciaal vatenrek of staand op pallet.')
add_bullet('Bij liggende opslag: wiggen tegen wegrollen.')
add_bullet('Dop/kraan controleren op lekvrijheid.')

add_heading_styled('3.5 Etikettering en Signalering', 2)
add_bullet('Elke verpakking voorzien van origineel etiket (CLP/ADR).')
add_bullet('Bij overvullen: nieuw etiket aanbrengen met volledige stofidentificatie.')
add_bullet('Opslagruimte: waarschuwingsborden ADR-klasse(n) en GHS-pictogrammen aan ingang.')
add_bullet('Individuele vakken: etiket met stofnaam, ADR-klasse en gevarencategorie.')
add_bullet('Controle etikettering: wekelijks (SOP-04) en bij elke mutatie.')

doc.add_page_break()

# ============================================================
# 4. SOP-03: LADEN & LOSSEN
# ============================================================
add_heading_styled('4. SOP-03: Laden & Lossen', 1)

add_heading_styled('4.1 Procedure Ontvangen Chemicaliën', 2)
add_numbered('Vrachtbrief/CMR controleren: stofnaam, UN-nummer, hoeveelheid, verpakking.')
add_numbered('Externe schadecontrole: verpakking heel, geen lekkage, etiket compleet.')
add_numbered('ADR-vrachtdocumenten controleren op volledigheid.')
add_numbered('Ontvangst registreren in Chemicals Master Register.')
add_numbered('SDS controleren: actuele versie aanwezig? Indien niet → direct opvragen leverancier.')
add_numbered('Goederen transporteren naar goedgekeurde opslaglocatie.')
add_numbered('PBM\'s dragen conform PBM-matrix bij handling.')

add_heading_styled('4.2 Inspectie bij Ontvangst', 2)
add_table(
    ['Controlepunt', 'Actie bij afwijking', 'Verantwoordelijke'],
    [
        ['Verpakking heel', 'Aflevering weigeren / apart stellen', 'Ontvangende medewerker'],
        ['Etiket compleet en leesbaar', 'Leverancier informeren, niet opslaan', 'Ontvangende medewerker'],
        ['Hoeveelheid klopt met vrachtbrief', 'Discrepantie registreren, leverancier informeren', 'Magazijnmedewerker'],
        ['Geen lekkage/geur', 'Noodprocedure SOP-05 starten bij lekkage', 'HSE-functionaris'],
        ['SDS beschikbaar', 'SDS opvragen voordat stof in opslag gaat', 'HSE-functionaris'],
        ['Temperatuur verpakking normaal', 'Stof quarantineren bij afwijkende temperatuur', 'Ontvangende medewerker'],
    ]
)

add_heading_styled('4.3 Verpompen/Overladen Veiligheidsregels', 2)
add_bullet('Uitsluitend met goedgekeurde pompen en slangen (materiaal bestand tegen de stof).')
add_bullet('Ventilatie: bij overladen in gesloten ruimte — mechanische afzuiging verplicht.')
add_bullet('Lekvrije verbindingen; opvangbak onder aansluitpunten.')
add_bullet('Nooit zuigen met de mond; altijd pomp- of overdrukysteem gebruiken.')
add_bullet('PBM\'s: minimaal veiligheidsbril, chemiebestendige handschoenen, labjas/schort.')
add_bullet('H₂SO₄: altijd langzaam mengen (zuur bij water, nooit omgekeerd).')
add_bullet('NaOH: exotherme reactie bij verdunning — langzaam toevoegen, roeren, temperatuur bewaken.')

add_heading_styled('4.4 Documentatie bij Inkomende Goederen', 2)
add_bullet('CMR-vrachtbrief archiveren (minimaal 5 jaar).')
add_bullet('Ontvangstregistratie in Chemicals Master Register (datum, hoeveelheid, leverancier, partijnummer).')
add_bullet('SDS-versie controleren en archiveren.')
add_bullet('Eventuele afwijkingen rapporteren via HSE-kanaal.')

doc.add_page_break()

# ============================================================
# 5. SOP-04: LEKBEKER & INSPECTIE
# ============================================================
add_heading_styled('5. SOP-04: Lekbeker & Inspectie', 1)

add_heading_styled('5.1 Dagelijkse Visuele Controle Opslagruimte', 2)
doc.add_paragraph('Uit te voeren door eerste medewerker die de opslagruimte betreedt (of bij ploegendienst: per ploeg):')
add_numbered('Visuele inspectie vloer: vlekken, plassen, natte plekken.')
add_numbered('Controle op afwijkende geur.')
add_numbered('Verpakkingen staan rechtop, niet omgevallen.')
add_numbered('Geen losse deksels, doppen of kleppen.')
add_numbered('Toegangspad vrij (niet geblokkeerd).')
add_numbered('Veiligheidsborden en pictogrammen zichtbaar.')
add_numbered('Afloop naar opvangvoorziening vrij (geen obstakels bij afvoer).')
doc.add_paragraph('Afwijkingen → direct melden bij HSE-functionaris + loggen in inspectieformulier (Bijlage B).')

add_heading_styled('5.2 Lekbeker Controle (Vloeistoffen)', 2)
doc.add_paragraph(
    'De lekbeker (opvangvoorziening) wordt dagelijks geïnspecteerd op aanwezigheid van vloeistof:'
)
add_bullet('Geen vloeistof: OK → loggen.', 'Status schoon: ')
add_bullet('Geringe hoeveelheid (condens/reinigingsrest): identificeren, opruimen, brononderzoek.', 'Geringe lekkage: ')
add_bullet('Meetbare hoeveelheid: Noodprocedure SOP-05 starten. Lekbeker leegafvoeren als gevaarlijk afval.', 'Significante lekkage: ')

add_heading_styled('5.3 Wekelijkse Inspectie', 2)
doc.add_paragraph('Volledige inspectie (zie Bijlage C) door HSE-functionaris of aangewezen medewerker:')

add_table(
    ['Controlepunt', 'Criterium', 'Actie bij afwijking'],
    [
        ['Structuur opslagruimte', 'Wanden, vloer, deuren intact', 'Reparatie aanvragen'],
        ['Ventilatie', 'Rosters vrij, mechanisch systeem functioneel', 'Technische dienst informeren'],
        ['Etiketten verpakkingen', 'Leesbaar, compleet, overeenkomstig register', 'Etiket vervangen'],
        ['Segregatie', 'Stoffen conform segregatiematrix gescheiden', 'Direct herindelen'],
        ['Opvangvoorziening', 'Schoon, capaciteit toereikend', 'Reinigen/vervangen'],
        ['Brandblussers', 'Gekoeld, gekeurd, toegankelijk', 'Vervangen/keuring aanvragen'],
        ['PBM-voorraad', 'Voldoende handschoenen, bril, schorten', 'Aanvullen'],
        ['Nooduitgang', 'Vrij toegankelijk, bord zichtbaar', 'Direct vrijmaken'],
    ]
)

add_heading_styled('5.4 Maandelijks Rapportage', 2)
doc.add_paragraph('De HSE-functionaris stelt maandelijks een inspectierapport op met:')
add_bullet('Aantal uitgevoerde dagelijkse en wekelijkse inspecties.')
add_bullet('Aantal en aard van geconstateerde afwijkingen.')
add_bullet('Genomen corrigerende maatregelen en status.')
add_bullet('Trends of terugkerende problemen.')
add_bullet('Aanbevelingen voor verbetering.')
doc.add_paragraph('Rapportage gaat naar Directie en wordt gearchiveerd conform PE-210-04.')

doc.add_page_break()

# ============================================================
# 6. SOP-05: CALAMITEITENPROCEDURES
# ============================================================
add_heading_styled('6. SOP-05: Calamiteitenprocedures', 1)

add_heading_styled('6.1 Alarmeringsprocedure', 2)
add_numbered('Ontdek calamiteit → beoordeel ernst en veiligheid eigen positie.')
add_numbered('Alarmeer omgeving: roep "LEKKAGE" / "BRAND" / "EVACUATIE".')
add_numbered('Bel 112 bij brand, letsel of dreigend ongeval.')
add_numbered('Informeer HSE-functionaris en Directie.')
add_numbered('Start specifieke subprocedure (§6.2–6.5) afhankelijk van type calamiteit.')

add_heading_styled('6.2 Lekkageprocedure per Stoftype', 2)

add_heading_styled('6.2.1 H₂SO₄ (Zwavelzuur) — ADR-klasse 8', 3)
add_bullet('Areaal afzetten, ventilatie maximaliseren.')
add_bullet('PBM\'s: zuurbestendige handschoenen (nitril/neopreen), veiligheidsbril, zuurbestendig schort, gelaatsbescherming.')
add_bullet('Klein lekkage: absorptiemateriaal (chemiebinders) aanbrengen, niet met water verdunnen.')
add_bullet('Groot lekkage: evacueren, brandweer informeren (stofnaam, hoeveelheid, UN-nummer).')
add_bullet('Nooit direct water op geconcentreerd zwavelzuur — exotherme reactie!')

add_heading_styled('6.2.2 NaOH (Natriumhydroxide) — ADR-klasse 8', 3)
add_bullet('Areaal afzetten.')
add_bullet('PBM\'s: alkalibestendige handschoenen, veiligheidsbril, schort.')
add_bullet('Klein lekkage: absorberen met inert materiaal, daarna neutraliseren met zwak zuur.')
add_bullet('Groot lekkage: evacueren, brandweer informeren.')

add_heading_styled('6.2.3 Vanadiumoplossingen — ADR-klasse 9', 3)
add_bullet('Areaal afzetten, huidcontact voorkomen (toxisch bij ingestie/inhalatie).')
add_bullet('PBM\'s: handschoenen, veiligheidsbril, adembescherming bij dampvorming.')
add_bullet('Absorberen, als gevaarlijk afval afvoeren.')
add_bullet('Besmette zone reinigen conform SDS-instructies.')

add_heading_styled('6.3 Brandbestrijding', 2)
doc.add_paragraph(
    'H₂SO₄, NaOH en vanadiumoplossingen zijn onbrandbaar. Brandgevaar ontstaat primair door reactie '
    'met onverenigbare stoffen (zoals brandbare materialen bij contact met zuur).'
)
add_bullet('Blusmiddelen: CO₂, poeder, of schuim (afhankelijk van brandende stof).')
add_bullet('Nooit waterstraal op chemische brand — verstuiving en reactiegevaar.')
add_bullet('Brandblusser minimaal per opslagruimte aanwezig (conform NEN 4001-3011).')
add_bullet('Indien brand in opslagruimte → evacueren, brandweer wachten.')

add_heading_styled('6.4 Evacuatie', 2)
add_numbered('Alarmsignaal → direct stoppen met werkzaamheden.')
add_numbered('PBM\'s aanhouden tot buiten gevaargebied.')
add_numbered('Volg evacuatieroute naar verzamelpunt.')
add_numbered('Tel aanwezige personen bij verzamelpunt.')
add_numbered('Meld ontbrekende personen aan hulpdiensten.')
add_numbered('Niet terugkeren zonder toestemming HSE-functionaris/brandweer.')

add_heading_styled('6.5 Melding aan Autoriteiten', 2)
add_table(
    ['Calamiteit', 'Meldplicht', 'Instantie', 'Termijn'],
    [
        ['Brand met gevaarlijke stoffen', 'Ja', 'Brandweer (112) + Omgevingsdienst', 'Direct'],
        ['Lekkage >1 m² of buiten bedrijfsterrein', 'Ja', 'Brandweer (112) + Omgevingsdienst', 'Direct'],
        ['Lekkage naar bodem/water', 'Ja', 'Omgevingsdienst', 'Binnen 24 uur'],
        ['Persoonlijk letsel', 'Ja', 'Arbeidsinspectie + verzekering', 'Volgens Arbowet'],
        ['Noodprocedure uitgevoerd', 'Intern', 'Directie + HSE', 'Direct'],
    ]
)

doc.add_page_break()

# ============================================================
# 7. SOP-06: DOCUMENTATIE & COMPLIANCE
# ============================================================
add_heading_styled('7. SOP-06: Documentatie & Compliance', 1)

add_heading_styled('7.1 SDS-beheer Opslag', 2)
add_bullet('Actuele SDS voor alle geregistreerde stoffen beschikbaar (digitaal en fysiek bij opslaglocatie).')
add_bullet('SDS bijgewerkt: leverancier om update vragen bij wijziging of minimaal 1x per 3 jaar controleren.')
add_bullet('SDS-versiebeheer: oude versies archiveren, niet verwijderen.')
add_bullet('Toegankelijkheid: SDS-dossier binnen 60 seconden raadpleegbaar voor elke medewerker.')

add_heading_styled('7.2 RI&E Actualisatie', 2)
add_bullet('RI&E bijwerken bij elke wijziging in stofinventaris, opslaglocatie of procedure.')
add_bullet('Minimaal jaarlijkse herbeoordeling RI&E.')
add_bullet('Actieplan RI&E: openstaande acties tracken en sluiten conform planning.')
add_bullet('Bron: RI&E MKB (Phoenix Metals) + TRA hulplijst + TRA procedure.')

add_heading_styled('7.3 Inspectierapporten Archiveren', 2)
add_bullet('Alle inspectierapporten (dagelijks, wekelijks, maandelijks) archiveren conform PE-210-04.')
add_bullet('Bewaartermijn: minimaal 5 jaar.')
add_bullet('Digitaal archief met back-up.')
add_bullet('Rapporten toegankelijk voor controle door toezichthouders.')

add_heading_styled('7.4 Jaarlijkse PGS 15 Compliance Check', 2)
doc.add_paragraph('Eens per jaar voert de HSE-functionaris een volledige PGS 15 compliance check uit:')

add_table(
    ['#', 'Controlepunt', 'Referentie PGS 15', 'Status'],
    [
        ['1', 'Chemisch register compleet en actueel', '§16', '☐'],
        ['2', 'SDS beschikbaar voor alle stoffen', '§16', '☐'],
        ['3', 'Opslaglocatie conform veiligheidsniveau', '§4 Tabel 6/7', '☐'],
        ['4', 'Bouwkundige staat opslagvoorziening', '§5', '☐'],
        ['5', 'Opvangvoorzieningen intact en capaciteit toereikend', '§6', '☐'],
        ['6', 'Segregatiematrix toegepast', '§7', '☐'],
        ['7', 'Etikettering compleet en leesbaar', '§16', '☐'],
        ['8', 'Inspectieregime uitgevoerd', '§12', '☐'],
        ['9', 'Brandblusmiddelen gekeurd en toegankelijk', '§9', '☐'],
        ['10', 'Calamiteitenplan actueel en getest', '§13', '☐'],
        ['11', 'Medewerkers getraind en instructie gedocumenteerd', '§13', '☐'],
        ['12', 'PBM-matrix actueel', '§10', '☐'],
    ]
)
doc.add_paragraph('Resultaat → Compliance rapport → Directie → Archief.')

doc.add_page_break()

# ============================================================
# 8. BIJLAGEN
# ============================================================
add_heading_styled('8. Bijlagen', 1)

# Bijlage A
add_heading_styled('Bijlage A: Opslagregister Template', 2)
add_table(
    ['Veld', 'Voorbeeld', 'Verplicht'],
    [
        ['Stofnaam', 'Zwavelzuur 50%', 'Ja'],
        ['CAS-nummer', '7664-93-9', 'Ja'],
        ['ADR-klasse', '8', 'Ja'],
        ['UN-nummer', 'UN 1830', 'Ja'],
        ['Verpakkingsgroep', 'II', 'Ja'],
        ['CLP-gevarenaanduidingen', 'H290, H314', 'Ja'],
        ['Hoeveelheid', '70 L', 'Ja'],
        ['Verpakkingstype', 'Jerrycan 10L', 'Ja'],
        ['Locatie', 'Rack lab, positie 3', 'Ja'],
        ['Leverancier', 'Carl Roth', 'Ja'],
        ['SDS-versie/datum', 'v3.0, 01-2025', 'Ja'],
        ['Partijnummer', 'CR-2025-0042', 'Nee'],
        ['Datum ontvangst', '15-03-2026', 'Ja'],
        ['Status', 'In stock (unopened)', 'Ja'],
        ['SVHC/ZZS', 'Nee', 'Ja'],
    ]
)

# Bijlage B
add_heading_styled('Bijlage B: Dagelijkse Inspectie Checklist', 2)
add_table(
    ['#', 'Controlepunt', 'OK', 'Afwijking', 'Actie'],
    [
        ['1', 'Vloer schoon en droog', '☐', '☐', ''],
        ['2', 'Geen afwijkende geur', '☐', '☐', ''],
        ['3', 'Verpakkingen rechtop, niet omgevallen', '☐', '☐', ''],
        ['4', 'Deksels/doppen gesloten', '☐', '☐', ''],
        ['5', 'Toegangspad vrij', '☐', '☐', ''],
        ['6', 'Veiligheidsborden zichtbaar', '☐', '☐', ''],
        ['7', 'Lekbeker leeg/schoon', '☐', '☐', ''],
        ['8', 'Afloop naar opvang vrij', '☐', '☐', ''],
    ]
)
p = doc.add_paragraph()
p.add_run('Datum: ________ Inspecteur: __________ Handtekening: __________').bold = True

# Bijlage C
add_heading_styled('Bijlage C: Wekelijkse Inspectie Checklist', 2)
add_table(
    ['#', 'Controlepunt', 'OK', 'Afwijking', 'Actie'],
    [
        ['1', 'Structuur (wanden, vloer, deuren)', '☐', '☐', ''],
        ['2', 'Ventilatie functioneel', '☐', '☐', ''],
        ['3', 'Etiketten compleet en leesbaar', '☐', '☐', ''],
        ['4', 'Segregatie conform matrix', '☐', '☐', ''],
        ['5', 'Opvangvoorziening intact', '☐', '☐', ''],
        ['6', 'Brandblusser gekeurd/toegankelijk', '☐', '☐', ''],
        ['7', 'PBM-voorraad toereikend', '☐', '☐', ''],
        ['8', 'Nooduitgang vrij', '☐', '☐', ''],
        ['9', 'Chemisch register actueel', '☐', '☐', ''],
        ['10', 'SDS-dossier compleet', '☐', '☐', ''],
    ]
)
p = doc.add_paragraph()
p.add_run('Datum: ________ Inspecteur: __________ Handtekening: __________').bold = True

# Bijlage D
add_heading_styled('Bijlage D: Segregatiematrix (Kleurcodering)', 2)
doc.add_paragraph('Kleurcodering segregatie:')
add_bullet('⛔ Rood — NIET combineren (reactiegevaar, onverenigbaar).', 'Rood: ')
add_bullet('⚠️ Oranje — Afstand houden (minimaal 2 meter, apart vak aanbevolen).', 'Oranje: ')
add_bullet('✅ Groen — Mag samen in dezelfde opslagvoorziening (gescheiden vak aanbevolen).', 'Groen: ')
add_bullet('— Blauw — Zelfde stof/geen segregatie vereist.', 'Blauw: ')

doc.add_paragraph()
doc.add_paragraph('Zie §3.3 voor de volledige segregatiematrix voor Phoenix Metals stoffen.')

# Bijlage E
add_heading_styled('Bijlage E: Calamiteitenkaart', 2)
doc.add_paragraph('De calamiteitenkaart wordt zichtbaar opgehangen bij elke opslaglocatie en bevat:')
add_bullet('Noodnummers: 112, vergiftigingeninfo, HSE-functionaris, Directie.')
add_bullet('Lay-out opslagruimte met locatie gevaarlijke stoffen.')
add_bullet('Evacuatierroute en verzamelpunt.')
add_bullet('Beschikbare blusmiddelen per zone.')
add_bullet('Specifieke instructies per stof (uit §6.2).')
add_bullet('Eerste hulp maatregelen per stoftype.')
doc.add_paragraph()
p = doc.add_paragraph()
run = p.add_run('Format: A3, gelamineerd, zichtbaar bij ingang opslagruimte.')
run.italic = True

doc.add_page_break()

# ============================================================
# 9. BRONVERWIJZINGEN
# ============================================================
add_heading_styled('9. Bronverwijzingen', 1)

refs = [
    'PGS 15:2025 — Opslag van verpakte gevaarlijke stoffen, versie 1.0, januari 2025. Publicatiereeks Gevaarlijke Stoffen.',
    'ADR 2025 — Accord européen relatif au transport international des marchandises Dangereuses par Route.',
    'CLP-verordening (EG) Nr. 1272/2008 — Classificatie, etikettering en verpakking van stoffen en mengsels.',
    'Arbowet / Arbobesluit — Arbeidsomstandighedenwetgeving, Titel 3 (gevaarlijke stoffen).',
    'Omgevingswet / Besluit activiteiten leefomgeving (Bal) — Milieueisen opslag.',
    'NEN 6068 — Bepaling weerstand tegen branddoorslag en brandoverslag (Wbdbo).',
    'NEN-EN 14470-1/2 — Brandveiligheidsopslagkasten.',
    'Phoenix Metals — Registration Chemicals MASTER v2.1.0 (29 november 2024).',
    'Phoenix Metals — PE-240-01 V1: Procedure aanvraag, beoordeling en goedkeuring van gevaarlijke stoffen.',
    'Phoenix Metals — PE-210-04 V14: Procedure document control.',
    'Phoenix Metals — HSE Policy.',
    'Phoenix Metals — PBM Matrix en PBM Beleid.',
    'Phoenix Metals — RI&E MKB + TRA hulplijst/procedure.',
]

for i, ref in enumerate(refs, 1):
    p = doc.add_paragraph()
    run = p.add_run(f'[{i}] ')
    run.bold = True
    p.add_run(ref)

# ============================================================
# VERSIEGESCHIEDENIS
# ============================================================
doc.add_page_break()
add_heading_styled('Versiegeschiedenis', 1)
add_table(
    ['Versie', 'Datum', 'Auteur', 'Wijzigingen'],
    [
        ['1.0', 'November 2024', 'HSEQ Divisie', 'Initiële versie'],
        ['2.0', 'Januari 2025', 'HSEQ Divisie', 'Update PGS 15:2025'],
        ['3.0', 'Maart 2026', 'HSEQ Divisie', 'Uitbreiding SOP\'s en bijlagen'],
        ['4.0', '19 april 2026', 'HSEQ Divisie (Kas)', 'Volledige herschrijving conform PGS 15:2025 extractie; uitgebreide segregatiematrix; calamiteitenprocedures per stoftype; compliance checklijst'],
    ]
)

# --- Save ---
output_path = '/root/projects/jg/2026-pgs15-phoenix-metals/deliverables/docx/PGS15_MasterSOP_Opslagveiligheid_Phoenix_Metals_D4_v4.0.docx'
doc.save(output_path)
print(f'✅ Document opgeslagen: {output_path}')
