#!/usr/bin/env python3
"""
JvG Consultancy — Procedure Generator
Procedure: Safe Handling of Mercury — Offshore Decommissioning
Basis: 00_meta_dossier_mercury_audit.md (HSEQ Compliance Audit Koole 003.057)
Structuur: MASTER_STYLEGUIDE §2.2 (7 hoofdstukken) / MASTER_SOP §3.5 Compliance-type
Kwaliteitsniveau: PGS15 (5.000+ woorden, bronverwijzingen [n] bij feitelijke claims)
"""

from docx import Document
from docx.shared import RGBColor, Pt, Cm
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

# ------------------------------------------------------------------
# JvG Branding
# ------------------------------------------------------------------
PRIMARY_HEX = "003366"
PRIMARY = RGBColor(0x00, 0x33, 0x66)   # JvG donkerblauw
ACCENT = RGBColor(0x00, 0xA8, 0xE8)    # JvG lichtblauw
DARKGREY = RGBColor(0x1F, 0x29, 0x37)
ZEBRA_HEX = "F8F9FA"
LOGO = "/root/projects/jg/2026-audit-koole-mercury-003057/working/assets/jvg-logo.png"
LOGO_W_CM, LOGO_H_CM = 2.0, 1.8

DOC_CODE = "JvG-HSEQ-PRO-003057"
DOC_DATE = "24 augustus 2026"

# ------------------------------------------------------------------
# Helpers
# ------------------------------------------------------------------

def set_font(run, font_name="Calibri", size=11, bold=False, italic=False, color=None):
    run.font.name = font_name
    run.font.size = Pt(size)
    run.font.bold = bold
    run.font.italic = italic
    run.font.color.rgb = color if color else RGBColor(0, 0, 0)
    rpr = run._element.get_or_add_rPr()
    rfonts = rpr.find(qn("w:rFonts"))
    if rfonts is None:
        rfonts = OxmlElement("w:rFonts")
        rpr.append(rfonts)
    rfonts.set(qn("w:eastAsia"), font_name)


def para(doc, text, size=11, bold=False, italic=False, color=None,
         align=WD_ALIGN_PARAGRAPH.JUSTIFY, space_after=8, space_before=0):
    p = doc.add_paragraph()
    p.alignment = align
    p.paragraph_format.space_after = Pt(space_after)
    p.paragraph_format.space_before = Pt(space_before)
    r = p.add_run(text)
    set_font(r, size=size, bold=bold, italic=italic, color=color)
    return p


def heading(doc, text, level=1):
    """Kop conform JvG-stijl: Calibri, blauw, hiërarchische groottes."""
    sizes = {1: 16, 2: 13, 3: 12}
    p = doc.add_paragraph(style="Heading %d" % level)
    p.paragraph_format.space_before = Pt(14 if level == 1 else 10)
    p.paragraph_format.space_after = Pt(8)
    p.paragraph_format.keep_with_next = True
    r = p.add_run(text)
    set_font(r, size=sizes[level], bold=True, color=PRIMARY if level < 3 else DARKGREY)
    if level == 1:
        pPr = p._element.get_or_add_pPr()
        pBdr = OxmlElement("w:pBdr")
        bottom = OxmlElement("w:bottom")
        bottom.set(qn("w:val"), "single")
        bottom.set(qn("w:sz"), "12")
        bottom.set(qn("w:space"), "2")
        bottom.set(qn("w:color"), PRIMARY_HEX)
        pBdr.append(bottom)
        pPr.append(pBdr)
    return p


def bullet(doc, text, level=0, bold_prefix=None):
    p = doc.add_paragraph(style="List Bullet")
    p.paragraph_format.left_indent = Cm(0.75 + 0.5 * level)
    p.paragraph_format.space_after = Pt(4)
    if bold_prefix:
        set_font(p.add_run(bold_prefix), bold=True)
    set_font(p.add_run(text))
    return p


def step(doc, nr, owner, text):
    """Genummerde procedurestap met eigenaar (Styleguide: genummerde stappen, eigenaren)."""
    p = doc.add_paragraph()
    p.paragraph_format.left_indent = Cm(0.9)
    p.paragraph_format.first_line_indent = Cm(-0.9)
    p.paragraph_format.space_after = Pt(6)
    set_font(p.add_run("Stap %d — " % nr), bold=True, color=PRIMARY)
    set_font(p.add_run("[%s] " % owner), bold=True)
    set_font(p.add_run(text))
    return p


def set_cell_bg(cell, hex_fill):
    tcPr = cell._element.get_or_add_tcPr()
    shd = OxmlElement("w:shd")
    shd.set(qn("w:val"), "clear")
    shd.set(qn("w:fill"), hex_fill)
    tcPr.append(shd)


def make_table(doc, headers, rows, widths=None, font_size=10, zebra=True):
    t = doc.add_table(rows=1 + len(rows), cols=len(headers))
    t.style = "Table Grid"
    t.alignment = WD_TABLE_ALIGNMENT.CENTER
    for j, h in enumerate(headers):
        cell = t.rows[0].cells[j]
        cell.text = ""
        r = cell.paragraphs[0].add_run(h)
        set_font(r, size=font_size, bold=True, color=RGBColor(0xFF, 0xFF, 0xFF))
        set_cell_bg(cell, PRIMARY_HEX)
    for i, row in enumerate(rows):
        for j, val in enumerate(row):
            cell = t.rows[i + 1].cells[j]
            cell.text = ""
            r = cell.paragraphs[0].add_run(str(val))
            set_font(r, size=font_size)
            if zebra and i % 2 == 1:
                set_cell_bg(cell, ZEBRA_HEX)
    if widths:
        for j, w in enumerate(widths):
            for row in t.rows:
                row.cells[j].width = Cm(w)
    spacer = doc.add_paragraph()
    spacer.paragraph_format.space_after = Pt(2)
    return t


def add_page_number_footer(section):
    footer = section.footer
    footer.is_linked_to_previous = False
    p = footer.paragraphs[0]
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    r1 = p.add_run("JvG Consultancy — HSEQ Divisie  |  %s v1.0  |  Safe Handling of Mercury  |  Pagina " % DOC_CODE)
    set_font(r1, size=8, color=DARKGREY)
    r2 = p.add_run()
    set_font(r2, size=8, color=DARKGREY)
    fld_begin = OxmlElement("w:fldChar"); fld_begin.set(qn("w:fldCharType"), "begin")
    instr = OxmlElement("w:instrText"); instr.set(qn("xml:space"), "preserve"); instr.text = " PAGE "
    fld_end = OxmlElement("w:fldChar"); fld_end.set(qn("w:fldCharType"), "end")
    r2._element.append(fld_begin); r2._element.append(instr); r2._element.append(fld_end)


def add_header_logo(section):
    header = section.header
    header.is_linked_to_previous = False
    p = header.paragraphs[0]
    p.alignment = WD_ALIGN_PARAGRAPH.RIGHT
    run = p.add_run()
    run.add_picture(LOGO, width=Cm(LOGO_W_CM), height=Cm(LOGO_H_CM))


def add_toc(doc):
    para(doc, "Inhoudsopgave", size=14, bold=True, color=PRIMARY,
         align=WD_ALIGN_PARAGRAPH.LEFT, space_after=6)
    p = doc.add_paragraph()
    fld = OxmlElement("w:fldSimple")
    fld.set(qn("w:instr"), 'TOC \\o "1-2" \\h \\z \\u')
    run_el = OxmlElement("w:r")
    t_el = OxmlElement("w:t")
    t_el.text = "Inhoudsopgave — druk F9 in Microsoft Word om te verversen."
    run_el.append(t_el)
    fld.append(run_el)
    p._element.append(fld)


# ------------------------------------------------------------------
# Document
# ------------------------------------------------------------------
doc = Document()

normal = doc.styles["Normal"]
normal.font.name = "Calibri"
normal.font.size = Pt(11)

section = doc.sections[0]
section.top_margin = Cm(2.2)
section.bottom_margin = Cm(2.0)
section.left_margin = Cm(2.4)
section.right_margin = Cm(2.4)
add_header_logo(section)
add_page_number_footer(section)

