#!/usr/bin/env python3
"""Generate REACH Master SOP D4 v4.0 for Phoenix Metals."""

from docx import Document
from docx.shared import Pt, Inches, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.enum.section import WD_ORIENT
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
import os
from datetime 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.space_before = Pt(0)

for level in range(1, 4):
    hs = doc.styles[f'Heading {level}']
    hs.font.color.rgb = RGBColor(0, 51, 102)
    hs.font.name = 'Calibri'

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

def add_table(doc, headers, rows, col_widths=None):
    table = doc.add_table(rows=1 + len(rows), cols=len(headers))
    table.style = 'Table Grid'
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    # Header row
    for i, h in enumerate(headers):
        cell = table.rows[0].cells[i]
        cell.text = h
        for p in cell.paragraphs:
            p.alignment = WD_ALIGN_PARAGRAPH.CENTER
            for r in p.runs:
                r.bold = True
                r.font.size = Pt(9)
                r.font.color.rgb = RGBColor(255, 255, 255)
        set_cell_shading(cell, '003366')
    # Data rows
    for ri, row in enumerate(rows):
        for ci, val in enumerate(row):
            cell = table.rows[ri + 1].cells[ci]
            cell.text = str(val)
            for p in cell.paragraphs:
                for r in p.runs:
                    r.font.size = Pt(9)
            if ri % 2 == 1:
                set_cell_shading(cell, 'E8EEF4')
    return table

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

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run('REACH Master SOP')
r.bold = True
r.font.size = Pt(28)
r.font.color.rgb = RGBColor(0, 51, 102)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run('Phoenix Metals')
r.font.size = Pt(22)
r.font.color.rgb = RGBColor(0, 51, 102)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run('Versie 4.0')
r.font.size = Pt(16)
r.font.color.rgb = RGBColor(100, 100, 100)

doc.add_paragraph()

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run('Documentcode: PM-REACH-SOP-001')
r.font.size = Pt(11)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run(f'Datum: 19 april 2026')
r.font.size = Pt(11)

doc.add_paragraph()
doc.add_paragraph()

# Goedkeuringsblok
add_table(doc,
    ['Rol', 'Naam', 'Datum', 'Handtekening'],
    [
        ['Opsteller', 'J. van Gemert, HSEQ Specialist', '19-04-2026', ''],
        ['Reviewer', '', '', ''],
        ['Goedkeuring (Directie)', '', '', ''],
    ]
)

doc.add_page_break()

# ══════════════════════════════════════════════
# REVISIEGESCHIEDENIS
# ══════════════════════════════════════════════
doc.add_heading('Revisiegeschiedenis', level=1)
add_table(doc,
    ['Versie', 'Datum', 'Auteur', 'Wijzigingen'],
    [
        ['1.0', 'Maart 2026', 'J. van Gemert', 'Eerste opzet'],
        ['2.0', 'Maart 2026', 'J. van Gemert', 'Uitbreiding SOP-01 t/m SOP-05'],
        ['3.0', 'April 2026', 'J. van Gemert', 'Toevoeging PPORD, Audit, bijlagen'],
        ['4.0', '19-04-2026', 'J. van Gemert', 'Volledige herschrijving; afstemming D1-D3 v4.0'],
    ]
)

doc.add_paragraph()

# ══════════════════════════════════════════════
# INHOUDSOPGAVE (placeholder)
# ══════════════════════════════════════════════
doc.add_heading('Inhoudsopgave', level=1)
toc_items = [
    '1. Doel & Scope',
    '2. Definities & Afkortingen',
    '3. SOP-01: Stofidentificatie & Registratie',
    '4. SOP-02: SDS-beheer',
    '5. SOP-03: CMR-Protocol',
    '6. SOP-04: CLP & Etikettering',
    '7. SOP-05: REACH-Registratie Voorbereiding',
    '8. SOP-06: PPORD-melding',
    '9. SOP-07: Audit & Compliance Check',
    '10. Bijlagen',
    '11. Bronverwijzingen',
]
for item in toc_items:
    p = doc.add_paragraph(item)
    p.paragraph_format.space_after = Pt(2)

doc.add_page_break()

# ══════════════════════════════════════════════
# 2. DOEL & SCOPE
# ══════════════════════════════════════════════
doc.add_heading('1. Doel & Scope', level=1)

doc.add_heading('1.1 Doel', level=2)
doc.add_paragraph(
    'Dit document is de Master Standard Operating Procedure (SOP) voor REACH-compliance bij Phoenix Metals. '
    'Het biedt operationele procedures voor de naleving van Verordening (EG) nr. 1907/2006 (REACH) en '
    'Verordening (EG) nr. 1272/2008 (CLP), toegespitst op de vanadium-recovery proceslijn.'
)
doc.add_paragraph(
    'Het document fungeert als centraal sturingsinstrument voor alle REACH-gerelateerde werkzaamheden en is '
    'ontworpen voor dagelijks gebruik door operationeel personeel, de HSEQ-functionaris en het management.'
)

doc.add_heading('1.2 Scope', level=2)
doc.add_paragraph(
    'De scope van deze SOP omvat twee fasen:'
)
doc.add_paragraph('Demonstratiefase: laboratoriumschaal verwerking van SARU-ash (max. 60 kg) tot vanadium oxide sulfaat. '
    'Tonnage blijft ver beneden de 1 ton/jaar REACH-drempel.', style='List Bullet')
