#!/usr/bin/env python3
"""Contractor Management & Aansprakelijkheid — v3.0
   Met websearch-aanvullingen: OSPAR, Mijnbouwwet, Koole, Wintershall
   JvG Consultancy — 20 mei 2026"""
import os, json
from docx import Document
from docx.shared import Cm, Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import nsdecls
from docx.oxml import parse_xml

doc = Document()
doc.core_properties.title = "Contractor Management & Aansprakelijkheid v3.0 — Wintershall/Koole"
doc.core_properties.author = "JvG Consultancy"
doc.core_properties.keywords = "contractor management; aansprakelijkheid; offshore; ontmanteling; Wintershall; Koole; small piece removal; ketenaansprakelijkheid; OSPAR; Mijnbouwwet"
doc.core_properties.category = "HSEQ Onderzoeksrapport"

PRIMARY = RGBColor(0x00, 0x33, 0x66); WHITE = RGBColor(0xFF, 0xFF, 0xFF)
DARK = RGBColor(0x1F, 0x29, 0x37); GRAY = RGBColor(0x37, 0x41, 0x51)
LIGHT_GRAY = RGBColor(0x6B, 0x72, 0x80); SUCCESS = RGBColor(0x00, 0xA8, 0x59)
WARNING = RGBColor(0xF5, 0x9E, 0x0B); ERROR = RGBColor(0xEF, 0x44, 0x44)

style = doc.styles['Normal']; style.font.name = 'Calibri'; style.font.size = Pt(11); style.font.color.rgb = DARK
for lvl in ['Heading 1', 'Heading 2', 'Heading 3']:
    h = doc.styles[lvl]; h.font.name = 'Calibri'; h.font.color.rgb = PRIMARY; h.font.bold = True

def scs(cell, color):
    cell._tc.get_or_add_tcPr().append(parse_xml(f'<w:shd {nsdecls("w")} w:fill="{color}"/>'))

def ast(doc, headers, rows, cw=None):
    t = doc.add_table(rows=1+len(rows), cols=len(headers)); t.style = 'Table Grid'; t.alignment = WD_TABLE_ALIGNMENT.CENTER
    bh = f"{PRIMARY[0]:02X}{PRIMARY[1]:02X}{PRIMARY[2]:02X}"
    for i,h in enumerate(headers):
        c = t.rows[0].cells[i]; c.text = ''; p = c.paragraphs[0]; r = p.add_run(h)
        r.bold = True; r.font.color.rgb = WHITE; r.font.size = Pt(10); scs(c, bh)
    for ri, rd in enumerate(rows):
        for ci, v in enumerate(rd):
            c = t.rows[ri+1].cells[ci]; c.text = ''; p = c.paragraphs[0]; r = p.add_run(str(v))
            r.font.size = Pt(9)
            if ri % 2 == 1: scs(c, "F8F9FA")
    if cw:
        for i,w in enumerate(cw):
            for row in t.rows: row.cells[i].width = Cm(w)
    return t

def bh(doc, text, level=1):
    h = doc.add_heading(text, level=level)
    for run in h.runs: run.font.color.rgb = PRIMARY; run.font.name = 'Calibri'
    return h

def afl(doc):
    for s in doc.sections:
        h = s.header; h.is_linked_to_previous = False
        ht = h.add_table(rows=1, cols=2, width=Cm(16)); ht.alignment = WD_TABLE_ALIGNMENT.CENTER
        lc = ht.rows[0].cells[0]; lc.text = ''
        p = lc.paragraphs[0]; r = p.add_run("Contractor Management & Aansprakelijkheid v3.0")
        r.bold = True; r.font.color.rgb = PRIMARY; r.font.size = Pt(10)
        rc = ht.rows[0].cells[1]; rc.text = ''
        p = rc.paragraphs[0]; p.alignment = WD_ALIGN_PARAGRAPH.RIGHT
        lp = '/root/projects/jg/assets/branding/jvg-logo-white-medium.png'
        if os.path.exists(lp):
            r = p.add_run(); r.add_picture(lp, width=Cm(2.0), height=Cm(1.8))
        else:
            r = p.add_run("JvG Consultancy"); r.font.color.rgb = PRIMARY
        f = s.footer; f.is_linked_to_previous = False
        p = f.paragraphs[0]; p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        r = p.add_run("JvG Consultancy | Safety - Governance - Advisory | 2026 | Pagina ")
        r.font.size = Pt(8); r.font.color.rgb = LIGHT_GRAY
        f1 = parse_xml(f'<w:fldChar {nsdecls("w")} w:fldCharType="begin"/>')
        it = parse_xml(f'<w:instrText {nsdecls("w")} xml:space="preserve">PAGE</w:instrText>')
        f2 = parse_xml(f'<w:fldChar {nsdecls("w")} w:fldCharType="end"/>')
        r._r.append(f1); r._r.append(it); r._r.append(f2)

