#!/usr/bin/env python3
"""Genereer REACH Procedure Phoenix Metals B.V. — v1.0"""

from docx import Document
from docx.shared import Pt, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import qn
from docx.oxml import OxmlElement

doc = Document()

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

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

DARK_BLUE = RGBColor(0, 51, 102)
ORANGE = RGBColor(255, 102, 0)

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):
    table = doc.add_table(rows=1 + len(rows), cols=len(headers))
    table.style = 'Table Grid'
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    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')
    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

def add_numbered(doc, items):
    for i, item in enumerate(items, 1):
        doc.add_paragraph(f'{i}. {item}')

def add_bullets(doc, items):
    for item in items:
        doc.add_paragraph(item, style='List Bullet')

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

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run('REACH Procedure')
r.bold = True; r.font.size = Pt(28); r.font.color.rgb = DARK_BLUE

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run('Phoenix Metals B.V.')
r.font.size = Pt(22); r.font.color.rgb = DARK_BLUE

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run('Vanadiumextractie uit SARU ash en staalslakken')
r.font.size = Pt(14); 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-PROC-001')
r.font.size = Pt(11)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run('Versie 1.0 — 26 april 2026')
r.font.size = Pt(11)

doc.add_paragraph()

# Goedkeuringsblok
add_table(doc,
    ['Rol', 'Naam', 'Datum', 'Handtekening'],
    [
        ['Opsteller', 'J. van Gemert, HSEQ Specialist', '26-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', '26-04-2026', 'J. van Gemert', 'Eerste versie — operationele REACH-procedure']])

doc.add_paragraph()

# ════════════════════════════════════════
# INHOUDSOPGAVE
# ════════════════════════════════════════
doc.add_heading('Inhoudsopgave', level=1)
toc = [
    '1. Doel',
    '2. Toepassingsgebied',
    '3. Definities en afkortingen',
    '4. Verantwoordelijkheden',
    '5. Processtappen',
    '   5a. Stoffeninventarisatie (Art. 3)',
    '   5b. REACH-rollenbepaling',
    '   5c. Registratieplicht beoordelen (Art. 5-6)',
    '   5d. PPORD-notificatie (Art. 9)',
    '   5e. Volledige registratie voorbereiden (Art. 10)',
    '   5f. SDS-verwerving en -beheer (Art. 31)',
    '   5g. eSDS en blootstellingsscenario\'s',
    '   5h. SVHC-monitoring (Art. 59)',
    '   5i. Autorisatie-aanvraag (Art. 62)',
    '   5j. Restrictie-compliance (Art. 67, Bijlage XVII)',
    '6. End-of-Waste procedure',
    '7. Fasering: Demo → Pilot → FOAK',
    '8. Documentatie en bewaartermijnen (Art. 36)',
    '9. Oplegging en evaluatie',
    '10. Bijlagen',
]
for item in toc:
    p = doc.add_paragraph(item)
    p.paragraph_format.space_after = Pt(2)

doc.add_page_break()

# ════════════════════════════════════════
# 1. DOEL
# ════════════════════════════════════════
doc.add_heading('1. Doel', level=1)
doc.add_paragraph(
    'Deze procedure waarborgt dat Phoenix Metals B.V. te allen tijde voldoet aan de verplichtingen '
    'uit Verordening (EG) nr. 1907/2006 (REACH), in het bijzonder ten aanzien van de hydrometallurgische '
    'vanadiumextractie uit SARU ash en staalslakken op locatie PlantOne Rotterdam.'
)
doc.add_paragraph(
    'Het doel is drievoudig:'
)
add_numbered(doc, [
    'REACH-compliance operationeel waarborgen in alle projectfasen (demo, pilot, FOAK).',
    'Duidelijkheid scheppen over REACH-rollen, registratieverplichtingen, en vrijstellingen per stof en per fase.',
    'Een auditeerbaar kader bieden voor interne en externe toetsing.',
])