doc.add_paragraph('Voorbereiding commerciële fase: opschaling naar industriële productie. REACH-registratieverplichtingen '
    'worden geactiveerd zodra de productie ≥ 1 ton/jaar bedraagt.', style='List Bullet')

doc.add_heading('1.3 Toepasselijkheid', level=2)
doc.add_paragraph(
    'Deze SOP is van toepassing op alle medewerkers van Phoenix Metals die betrokken zijn bij de inkoop, opslag, '
    'verwerking, of afvoer van chemische stoffen. Dit omvat operationeel personeel, laboratoriummedewerkers, '
    'de HSEQ-functionaris en leidinggevenden.'
)

doc.add_heading('1.4 Referentiekader', level=2)
doc.add_paragraph('Verordening (EG) nr. 1907/2006 — REACH', style='List Bullet')
doc.add_paragraph('Verordening (EG) nr. 1272/2008 — CLP', style='List Bullet')
doc.add_paragraph('Richtsnoer voor registratie (ECHA, v4.0, augustus 2021)', style='List Bullet')
doc.add_paragraph('Guidance on labelling and packaging (ECHA, v4.2, maart 2021)', style='List Bullet')
doc.add_paragraph('PGS 15 — Opslag van gevaarlijke stoffen', style='List Bullet')
doc.add_paragraph('Arbowet / Arbobesluit — Titel 3 (gevaarlijke stoffen)', style='List Bullet')

doc.add_page_break()

# ══════════════════════════════════════════════
# DEFINITIES
# ══════════════════════════════════════════════
doc.add_heading('2. Definities & Afkortingen', level=1)
add_table(doc,
    ['Term / Afkorting', 'Definitie'],
    [
        ['REACH', 'Registration, Evaluation, Authorisation and Restriction of Chemicals (EG 1907/2006)'],
        ['CLP', 'Classification, Labelling and Packaging (EG 1272/2008)'],
        ['SDS', 'Safety Data Sheet (Veiligheidsinformatieblad)'],
        ['CMR', 'Carcinogeen, Mutageen, Reproductietoxisch'],
        ['SVHC', 'Substance of Very High Concern (Zeer zorgwekkende stof)'],
        ['ECHA', 'European Chemicals Agency'],
        ['CAS', 'Chemical Abstracts Service registratienummer'],
        ['EG', 'Europese Gemeenschap nummer (EINECS/ELINCS)'],
        ['UFI', 'Unique Formula Identifier (16-cijferige code voor PCN-melding)'],
        ['PCN', 'Poison Centres Notification'],
        ['PPORD', 'Product and Process Orientated Research and Development'],
        ['LoA', 'Letter of Access (toegang tot consortium data)'],
        ['OSOR', 'One Substance, One Registration (REACH-principe)'],
        ['DU', 'Downstream User'],
        ['SARU-ash', 'Secondary Alkali Residue Utilisation — reststroom vanadiumhoudende as'],
    ]
)

doc.add_page_break()

# ══════════════════════════════════════════════
# 3. SOP-01: Stofidentificatie & Registratie
# ══════════════════════════════════════════════
doc.add_heading('3. SOP-01: Stofidentificatie & Registratie', level=1)

doc.add_heading('3.1 Doel', level=2)
doc.add_paragraph(
    'Zorgen dat alle chemische stoffen die binnen Phoenix Metals worden gebruikt, geproduceerd, of opgeslagen '
    'eenduidig geïdentificeerd en geregistreerd zijn in het Chemicals Master Register.'
)

doc.add_heading('3.2 Verantwoordelijkheden', level=2)
add_table(doc,
    ['Rol', 'Verantwoordelijkheid'],
    [
        ['HSEQ-functionaris', 'Beheer en actualisatie Chemicals Master Register'],
        ['Inkoop / Labmedewerker', 'Melding nieuwe stoffen bij binnenkomst'],
        ['Leidinggevende', 'Goedkeuring introductie nieuwe stoffen'],
    ]
)

doc.add_heading('3.3 Procedure', level=2)

doc.add_heading('3.3.1 Identificatie per stof', level=3)
doc.add_paragraph('Voor elke stof in het proces worden de volgende gegevens vastgelegd:')
items_31 = [
    'Chemische naam (IUPAC-nomenclatuur)',
    'CAS-nummer en EG-nummer',
    'CLP-classificatie (H-zinnen, pictogrammen, signaalwoord)',
    'Fysieke vorm (vast, vloeibaar, poeder, oplossing)',
    'Concentratie / zuiverheid',
    'Leverancier + contactgegevens',
    'SDS beschikbaar (ja/nee) + versienummer',
    'ADR-klasse en UN-nummer (indien van toepassing)',
    'SVHC-status (controle kandidatenlijst ECHA)',
    'Opslaglocatie en -condities',
]
for item in items_31:
    doc.add_paragraph(item, style='List Bullet')

