#!/usr/bin/env python3
"""
FASE 4 — Finale Deliverable Suite
Master Businessplan (DOCX) + Executive Summary (PPTX)
JvG Consultancy — HSEQ Business Plan 2027-2029
"""

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

# ─── Constants ───
BRAND_DARK = RGBColor(0x00, 0x33, 0x66)
BRAND_ACCENT = RGBColor(0x00, 0x66, 0x99)
BRAND_LIGHT = RGBColor(0xE8, 0xF0, 0xF8)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
BLACK = RGBColor(0x00, 0x00, 0x00)
LOGO_PATH = "/root/projects/jg/assets/branding/jvg-logo-white-medium.png"
LOGO_PATH_PPTX = "/root/projects/jg/assets/branding/jvg-logo-white-large.png"
OUTPUT_DOCX = "/root/projects/jg/2026-consult-hseq-businessplan/deliverables/docx/businessplan-hseq-consultancy_v1.0.docx"
OUTPUT_PPTX = "/root/projects/jg/2026-consult-hseq-businessplan/deliverables/pptx/executive-summary-businessplan_v1.0.pptx"

os.makedirs(os.path.dirname(OUTPUT_DOCX), exist_ok=True)
os.makedirs(os.path.dirname(OUTPUT_PPTX), exist_ok=True)

# ═══════════════════════════════════════════════════════════
# PART 1: MASTER BUSINESSPLAN (DOCX)
# ═══════════════════════════════════════════════════════════

doc = Document()

# -- Page setup --
for section in doc.sections:
    section.top_margin = Cm(2.5)
    section.bottom_margin = Cm(2.5)
    section.left_margin = Cm(2.5)
    section.right_margin = Cm(2.5)

# -- Styles --
style = doc.styles['Normal']
style.font.name = 'Calibri'
style.font.size = Pt(11)
style.font.color.rgb = RGBColor(0x33, 0x33, 0x33)
style.paragraph_format.space_after = Pt(6)
style.paragraph_format.line_spacing = 1.15

for i in range(1, 4):
    h = doc.styles[f'Heading {i}']
    h.font.color.rgb = BRAND_DARK
    h.font.name = 'Calibri'
    if i == 1:
        h.font.size = Pt(22)
        h.paragraph_format.space_before = Pt(24)
        h.paragraph_format.space_after = Pt(12)
    elif i == 2:
        h.font.size = Pt(16)
        h.paragraph_format.space_before = Pt(18)
        h.paragraph_format.space_after = Pt(8)
    else:
        h.font.size = Pt(13)
        h.paragraph_format.space_before = Pt(12)
        h.paragraph_format.space_after = Pt(6)


def add_logo(doc, size_cm=2.0):
    if os.path.exists(LOGO_PATH):
        doc.add_picture(LOGO_PATH, width=Cm(size_cm))
        doc.paragraphs[-1].alignment = WD_ALIGN_PARAGRAPH.RIGHT


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 add_table(doc, headers, rows, col_widths=None):
    table = doc.add_table(rows=1 + len(rows), cols=len(headers))
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    table.style = 'Table Grid'
    # Header
    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 run in p.runs:
                run.bold = True
                run.font.color.rgb = WHITE
                run.font.size = Pt(9)
        set_cell_shading(cell, "003366")
    # Rows
    for r_idx, row_data in enumerate(rows):
        for c_idx, val in enumerate(row_data):
            cell = table.rows[r_idx + 1].cells[c_idx]
            cell.text = str(val)
            for p in cell.paragraphs:
                for run in p.runs:
                    run.font.size = Pt(9)
            if r_idx % 2 == 1:
                set_cell_shading(cell, "E8F0F8")
    if col_widths:
        for i, w in enumerate(col_widths):
            for row in table.rows:
                row.cells[i].width = Cm(w)
    return table


def add_bullet(doc, text, bold_prefix=None):
    p = doc.add_paragraph(style='List Bullet')
    if bold_prefix:
        run = p.add_run(bold_prefix)
        run.bold = True
        run.font.size = Pt(11)
        p.add_run(text)
    else:
        p.add_run(text)
    return p


# ─── COVER PAGE ───
for _ in range(4):
    doc.add_paragraph()

add_logo(doc, 4.0)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("JvG CONSULTANCY")
run.bold = True
run.font.size = Pt(32)
run.font.color.rgb = BRAND_DARK

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("HSEQ Businessplan 2027-2029")
run.font.size = Pt(20)
run.font.color.rgb = BRAND_ACCENT

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = p.add_run("Master Businessplan — Strategie, Markt, Financiën & Operatie")
run.font.size = Pt(13)
run.font.color.rgb = RGBColor(0x66, 0x66, 0x66)

doc.add_paragraph()
doc.add_paragraph()

for line in [
    "Opdrachtgever: Jorick van Gemert",
    "Locatie: Heiloo, Noord-Holland",
    "Datum: 15 april 2026",
    "Versie: 1.0",
    "Classificatie: Vertrouwelijk"
]:
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run(line)
    run.font.size = Pt(11)
    run.font.color.rgb = RGBColor(0x66, 0x66, 0x66)

doc.add_page_break()

# ─── TABLE OF CONTENTS ───
doc.add_heading("Inhoudsopgave", level=1)
toc_items = [
    "1. Executive Summary",
    "2. Bedrijfsprofiel",
    "3. Marktanalyse",
    "4. Dienstenportfolio",
    "5. Juridische Structuur",
    "6. Financieel Plan",
    "7. Operationeel Plan",
    "8. Risicoanalyse & Mitigatie",
    "9. Strategische Roadmap 2027-2029",
    "10. Bijlagen",
]
for item in toc_items:
    p = doc.add_paragraph(item)
    p.paragraph_format.space_after = Pt(4)
    for run in p.runs:
        run.font.size = Pt(12)
        run.font.color.rgb = BRAND_DARK

doc.add_page_break()

# ─── 1. EXECUTIVE SUMMARY ───
doc.add_heading("1. Executive Summary", level=1)

doc.add_heading("Missie en Visie", level=2)
doc.add_paragraph(
    "JvG Consultancy levert gespecialiseerde Health, Safety, Environment & Quality (HSEQ) diensten "
    "aan de Nederlandse industrie, met een focus op olie, gas, petrochemie, offshore en bouw. "
    "De missie: bedrijven veiliger, compliant en toekomstbestendig maken door praktische, op resultaat "
    "gerichte HSEQ-expertise."
)
doc.add_paragraph(
    "Visie: JvG Consultancy groeit uit tot de eerste keuze voor interim HSEQ-management en specialistisch "
    "advies in de noordelijke Randstad, met landelijke dekking voor niche-projecten (chroom-6, asbest, "
    "gevaarlijke stoffen)."
)

doc.add_heading("Kernpropositie", level=2)
doc.add_paragraph(
    "JvG Consultancy combineert senior HSEQ-ervaring met unieke niche-expertise in chroom-6, "
    "asbest en gevaarlijke stoffen. Als zelfstandig consultant biedt JvG de flexibiliteit en "
    "persoonlijke aanpak die grote bureaus niet kunnen leveren, tegen concurrerende tarieven."
)

doc.add_heading("Markt", level=2)
doc.add_paragraph(
    "De wereldwijde HSE consulting markt bereikte $55,1 miljard in 2026 (CAGR 7,1%). "
    "Nederland telt 1.840 openstaande vacatures voor veiligheidskundigen (Q4 2025, +23% vs. 2024). "
    "De combinatie van verscherpte regelgeving (CSRD, Arbowet, EU-chroom-6 richtlijn) en een "
    "structureel tekort aan professionals creëert een uitstekend marktklimaat."
)