# ==================================================================
# TITELPAGINA
# ==================================================================
para(doc, "JvG Consultancy", size=14, bold=True, color=PRIMARY,
     align=WD_ALIGN_PARAGRAPH.CENTER, space_after=2)
para(doc, "Safety • Governance • Advisory", size=10, italic=True, color=DARKGREY,
     align=WD_ALIGN_PARAGRAPH.CENTER, space_after=24)

logo_p = doc.add_paragraph()
logo_p.alignment = WD_ALIGN_PARAGRAPH.CENTER
logo_p.add_run().add_picture(LOGO, width=Cm(4.5), height=Cm(4.04))

para(doc, "PROCEDURE", size=12, bold=True, color=ACCENT,
     align=WD_ALIGN_PARAGRAPH.CENTER, space_before=20, space_after=6)
para(doc, "Safe Handling of Mercury", size=26, bold=True, color=PRIMARY,
     align=WD_ALIGN_PARAGRAPH.CENTER, space_after=4)
para(doc, "Offshore Decommissioning — Small Piece Removal", size=14, color=DARKGREY,
     align=WD_ALIGN_PARAGRAPH.CENTER, space_after=20)

make_table(doc,
    ["Gegeven", "Waarde"],
    [
        ["Project", "2026-audit-koole-mercury-003057"],
        ["Opdrachtgever", "Wintershall (offshore olie & gas, Nederland)"],
        ["Uitvoerende aannemer", "Koole"],
        ["Activiteit", "Decommissioning offshore platform — small piece removal"],
        ["Locatie", "Offshore platform, Nederlandse sector Noordzee"],
        ["Jurisdictie", "Nederland"],
        ["Referentieprocedure", "Koole procedure 003.057 Safe Handling of Mercury Rev 1"],
        ["Documentcode", DOC_CODE],
        ["Versie / Status", "1.0 — Final"],
        ["Datum", DOC_DATE],
        ["Opsteller", "Technical Writer (HQ_04), JvG Consultancy — HSEQ Divisie"],
        ["Goedkeuring", "Kas — Director of Operations, JvG Consultancy"],
    ],
    widths=[5.0, 11.5], font_size=10)

para(doc, "Dit document is opgesteld naar aanleiding van de document-gebaseerde HSEQ compliance "
          "audit van de Koole-procedure 003.057. Alle feitelijke inhoud is herleidbaar naar de "
          "referenties in Bijlage D en het auditdossier 2026-audit-koole-mercury-003057.",
     size=9, italic=True, color=DARKGREY, align=WD_ALIGN_PARAGRAPH.CENTER, space_before=10)

doc.add_page_break()

# ==================================================================
# INHOUDSOPGAVE
# ==================================================================
add_toc(doc)
doc.add_page_break()
# ==================================================================
# 1. DOEL
# ==================================================================
heading(doc, "1. Doel", 1)
para(doc,
     "Deze procedure beschrijft de veilige omgang met kwik en kwikbesmet materiaal tijdens "
     "decommissioning-werkzaamheden (small piece removal) op een offshore platform in de "
     "Nederlandse sector van de Noordzee. Het doel is drievoudig: bescherming van werknemers "
     "tegen blootstelling aan kwikdampen en kwikcontact, beheersing van emissie naar het "
     "marine milieu, en aantoonbare conformiteit met de geldende Nederlandse en Europese "
     "regelgeving, waaronder het Arbobesluit hoofdstuk 4 [2] en de Europese Kwikverordening "
     "(EU) 2017/852 [3].")
para(doc,
     "Kwik (elementair, CAS-nummer 7439-97-6) is conform de CLP-verordening geclassificeerd "
     "als reprotoxisch (H360), specifiek doelorgaantoxisch bij herhaalde blootstelling (H373) "
     "en zeer giftig voor waterorganismen met langetermijneffecten (H410) [7]. Elementair "
     "kwik verdampt al bij omgevingstemperatuur; de risicobeheersing die hierop is gebaseerd "
     "vormt de kern van deze procedure. Het document voorziet in de twaalf kritieke elementen "
     "uit de toetsingsmatrix van de compliance audit van de Koole-procedure 003.057 Rev 1, "
     "waaronder een concrete RI&E-sectie, een gedetailleerd plan van aanpak, expliciete "
     "PBM-specificaties en een volledige opslag-, transport- en afvoerprocedure [audit §3.1].")

# ==================================================================
# 2. TOEPASSINGSGEBIED
# ==================================================================
heading(doc, "2. Toepassingsgebied", 1)
heading(doc, "2.1 Doelgroep en Organisatie", 2)
para(doc,
     "Deze procedure geldt voor alle medewerkers van de uitvoerende aannemer (Koole), "
     "opdrachtnemend personeel en onderaannemers die betrokken zijn bij werkzaamheden waarbij "
     "kwik of kwikbesmet materiaal kan voorkomen tijdens het decommissioningproject van het "
     "offshore platform van opdrachtgever Wintershall [audit §1.1]. Dit omvat persoonscategorieën "
     "op het platform, aan boord van supply- en transportschepen, op de overstapfaciliteit aan "
     "land en — voor zover de ketenverantwoordelijkheid reikt — bij de erkende verwerker [2][3].")
para(doc,
     "Binnen de opdrachtgever-aannemerverhouding blijft Wintershall verantwoordelijk voor "
     "de coördinatie van de gezamenlijke werkzaamheden op het platform conform de "
     "verplichtingen uit de Arbowet, terwijl de uitvoerende aannemer (Koole) de uitvoering "
     "van deze procedure waarborgt en de nodige maatregelen treft voor de bescherming van "
     "zijn werknemers [1][2]. Onderaannemers ontvangen voor eerste inzet een instructie over "
     "deze procedure en ondertekenen hiervoor een registratieformulier; zonder deze "
     "registratie wordt niemand toegelaten tot werkzaamheden met mogelijke kwikblootstelling [3].")

heading(doc, "2.2 Activiteiten en Locaties", 2)
bullet(doc, "Pre-removal survey: identificatie en testing van potentiële kwikbronnen op het platform (paragraaf 4.2).")
bullet(doc, "Verwijdering van kleine installatieonderdelen, small piece removal (paragraaf 4.3).")
bullet(doc, "Post-removal verificatie en vrijgave van werkzones (paragraaf 4.4).")
bullet(doc, "Tijdelijke opslag van kwik en kwikbesmet materiaal offshore (paragraaf 4.5).")
bullet(doc, "Transport over water en over land naar de overstapfaciliteit (paragraaf 4.6).")
bullet(doc, "Afvoer naar en verwerking door een erkende verwerker (paragraaf 4.7).")
para(doc,
     "De werkzaamheden vallen onder de Nederlandse jurisdictie en onder de brancherichtlijnen "
     "voor de offshore olie- en gassector (NOGEPA) [15]. Waar de opdrachtgever (Wintershall) "
     "aanvullende platformspecifieke eisen stelt die verder gaan dan deze procedure, zijn die "
     "eisen bindend. Aanvullend gelden de richtlijnen voor zorgwekkende stoffen van het RIVM "
     "(ZZS-richtlijnen) voor zover kwik daaronder valt [14].")
heading(doc, "2.3 Uitsluitingen", 2)
para(doc,
     "Deze procedure bestrijkt geen topside-removal in zijn geheel, seabed-removal of "
     "landbased sloopactiviteiten en evenmin beroepsmatige blootstelling in laboratoria en "
     "tandheelkundige praktijken. Voor laboratoriumanalyse van monsters uit dit project geldt "
     "AI-blad 64 als aanvullend kader [10]; voor tandheelkundige toepassingen is het KNMT-kader "
     "buiten scope [16].")