doc.add_heading('3.3.2 Huidig stoffenbestand Phoenix Metals', level=3)
doc.add_paragraph(
    'Op basis van het Chemicals Master Register (v2.1.0, november 2024) bevat Phoenix Metals de volgende stoffen:'
)
add_table(doc,
    ['#', 'Stof', 'CAS-nummer', 'CLP-classificatie', 'Hoeveelheid', 'Leverancier'],
    [
        ['1', 'Sodium hydroxide, 50% in water', '1310-73-2', 'Skin Corr. 1A', '4 × 25 L', 'Carl Roth'],
        ['2', 'Sulfuric acid, 75% in water', '7664-93-9', 'Skin Corr. 1A', '3 × 10 L', 'Carl Roth'],
        ['3', 'Sulfuric acid, 50% in water', '7664-93-9', 'Skin Corr. 1A', '7 × 10 L', 'Carl Roth'],
        ['4', 'Sulfuric acid, 25% in water', '7664-93-9', 'Skin Corr. 1A', '4 × 25 L', 'Carl Roth'],
        ['5', 'Aluminium sulphate octadecahydrate', '7784-31-8', 'Geen gevarenklasse', '2 × 2,5 kg', 'Carl Roth'],
        ['6', 'Calcium oxide', '1305-78-8', 'Skin Corr. 1B / Eye Dam. 1', '2 × 5 kg', 'Carl Roth'],
    ]
)

doc.add_paragraph()
doc.add_paragraph(
    'Daarnaast wordt SARU-ash (vanadiumhoudend) verwerkt als grondstof. Natriummetavanaat (CAS 13718-26-8) '
    'is een relevant bestanddeel van deze as. Het eindproduct vanadium oxide sulfaat (CAS 27774-13-6) wordt '
    'nog bepaald op basis van de demo-resultaten.'
)

doc.add_heading('3.3.3 Workflow: Nieuwe stof toevoegen', level=3)
steps = [
    'Melding: Inkoop of labmedewerker meldt nieuwe stof via het Stof Intake Formulier.',
    'SDS-verzoek: HSEQ-functionaris vraagt de SDS op bij de leverancier (verplicht vóór eerste gebruik).',
    'CLP-classificatie: Controleer de classificatie op basis van de SDS en de ECHA-database.',
    'SVHC-check: Controleer of de stof op de ECHA-kandidatenlijst staat.',
    'RI&E-update: Werk de Risico-Inventarisatie & -Evaluatie bij indien de stof gevaarlijk is.',
    'Registratie: Voeg de stof toe aan het Chemicals Master Register met alle verplichte velden.',
    'PBM-matrix: Bepal persoonsgebonden beschermingsmiddelen voor deze stof.',
    'Opslag: Wijs een opslaglocatie toe conform PGS 15.',
    'Goedkeuring: Leidinggevende tekent af op de introductie.',
]
for i, step in enumerate(steps, 1):
    doc.add_paragraph(f'Stap {i}: {step}')

doc.add_heading('3.4 Frequentie', level=2)
doc.add_paragraph('Continue: bij elke nieuwe stof introductie', style='List Bullet')
doc.add_paragraph('Jaarlijks: volledige review van het Chemicals Master Register (zie SOP-07)', style='List Bullet')

doc.add_page_break()

# ══════════════════════════════════════════════
# 4. SOP-02: SDS-beheer
# ══════════════════════════════════════════════
doc.add_heading('4. SOP-02: SDS-beheer', level=1)

doc.add_heading('4.1 Doel', level=2)
doc.add_paragraph(
    'Waarborgen dat voor alle chemische stoffen op de werkplek een actueel, volledig en toegankelijk '
    'Veiligheidsinformatieblad (SDS) beschikbaar is, conform REACH Bijlage II.'
)

doc.add_heading('4.2 Verantwoordelijkheden', level=2)
add_table(doc,
    ['Rol', 'Verantwoordelijkheid'],
    [
        ['HSEQ-functionaris', 'SDS-beheerder; actualiteit, distributie, archivering'],
        ['Inkoop', 'SDS aanleveren bij elke nieuwe levering of leverancierswijziging'],
        ['Labmedewerkers', 'SDS raadplegen vóór het werken met een stof'],
    ]
)

doc.add_heading('4.3 Procedure', level=2)

doc.add_heading('4.3.1 SDS raadplegen', level=3)
doc.add_paragraph('SDS\'en zijn beschikbaar in:')
doc.add_paragraph('Harde kopie: ordner in het laboratorium (gecolourcodeerd per categorie)', style='List Bullet')
doc.add_paragraph('Digitale kopie: gedeelde map op het netwerk (Phoenix Metals > HSEQ > SDS)', style='List Bullet')
doc.add_paragraph(
    'Elke medewerker is verplicht de SDS te raadplegen alvorens met een stof te werken. '
    'Specifieke aandacht voor rubriek 2 (gevaaridentificatie), rubriek 7 (veilig hanteren) '
    'en rubriek 8 (PBM / blootstellingscontrole).'
)

doc.add_heading('4.3.2 SDS opstellen (eigen stoffen)', level=3)
doc.add_paragraph(
    'Indien Phoenix Metals als fabrikant of importeur fungeert en ≥ 1 ton/jaar produceert/importeert, '
    'moet een eigen SDS worden opgesteld conform REACH Bijlage II. In de demo-fase (tonnage < 1 ton/jaar) '
    'is dit niet verplicht, maar wel aanbevolen voor best-practice.'
)

doc.add_heading('4.3.3 SDS distributie downstream users', level=3)
doc.add_paragraph(
    'Wanneer Phoenix Metals stoffen of mengsels levert aan downstream users, wordt de actuele SDS '
    'meegestuurd bij de eerste levering en bij elke significante wijziging. De distributie wordt '
    'gedocumenteerd in het SDS-distributielog.'
)