# ═══ VOORBLAD ═══
doc.add_paragraph(); doc.add_paragraph()
p = doc.add_paragraph(); p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run("ONDERZOEKSRAPPORT v3.0"); r.bold = True; r.font.size = Pt(14); r.font.color.rgb = LIGHT_GRAY
p = doc.add_paragraph(); p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run("Contractor Management en Aansprakelijkheid"); r.bold = True; r.font.size = Pt(26); r.font.color.rgb = PRIMARY
p = doc.add_paragraph(); p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run("bij Offshore Ontmanteling"); r.bold = True; r.font.size = Pt(20); r.font.color.rgb = PRIMARY
doc.add_paragraph()
p = doc.add_paragraph(); p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run("Wintershall Noordzee B.V. | Koole Contractors B.V.")
r.font.size = Pt(12); r.font.color.rgb = GRAY
p = doc.add_paragraph(); p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run("Small Piece Removal & Decommissioning — Noordzee")
r.font.size = Pt(11); r.font.color.rgb = GRAY
doc.add_paragraph(); doc.add_paragraph()
it = doc.add_table(rows=7, cols=2); it.alignment = WD_TABLE_ALIGNMENT.CENTER
for i,(l,v) in enumerate([
    ("Project:","Contractor Management & Aansprakelijkheid — Offshore Ontmanteling"),
    ("Opdrachtgever:","Wintershall Noordzee B.V."),("Aannemer:","Koole Contractors B.V."),
    ("Type:","Onderzoeksrapport / Juridisch-HSEQ Analyse"),
    ("Auteur:","JvG Consultancy"),("Versie:","3.0"),("Datum:","20 mei 2026"),
]):
    it.rows[i].cells[0].text = ''; p = it.rows[i].cells[0].paragraphs[0]; r = p.add_run(l); r.bold = True; r.font.size = Pt(10)
    it.rows[i].cells[1].text = ''; p = it.rows[i].cells[1].paragraphs[0]; r = p.add_run(v); r.font.size = Pt(10)
doc.add_paragraph()
p = doc.add_paragraph(); p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run("Vertrouwelijk — Alleen voor intern gebruik"); r.italic = True; r.font.size = Pt(9); r.font.color.rgb = LIGHT_GRAY
doc.add_page_break()

# ═══ INHOUDSOPGAVE ═══
bh(doc,"Inhoudsopgave")
for item in [
    "1. Samenvatting en Leeswijzer",
    "2. Projectcontext: Wintershall en Koole",
    "3. Juridisch Kader — Publiekrechtelijk",
    "4. Juridisch Kader — Privaatrechtelijk en Contractueel",
    "5. Werkgeversaansprakelijkheid (Art. 7:658 BW)",
    "6. Ketenaansprakelijkheid en Inlenersaansprakelijkheid",
    "7. Contractuele Verantwoordelijkheidsverdeling",
    "8. SodM-Toezicht en Meldingsplichten",
    "9. OSPAR Decision 98/3 en Mijnbouwwet",
    "10. Conclusie en Aanbevelingen",
    "Bronnen",
    "TierVerify Log",
]:
    p = doc.add_paragraph(); r = p.add_run(item); r.font.size = Pt(10)
doc.add_page_break()

# ═══ HOOFDSTUK 1 ═══
bh(doc,"1. Samenvatting en Leeswijzer")
doc.add_paragraph("Dit rapport (v3.0) is de definitieve versie van het onderzoeksrapport 'Contractor Management en Aansprakelijkheid bij Offshore Ontmanteling'. Het bouwt voort op v1.0 (algemene kaders) en v2.0 (juridische analyse), en voegt actuele informatie toe verkregen via websearch (Tavily API en Z.AI web-search-prime). [1][2][3][12]")
p = doc.add_paragraph(); r = p.add_run("Centrale vraag:"); r.bold = True
doc.add_paragraph("Hoe zijn de contractuele verantwoordelijkheden en aansprakelijkheden verdeeld tussen Wintershall als opdrachtgever en Koole als contractor voor het 'Small Piece Removal' project, en welke juridische en HSEQ-risico's zijn hierbij van toepassing?")
doc.add_paragraph("Dit rapport is als volgt opgebouwd:")
ast(doc,["Hoofdstuk","Onderwerp"],[
    ["2","Projectcontext: Wintershall en Koole"],
    ["3","Juridisch kader — Publiekrechtelijk (Arbowet, Mijnbouwwet, SodM)"],
    ["4","Juridisch kader — Privaatrechtelijk en Contractueel (BW, contracten)"],
    ["5","Werkgeversaansprakelijkheid (Art. 7:658 BW)"],
    ["6","Ketenaansprakelijkheid en Inlenersaansprakelijkheid"],
    ["7","Contractuele verantwoordelijkheidsverdeling Wintershall vs Koole"],
    ["8","SodM-toezicht en meldingsplichten"],
    ["9","OSPAR Decision 98/3 en Mijnbouwwet (met websearch-aanvullingen)"],
    ["10","Conclusie en aanbevelingen"],
],cw=[2,11])
doc.add_page_break()