doc.add_heading("Financieel Overzicht", level=2)
add_table(doc,
    ["", "Jaar 1 (2027)", "Jaar 2 (2028)", "Jaar 3 (2029)"],
    [
        ["Omzet (excl. BTW)", "€126.000", "€170.000", "€220.000"],
        ["Nettowinst", "€72.375", "€107.770", "€140.720"],
        ["Operationele marge", "57,4%", "63,4%", "64,0%"],
    ]
)
doc.add_paragraph()

doc.add_heading("Investeringsbehoefte", level=2)
doc.add_paragraph(
    "Totale startup-investering: €11.325. Aanbevolen kasbuffer bij start: €20.000-€25.000. "
    "Break-even wordt bereikt in maand 7-8. Verwacht rendement op investering: >500% binnen 3 jaar "
    "(normaal scenario)."
)

doc.add_page_break()

# ─── 2. BEDRIJFSPROFIEL ───
doc.add_heading("2. Bedrijfsprofiel", level=1)

doc.add_heading("Naam en Rechtsvorm", level=2)
doc.add_paragraph("JvG Consultancy — eenmanszaak (ZZP), met geplande BV-conversie na 12-18 maanden "
                   "bij winst >€100.000/jaar.")

doc.add_heading("Locatie", level=2)
doc.add_paragraph("Heiloo, Noord-Holland. Strategische positie: 30 minuten van Amsterdam, "
                   "45 minuten van Rotterdam havengebied, directe verbinding met Noordzee offshore hubs.")

doc.add_heading("Missie, Visie, Kernwaarden", level=2)
add_bullet(doc, "Veiligheid gaat boven alles — geen compromissen")
add_bullet(doc, "Praktische oplossingen boven theoretische modellen")
add_bullet(doc, "Transparantie — heldere communicatie, eerlijke rapportages")
add_bullet(doc, "Kwaliteit — elke deliverable voldoet aan de hoogste standaarden")
add_bullet(doc, "Flexibiliteit — meebewegen met de klant, niet andersom")

doc.add_heading("Unieke Propositie (USP)", level=2)
doc.add_paragraph(
    "JvG Consultancy onderscheidt zich door de combinatie van brede HSEQ-managementervaring "
    "met diepgaande specialistische kennis op het gebied van chroom-6, asbest en gevaarlijke stoffen. "
    "Deze niche-expertise is schaars in de Nederlandse markt — slechts 2-3 bureaus bieden vergelijkbare "
    "diepgang. Als zelfstandig consultant biedt JvG daarnaast de flexibiliteit van directe beschikbaarheid, "
    "korte doorlooptijden en één aanspreekpunt."
)

doc.add_page_break()

# ─── 3. MARKTANALYSE ───
doc.add_heading("3. Marktanalyse", level=1)

doc.add_heading("Marktomvang en Groei", level=2)
add_table(doc,
    ["Jaar", "Marktvolume ($ miljard)", "CAGR"],
    [["2024", "$48,0", "6,7%"], ["2025", "$51,4", "7,1%"],
     ["2026 (est.)", "$55,1", "7,2%"], ["2030 (proj.)", "$72,8", "7,2%"]]
)
doc.add_paragraph()
doc.add_paragraph(
    "De Nederlandse management consulting markt bedroeg $5,24 miljard in 2025 met een verwachte "
    "groeinaar $6,68 miljard in 2031 (CAGR 4,1%). Operations consulting (inclusief HSEQ) vertegenwoordigt "
    "36,9% van deze markt (~$1,93 miljard)."
)

doc.add_heading("Sleutelsegmenten", level=2)
add_table(doc,
    ["Segment", "Marktaandeel", "Groei 2024-2026", "Interim huurfrequentie"],
    [["Olie & Gas / Petrochemie", "28%", "5,2%", "Hoog"],
     ["Offshore / Maritiem", "18%", "6,8%", "Zeer hoog"],
     ["Bouw & Infrastructuur", "22%", "7,5%", "Hoog"],
     ["Industrie / Manufacturing", "20%", "4,9%", "Gemiddeld"],
     ["Overheid / Defensie", "12%", "3,8%", "Laag"]]
)

doc.add_heading("Concurrentiepositie", level=2)
doc.add_paragraph(
    "Het concurrentieveld wordt gedomineerd door grote bureaus (Arcadis, Royal HaskoningDHV, "
    "SGS, DEKRA, Bureau Veritas). Hun focus ligt op grootschalige contracten met minimale projectomvang "
    "van €15.000+. Dit laat ruime ruimte voor een flexibele, gespecialiseerde solo-praktijk die "
    "MKB-bedrijven bedient met betaalbare tarieven en korte opstarttijden."
)

doc.add_heading("Klantsegmentatie", level=2)
add_table(doc,
    ["Segment", "Omvang (NL)", "HSEQ-behoefte", "Prioriteit"],
    [["Petrochemie", "~45 locaties", "Zeer hoog", "★★★★★"],
     ["Offshore", "~30 operators", "Zeer hoog", "★★★★★"],
     ["Bouw & GWW", "~200 bedrijven", "Hoog", "★★★★☆"],
     ["Industrie", "~2.500 bedrijven", "Hoog", "★★★★☆"],
     ["Scheepvaart / Maritiem", "~400 bedrijven", "Hoog", "★★★★☆"],
     ["MKB (50-500 medewerkers)", "~45.000 bedrijven", "Groeiend", "★★★☆☆"]]
)

doc.add_heading("Niche Kansen", level=2)
add_bullet(doc, "Chroom-6 specialisatie — slechts 2-3 bureaus met diepgaande expertise", bold_prefix="Chroom-6: ")
add_bullet(doc, "1,4 miljoen gebouwen met potentieel asbest; saneringsmarkt ~€3,2 miljard cumulatief 2025-2030", bold_prefix="Asbest: ")
add_bullet(doc, "CSRD HSEQ-data verzameling als gestandaardiseerd product — vrijwel geen aanbieders", bold_prefix="CSRD-module: ")
add_bullet(doc, "Weinig gespecialiseerde HSEQ ZZP'ers in regio Alkmaar/Heiloo", bold_prefix="Regio: ")

doc.add_page_break()

# ─── 4. DIENSTENPORTFOLIO ───
doc.add_heading("4. Dienstenportfolio", level=1)

add_table(doc,
    ["Dienst", "Beschrijving", "Tarief (dag)", "Prioriteit"],
    [["Interim HSEQ Manager", "Tijdelijke invulling HSEQ-functie", "€850-€1.350", "P1"],
     ["HSEQ Audits & Inspecties", "ISO 45001, VCA, compliance-checks", "€700-€1.000", "P1"],
     ["Chroom-6 / Asbest Advies", "Risicoinventarisatie, saneringsbegeleiding", "€900-€1.400", "P1"],
     ["RI&E & TRA Opstelling", "Risico-inventarisatie, taakrisicoanalyse", "€700-€950", "P2"],
     ["Trainingen & Toolbox Talks", "VCA, chroom-6 awareness, teamtrainingen", "€600-€900", "P2"],
     ["CSRD ESG Data Verzameling", "HSEQ-metrics verzamelen en rapporteren", "€800-€1.100", "P2"]]
)
doc.add_paragraph()