doc.add_heading('4.3.4 Versiebeheer', level=3)
add_table(doc,
    ['Actie', 'Trigger', 'Door wie'],
    [
        ['SDS-update', 'Nieuwe classificatie, nieuwe H-zinnen, wijziging samenstelling', 'Leverancier → HSEQ'],
        ['Versie registratie', 'Elke update', 'HSEQ-functionaris'],
        ['Oude SDS archiveren', 'Bij ontvangst nieuwe versie', 'HSEQ-functionaris'],
        ['Distributie update', 'Significante wijzigingen', 'HSEQ-functionaris'],
    ]
)

doc.add_heading('4.3.5 Jaarlijkse review', level=3)
doc.add_paragraph(
    'Eens per jaar (Q1) voert de HSEQ-functionaris een volledige SDS-review uit:'
)
doc.add_paragraph('Controle of alle SDS\'en in het register een versiedatum ≤ 3 jaar geleden hebben', style='List Bullet')
doc.add_paragraph('Controle op nieuwe SVHC-kandidatenlijst entries', style='List Bullet')
doc.add_paragraph('Controle actualiteit CLP-classificatie', style='List Bullet')
doc.add_paragraph('Verouderde SDS\'en worden bij de leverancier aangevraagd', style='List Bullet')

doc.add_page_break()

# ══════════════════════════════════════════════
# 5. SOP-03: CMR-Protocol
# ══════════════════════════════════════════════
doc.add_heading('5. SOP-03: CMR-Protocol', level=1)

doc.add_heading('5.1 Doel', level=2)
doc.add_paragraph(
    'Identificeren, registreren en beheren van CMR-stoffen (Carcinogeen, Mutageen, Reproductietoxisch) '
    'op de werkplek, conform het Arbobesluit (art. 4.15 en 4.16) en REACH Titel IV.'
)

doc.add_heading('5.2 Herkenning CMR-stoffen', level=2)
doc.add_paragraph('CMR-stoffen worden geïdentificeerd via:')
doc.add_paragraph('SDS rubriek 2: gevarenaanduidingen met H-zinnen H340, H350, H360 (cat. 1A/1B) of H341, H351, H361 (cat. 2)', style='List Bullet')
doc.add_paragraph('Etiket: signaalwoord "Gevaar" + gezondheidsgevaar-pictogram', style='List Bullet')
doc.add_paragraph('ECHA-classificatie- en etiketteringsinventaris (C&L Inventory)', style='List Bullet')
doc.add_paragraph('Arbowet-lijst van CMR-stoffen (SZW-publicatie)', style='List Bullet')

doc.add_heading('5.3 CMR Namelist (art. 4.15 Arbobesluit)', level=2)
doc.add_paragraph(
    'Phoenix Metals is verplicht een namelist bij te houden van medewerkers die werken met CMR-stoffen '
    '(categorie 1A of 1B). De namelist bevat:'
)
doc.add_paragraph('Naam en functie van de medewerker', style='List Bullet')
doc.add_paragraph('De betreffende CMR-stof(fen)', style='List Bullet')
doc.add_paragraph('Aard en duur van de blootstelling', style='List Bullet')
doc.add_paragraph('Datum van eerste en laatste blootstelling', style='List Bullet')

doc.add_paragraph(
    'De namelist wordt voor de duur van de dienstbetrekking + 40 jaar bewaard conform de Arbowet.'
)

doc.add_heading('5.4 Blootstellingsregistratie', level=2)
doc.add_paragraph('Voor elke werkactiviteit met een CMR-stof wordt geregistreerd:')
add_table(doc,
    ['Veld', 'Beschrijving'],
    [
        ['Datum', 'Datum van de werkactiviteit'],
        ['Medewerker', 'Naam en personeelsnummer'],
        ['Stof', 'Chemische naam + CAS-nummer'],
        ['Activiteit', 'Beschrijving van de verrichte werkzaamheden'],
        ['Duur', 'Geschatte blootstellingsduur (minuten)'],
        ['PBM', 'Welke PBM zijn gedragen?'],
        ['LEVS', 'Is lokale afzuiging gebruikt? (ja/nee)'],
        ['Incidenten', 'Eventuele incidenten of afwijkingen'],
    ]
)

doc.add_heading('5.5 Gezondheidssurveillance', level=2)
doc.add_paragraph(
    'Medewerkers die structureel werken met CMR-stoffen (cat. 1A/1B) worden in overleg met de '
    'bedrijfsarts opgenomen in een gezondheidssurveillanceprogramma. Dit omvat minimaal:'
)
doc.add_paragraph('Periodiek arbeidsgezondheidskundig onderzoek (PAGO) — frequentie conform advies bedrijfsarts', style='List Bullet')
doc.add_paragraph('Specifiek onderzoek gericht op de blootgestelde stof(fen)', style='List Bullet')
doc.add_paragraph('Registratie van bevindingen in het dossier van de medewerker', style='List Bullet')

doc.add_heading('5.6 Huidige CMR-status Phoenix Metals', level=2)
doc.add_paragraph(
    'Op basis van de huidige stoffenlijst (v2.1.0) bevat Phoenix Metals geen stoffen met een '
    'CMR-classificatie categorie 1A of 1B. Zwavelzuur is geclassificeerd als Skin Corr. 1A (corrosief, niet CMR). '
    'De SARU-ash bevat vanadiumverbindingen; natriummetavanaat is geclassificeerd als Repr. 1B (H360D — '
    'kan het ongeboren kind schaden) en Spec. Tox. 2 (H335). Dit betekent dat zodra SARU-ash structureel '
    'wordt verwerkt, het CMR-protocol geactiveerd moet worden.'
)