# ═══ HOOFDSTUK 2 ═══
bh(doc,"2. Projectcontext: Wintershall en Koole")
bh(doc,"2.1 Wintershall Noordzee B.V. — Opdrachtgever", level=2)
doc.add_paragraph("Wintershall Noordzee B.V. is een van de grootste olie- en gasproducerende bedrijven op de Nederlandse Noordzee. Het bedrijf is verantwoordelijk voor de productie, het onderhoud en uiteindelijk de decommissioning van offshore installaties. In de rol van opdrachtgever draagt Wintershall de eindverantwoordelijkheid voor de veiligheid van alle werkzaamheden op haar installaties, ook wanneer deze worden uitgevoerd door contractors. [1][3]")
doc.add_paragraph("Als vergunninghouder op grond van de Mijnbouwwet is Wintershall wettelijk verantwoordelijk voor het veilig ontmantelen van haar installaties. Deze verantwoordelijkheid kan niet worden 'uitbesteed' aan een contractor — zelfs niet contractueel. [9]")
doc.add_paragraph("Uit de Ontmantelingsplannen (bijv. Wingate DP) blijkt dat Wintershall de voorkeur geeft aan campagne-gewijze ontmanteling, waarbij meerdere faciliteiten in een gezamenlijke campagne worden verwijderd. Dit heeft directe gevolgen voor de planning en uitvoering van het Small Piece Removal project. [12]")

bh(doc,"2.2 Koole Contractors B.V. — Aannemer", level=2)
doc.add_paragraph("Koole Contractors B.V. is een internationaal bedrijf gespecialiseerd in industriale ontmanteling, salvaging, wrak verwijdering en offshore decommissioning. Het bedrijf beschikt over gespecialiseerde uitrusting (kraanschepen, anker handling tugs) en getraind personeel voor complexe offshore operaties. [13][14]")
doc.add_paragraph("Koole's kerncompetenties voor dit project zijn: offshore decommissioning van einde-levensduur assets, industriele demolitie, en het circulair verwerken van gematerialen. Het bedrijf heeft een eigen decommissioning yard in de Amsterdamse haven. [14][15]")
doc.add_paragraph("Als aannemer is Koole verantwoordelijk voor de daadwerkelijke uitvoering van het werk, inclusief het inrichten van de werkplek, het aanstellen van gekwalificeerd personeel, het vaststellen van werkmethoden en het borgen van de veiligheid van het eigen personeel. [2][4]")
doc.add_paragraph("Koole is verplicht om te voldoen aan de VCA-eisen en moet beschikken over een geldig VCA-certificaat. Daarnaast moet Koole beschikken over een actuele RI&E, een Plan van Aanpak en getraind personeel conform de eisen van de Arbocatalogus. [2][4]")

bh(doc,"2.3 Relatie Opdrachtgever-Aannemer", level=2)
doc.add_paragraph("De relatie tussen Wintershall en Koole is geregeld in een overeenkomst (contract) waarin de rechten en verplichtingen van beide partijen zijn vastgelegd. In de offshore sector wordt veelal gebruik gemaakt van gestandaardiseerde contractvormen zoals de LOGIC (Leading Oil and Gas Industry Contracts) of eigen contractmodellen. [3]")
doc.add_paragraph("Belangrijk is dat de contractuele verantwoordelijkheid niet losstaat van de wettelijke verantwoordelijkheid. Zelfs als het contract bepaalt dat Koole verantwoordelijk is voor de uitvoering van het werk, blijft Wintershall als opdrachtgever een eigen zorgplicht op grond van de Arbowet en het Burgerlijk Wetboek. [1][3]")
doc.add_page_break()

# ═══ HOOFDSTUK 3 ═══
bh(doc,"3. Juridisch Kader — Publiekrechtelijk")
bh(doc,"3.1 Arbowet en Arbobesluit", level=2)
doc.add_paragraph("De Arbowet vormt het primaire wettelijke kader voor arbeidsomstandigheden in Nederland. Voor de offshore sector zijn de volgende artikelen van bijzonder belang: [1]")
ast(doc,["Artikel","Inhoud","Toepassing"],[
    ["Art. 3","Algemene zorgplicht werkgever","Wintershall en Koole moeten alles redelijkerwijs doen om ongevallen te voorkomen"],
    ["Art. 4","Beleid arbeidsomstandigheden","RI&E verplicht, afgestemd op de risico's van small piece removal"],
    ["Art. 5","Risico-inventarisatie en -evaluatie","Specifieke RI&E voor offshore ontmanteling"],
    ["Art. 9","Meldingsplicht ongevallen","Ernstige ongevallen direct melden bij SodM"],
    ["Art. 10","Deskundige dienst","Arbodienst of externe deskundige verplicht"],
    ["Art. 13","Tewerkstelling door derden","Werkgever blijft verantwoordelijk bij inlening van personeel"],
    ["Art. 14","Tewerkstelling in onderneming van derde","Opdrachtgever moet toezien op naleving door contractor"],
],cw=[2,5,7])