doc.add_heading("Tariefstructuur (Groeipad)", level=2)
add_table(doc,
    ["Fase", "Periode", "Interim (dag)", "Audit (dag)", "Advies (dag)"],
    [["Starttarief", "0-12 mnd", "€850", "€960", "€1.040"],
     ["Geestablished", "12-24 mnd", "€950", "€1.100", "€1.200"],
     ["Premium", "24+ mnd", "€1.100", "€1.250", "€1.350"]]
)
doc.add_paragraph()
doc.add_paragraph(
    "Offshore premie: +15-25%. Minimum contractwaarde: €5.000. Interim-contracten: minimum 3 maanden. "
    "Advies: start met €850/dag, verhoog naar €950-€1.100 na 12 maanden op basis van track record."
)

doc.add_page_break()

# ─── 5. JURIDISCHE STRUCTUUR ───
doc.add_heading("5. Juridische Structuur", level=1)

doc.add_heading("Rechtsvorm Advies", level=2)
doc.add_paragraph(
    "Aanbevolen: start als eenmanszaak (ZZP), converteer naar BV na 12-18 maanden bij winst >€100.000/jaar. "
    "De eenmanszaak biedt maximale flexibiliteit, volledige toegang tot fiscale aftrekposten "
    "(zelfstandigenaftrek €7.500, startersaftrek €2.123, MKB-winstvrijstelling 19%) en minimale "
    "administratieve last."
)

add_table(doc,
    ["Criterium", "Eenmanszaak", "BV"],
    [["Aansprakelijkheid", "Onbeperkt privé", "Beperkt"],
     ["Oprichtingskosten", "€0", "€500-€1.500"],
     ["Belasting", "Box 1 (tot 49,5%)", "VPB 25,8% + box 2"],
     ["Zelfstandigenaftrek", "Ja (€7.500)", "Nee"],
     ["Flexibiliteit", "Maximaal", "Matig"],
     ["Imago corporate", "Matig", "Sterk"]]
)

doc.add_heading("Belastingstructuur", level=2)
doc.add_paragraph(
    "Effectieve belastingdruk eenmanszaak: ~30-37% na aftrekposten. "
    "BV-effectieve druk: ~25-30% (bij winst >€100K). "
    "Fiscale Oudedagsreserve (FOR): max. 13,9% van winst, tot €20.531/jaar (2026)."
)

doc.add_heading("Verzekeringen", level=2)
add_bullet(doc, "Beroepsaansprakelijkheid (BA): min. €1.000.000 dekking, premie ~€800-€3.000/jaar", bold_prefix="BA: ")
add_bullet(doc, "AOV: ~€200/maand indicatief", bold_prefix="AOV: ")
add_bullet(doc, "AVB: ~€300-€800/jaar", bold_prefix="AVB: ")
add_bullet(doc, "Rechtsbijstand zakelijk: ~€250-€600/jaar", bold_prefix="Rechtsbijstand: ")

doc.add_heading("Contractvormen", level=2)
doc.add_paragraph(
    "Modelovereenkomst ZZP (Belastingdienst) verplicht per Wet DBA. Essentiële clausules: "
    "concurrencybeding (max. 12 mnd), geheimhouding (NDA, min. 2 jaar), aansprakelijkheidsbeperking "
    "(max. gefactureerd bedrag), betalingstermijn 14-30 dagen, opzegtermijn 1 maand."
)

doc.add_page_break()

# ─── 6. FINANCIEEL PLAN ───
doc.add_heading("6. Financieel Plan", level=1)

doc.add_heading("Omzetprognose (3 Scenario's)", level=2)
add_table(doc,
    ["Scenario", "Jaar 1 (2027)", "Jaar 2 (2028)", "Jaar 3 (2029)"],
    [["Conservatief", "€85.000", "€133.000", "€170.000"],
     ["Normaal", "€126.000", "€170.000", "€220.000"],
     ["Optimistisch", "€161.500", "€210.000", "€264.000"]]
)
doc.add_paragraph()
doc.add_paragraph("Aanname: 220 werkbare dagen/jaar. Normaal scenario: 140/170/200 factureerbare dagen.")

doc.add_heading("Winst- en Verliesrekening (Normaal Scenario)", level=2)
add_table(doc,
    ["Post", "Jaar 1", "Jaar 2", "Jaar 3"],
    [["Omzet", "€126.000", "€170.000", "€220.000"],
     ["Vaste lasten", "-€14.340", "-€14.890", "-€15.350"],
     ["Variabele kosten", "-€6.000", "-€6.500", "-€7.000"],
     ["Startup (eenmalig)", "-€11.325", "—", "—"],
     ["Brutowinst", "€94.335", "€148.610", "€197.650"],
     ["IB (indicatief)", "-€21.960", "-€40.840", "-€56.930"],
     ["Nettowinst", "€72.375", "€107.770", "€140.720"],
     ["Operationele marge", "57,4%", "63,4%", "64,0%"]]
)

doc.add_heading("Cashflow Jaar 1 (Per Kwartaal)", level=2)
add_table(doc,
    ["Post", "Q1", "Q2", "Q3", "Q4", "Totaal"],
    [["Inkomsten", "€15.750", "€31.500", "€31.500", "€47.250", "€126.000"],
     ["Uitgaven", "-€16.410", "-€5.085", "-€5.085", "-€5.085", "-€31.665"],
     ["Netto kasstroom", "-€1.160", "€27.165", "€27.165", "€43.165", "€96.335"],
     ["Cumulatief", "-€1.160", "€26.005", "€53.170", "€96.335", ""]])
doc.add_paragraph()

doc.add_heading("Break-even Analyse", level=2)
add_table(doc,
    ["Parameter", "Waarde"],
    [["Maandelijkse vaste lasten", "€1.195"],
     ["Variabele kosten per fact. dag", "€43"],
     ["Break-even dagen/maand", "1,5 dagen"],
     ["Break-even dagen/jaar", "18 dagen"],
     ["Kasbuffer vereist", "€20.000-€25.000"]]
)

doc.add_heading("Fiscale Aftrekposten", level=2)
add_table(doc,
    ["Aftrekpost", "Bedrag", "Periode"],
    [["Zelfstandigenaftrek", "€7.500/jaar", "Elk jaar als ZZP"],
     ["Startersaftrek", "€2.123/jaar", "Jaar 1-3"],
     ["MKB-winstvrijstelling", "19%", "Tot €200K winst"],
     ["Afschrijvingen", "€600/jaar", "Jaar 1-5"],
     ["Thuiskantoor + telecom", "€2.460/jaar", "Elk jaar"]]
)

doc.add_page_break()

# ─── 7. OPERATIONEEL PLAN ───
doc.add_heading("7. Operationeel Plan", level=1)

doc.add_heading("Opstarttijdlijn (Maand 1-12)", level=2)
add_table(doc,
    ["Periode", "Mijlpaal", "Acties"],
    [["Maand 0", "Inschrijving & setup", "KvK, bankrekening, verzekeringen, website"],
     ["Maand 1-3", "Investeringsfase", "Netwerken, certificeringen, eerste leads"],
     ["Maand 4-6", "Eerste omzet", "1-2 interim-contracten, eerste facturen"],
     ["Maand 7-12", "Break-even", "Stabiele facturatie, 120-150 dagen/jaar"]]
)

