#!/usr/bin/env python3
"""PGS15 Basishandleiding v2.0 — DOCX Generator"""
from docx import Document
from docx.shared import Inches, Pt, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import qn, nsdecls
from docx.oxml import parse_xml
import datetime

doc = Document()

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

for level in range(1, 4):
    hs = doc.styles[f'Heading {level}']
    hs.font.name = 'Calibri'
    hs.font.color.rgb = RGBColor(0, 51, 102)
    if level == 1:
        hs.font.size = Pt(16)
        hs.font.bold = True
        hs.paragraph_format.space_before = Pt(18)
    elif level == 2:
        hs.font.size = Pt(13)
        hs.font.bold = True
        hs.paragraph_format.space_before = Pt(12)
    else:
        hs.font.size = Pt(11)
        hs.font.bold = True
        hs.paragraph_format.space_before = Pt(8)

# Margins
for section in doc.sections:
    section.top_margin = Cm(2.5)
    section.bottom_margin = Cm(2.5)
    section.left_margin = Cm(2.5)
    section.right_margin = Cm(2.5)

# ---- Helpers ----
def add_table(headers, rows):
    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
        shading = parse_xml(f'<w:shd {nsdecls("w")} w:fill="003366"/>')
        cell.paragraphs[0].runs[0].font.color.rgb = RGBColor(255, 255, 255)
        cell.paragraphs[0].runs[0].font.bold = True
        cell.paragraphs[0].runs[0].font.size = Pt(10)
        cell._tc.get_or_add_tcPr().append(shading)
    # 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(10)
            if r_idx % 2 == 1:
                shading = parse_xml(f'<w:shd {nsdecls("w")} w:fill="F2F2F2"/>')
                cell._tc.get_or_add_tcPr().append(shading)
    return table

def add_para(text, bold=False, italic=False, size=11):
    p = doc.add_paragraph()
    run = p.add_run(text)
    run.font.size = Pt(size)
    run.font.bold = bold
    run.font.italic = italic
    return p

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

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

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

doc.add_paragraph()

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('Versie 2.0 — April 2026')
run.font.size = Pt(14)

doc.add_paragraph()

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('Bron: PGS 15:2025 versie 1.0 (januari 2025)\nVastgesteld door BOb op 16 januari 2025')
run.font.size = Pt(11)
run.font.italic = True

for _ in range(4):
    doc.add_paragraph()

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run('Doelgroep: HSE-medewerkers, operationeel managers, auditors, veiligheidsadviseurs')
run.font.size = Pt(11)

doc.add_page_break()

# ===== HOOFDSTUK 1 =====
doc.add_heading('Hoofdstuk 1 — Wat is PGS-15?', level=1)

doc.add_heading('1.1 De Publicatiereeks Gevaarlijke Stoffen', level=2)
add_para('De Publicatiereeks Gevaarlijke Stoffen (PGS) is een verzameling richtlijnen voor bedrijven die gevaarlijke stoffen produceren, transporteren, opslaan of gebruiken, en voor overheden belast met vergunningverlening en toezicht. De reeks integreert arbeidsveiligheid, omgevingsveiligheid, brandpreventie en rampenbestrijding in één samenhangend kader. [PGS 15:2025 — Inleiding]')

add_para('PGS 15:2025 is uitgevoerd in de PGS Nieuwe Stijl. Dit betekent dat alle maatregelen tot stand zijn gekomen op basis van een transparante risicobenadering met scenario\'s, doelen en maatregelen. De richtlijn is vastgesteld door de Stuurgroep op 5 december 2024 en door het Bestuurlijk Omgevingsberaar (BOb) op 16 januari 2025. [PGS 15:2025 — Inleiding]')

doc.add_heading('1.2 PGS-15:2025 — De huidige versie', level=2)
add_para('PGS 15 beschrijft de technische en organisatorische maatregelen voor de opslag van verpakte gevaarlijke stoffen. De richtlijn behandelt arbeidsveiligheid, omgevingsveiligheid, brandpreventie en rampenbestrijding. De indeling van gevaarlijke stoffen is gebaseerd op de vervoerswetgeving (ADR). [PGS 15:2025 — §1.1]')