bh(doc,"3.2 Mijnbouwwet en Mijnbouwregeling", level=2)
doc.add_paragraph("De Mijnbouwwet regelt de opsporing en winning van delfstoffen, inclusief de veiligheid van offshore installaties. Voor decommissioning zijn de volgende bepalingen relevant: [9][16]")
doc.add_paragraph("Art. 35 Mijnbouwwet: De vergunninghouder (Wintershall) is verantwoordelijk voor het veilig ontmantelen van installaties.", style='List Bullet')
doc.add_paragraph("Art. 36 Mijnbouwwet: Bij decommissioning dient een Ontmantelingsplan te worden opgesteld en goedgekeurd door de Minister van Economische Zaken.", style='List Bullet')
doc.add_paragraph("Mijnbouwregeling: Nadere regels voor de uitvoering van werkzaamheden op offshore installaties, inclusief eisen aan personeel, materialen en procedures.", style='List Bullet')
doc.add_paragraph("Uit de Ontmantelingsplannen blijkt dat de Minister toestemming verleent onder voorwaarden, waaronder het indienen van een milieu-effectrapportage en het voldoen aan OSPAR-eisen. [12][16]")

bh(doc,"3.3 Staatstoezicht op de Mijnen (SodM)", level=2)
doc.add_paragraph("Het Staatstoezicht op de Mijnen (SodM) is de primaire toezichthouder voor de offshore sector in Nederland. SodM handhaaft de Arbowet, de Mijnbouwwet en het Arbobesluit op offshore installaties. [1][3]")
doc.add_paragraph("Bevoegdheden van SodM:", style='List Bullet')
doc.add_paragraph("Inspecties uitvoeren op offshore installaties.", style='List Bullet')
doc.add_paragraph("Onderzoeken instarten naar ongevallen en incidenten.", style='List Bullet')
doc.add_paragraph("Bestuurlijke boetes opleggen bij overtredingen.", style='List Bullet')
doc.add_paragraph("Verbod op het uitvoeren van werkzaamheden bij ernstig gevaar.", style='List Bullet')
doc.add_paragraph("Aansprakelijkheidsnastreving bij beboetbare feiten.", style='List Bullet')
doc.add_page_break()

# ═══ HOOFDSTUK 4 ═══
bh(doc,"4. Juridisch Kader — Privaatrechtelijk en Contractueel")
bh(doc,"4.1 Burgerlijk Wetboek — Werkgeversaansprakelijkheid", level=2)
doc.add_paragraph("Het Burgerlijk Wetboek (BW) vormt het privaatrechtelijke kader voor aansprakelijkheid. De belangrijkste bepalingen voor contractor management zijn: [1][3]")
ast(doc,["Artikel","Inhoud","Relevantie"],[
    ["Art. 7:658 BW","Werkgever is aansprakelijk voor schade die werknemer lijdt bij werk","Basis van werkgeversaansprakelijkheid"],
    ["Art. 7:659 BW","Bewijslast rust op werkgever","Werkgever moet aantonen dat hij aan zorgplicht heeft voldaan"],
    ["Art. 7:660 BW","Aansprakelijkheid voor ondergeschikten","Werkgever aansprakelijk voor fouten van werknemers"],
    ["Art. 7:661 BW","Aansprakelijkheid voor derden","Werkgever aansprakelijk voor fouten van ingeschakelde derden"],
    ["Art. 6:162 BW","Onrechtmatige daad","Aansprakelijkheid voor schade aan derden"],
    ["Art. 6:170 BW","Aansprakelijkheid voor ondernemingsrisico","Onderneming aansprakelijk voor risico's van bedrijfsuitoefening"],
],cw=[2.5,5,6.5])

bh(doc,"4.2 Contractuele Verhouding", level=2)
doc.add_paragraph("In de offshore sector worden doorgaans gestandaardiseerde contractvormen gebruikt. De belangrijkste zijn: [3]")
ast(doc,["Contracttype","Kenmerk","Toepassing"],[
    ["LOGIC Contracts","Standaard offshore contracten, ontwikkeld door de UK oil & gas industrie","Veel gebruikt in Noordzee-projecten"],
    ["Nederlandse contracten","Op maat gemaakt, gebaseerd op BW","Voor Nederlandse opdrachtgevers/aannemers"],
    ["Tijd en Materie","Facturering op basis van gemaakte uren en gebruikte materialen","Voor ontmantelingsprojecten met onzeker scope"],
    ["Lump Sum","Vast bedrag voor gedefinieerd werk","Voor goed omschreven decommissioning-activiteiten"],
],cw=[3,5,6])
doc.add_paragraph("Voor het Small Piece Removal project is het waarschijnlijk gebruik gemaakt van een Tijd en Materie contract, gezien de onzekerheid in de scope en de complexiteit van het werk. [3]")
doc.add_page_break()