# ════════════════════════════════════════
# 2. TOEPASSINGSGEBIED
# ════════════════════════════════════════
doc.add_heading('2. Toepassingsgebied', level=1)
doc.add_paragraph(
    'Deze procedure is van toepassing op alle chemische stoffen en mengsels die binnen Phoenix Metals '
    'worden ingekocht, geproduceerd, verwerkt, opgeslagen, of afgevoerd. Het toepassingsgebied omvat:'
)
add_bullets(doc, [
    'Grondstoffen: zwavelzuur (25-75%), natriumhydroxide (50%), aluminiumsulfaat, calciumoxide, magnesiumhydroxide, calciumhydroxide.',
    'Tussenproducten: vanadiumhoudende extractieoplossingen, neerslagen, en eluaten.',
    'Eindproducten: vanadium(V) oxide (V₂O₅), vanadium-elektrolyt (UVCB-mengsel), ijzeroxide (Fe₂O₃), gips (CaSO₄).',
    'Bijproducten: natriummetavanaadaat, trinatriumorthowanaadaat.',
    'Afvalstoffen: uitgeloogde SARU ash, procesafval, afvalwater.',
    'SVHC-stoffen: V₂O₅ (Repr. 1B, H361fd), nikkeloxide (Carc. 1A, H350i) als bestanddeel van SARU ash.',
])

# ════════════════════════════════════════
# 3. DEFINITIES
# ════════════════════════════════════════
doc.add_heading('3. Definities en afkortingen', level=1)

add_table(doc,
    ['Term / Afkorting', 'Definitie'],
    [
        ['Stof (Art. 3(1))', 'Een chemisch element en de verbindingen ervan in natuurlijke toestand of verkregen door fabricage, inclusief additieven en onzuiverheden.'],
        ['Mengsel (Art. 3(2))', 'Samenstel van stoffen in afgemeten verhoudingen, niet ontstaan bij chemische reactie.'],
        ['Voorwerp (Art. 3(3))', 'Object waarvan de speciale vorm, oppervlak of patroon de functie meer bepaalt dan de chemische samenstelling.'],
        ['Fabrikant (Art. 3(8))', 'In de EU gevestigde persoon die in de EU een stof vervaardigt.'],
        ['Importeur (Art. 3(10))', 'In de EU gevestigde persoon die verantwoordelijk is voor invoer.'],
        ['Downstreamgebruiker / DU (Art. 3(13))', 'In de EU gevestigde persoon, niet zijnde fabrikant of importeur, die een stof gebruikt bij industriële of beroepsactiviteiten.'],
        ['SVHC', 'Substance of Very High Concern — stof die voldoet aan criteria van Art. 57 (CMR, PBT, vPvB, of equivalent zorgniveau).'],
        ['PPORD (Art. 3(23))', 'Product and Process Orientated Research and Development — onderzoek gericht op product- of procesontwikkeling.'],
        ['EoW', 'End-of-Waste — het moment waarop een afvalstof ophoudt afval te zijn en onder REACH valt (Kaderrichtlijn Afval 2008/98/EG).'],
        ['CSR (Art. 14)', 'Chemical Safety Report — chemischeveiligheidsrapport, verplicht bij ≥10 ton/jaar voor gevaarlijke stoffen.'],
        ['SDS (Art. 31)', 'Safety Data Sheet — veiligheidsinformatieblad, 16 rubrieken conform Bijlage II.'],
        ['IUCLID', 'International Uniform ChemicaL Information Database — ECHA-software voor registratiedossiers.'],
        ['OSOR', 'One Substance, One Registration — gezamenlijke registratieplicht (Art. 11).'],
        ['LoA', 'Letter of Access — recht om te verwijzen naar consortiumdata voor registratie.'],
        ['eSDS', 'Extended Safety Data Sheet — SDS inclusief blootstellingsscenario\'s (verplicht bij ≥10 ton/jaar).'],
        ['DNEL / PNEC', 'Derived No Effect Level / Predicted No Effect Concentration — veiligheidsdrempels voor mens en milieu.'],
    ]
)

doc.add_page_break()

# ════════════════════════════════════════
# 4. VERANTWOORDELIJKHEDEN
# ════════════════════════════════════════
doc.add_heading('4. Verantwoordelijkheden', level=1)

add_table(doc,
    ['Rol', 'Verantwoordelijkheid', 'Bevoegdheid'],
    [
        ['HSEQ Manager (procedure-eigenaar)', 'Beheer REACH-procedure; stoffeninventarisatie; SVHC-monitoring; PPORD/registratiecoördinatie; interne audits; SDS-beheer', 'Proces stoppen bij non-compliance'],
        ['Directie', 'Goedkeuring procedure; budgetbeschikking registratie/LoA; strategische REACH-beslissingen', 'Financiële en strategische besluitvorming'],
        ['Inkoop', 'SDS-verwerving bij leveranciers; leverancierscommunicatie REACH-status; nieuwe stoffen melden bij HSEQ', 'Inkooporders goedkeuren/weigeren'],
        ['Productie / Operations', 'Blootstellingsregistratie CMR-stoffen; PBM-gebruik conform eSDS; operationaleren blootstellingsscenario\'s', 'Werkonderbreking bij onveilige situaties'],
        ['Laboratorium', 'Stofidentificatie (CAS, EG, zuiverheid); analytische onderbouwing sameness checks; karak-terisering UVCB-mengsels', 'Vrijgave/afkeur grond- en eindproducten'],
    ]
)