heading(doc, "2.4 Relatie tot Andere Documenten", 2)
para(doc,
     "Deze procedure is onderdeel van een samenhangende documentatiestructuur en wordt "
     "gelezen samen met: de RI&E met kwikartikel (Arbobesluit artikel 4.1) [2], het plan van "
     "aanpak voor de decommissioningactiviteiten (artikel 4.2) [2], de veiligheidsinformatiebladen "
     "van kwik (artikel 4.12; REACH artikel 31) [2][6], de EMVI-kaart van het platform "
     "(artikel 4.11) [2], de werkvergunningprocedures van de opdrachtgever en de "
     "toetsingsmatrix uit de compliance audit [audit §2.2]. Bij tegenstrijdigheid tussen deze "
     "procedure en wettelijke eisen prevaleren de wettelijke eisen; bij tegenstrijdigheid met "
     "platformspecifieke regels van de opdrachtgever prevaleren de strengste eis.")
para(doc,
     "De compliance audit heeft vastgesteld dat de onderhavige procedure minimaal moet "
     "voldoen aan de verplichte elementen uit zeven toetsingskaders: Arbobesluit hoofdstuk 4, "
     "de EU-Kwikverordening, de Bal, REACH/CLP en de AI-bladen 31, 18 en 64 [audit §2.2]. "
     "Elk element uit die matrix is in dit document verwerkt en in Bijlage D terug te voeren "
     "op de desbetreffende wettelijke grondslag.")

# ==================================================================
# 3. DEFINITIES & AFKORTINGEN
# ==================================================================
heading(doc, "3. Definities & Afkortingen", 1)
make_table(doc,
    ["Term / Afkorting", "Definitie"],
    [
        ["Kwik (elementair)", "Vloeibaar metaal, CAS 7439-97-6; CLP-classificatie H360, H373, H410 met preventie-zinnen P201, P260, P281, P301+P310+P330, P304+P340+P312, P405, P501 [7]"],
        ["Arbobesluit H4", "Hoofdstuk 4 van het Arbeidsomstandighedenbesluit (gevaarlijke stoffen), versie 26-05-2025 [2]"],
        ["RI&E", "Risico-Inventarisatie en -Evaluatie; verplicht conform Arbobesluit artikel 4.1 [2]"],
        ["PvA", "Plan van Aanpak; verplicht conform Arbobesluit artikel 4.2 [2]"],
        ["PBM", "Persoonlijke Beschermingsmiddelen; eisen conform Arbobesluit artikel 4.5 en AI-blad 18 [2][9]"],
        ["TWA (8-uur)", "Time Weighted Average: gemiddelde blootstelling over acht uur; wettelijke grenswaarde kwik 0,025 mg/m³ [2][11]"],
        ["STEL (15 min)", "Short Term Exposure Limit: piekblootstelling over vijftien minuten; kwik 0,075 mg/m³ [2][11]"],
        ["SDS", "Safety Data Sheet (veiligheidsinformatieblad); beschikbaarheid vereist conform Arbobesluit artikel 4.12 en REACH artikel 31 [2][6]"],
        ["CLP", "Verordening (EG) 1272/2008 voor classificatie, etikettering en verpakking van stoffen [7]"],
        ["REACH", "Verordening (EG) 1907/2006 betreffende registratie, evaluatie en autorisatie van chemische stoffen [6]"],
        ["Bal", "Besluit activiteiten leefomgeving; kader voor milieurelevante activiteiten, waaronder opslag en afvoer [5]"],
        ["EU-Kwikverordening", "Verordening (EU) 2017/852 inzake kwik, waaronder artikelen 5 (training/etikettering), 7 (PBM/opslag/decontaminatie), 8 (transport/afvoer) en 9 (meting/rapportage) [3]"],
        ["XRF", "Röntgenfluorescentie-analyse; draagbare meetmethode voor detectie van kwikvervuiling [audit §2.3]"],
        ["ZZS", "Zeer Zorgwekkende Stoffen; RIVM-richtlijnen [14]"],
        ["NOGEPA", "Nederlandse Olie en Gas Exploratie en Productie Associatie; brancherichtlijnen offshore [15]"],
        ["PGS 6 / PGS 12", "Publicatiereeks Gevaarlijke Stoffen: opslag- en handlingrichtlijnen voor gevaarlijke stoffen [12][13]"],
        ["EMVI", "Emergency Medical and First Aid Information; nood- en eerste hulpinformatie, verplicht conform Arbobesluit artikel 4.11 [2]"],
        ["OIM", "Offshore Installation Manager; eindverantwoordelijke op het platform"],
        ["Erkende verwerker", "Inwisselings- of verwerkingsbedrijf met geldige vergunning voor de verwerking van kwikhoudend afval [3][5]"],
        ["Verdacht materiaal", "Materiaal dat niet is onderzocht of waarvan een XRF-indicatie nog niet door laboratoriumanalyse is bevestigd; wordt behandeld als besmet [audit §3.1]"],
        ["Bevestigd besmet", "Materiaal met positieve laboratoriumbevestiging of onmiskenbaar visueel bewijs van elementair kwik [audit §3.1]"],
        ["Actiewaarde", "Concentratie onder de grenswaarde waarop aanvullende beheersmaatregelen worden geïnitieerd [2]"],
    ],
    widths=[4.5, 12.0], font_size=10)

# ==================================================================
# 4. WERKWIJZE / PROCEDURE
# ==================================================================
heading(doc, "4. Werkwijze / Procedure", 1)

heading(doc, "4.1 Algemene Uitgangspunten en Basiseisen", 2)
para(doc,
     "Voordat enige fase uit paragraaf 4.2 tot en met 4.7 start, zijn de volgende "
     "basiseisen vereist. Deze eisen volgen rechtstreeks uit de toetsingsmatrix van de "
     "compliance audit [audit §2.2]:")
bullet(doc, "Een actuele RI&E met een specifiek kwikartikel: inventarisatie van kwikbronnen "
            "(manometers, kleppen, separators), risicoschatting per activiteit (inspectie, "
            "verwijdering, transport) en beoordeling van blootstellingsroutes (inhalatie, "
            "huidcontact, inslikken) — Arbobesluit artikel 4.1 [2].")
bullet(doc, "Een goedgekeurd plan van aanpak met stapsgewijze fasering conform Arbobesluit "
            "artikel 4.2 [2].")
bullet(doc, "Voorlichting en training van alle betrokken medewerkers, inclusief "
            "platformspecifieke procedures — Arbobesluit artikel 4.3 en EU-Kwikverordening "
            "artikel 5 [2][3].")
bullet(doc, "Medische surveillance voor iedereen met mogelijke kwikblootstelling — "
            "Arbobesluit artikel 4.6 [2].")
bullet(doc, "De veiligheidsinformatiebladen (SDS) van kwik fysiek en digitaal beschikbaar op "
            "het platform en op kantoor — Arbobesluit artikel 4.12 en REACH artikel 31 [2][6].")
bullet(doc, "Beschikbaarstelling van PBM conform de specificatie in tabel 4.2 — "
            "Arbobesluit artikel 4.5 en EU-Kwikverordening artikel 7 [2][3][9].")
bullet(doc, "Offshorespecifieke training: platformspecifieke procedures, helikopter safety "
            "en boat transfers maken deel uit van de verplichte training [audit §2.3].")

para(doc, "Trainings- en instructie-eisen", bold=True, space_before=6)
para(doc,
     "Alle betrokken medewerkers ontvangen voorlichting en training over de risico's van "
     "kwik, de inhoud van deze procedure, het juiste gebruik van de PBM uit tabel 4.2 en de "
     "noodprocedures uit paragraaf 6.1, conform Arbobesluit artikel 4.3 en "
     "EU-Kwikverordening artikel 5 [2][3]. De training wordt verzorgd door een daartoe "
     "gekwalificeerde instructeur, wordt vóór de eerste werkzaamheden afgerond en wordt "
     "herhaald bij wijziging van de procedure of na een incident [2][3]. Deelname wordt "
     "geregistreerd conform hoofdstuk 7. Vóór eerste inzet vindt daarnaast de "
     "medische aanmelding voor de gezondheidssurveillance plaats (paragraaf 6.3) [2].")

para(doc, "Grenswaarden en classificatie", bold=True, space_before=6)
para(doc,
     "De volgende wettelijke grenswaarden en classificaties zijn bindend voor alle fasen van "
     "deze procedure:")
para(doc, "Tabel 4.1 — SER-grenswaarden voor kwik en anorganische kwikverbindingen [2][11]",
     size=9, italic=True, color=DARKGREY, align=WD_ALIGN_PARAGRAPH.LEFT)
