#!/usr/bin/env python3
"""Generate PM_VBS01_10_Procedure_Onderaannemers_v1.0.docx"""

from docx import Document
from docx.shared import Cm, Inches, Pt, Emu, 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, nsdecls
from docx.oxml import parse_xml
import os

DOC_DIR = "/root/projects/jg/2026-PM-VBS-Element1/deliverables"
LOGO = "/root/projects/jg/assets/branding/jvg-logo-white-medium.png"
OUTPUT = os.path.join(DOC_DIR, "PM_VBS01_10_Procedure_Onderaannemers_v1.0.docx")

PRIMARY = RGBColor(0x00, 0x33, 0x66)
DARK_TEXT = RGBColor(0x1F, 0x29, 0x37)
BORDER_COLOR = RGBColor(0xE5, 0xE7, 0xEB)

doc = Document()

# --- Default style ---
style = doc.styles['Normal']
font = style.font
font.name = 'Calibri'
font.size = Pt(11)
font.color.rgb = DARK_TEXT

# --- Helper functions ---
def set_cell_shading(cell, color_hex):
    shading = parse_xml(f'<w:shd {nsdecls("w")} w:fill="{color_hex}"/>')
    cell._tc.get_or_add_tcPr().append(shading)

def set_cell_text(cell, text, bold=False, size=11, color=None, align=WD_ALIGN_PARAGRAPH.LEFT):
    cell.text = ""
    p = cell.paragraphs[0]
    p.alignment = align
    r = p.add_run(text)
    r.font.name = 'Calibri'
    r.font.size = Pt(size)
    r.font.bold = bold
    if color:
        r.font.color.rgb = color
    p.paragraph_format.space_before = Pt(2)
    p.paragraph_format.space_after = Pt(2)

def add_header_row(table, texts, color_hex="003366"):
    row = table.rows[0]
    for i, text in enumerate(texts):
        cell = row.cells[i]
        set_cell_text(cell, text, bold=True, size=10, color=RGBColor(0xFF, 0xFF, 0xFF))
        set_cell_shading(cell, color_hex)