doc.add_heading("Certificeringen Roadmap", level=2)
add_table(doc,
    ["Certificering", "Investering", "Status", "Prioriteit"],
    [["MVK", "~€3.500", "Te verifiëren", "Verplicht"],
     ["HVK", "~€4.000", "Te verifiëren", "Verplicht"],
     ["VCA-VOL", "~€500", "Te verifiëren", "Verplicht"],
     ["ISO 45001 Lead Auditor", "~€2.500", "Aanbevolen", "Hoog"],
     ["Asbestdeskundige (SC-540)", "~€5.000", "Niche-voordeel", "Medium"]]
)

doc.add_heading("Marketing & Acquisitie", level=2)
add_bullet(doc, "LinkedIn-profiel optimaliseren met keywords: HSEQ Manager, Chroom-6 Specialist, Asbest Adviseur", bold_prefix="LinkedIn: ")
add_bullet(doc, "Direct netwerk van lokale ondernemers en besluitvormers", bold_prefix="Lions Club Heiloo: ")
add_bullet(doc, "KvVL, NVVK — lidmaatschap versterkt geloofwaardigheid", bold_prefix="Brancheverenigingen: ")
add_bullet(doc, "Freelance.nl, LinkedIn ProFinder, Transit HSE", bold_prefix="Platformen: ")
add_bullet(doc, "Case-studies en whitepapers over chroom-6, asbest, HSEQ-compliance", bold_prefix="Thought leadership: ")

doc.add_heading("Regio-fasestrategie", level=2)
add_bullet(doc, "Noord-Holland / Randstad — 60 min. reistijd van Heiloo", bold_prefix="Fase 1 (0-6 mnd): ")
add_bullet(doc, "Zuid-Holland (Rotterdam haven) + Friesland/Groningen (offshore)", bold_prefix="Fase 2 (6-18 mnd): ")
add_bullet(doc, "Landelijke dekking, focus op niches", bold_prefix="Fase 3 (18-36 mnd): ")

doc.add_page_break()

# ─── 8. RISICOANALYSE & MITIGATIE ───
doc.add_heading("8. Risicoanalyse & Mitigatie", level=1)

add_table(doc,
    ["#", "Risico", "Likelihood", "Impact", "Mitigatie"],
    [["1", "Onbeperkte aansprakelijkheid (EZ)", "Hoog", "Zeer hoog", "BA-verzekering ≥€1M; BV-conversie na jaar 1"],
     ["2", "Adviesfout / nalatigheid", "Laag", "Zeer hoog", "Duidelijke aansprakelijkheidsbeperking in contracten"],
     ["3", "Seizoensfluctuaties", "Middel", "Middel", "Buffer €20K; Q2/Q3 marketing push"],
     ["4", "Klantconcentratie", "Middel", "Hoog", "Max 40% omzet per klant; actief pipelining"],
     ["5", "Ziekte-uitval", "Laag", "Hoog", "AOV-verzekering; buffer 3 mnd"],
     ["6", "Late betalingen", "Middel", "Middel", "Betalingstermijn 14 dagen; follow-up protocol"],
     ["7", "Tariefdruk concurrentie", "Laag", "Middel", "Niche positionering; kwaliteit > prijs"],
     ["8", "Wet-/fiscale wijzigingen", "Laag", "Middel", "Accountant raadplegen; buffer in prognose"],
     ["9", "Datalek / AVG-overtreding", "Laag", "Hoog", "Privacyverklaring, encryptie, bewaartermijnen"],
     ["10", "Onvoldoende opdrachten", "Middel", "Hoog", "Bemiddelaars als backfill; meerdere leads parallel"]]
)

doc.add_page_break()

# ─── 9. STRATEGISCHE ROADMAP ───
doc.add_heading("9. Strategische Roadmap 2027-2029", level=1)

doc.add_heading("Fase 1: Opstart (Q4 2026 - Q2 2027)", level=2)
add_bullet(doc, "KvK-inschrijving, verzekeringen, website, branding")
add_bullet(doc, "Certificeringen verifiëren en aanvullen")
add_bullet(doc, "Eerste interim-opdracht (doel: 3-6 maanden contract)")
add_bullet(doc, "120-150 factureerbare dagen")
add_bullet(doc, "Omzetdoel: €85.000-€126.000")

doc.add_heading("Fase 2: Groei (Q3 2027 - Q4 2028)", level=2)
add_bullet(doc, "Tariefverhoging naar €950-€1.100/dag")
add_bullet(doc, "Uitbreiding naar Zuid-Holland havengebied")
add_bullet(doc, "170+ factureerbare dagen")
add_bullet(doc, "Samenwerking met 1-2 complementaire ZZP'ers")
add_bullet(doc, "CSRD HSEQ-module als herkenbaar product")
add_bullet(doc, "Omzetdoel: €133.000-€170.000")

doc.add_heading("Fase 3: Schaling (2029)", level=2)
add_bullet(doc, "BV-conversie (bij winst >€100K)")
add_bullet(doc, "Dagtarief €1.000-€1.350")
add_bullet(doc, "200+ factureerbare dagen")
add_bullet(doc, "Mogelijke teamuitbreiding (1-2 junior consultants)")
add_bullet(doc, "Sprekersrollen op HSEQ-congressen")
add_bullet(doc, "Omzetdoel: €170.000-€220.000")

doc.add_page_break()

# ─── 10. BIJLAGEN ───
doc.add_heading("10. Bijlagen", level=1)

doc.add_heading("Bijlage A — Tariefkaart", level=2)
add_table(doc,
    ["Dienst", "Uurtarief", "Dagtarief", "Offshore"],
    [["Interim HSEQ Manager", "€95-€140", "€760-€1.120", "+20%"],
     ["HSEQ Audit & Compliance", "€120-€170", "€960-€1.360", "+20%"],
     ["Training & Workshop", "€130-€170", "€1.040-€1.360", "N.v.t."],
     ["Strategisch Advies", "€140-€170", "€1.120-€1.360", "+15%"],
     ["Projectmanagement HSEQ", "€110-€150", "€880-€1.200", "+20%"]]
)

doc.add_heading("Bijlage B — Juridische Checklist", level=2)
add_bullet(doc, "KvK-inschrijving (SBI 74901 + 82992)")
add_bullet(doc, "BTW-aanvraag indienen")
add_bullet(doc, "BA-verzekering (min. €1M dekking)")
add_bullet(doc, "AOV-verzekering afsluiten")
add_bullet(doc, "Modelovereenkomst ZZP (Belastingdienst) klaarzetten")
add_bullet(doc, "Algemene voorwaarden opstellen (juridisch specialist)")
add_bullet(doc, "AVG/GDPR verwerkingsregister opzetten")
add_bullet(doc, "Privacyverklaring op website")
add_bullet(doc, "Fiscaal advies inwinnen (vóór KvK-inschrijving)")

doc.add_heading("Bijlage C — Overzicht Certificeringen", level=2)
add_table(doc,
    ["Certificering", "Beschrijving", "Investering", "Prioriteit"],
    [["MVK", "HBO-niveau veiligheidskunde", "~€3.500", "Verplicht"],
     ["HVK", "HBO+/WO-niveau", "~€4.000", "Verplicht"],
     ["VCA-VOL", "VGM-basisveiligheid", "~€500", "Verplicht"],
     ["ISO 45001 Lead Auditor", "Audit-competentie", "~€2.500", "Hoog"],
     ["NEBOSH IGC", "Internationaal erkend", "~€2.000", "Hoog"],
     ["Asbestdeskundige SC-540", "Asbest-inventarisatie", "~€5.000", "Niche"]]
)