doc.add_page_break()

# ══════════════════════════════════════════════
# 6. SOP-04: CLP & Etikettering
# ══════════════════════════════════════════════
doc.add_heading('6. SOP-04: CLP & Etikettering', level=1)

doc.add_heading('6.1 Doel', level=2)
doc.add_paragraph(
    'Waarborgen dat alle chemische stoffen en mengsels op de werkplek correct etiket zijn conform de '
    'CLP-verordening (EG 1272/2008). Dit geldt zowel voor ontvangen stoffen als voor intern geproduceerde mengsels.'
)

doc.add_heading('6.2 Etikettering incoming chemicals', level=2)
doc.add_paragraph('Bij ontvangst van chemische stoffen controleert de inkoop/labmedewerker:')
doc.add_paragraph('CLP-etiket aanwezig en leesbaar op de verpakking', style='List Bullet')
doc.add_paragraph('Identiteit van de stof (naam, CAS)', style='List Bullet')
doc.add_paragraph('Gevaarpictogrammen (GHS-diamanten)', style='List Bullet')
doc.add_paragraph('Signaalwoord (Gevaar / Waarschuwing)', style='List Bullet')
doc.add_paragraph('H-zinnen en P-zinnen', style='List Bullet')
doc.add_paragraph('Naam + adres leverancier', style='List Bullet')
doc.add_paragraph('Bij afwijkingen: stof niet in gebruik nemen; HSEQ-functionaris informeren.', style='List Bullet')

doc.add_heading('6.3 Etikettering eigen producten', level=2)
doc.add_paragraph(
    'Indien Phoenix Metals eigen mengsels of oplossingen bereidt (bijv. verdund zwavelzuur, '
    'tussenproducten uit het vanadium-extractieproces), worden deze etiket conform CLP:'
)
doc.add_paragraph('Gevaarlijkheidsbeoordeling op basis van de ingrediënten', style='List Bullet')
doc.add_paragraph('Correct CLP-etiket aanbrengen met: productnaam, gevarenpictogrammen, H/P-zinnen, UFI (indien vereist)', style='List Bullet')
doc.add_paragraph('UFI-toewijzing via de ECHA PCN-portal', style='List Bullet')

doc.add_heading('6.4 UFI-toewijzing procedure', level=2)
doc.add_paragraph('Stap 1: Genereer een UFI via de ECHA Submission portal (https://poisoncentres.echa.europa.eu)', style='List Number')
doc.add_paragraph('Stap 2: Registreer de UFI in het interne UFI-register', style='List Number')
doc.add_paragraph('Stap 3: Breng de UFI aan op het etiket van het mengsel', style='List Number')
doc.add_paragraph('Stap 4: Dien de PCN-melding in bij het Nationaal Vergiftigingen Informatie Centrum (NVIC)', style='List Number')

doc.add_heading('6.5 Opslaglabels', level=2)
doc.add_paragraph(
    'Alle opslaglocaties voor gevaarlijke stoffen zijn voorzien van opslaglabels conform PGS 15:'
)
doc.add_paragraph('Gevaarlijkheids pictogrammen op de kast/kluis/rek', style='List Bullet')
doc.add_paragraph('H-zinnen zichtbaar bij de opslaglocatie', style='List Bullet')
doc.add_paragraph('Noodprocedure-informatie bij de locatie (inclusief bereikbaarheid oogdouches / nooddouches)', style='List Bullet')

doc.add_page_break()

# ══════════════════════════════════════════════
# 7. SOP-05: REACH-Registratie Voorbereiding
# ══════════════════════════════════════════════
doc.add_heading('7. SOP-05: REACH-Registratie Voorbereiding', level=1)

doc.add_heading('7.1 Doel', level=2)
doc.add_paragraph(
    'Voorbereiden op REACH-registratie voor het geval Phoenix Metals ≥ 1 ton/jaar van een stof produceert of '
    'importeert. Deze SOP beschrijft de stappen om een registratie voor te bereiden via het Vanadium Consortium.'
)

doc.add_heading('7.2 Achtergrond', level=2)
doc.add_paragraph(
    'REACH hanteert het "one substance, one registration" (OSOR) principe. Fabrikanten en importeurs van '
    'dezelfde stof moeten gezamenlijk registreren via een SIEF (Substance Information Exchange Forum) of consortium.'
)
doc.add_paragraph(
    'Het Vanadium REACH Consortium (vanadiumconsortium.com) heeft reeds 19 vanadiumverbindingen geregistreerd, '
    'waaronder natriummetavanaat (EC 237-272-7) en vanadium oxide sulfaat (EC 248-652-7). Phoenix Metals '
    'kan aansluiten via Full Membership of een Letter of Access (LoA) aanschaffen.'
)

doc.add_heading('7.3 Sameness Check Procedure', level=2)
doc.add_paragraph('Voordat registratie wordt gestart, moet worden vastgesteld of de stof die Phoenix Metals produceert '
    '"hetzelfde" is als de reeds geregistreerde stof in het consortium:')