doc.add_page_break()

# ════════════════════════════════════════
# 5. PROCESSTAPPEN
# ════════════════════════════════════════
doc.add_heading('5. Processtappen', level=1)

# 5a
doc.add_heading('5a. Stoffeninventarisatie opzetten en onderhouden (Art. 3)', level=2)
doc.add_paragraph(
    'De HSEQ Manager voert een volledige inventarisatie uit van alle stoffen die binnen Phoenix Metals '
    'worden ingekocht, geproduceerd, of verwerkt. De inventarisatie wordt vastgelegd in het Stoffeninventarisregister '
    '(zie Bijlage A) en bevat minimaal:'
)
add_numbered(doc, [
    'Chemische naam (IUPAC), CAS-nummer, EG-nummer.',
    'CLP-classificatie (gevarenklassen, H-zinnen, pictogrammen, signaalwoord).',
    'Fysieke vorm en concentratie/zuiverheid.',
    'Jaarvolume (actueel en prognose).',
    'REACH-registratiestatus (geregistreerd, PPORD, vrijgesteld, niet-geregistreerd).',
    'Leverancier + contactgegevens.',
    'SDS beschikbaar (ja/nee) + versienummer + datum.',
    'Opslaglocatie en -condities (conform PGS 15).',
    'SVHC-status (controle tegen ECHA-kandidaatlijst).',
])
doc.add_paragraph(
    'Onderhoud: continue bij nieuwe stoffen; jaarlijkse volledige review (Q1).'
)

# 5b
doc.add_heading('5b. REACH-rollenbepaling per stof', level=2)
doc.add_paragraph(
    'Voor elke stof in de inventarisatie wordt de REACH-rol bepaald. Phoenix Metals kent drie mogelijke rollen:'
)
add_table(doc,
    ['Rol', 'Voorwaarde', 'Waarschijnlijkheid Phoenix Metals', 'Verplichting'],
    [
        ['Fabrikant (Art. 3(8))', 'Stof is een "nieuwwaarde" creatie die niet als zodanig op de markt is', 'Laag', 'Registratie bij ≥1 ton/jaar'],
        ['Recovered substances (Art. 2(7)(d))', 'Stof identiek aan reeds geregistreerde stof; afvalstof ondergaan EoW', 'Hoogst', 'Sameness check; geen aparte registratie nodig'],
        ['Downstreamgebruiker (Art. 3(13))', 'Stof reeds geregistreerd door leverancier/consortium', 'Hoog (grondstoffen)', 'SDS opvolgen; DU-verplichtingen Art. 37-39'],
    ]
)
doc.add_paragraph(
    'Voor de Phoenix Metals-casus geldt: grondstoffen (H₂SO₄, NaOH, etc.) zijn reeds geregistreerd — '
    'Phoenix Metals is downstream user. Voor de uitgangsstoffen (V₂O₅, Fe₂O₃, CaSO₄) is de meest '
    'waarschijnlijke route "recovered substances" na EoW, mits sameness met reeds geregistreerde stoffen wordt aangetoond.'
)

# 5c
doc.add_heading('5c. Registratieplicht beoordelen (Art. 5-6)', level=2)
doc.add_paragraph(
    'Voor elke stof waarvoor Phoenix Metals als fabrikant of importeur kwalificeert, wordt de '
    'registratieplicht beoordeeld:'
)
add_numbered(doc, [
    'Bepaal het jaartonnage per stof (gewogen gemiddelde over 12 maanden).',
    'Toets tegen de registratiedrempel van 1 ton/jaar (Art. 5).',
    'Controleer vrijstellingen: Bijlage IV (minimaal risico), Bijlage V (bepaalde stoffen), gerecycleerde stoffen (Art. 2(7)(d)), PPORD (Art. 9), polymeren (monomeren ≥2% en ≥1 ton wel registreren).',
    'Controleer of de stof als "beschouwd als geregistreerd" kwalificeert (biociden, gewasbeschermingsmiddelen, NONS).',
    'Bepaal de tonnageband voor informatie-eisen: 1-10 t/j (Bijlage VII), 10-100 t/j (VII+VIII), 100-1000 t/j (VII-IX), ≥1000 t/j (VII-X).',
    'Documenteer de beoordeling inclusief beslissing en onderbouwing.',
])