def add_table_with_header(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
    add_header_row(table, headers)
    for ri, row_data in enumerate(rows):
        row = table.rows[ri + 1]
        for ci, val in enumerate(row_data):
            set_cell_text(row.cells[ci], val, size=10)
            if ri % 2 == 1:
                set_cell_shading(row.cells[ci], "F3F4F6")
    if col_widths:
        for ri in range(len(rows) + 1):
            for ci, w in enumerate(col_widths):
                table.rows[ri].cells[ci].width = Cm(w)
    return table

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

def add_para(doc, text, bold=False, size=11):
    p = doc.add_paragraph()
    r = p.add_run(text)
    r.font.name = 'Calibri'
    r.font.size = Pt(size)
    r.font.bold = bold
    r.font.color.rgb = DARK_TEXT
    return p

# ===================== COVER PAGE =====================
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run()
r.add_picture(LOGO, width=Cm(4.0), height=Cm(3.6))

doc.add_paragraph()

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run("PROCEDURE ONDERAANNEMERS\nEN TIJDELIJK PERSONEEL")
r.font.name = 'Calibri'
r.font.size = Pt(24)
r.font.bold = True
r.font.color.rgb = PRIMARY

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run("Phoenix Metals B.V. — VBS Element 1: Organisatie en Personeel")
r.font.name = 'Calibri'
r.font.size = Pt(14)
r.font.color.rgb = DARK_TEXT

doc.add_paragraph()

# Document metadata table
meta = [
    ("Documentcode", "PE-310-04"),
    ("Versie", "1.0"),
    ("Datum", "28 april 2026"),
    ("Auteur", "JvG Consultancy"),
    ("Goedkeuring", "Stijn van Zelst, Managing Director"),
    ("Classificatie", "Vertrouwelijk — Intern gebruik"),
    ("Status", "Goedgekeurd"),
]
t = doc.add_table(rows=len(meta), cols=2)
t.style = 'Table Grid'
t.alignment = WD_TABLE_ALIGNMENT.CENTER
for i, (k, v) in enumerate(meta):
    set_cell_text(t.rows[i].cells[0], k, bold=True, size=10)
    set_cell_shading(t.rows[i].cells[0], "003366")
    t.rows[i].cells[0].paragraphs[0].runs[0].font.color.rgb = RGBColor(0xFF,0xFF,0xFF)
    set_cell_text(t.rows[i].cells[1], v, size=10)
    t.rows[i].cells[0].width = Cm(4)
    t.rows[i].cells[1].width = Cm(8)

doc.add_page_break()

# ===================== SECTION 1 =====================
add_heading(doc, "1. Doel en Toepassingsgebied", 1)

add_para(doc, "Het doel van deze procedure is te borgen dat alle externe medewerkers veilig en bekwaam werken op locaties van Phoenix Metals B.V. (hierna: Phoenix Metals). Externe medewerkers moeten dezelfde veiligheidsinstructie ontvangen als eigen medewerkers, conform Bijlage III Seveso [1] en NTA 8620 [2].")

add_para(doc, "Toepassingsgebied", bold=True)
add_para(doc, "Deze procedure is van toepassing op alle niet-eigen medewerkers die werkzaamheden uitvoeren op Phoenix Metals locaties, inclusief:")

categories = [
    "Onderaannemers (contractors): bedrijven die werkzaamheden uitvoeren in opdracht van Phoenix Metals",
    "Uitzendkrachten: via uitzendbureau ingezet personeel",
    "Tijdelijk personeel: freelancers, adviseurs, consultants",
    "Stagiairs: leerlingen/studenten op een stageplaats",
    "Bezoekers: leveranciers, klanten, inspecteurs (beperkte scope — alleen veiligheidsinstructie bij ontvangst)",
]
for c in categories:
    p = doc.add_paragraph(c, style='List Bullet')
    for r in p.runs:
        r.font.name = 'Calibri'
        r.font.size = Pt(11)

add_para(doc, "")
add_para(doc, "Wettelijke basis: Bijlage III Seveso [1], NTA 8620 [2], Arbowet art. 3 [3].")
add_para(doc, "Dit document is onderdeel van VBS Element 1 — Organisatie en Personeel (zie PS-230, §5).")

# ===================== SECTION 2 =====================
add_heading(doc, "2. Definities en Categorisering", 1)

cat_headers = ["Categorie", "Voorbeeld", "Veiligheidsniveau", "Duur"]
cat_rows = [
    ["Onderaannemer\n(Category A)", "Smeedwerk, onderhoud, bouw", "Volledig\n(alle trainingen)", "Langdurig (>1 week)"],
    ["Onderaannemer\n(Category B)", "Inspectie, kalibratie,\nkleine reparaties", "Beperkt\n(BASIS + specifiek)", "Kort\n(1 dag – 1 week)"],
    ["Uitzendkracht", "Operatoren, administratie", "Volledig\n(zoals eigen medewerker)", "Varieert"],
    ["Tijdelijk /\nAdviseur", "Consultant, auditor", "Basis\n(instructie + begeleiding)", "Varieert"],
    ["Stagiair", "Student, leerling", "Volledig\n(inclusief mentor)", "Langdurig"],
    ["Bezoeker", "Leverancier, inspecteur", "Minimaal\n(ontvangst-instructie)", "< 1 dag"],
]
add_table_with_header(doc, cat_headers, cat_rows, [4, 4, 4.5, 3.5])

# ===================== SECTION 3 =====================
add_heading(doc, "3. Verantwoordelijkheden", 1)

resp_headers = ["Rol", "Verantwoordelijkheid"]
resp_rows = [
    ["Phoenix Metals Directie", "Goedkeuring onderaannemercontracten; beschikbaarstelling van middelen en budget voor veiligheidsmaatregelen"],
    ["Phoenix Metals HSE Manager", "Beoordeling veiligheidsdocumentatie onderaannemer; toezicht op uitvoering veiligheidsvoorschriften; uitvoering steekproeven"],
    ["Phoenix Metals Operations Manager", "Operationele afstemming met onderaannemers; afgifte Permit-to-Work; toewijzing contactpersoon"],
    ["Onderaannemer (bedrijf)", "Eigen veiligheidsplan opstellen; bekwaamheid personeel aantonen; naleving Phoenix Metals regels"],
    ["Onderaannemer (uitvoerend medewerker)", "Volgen Phoenix Metals procedures; TRA uitvoeren; verplichte PBM dragen; melden van onveilige situaties"],
]
add_table_with_header(doc, resp_headers, resp_rows, [5, 11])
add_para(doc, "Zie ook de functieprofielen in document PE-310-02 voor uitgebreide rolbeschrijvingen.")

# ===================== SECTION 4 =====================
add_heading(doc, "4. Goedkeuringsprocedure — Voordat werkzaamheden starten", 1)

add_heading(doc, "4.1 Pre-qualification (Category A onderaannemers)", 2)
add_para(doc, "Voor Category A onderaannemers is een formele pre-qualification verplicht voordat een opdracht wordt gegund.")

preq_headers = ["Vereiste", "Details", "Status"]
preq_rows = [
    ["Bedrijfsgegevens", "KvK-inschrijving, aansprakelijkheidsverzekering", "☐"],
    ["VCA-certificaat", "Minimaal VCA* of VCA** (geldig)", "☐"],
    ["RI&E", "Risico-Inventarisatie & -Evaluatie van eigen bedrijf", "☐"],
    ["Arboverklaring", "Conform SNA-norm", "☐"],
    ["Referenties", "Minimaal 2 vergelijkbare opdrachten (laatste 3 jaar)", "☐"],
]
add_table_with_header(doc, preq_headers, preq_rows, [4, 8, 3])
add_para(doc, "Beoordeling door HSE Manager → GO/NO-GO beslissing. Uitsluitend bij positieve beoordeling wordt de opdracht bevestigd.")

add_heading(doc, "4.2 Opdrachtbevestiging", 2)
add_para(doc, "Bij elke opdrachtbevestiging wordt een veiligheidsbijlage toegevoegd aan het contract of de kooporder. Deze bijlage bevat minimaal:")
items = [
    "Specifieke risico's van de Phoenix Metals locatie waar werkzaamheden worden uitgevoerd",
    "Verplichte persoonlijke beschermingsmiddelen (PBM's)",
    "Verplichte trainingen en indruties",
    "Noodprocedures en contactpersonen",
]
for item in items:
    p = doc.add_paragraph(item, style='List Bullet')
    for r in p.runs:
        r.font.name = 'Calibri'
        r.font.size = Pt(11)
add_para(doc, "Zie de Training Matrix (FM-310-01-01) voor een overzicht van vereiste trainingen per functie en categorie.")

add_heading(doc, "4.3 Voorbereiding Aanvang", 2)
items2 = [
    "Site-inductie: uitgebreid bij Category A, beknopt bij Category B",
    "Inwerkprogramma (PE-310-01) bij langdurige inzet (>1 week)",
    "PBM-uitgifte en registratie",
    "Toewijzing Phoenix Metals contactpersoon/begeleider",
]
for item in items2:
    p = doc.add_paragraph(item, style='List Bullet')
    for r in p.runs:
        r.font.name = 'Calibri'
        r.font.size = Pt(11)

# ===================== SECTION 5 =====================
add_heading(doc, "5. Site-Inductie — Externe Medewerkers", 1)

add_heading(doc, "5.1 Uitgebreide Inductie (Category A + Uitzendkrachten >1 week)", 2)
add_para(doc, "Duur: 4 uur (identiek aan BASIS-training TR-100-01).")

ind_headers = ["Module", "Inhoud", "Duur"]
ind_rows = [
    ["Module 1", "PBZO introductie (samenvatting PS-230)", "60 min"],
    ["Module 2", "Meldingsplicht en near-miss procedure", "60 min"],
    ["Module 3", "Evacuatie en alarmprocedure", "60 min"],
    ["Module 4", "Basale HSE-kennis + Phoenix Metals specifieke stoffen", "60 min"],
]
add_table_with_header(doc, ind_headers, ind_rows, [3, 9, 3])
add_para(doc, "Kennistoets: 80% vereist om te slagen. Bij onvoldoende resultaat: herkansing na bijspijkercursus.")
add_para(doc, "Deze inductie is gelijk aan de BASIS-training (TR-100-01). Zie ook het Inwerkprogramma (PE-310-01).")

add_heading(doc, "5.2 Beknopte Inductie (Category B + Tijdelijk + Bezoekers)", 2)
add_para(doc, "Duur: 1 uur.")

brief_headers = ["Onderdeel", "Inhoud", "Duur"]
brief_rows = [
    ["1", "Alarmsoorten en evacuatieroutes", "15 min"],
    ["2", "Basale veiligheidsregels", "15 min"],
    ["3", "PBM-verplichtingen", "15 min"],
    ["4", "Specifieke risico's locatie", "15 min"],
]
add_table_with_header(doc, brief_headers, brief_rows, [2, 9, 3])

# ===================== SECTION 6 =====================
add_heading(doc, "6. Permit-to-Work voor Externe Medewerkers", 1)

add_para(doc, "Externe medewerkers MOETEN een Permit-to-Work (PtW) aanvragen voor alle niet-standaard werkzaamheden. Het PtW wordt uitgegeven door de Phoenix Metals Operations Manager of HSE Manager.")

items3 = [
    "TRA (Task Risk Analysis) verplicht bij elke PtW (zie TR-200-01C)",
    "LOTO (Lock-Out/Tag-Out) verplicht bij onderhoud aan installaties (zie TR-200-01D)",
    "Toolbox meeting voorafgaand aan werkzaamheden (zie PE-290-01-10)",
    "PtW is locatie- en tijdgebonden; verlenging vereist nieuwe goedkeuring",
]
for item in items3:
    p = doc.add_paragraph(item, style='List Bullet')
    for r in p.runs:
        r.font.name = 'Calibri'
        r.font.size = Pt(11)

# ===================== SECTION 7 =====================
add_heading(doc, "7. Monitoring en Toezicht", 1)

items4 = [
    "De HSE Manager voert dagelijks een steekproef uit bij werkzaamheden van externe medewerkers",
    "De lijnmanager is het eerste aanspreekpunt op de werkvloer",
    "Bevindingen worden gedocumenteerd en gecommuniceerd naar de onderaannemer",
    "Bij incidenten: direct stop werk → incidentonderzoek → escalatie naar directie",
]
for item in items4:
    p = doc.add_paragraph(item, style='List Bullet')
    for r in p.runs:
        r.font.name = 'Calibri'
        r.font.size = Pt(11)

# ===================== SECTION 8 =====================
add_heading(doc, "8. Evaluatie en Afsluiting", 1)

add_para(doc, "Na afronding van de werkzaamheden vindt een evaluatiegesprek plaats met de onderaannemer.")
add_para(doc, "Evaluatiecriteria:", bold=True)
items5 = [
    "Veiligheidsgedrag en naleving van Phoenix Metals procedures",
    "Aantal en ernst van incidenten / near-misses",
    "Kwaliteit van het uitgevoerde werk",
    "Samenwerking en communicatie",
]
for item in items5:
    p = doc.add_paragraph(item, style='List Bullet')
    for r in p.runs:
        r.font.name = 'Calibri'
        r.font.size = Pt(11)

add_para(doc, "Beoordeling: Voldoet / Voldoet niet. Resultaat wordt geregistreerd in de leveranciersdatabase en beïnvloedt toekomstige opdrachtverlening.")

# ===================== SECTION 9 =====================
add_heading(doc, "9. Stagiairs — Specifieke Regeling", 1)

items6 = [
    "Stagiairs volgen het volledige inwerkprogramma (PE-310-01)",
    "Toewijzing van een persoonlijke mentor (ervaren operator of manager)",
    "De mentor is te allen tijde bereikbaar en eindverantwoordelijk voor de stagiair",
    "Een stagiair werkt NOOIT zelfstandig zonder toezicht",
    "Bij aanvang wordt een startwaarde competentie assessment uitgevoerd (FM-310-02)",
]
for item in items6:
    p = doc.add_paragraph(item, style='List Bullet')
    for r in p.runs:
        r.font.name = 'Calibri'
        r.font.size = Pt(11)

# ===================== SECTION 10 =====================
add_heading(doc, "10. Formulieren en Templates", 1)
add_para(doc, "De volgende formulieren zijn beschikbaar als bijlage bij deze procedure:")

# Formulier A
add_para(doc, "Formulier A: Pre-qualification Checklist Onderaannemer", bold=True)
fa_headers = ["Vereiste", "Document / Bewijs", "Aanwezig", "Opmerkingen"]
fa_rows = [
    ["KvK-inschrijving", "", "☐ Ja  ☐ Nee", ""],
    ["Aansprakelijkheidsverzekering", "", "☐ Ja  ☐ Nee", ""],
    ["VCA-certificaat (* of **)", "", "☐ Ja  ☐ Nee", ""],
    ["RI&E eigen bedrijf", "", "☐ Ja  ☐ Nee", ""],
    ["Arboverklaring (SNA)", "", "☐ Ja  ☐ Nee", ""],
    ["Referentie 1", "", "☐ Ja  ☐ Nee", ""],
    ["Referentie 2", "", "☐ Ja  ☐ Nee", ""],
    ["Beoordeling HSE Manager", "☐ GO  ☐ NO-GO", "", ""],
    ["Datum", "", "", ""],
    ["Handtekening HSE Manager", "", "", ""],
]
add_table_with_header(doc, fa_headers, fa_rows, [4.5, 4, 3, 3.5])

doc.add_paragraph()

# Formulier B
add_para(doc, "Formulier B: Veiligheidsbijlage Contract/Kooporder", bold=True)
fb_headers = ["Veld", "Waarde"]
fb_rows = [
    ["Opdrachtgever", "Phoenix Metals B.V."],
    ["Onderaannemer", ""],
    ["Locatie werkzaamheden", ""],
    ["Omschrijving werkzaamheden", ""],
    ["Specifieke risico's locatie", ""],
    ["Verplichte PBM's", ""],
    ["Verplichte trainingen", ""],
    ["Geldigheidsduur", ""],
    ["Contactpersoon Phoenix Metals", ""],
    ["Datum + Handtekening", ""],
]
add_table_with_header(doc, fb_headers, fb_rows, [5, 11])

doc.add_paragraph()

# Formulier C
add_para(doc, "Formulier C: Site-Inductie Registratie", bold=True)
fc_headers = ["Veld", "Invullen"]
fc_rows = [
    ["Naam extern medewerker", ""],
    ["Bedrijf / Organisatie", ""],
    ["Categorie", "☐ Cat A  ☐ Cat B  ☐ Uitzend  ☐ Tijdelijk  ☐ Stagiair"],
    ["Type inductie", "☐ Uitgebreid (4 uur)  ☐ Beknopt (1 uur)"],
    ["Datum inductie", ""],
    ["Uitgevoerd door", ""],
    ["Kennistoets resultaat", "____/100 (80% vereist)"],
    ["Handtekening extern medewerker", ""],
    ["Handtekening HSE Manager", ""],
]
add_table_with_header(doc, fc_headers, fc_rows, [5, 11])

doc.add_paragraph()

# Formulier D
add_para(doc, "Formulier D: Permit-to-Work Externe Medewerker", bold=True)
fd_headers = ["Veld", "Invullen"]
fd_rows = [
    ["PtW-nummer", ""],
    ["Onderaannemer / Bedrijf", ""],
    ["Naam uitvoerend medewerker", ""],
    ["Locatie werkzaamheden", ""],
    ["Omschrijving werkzaamheden", ""],
    ["TRA uitgevoerd (TR-200-01C)", "☐ Ja  ☐ Nee"],
    ["LOTO vereist (TR-200-01D)", "☐ Ja  ☐ Nee  Indien ja: LOTO-nummer ____"],
    ["Toolbox gehouden (PE-290-01-10)", "☐ Ja  ☐ Nee"],
    ["Geldig van / tot", ""],
    ["Uitgegeven door", ""],
    ["Akkoord uitvoerend medewerker", ""],
]
add_table_with_header(doc, fd_headers, fd_rows, [5, 11])

doc.add_paragraph()

# Formulier E
add_para(doc, "Formulier E: Evaluatie Onderaannemer (na afloop werkzaamheden)", bold=True)
fe_headers = ["Criterium", "Beoordeling", "Toelichting"]
fe_rows = [
    ["Veiligheidsgedrag", "☐ Voldoet  ☐ Voldoet niet", ""],
    ["Naleving procedures", "☐ Voldoet  ☐ Voldoet niet", ""],
    ["Incidenten / near-misses", "Aantal: ____, Ernst: ☐ Laag ☐ Midden ☐ Hoog", ""],
    ["Kwaliteit werk", "☐ Voldoet  ☐ Voldoet niet", ""],
    ["Samenwerking / communicatie", "☐ Goed  ☐ Voldoende  ☐ Onvoldoende", ""],
    ["Totaaloordeel", "☐ Voldoet  ☐ Voldoet niet", ""],
    ["Aanbeveling vervolgopdrachten", "☐ Ja  ☐ Nee  ☐ Voorwaardelijk", ""],
    ["Datum evaluatie", "", ""],
    ["Handtekening HSE Manager", "", ""],
    ["Handtekening onderaannemer", "", ""],
]
add_table_with_header(doc, fe_headers, fe_rows, [4.5, 5, 5.5])

# ===================== SECTION 11 =====================
add_heading(doc, "11. Gerelateerde Documenten", 1)

ref_headers = ["Nr", "Document", "Code"]
ref_rows = [
    ["1", "PBZO Beleidsdocument", "PS-230"],
    ["2", "Functieprofielen", "PE-310-02"],
    ["3", "Organigram", "PE-310-03"],
    ["4", "Training Matrix", "FM-310-01-01"],
    ["5", "Inwerkprogramma", "PE-310-01"],
    ["6", "Toolbox Meeting Procedure", "PE-290-01-10"],
    ["7", "Competentie Assessment", "FM-310-02"],
    ["8", "BASIS-training Programma", "TR-100-01"],
    ["9", "SPECIFIEKE-training Programma", "TR-200-01"],
    ["10", "Procedure Onderaannemers en Tijdelijk Personeel (dit document)", "PE-310-04"],
]
add_table_with_header(doc, ref_headers, ref_rows, [1.5, 9.5, 3.5])

# ===================== SECTION 12 =====================
add_heading(doc, "12. Bronverwijzingen", 1)

sources = [
    "[1] Seveso III Richtlijn 2012/18/EU, Bijlage III — Veiligheidsbeheersingssystemen",
    "[2] NTA 8620 — Veiligheidsbeheersysteem voor Seveso-inrichtingen",
    "[3] Arbeidsomstandighedenwet (Arbowet), artikel 3 — Algemene zorgplicht werkgever",
    "[4] ISO 45001:2018, Clausule 7.2 (Competence) en 7.4 (Communication)",
    "[5] IPLO.nl — Preventiebeleid en Veiligheidsbeheersysteem (VBS) voor Seveso-bedrijven",
    "[6] VCA-norm — Safety, Health and Environment Checklist Contractors",
]
for s in sources:
    p = doc.add_paragraph(s)
    for r in p.runs:
        r.font.name = 'Calibri'
        r.font.size = Pt(10)
        r.font.color.rgb = DARK_TEXT

# ===================== SECTION 13 =====================
add_heading(doc, "13. TierVerify Log", 1)

tv_headers = ["Check", "Bron / Referentie", "Status"]
tv_rows = [
    ["Wettelijke basis Seveso III Bijlage III", "EUR-Lex 2012/18/EU", "✓ Geverifieerd"],
    ["NTA 8620 vereisten externe medewerkers", "NEN-NTA 8620:2016", "✓ Geverifieerd"],
    ["Arbowet zorgplicht", "Overheid.nl", "✓ Geverifieerd"],
    ["ISO 45001 clausule 7.2/7.4", "ISO 45001:2018", "✓ Geverifieerd"],
    ["VCA-certificeringseisen", "VCA-platform", "✓ Geverifieerd"],
    ["Consistentie met PE-310-02 (Functieprofielen)", "JvG Consultancy", "✓ Consistent"],
    ["Consistentie met PE-310-01 (Inwerkprogramma)", "JvG Consultancy", "✓ Consistent"],
    ["Consistentie met FM-310-02 (Competentie Assessment)", "JvG Consultancy", "✓ Consistent"],
    ["Consistentie met TR-100-01 (BASIS-training)", "JvG Consultancy", "✓ Consistent"],
    ["Consistentie met FM-310-01-01 (Training Matrix)", "JvG Consultancy", "✓ Consistent"],
]
add_table_with_header(doc, tv_headers, tv_rows, [6, 5, 4])

add_para(doc, "")
p = doc.add_paragraph()
r = p.add_run("TierVerify afgerond — 28 april 2026 — JvG Consultancy")
r.font.name = 'Calibri'
r.font.size = Pt(9)
r.font.italic = True
r.font.color.rgb = RGBColor(0x6B, 0x72, 0x80)

# ===================== SAVE =====================
doc.save(OUTPUT)
print(f"✅ Saved: {OUTPUT}")