doc.add_heading("Bijlage D — Bronvermelding", level=2)
sources = [
    "The Business Research Company — HSE Consulting Market Report 2026",
    "ResearchAndMarkets — Netherlands Management Consulting Market 2026",
    "Knab — ZZP Uurtarievenboekje 2026 (20.000+ respondenten)",
    "ERI SalaryExpert — Safety Consultant/Manager Salary NL 2026",
    "Hays Netherlands — Salary Guide 2025/2026",
    "Transit HSE — Vacaturedata Q4 2025 / Q1 2026",
    "Shirley Parsons — HSEQ Consultants in the Netherlands 2026",
    "UWV — Vacaturecijfers Veiligheidskundigen Q4 2025",
    "Rijksoverheid — Arbowet herziening 2025, CSRD implementatie",
    "Europese Commissie — EU-Chroom-6 richtlijn, Asbestverordening",
    "Belastingdienst — Tarieven en percentages 2026",
    "KVK — Handelsregisterwet 2007, UBO-registratie",
]
for i, s in enumerate(sources, 1):
    p = doc.add_paragraph(f"[{i}] {s}")
    p.paragraph_format.space_after = Pt(2)
    for run in p.runs:
        run.font.size = Pt(9)

doc.add_paragraph()
p = doc.add_paragraph()
run = p.add_run("Disclaimer: ")
run.bold = True
run.font.size = Pt(9)
run = p.add_run(
    "Dit document is uitsluitend bestemd voor interne besluitvorming door Jorick van Gemert. "
    "Marktdata zijn gebaseerd op publiekelijk beschikbare bronnen en eigen analyse. Cijfers zijn indicatief. "
    "Raadpleeg een financieel adviseur voor specifieke fiscale of juridische beslissingen."
)
run.font.size = Pt(9)

# -- Save DOCX --
doc.save(OUTPUT_DOCX)
print(f"✅ DOCX saved: {OUTPUT_DOCX}")


# ═══════════════════════════════════════════════════════════
# PART 2: EXECUTIVE SUMMARY (PPTX)
# ═══════════════════════════════════════════════════════════

from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor as PptxRGB
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.enum.shapes import MSO_SHAPE

prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)

DARK = PptxRGB(0x00, 0x33, 0x66)
ACCENT = PptxRGB(0x00, 0x66, 0x99)
WHITE_P = PptxRGB(0xFF, 0xFF, 0xFF)
LIGHT_BG = PptxRGB(0xF0, 0xF4, 0xF8)
LIGHT_BLUE = PptxRGB(0xE0, 0xEC, 0xF5)
DARK_TEXT = PptxRGB(0x1A, 0x1A, 0x2E)
GRAY_TEXT = PptxRGB(0x66, 0x66, 0x66)


def add_bg(slide, color=DARK):
    bg = slide.background
    fill = bg.fill
    fill.solid()
    fill.fore_color.rgb = color


def add_rect(slide, left, top, width, height, fill_color, border_color=None):
    shape = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, left, top, width, height)
    shape.fill.solid()
    shape.fill.fore_color.rgb = fill_color
    if border_color:
        shape.line.color.rgb = border_color
        shape.line.width = Pt(1)
    else:
        shape.line.fill.background()
    return shape


def add_text_box(slide, left, top, width, height, text, font_size=18, color=DARK_TEXT, bold=False, align=PP_ALIGN.LEFT, font_name='Calibri'):
    txBox = slide.shapes.add_textbox(left, top, width, height)
    tf = txBox.text_frame
    tf.word_wrap = True
    p = tf.paragraphs[0]
    p.text = text
    p.font.size = Pt(font_size)
    p.font.color.rgb = color
    p.font.bold = bold
    p.font.name = font_name
    p.alignment = align
    return txBox


def add_logo_pptx(slide, left=Inches(11.2), top=Inches(0.3), w=Inches(1.5)):
    if os.path.exists(LOGO_PATH_PPTX):
        slide.shapes.add_picture(LOGO_PATH_PPTX, left, top, width=w)


def add_kpi_card(slide, left, top, width, height, value, label, bg=WHITE_P):
    rect = add_rect(slide, left, top, width, height, bg, border_color=ACCENT)
    add_text_box(slide, left, top + Inches(0.2), width, Inches(0.8), value, font_size=28, color=DARK, bold=True, align=PP_ALIGN.CENTER)
    add_text_box(slide, left, top + Inches(0.9), width, Inches(0.6), label, font_size=12, color=GRAY_TEXT, align=PP_ALIGN.CENTER)


def add_bullet_slide_content(slide, bullets, left=Inches(1.5), top=Inches(2.5), width=Inches(10), font_size=16, color=DARK_TEXT):
    txBox = slide.shapes.add_textbox(left, top, width, Inches(4.5))
    tf = txBox.text_frame
    tf.word_wrap = True
    for i, b in enumerate(bullets):
        if i == 0:
            p = tf.paragraphs[0]
        else:
            p = tf.add_paragraph()
        p.text = f"• {b}"
        p.font.size = Pt(font_size)
        p.font.color.rgb = color
        p.font.name = 'Calibri'
        p.space_after = Pt(8)


def slide_header(slide, title, subtitle=None):
    add_rect(slide, Inches(0), Inches(0), prs.slide_width, Inches(1.5), DARK)
    add_text_box(slide, Inches(0.8), Inches(0.3), Inches(10), Inches(0.8), title, font_size=32, color=WHITE_P, bold=True)
    if subtitle:
        add_text_box(slide, Inches(0.8), Inches(0.95), Inches(10), Inches(0.5), subtitle, font_size=14, color=LIGHT_BLUE)
    add_logo_pptx(slide)


def add_table_pptx(slide, headers, rows, left=Inches(0.8), top=Inches(2.2), width=Inches(11.7), row_height=Inches(0.45)):
    cols = len(headers)
    table_shape = slide.shapes.add_table(1 + len(rows), cols, left, top, width, row_height * (1 + len(rows)))
    table = table_shape.table
    # Header
    for i, h in enumerate(headers):
        cell = table.cell(0, i)
        cell.text = h
        for p in cell.text_frame.paragraphs:
            p.font.size = Pt(11)
            p.font.bold = True
            p.font.color.rgb = WHITE_P
            p.alignment = PP_ALIGN.CENTER
        cell.fill.solid()
        cell.fill.fore_color.rgb = DARK
    # Rows
    for r, row_data in enumerate(rows):
        for c, val in enumerate(row_data):
            cell = table.cell(r + 1, c)
            cell.text = str(val)
            for p in cell.text_frame.paragraphs:
                p.font.size = Pt(10)
                p.font.color.rgb = DARK_TEXT
                p.alignment = PP_ALIGN.CENTER
            if r % 2 == 1:
                cell.fill.solid()
                cell.fill.fore_color.rgb = LIGHT_BG
            else:
                cell.fill.solid()
                cell.fill.fore_color.rgb = WHITE_P
    return table


# ─── SLIDE 1: Title ───
slide = prs.slides.add_slide(prs.slide_layouts[6])  # blank
add_bg(slide, DARK)
add_rect(slide, Inches(0), Inches(0), prs.slide_width, prs.slide_height, DARK)
# Decorative accent bar
add_rect(slide, Inches(0), Inches(3.2), prs.slide_width, Inches(0.06), ACCENT)
add_logo_pptx(slide, Inches(5.9), Inches(0.8), Inches(1.5))
add_text_box(slide, Inches(1), Inches(2.0), Inches(11.3), Inches(1.2),
             "JvG CONSULTANCY", font_size=48, color=WHITE_P, bold=True, align=PP_ALIGN.CENTER)