# 5d
doc.add_heading('5d. PPORD-notificatie indienen bij <1 ton/jaar demo (Art. 9)', level=2)
doc.add_paragraph(
    'Indien Phoenix Metals een niet-geregistreerde stof wil produceren of gebruiken voor R&D-doeleinden, '
    'en het volume de 1 ton/jaar niet overschrijdt, kan gebruik worden gemaakt van de PPORD-vrijstelling:'
)
add_numbered(doc, [
    'Bepaal of de activiteit kwalificeert als PPORD: wetenschappelijke ontwikkeling gericht op product- of procesontwikkeling (Art. 3(23)).',
    'Verzamel de vereiste gegevens: stofidentiteit (naam, CAS, EG, molecuulformule), onderzoeksdoel, locatie (PlantOne Rotterdam), verwacht tonnage, tijdsbestek (max. 5 jaar), risicobeheersmaatregelen.',
    'Dien de PPORD-notificatie in via ECHA REACH-IT.',
    'Ontvang bevestiging en bewaar deze in het REACH-compliance archief.',
    'Hanteer strikte voorwaarden: stof alleen gebruiken voor gemeld doel, op gemelde locatie, met adequate risicobeheersing.',
    'Monitor de voortgang: bij overschrijding van 1 ton/jaar of commerciële toepassing → overgang naar volledige registratie (stap 5e).',
])
doc.add_paragraph(
    'Let op: In de demo-fase (≤60 kg ash, <1 ton/jaar) is PPORD-notificatie formeel niet verplicht, '
    'maar wordt sterk aanbevolen als best practice ter verduidelijking van de rechtspositie.'
)

# 5e
doc.add_heading('5e. Volledige registratie voorbereiden bij ≥1 ton/jaar (Art. 10)', level=2)
doc.add_paragraph(
    'Zodra de productie van een stof de 1 ton/jaar-drempel overschrijdt, start het registratietraject:'
)
add_numbered(doc, [
    'Inquiry (Art. 26): Controleer via ECHA REACH-IT of de stof reeds is geregistreerd door andere partijen.',
    'Neem contact op met bestaande registranten voor data-sharing (Art. 27). ECHA bevordert contact via de Mederegistranten-pagina.',
    'Voor vanadiumverbindingen: neem contact op met het Vanadium REACH Consortium (vanadiumconsortium.com) voor een LoA (Letter of Access).',
    'Voer een sameness check uit: vergelijk analytische data (XRD, XRF, ICP-OES) van uw stof met het consortium-profiel. Documenteer de uitkomst.',
    'Verkrijg de LoA: offerte aanvragen, budgetbeschikking directie, ondertekening overeenkomst, betaling, ontvangst referentienummer.',
    'Stel het IUCLID-dossier op: stofidentiteit, fysisch-chemische eigenschappen, toxicologie, ecotoxicologie, indeling/etikettering, gebruiksinformatie, testvoorstellen.',
    'Stel een CSR op bij ≥10 ton/jaar (Deel A: samenvatting risicobeheersmaatregelen; Deel B: gevarenbeoordeling, blootstellingsbeoordeling, risicokarakterisering).',
    'Dien het dossier elektronisch in via REACH-IT. ECHA voert controles uit: validatie → business rules → indieningsnummer → TCC → financiële volledigheid → registratienummer.',
    'Bewaar alle documentatie conform Art. 36 (10 jaar na laatste levering).',
])
doc.add_paragraph(
    'Kostenraming: LoA Vanadium Consortium €15.000–40.000; volledige registratie FOAK €120.000–290.000.'
)