make_table(doc,
    ["Parameter", "8-uur TWA (mg/m³)", "STEL 15 min (mg/m³)"],
    [["Kwik en anorganische verbindingen", "0,025", "0,075"]],
    widths=[8.0, 4.2, 4.2])
para(doc,
     "Bij overschrijding van een actiewaarde onder de grenswaarde worden aanvullende "
     "beheersmaatregelen genomen; bij overschrijding van de grenswaarde wordt het werk "
     "onmiddellijk stilgelegd, wordt de blootstelling onderzocht conform Arbobesluit "
     "artikel 4.10 en wordt herstart pas toegestaan nadat de oorzaak is weggenomen [2].")
para(doc, "Tabel 4.2 — CLP-classificatie en PBM-pakket kwik [7][9]",
     size=9, italic=True, color=DARKGREY, align=WD_ALIGN_PARAGRAPH.LEFT)
make_table(doc,
    ["Element", "Specificatie"],
    [
        ["Stof", "Kwik (elementair), CAS 7439-97-6 [7]"],
        ["H-zinnen", "H360 (kan de vruchtbaarheid of het ongeboren kind schaden); H373 (kan de organen schaden bij langdurige of herhaalde blootstelling); H410 (zeer giftig voor waterorganismen, met langetermijneffecten) [7]"],
        ["P-zinnen", "P201, P260, P281, P301+P310+P330, P304+P340+P312, P405, P501 [7]"],
        ["Adembescherming", "Minimaal halfgelaatsmasker met P3-filter; bij verhoogde concentraties volgelaatsmasker met P3-filter (beschermingsfactor 1000); FFP3-stofmasker (beschermingsfactor 50) uitsluitend voor kortdurende taken met lage verwachte blootstelling [audit §3.1]"],
        ["Handbescherming", "Nitrilhandschoenen, onbeschadigd, vervanging bij elke taakwissel [audit §3.1]"],
        ["Lichaamsbescherming", "Disposable beschermende kleding (coverall type 5/6), na elke werksessie afvoeren als kwikbesmet afval [audit §3.1]"],
        ["Oogbescherming", "Afgesloten veiligheidsbril of goggle [audit §3.1]"],
        ["Voetbescherming", "Chemisch bestendige laarzen of overschoenen [audit §3.1]"],
    ],
    widths=[4.2, 12.3])
para(doc,
     "De volledige PBM-set wordt gedragen bij elke activiteit waarbij direct contact met "
     "kwik of kwikbesmet materiaal redelijkerwijs mogelijk is. Gebruikte PBM wordt nooit "
     "buiten de afgebakende werkzone afgelegd en wordt afgevoerd conform hoofdstuk 4.7 [2][3].")
heading(doc, "4.2 Pre-removal Survey", 2)
para(doc,
     "Olie- en gasinstallaties kunnen historische kwikvervuiling bevatten. Vóór de verwijdering "
     "van kleine installatieonderdelen wordt daarom een pre-removal survey uitgevoerd die alle "
     "potentiële kwikbronnen identificeert en classificeert [audit §2.3][2].")
step(doc, 1, "HSEQ Officer", "Stel op basis van P&ID's, historische bedrijfsgegevens en de RI&E een inventarislijst op van potentiële kwikbronnen, met nadruk op manometers, kleppen en separators [audit §3.1].")
step(doc, 2, "HSEQ Officer + Uitvoerend Personeel", "Doorzoek elke te verwijderen component op zichtbare kwikresten (vloeibare druppels, verkleuring, aanzetsels) en registreer de bevindingen in het surveyformulier (Bijlage A).")
step(doc, 3, "Meetdeskundige", "Screen verdachte onderdelen met draagbare XRF-apparatuur conform het testing protocol [audit §2.3].")
step(doc, 4, "Meetdeskundige", "Neem bij niet-eenduidige XRF-resultaten monsters voor laboratoriumanalyse door een geaccrediteerd laboratorium [audit §2.3].")
step(doc, 5, "HSEQ Officer", "Classificeer elk onderdeel: 'verdacht materiaal' (niet onderzocht of XRF-indicatie zonder bevestiging) of 'bevestigd besmet' (positieve laboratoriumbevestiging of onmiskenbaar visueel bewijs van elementair kwik) [audit §3.1].")
step(doc, 6, "Projectmanager", "Keur de surveyresultaten goed en gebruik deze als ingang voor het taak-risicabeoordeling en de werkvergunning voor de removalfase [2].")
step(doc, 7, "HSEQ Officer", "Bepaal per werklocatie de verwachte blootstellingsroute (inhalatie van damp, huidcontact, inslikken) en leg de beheersmaatregelen vast [audit §3.1].")
step(doc, 8, "HSEQ Officer", "Voer vóór start van de removal een nulmeting (achtergrondconcentratie) uit als referentiewaarde voor latere luchtmetingen [2].")

para(doc, "Blootstellingsbeoordeling per activiteit", bold=True, space_before=6)
para(doc,
     "Conform het RI&E-artikel voor kwik wordt voor elke activiteit afzonderlijk beoordeeld "
     "welke blootstellingsroute domineert en welke maatregelen daarop aansluiten [audit §3.1]. "
     "De beoordeling wordt vóór de fase vastgelegd en meegenomen in de werkvergunning. "
     "Inhalatie van kwikdamp is de belangrijkste route bij het openen van componenten; "
     "huidcontact domineert bij manuele handling van besmet materiaal; inslikken is "
     "voornamelijk gekoppeld aan hygiëne- en pauzeregimes binnen de werkzone.")
para(doc, "Tabel 4.3 — Blootstellingsroutes per activiteit [audit §3.1][2]",
     size=9, italic=True, color=DARKGREY, align=WD_ALIGN_PARAGRAPH.LEFT)
make_table(doc,
    ["Activiteit", "Dominante route", "Aansluitende beheersmaatregel"],
    [
        ["Inspectie en survey", "Inhalatie (damp bij opening componenten)", "XRF-screening, ventilatie, adembescherming bij opening"],
        ["Verwijdering (removal)", "Inhalatie en huidcontact", "PBM-set tabel 4.2, gesloten containment, druppelvangers"],
        ["Opslag en handling", "Huidcontact en verdamping", "Degasvormige units, handschoenen, weekcontrole op lekkage"],
        ["Transport en transfer", "Huidcontact bij incidenten", "ADR-classificatie, beveiliging lading, weersgebonden beslissing"],
        ["Reiniging en decontaminatie", "Huidcontact en inslikken", "Hygiëneregels, geen voeding in werkzone, spoelvoorzieningen"],
    ],
    widths=[4.5, 5.2, 6.8], font_size=9)

heading(doc, "4.3 Removal Procedure", 2)
para(doc,
     "De verwijdering van kleine stukken gebeurt uitsluitend onder geldige werkvergunning, "
     "met de PBM-set uit tabel 4.2 en binnen een afgebakende werkzone. Historische "
     "contaminatie maakt dat elk onderdeel als potentieel besmet wordt behandeld tot het "
     "tegendeel is aangetoond [audit §2.3]. Small piece removal vergt specifieke "
     "procedures voor identificatie en handling: onderdelen zijn veelal ingebouwd, "
     "slecht toegankelijk en te klein voor machinale demontage, waardoor handmatige "
     "demontage met verhoogd contactrisico de norm is [audit §2.3]. Tijdens elke "
     "demontagehandeling staat gesloten containment centraal: vrijkomend kwik wordt "
     "onmiddellijk opgevangen en blijft binnen de beheerste keten van paragrafen 4.5 tot "
     "en met 4.7.")