# ═══ HOOFDSTUK 5 ═══
bh(doc,"5. Werkgeversaansprakelijkheid (Art. 7:658 BW)")
doc.add_paragraph("De werkgeversaansprakelijkheid is de kern van de privaatrechtelijke bescherming van werknemers. Artikel 7:658 BW bepaalt dat de werkgever aansprakelijk is voor de schade die de werknemer lijdt bij de uitoefening van zijn werk, tenzij de werkgever aantoont dat hij aan zijn zorgverplichting heeft voldaan. [1][3]")
bh(doc,"5.1 De Zorgplicht van de Werkgever", level=2)
doc.add_paragraph("De zorgplicht omvat: [1]")
doc.add_paragraph("Het inrichten en onderhouden van lokalen, werktuigen en gereedschappen op een veilige wijze.", style='List Bullet')
doc.add_paragraph("Het treffen van zodanige regelingen als redelijkerwijs nodig is ter voorkoming van ongevallen.", style='List Bullet')
doc.add_paragraph("Het geven van adequate voorlichting en instructie aan werknemers.", style='List Bullet')
doc.add_paragraph("Het toezien op de naleving van veiligheidsvoorschriften.", style='List Bullet')
doc.add_paragraph("Het beschikbaar stellen van adequate persoonlijke beschermingsmiddelen.", style='List Bullet')
bh(doc,"5.2 Bewijslast", level=2)
doc.add_paragraph("De bewijslast rust op de werkgever (Art. 7:659 BW). Dit betekent dat bij een arbeidsongeval de werkgever moet aantonen dat hij aan zijn zorgverplichting heeft voldaan. Dit kan door overlegging van: [1]")
doc.add_paragraph("Een actuele risico-inventarisatie en -evaluatie (RI&E).", style='List Bullet')
doc.add_paragraph("Een plan van aanpak met genomen maatregelen.", style='List Bullet')
doc.add_paragraph("Opleidingsbewijzen en certificaten van betrokken personeel.", style='List Bullet')
doc.add_paragraph("Inspectierapporten van werktuigen en gereedschappen.", style='List Bullet')
doc.add_paragraph("Registratie van voorlichting en toolboxmeetings.", style='List Bullet')
bh(doc,"5.3 Uitzondering: Opzet of Bewuste Roekeloosheid", level=2)
doc.add_paragraph("De werkgever kan zich alleen van aansprakelijkheid bevrijden als de schade in belangrijke mate het gevolg is van opzet of bewuste roekeloosheid van de werknemer. Deze uitzondering is zeer eng uitgelegd in de jurisprudentie: [1][17]")
doc.add_paragraph("Opzet: De werknemer heeft bewust het risico genomen om schade te lijden.", style='List Bullet')
doc.add_paragraph("Bewuste roekeloosheid: De werknemer wist dat er een aanzienlijk risico was, maar heeft dit risico bewust aanvaard.", style='List Bullet')
doc.add_paragraph("In de praktijk heeft het afwentelen van aansprakelijkheid op grond van opzet of bewuste roekeloosheid doorgaans weinig kans van slagen. De Hoge Raad heeft dit beperkt tot zeer extreme gevallen (HR 20 september 1996, Pollemans/Hoondert). [1][17]")
doc.add_page_break()

# ═══ HOOFDSTUK 6 ═══
bh(doc,"6. Ketenaansprakelijkheid en Inlenersaansprakelijkheid")
bh(doc,"6.1 Ketenaansprakelijkheid", level=2)
doc.add_paragraph("Bij offshore ontmanteling is er sprake van een keten van aansprakelijkheid. De keten loopt van opdrachtgever (Wintershall) via aannemer (Koole) naar eventuele onderaannemers. Elke schakel in de keten draagt een deel van de verantwoordelijkheid. [1][3]")
ast(doc,["Schakel","Rol","Aansprakelijkheid"],[
    ["Opdrachtgever (Wintershall)","Eindverantwoordelijke voor veiligheid op de installatie","Zowel publiekrechtelijk (Arbowet) als privaatrechtelijk (BW)"],
    ["Aannemer (Koole)","Verantwoordelijk voor uitvoering en eigen personeel","Privaatrechtelijk jegens eigen werknemers; contractueel jegens Wintershall"],
    ["Onderaannemer","Verantwoordelijk voor eigen deel van het werk","Privaatrechtelijk jegens eigen werknemers; contractueel jegens Koole"],
],cw=[3,5,6])
doc.add_paragraph("Belangrijk: De ketenaansprakelijkheid betekent dat Wintershall niet kan volstaan met het verwijzen naar Koole als aannemer. Wintershall behoudt een eigen onderzoeksplicht en zorgplicht. [1]")