# 5f
doc.add_heading('5f. SDS-verwerving en -beheer (Art. 31, Bijlage II)', level=2)
doc.add_paragraph(
    'Voor alle gevaarlijke stoffen (CLP-geclassificeerd), PBT/vPvB-stoffen, en SVHC-kandidaatstoffen '
    'moet een Safety Data Sheet (SDS) beschikbaar zijn:'
)
add_numbered(doc, [
    'Verkrijg de SDS bij de leverancier vóór eerste gebruik van de stof. De SDS is gratis en wordt uiterlijk bij eerste levering verstrekt (Art. 31.1-2).',
    'Controleer de SDS op volledigheid: alle 16 rubrieken conform Bijlage II REACH aanwezig, in het Nederlands (officiële taal lidstaat), datum ≤3 jaar geleden.',
    'Rubriek 2: gevarenidentificatie (indeling, etikettering, PBT/vPvB, endocriene disruptors).',
    'Rubriek 3: samenstelling (inclusief SCL, M-factor, ATE).',
    'Rubriek 8: blootstellingsbeheersing (OEL\'s, DNEL\'s, PNEC\'s, technische maatregelen, PBM\'s).',
    'Archiveer de SDS (zowel papieren als digitaal) in het SDS-register.',
    'Bij nieuwe informatie of wijziging classificatie: leverancier is verplicht de SDS bij te werken (Art. 31.9). HSEQ controleert jaarlijks actualiteit.',
    'Bij eigen productie van stoffen/mengsels: stel zelf een SDS op conform Bijlage II. In de demo-fase (<1 ton/jaar) niet verplicht, maar aanbevolen.',
])

# 5g
doc.add_heading('5g. eSDS doorlezen en blootstellingsscenario\'s implementeren', level=2)
doc.add_paragraph(
    'Bij ≥10 ton/jaar én een gevaarlijke/PBT/vPvB-stof ontvangt Phoenix Metals een uitgebreid veiligheidsinformatieblad '
    '(eSDS) met blootstellingsscenario\'s (ES):'
)
add_numbered(doc, [
    'Lees de eSDS door bij ontvangst. Identificeer de relevante blootstellingsscenario\'s voor de Phoenix Metals-toepassing.',
    'Vergelijk de operationele omstandigheden (OC\'s) en risicobeheersmaatregelen (RMM\'s) in het ES met de daadwerkelijke werkomstandigheden.',
    'Is het gebruik gedekt door het ES? → Implementeer de voorgeschreven OC\'s en RMM\'s. Documenteer de implementatie.',
    'Is het gebruik NIET gedekt? → Kies uit: (a) vraag leverancier gebruik op te nemen in CSR, (b) pas eigen omstandigheden aan, (c) vervang de stof, (d) zoek andere leverancier, (e) stel eigen DU-CSR op (Art. 37.4).',
    'Implementeer de maatregelen binnen 12 maanden na ontvangst van de eSDS (Art. 37.5).',
    'Gebruik blootstellingsmodellen ter onderbouwing: Ecetoc TRA, Stoffenmanager, ART, EUSES, ConsExpo. RCR < 1 = veilig.',
])

# 5h
doc.add_heading('5h. SVHC-monitoring (Art. 59, kandidaatlijst check)', level=2)
doc.add_paragraph(
    'De HSEQ Manager monitort structureel de ECHA-kandidaatlijst voor SVHC\'s:'
)
add_numbered(doc, [
    'Controleer de ECHA-kandidaatlijst minimaal tweemaal per jaar (ECHA updatet normaliter in januari en juli).',
    'Toets elke stof in de inventarisatie tegen de actuele kandidaatlijst (zie Bijlage C: SVHC-monitoringlijst).',
    'Bij een nieuwe SVHC in de inventarisatie: update het SDS, pas etikettering aan, informeer downstream users (Art. 33).',
    'Voor V₂O₅: SVHC sinds 2023 (Repr. 1B, H361fd). Bij productie ≥1 ton/jaar: autorisatieverplichting (zie stap 5i).',
    'Voor nikkeloxide (bestanddeel SARU ash): Carc. 1A (H350i). CMR-protocol activeren; mededelingsplicht via SDS.',
    'Documenteer elke SVHC-check inclusief datum, bevindingen, en genomen acties.',
])

# 5i
doc.add_heading('5i. Autorisatie-aanvraag voorbereiden indien van toepassing (Art. 62)', level=2)
doc.add_paragraph(
    'Indien een stof op Bijlage XIV (autorisatielijst) wordt geplaatst met een sunset date, en Phoenix Metals '
    'de stof blijft gebruiken, moet een autorisatieaanvraag worden ingediend vóór de latest application date '
    '(minimaal 18 maanden vóór sunset date):'
)
add_numbered(doc, [
    'Monitor Bijlage XIV voor relevante stoffen (V₂O₅ is potentieel kandidaat).',
    'Bepaal de route: (a) adequate control (blootstelling < DNEL/PNEC), of (b) socio-economic benefits (voordelen outweigh risico\'s, geen alternatieven).',
    'Stel een Analysis of Alternatives (AoA) op: identificeer veiligere, technisch en economisch haalbare, beschikbare alternatieven. Bij beschikbaarheid: substitution plan verplicht.',
    'Bij socio-economic route: stel een SEA op (non-use scenario, kosten en baten van vervanging).',
    'Dien de aanvraag in via ECHA. Evaluatie: RAC (4-10 maanden) + SEAC → Commissiebesluit (minimaal 6 maanden).',
    'DU-melding aan ECHA binnen 3 maanden na eerste levering van geautoriseerde stof (Art. 66).',
])