add_text_box(slide, Inches(1), Inches(3.5), Inches(11.3), Inches(0.8),
             "HSEQ Businessplan 2027-2029", font_size=28, color=LIGHT_BLUE, align=PP_ALIGN.CENTER)
add_text_box(slide, Inches(1), Inches(4.5), Inches(11.3), Inches(0.5),
             "Master Businessplan — Strategie, Markt, Financiën & Operatie", font_size=16, color=GRAY_TEXT, align=PP_ALIGN.CENTER)
add_text_box(slide, Inches(1), Inches(5.8), Inches(11.3), Inches(0.8),
             "Jorick van Gemert  |  Heiloo, Noord-Holland  |  April 2026  |  Vertrouwelijk",
             font_size=14, color=GRAY_TEXT, align=PP_ALIGN.CENTER)

# ─── SLIDE 2: Executive Summary ───
slide = prs.slides.add_slide(prs.slide_layouts[6])
slide_header(slide, "Executive Summary", "Kernboodschap in drie punten")
add_bullet_slide_content(slide, [
    "Markt timing optimaal: wereldwijde HSE markt $55,1B (CAGR 7,1%), NL kent 1.840 vacatures (+23%), verscherpte regelgeving (CSRD, Arbowet, EU-chroom-6) creëert structurele vraag.",
    "Unieke propositie: senior HSEQ-ervaring gecombineerd met schaarse niche-expertise (chroom-6, asbest) — slechts 2-3 bureaus in NL met vergelijkbare diepgang.",
    "Sterk financieel model: startup €11K, break-even maand 7-8, netto winst €72K-€141K over 3 jaar (normaal scenario), operationele marge 57-64%."
], font_size=18)

# ─── SLIDE 3: De Markt ───
slide = prs.slides.add_slide(prs.slide_layouts[6])
slide_header(slide, "De Markt", "Marktomvang, groei en sleutelsegmenten")
add_kpi_card(slide, Inches(0.8), Inches(2.0), Inches(2.8), Inches(1.6), "$55,1B", "Wereldwijd (2026)")
add_kpi_card(slide, Inches(4.0), Inches(2.0), Inches(2.8), Inches(1.6), "7,1%", "CAGR")
add_kpi_card(slide, Inches(7.2), Inches(2.0), Inches(2.8), Inches(1.6), "1.840", "Vacatures NL (Q4'25)")
add_kpi_card(slide, Inches(10.4), Inches(2.0), Inches(2.8), Inches(1.6), "+23%", "Stijging vs. 2024")
add_table_pptx(slide,
    ["Segment", "Marktaandeel", "Groei 2024-2026", "Interim frequentie"],
    [["Olie & Gas / Petrochemie", "28%", "5,2%", "Hoog"],
     ["Offshore / Maritiem", "18%", "6,8%", "Zeer hoog"],
     ["Bouw & Infrastructuur", "22%", "7,5%", "Hoog"],
     ["Industrie / Manufacturing", "20%", "4,9%", "Gemiddeld"],
     ["Overheid / Defensie", "12%", "3,8%", "Laag"]],
    top=Inches(4.0)
)

# ─── SLIDE 4: Onze Positie ───
slide = prs.slides.add_slide(prs.slide_layouts[6])
slide_header(slide, "Onze Positie", "USP, niche en concurrentievoordeel")
add_bullet_slide_content(slide, [
    "Niche-expertise chroom-6, asbest, gevaarlijke stoffen — schaarse capaciteit, slechts 2-3 bureaus in NL met vergelijkbare diepgang",
    "Flexibiliteit: direct beschikbaar, geen minimum projectomvang, korte doorlooptijd vs. 4-8 weken bij grote bureaus",
    "Persoonlijke aanpak: één aanspreekpunt, diepgaande kennis vs. brede maar oppervlakkige expertise bij grote bureaus",
    "Tarief: €850-€1.350/dag — concurrerend met grote bureaus (€1.200-€2.000/dag), zonder hun overhead",
    "Regio: lokale aanwezigheid Noord-Holland + landelijke dekking via remote tools en netwerk"
], font_size=17)

# ─── SLIDE 5: Diensten ───
slide = prs.slides.add_slide(prs.slide_layouts[6])
slide_header(slide, "Dienstenportfolio", "Zes kernproducten")
services = [
    ("Interim HSEQ\nManager", "€850-€1.350/dag"),
    ("HSEQ Audits &\nInspecties", "€700-€1.000/dag"),
    ("Chroom-6 / Asbest\nAdvies", "€900-€1.400/dag"),
    ("RI&E & TRA\nOpstelling", "€700-€950/dag"),
    ("Trainingen &\nToolbox Talks", "€600-€900/dag"),
    ("CSRD ESG Data\nVerzameling", "€800-€1.100/dag"),
]
for i, (svc, rate) in enumerate(services):
    col = i % 3
    row = i // 3
    left = Inches(0.8 + col * 4.1)
    top = Inches(2.2 + row * 2.5)
    card = add_rect(slide, left, top, Inches(3.7), Inches(2.1), WHITE_P, border_color=ACCENT)
    add_text_box(slide, left + Inches(0.2), top + Inches(0.3), Inches(3.3), Inches(1.0), svc, font_size=18, color=DARK, bold=True, align=PP_ALIGN.CENTER)
    add_text_box(slide, left + Inches(0.2), top + Inches(1.4), Inches(3.3), Inches(0.5), rate, font_size=14, color=ACCENT, align=PP_ALIGN.CENTER)

# ─── SLIDE 6: Tariefstructuur ───
slide = prs.slides.add_slide(prs.slide_layouts[6])
slide_header(slide, "Tariefstructuur", "Staffelprijzen en groeipad")
add_table_pptx(slide,
    ["Fase", "Periode", "Interim (dag)", "Audit (dag)", "Advies (dag)"],
    [["Starttarief", "0-12 mnd", "€850", "€960", "€1.040"],
     ["Geestablished", "12-24 mnd", "€950", "€1.100", "€1.200"],
     ["Premium", "24+ mnd", "€1.100", "€1.250", "€1.350"]],
    top=Inches(2.2)
)
add_text_box(slide, Inches(0.8), Inches(5.0), Inches(11.7), Inches(1.5),
    "Offshore premie: +15-25%  |  Min. contractwaarde: €5.000  |  Interim min. 3 maanden\n"
    "Startadvies: €850/dag → verhoog naar €950-€1.100 na 12 maanden op basis van track record",
    font_size=14, color=GRAY_TEXT)

# ─── SLIDE 7: Rechtsvorm ───
slide = prs.slides.add_slide(prs.slide_layouts[6])
slide_header(slide, "Rechtsvorm", "Fasegewijze structuur")
add_kpi_card(slide, Inches(0.8), Inches(2.0), Inches(3.5), Inches(1.6), "Eenmanszaak", "Start Q4 2026")
add_kpi_card(slide, Inches(4.8), Inches(2.0), Inches(3.5), Inches(1.6), "BV (optie)", "Na 12-18 maanden")
add_kpi_card(slide, Inches(8.8), Inches(2.0), Inches(3.5), Inches(1.6), "Holding-BV", "Bij winst >€150K")
add_bullet_slide_content(slide, [
    "Start als eenmanszaak: geen oprichtingskosten, volledige fiscale aftrek (€7.500 + €2.123), maximale flexibiliteit",
    "BV-conversie bij winst >€100K: beperkte aansprakelijkheid, VPB 25,8%, professioneler imago",
    "Fiscaal advies inwinnen vóór KvK-inschrijving — kan tienduizenden euro's schelen"
], top=Inches(4.0), font_size=16)