steps_sc = [
    ('Stofidentificatie', 'Bepaal de exacte chemische identiteit: naam, CAS, EG, molecuulformule, structuur.'),
    ('Same constituent?', 'Controleer of het hoofdbestanddeel ≥ 80% is (mono-constituent) of 10-80% (multi-constituent) overeenkomt met de consortium-registratie.'),
    ('Verontreinigingen', 'Identificeer relevante verontreinigingen (> 0,1%). Vergelijk met het consortium-profiel.'),
    ('Spectroscopische data', 'Vergelijk analytische data (XRD, XRF, ICP-OES) met het referentiedossier.'),
    ('Conclusie', 'Documenteer de sameness-beoordeling. Bij twijfel: neem contact op met het consortium secretariaat.'),
]
add_table(doc,
    ['Stap', 'Omschrijving'],
    steps_sc
)

doc.add_heading('7.4 Contact Vanadium Consortium', level=2)
doc.add_paragraph('Contactgegevens: Vanadium REACH Consortium — https://vanadiumconsortium.com')
doc.add_paragraph('Neem contact op voor:')
doc.add_paragraph('Verzoek om Sameness Check ondersteuning', style='List Bullet')
doc.add_paragraph('Informatie over LoA-kosten per tonnage band', style='List Bullet')
doc.add_paragraph('Full Membership voorwaarden', style='List Bullet')
doc.add_paragraph('Toegang tot het joint registration dossier', style='List Bullet')

doc.add_heading('7.5 LoA aanschaffen workflow', level=2)
steps_loa = [
    'Bepaal de tonnage band (1-10 t/j, 10-100 t/j, 100-1000 t/j, >1000 t/j).',
    'Vraag een offerte aan bij het Vanadium Consortium secretariaat.',
    'Budgetbeschikking door directie Phoenix Metals.',
    'Ondertekening LoA-overeenkomst door bevoegd vertegenwoordiger.',
    'Betaling van de LoA fee.',
    'Ontvangst van de LoA en referentienummer.',
    'Bewaar de LoA in het REACH-compliance archief.',
]
for i, step in enumerate(steps_loa, 1):
    doc.add_paragraph(f'Stap {i}: {step}')

doc.add_heading('7.6 Route B: Eigen registratiedossier', level=2)
doc.add_paragraph(
    'Indien de sameness check negatief uitvalt (de stof komt niet overeen met een consortium-registratie), '
    'moet Phoenix Metals een eigen registratiedossier opstellen (Route B). Dit omvat:'
)
doc.add_paragraph('IUCLID-dossier opstellen met alle verplichte bijlagen', style='List Bullet')
doc.add_paragraph('Technisch dossier (stofidentiteit, fys.-chem. eigenschappen, toxicologie, ecotoxicologie)', style='List Bullet')
doc.add_paragraph('Chemical Safety Report (CSR) bij ≥ 10 ton/jaar', style='List Bullet')
doc.add_paragraph('Indiening via REACH-IT (ECHA-portaal)', style='List Bullet')
doc.add_paragraph(
    'Route B is aanzienlijk kostbaarder en tijdrovender. Preferentie gaat uit naar Route A (LoA via consortium).'
)

doc.add_page_break()

# ══════════════════════════════════════════════
# 8. SOP-06: PPORD-melding
# ══════════════════════════════════════════════
doc.add_heading('8. SOP-06: PPORD-melding', level=1)

doc.add_heading('8.1 Doel', level=2)
doc.add_paragraph(
    'Procedure voor het doen van een PPORD-melding (Product and Process Orientated Research and Development) '
    'bij het ECHA, conform REACH art. 9. Dit is relevant wanneer Phoenix Metals een niet-geregistreerde stof '
    'wil gebruiken voor onderzoek- en ontwikkelingsdoeleinden.'
)

doc.add_heading('8.2 Wanneer een PPORD-melding?', level=2)
doc.add_paragraph('Een PPORD-melding is vereist wanneer:')
doc.add_paragraph('Phoenix Metals een niet-geregistreerde stof wil produceren of importeren voor R&D', style='List Bullet')
doc.add_paragraph('De hoeveelheid ≥ 1 ton/jaar bedraagt', style='List Bullet')
doc.add_paragraph('De stof niet anderszins is vrijgesteld (bijv. ≤ 1 ton/jaar of vermeld in Bijlage V)', style='List Bullet')

doc.add_paragraph(
    'In de huidige demo-fase (< 1 ton/jaar) is een PPORD-melding niet verplicht. Bij opschaling '
    'naar > 1 ton/jaar zonder volledige REACH-registratie moet PPORD worden overwogen.'
)

doc.add_heading('8.3 Inhoud PPORD-melding', level=2)
add_table(doc,
    ['Element', 'Beschrijving'],
    [
        ['Identiteit van de stof', 'Naam, CAS, EG, molecuulformule'],
        ['Producent / importeur', 'Bedrijfsnaam, adres, contactpersoon'],
        ['Onderzoeksdoel', 'Beschrijving van het R&D-programma'],
        ['Locatie R&D', 'Adres(sen) waar het onderzoek plaatsvindt'],
        ['Verwachte tonnage', 'Geschatte hoeveelheid per jaar'],
        ['Tijdsbestek', 'Verwachte duur van het R&D-programma (max. 5 jaar)'],
        ['Risicobeheersing', 'Beschrijving van maatregelen ter beheersing van risico\'s'],
    ]
)