step(doc, 1, "OIM", "Geeft de werkvergunning af nadat taak-risicabeoordeling, surveyresultaten en PBM-paraatheid zijn gecontroleerd.")
step(doc, 2, "Uitvoerend Personeel", "Baken de werkzone af met waarschuwingsborden (gevaarlijke stof, kwik) en plaats druppelvangers en gesloten containment rond het te verwijderen onderdeel.")
step(doc, 3, "Meetdeskundige", "Voert continue of periodieke luchtmetingen uit in de ademzone van de werkers, conform het meetprotocol van Arbobesluit artikel 4.10 [2].")
step(doc, 4, "Uitvoerend Personeel", "Verwijder het onderdeel zonder het te laten vallen of te verwonden; voorkom dat kwik kan vrijkomen door het onderdeel gesloten of afgedekt te demonteren.")
step(doc, 5, "Uitvoerend Personeel", "Plaats het verwijderde onderdeel of vrijgekomen kwik onmiddellijk in de daartoe bestemde gesloten, degasvormige en CLP-etiketteerde opslagunit (paragraaf 4.5).")
step(doc, 6, "Uitvoerend Personeel", "Decontamineer gereedschap en herbruikbare PBM volgens het decontaminatieprotocol (paragraaf 6.3) en voer disposables af als kwikbesmet afval [3].")
step(doc, 7, "HSEQ Officer", "Beoordeel de meetresultaten van de sessie en beslist over voortzetting of stillegging van het werk [2].")

heading(doc, "4.4 Post-removal Verification", 2)
para(doc,
     "De verificatie na verwijdering sluit de removalcyclus af en vormt het bewijs dat de "
     "werkzone opnieuw veilig is voor andere disciplines. De verificatie gebruikt dezelfde "
     "meetmethoden als de survey (XRF, aangevuld met laboratoriumanalyse bij "
     "niet-eenduidige resultaten) en dezelfde referentiewaarden [audit §2.3]. Zonder "
     "formele vrijgave uit deze fase wordt geen enkele volgende activiteit in de betrokken "
     "zone toegestaan.")
step(doc, 1, "Meetdeskundige", "Voer na verwijdering een visuele inspectie en XRF-verificatiemeting uit van de vrijgekomen constructie, bevestigingspunten en onderliggende dekvloeren [audit §2.3].")
step(doc, 2, "Meetdeskundige", "Vergelijk de verificatiemetingen met de nulmeting uit stap 8 van paragraaf 4.2; bij afwijkende waarden wordt nabewerking of aanvullende reiniging uitgevoerd en opnieuw gemeten [2].")
step(doc, 3, "HSEQ Officer", "Stel vast dat de werkzone vrij is van zichtbaar kwik en dat luchtmetingen de achtergrondwaarde benaderen, en geef de zone formeel vrij.")
step(doc, 4, "HSEQ Officer", "Rapporteer alle metingen, bevindingen en vrijgaven conform de rapportageverplichting van Arbobesluit artikel 4.10 en EU-Kwikverordening artikel 9 [2][3].")
step(doc, 5, "Projectmanager", "Sluit de removaltaak administratief af in het registratiesysteem (hoofdstuk 7).")

heading(doc, "4.5 Opslag Offshore", 2)
para(doc,
     "Tijdelijke opslag offshore is noodzakelijk vanwege de beperkte ruimte, "
     "weersomstandigheden en transportbeperkingen van het platform [audit §2.3]. De opslag "
     "voldoet aan de eisen van Arbobesluit artikel 4.15, EU-Kwikverordening artikel 7 en "
     "de opslagrichtlijnen PGS 6 en PGS 12 [2][3][12][13]. De offshore situatie vraagt om "
     "extra maatregelen bovenop de vaste-landpraktijk: de opslaglocatie moet bestand zijn "
     " tegen zeegang en trillingen, en de logistieke planning is weersafhankelijk, waardoor "
     "de opslagduur vooraf onzeker is en de weekcontrole uit stap 4 onder alle "
     "omstandigheden doorloopt.")
step(doc, 1, "HSEQ Officer", "Wijs een afgesloten, geventileerde en overdekte opslaglocatie aan, buiten doorgangsroutes en buiten direct zonlicht, met lekbak of vloeistofdichte vloer.")
step(doc, 2, "HSEQ Officer", "Gebruik uitsluitend gesloten, degasvormige, chemisch bestendige opslagunits die zijn voorzien van de CLP-etikettering en de H- en P-zinnen uit tabel 4.2 [2][7].")
step(doc, 3, "Uitvoerend Personeel", "Sla vrij vloeibaar kwik gescheiden op van kwikbesmet materiaal (onderdelen, disposables, reinigingsmaterialen) en registreer elke toevoeging in het opslaglogboek.")
step(doc, 4, "HSEQ Officer", "Voorzie elke opslagunit van de volledige CLP-etikettering: naam en CAS-nummer van de stof, de pictogrammen en de H-zinnen H360, H373 en H410 met de bijbehorende P-zinnen, conform Arbobesluit artikel 4.15 en de CLP-verordening [2][7].")
step(doc, 5, "HSEQ Officer", "Controleer de opslaglocatie ten minste wekelijks op lekkage, etikettering en sluiting; bij zeegang of slecht weer geldt een extra inspectie vóór elke transfer [audit §2.3].")
step(doc, 6, "HSEQ Officer", "Beperk de opslagduur tot het minimum dat de offshore logistiek vereist en bereid de transportbatch voor conform paragraaf 4.6 [audit §2.3].")
heading(doc, "4.6 Transport naar Land", 2)
para(doc,
     "Het transport van kwik en kwikbesmet materiaal van platform naar de overstapfaciliteit "
     "aan land voldoet aan Arbobesluit artikel 4.17, EU-Kwikverordening artikel 8 en de Bal "
     "[2][3][5]. Het vervoer over de weg gebeurt uitsluitend met een erkende vervoerder.")
para(doc,
     "De vervoersdocumentatie bevat ten minste de classificatie van de batch, de "
     "hoeveelheden en categorisering van de afvalstromen, de afzender en de beoogde "
     "erkende verwerker, en de contactgegevens voor noodsituaties tijdens het transport "
     "[2][3]. Documentatie en batch zijn door unieke nummers aan elkaar gekoppeld, zodat "
     "elke opslagunit van het platform tot en met de verwerkingsverklaring herleidbaar is.")
step(doc, 1, "Logistiek Coördinator", "Bepaal vooraf de ADR-classificatie van elke batch en stel de bijbehorende vervoersdocumenten op [audit §3.1].")
step(doc, 2, "Logistiek Coördinator", "Selecteer een vervoerder met een geldige vergunning voor het vervoer van gevaarlijke stoffen en verifieer diens referenties [audit §3.1].")
step(doc, 3, "Uitvoerend Personeel", "Zekere de opslagunits tijdens de scheepstransfer tegen verschuiven en kantelen; transfer vindt alleen plaats bij geaccepteerde weers- en zeegangscondities [audit §2.3].")
step(doc, 4, "Uitvoerend Personeel", "Vervoer kwik en kwikbesmet materiaal nooit samen met personenliften; gebruik de daartoe bestemde vrachtruimtes en overslagmiddelen.")
step(doc, 5, "Logistiek Coördinator", "Controleer bij aankomst aan land de sluiting, etikettering en inhoud van elke unit tegen het transportdocument en registreer de overdracht [2].")
step(doc, 6, "HSEQ Officer", "Rapporteer de volledige transportketen tot aan de overstapfaciliteit [3].")

heading(doc, "4.7 Afvoer naar Erkende Verwerker", 2)
para(doc,
     "De afvoer sluit de beheerketen af. EU-Kwikverordening artikel 8 en het Bal stellen "
     "eisen aan de wijze van afvoer en de status van de verwerker [3][5]. De verwerker wordt "
     "vooraf geselecteerd en gecontroleerd op vergunning en acceptatiecriteria; zonder "
     "schriftelijke acceptatie wordt geen batch afgegeven [audit §3.1]. De volledige "
     "afvalstroom — van opslagunit tot verwerkingsverklaring — blijft herleidbaar via de "
     "registraties uit hoofdstuk 7 [2][3].")