bh(doc,"6.2 Inlenersaansprakelijkheid (Art. 7:661 BW)", level=2)
doc.add_paragraph("Artikel 7:661 BW regelt de aansprakelijkheid van de inlenende werkgever. Als een werkgever (Wintershall) een werknemer (via Koole) inlenst bij een andere onderneming, en die werknemer schade lijdt, dan is de inlenende werkgever (Wintershall) aansprakelijk alsof hij zelf tekort is geschoten. [1]")
doc.add_paragraph("Art. 7:658 lid 4 BW strekt de aansprakelijkheid uit tot anderen die in het kader van het bedrijf worden ingeschakeld. Dit betekent dat Wintershall ook aansprakelijk kan worden gesteld voor schade aan personeel van Koole, ook al zijn deze niet in dienst van Wintershall. [1][17]")
doc.add_paragraph("Dit heeft concrete gevolgen:", style='List Bullet')
doc.add_paragraph("Wintershall aansprakelijk kan worden gesteld voor schade aan Koole-personeel.", style='List Bullet')
doc.add_paragraph("Koole is aansprakelijk jegens eigen werknemers op grond van Art. 7:658 BW.", style='List Bullet')
doc.add_paragraph("De werknemer kan zowel Wintershall als Koole aanspreken.", style='List Bullet')
doc.add_page_break()

# ═══ HOOFDSTUK 7 ═══
bh(doc,"7. Contractuele Verantwoordelijkheidsverdeling Wintershall vs Koole")
doc.add_paragraph("De contractuele verantwoordelijkheidsverdeling tussen Wintershall en Koole is het hart van dit onderzoek. Hieronder wordt per onderwerp de verdeling uiteengezet. [2][3][4]")
ast(doc,["Onderwerp","Wintershall (Opdrachtgever)","Koole (Aannemer)"],[
    ["Veiligheidsbeleid","Stelt het algemene veiligheidsbeleid vast; eisen in contract","Voert beleid uit; eigen HSEQ-procedures"],
    ["RI&E","Verifieert aanwezigheid en kwaliteit RI&E van Koole","Stelt RI&E op voor eigen werkzaamheden"],
    ["PTW Systeem","Stelt PTW-systeem vast; vergunningverlening","Vraagt PTW aan; voert werk conform vergunning"],
    ["Personeelskeuring","Stelt eisen aan competentie en training","Selecteert en traint eigen personeel"],
    ["PBM","Stelt eisen aan PBM in contract","Verstrekt en bewaakt gebruik PBM"],
    ["Incidentenonderzoek","Neemt deel aan onderzoek; eist rapportage","Voert onderzoek uit; rapporteert aan Wintershall"],
    ["Melden bij SodM","Eindverantwoordelijkheid voor melding","Directe melding bij eigen leiding; informeert Wintershall"],
    ["Verzekeringen","Stelt eisen aan dekkingen in contract","Sluit verzekeringen af; bewijs aan Wintershall"],
    ["Ontmantelingsplan","Stelt plan op; indient bij Minister","Voert werk conform Ontmantelingsplan"],
    ["OSPAR-compliance","Eindverantwoordelijkheid voor volledige verwijdering","Voert verwijdering uit volgens specificaties"],
],cw=[2.5,5.2,5.3])
doc.add_page_break()

# ═══ HOOFDSTUK 8 ═══
bh(doc,"8. SodM-Toezicht en Meldingsplichten")
bh(doc,"8.1 Meldingsplicht (Art. 9 Arbowet)", level=2)
doc.add_paragraph("Bij ernstige ongevallen en bedrijfsongevallen is er een directe meldingsplicht bij het SodM. Ernstige ongevallen zijn: [1]")
doc.add_paragraph("Ongevallen met dodelijke afloop.", style='List Bullet')
doc.add_paragraph("Ongevallen met ernstig letsel (opname in ziekenhuis, blijvend letsel).", style='List Bullet')
doc.add_paragraph("Bedrijfsongevallen met een ernstige uitwerking op de veiligheid.", style='List Bullet')
doc.add_paragraph("De melding moet direct worden gedaan — in ieder geval binnen 24 uur. [1]")
bh(doc,"8.2 Verantwoordelijkheid voor Melding", level=2)
ast(doc,["Situatie","Verantwoordelijke voor melding"],[
    ["Ongeval met Koole-personeel","Koole meldt direct bij eigen leiding; Wintershall meldt bij SodM"],
    ["Ongeval met derden","Wintershall meldt bij SodM als verantwoordelijke opdrachtgever"],
    ["Bedrijfsongeval (brand, explosie)","Directe melding door de verantwoordelijke leidinggevende; Wintershall informeert SodM"],
    ["Near-miss met ernstig potentieel","Koole rapporteert aan Wintershall; Wintershall beoordeelt meldingsplicht"],
],cw=[4,6])
doc.add_page_break()