add_para('PGS 15:2025 volgt de Nieuwe Stijl-methodiek:', bold=True)
add_para('1. Wettelijke kaders\n2. Risicobenadering met scenario\'s (S1–S15)\n3. Doelen (D1–D12)\n4. Maatregelen (M1–M164, MW1)')

add_para('Belangrijkste wijzigingen versus PGS 15:2021:', bold=True)
add_para('• Structuur gewijzigd van beschermingsniveaus (1, 2, 2a, 3, 4) naar veiligheidsniveaus (Basis, A, B, C)\n• Onderscheid inpandig/uitpandig vervallen; vervangen door binnenopslag/buitenopslag\n• Scenario-benadering geïntroduceerd met oorzaak- en gevolgscenario\'s\n• Maatregelen gecodeerd (M1–M164) en gefilterd op categorie (Tabel 5)\n• 12 nieuwe maatregelen toegevoegd\n• Diverse maatregelen samengevoegd en geactualiseerd (Bijlage I)')

doc.add_heading('1.3 Relatie tot de Omgevingswet en het BAL', level=2)
add_para('De PGS-richtlijnen krijgen juridische kracht doordat ze worden opgenomen in omgevingsvergunningen of direct werkend zijn via het Besluit activiteiten leefomgeving (Bal). [PGS 15:2025 — §1.3, §5.2]')

add_table(
    ['Onderwerp', 'Toepassing'],
    [
        ['Bal art. 3.27', 'Stelt ondergrenzen voor opslag van gevaarlijke stoffen'],
        ['Bal art. 4.1012', 'Bevat vrijstellingsgrondslagen'],
        ['Bkl', 'PGS 15 aangewezen als BBT-document'],
        ['Arbeidsinspectie', 'PGS 15 als toezichtkader'],
        ['Veiligheidsregio\'s', 'Adviesrol bij brandveiligheid en rampenbestrijding'],
    ]
)
doc.add_paragraph()

doc.add_heading('1.4 Relatie tot het ADR', level=2)
add_para('Het ADR vormt de basis voor de stoffenindeling. De ADR-klassen en verpakkingsgroepen bepalen welke eisen van toepassing zijn. Gelijkwaardige maatregelen zijn toegestaan indien aantoonbaar gelijkwaardige bescherming wordt bereikt (Hoofdstuk 8). [PGS 15:2025 — §1.2, §8]')

doc.add_page_break()

# ===== HOOFDSTUK 2 =====
doc.add_heading('Hoofdstuk 2 — Wanneer is PGS-15 van toepassing?', level=1)

doc.add_heading('2.1 Stoffen die onder de werkingssfeer vallen', level=2)
add_para('PGS 15:2025 is van toepassing op de opslag en tijdelijke opslag van de volgende categorieën (Tabel 1): [PGS 15:2025 — §1.2, Tabel 1]')

add_table(
    ['ADR-klasse', 'Omschrijving', 'Voorwaarden'],
    [
        ['2', 'Alle drukhouders (gasflessen, spuitbussen, canisters)', 'M.u.v. cryohouders, blusgassen, ademluchtflessen'],
        ['3', 'Brandbare vloeistoffen', 'M.u.v. diesel/vlampunt ≥55°C, viscositeitsregel ADR'],
        ['4.1', 'Brandbare vaste stoffen', 'Alle stoffen'],
        ['4.2', 'Zelfontbranding vatbare stoffen', 'Alle stoffen'],
        ['4.3', 'Stoffen + water → brandbare gassen', 'Alle stoffen'],
        ['5.1', 'Oxiderende stoffen', 'M.u.v. vaste minerale anorganische meststoffen'],
        ['5.2', 'Organische peroxiden', 'Uitsluitend LQ tot max. 1.000 kg'],
        ['6.1', 'Giftige stoffen', 'Alle stoffen'],
        ['6.2', 'Infectueuze stoffen', 'Cat. I1–I4'],
        ['8', 'Bijtende stoffen', 'Alle stoffen'],
        ['9', 'Milieugevaarlijke stoffen', 'Uitsluitend M6 (UN 3082) en M7 (UN 3077)'],
        ['CMR/CLP', 'Carcinogeen, mutageen, reprotoxisch', 'Zonder ADR-klasse'],
    ]
)
doc.add_paragraph()