doc.add_heading('8.4 Tijdslimieten', level=2)
doc.add_paragraph('Standaardduur: 5 jaar', style='List Bullet')
doc.add_paragraph('Verlenging: mogelijk op verzoek bij ECHA (gemotiveerd verzoek, voorafgaand aan afloop)', style='List Bullet')
doc.add_paragraph('Tijdens de PPORD-periode is de stof vrijgesteld van registratie (mits binnen de gemelde hoeveelheid en toepassing)', style='List Bullet')

doc.add_heading('8.5 Overgang naar volledige registratie', level=2)
doc.add_paragraph('Bij het verstrijken van de PPORD-periode of bij commerciële productie:')
doc.add_paragraph('Start de REACH-registratieprocedure (SOP-05) minimaal 12 maanden vóór afloop PPORD', style='List Bullet')
doc.add_paragraph('Zorg dat de productie niet onderbroken wordt — overgangsregelingen via ECHA indienen indien nodig', style='List Bullet')
doc.add_paragraph('Archiveer alle PPORD-documentatie als onderdeel van het registratiedossier', style='List Bullet')

doc.add_page_break()

# ══════════════════════════════════════════════
# 9. SOP-07: Audit & Compliance Check
# ══════════════════════════════════════════════
doc.add_heading('9. SOP-07: Audit & Compliance Check', level=1)

doc.add_heading('9.1 Doel', level=2)
doc.add_paragraph(
    'Structureel en periodiek evalueren of Phoenix Metals voldoet aan alle REACH- en CLP-verplichtingen. '
    'De jaarlijkse compliance check borgt dat afwijkingen tijdig worden geïdentificeerd en gecorrigeerd.'
)

doc.add_heading('9.2 Frequentie', level=2)
doc.add_paragraph('Jaarlijkse REACH-compliance check: Q1 van elk kalenderjaar', style='List Bullet')
doc.add_paragraph('Interim check: bij significante wijzigingen (nieuwe stoffen, proceswijzigingen, wetgevingwijzigingen)', style='List Bullet')
doc.add_paragraph('Incidenteel: naar aanleiding van audits van toezichthouders (ILenT, Inspectie SZW)', style='List Bullet')

doc.add_heading('9.3 Checklist items', level=2)
checklist_items = [
    ['1', 'Chemicals Master Register', 'Compleet en actueel? Alle stoffen geregistreerd?'],
    ['2', 'SDS-beschikbaarheid', 'Voor alle stoffen een actuele SDS (< 3 jaar)?'],
    ['3', 'CLP-etikettering', 'Alle verpakkingen correct etiket?'],
    ['4', 'CMR Namelist', 'Actueel? Alle blootgestelde medewerkers geregistreerd?'],
    ['5', 'SVHC-check', 'Kandidatenlijst gecontroleerd op recente toevoegingen?'],
    ['6', 'UFI / PCN', 'Alle mengsels gemeld? UFIs op etiketten?'],
    ['7', 'PGS 15 opslag', 'Opslag conform richtlijn? Veiligheidsvoorzieningen aanwezig?'],
    ['8', 'PBM-matrix', 'Actueel en afgestemd op actuele stoffenlijst?'],
    ['9', 'RI&E', 'Actueel inclusief alle gevaarlijke stoffen?'],
    ['10', 'Training', 'Alle medewerkers getraind op gevaarlijke stoffen (laatste 12 maanden)?'],
    ['11', 'REACH-registratiestatus', 'Tonnage bewaking: < 1 t/j in demo-fase? Voorbereiding commerciële fase?'],
    ['12', 'Documentbeheer', 'Alle documenten actueel, goedgekeurd, gearchiveerd?'],
]
add_table(doc,
    ['#', 'Onderdeel', 'Check'],
    checklist_items
)

doc.add_heading('9.4 Corrective Actions', level=2)
doc.add_paragraph('Bij geconstateerde afwijkingen:')
doc.add_paragraph('Documenteer de bevinding in het Compliance Jaaroverzicht (Bijlage D)', style='List Bullet')
doc.add_paragraph('Classificeer de ernst: kritiek (directe actie), significant (actie binnen 30 dagen), observationeel (verbeterpunt)', style='List Bullet')
doc.add_paragraph('Stel een corrective action plan op met: omschrijving, verantwoordelijke, deadline', style='List Bullet')
doc.add_paragraph('Volg de acties op in het eerstvolgende management review', style='List Bullet')
doc.add_paragraph('Verifieer de implementatie bij de volgende compliance check', style='List Bullet')

doc.add_heading('9.5 Documentatie & Archivering', level=2)
doc.add_paragraph('Alle compliance check documenten worden bewaard in het REACH-compliance archief:')
doc.add_paragraph('Minimum bewaartermijn: 10 jaar na de laatste update', style='List Bullet')
doc.add_paragraph('Locatie: /root/Documents/HSEQ_kennis/Phoenixmetals/REACH/', style='List Bullet')
doc.add_paragraph('Documenten: checklists, corrective action plans, bewijsmateriaal (foto\'s, metingen)', style='List Bullet')

doc.add_page_break()

# ══════════════════════════════════════════════
# 10. BIJLAGEN
# ══════════════════════════════════════════════
doc.add_heading('10. Bijlagen', level=1)