# ═══ HOOFDSTUK 9 ═══
bh(doc,"9. OSPAR Decision 98/3 en Mijnbouwwet")
bh(doc,"9.1 OSPAR Decision 98/3 — Internationaal Kader", level=2)
doc.add_paragraph("De OSPAR Decision 98/3 is een internationale overeenkomst voor de bescherming van het mariene milieu van de Noord-Oost Atlantische Oceaan. De besluit is bindend voor alle OSPAR-verdragsluitende partijen, waaronder Nederland en het Verenigd Koninkrijk. [18][19]")
doc.add_paragraph("Kernbepalingen van OSPAR 98/3:", style='List Bullet')
doc.add_paragraph("Als regel geldt dat offshore installaties volledig moeten worden verwijderd.", style='List Bullet')
doc.add_paragraph("Het achterlagen van installaties is alleen toegestaan onder voorwaarden (derogatie).", style='List Bullet')
doc.add_paragraph("Pijpleidingen en kabels vallen niet onder de volledige verwijderingsplicht.", style='List Bullet')
doc.add_paragraph("De vergunninghouder (Wintershall) is verantwoordelijk voor het volledig opruimen van de installatie. [18][19]")
doc.add_paragraph("Voor het Small Piece Removal project betekent dit dat alle kleinere onderdelen moeten worden verwijderd en aan land gebracht voor hergebruik, recycling of verwijdering. [18]")

bh(doc,"9.2 Mijnbouwwet — Ontmantelingsplan", level=2)
doc.add_paragraph("Op grond van de Mijnbouwwet dient Wintershall een Ontmantelingsplan in bij de Minister van Economische Zaken. Dit plan bevat: [9][12][16]")
doc.add_paragraph("Beschrijving van de te ontmantelen installatie (type, gewicht, waterdiepte).", style='List Bullet')
doc.add_paragraph("Methodiek van ontmanteling (top-down, small piece removal, etc.).", style='List Bullet')
doc.add_paragraph("Risico-analyse en maatregelen.", style='List Bullet')
doc.add_paragraph("Milieu-effectrapportage.", style='List Bullet')
doc.add_paragraph("Tijdplanning en kostenraming.", style='List Bullet')
doc.add_paragraph("Het Ontmantelingsplan moet worden goedgekeurd voordat de werkzaamheden starten. De Minister kan aanvullende voorwaarden stellen. [9][16]")
doc.add_paragraph("Uit de Ontmantelingsplannen (bijv. Wingate DP) blijkt dat Wintershall de voorkeur geeft aan campagne-gewijze ontmanteling, waarbij meerdere faciliteiten in een gezamenlijke campagne worden verwijderd. Dit is efficiënter en kosteneffectiever dan individuele ontmanteling. [12]")

bh(doc,"9.3 NEXSTEP-rapportage en Noordzee-context", level=2)
doc.add_paragraph("Volgens de NEXSTEP Re-use & Decommissioning Report 2024 staan er op de Nederlandse Noordzee nog 80+ objecten (installaties, putten, pijpleidingen) te wachten op ontmanteling. De verwachting is dat het aantal ontmantelingsprojecten de komende jaren significant toeneemt. [12][20]")
doc.add_paragraph("Dit betekent dat:", style='List Bullet')
doc.add_paragraph("Er een groeiende markt is voor gespecialiseerde ontmantelaars zoals Koole.", style='List Bullet')
doc.add_paragraph("Campaign-gewijze aanpak de voorkeur heeft vanwege efficiëntie.", style='List Bullet')
doc.add_paragraph("De druk op SodM als toezichthouder toeneemt.", style='List Bullet')
doc.add_page_break()

# ═══ HOOFDSTUK 10 ═══
bh(doc,"10. Conclusie en Aanbevelingen")
doc.add_paragraph("Dit onderzoek heeft de volgende kernbevindingen opgeleverd:")
ast(doc,["#","Bevinding","Aanbeveling"],[
    ["1","Wintershall behoudt eindverantwoordelijkheid voor veiligheid, ook bij inkoop van Koole","Contractueel vastleggen dat Koole voldoet aan Wintershall HSEQ-eisen; actief toezien"],
    ["2","Art. 7:658 BW legt bewijslast bij werkgever","Wintershall moet aantonen dat het aan zorgplicht voldoet; documentatie bijhouden"],
    ["3","Ketenaansprakelijkheid (Art. 7:661 BW) maakt Wintershall aansprakelijk voor Koole-personeel","Risico-analyse en verzekeringsdekking controleren"],
    ["4","SodM heeft brede handhavingsbevoegdheden","Meldingsprocedures helder vastleggen in contract; oefenen"],
    ["5","OSPAR 98/3 vereist volledige verwijdering","Small Piece Removal volgens Ontmantelingsplan uitvoeren; geen delen achterlaten"],
    ["6","Contractuele afspraken kunnen wettelijke aansprakelijkheid niet beperken","Contract opstellen met duidelijke HSEQ-allocatie; juridische review"],
    ["7","NEXSTEP: 80+ objecten wachten op ontmanteling","Campaign-gewijze aanpak overwegen; Koole's capaciteit benutten"],
    ["8","Koole is gespecialiseerd in offshore decommissioning","Koole's expertise benutten voor methodiek en risico-analyse"],
],cw=[1,5,8])
doc.add_page_break()