doc.add_heading('2.2 Stoffen die NIET onder de werkingssfeer vallen', level=2)
add_para('• ADR-klasse 1: Ontplofbare stoffen\n• ADR-klasse 7: Radioactieve stoffen\n• ADR-klasse 5.2 (overige): PGS 8\n• Lithiumhoudende energiedragers: PGS 37-2\n• Vaste minerale anorganische meststoffen: PGS 7\n• Gewasbeschermingsmiddelen <400 kg\n• Acuut toxische stoffen CLP cat. 1-3\n• Vrijgestelde hoeveelheden conform ADR')

doc.add_heading('2.3 Ondergrenzen', level=2)
add_para('Wanneer een ondergrens wordt overschreden, gelden alle PGS 15-maatregelen voor alle opgeslagen stoffen binnen de activiteit. [PGS 15:2025 — §1.2.1, Tabel 2]')

add_table(
    ['Gevaar conform ADR-klasse', 'Verpakkingsgroep', 'Ondergrens'],
    [
        ['Alle ADR-klassen', 'I', '1 kg'],
        ['CMR-stoffen', 'n.v.t.', '25 kg'],
        ['Acuut toxische CLP cat. 1-3', 'n.v.t.', '1 kg'],
        ['Klasse 2 spuitbussen/canisters', 'n.v.t.', '50 kg'],
        ['Klasse 2.1 brandbare gassen (gasflessen)', 'n.v.t.', '125 l'],
        ['Klasse 2.3 giftige/bijtende gassen', 'n.v.t.', '25 l'],
        ['Klasse 2 overige gassen', 'n.v.t.', '125 l'],
        ['Klasse 3 VG II', 'II', '25 kg'],
        ['Klasse 3 VG III', 'III', '50 kg'],
        ['Klassen 4.1, 4.2, 4.3', 'II/III', '50 kg'],
        ['Klasse 5.1', 'II/III', '50 kg'],
        ['Klasse 5.2 LQ (UN 3103–3110)', '—', '30 kg'],
        ['Klasse 6.1', 'II/III', '50 kg'],
        ['Klasse 6.2 cat. I1/I2', '—', '0 kg'],
        ['Klasse 6.2 overig', '—', '50 kg'],
        ['Klasse 8', 'II/III', '250 kg'],
        ['Klasse 9', 'Alle', '250 kg'],
    ]
)
doc.add_paragraph()
add_para('Voor LQ/EQ-verpakkingen geldt een aanvullende vrijstelling tot het dubbele van de ondergrens, mits opgeslagen in transportverpakking (uitzondering: klasse 5.2). [PGS 15:2025 — §1.2.1]', italic=True)

doc.add_heading('2.4 Werkvoorraad vs opslag (M14)', level=2)
add_para('Werkvoorraad is uitsluitend de hoeveelheid stoffen die voor de bedrijfsvoering noodzakelijk is. Werkvoorraad hoeft niet in een opslagvoorziening, mits voldaan aan M14. Meerdere niet-geopende verpakkingen die onnodig lang in een werkruimte verblijven kwalificeren als opslag. [PGS 15:2025 — M14]')

doc.add_page_break()

# ===== HOOFDSTUK 3 =====
doc.add_heading('Hoofdstuk 3 — Hoe is PGS-15 opgebouwd?', level=1)

doc.add_heading('3.1 Hoofdstukindeling PGS 15:2025', level=2)
add_para('Normatieve hoofdstukken:', bold=True)
add_para('• §1: Inleiding (alleen §1.2 is normatief)\n• §5: Richtingaanwijzer wet- en regelgeving\n• §6: Doelen (D1–D12)\n• §7: Maatregelen (M1–M164, MW1)')

add_para('Informatieve hoofdstukken:', bold=True)
add_para('• §2: Beschrijving opslag en tijdelijke opslag\n• §3: Risicobenadering\n• §4: Scenario\'s (S1–S15)\n• §8: Gelijkwaardige maatregelen')