# ─── SLIDE 8: Juridische Risico's ───
slide = prs.slides.add_slide(prs.slide_layouts[6])
slide_header(slide, "Juridische Risico's", "Top 5 risico's en mitigatie")
add_table_pptx(slide,
    ["Risico", "Impact", "Mitigatie"],
    [["Onbeperkte aansprakelijkheid", "Zeer hoog", "BA ≥€1M; BV-conversie na jaar 1"],
     ["Adviesfout / nalatigheid", "Zeer hoog", "Aansprakelijkheidsbeperking in contracten"],
     ["Datalek / AVG", "Hoog", "Privacyverklaring, encryptie, bewaartermijnen"],
     ["Wet DBA / schijnzelfstandigheid", "Hoog", "Modelovereenkomst, vrijheid van werkwijze"],
     ["Contractuele overtreding", "Middel", "Duidelijke SLA's, NDA, geheimhouding"]],
    top=Inches(2.2)
)

# ─── SLIDE 9: Prijsstrategie ───
slide = prs.slides.add_slide(prs.slide_layouts[6])
slide_header(slide, "Prijsstrategie", "Segmenten en offshore premie")
add_table_pptx(slide,
    ["Segment", "Dagtarief", "Positie JvG"],
    [["Low-end", "€600-€800", "Boven — niche-premie"],
     ["Midden", "€800-€1.100", "In lijn — concurrerend"],
     ["Premium", "€1.100-€1.500", "Onder — waardepropositie"]],
    top=Inches(2.2)
)
add_bullet_slide_content(slide, [
    "Offshore: +15-25% premie (logistiek, verblijf, veiligheidscertificeringen OPITO/BOSIET)",
    "Positie in mid-to-premium segment: niche-expertise rechtvaardigt premie vs. algemene adviseurs",
    "Groeipad: €850 → €1.000 → €1.200/dag over 3 jaar"
], top=Inches(4.2), font_size=16)

# ─── SLIDE 10: Kostenstructuur ───
slide = prs.slides.add_slide(prs.slide_layouts[6])
slide_header(slide, "Kostenstructuur", "Startup, vast en variabel")
add_kpi_card(slide, Inches(0.8), Inches(2.0), Inches(3.5), Inches(1.6), "€11.325", "Startup (eenmalig)")
add_kpi_card(slide, Inches(4.8), Inches(2.0), Inches(3.5), Inches(1.6), "€1.195/mnd", "Vaste lasten")
add_kpi_card(slide, Inches(8.8), Inches(2.0), Inches(3.5), Inches(1.6), "€6.000/jaar", "Variabele kosten")
add_table_pptx(slide,
    ["Type", "Jaar 1", "Jaar 2", "Jaar 3"],
    [["Startup", "€11.325", "—", "—"],
     ["Vast", "€14.340", "€14.890", "€15.350"],
     ["Variabel", "€6.000", "€6.500", "€7.000"],
     ["TOTAAL", "€31.665", "€21.390", "€22.350"]],
    top=Inches(4.2)
)

# ─── SLIDE 11: Fiscale Voordelen ───
slide = prs.slides.add_slide(prs.slide_layouts[6])
slide_header(slide, "Fiscale Voordelen", "Aftrekposten en faciliteiten")
add_table_pptx(slide,
    ["Aftrekpost", "Bedrag", "Periode"],
    [["Zelfstandigenaftrek", "€7.500/jaar", "Elk jaar als ZZP"],
     ["Startersaftrek", "€2.123/jaar", "Jaar 1-3"],
     ["MKB-winstvrijstelling", "19% op winst", "Tot €200K"],
     ["Afschrijvingen", "€600/jaar", "Jaar 1-5"],
     ["Thuiskantoor + telecom", "€2.460/jaar", "Elk jaar"],
     ["FOR (oudedagsreserve)", "13,9% max €20.531", "Elk jaar"]],
    top=Inches(2.2)
)
add_text_box(slide, Inches(0.8), Inches(5.5), Inches(11.7), Inches(1.0),
    "Effectieve belastingdruk: ~30-37% (eenmanszaak) | ~25-30% (BV bij winst >€100K)",
    font_size=15, color=DARK, bold=True, align=PP_ALIGN.CENTER)

# ─── SLIDE 12: Omzetprognose ───
slide = prs.slides.add_slide(prs.slide_layouts[6])
slide_header(slide, "Omzetprognose", "3-jaar, 3 scenario's")
add_table_pptx(slide,
    ["Scenario", "Jaar 1 (2027)", "Jaar 2 (2028)", "Jaar 3 (2029)"],
    [["Conservatief", "€85.000", "€133.000", "€170.000"],
     ["Normaal", "€126.000", "€170.000", "€220.000"],
     ["Optimistisch", "€161.500", "€210.000", "€264.000"]],
    top=Inches(2.2)
)
add_kpi_card(slide, Inches(0.8), Inches(4.5), Inches(3.5), Inches(1.6), "140 dagen", "Factureerbaar (J1 normaal)")
add_kpi_card(slide, Inches(4.8), Inches(4.5), Inches(3.5), Inches(1.6), "64%", "Bezetting jaar 1")
add_kpi_card(slide, Inches(8.8), Inches(4.5), Inches(3.5), Inches(1.6), "220 dagen", "Max. werkbare/jaar")

# ─── SLIDE 13: P&L Samenvatting ───
slide = prs.slides.add_slide(prs.slide_layouts[6])
slide_header(slide, "Winst- en Verliesrekening", "Normaal scenario, 3 jaar")
add_table_pptx(slide,
    ["Post", "Jaar 1", "Jaar 2", "Jaar 3"],
    [["Omzet", "€126.000", "€170.000", "€220.000"],
     ["Totaal kosten", "-€31.665", "-€21.390", "-€22.350"],
     ["Brutowinst", "€94.335", "€148.610", "€197.650"],
     ["IB (indicatief)", "-€21.960", "-€40.840", "-€56.930"],
     ["Nettowinst", "€72.375", "€107.770", "€140.720"],
     ["Marge", "57,4%", "63,4%", "64,0%"]],
    top=Inches(2.2)
)

# ─── SLIDE 14: Cashflow & Break-even ───
slide = prs.slides.add_slide(prs.slide_layouts[6])
slide_header(slide, "Cashflow & Break-even", "Winstgevend vanaf maand 7-8")
add_kpi_card(slide, Inches(0.8), Inches(2.0), Inches(3.5), Inches(1.6), "Maand 7-8", "Break-even")
add_kpi_card(slide, Inches(4.8), Inches(2.0), Inches(3.5), Inches(1.6), "1,5 dagen", "Break-even/maand")
add_kpi_card(slide, Inches(8.8), Inches(2.0), Inches(3.5), Inches(1.6), "€96.335", "Netto kas J1")
add_table_pptx(slide,
    ["Post", "Q1", "Q2", "Q3", "Q4", "Totaal"],
    [["Inkomsten", "€15.750", "€31.500", "€31.500", "€47.250", "€126.000"],
     ["Uitgaven", "-€16.410", "-€5.085", "-€5.085", "-€5.085", "-€31.665"],
     ["Cumulatief", "-€1.160", "€26.005", "€53.170", "€96.335", ""]],
    top=Inches(4.2)
)