step(doc, 1, "Projectmanager", "Selecteer een erkende verwerker met een geldige vergunning voor de verwerking van kwikhoudend afval en verifieer de acceptatiecriteria vooraf [audit §3.1][3].")
step(doc, 2, "HSEQ Officer", "Stel voor elke batch een begeleidingsbrief op met de CLP-classificatie, de codering en de herkomst van de afvalstroom [2][5].")
step(doc, 3, "Logistiek Coördinator", "Overhandig de batch uitsluitend tegen ontvangstbevestiging en met volledige vervoersdocumentatie aan de verwerker [audit §3.1].")
step(doc, 4, "HSEQ Officer", "Verifieer na verwerking de vernietigings- of verwerkingsverklaring en archiveer deze als bewijs van de gesloten afvalstroom [3][5].")
step(doc, 5, "Projectmanager", "Rapporteert de volledige afvoerketen aan de opdrachtgever (Wintershall) en in het registratiesysteem (hoofdstuk 7) [3].")

heading(doc, "4.8 Stopwerk- en Noodsituaties", 2)
para(doc,
     "Elke medewerker heeft stopwerkbevoegdheid bij waargenomen kwikverlies, defecte PBM of "
     "onvoorziene omstandigheden. Bij lekkage of blootstellingsincident wordt de EMVI-procedure "
     "van Arbobesluit artikel 4.11 geactiveerd: onmiddellijke stillegging en verlaten van de "
     "werkzone, alarmering van de OIM en de HSEQ Officer, afscherming van het lekgebied, "
     "opname en containment van het kwik met daartoe bestemde middelen door gekwalificeerd "
     "personeel, decontaminatie van betrokkenen, medische beoordeling en melding conform de "
     "rapportageverplichting [2]. Details staan in hoofdstuk 6.")
para(doc,
     "Een stopwerkbeslissing wordt direct gemeld aan de OIM en de HSEQ Officer, schriftelijk "
     "gemotiveerd vastgelegd en pas opgeheven nadat de oorzaak is geanalyseerd en "
     "gecorrigeerd. Medewerkers die hun stopwerkbevoegdheid gebruiken, worden daarvoor "
     "nooit nadelig behandeld. Recidiverende stopwerkmomenten binnen één fase leiden tot "
     "herbeoordeling van de RI&E en van het plan van aanpak voor die fase [2].")

doc.add_page_break()

# ==================================================================
# 5. VERANTWOORDELIJKHEDEN
# ==================================================================
heading(doc, "5. Verantwoordelijkheden", 1)
para(doc,
     "De volgende rollen worden onderscheiden in dit project. De projectmanager van de "
     "uitvoerende aannemer (Koole) draagt de uitvoeringsverantwoordelijkheid en is "
     "opdrachtnemend aanspreekbaar richting de opdrachtgever (Wintershall). De HSEQ Officer "
     "is inhoudelijk eigenaar van deze procedure, van de RI&E met kwikartikel en van alle "
     "metingen, registraties en rapportages [2][3]. De OIM is eindverantwoordelijk voor de "
     "veiligheid op het platform en geeft werkvergunningen af. Het uitvoerend personeel "
     "voert survey-, removal-, opslag- en transferhandelingen uit en heeft "
     "stopwerkbevoegdheid. De logistiek coördinator beheert de transport- en "
     "overdrachtsdocumentatie, en de erkende verwerker sluit de afvalstroom af met een "
     "verwerkingsverklaring [3][5].")
para(doc,
     "De RACI-matrix hieronder verdeelt de verantwoordelijkheden over deze rollen: "
     "R = Responsible (uitvoerend), A = Accountable (eindverantwoordelijk), "
     "C = Consulted (geconsulteerd), I = Informed (geïnformeerd).")
para(doc, "Tabel 5.1 — RACI-matrix kwikhandling",
     size=9, italic=True, color=DARKGREY, align=WD_ALIGN_PARAGRAPH.LEFT)
make_table(doc,
    ["Activiteit", "Projectmanager", "HSEQ Officer", "OIM", "Uitvoerend Personeel", "Logistiek Coördinator", "Verwerker"],
    [
        ["RI&E en PvA (4.1)", "A", "R", "C", "C", "I", "-"],
        ["Training en voorlichting (4.1)", "A", "R", "C", "I", "I", "-"],
        ["Pre-removal survey (4.2)", "A", "R", "C", "C", "-", "-"],
        ["XRF- en laboratoriummetingen (4.2/4.3/4.4)", "A", "R", "C", "R", "-", "-"],
        ["Removal-activiteiten (4.3)", "A", "C", "C", "R", "-", "-"],
        ["Werkvergunning (4.3)", "C", "R", "A", "I", "-", "-"],
        ["Post-removal verificatie (4.4)", "A", "R", "I", "C", "-", "-"],
        ["Opslag offshore (4.5)", "A", "R", "C", "R", "I", "-"],
        ["Transport naar land (4.6)", "A", "C", "C", "R", "R", "-"],
        ["Afvoer en verwerking (4.7)", "A", "R", "I", "-", "R", "R"],
        ["Noodsituaties en EMVI (4.8/6)", "C", "R", "A", "R", "I", "-"],
        ["Registratie en rapportage (7)", "A", "R", "I", "C", "C", "C"],
    ],
    widths=[4.3, 1.9, 1.9, 1.3, 2.3, 2.3, 1.6], font_size=9)
para(doc,
     "De opdrachtgever (Wintershall) blijft op de hoogte via de rapportages uit hoofdstuk 7 "
     "en heeft inspanningsverplichtingen uit hoofdstuk 4 van de Arbowesluit voor wat betreft "
     "samenwerking en coördinatie op het platform [1].")
doc.add_page_break()
# ==================================================================
# 6. RISICO'S & MITIGATIE
# ==================================================================
heading(doc, "6. Risico's & Mitigatie", 1)
para(doc,
     "De risico's in deze procedure volgen uit de RI&E voor kwik bij offshore decommissioning "
     "en uit de auditbevindingen over historische contaminatie, small piece removal en "
     "offshore logistiek [audit §2.3]. Blootstellingsroutes zijn inhalatie van kwikdamp, "
     "huidcontact en inslikken [audit §3.1]. Het risicoregister wordt vóór elke nieuwe fase "
     "herijkt op basis van de actuele survey- en meetgegevens; nieuwe risico's worden "
     "toegevoegd en afgehandelde risico's worden voorzien van een status. De mitigatie per "
     "risico is teruggekoppeld op de desbetreffende procedureparagraaf, zodat uitvoering "
     "en beheersmaatregel één geheel vormen.")
para(doc, "Tabel 6.1 — Risicoregister kwikhandling (inclusief mitigatie)",
     size=9, italic=True, color=DARKGREY, align=WD_ALIGN_PARAGRAPH.LEFT)
make_table(doc,
    ["#", "Risico", "Route/Trigger", "Mitigatie", "Ref."],
    [
        ["R1", "Inhalatie kwikdamp bij opening van besmette componenten", "Inhalatie; verdamping bij omgevingstemperatuur", "Adembescherming P3 (tabel 4.2), luchtmetingen, afgesloten containment, ventilatie", "[2][7]"],
        ["R2", "Historische kwikcontaminatie in manometers, kleppen en separators", "Inhalatie/huidcontact", "Pre-removal survey met XRF en laboratoriumanalyse (4.2), componenten als verdacht behandelen", "[audit §2.3]"],
        ["R3", "Huidcontact bij hanteren van besmet materiaal", "Huid", "Nitrilhandschoenen, disposable coverall, decontaminatie na elke sessie", "[2][9]"],
        ["R4", "Inslikken via besmette handen of PBM", "Inslikken", "Eten/drinken/roken verboden in werkzone, hygiëneregels, PBM-afvoer", "[2]"],
        ["R5", "Reproductieve schade (H360) bij zwangerschap", "Inhalatie", "Medische surveillance, blootstellingsregistratie, taakontzegging bij zwangerschap of kinderwens", "[2][7]"],
        ["R6", "Doelorgaanschade bij herhaalde blootstelling (H373)", "Inhalatie", "Onderhoud grenswaarden TWA 0,025 / STEL 0,075 mg/m³, periodieke metingen", "[2][11]"],
        ["R7", "Milieuschade bij lekkage naar zee (H410)", "Emissie", "Degasvormige opslagunits, lekbakken, weersgebonden transferbeslissingen", "[3][7]"],
        ["R8", "Lekkage tijdens scheeps- of wegtransport", "Emissie/huid", "ADR-classificatie, beveiliging lading, erkende vervoerder, inspectie vóór/na transfer", "[2][3][5]"],
        ["R9", "Beperkte ruimte en zeegang bij opslag en transfer", "Fysiek/Emissie", "Locatiekeuze buiten doorgangsroutes, extra inspectie bij slecht weer, maximale batchbeperking", "[audit §2.3]"],
        ["R10", "Overschrijding grenswaarde tijdens werkzaamheden", "Inhalatie", "Stopwerkbevoegdheid, stillegging, onderzoek conform artikel 4.10, herstart pas na herstel", "[2]"],
    ],
    widths=[1.0, 3.9, 2.9, 6.0, 2.0], font_size=9)