add_para('Belangrijke bijlagen:', bold=True)
add_para('• E: Stoffenscheiding (onverenigbare combinaties)\n• F: Eisen aan brandveiligheidsopslagkasten\n• G: Brandbeveiligingsinstallaties (PGS 14)\n• H: Straling door openingen in brandwerende gevel\n• I: Verschillen met vorige versie\n• J: Implementatietermijnen (NORMATIEF)')

doc.add_heading('3.2 Waar vind je wat', level=2)
add_table(
    ['Onderwerp', 'Paragraaf', 'Maatregel'],
    [
        ['Toepassingsbereik en ondergrenzen', '§1.2', '—'],
        ['Opslagvoorziening (binnen/buiten)', '§7.3', 'M2, M3'],
        ['Brandwerendheid en WBDBO', '§7.5.2', 'M21, M24'],
        ['Veiligheidsafstanden', '§7.5.2', 'M90, M91, M92'],
        ['Productopvang', '§7.3.2', 'M35, M36'],
        ['Stoffenscheiding', 'Bijlage E', 'M42–M44'],
        ['Brandbeveiliging (VBB)', '§7.5.3', 'M96, M97, M99'],
        ['Bluswatervoorziening', '§7.5.3', 'M103'],
        ['Informatievoorziening hulpdiensten', '§7.5.5', 'M116, M117, M118'],
        ['Noodplan', '§7.5.5', 'M113'],
        ['Tijdelijke opslag', '§7.6.2', 'M109–M115'],
        ['Gasflessen', '§7.3', 'M7, M8, M54–M56'],
        ['Onderhoud, keuring, training', '§7.4', 'M45, M104'],
    ]
)
doc.add_paragraph()

doc.add_heading('3.3 De scenario-benadering uitgelegd', level=2)
add_para('PGS 15:2025 gebruikt de BowTie-methode. De centrale gebeurtenis is een lekkage. [PGS 15:2025 — §3.2, §4]')

add_para('Oorzaakscenario\'s (S1–S8):', bold=True)
add_para('• S1: Lekkage door externe oorzaak\n• S2: Lekkage tijdens handelingen\n• S3: Lekkage door interne oorzaak opslagvoorziening\n• S4: Lekkage door falen verpakking\n• S5: Lekkage door falen (tank)container\n• S6: Lekkage door falen vervoerseenheid\n• S7: Lekkage door falen gasfles\n• S8: Lekkage als gevolg van domino-effect')

add_para('Gevolgscenario\'s (S9–S15):', bold=True)
add_para('• S9: Brand\n• S10: Ontploffing\n• S11: Blootstelling werknemers\n• S12: Verspreiding brandbare gassen (zwaarder dan lucht)\n• S13: Verspreiding giftige stoffen\n• S14: Verspreiding naar omgeving\n• S15: Escalatie binnen opslagvoorziening')

doc.add_page_break()

# ===== HOOFDSTUK 4 =====
doc.add_heading('Hoofdstuk 4 — Risicobenadering & Veiligheidsniveaus', level=1)

doc.add_heading('4.1 Basisveiligheidsniveau (MW1)', level=2)
add_para('Elke opslagvoorziening heeft een basisveiligheidsniveau. Dit bestaat uit: [PGS 15:2025 — §3.1, MW1]')
add_para('1. Beschermende maatregelen volgens wet- en regelgeving\n2. Maatregelen volgens bewezen en geaccepteerde goede praktijken\n3. Good housekeeping (netheid en orde)\n4. Goed vakmanschap (vaardigheden werknemers)')
add_para('MW1 is van toepassing op alle categorieën. De scenario\'s zijn gebaseerd op dit niveau.', italic=True)

doc.add_heading('4.2 Veiligheidsniveaus (M3, Tabel 6)', level=2)
add_para('Het cascademodel: Basisveiligheidsniveau → (stof + hoeveelheid) → Veiligheidsniveau A/B/C')