# Bijlage A
doc.add_heading('Bijlage A: Chemicals Master Register Template', level=2)
add_table(doc,
    ['#', 'Datum levering', 'Stofnaam', 'CAS', 'EG', 'CLP-classificatie', 'SVHC?', 'Leverancier', 'Hoeveelheid', 'Eenheid', 'Opslaglocatie', 'SDS versie', 'Status'],
    [
        ['1', '', '', '', '', '', '', '', '', '', '', '', ''],
        ['2', '', '', '', '', '', '', '', '', '', '', '', ''],
        ['3', '', '', '', '', '', '', '', '', '', '', '', ''],
    ]
)

doc.add_paragraph()

# Bijlage B
doc.add_heading('Bijlage B: CMR Namelist Template', level=2)
add_table(doc,
    ['Naam medewerker', 'Personeelsnr.', 'CMR-stof', 'CAS', 'Categorie', 'Activiteit', 'Blootstellingsduur', 'Datum van', 'Datum tot'],
    [
        ['', '', '', '', '', '', '', '', ''],
        ['', '', '', '', '', '', '', '', ''],
    ]
)

doc.add_paragraph()

# Bijlage C
doc.add_heading('Bijlage C: Sameness Check Checklist', level=2)
add_table(doc,
    ['Stap', 'Controle', 'Resultaat', 'Opmerkingen'],
    [
        ['1', 'Chemische naam komt overeen?', '', ''],
        ['2', 'CAS-nummer identiek?', '', ''],
        ['3', 'EG-nummer identiek?', '', ''],
        ['4', 'Hoofdbestanddeel concentratie ≥ 80% (mono) of 10-80% (multi)?', '', ''],
        ['5', 'Verontreinigingen vergeleken?', '', ''],
        ['6', 'Analytische data (XRD/XRF/ICP) vergeleken?', '', ''],
        ['7', 'Consortium akkoord met sameness?', '', ''],
        ['8', 'Conclusie: SAME / NOT SAME / ONBEKEND', '', ''],
    ]
)

doc.add_paragraph()

# Bijlage D
doc.add_heading('Bijlage D: REACH Compliance Jaaroverzicht Template', level=2)
doc.add_paragraph('Jaar: _______    Uitgevoerd door: _______________    Datum: ___________')
doc.add_paragraph()
add_table(doc,
    ['#', 'Onderdeel', 'Status (✓/✗)', 'Bevinding', 'Ernst', 'Corrective Action', 'Verantwoordelijke', 'Deadline'],
    [
        ['1', 'Chemicals Master Register', '', '', '', '', '', ''],
        ['2', 'SDS-beschikbaarheid', '', '', '', '', '', ''],
        ['3', 'CLP-etikettering', '', '', '', '', '', ''],
        ['4', 'CMR Namelist', '', '', '', '', '', ''],
        ['5', 'SVHC-check', '', '', '', '', '', ''],
        ['6', 'UFI / PCN', '', '', '', '', '', ''],
        ['7', 'PGS 15 opslag', '', '', '', '', '', ''],
        ['8', 'PBM-matrix', '', '', '', '', '', ''],
        ['9', 'RI&E', '', '', '', '', '', ''],
        ['10', 'Training', '', '', '', '', '', ''],
        ['11', 'REACH-registratiestatus', '', '', '', '', '', ''],
        ['12', 'Documentbeheer', '', '', '', '', '', ''],
    ]
)
doc.add_paragraph()
doc.add_paragraph('Handtekening auditor: _______________________    Datum: ___________')
doc.add_paragraph('Handtekening management: _______________________    Datum: ___________')

doc.add_page_break()

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

refs = [
    'Verordening (EG) nr. 1907/2006 — REACH (Publikatieblad EU L 396, 30.12.2006)',
    'Verordening (EG) nr. 1272/2008 — CLP (Publikatieblad EU L 353, 31.12.2008)',
    'ECHA, Richtsnoer voor registratie, Versie 4.0, augustus 2021',
    'ECHA, Guidance on labelling and packaging, Versie 4.2, maart 2021',
    'ECHA, Guidance on the preparation of an Annex XV dossier for SVHC identification, v2.1, oktober 2018',
    'ECHA, Veiligheid van chemische stoffen in uw bedrijf — Inleiding voor kmo\'s',
    'ECHA, Guidance on substance identification (RIP 3.10)',
    'Vanadium REACH Consortium — https://vanadiumconsortium.com',
    'Arbowet / Arbobesluit — Titel 3: Gevaarlijke stoffen en biologische agentia',
    'PGS 15 — Publicatiereeks Gevaarlijke Stoffen: Opslag van gevaarlijke stoffen',
    'Phoenix Metals, Registration Chemicals - MASTER (v2.1.0, november 2024)',
    'Phoenix Metals, MSDS Vanadium Concentrate (v1-nl)',
    'Phoenix Metals, RI&E Inventarisatie Gevaarlijke Stoffen',
    'Phoenix Metals, HSE Policy',
    'Phoenix Metals, PBM Beleid & Matrix',
    'Phoenix Metals, Management of Change (MOC) procedure',
    'Phoenix Metals, Document Control procedure',
]
for i, ref in enumerate(refs, 1):
    doc.add_paragraph(f'[{i}] {ref}')

# ── Save ──
outpath = '/root/projects/jg/2026-reach-phoenix-metals/deliverables/docx/REACH_MasterSOP_Phoenix_Metals_D4_v4.0.docx'
doc.save(outpath)
print(f'✅ Opgeslagen: {outpath}')