heading(doc, "6.1 Incidentprocedure (EMVI)", 2)
para(doc, "Bij een lekkage of blootstellingsincident geldt de volgende volgorde:", space_after=4)
step(doc, 1, "Iedereen", "Leg het werk onmiddellijk stil en verlaat de zone via de aangewezen route; alarmeer de OIM en de HSEQ Officer.")
step(doc, 2, "OIM", "Activeer de EMVI-procedure conform Arbobesluit artikel 4.11 en sluit het lekgebied af [2].")
step(doc, 3, "HSEQ Officer", "Laat het lekkende kwik uitsluitend door gekwalificeerd personeel met volledige PBM opnemen en in een gesloten containment plaatsen.")
step(doc, 4, "HSEQ Officer", "Zorg voor decontaminatie van betrokkenen en organiseer medische beoordeling via de bedrijfsarts; spoel bij huidcontact de huid met water en verwijder besmette kleding [10].")
step(doc, 5, "HSEQ Officer", "Registreer het incident, de metingen en de genomen maatregelen en meld conform de rapportageverplichting [2][3].")
para(doc,
     "De eerste hulpmaatregelen volgen de P-zinnen uit de CLP-classificatie: bij inslikken "
     "(P301+P310+P330) onmiddellijk een arts raadplegen en de mond spoelen; bij inademing "
     "(P304+P340+P312) de betrokkene naar frisse lucht brengen, rustig houden en medische "
     "hulp inschakelen [7]. Betrokkenen worden na elk incident door de bedrijfsarts "
     "beoordeeld [2].")

heading(doc, "6.2 Decontaminatie", 2)
para(doc,
     "Decontaminatie is verplicht na elke sessie met mogelijk kwikcontact en conform "
     "EU-Kwikverordening artikel 7 [3]. De volgorde binnen de afgebakende zone is: "
     "(1) reinig gereedschap en herbruikbare PBM met daartoe bestemde middelen; "
     "(2) doff de disposables zonder kruisbesmetting en voer ze direct af als kwikbesmet afval; "
     "(3) controleer handen en gezicht; (4) registreer de decontaminatie in het logboek. "
     "Kwikbesmet materiaal wordt nimmer meegenomen naar leef- of verblijfsruimten [2][3].")

para(doc,
     "Decontaminatievoorzieningen worden vóór de start van elke removalsessie in de "
     "werkzone geparalleld: een afgebakende doff-volgorde, gesloten afvalzakken voor "
     "disposables en een spoelvoorziening voor huidcontact. De HSEQ Officer inspecteert "
     "de paraatheid van deze voorzieningen tijdens de taakrisicobeoordeling en legt de "
     "bevinding vast bij de werkvergunning. Het ontbreken van paraat gestelde decontaminatievoorzieningen is een stopwerkreden [2][3].")

heading(doc, "6.3 Gezondheidssurveillance", 2)
para(doc,
     "Medewerkers met mogelijke kwikblootstelling nemen deel aan medische surveillance "
     "conform Arbobesluit artikel 4.6, uitgevoerd door een bedrijfsarts [2]. De frequentie "
     "en omvang van de onderzoeken worden door de bedrijfsarts vastgesteld op basis van de "
     "blootstellingsbeoordeling uit de RI&E; resultaten worden bewaard in het medisch "
     "dossier van de medewerker [2][audit §2.5].")
doc.add_page_break()

# ==================================================================
# 7. REGISTRATIE & BIJLAGEN
# ==================================================================
heading(doc, "7. Registratie & Bijlagen", 1)
heading(doc, "7.1 Registraties", 2)
para(doc,
     "Alle registraties uit deze procedure vormen het auditieve bewijs van conformiteit en "
     "zijn conform de rapportageverplichtingen van Arbobesluit artikel 4.10 en "
     "EU-Kwikverordening artikel 9 op te vragen door toezichthouders en de opdrachtgever "
     "[2][3].")
para(doc, "Tabel 7.1 — Registratie-overzicht",
     size=9, italic=True, color=DARKGREY, align=WD_ALIGN_PARAGRAPH.LEFT)
make_table(doc,
    ["Registratie", "Eigenaar", "Vorm", "Minimale bewaartermijn"],
    [
        ["RI&E met kwikartikel", "HSEQ Officer", "Document", "Bedrijfsintern vastgesteld"],
        ["Pre-removal survey + XRF-/labresultaten", "HSEQ Officer", "Formulier + rapport", "Bedrijfsintern vastgesteld"],
        ["Werkvergunningen en taak-risicabeoordelingen", "OIM", "Systeem/zwarte kaarten", "Bedrijfsintern vastgesteld"],
        ["Luchtmeetresultaten", "Meetdeskundige", "Meetrapport", "Conform wettelijk kader [2]"],
        ["Opslaglogboek offshore", "HSEQ Officer", "Logboek", "Bedrijfsintern vastgesteld"],
        ["Transport- en overdrachtsdocumenten", "Logistiek Coördinator", "Vervoersdocumentatie", "Conform vervoersregelgeving [2][3]"],
        ["Begeleidingsbrieven en verwerkingsverklaringen", "Projectmanager", "Correspondentie", "Conform Bal [5]"],
        ["Trainings- en instructieregistraties", "HSEQ Officer", "Presentielijsten", "Bedrijfsintern vastgesteld"],
        ["Medische surveillance-dossiers", "Bedrijfsarts", "Medisch dossier", "Conform privacyregelgeving"],
        ["Incidentrapportages (EMVI)", "HSEQ Officer", "Incidentrapport", "Bedrijfsintern vastgesteld"],
    ],
    widths=[6.3, 3.4, 3.6, 3.2], font_size=9)

para(doc,
     "De registraties bevatten ten minste: datum, tijdstip en locatie van de activiteit, "
     "betrokken personen en functies, gebruikte PBM, meetwaarden met meetopstelling en "
     "kalibratiegegevens, classificatie van materiaal (verdacht of bevestigd besmet), "
     "hoeveelheden per afvalstroom, overdrachts- en vervoersreferenties en de handtekening "
     "van de verantwoordelijke functie. Het format wordt vastgesteld door de HSEQ Officer "
     "en sluit aan op de vereisten van de rapportageverplichtingen [2][3]. De bewaartermijnen "
     "uit tabel 7.1 volgen de wettelijke kaders en het interne bewaarbeleid; medische "
     "dossiers vallen onder de privacyregelgeving en blijven buiten het projectdossier [2].")

heading(doc, "7.2 Bijlagen", 2)
bullet(doc, "Bijlage A — Checklist Pre-removal Survey (aparte checklist in de deliverables-map van dit project).")
bullet(doc, "Bijlage B — PBM-matrix (tabel 4.2 van deze procedure).")
bullet(doc, "Bijlage C — EMVI-kaart kwik (paragraaf 6.1 van deze procedure).")
bullet(doc, "Bijlage D — Referenties (onderstaande lijst).")
para(doc,
     "Bijlage A (checklist pre-removal survey) is als afzonderlijk formulier opgenomen in "
     "de deliverables van dit project en volgt de acht stappen uit paragraaf 4.2. Bijlage B "
     "en Bijlage C zijn integraal onderdeel van dit document (tabel 4.2 respectievelijk "
     "paragraaf 6.1) en worden voor dagelijks gebruik afzonderlijk geprint en op het "
     "platform zichtbaar opgehangen. Bijlage D vermeldt alle referenties inclusief de "
     "artikelgranulaire toelichtingen [18] t/m [34].")