add_table(
    ['Niveau', 'Omschrijving', 'Kenmerken'],
    [
        ['Basis', 'Geldt voor ELKE opslagvoorziening', 'MW1 + alle basismaatregelen'],
        ['A', 'Brandescalatie-scenario\'s (D6, D10-D12)', 'UPD + VBB + WBDBO 60/90 min + jaarlijkse inspectie'],
        ['B', 'Middelste scenario\'s (D6, D10, D11)', 'Brandwerendheid en/of afstanden'],
        ['C', 'Niet-ontstoken escalatie (D7)', 'Verspreidingspreventie'],
    ]
)
doc.add_paragraph()

add_para('Veiligheidsniveau A — Details:', bold=True)
add_para('• WBDBO: 60 min bij ≤10 ton, 90 min bij >10 ton\n• Uitgangspuntendocument (UPD) verplicht (M99)\n• Vaste brandbeveiligingsinstallatie (VBB) — in samenhang met PGS 14\n• Jaarlijkse inspectie door geaccrediteerde instelling\n• Bedrijfsbrandweer (M97) of gelijkwaardig')

doc.add_heading('4.3 Categorieën en filtering (Tabel 5)', level=2)
add_table(
    ['Groep', 'Categorie', 'Toelichting'],
    [
        ['Veiligheidsniveau', 'Basis / A / B / C', 'Volgens M3/Tabel 6'],
        ['Type opslag', 'Binnen / Buiten / Kast / Container / Tijdelijk', ''],
        ['Stofgroepen', 'ADR 2 gasflessen, ADR 2 spuitbussen, ADR 3 VG I+II, ADR 4.1 VG II+III, ADR 5.1, ADR 5.2, ADR 6.1, ADR 6.2, Acuut toxisch', ''],
    ]
)
doc.add_paragraph()

doc.add_page_break()

# ===== HOOFDSTUK 5 =====
doc.add_heading('Hoofdstuk 5 — Kernbegrippen uitgelegd', level=1)

doc.add_heading('5.1 Opslagvoorziening (binnenopslag vs buitenopslag)', level=2)
add_table(
    ['Kenmerk', 'Binnenopslag', 'Buitenopslag'],
    [
        ['WBDBO standaard', '60 min', '60 min'],
        ['Afstand als alternatief', 'Niet van toepassing', '≥5 m = -30 min; ≥15 m = -60 min'],
        ['90 min WBDBO', 'Via constructie', 'Alleen via berekening NEN 6068'],
        ['Deuren', 'Zelfsluitend', '—'],
        ['WBDBO-verlaging bestaande bouw', 'Niet toegestaan', 'Niet toegestaan'],
    ]
)
doc.add_paragraph()

doc.add_heading('5.2 Zonnepanelen op opslagvoorzieningen (M21)', level=2)
add_para('Zonnepanelen (PV-installatie) op een PGS 15-opslagvoorziening zijn ALLEEN toegestaan na voorafgaande toestemming van het bevoegd gezag (Omgevingswet én Veiligheidsregio). [PGS 15:2025 — M21]')
add_para('Wanneer een dak niet brandwerend is, is alles op het dak onderdeel van het brandcompartiment. Installaties mogen dan NIET aanwezig zijn, met uitzondering van installaties onlosmakelijk noodzakelijk voor de opslagfunctie.', bold=True)

doc.add_heading('5.3 Brandveiligheidsopslagkast', level=2)
add_para('Zelfstandige opslagvoorziening conform NEN-EN 14470-1 (type 30, 60 of 90 min). Voor gasflessen: minimaal 60 min brandwerendheid (NEN-EN 14470-11, NEN 2678). [PGS 15:2025 — Bijlage F]')

doc.add_heading('5.4 Productopvang (110%-regel)', level=2)
add_para('De opvangcapaciteit is het hoogste van: [PGS 15:2025 — M35, M36]\n• 110% van de grootste afzonderlijke verpakking; of\n• 10% van de totale inhoud van alle verpakkingen')
add_para('Bij acuut toxische stoffen (ADR 3 VG I/II, H300-H331): monsternamepunt op lekbak verplicht (M59).', italic=True)