# 5j
doc.add_heading('5j. Restrictie-compliance check Bijlage XVII (Art. 67)', level=2)
doc.add_paragraph(
    'Bijlage XVII bevat restricties voor specifieke stoffen (vb. asbest = volledig verbod, ftalaten = concentratielimieten, '
    'gebruikbeperkingen). Phoenix Metals toetst als volgt:'
)
add_numbered(doc, [
    'Controleer bij introductie van elke nieuwe stof of deze voorkomt in Bijlage XVII.',
    'Voor elke reeds geïnventariseerde stof: verifieer of de toepassing en concentratie conform de restrictievoorwaarden.',
    'Bij twijfel: raadpleeg de ECHA-restrictiedatabase of schakel een REACH-adviseur in.',
    'Documenteer de restrictiecheck per stof in het Stoffeninventarisregister.',
    'Bewaartermijn: 10 jaar na laatste levering (Art. 36).',
])

doc.add_page_break()

# ════════════════════════════════════════
# 6. END-OF-WASTE PROCEDURE
# ════════════════════════════════════════
doc.add_heading('6. End-of-Waste procedure', level=1)
doc.add_paragraph(
    'De SARU ash en staalslakken kwalificeren initieel als afvalstof. Het EoW-moment (End-of-Waste) is '
    'de juridische grens waarop de stof ophoudt afval te zijn en REACH van toepassing wordt '
    '(Kaderrichtlijn Afval 2008/98/EG).'
)
add_numbered(doc, [
    'Bepaal of de uitgangsstof in aanmerking komt voor EoW: (a) de stof moet een certificaat van gebruik hebben, (b) er moet een markt/bestemming voor zijn, (c) de stof moet voldoen aan productnormen, (d) geen advers effecten op mens/milieu.',
    'Stel een EoW-aanvraag op inclusief: chemische samenstelling, analytische data, bestemming/gebruik, risicobeoordeling.',
    'Indien EoW wordt verleend: REACH wordt toepasselijk op dat moment. Voer de REACH-rollenbepaling uit (stap 5b) en de registratieplichtbeoordeling (stap 5c) voor de betreffende stof.',
    'Indien EoW niet (nog) wordt verleend: de stof blijft afval en REACH-registratieplicht geldt niet. Wel blijft duty of care van toepassing.',
    'Documenteer de EoW-beslissing inclusief juridische onderbouwing.',
])

# ════════════════════════════════════════
# 7. FASERING
# ════════════════════════════════════════
doc.add_heading('7. Fasering: Demo → Pilot → FOAK', level=1)
doc.add_paragraph(
    'De REACH-verplichtingen schalen mee met de projectfasen. Onderstaand overzicht specificeert '
    'de REACH-acties per fase:'
)

add_table(doc,
    ['Fase', 'Volume', 'REACH-regime', 'REACH-acties', 'Budgetraming'],
    [
        ['Demo (huidig)', '≤60 kg ash, <1 ton/jaar', 'PPORD / SR&D',
         '• Vrijwillige PPORD-notificatie ECHA (best practice)\n• SDS-verwerving alle grondstoffen\n• SVHC-check V₂O₅ en NiO\n• CLP-etikettering interne mengsels\n• CMR-protocol activeren voor NiO',
         '~€5.000'],
        ['Pilot (Q3 2026–Q4 2027)', '0,5–3 ton/jaar', 'PPORD + monitoring',
         '• PPORD-notificatie indienen bij >1 ton/jaar\n• Tonnage monitoring (maandelijks)\n• Sameness check voorbereiden\n• Contact Vanadium Consortium\n• SDS opstellen voor eigen producten',
         '€15.000–45.000'],
        ['FOAK (>2027)', '>1 ton/jaar', 'Volledige REACH-registratie',
         '• Inquiry Art. 26 bij ECHA\n• LoA Vanadium Consortium aanschaffen\n• IUCLID-dossier opstellen\n• CSR bij ≥10 ton/jaar\n• Volledige registratie via REACH-IT\n• eSDS-verplichtingen implementeren',
         '€120.000–290.000'],
    ]
)