heading(doc, "7.3 Referenties", 2)
para(doc,
     "De referenties [1] t/m [17] volgen de referentielijst van het auditdossier. De "
     "referenties [18] t/m [34] zijn artikelgranulaire toelichtingen op dezelfde bronnen en "
     "dienen om in de praktijk rechtstreeks naar de juiste wetsartikelen te navigeren. "
     "Tabel 7.2 verbindt de belangrijkste procedureonderdelen aan hun wettelijke grondslag.")
refs = [
    "Arbeidsomstandighedenwet (Arbowet), versie 01-01-2025 tot heden.",
    "Arbeidsomstandighedenbesluit (Arbobesluit), hoofdstuk 4 — Gevaarlijke stoffen, versie 26-05-2025.",
    "Europese Kwikverordening (EU) 2017/852.",
    "Besluit kwik en kwikhoudende producten.",
    "Besluit activiteiten leefomgeving (Bal).",
    "REACH Verordening (EG) 1907/2006.",
    "CLP Verordening (EG) 1272/2008.",
    "AI-blad 31: Gevaarlijke stoffen (2025).",
    "AI-blad 18: Persoonlijke beschermingsmiddelen (2025).",
    "AI-blad 64: Laboratoria (2025).",
    "SER-Grenswaarden (wettelijke grenswaarden).",
    "PGS 6: Publicatiereeks Gevaarlijke Stoffen — opslag en handling.",
    "PGS 12: Publicatiereeks Gevaarlijke Stoffen — richtlijnen voor gevaarlijke stoffen.",
    "RIVM / ZZS-richtlijnen voor kwik.",
    "NOGEPA — Nederlandse brancherichtlijnen offshore.",
    "KNMT — richtlijnen voor kwik (buiten scope, geraadpleegd ter afbakening).",
    "Auditdossier 2026-audit-koole-mercury-003057 — HSEQ Compliance Audit Koole procedure 003.057 Safe Handling of Mercury Rev 1, JvG Consultancy, 24-08-2026.",
    "Arbobesluit artikel 4.1 — risico-inventarisatie en -evaluatie gevaarlijke stoffen.",
    "Arbobesluit artikel 4.2 — plan van aanpak gevaarlijke stoffen.",
    "Arbobesluit artikel 4.3 — voorlichting en onderricht werknemers.",
    "Arbobesluit artikel 4.5 — persoonlijke beschermingsmiddelen.",
    "Arbobesluit artikel 4.6 — gezondheidsonderzoek werknemers.",
    "Arbobesluit artikel 4.7 — grenswaarden blootstelling.",
    "Arbobesluit artikel 4.10 — metingen blootstelling gevaarlijke stoffen.",
    "Arbobesluit artikel 4.11 — nood- en eerste hulpinformatie (EMVI).",
    "Arbobesluit artikel 4.12 — veiligheidsinformatiebladen.",
    "Arbobesluit artikel 4.15 — etikettering, verpakking en opslag.",
    "Arbobesluit artikel 4.17 — vervoer en afvoer gevaarlijke stoffen.",
    "EU-Kwikverordening (EU) 2017/852, artikel 5 — voorlichting en etikettering.",
    "EU-Kwikverordening (EU) 2017/852, artikel 7 — persoonlijke bescherming, opslag en decontaminatie.",
    "EU-Kwikverordening (EU) 2017/852, artikel 8 — transport en afvoer.",
    "EU-Kwikverordening (EU) 2017/852, artikel 9 — meting en rapportage.",
    "REACH Verordening (EG) 1907/2006, artikel 31 — verstrekken veiligheidsinformatieblad.",
    "CLP Verordening (EG) 1272/2008, artikelen 31 en 33 — etikettering en informatieverstrekking in de leveringsketen.",
]
for i, ref in enumerate(refs, 1):
    p = doc.add_paragraph()
    p.paragraph_format.left_indent = Cm(0.9)
    p.paragraph_format.first_line_indent = Cm(-0.9)
    p.paragraph_format.space_after = Pt(3)
    set_font(p.add_run("[%d]  " % i), bold=True)
    set_font(p.add_run(ref))

para(doc, "Tabel 7.2 — Wettelijke grondslag per procedureonderdeel",
     size=9, italic=True, color=DARKGREY, align=WD_ALIGN_PARAGRAPH.LEFT, space_before=8)
make_table(doc,
    ["Procedureonderdeel", "Paragraaf", "Wettelijke grondslag"],
    [
        ["RI&E met kwikartikel", "4.1", "Arbobesluit art. 4.1 [18]"],
        ["Plan van aanpak", "4.1 / 4.2", "Arbobesluit art. 4.2 [19]"],
        ["Voorlichting en training", "4.1", "Arbobesluit art. 4.3 [20]; EU 2017/852 art. 5 [29]"],
        ["PBM-specificatie en beschikbaarstelling", "4.1", "Arbobesluit art. 4.5 [21]; EU 2017/852 art. 7 [30]"],
        ["Medische surveillance", "6.3", "Arbobesluit art. 4.6 [22]"],
        ["Grenswaarden TWA/STEL", "4.1", "Arbobesluit art. 4.7 [23]; SER [11]"],
        ["Luchtmeetprotocol", "4.2 / 4.3 / 4.4", "Arbobesluit art. 4.10 [24]; EU 2017/852 art. 9 [32]"],
        ["Nood- en eerste hulpinformatie", "4.8 / 6.1", "Arbobesluit art. 4.11 [25]"],
        ["Veiligheidsinformatiebladen", "4.1", "Arbobesluit art. 4.12 [26]; REACH art. 31 [33]"],
        ["Etikettering en opslag", "4.1 / 4.5", "Arbobesluit art. 4.15 [27]; CLP art. 31/33 [34]; PGS 6/12 [12][13]"],
        ["Transport en afvoer", "4.6 / 4.7", "Arbobesluit art. 4.17 [28]; EU 2017/852 art. 8 [31]; Bal [5]"],
    ],
    widths=[6.4, 3.2, 6.8], font_size=9)

heading(doc, "7.4 Versiebeheer en Periodieke Evaluatie", 2)
para(doc,
     "Deze procedure heeft versienummer 1.0 en wordt beheerd door de HSEQ Officer. "
     "Wijzigingen worden vastgelegd in een versiehistorie en opnieuw goedgekeurd door de "
     "Director of Operations. Conform de aanbevelingen uit de compliance audit geldt een "
     "halfjaarlijkse periodieke audit op de conformiteit van uitvoering, certificaten, "
     "metingen en registraties [audit §5.2]. Daarnaast is een feedbackmechanisme ingericht "
     "waarmel het uitvoerend personeel praktische verbeterpunten kan aanmelden; deze worden "
     "bij de eerstvolgende evaluatie beoordeeld en verwerkt [audit §5.2]. Na het beschikbaar "
     "komen van de originele brondocumentatie (procedure 003.057 van de uitvoerende aannemer) "
     "en de Tier 3-bronnen (AI-bladen 2025, PGS 6/12, NOGEPA) wordt deze procedure opnieuw "
     "getoetst en zo nodig aangevuld [audit §5.2]. Vragen over de toepassing van deze "
     "procedure worden gericht aan de HSEQ Officer als beheerder van dit document.")

para(doc,
     "Gebruik van deze procedure door derden is uitsluitend toegestaan na schriftelijke "
     "toestemming van JvG Consultancy. De procedure weerspiegelt de kennisstatus per de "
     "datum op de titelpagina; bij wijzigende wetgeving of nieuwe auditbevindingen wordt "
     "een nieuwe versie uitgegeven conform paragraaf 7.4.")

para(doc, "EINDE VAN DE PROCEDURE", bold=True, color=PRIMARY,
     align=WD_ALIGN_PARAGRAPH.CENTER, space_before=18)

# ------------------------------------------------------------------
# Opslaan
# ------------------------------------------------------------------
OUT = "/root/projects/jg/2026-audit-koole-mercury-003057/deliverables/docx/Kwik_Handling_Procedure_v1.0.docx"
doc.save(OUT)
print("Opgeslagen:", OUT)