doc.add_heading('5.5 Compartimentering (Bijlage E)', level=2)
add_table(
    ['Code', 'Betekenis'],
    [
        ['V', 'Opslag in aparte vakken (vakscheiding)'],
        ['B', 'Gescheiden opslag, tenzij beoordeeld dat stoffen niet reageren of beide als vaste stof'],
        ['—', 'Gescheiden opslag niet noodzakelijk'],
    ]
)
doc.add_paragraph()
add_para('Stoffen ADR 6.1 VG I of ADR 8 VG I met etiket 6.1: apart brandcompartiment of 5 m vrije zone (M49).')

doc.add_heading('5.6 WBDBO — Weerstand tegen Branddoorslag en Brandoverslag', level=2)
add_table(
    ['Constructieonderdeel', 'Vereiste WBDBO'],
    [
        ['Brandveiligheidsopslagkast', 'Min. 30 min (gasflessen: 60 min)'],
        ['Binnenopslag standaard', '60 min'],
        ['Buitenopslag standaard', '60 min'],
        ['Veiligheidsniveau A (≤10 ton)', '60 min'],
        ['Veiligheidsniveau A (>10 ton)', '90 min'],
        ['Draagconstructie (M24)', 'Gelijk aan WBDBO brandcompartiment'],
    ]
)
doc.add_paragraph()

add_para('Afstandsequivalenten (M90):', bold=True)
add_para('• ≥5 m afstand = reductie 30 min WBDBO\n• ≥15 m afstand = reductie 60 min WBDBO (was 10 m in PGS 15:2021)\n• 90 min WBDBO: ALTIJD via berekening, niet via afstand\n\nUitsluitingen: WBDBO 90 min, gebouwen >8 m met gevel <30 min, open opslagen hoge vuurbelasting, VBB-eisen.')

doc.add_heading('5.7 Informatievoorziening hulpdiensten (M116, M117, M118)', level=2)
add_para('De oude "journaalverplichting" is vervangen door gegevensbeschikbaarheid: [PGS 15:2025 — M116, M117, M118]')

add_para('M116 — Bij >2.500 kg (bij aankomst beschikbaar):', bold=True)
add_para('• Plattegrond conform NEN 1414-1\n• Stoffenlijst per opslagvoorziening (ADR-klasse, maximale hoeveelheid)')

add_para('M117 — Binnen 30 min na aankomst hulpdienst:', bold=True)
add_para('• Vervoersnaam + chemische naam\n• ADR-klasse, UN-nummer, GEVI-nummer\n• Actuele hoeveelheid per UN-nummer\n• Verpakkingsgroep\n• CMR/CLP-stoffen met chemische naam\n• MSDS\n• Deskundig persoon beschikbaar (telefonisch toegestaan)')

doc.add_page_break()

# ===== HOOFDSTUK 6 =====
doc.add_heading('Hoofdstuk 6 — Snelde Referentie: Veiligheidsniveaus & Drempelwaarden', level=1)

doc.add_heading('6.1 Veiligheidsniveau bepalen — Stappenplan', level=2)
add_para('Stap 1: Bepaal ADR-klasse, verpakkingsgroep en vlampunt\nStap 2: Bepaal opgeslagen hoeveelheid\nStap 3: Raadpleeg Tabel 6 in M3 → lees veiligheidsniveau en WBDBO\nStap 4: Bepaal type opslag (binnen/buiten/kast/container/tijdelijk)\nStap 5: Filter maatregelen uit §7 op veiligheidsniveau + type opslag + stofgroep')