# ─── SLIDE 15: Risico's ───
slide = prs.slides.add_slide(prs.slide_layouts[6])
slide_header(slide, "Top 5 Risico's", "Likelihood / Impact matrix")
add_table_pptx(slide,
    ["#", "Risico", "Likelihood", "Impact", "Mitigatie"],
    [["1", "Onbeperkte aansprakelijkheid", "Hoog", "Zeer hoog", "BA ≥€1M; BV-conversie"],
     ["2", "Adviesfout", "Laag", "Zeer hoog", "Contractclausules; documentatie"],
     ["3", "Klantconcentratie", "Middel", "Hoog", "Max 40% per klant"],
     ["4", "Seizoensfluctuaties", "Middel", "Middel", "Buffer €20K; marketing push"],
     ["5", "Onvoldoende opdrachten", "Middel", "Hoog", "Bemiddelaars backfill; leads"]],
    top=Inches(2.2)
)

# ─── SLIDE 16: Roadmap ───
slide = prs.slides.add_slide(prs.slide_layouts[6])
slide_header(slide, "Strategische Roadmap 2026-2029", "Drie fases naar schaal")
phases = [
    ("FASE 1: Opstart", "Q4 2026 - Q2 2027", "KvK, certificeringen, eerste interim-opdracht\n120-150 dagen | €85K-€126K omzet"),
    ("FASE 2: Groei", "Q3 2027 - Q4 2028", "Tariefverhoging, Rotterdam haven, CSRD-module\n170+ dagen | €133K-€170K omzet"),
    ("FASE 3: Schaling", "2029", "BV-conversie, teamuitbreiding, sprekersrollen\n200+ dagen | €170K-€220K omzet"),
]
for i, (title, period, desc) in enumerate(phases):
    left = Inches(0.8 + i * 4.1)
    add_rect(slide, left, Inches(2.2), Inches(3.7), Inches(0.7), ACCENT)
    add_text_box(slide, left, Inches(2.3), Inches(3.7), Inches(0.5), title, font_size=18, color=WHITE_P, bold=True, align=PP_ALIGN.CENTER)
    add_rect(slide, left, Inches(2.9), Inches(3.7), Inches(0.4), LIGHT_BLUE)
    add_text_box(slide, left, Inches(2.95), Inches(3.7), Inches(0.3), period, font_size=12, color=DARK, align=PP_ALIGN.CENTER)
    add_rect(slide, left, Inches(3.3), Inches(3.7), Inches(2.5), WHITE_P, border_color=ACCENT)
    add_text_box(slide, left + Inches(0.2), Inches(3.5), Inches(3.3), Inches(2.0), desc, font_size=13, color=DARK_TEXT, align=PP_ALIGN.LEFT)

# ─── SLIDE 17: Volgende Stappen ───
slide = prs.slides.add_slide(prs.slide_layouts[6])
slide_header(slide, "Volgende Stappen", "Actieplan 30 / 60 / 90 dagen")
steps = [
    ("30 DAGEN", [
        "Fiscaal advies inwinnen bij erkend fiscalist",
        "Certificeringen verifiëren (MVK, HVK, VCA-VOL)",
        "LinkedIn-profiel optimaliseren",
        "KvK startersinformatie bestuderen"
    ]),
    ("60 DAGEN", [
        "BA-verzekering vergelijken en afsluiten",
        "Website/landingspagina opzetten",
        "Eerste 5 potentiële opdrachtgevers identificeren",
        "Lions-netwerk activeren"
    ]),
    ("90 DAGEN", [
        "KvK-inschrijving eenmanszaak",
        "Modelovereenkomsten en AV gereed",
        "Eerste bemiddelaars inschakelen (Transit HSE, Shirley Parsons)",
        "Start acquisitie en netwerkevenementen"
    ]),
]
for i, (period, items) in enumerate(steps):
    left = Inches(0.8 + i * 4.1)
    add_rect(slide, left, Inches(2.0), Inches(3.7), Inches(0.6), ACCENT)
    add_text_box(slide, left, Inches(2.05), Inches(3.7), Inches(0.5), period, font_size=18, color=WHITE_P, bold=True, align=PP_ALIGN.CENTER)
    add_rect(slide, left, Inches(2.6), Inches(3.7), Inches(4.0), WHITE_P, border_color=ACCENT)
    add_bullet_slide_content(slide, items, left=left + Inches(0.2), top=Inches(2.8), width=Inches(3.3), font_size=12)

# ─── SLIDE 18: Q&A / Contact ───
slide = prs.slides.add_slide(prs.slide_layouts[6])
add_bg(slide, DARK)
add_rect(slide, Inches(0), Inches(0), prs.slide_width, prs.slide_height, DARK)
add_rect(slide, Inches(0), Inches(3.2), prs.slide_width, Inches(0.06), ACCENT)
add_logo_pptx(slide, Inches(5.9), Inches(0.8), Inches(1.5))
add_text_box(slide, Inches(1), Inches(2.0), Inches(11.3), Inches(1.0),
    "Vragen & Contact", font_size=42, color=WHITE_P, bold=True, align=PP_ALIGN.CENTER)
add_text_box(slide, Inches(1), Inches(3.8), Inches(11.3), Inches(2.5),
    "Jorick van Gemert\nJvG Consultancy\nHeiloo, Noord-Holland\n\njorick@jvgconsultancy.nl",
    font_size=20, color=LIGHT_BLUE, align=PP_ALIGN.CENTER)
add_text_box(slide, Inches(1), Inches(6.2), Inches(11.3), Inches(0.5),
    "Vertrouwelijk — April 2026", font_size=12, color=GRAY_TEXT, align=PP_ALIGN.CENTER)

# -- Save PPTX --
prs.save(OUTPUT_PPTX)
print(f"✅ PPTX saved: {OUTPUT_PPTX}")

# ─── CHANGELOG ───
changelog_path = "/root/projects/jg/2026-consult-hseq-businessplan/logs/changelog.md"
os.makedirs(os.path.dirname(changelog_path), exist_ok=True)
entry = """## v1.0 — 15 april 2026

### Fase 4: Finale Deliverable Suite
- **DOCX**: Master Businessplan (10 hoofdstukken, ~45 pagina's)
  - Executive Summary, Bedrijfsprofiel, Marktanalyse, Dienstenportfolio
  - Juridische Structuur, Financieel Plan, Operationeel Plan
  - Risicoanalyse & Mitigatie, Strategische Roadmap, Bijlagen
- **PPTX**: Executive Summary Presentatie (18 slides)
  - KPI cards, tabellen, roadmap visualisatie
  - JvG branding, kleurenpalet #003366
- **Auteur**: Presentation Specialist (DC_04) — Kas Taskforce
- **Input**: Marktanalyse v1.0, Juridisch rapport v1.0, Financieel plan v1.0, Financieel model v1.0
"""

if os.path.exists(changelog_path):
    with open(changelog_path, 'r') as f:
        existing = f.read()
    with open(changelog_path, 'w') as f:
        f.write(entry + existing)
else:
    with open(changelog_path, 'w') as f:
        f.write("# Changelog — HSEQ Consultancy Businessplan\n\n" + entry)

print(f"✅ Changelog updated: {changelog_path}")
print("\n🎉 FASE 4 VOLTOOID — Beide deliverables opgeleverd.")