doc.add_page_break()

# ════════════════════════════════════════
# 8. DOCUMENTATIE EN BEWAARTERMIJNEN
# ════════════════════════════════════════
doc.add_heading('8. Documentatie en bewaartermijnen (Art. 36)', level=1)
doc.add_paragraph(
    'REACH Art. 36 verplicht fabrikanten, importeurs en downstream gebruikers om alle relevante '
    'informatie gedurende ten minste 10 jaar na de laatste vervaardiging, invoer, levering of gebruik '
    'van een stof te bewaren. Het volgende geldt voor Phoenix Metals:'
)
add_numbered(doc, [
    'Stoffeninventarisregister: bewaren zolang de stof in gebruik is + 10 jaar na uitfasering.',
    'SDS-archief: alle versies bewaren, inclusief historische versies, voor 10 jaar na laatste gebruik.',
    'PPORD-notificatie en correspondentie met ECHA/Ctgb: bewaren gedurende de PPORD-periode + 10 jaar.',
    'Registratiedossiers (IUCLID, LoA, CSR): bewaren voor 10 jaar na laatste levering.',
    'SVHC-monitoring logs: bewaren voor 10 jaar na laatste check.',
    'Blootstellingsregistratie (CMR): bewaren voor duur dienstbetrekking + 40 jaar (Arbowet, strenger dan REACH).',
    'Compliance-audit rapporten: bewaren voor 10 jaar.',
    'Alle documenten worden zowel fysiek (brandwerende kast) als digitaal (back-up) gearchiveerd.',
])

# ════════════════════════════════════════
# 9. OPLEGGING EN EVALUATIE
# ════════════════════════════════════════
doc.add_heading('9. Oplegging en evaluatie', level=1)

doc.add_heading('9.1 Jaarlijkse REACH-review', level=2)
doc.add_paragraph(
    'De HSEQ Manager voert jaarlijks (Q1) een REACH-compliance review uit:'
)
add_numbered(doc, [
    'Volledige actualisatie van het Stoffeninventarisregister.',
    'SDS-review: actualiteit, volledigheid, versiecontrole.',
    'SVHC-check: toetsing tegen actuele ECHA-kandidaatlijst.',
    'Tonnage-monitoring: is de 1 ton/jaar-drempel in zicht?',
    'Beoordeling REACH-rollen: zijn er rolwijzigingen door procesaanpassingen?',
    'PGS 15-compliance opslag.',
    'Corrective actions vorige review: status en afhandeling.',
    'Rapportage aan directie met bevindingen en aanbevelingen.',
])

doc.add_heading('9.2 Training medewerkers', level=2)
doc.add_paragraph(
    'Alle medewerkers die werken met chemische stoffen ontvangen REACH/CLP-training:'
)
add_bullets(doc, [
    'Bij indiensttreding: basistraining REACH/CLP (2 uur) inclusief SDS-raadpleging, PBM-gebruik, CMR-herkenning.',
    'Jaarlijks: herhalingstraining met actuele stoffenlijst, nieuwe regelgeving, en lessons learned.',
    'Bij introductie nieuwe stoffen: specifieke instructie door HSEQ Manager.',
    'Training wordt gedocumenteerd in het trainingsregister.',
])

doc.add_page_break()

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