doc.add_heading('6.2 Overzicht veiligheidsniveaus per stofklasse (Tabel 6 — samenvatting)', level=2)
add_table(
    ['Stofklasse', 'Niveau A drempel', 'WBDBO', 'Niveau B drempel', 'WBDBO'],
    [
        ['ADR 2.1 gasflessen', 'Vanaf ondergrens', '60 min', '—', '—'],
        ['ADR 2.3 giftige/bijtende gassen', 'Vanaf ondergrens', '60 min', '—', '—'],
        ['ADR 3 VG I', 'Maatwerk', '—', '—', '—'],
        ['ADR 3 VG II', '<10 ton', '60/90 min', '—', '—'],
        ['ADR 3 VG III', '<10 ton', '60/90 min', '—', '—'],
        ['ADR 4.1 VG II/III', '<10 ton', '60/90 min', '—', '—'],
        ['ADR 5.1', '<10 ton', '60/90 min', '—', '—'],
        ['ADR 6.1 VG I/II', '—', '—', 'Vanaf ondergrens', '60 min'],
        ['ADR 9 (M6/M7)', '—', '—', 'Vanaf ondergrens', '60 min'],
    ]
)
doc.add_paragraph()
add_para('Raadpleeg altijd de volledige Tabel 6 in M3 voor exacte drempelwaarden.', italic=True)

doc.add_heading('6.3 Eisen per veiligheidsniveau', level=2)
add_table(
    ['Eis', 'Basis', 'Niveau A', 'Niveau B', 'Niveau C'],
    [
        ['MW1 Zorgplicht basisveiligheid', 'Ja', 'Ja', 'Ja', 'Ja'],
        ['WBDBO', '60 min', '60/90 min', '60 min', 'Per maatregel'],
        ['VBB-installatie', 'Nee', 'Ja', 'Nee', 'Nee'],
        ['UPD', 'Nee', 'Ja', 'Nee', 'Nee'],
        ['Bedrijfsbrandweer', 'Nee', 'Mogelijk', 'Nee', 'Nee'],
        ['Bluswatervoorziening', 'Per situatie', 'Ja', 'Per situatie', 'Per situatie'],
        ['Informatie hulpdiensten', '>2.500 kg', 'Ja', 'Ja', 'Ja'],
        ['30-min informatieverplichting', '>2.500 kg', 'Ja', 'Ja', 'Ja'],
        ['Jaarlijkse inspectie VBB', 'Nee', 'Ja', 'Nee', 'Nee'],
        ['Scheiding onverenigbare stoffen', 'Ja', 'Ja', 'Ja', 'Ja'],
        ['Productopvang', 'Ja (vloeistoffen)', 'Ja', 'Ja', 'Ja'],
    ]
)
doc.add_paragraph()

doc.add_heading('6.4 Gasflessen — Specifieke eisen', level=2)
add_table(
    ['Onderwerp', 'Eis', 'Maatregel'],
    [
        ['Binnenopslag ≤250 l', 'Brandveiligheidsopslagkast (≥60 min BW)', 'M7'],
        ['Binnenopslag >250 l', 'Zoveel mogelijk voorkomen; dedicated indien noodzakelijk', 'M8'],
        ['Kelderopslag gasflessen', 'VERBODEN', 'M8'],
        ['Max kasten gasflessen/verdieping', 'Max 2 per brandcompartiment', 'M8'],
        ['Stapelen gasflessen', 'Niet gestapeld, tenzij voorziening; staand', 'M54'],
        ['Bescherming tegen omvallen', 'Vastzetten of anderszins beveiligen', 'M56'],
        ['Gasflessen tegen gevel', 'Wbdbo ≥60 min tot 4 m + overstekend dak', 'M91'],
        ['Afstand tot gebouwen', 'Minimaal 15 m (praktisch) of berekening', 'M91'],
        ['Brandbare gassen zwaarder dan lucht', 'Min. 5 m tot kelderopeningen, putten, kolken', 'M92'],
    ]
)
doc.add_paragraph()

doc.add_heading('6.5 Verdiepingsopslag', level=2)
add_table(
    ['Locatie', 'Max. hoeveelheid', 'Voorwaarden', 'Maatregel'],
    [
        ['Eerste verdieping', '2.500 kg/l', 'Max 1 opslagruimte (geen kast)', 'M8'],
        ['Kelder', '500 kg/l', 'Uitzondering: onbrandbare ADR 8 VG II/III en ADR 9', 'M8'],
        ['Hogere verdiepingen (>1e)', '500 kg/l', 'Zelfde uitzondering als kelder', 'M8'],
        ['Kasten op verdieping', '2.500 kg/l per BC', 'Naast ruimten onder 1 en 2', 'M8'],
        ['Gasflessen op verdieping', 'Max 2 kasten/BC', 'Kelder VERBODEN', 'M8'],
    ]
)
doc.add_paragraph()