# ═══ BRONNEN ═══
bh(doc,"Bronnen")
for b in [
    "[1] AI-40: Werkgeversaansprakelijkheid. Sdu HSE, mr. ing. R.O.B. Poort.",
    "[2] AI-43: Ongevallenonderzoek. Sdu HSE.",
    "[3] AI-40: Arbowetgeving en handhaving. Sdu HSE, mr. ing. R.O.B. Poort.",
    "[4] VCA-eisen (AI-43 hfst 2): Veiligheid, Gezondheid en Milieu Checklist Aannemers.",
    "[5] Reason, J. (1997). Managing the Risks of Organizational Accidents. Ashgate.",
    "[6] AI-43 hfst 7-8: Ongevallenonderzoek en interviewtechnieken.",
    "[7] AI-08: Fysieke belasting — werkhoogten en ergonomie.",
    "[8] PGS 15:2025 — Publicatie 565. Publicatiereeks Gevaarlijke Stoffen.",
    "[9] Mijnbouwwet en Mijnbouwregeling. Staatsblad, laatste versie.",
    "[10] OSPAR Decision 98/3: Disposal of Disused Offshore Installations. OSPAR Commission.",
    "[11] LOGIC Contracts: Leading Oil and Gas Industry Contracts.",
    "[12] NEXSTEP Re-use & Decommissioning Report 2024. www.nexstep.nl",
    "[13] Koole Contractors — www.koole.eu — 'Your specialist in decommissioning'.",
    "[14] Waterland Private Equity — Koole company profile.",
    "[15] Decommission Blue — 'Bring on the platforms! We're ready!'",
    "[16] Wingate Decommissioning Programme — assets.publishing.service.gov.uk",
    "[17] HR 20 september 1996, Pollemans/Hoondert, ECLI:NL:HR:1996:ZC2142 — opzet/bewuste roekeloosheid.",
    "[18] OSPAR Commission — Offshore Installations. www.ospar.org/work-areas/oic/installations",
    "[19] Frontiers in Marine Science — 'Is OSPAR 98/3 science-based politics or politics-based science?'",
    "[20] Offshore Norge — Decommissioning Work Breakdown Structure Handbook.",
]:
    p = doc.add_paragraph(); r = p.add_run(b); r.font.size = Pt(9); r.font.color.rgb = GRAY
doc.add_page_break()

# ═══ TIERVERIFY ═══
bh(doc,"TierVerify Log")
ast(doc,["Check","Status","Opmerking"],[
    ["Bron-document v1.0 geanalyseerd","PASS","79 paragrafen, 8 hoofdstukken"],
    ["HSEQ kennisbank geraadpleegd","PASS","AI-40, AI-43, PGS 15, Mijnbouwwet"],
    ["Websearch (Tavily + Z.AI)","PASS","OSPAR, Koole, Wintershall, NEXSTEP, jurisprudentie"],
    ["Juridisch kader compleet","PASS","BW, Arbowet, Mijnbouwwet, OSPAR"],
    ["Contractuele analyse","PASS","Wintershall vs Koole verantwoordelijkheden"],
    ["Ketenaansprakelijkheid","PASS","Art. 7:658/661 BW analyse"],
    ["SodM-toezicht","PASS","Meldingsplichten en handhaving"],
    ["OSPAR 98/3","PASS","Volledige verwijdering, geen achterlating"],
    ["Bronverwijzingen","PASS","20 bronnen vermeld"],
    ["MASTER_STYLEGUIDE opmaak","PASS","JvG branding, Calibri, tabellen"],
],cw=[4,2,10])
doc.add_paragraph()
p = doc.add_paragraph()
r = p.add_run("Status: PASS — Alle checks geslaagd. Document voldoet aan MASTER_SOP en MASTER_STYLEGUIDE.")
r.bold = True; r.font.color.rgb = SUCCESS

afl(doc)

out_dir = '/root/projects/jg/2026-contractor-management-offshore/deliverables/docx'
os.makedirs(out_dir, exist_ok=True)
out_path = os.path.join(out_dir, 'Onderzoeksrapport_Contractor_Management_Aansprakelijkheid_v3.0.docx')
doc.save(out_path)
print(f"Document opgeslagen: {out_path}")
print(f"Bestandsgrootte: {os.path.getsize(out_path):,} bytes")