# Bijlage A
doc.add_heading('Bijlage A: Stoffeninventaristabel', level=2)
add_table(doc,
    ['#', 'Stofnaam', 'CAS', 'EG', 'Volume (ton/j)', 'CLP-classificatie', 'SVHC?', 'REACH-rol', 'SDS versie', 'Opslaglocatie'],
    [
        ['1', 'Zwavelzuur 25-75%', '7664-93-9', '231-639-5', '<5', 'Skin Corr. 1A', 'Nee', 'DU', '', ''],
        ['2', 'Natriumhydroxide 50%', '1310-73-2', '215-185-5', '<10', 'Skin Corr. 1A', 'Nee', 'DU', '', ''],
        ['3', 'Aluminiumsulfaat', '10043-01-3', '233-135-0', '<2', 'Geen', 'Nee', 'DU', '', ''],
        ['4', 'Calciumoxide', '1305-78-8', '215-138-9', '<1', 'Skin Corr. 1B', 'Nee', 'DU', '', ''],
        ['5', 'Magnesiumhydroxide', '1309-42-8', '215-170-3', '<1', 'Geen', 'Nee', 'DU', '', ''],
        ['6', 'Calciumhydroxide', '1305-62-0', '215-137-3', '<1', 'Skin Irrit. 2 / Eye Irrit. 2', 'Nee', 'DU', '', ''],
        ['7', 'V₂O₅ (eindproduct)', '1314-62-1', '215-239-8', '<0,5', 'Repr. 1B (H361fd)', 'Ja (2023)', 'PPORD → Fabrikant', '', ''],
        ['8', 'Vanadium-elektrolyt', 'UVCB-mengsel', '—', '<0,2', 'Acute Tox. / Repr.', 'Bevat SVHC', 'PPORD → Fabrikant', '', ''],
        ['9', 'IJzeroxide Fe₂O₃', '1309-37-1', '215-168-2', '<0,5', 'Geen', 'Nee', 'SR&D → bepalen', '', ''],
        ['10', 'Gips CaSO₄', '7778-18-9', '231-900-3', '<1', 'Geen', 'Nee', 'EoW → bepalen', '', ''],
    ]
)

doc.add_paragraph()

# Bijlage B
doc.add_heading('Bijlage B: SDS-checklist', level=2)
doc.add_paragraph('Gebruik deze checklist bij ontvangst en review van elke SDS:')
add_table(doc,
    ['#', 'Controlepunt', 'Rubriek', 'Aanwezig / Akkoord', 'Opmerkingen'],
    [
        ['1', 'SDS in het Nederlands', 'Algemeen', '', ''],
        ['2', 'Versiedatum ≤ 3 jaar geleden', 'Algemeen', '', ''],
        ['3', 'Identificatie stof en vennootschap', 'Rubriek 1', '', ''],
        ['4', 'Gevarenidentificatie (H-zinnen, pictogrammen)', 'Rubriek 2', '', ''],
        ['5', 'Samenstelling en bestanddelen', 'Rubriek 3', '', ''],
        ['6', 'Eerstehulpmaatregelen', 'Rubriek 4', '', ''],
        ['7', 'Brandbestrijdingsmaatregelen', 'Rubriek 5', '', ''],
        ['8', 'Maatregelen bij accidenteel vrijkomen', 'Rubriek 6', '', ''],
        ['9', 'Hantering en opslag', 'Rubriek 7', '', ''],
        ['10', 'Blootstellingsbeheersing / PBM', 'Rubriek 8', '', ''],
        ['11', 'Fysische en chemische eigenschappen', 'Rubriek 9', '', ''],
        ['12', 'Stabiliteit en reactiviteit', 'Rubriek 10', '', ''],
        ['13', 'Toxicologische informatie', 'Rubriek 11', '', ''],
        ['14', 'Ecologische informatie', 'Rubriek 12', '', ''],
        ['15', 'Verwijderingsinstructies', 'Rubriek 13', '', ''],
        ['16', 'Transportinformatie', 'Rubriek 14', '', ''],
        ['17', 'Regelgeving', 'Rubriek 15', '', ''],
        ['18', 'Overige informatie', 'Rubriek 16', '', ''],
    ]
)

doc.add_paragraph()

# Bijlage C
doc.add_heading('Bijlage C: SVHC-monitoringlijst', level=2)
doc.add_paragraph('Toetsing ECHA-kandidaatlijst —minimum tweemaal per jaar (januari/juli):')
add_table(doc,
    ['#', 'Stof', 'CAS', 'SVHC-status', 'Laatste check', 'Kandidaatlijst datum', 'Actie vereist'],
    [
        ['1', 'V₂O₅', '1314-62-1', 'Ja (SVHC sinds 2023)', '', '2023', 'Autorisatie bij ≥1 ton/jaar'],
        ['2', 'Nikkeloxide (in SARU ash)', '1313-99-1', 'Carc. 1A — check kandidaatlijst', '', '', 'CMR-protocol; SDS-vermelding'],
        ['3', 'Natriummetavanaadaat', '13718-26-8', 'Nee — check actualiteit', '', '', 'Monitoren'],
        ['4', 'Trinatriumorthowanaadaat', '—', 'Nee — check actualiteit', '', '', 'Monitoren'],
    ]
)

doc.add_paragraph()
doc.add_paragraph()

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run('— Einde document —')
r.italic = True
r.font.color.rgb = RGBColor(128, 128, 128)

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