doc.add_page_break()

# ===== VERSCHILLEN =====
doc.add_heading('Bijlage: Verschillen met PGS 15:2021', level=1)

doc.add_heading('Gewijzigde maatregelen', level=2)
add_table(
    ['Maatregel', 'Wijziging'],
    [
        ['M3', 'Beschermingsniveaus → veiligheidsniveaus (Tabel 6); BN2a vervallen'],
        ['M14', 'Werkvoorraad: alleen voor bedrijfsvoering noodzakelijke stoffen'],
        ['M17', 'Hoeveelheden verdiepingsopslag vergroot'],
        ['M21', 'Zonnepanelen: alleen na toestemming bevoegd gezag'],
        ['M38', 'Afscheiding op basis blussysteem (niet oppervlakte)'],
        ['M45', 'Ingangscontrole en borging middels procedure'],
        ['M68', 'Afstanden gewijzigd (10 m → 15 m)'],
        ['M90', 'Uitgangspunt 15/10 kW/m²; 10 m → 15 m'],
        ['M91', 'Afstandseisen gewijzigd, 10 m → 15 m'],
        ['M96', 'Bedrijfsbrandweer apart in M97'],
        ['M99', 'UPD incl. technische eisen VBB'],
        ['M116/M117', 'Journaal → gegevensbeschikbaarheid hulpdiensten'],
    ]
)
doc.add_paragraph()

doc.add_heading('Nieuwe maatregelen', level=2)
add_table(
    ['Maatregel', 'Onderwerp'],
    [
        ['MW1', 'Zorgplicht basisveiligheid'],
        ['M7', 'Binnenopslag gasflessen tot 250 l'],
        ['M8', 'Binnenopslag gasflessen vanaf 250 l'],
        ['M13', 'Opslag ADR 6.2 cat. I1 en I2'],
        ['M24', 'Brandwerendheid draagconstructie'],
        ['M31', 'Afschot terrein'],
        ['M49', 'Wijze van opslag acuut toxische stoffen'],
        ['M59', 'Lekbak monsternamepunt acuut toxische stoffen'],
        ['M76', 'Manoeuvreerruimte tussen opslagvakken'],
        ['M97', 'Bedrijfsbrandweer'],
        ['M103', 'Bluswatervoorziening en bereikbaarheid'],
        ['M118', 'Wijze van beschikbaar stellen informatie'],
    ]
)
doc.add_paragraph()

doc.add_heading('Vervallen maatregelen', level=2)
add_para('• BN2a: Vervallen (nieuwe structuur)\n• Inpandig/uitpandig: Vervallen door cascademodel\n• vs 3.15.2: Geen apart journaal meer voor niet-gevaarlijke stoffen\n• vs 3.19.4/3.19.5: PBM\'s al geregeld in Arbowetgeving')

doc.add_page_break()

# ===== COLOFON =====
add_para('COLOFON', bold=True, size=14)
add_para('Bronvermelding: PGS 15:2025 versie 1.0 (januari 2025), Publicatiereeks Gevaarlijke Stoffen.')
add_para('Vastgesteld door: Bestuurlijk Omgevingsberaar (BOb), 16 januari 2025.')
add_para('URL: https://publicatiereeksgevaarlijkestoffen.nl/publicaties/online/pgs-15/2025/1-0-januari-2025')
add_para('Versie: 2.0 | Samengesteld april 2026.')
add_para('Dit document is bedoeld als hulpmiddel bij PGS-15 audits en vervangt niet de originele PGS 15:2025-publicatie.', italic=True)
add_para('Raadpleeg altijd de originele publicatie voor de geautoriseerde versie.', italic=True)

# Save
output_path = '/root/projects/jg/2026-pgs15-audit-toolkit/deliverables/docx/PGS15_Basishandleiding_v2.0.docx'
doc.save(output_path)
print(f"DOCX saved to: {output_path}")
