#!/usr/bin/env python3
"""Traploop Benefietproject — Lions Alkmaar Victorie.
Genereert: Projectaanpak v1.0 + Draaiboek v1.0 (.docx).
Formaat gelijkwaardig aan LIONS_Nevenactiviteiten_Draaiboek (Conventie-standaard)."""
from docx import Document
from docx.shared import Pt, Cm, RGBColor, Inches
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import nsdecls
from docx.oxml import parse_xml

LIONS_LOGO = "/root/projects/jg/2026-jvg-training-master/assets/branding/clients/lions-logo-white.png"
OUT_DIR = "/root/projects/lions-alkmaar-victorie/2026-traploop-goed-doel/deliverables"

PRIMARY = RGBColor(0x00, 0x33, 0x66)
ACCENT_HEX = "FFB81C"
GOLD_TXT = RGBColor(0x88, 0x6E, 0x0A)
TEXT_DARK = RGBColor(0x1F, 0x29, 0x37)
TEXT_SEC = RGBColor(0x37, 0x41, 0x51)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
CARD = "F8F9FA"

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

def page_field(p):
    r = p.add_run()
    r._r.append(parse_xml(f'<w:fldChar {nsdecls("w")} w:fldCharType="begin"/>'))
    r2 = p.add_run()
    r2._r.append(parse_xml(f'<w:instrText {nsdecls("w")} xml:space="preserve"> PAGE </w:instrText>'))
    r3 = p.add_run()
    r3._r.append(parse_xml(f'<w:fldChar {nsdecls("w")} w:fldCharType="end"/>'))

def para(doc, text, size=11, color=TEXT_DARK, bold=False, italic=False,
         after=6, before=0, align=None):
    p = doc.add_paragraph()
    r = p.add_run(text)
    r.font.size = Pt(size); r.font.color.rgb = color
    r.font.bold = bold; r.font.italic = italic; r.font.name = 'Calibri'
    p.paragraph_format.space_after = Pt(after)
    p.paragraph_format.space_before = Pt(before)
    if align: p.alignment = align
    return p

def bullet(doc, text, bold_prefix=None):
    p = doc.add_paragraph(style='List Bullet')
    if bold_prefix:
        rb = p.add_run(bold_prefix); rb.font.bold = True
        rb.font.size = Pt(11); rb.font.name = 'Calibri'; rb.font.color.rgb = TEXT_DARK
    r = p.add_run(text)
    r.font.size = Pt(11); r.font.name = 'Calibri'; r.font.color.rgb = TEXT_SEC
    p.paragraph_format.space_after = Pt(4)
    return p

def h1(doc, num, text):
    p = doc.add_paragraph()
    r = p.add_run(f"{num}. {text}" if num else text)
    r.font.size = Pt(16); r.font.bold = True; r.font.name = 'Calibri'
    r.font.color.rgb = PRIMARY
    p.paragraph_format.space_before = Pt(18); p.paragraph_format.space_after = Pt(2)
    pPr = p._p.get_or_add_pPr()
    pPr.append(parse_xml(
        f'<w:pBdr {nsdecls("w")}><w:bottom w:val="single" w:sz="12" '
        f'w:space="2" w:color="{ACCENT_HEX}"/></w:pBdr>'))
    return p

def h2(doc, text):
    p = doc.add_paragraph()
    r = p.add_run(text)
    r.font.size = Pt(13); r.font.bold = True; r.font.name = 'Calibri'
    r.font.color.rgb = PRIMARY
    p.paragraph_format.space_before = Pt(12); p.paragraph_format.space_after = Pt(4)
    return p

def table(doc, headers, rows, widths=None):
    t = doc.add_table(rows=1, cols=len(headers))
    t.style = 'Table Grid'; t.alignment = WD_TABLE_ALIGNMENT.CENTER
    for i, htxt in enumerate(headers):
        c = t.rows[0].cells[i]; c.text = ""
        r = c.paragraphs[0].add_run(htxt)
        r.font.bold = True; r.font.size = Pt(10.5); r.font.color.rgb = WHITE
        r.font.name = 'Calibri'
        shade(c, "003366")
    for ri, row in enumerate(rows):
        cells = t.add_row().cells
        for ci, val in enumerate(row):
            cells[ci].text = ""
            r = cells[ci].paragraphs[0].add_run(str(val))
            r.font.size = Pt(10.5); r.font.name = 'Calibri'
            r.font.color.rgb = TEXT_DARK
            if ri % 2 == 0: shade(cells[ci], CARD)
    if widths:
        for ci, w in enumerate(widths):
            for row in t.rows: row.cells[ci].width = Cm(w)
    return t

def cover(doc, titel, subtitel, soort):
    for _ in range(4): doc.add_paragraph()
    para(doc, "LIONS ALKMAAR VICTORIE", 14, PRIMARY, bold=True,
         align=WD_ALIGN_PARAGRAPH.CENTER, after=2)
    try:
        doc.add_picture(LIONS_LOGO, width=Inches(2.2))
        doc.paragraphs[-1].alignment = WD_ALIGN_PARAGRAPH.CENTER
    except Exception: pass
    para(doc, soort.upper(), 12, GOLD_TXT, bold=True,
         align=WD_ALIGN_PARAGRAPH.CENTER, after=4, before=10)
    para(doc, titel, 26, PRIMARY, bold=True, align=WD_ALIGN_PARAGRAPH.CENTER, after=6)
    para(doc, subtitel, 13, TEXT_SEC, align=WD_ALIGN_PARAGRAPH.CENTER, after=18)
    para(doc, "Editie 2026–2027  •  Goed doel: Alzheimer Nederland", 12,
         TEXT_SEC, bold=True, align=WD_ALIGN_PARAGRAPH.CENTER, after=2)
    para(doc, "Locatie: AFAS Stadion (Victoriestadion), Alkmaar", 11, TEXT_SEC,
         align=WD_ALIGN_PARAGRAPH.CENTER, after=24)
    para(doc, "Opgesteld door JvG Consultancy namens de projectgroep", 10,
         TEXT_SEC, italic=True, align=WD_ALIGN_PARAGRAPH.CENTER)
    doc.add_page_break()

def docbeheer(doc, naam):
    h1(doc, None, "Documentbeheer")
    table(doc, ["Kenmerk", "Waarde"], [
        ("Document", naam),
        ("Versie", "1.0 (Concept)"),
        ("Datum", "18 augustus 2026"),
        ("Opsteller", "JvG Consultancy, namens Lions Alkmaar Victorie"),
        ("Eigenaar", "Projectgroep Traploop Benefietproject"),
        ("Status", "Concept — ter vaststelling projectgroep/bestuur"),
        ("Herzieningsritme", "Jaarlijks — herbruikbare opzet met goed-doel-slot"),
    ], widths=[4.5, 11.5])
    para(doc, "Dit document volgt het LIONS-draaiboekformaat van de "
         "Internationale Conventie (Nevenactiviteiten-standaard): fasering, "
         "RACI, risicoregister en bijlagen.", 9.5, TEXT_SEC, italic=True, before=6)
    doc.add_page_break()

def footer(doc):
    f = doc.sections[0].footer.paragraphs[0]
    f.alignment = WD_ALIGN_PARAGRAPH.CENTER
    r = f.add_run("Lions Alkmaar Victorie — Traploop Benefietproject  •  pagina ")
    r.font.size = Pt(8); r.font.color.rgb = TEXT_SEC; r.font.name = 'Calibri'
    page_field(f)

def toc(doc, items):
    h1(doc, None, "Inhoudsopgave")
    for num, titel in items:
        para(doc, f"{num}  {titel}", 11.5, TEXT_DARK if "." not in num else TEXT_SEC,
             bold="." not in num, after=3)
    doc.add_page_break()

def newdoc():
    doc = Document()
    for s in doc.sections:
        s.left_margin = Cm(2.2); s.right_margin = Cm(2.2)
        s.top_margin = Cm(2.0); s.bottom_margin = Cm(2.0)
    footer(doc)
    return doc

# ══════════════════ DOCUMENT 1: PROJECTAANPAK ══════════════════

def build_aanpak():
    doc = newdoc()
    cover(doc, "Traploop Benefietproject",
          "Projectaanpak & Plan — met voetbalverenigingen uit Noord-Holland",
          "Projectaanpak & Plan")
    docbeheer(doc, "Projectaanpak Traploop Benefietproject")
    toc(doc, [
        ("1", "Inleiding en Achtergrond"),
        ("2", "Doelstelling en Scope"),
        ("3", "Organisatiestructuur en Rollen"),
        ("4", "Projectfasering"),
        ("5", "Planning en Mijlpalen"),
        ("6", "Begroting en Opbrengstverdeling"),
        ("7", "Risico's en Mitigatie"),
        ("8", "Kwaliteitsborging en Evaluatie"),
        ("9", "Goedkeuring"),
    ])

    h1(doc, 1, "Inleiding en Achtergrond")
    para(doc, "Lions Alkmaar Victorie — een jonge club (opgericht 2024) binnen "
         "de Lions-organisatie — initieert hiermee een grootschalig "
         "jaarlijks benefietproject samen met voetbalverenigingen uit "
         "Noord-Holland en met AZ (voetbalclub en eigenaar van het AFAS "
         "Stadion) als beoogde partner en gastheer. Het project combineert "
         "een maatschappelijk doel (fondsenwerving) met de kracht van de "
         "regionale voetbalcommunity: kinderen van deelnemende clubs verkopen "
         "loodjes aan hun netwerk en sluiten de campagne af met een sportieve "
         "activiteit rondom het AFAS Stadion in Alkmaar.")
    para(doc, "Het concept is een erkende, beproefde vorm van fondsenwerving: "
         "loodjesverkoop door de jeugd gecombineerd met een collectieve "
         "afsluitende activiteit levert breed draagvlak én zichtbaarheid voor "
         "het goede doel. Editie 2026–2027 staat in het teken van Alzheimer "
         "Nederland.")
    para(doc, "De opzet is nadrukkelijk meerjarig: het bijbehorende draaiboek "
         "(separaat document) is herbruikbaar en wordt elk Lions-jaar met een "
         "nieuw goed doel gedraaid. Daarmee bouwt de club een structurele "
         "fondsenwervings- en relatieactiviteit op voor de regio.")

    h1(doc, 2, "Doelstelling en Scope")
    h2(doc, "2.1 Doelstellingen")
    bullet(doc, "fondsen werven voor het goede doel van het jaar (editie "
           "2026–2027: Alzheimer Nederland) én voor de deelnemende clubs.",
           "Primair — ")
    bullet(doc, "een herbruikbaar, gedocumenteerd jaardraaiboek opleveren dat "
           "elk Lions-jaar met een nieuw goed doel kan worden ingevuld.",
           "Structureel — ")
    bullet(doc, "het netwerk met AZ (eventafdeling), KNVB-district en "
           "voetbalverenigingen in Noord-Holland opbouwen en versterken.",
           "Netwerk — ")
    h2(doc, "2.2 Scope")
    table(doc, ["Aspect", "Binnen scope", "Buiten scope"], [
        ("Deelnemers", "Voetbalverenigingen Noord-Holland (jeugd)", "Verenigingen buiten Noord-Holland"),
        ("Product", "Loodjes tegen vast bedrag per stuk", "Overige wervingsproducten"),
        ("Activiteit", "Traploop / sportieve sessie rondom AFAS Stadion", "Competities, toernooien"),
        ("Partner", "AZ eventafdeling (locatie, eventueel spelers)", "Commerciële sponsoring door AZ"),
        ("Opbrengst", "Verdeling clubs / goed doel (indicatie 70/30)", "Doorlopende clubsubsidies"),
    ], widths=[3.2, 6.6, 6.2])
    h2(doc, "2.3 Succescriteria editie 1")
    bullet(doc, "Minimaal 10 deelnemende verenigingen")
    bullet(doc, "Minimaal 300 actieve jeugdverkopers")
    bullet(doc, "Positieve eindafrekening: volledige uitkering aan goed doel en clubs")
    bullet(doc, "Vastgesteld, herbruikbaar draaiboek inclusief jaaroverdracht")

    h1(doc, 3, "Organisatiestructuur en Rollen")
    para(doc, "Lions Alkmaar Victorie is organisator en eindverantwoordelijk "
         "opdrachtgever. De projectgroep wordt ingericht volgens onderstaand "
         "rollenpatroon.")
    table(doc, ["Rol", "Verantwoordelijkheid", "Bezet door"], [
        ("Projectleider", "Eindverantwoordelijk project, bestuurlijke afstemming, AZ-contact", "Lions Alkmaar Victorie"),
        ("Coördinator clubs", "Werving, inschrijving en begeleiding verenigingen", "Projectgroep"),
        ("Penningmeester", "Loodjestelling, kasbeheer, uitkering 70/30, verantwoording", "Penningmeester Lions AV"),
        ("Communicatie", "Pers, social media, clubcommunicatie, fotobeheer (AVG)", "Projectgroep"),
        ("Coördinator eventdag", "Uitvoering draaiboekdag, veiligheid, vrijwilligers, EHBO", "Projectgroep"),
        ("Liaison goed doel", "Formalisering en aanwezigheid Alzheimer Nederland", "Projectgroep"),
        ("AZ-eventafdeling", "Locatie, facilitaire ondersteuning, eventueel spelers (beoogd partner)", "Externe partner"),
    ], widths=[3.6, 8.0, 4.4])
    para(doc, "Besluitvorming: de projectgroep besluit bij meerderheid van "
         "stemmen; bij staking van stemmen beslist de projectleider. De "
         "projectleider legt verantwoording af aan het bestuur van Lions Club "
         "Alkmaar Victorie.", before=6)

    h1(doc, 4, "Projectfasering")
    table(doc, ["Fase", "Periode", "Kernactiviteiten", "Resultaat"], [
        ("0 — Ontwerp", "sep 2026", "Draaiboek en aanpak vaststellen, budget bepalen, goed doel bevestigen", "Goedgekeurd plan"),
        ("1 — Partnerschap", "sep–okt 2026", "AZ-eventafdeling benaderen, Alzheimer Nederland formaliseren, vergunning en verzekering regelen", "Getekende afspraken"),
        ("2 — Werving clubs", "okt–dec 2026", "Uitnodiging via KNVB-district en verenigingen, infobijeenkomst, inschrijving, loodjesmateriaal", "≥ 10 clubs ingeschreven"),
        ("3 — Verkoopcampagne", "jan–mrt 2027", "Loodjesverkoop jeugd, tussenstanden, prijzenacties, PR", "Verkochte loodjes"),
        ("4 — Eventdag", "apr–mei 2027", "Traploop rondom AFAS Stadion, spelerssessie, chequeoverdracht", "Geslaagde dag"),
        ("5 — Afwikkeling", "mei–jun 2027", "Eindtelling, uitkering 70/30, evaluatie, jaaroverdracht", "Verantwoording + draaiboek v2"),
    ], widths=[3.0, 2.4, 7.2, 3.4])

    h1(doc, 5, "Planning en Mijlpalen")
    table(doc, ["Mijlpaal", "Doeldatum", "Criterium"], [
        ("M1 — Goed doel vastgesteld", "30 sep 2026", "schriftelijke bevestiging Alzheimer Nederland + afspraken"),
        ("M2 — AZ-partnerschap rond", "31 okt 2026", "locatie + datum bevestigd; intentie spelersaanwezigheid"),
        ("M3 — Vergunning & verzekering", "30 nov 2026", "gemeente Alkmaar akkoord; WA-dekking geregeld"),
        ("M4 — Clubs geworven", "15 dec 2026", "≥ 10 verenigingen ingeschreven"),
        ("M5 — Campagne gelanceerd", "10 jan 2027", "loodjes bij clubs, verkoop live"),
        ("M6 — Eventdag", "apr/mei 2027", "uitvoering conform draaiboek"),
        ("M7 — Uitkering & evaluatie", "30 jun 2027", "cheque goed doel, uitkering clubs, jaaroverdracht vastgesteld"),
    ], widths=[5.4, 2.8, 7.8])

    h1(doc, 6, "Begroting en Opbrengstverdeling")
    para(doc, "Uitgangspunt: alle kosten worden zoveel mogelijk gedekt door "
         "vrienden-/hoofdsponsors; de loodjesopbrengst is bestemd voor de "
         "verdeling. Bedragen zijn richtend en worden in fase 0 vastgesteld.")
    h2(doc, "6.1 Begroting (indicatief)")
    table(doc, ["Post", "Toelichting", "Indicatie"], [
        ("Loodjes & verkoopmateriaal", "Ontwerp, druk, verkoopmap per club", "€ 1.500"),
        ("Eventdag facilitair", "EHBO, veiligheid, sanitaire voorzieningen, geluid/techniek, signage", "€ 2.000"),
        ("Catering", "Deelnemers en vrijwilligers", "€ 1.500"),
        ("Prijzen topprogramma", "Prijzen beste verkopers/clubs", "€ 1.000"),
        ("Communicatie", "Ontwerp, drukwerk, social media", "€ 500"),
        ("Onvoorzien 10%", "Reserve", "€ 650"),
        ("Totaal kosten", "", "€ 7.150"),
    ], widths=[5.0, 7.0, 4.0])
    h2(doc, "6.2 Opbrengstverdeling")
    para(doc, "Voorstel (ter vaststelling in fase 0): van de netto-"
         "opbrengst gaat 70% terug naar de deelnemende clubs (naar rato van "
         "verkochte loodjes) en 30% naar het goede doel van het jaar. Bij "
         "voorbeeld 5.000 verkochte loodjes à € 5 (€ 25.000) betekent dat "
         "€ 17.500 voor de clubs en € 7.500 voor Alzheimer Nederland, na "
         "aftrek van kosten gedekt uit sponsoring.")
    bullet(doc, "De verhouding 70/30 wordt jaarlijks herbevestigd in het "
           "goed-doel-slot van het draaiboek.")
    bullet(doc, "De penningmeester publiceert een open eindafrekening aan alle "
           "deelnemende verenigingen.")

    h1(doc, 7, "Risico's en Mitigatie")
    table(doc, ["Risico", "Kans", "Effect", "Mitigatie"], [
        ("AZ zegt nee of is onbereikbaar", "M", "H", "vroeg benaderen; alternatief: eigen sportcomplex of regionaal stadion"),
        ("Te weinig deelnemende clubs", "M", "H", "persoonlijke benadering via KNVB-district; pilot met 5–10 clubs in jaar 1"),
        ("Weinig loodjes verkocht", "M", "M", "verkooptools, duidelijke prijzen, tussenstand-competitie"),
        ("Ongeval tijdens traploop", "L", "H", "EHBO aanwezig, begeleidingsratio, toestemming ouders, WA-verzekering"),
        ("Slecht weer op eventdag", "M", "M", "reserve-indoormoment of verschuivingsdatum in AZ-afspraak"),
        ("AVG/foto's kinderen", "L", "M", "toestemmingsformulier bij inschrijving, fotobeleid"),
        ("Vergunning niet rond", "L", "H", "vroeg bij gemeente Alkmaar aantikken (M3)"),
    ], widths=[4.6, 1.6, 1.6, 8.2])

    h1(doc, 8, "Kwaliteitsborging en Evaluatie")
    bullet(doc, "Maandelijkse projectgroepvergadering met actielijst")
    bullet(doc, "Mijlpalenbewaking conform paragraaf 5; bij dreigende "
           "overschrijding direkt bestuur informeren")
    bullet(doc, "Evaluatie met clubs, AZ en goed doel na afloop (fase 5)")
    bullet(doc, "Jaaroverdracht: lessen, contacten, eindcijfers en nieuw "
           "goed-doel-slot vastgelegd in het draaiboek")

    h1(doc, 9, "Goedkeuring")
    table(doc, ["Functie", "Naam", "Datum", "Handtekening"], [
        ("Projectleider", "", "", ""),
        ("Voorzitter Lions Alkmaar Victorie", "", "", ""),
        ("Penningmeester", "", "", ""),
    ], widths=[5.5, 4.5, 2.5, 3.5])

    doc.save(f"{OUT_DIR}/Projectaanpak-Traploop-Benefiet_v1.0.docx")
    return f"{OUT_DIR}/Projectaanpak-Traploop-Benefiet_v1.0.docx"

# ══════════════════ DOCUMENT 2: DRAAIBOEK ══════════════════

def build_draaiboek():
    doc = newdoc()
    cover(doc, "Traploop Benefietproject",
          "Operationeel draaiboek — van loodjesverkoop tot stadiondag",
          "Draaiboek")
    docbeheer(doc, "Draaiboek Traploop Benefietproject")
    toc(doc, [
        ("1", "Inleiding en Werkwijze"),
        ("2", "Organisatie en Contacten"),
        ("3", "Fase 1 — Voorbereiding (september–oktober 2026)"),
        ("4", "Fase 2 — Werving van Clubs (oktober–december 2026)"),
        ("5", "Fase 3 — Loodjesverkoopcampagne (januari–maart 2027)"),
        ("6", "Fase 4 — Eventdag in het AFAS Stadion"),
        ("7", "Programma Eventdag (minuutschema)"),
        ("8", "Fase 5 — Afwikkeling en Verantwoording (mei–juni 2027)"),
        ("9", "Tijdlijn en Actieplan"),
        ("10", "RACI-Matrix"),
        ("11", "Risico's en Mitigatie"),
        ("12", "Bijlage A — Partnervoorstel AZ (one-pager)"),
        ("13", "Bijlage B — Checklist Eventdag"),
        ("14", "Bijlage C — Inschrijfformulier Vereniging"),
        ("15", "Bijlage D — Jaaroverdracht & Goed-doel-slot"),
        ("16", "Bronverwijzingen"),
    ])

    h1(doc, 1, "Inleiding en Werkwijze")
    para(doc, "Dit draaiboek beschrijft de operationele uitvoering van het "
         "Traploop Benefietproject van Lions Alkmaar Victorie — een jonge "
         "club (opgericht 2024) binnen de Lions-organisatie — editie "
         "2026–2027 met Alzheimer Nederland als goed doel. Het draaiboek is "
         "bewust opgezet als herbruikbare standaard: alle editie-specifieke "
         "gegevens staan in het goed-doel-slot (bijlage D) en worden jaarlijks "
         "vervangen.")
    bullet(doc, "Jeugdleden van voetbalverenigingen in Noord-Holland verkopen "
           "loodjes van € 5 per stuk aan familie, vrienden en bedrijven.",
           "Kernformule — ")
    bullet(doc, "De campagne mondt uit in een traploop/sportieve sessie "
           "rondom het AFAS Stadion, idealiter met AZ-spelers als gastheren "
           "voor een middagsessie.", "Afsluiting — ")
    bullet(doc, "70% van de netto-opbrengst keert terug naar de clubs (naar "
           "rato verkochte loodjes), 30% gaat naar het goede doel.",
           "Verdeling — ")

    h1(doc, 2, "Organisatie en Contacten")
    table(doc, ["Rol", "Contact", "Bereikbaarheid"], [
        ("Projectleider", "[naam — invullen]", "[tel/e-mail]"),
        ("Coördinator clubs", "[naam]", "[tel/e-mail]"),
        ("Penningmeester", "[naam]", "[tel/e-mail]"),
        ("Coördinator eventdag", "[naam]", "[tel/e-mail]"),
        ("Communicatie", "[naam]", "[tel/e-mail]"),
        ("AZ-eventafdeling", "[contactpersoon]", "[tel/e-mail]"),
        ("Alzheimer Nederland", "[contactpersoon]", "[tel/e-mail]"),
        ("EHBO / veiligheid", "[naam]", "[tel/e-mail]"),
    ], widths=[5.0, 5.5, 5.5])
    para(doc, "Noodketen eventdag: coördinator eventdag → projectleider → "
         "112 / stadionbeveiliging AZ.", before=6)

    h1(doc, 3, "Fase 1 — Voorbereiding (september–oktober 2026)")
    h2(doc, "3.1 Goed doel formaliseren")
    bullet(doc, "Alzheimer Nederland schriftelijk benaderen: doel, opzet, "
           "verwachtingen en wensen (aanwezigheid, cheque-overdracht, "
           "naamgeving in communicatie)")
    bullet(doc, "Afspraken vastleggen incl. toestemming voor gebruik logo en "
           "naam in campagnemateriaal")
    h2(doc, "3.2 Partnerschap AZ")
    bullet(doc, "Partnervoorstel (bijlage A) aanbieden bij de eventafdeling")
    bullet(doc, "Vastleggen: datum, gebruik terrein rondom stadion, "
           "faciliteiten (sanitair, EHBO-ruimte, parkeergelegenheid), "
           "mogelijkheid AZ-spelers voor middagsessie, kosten/voorwaarden")
    bullet(doc, "Terreinbezoek inplannen vóór december 2026")
    h2(doc, "3.3 Vergunning, verzekering en veiligheid")
    bullet(doc, "Melding/aanvraag evenement gemeente Alkmaar (uiterlijk "
           "november 2026 indienen)")
    bullet(doc, "WA-verzekering checken Lions Alkmaar Victorie; "
           "vrijwilligerspas aanvragen indien van toepassing")
    bullet(doc, "Veiligheidsplan opstellen: routing traploop, "
           "begeleidingsratio (1 volwassene per 10 kinderen), EHBO-post, "
           "weerscenario")

    h1(doc, 4, "Fase 2 — Werving van Clubs (oktober–december 2026)")
    bullet(doc, "Wervingsbrief + infopakket opstellen (Clubkit)")
    bullet(doc, "Aankondiging via KNVB-district Noord-Holland en eigen "
           "netwerk; persoonlijke opvolging per vereniging")
    bullet(doc, "Online infobijeenkomst (november) + inschrijving via "
           "bijlage C; sluitingsdatum 15 december")
    bullet(doc, "Na inschrijving ontvangt elke club: verkoopmap met loodjes, "
           "poster, instructieblad jeugd, toestemmingsformulier ouders")
    para(doc, "Afspraak: per vereniging één aanspreekpunt (jeugdvoorzitter "
         "of coördinator maatschappelijk betrokken).", before=4)

    h1(doc, 5, "Fase 3 — Loodjesverkoopcampagne (januari–maart 2027)")
    h2(doc, "5.1 Verkoop")
    bullet(doc, "Lanceerdatum: 10 januari 2027 — gezamenlijke aftrap via "
           "social media en clubkanalen")
    bullet(doc, "Loodje: vast bedrag € 5; losse bedragen mogelijk via "
           "sponsorloodje voor bedrijven (vermelding op poster/website)")
    bullet(doc, "Kinderen verkopen aan huisnummer netwerk: familie, buren, "
           "trainers, lokale bedrijven — géén verkoop aan vreemden op straat")
    h2(doc, "5.2 Tussenstand en prikkeling")
    bullet(doc, "Maandelijkse tussenstand per club (anoniem gerangschikt)")
    bullet(doc, "Prijzen: beste verkoper, beste club, meest creatieve actie "
           "(uitreiking op eventdag)")
    h2(doc, "5.3 Administratie")
    bullet(doc, "Clubs sturen verkoopstaten en opbrengst maandelijks in bij "
           "de penningmeester (stortingen op afgesloten projectrekening)")
    bullet(doc, "Slotdatum inleveren staten: 31 maart 2027")

    h1(doc, 6, "Fase 4 — Eventdag in het AFAS Stadion")
    h2(doc, "6.1 Kaders")
    bullet(doc, "Doeldatum: zaterdag in april/mei 2027, middagprogramma "
           "12:00–16:30 (exclusief opbouw/afbouw)")
    bullet(doc, "Deelnemers: jeugdleden + begeleiders; toegang uitsluitend "
           "met geldig loodje of deelnemerspas")
    bullet(doc, "AZ-spelerssessie: onder voorbehoud — vaste invulling is "
           "signing/ clinic op het veld-naast-het-stadion")
    h2(doc, "6.2 Verantwoordelijkheden op de dag")
    table(doc, ["Post", "Verantwoordelijke", "Aandachtspunten"], [
        ("Opbouw & routing", "Coördinator eventdag", "ophekken, start/finish, bewegwijzing"),
        ("Registratie", "Coördinator clubs + vrijwilligers", "deelnemerslijsten, loodjescontrole"),
        ("Traploop", "Coördinator eventdag", "rondes telling, fluitjes, waterpunten"),
        ("EHBO & veiligheid", "EHBO-team", "post bemand, noodketen bekend"),
        ("Programma/ontvangst", "Projectleider", "welkom, vertegenwoordiger goed doel, AZ-gasten"),
        ("Catering", "Vrijwilligersteam", "drinken/fruit deelnemers"),
        ("Fotografie/PR", "Communicatie", "toestemmingen gecheckt (AVG)"),
    ], widths=[3.8, 5.0, 7.2])

    h1(doc, 7, "Programma Eventdag (minuutschema)")
    table(doc, ["Tijd", "Programmaonderdeel", "Verantwoordelijke"], [
        ("09:30", "Opbouw: routing, tenten, registratie, EHBO-post", "Coördinator eventdag"),
        ("11:30", "Briefing vrijwilligers en begeleiders", "Coördinator eventdag"),
        ("12:00", "Ontvangst en registratie deelnemers", "Coördinator clubs"),
        ("12:30", "Officiële opening — welkom Lions AV + goed doel", "Projectleider"),
        ("12:45", "Traploop start (rondes rondom stadion)", "Coördinator eventdag"),
        ("14:15", "Pauze + verkoopkraampjes/activiteiten", "Vrijwilligersteam"),
        ("14:45", "Sportieve sessie / clinic (evt. AZ-spelers, onder voorbehoud)", "Coördinator eventdag"),
        ("15:45", "Prijzenuitreiking beste verkopers en clubs", "Projectleider"),
        ("16:15", "Chequeoverdracht aan Alzheimer Nederland", "Projectleider + goed doel"),
        ("16:30", "Afsluiting; deelnemers naar huis", "Coördinator clubs"),
        ("16:45", "Afbouw en terrein netjes opleveren aan AZ", "Coördinator eventdag"),
    ], widths=[2.2, 9.0, 4.8])
    para(doc, "Weerscenario: bij onwerkbaar weer vervalt de traploop naar "
         "het reserverondje of, indien in AZ-afspraak opgenomen, naar een "
         "binnenshift. Beslismoment: 3 dagen vooraf door projectleider.",
         before=6)

    h1(doc, 8, "Fase 5 — Afwikkeling en Verantwoording (mei–juni 2027)")
    bullet(doc, "Eindtelling loodjes en baten; afsluiting projectrekening")
    bullet(doc, "Uitkering: 70% naar clubs (naar rato), 30% aan Alzheimer "
           "Nederland — binnen 4 weken na eventdag")
    bullet(doc, "Open eindafrekening naar alle deelnemende verenigingen en "
           "het bestuur")
    bullet(doc, "Evaluatiegesprek met clubs, AZ-eventafdeling en goed doel")
    bullet(doc, "Jaaroverdracht invullen (bijlage D) en draaiboek actualiseren "
           "naar v2.0 voor editie 2027–2028")

    h1(doc, 9, "Tijdlijn en Actieplan")
    table(doc, ["Wanneer", "Actie", "Eigenaar", "Status"], [
        ("sep 2026", "Projectgroep geïnstalleerd; plan vastgesteld", "Projectleider", "open"),
        ("sep 2026", "Goed doel geformaliseerd", "Liaison", "open"),
        ("sep–okt 2026", "AZ-partnervoorstel en afspraken", "Projectleider", "open"),
        ("okt 2026", "Vergunning + verzekering aangevraagd", "Coördinator eventdag", "open"),
        ("nov 2026", "Infobijeenkomst clubs", "Coördinator clubs", "open"),
        ("dec 2026", "Inschrijving gesloten (≥10 clubs)", "Coördinator clubs", "open"),
        ("dec 2026", "Loodjesmateriaal bij clubs", "Communicatie", "open"),
        ("10 jan 2027", "Campagne gelanceerd", "Communicatie", "open"),
        ("jan–mrt 2027", "Verkoop + maandelijkse tussenstanden", "Penningmeester", "open"),
        ("31 mrt 2027", "Slotstaten binnen", "Penningmeester", "open"),
        ("apr/mei 2027", "Eventdag AFAS Stadion", "Coördinator eventdag", "open"),
        ("jun 2027", "Uitkering 70/30 + evaluatie + jaaroverdracht", "Projectleider", "open"),
    ], widths=[2.8, 7.2, 3.6, 2.4])

    h1(doc, 10, "RACI-Matrix")
    table(doc, ["Activiteit", "Projectleider", "Coörd. clubs", "Penningm.", "Comm.", "Coörd. dag", "AZ"], [
        ("Goed doel afspraken", "A", "I", "C", "R", "I", "–"),
        ("AZ-partnerschap", "R/A", "I", "I", "I", "C", "C"),
        ("Werving clubs", "A", "R", "I", "C", "I", "–"),
        ("Loodjesmateriaal", "I", "C", "I", "R/A", "I", "–"),
        ("Verkoopcampagne", "I", "R", "A", "R", "I", "I"),
        ("Telling & kas", "A", "C", "R", "I", "–", "–"),
        ("Eventdag", "A", "C", "I", "C", "R", "C"),
        ("Uitkering & verantwoording", "A", "I", "R", "I", "–", "I"),
        ("Jaaroverdracht", "R/A", "C", "C", "C", "C", "I"),
    ], widths=[5.4, 1.8, 1.8, 1.7, 1.5, 1.7, 1.2])
    para(doc, "R = Responsible, A = Accountable, C = Consulted, I = Informed.",
         9.5, TEXT_SEC, italic=True, before=4)

    h1(doc, 11, "Risico's en Mitigatie")
    para(doc, "Zie het risicoregister in de projectaanpak (paragraaf 7). "
         "Operationele sparringspunten voor de eventdag: ongevallenprotocol, "
         "weerscenario, en vermissing van deelnemers —protocol (meldpunt bij "
         "registratie).")

    h1(doc, 12, "Bijlage A — Partnervoorstel AZ (one-pager)")
    para(doc, "SAMEN VOOR ALZHEIMER NEDERLAND — TRAPLOOP RONDOM HET AFAS "
         "STADION", 12, PRIMARY, bold=True)
    para(doc, "Wat: jeugd van voetbalverenigingen uit heel Noord-Holland "
         "verkoopt loodjes en sluit af met een traploop rondom het AFAS "
         "Stadion. Winst: 70% terug naar de clubs, 30% naar Alzheimer "
         "Nederland (editie 2026–2027).")
    para(doc, "Wat vragen wij van AZ:")
    bullet(doc, "beschikbaarheid van het terrein rondom het stadion voor één "
           "middag in april/mei 2027")
    bullet(doc, "facilitaire ondersteuning (sanitair, EHBO-ruimte, parkeren)")
    bullet(doc, "optioneel: 1–2 AZ-spelers voor een korte clinic/signing")
    para(doc, "Wat biedt het AZ: regionale zichtbaarheid, positieve "
         "maatschappelijke profiling, honderden jonge fans in en rondom het "
         "stadion, en een prachtig podium voor de cheque-overdracht aan "
         "Alzheimer Nederland. Kosten: geen — het event is volledig door "
         "Lions Alkmaar Victorie georganiseerd en verzekerd.")


    h1(doc, 13, "Bijlage B — Checklist Eventdag")
    for item in [
        "Terreintoegang en routing afgezet (start/finish, hekken, bewegwijzing)",
        "EHBO-post bemand en zichtbaar; noodnummers bij alle coördinatoren",
        "Registratietafels met deelnemerslijsten per vereniging",
        "Deelnemerspassen/loodjescontrole bij entree",
        "Waterpunten langs het traploop-parcours en bij finish",
        "Begeleidersratio gecontroleerd (1 op 10) en omroepinstructie bekend",
        "Microfoon/geluid bij het podium voor opening en uitreikingen",
        "Cheque (specimen) klaar voor de overdracht aan het goede doel",
        "Prijzen gelabeld per categorie",
        "Fotograaf ingelicht over AVG-toestemmingen; lijst klaar",
        "Afval- en opruimplan; oplevering terrein aan AZ-begeleiding",
        "Reservetraploop-route bepaald (weerscenario)",
    ]:
        bullet(doc, item)

    h1(doc, 14, "Bijlage C — Inschrijfformulier Vereniging")
    para(doc, "In te vullen door de vereniging en uiterlijk 15 december 2026 "
         "in te leveren bij de coördinator clubs.")
    table(doc, ["Veld", "Invulling"], [
        ("Naam vereniging", ""),
        ("Plaats", ""),
        ("Aanspreekpunt + functie", ""),
        ("E-mail / telefoon", ""),
        ("Aantal jeugdleden dat verwacht deelneemt", ""),
        ("Geschat aantal verkopers loodjes", ""),
        ("Begeleiders die meekomen (namen)", ""),
        ("Akkoord met voorwaarden draaiboek", "☐ ja"),
        ("Datum + handtekening bestuur/jeugdvoorzitter", ""),
    ], widths=[7.5, 8.5])

    h1(doc, 15, "Bijlage D — Jaaroverdracht & Goed-doel-slot")
    para(doc, "Dit slot maakt het draaiboek herbruikbaar. Het nieuwe "
         "projectteam vult vóór 1 september alle velden in en past de "
         "editie-gegevens in het hele document aan.")
    table(doc, ["Editie-gegeven", "Editie 2026–2027", "Editie 2027–2028"], [
        ("Goed doel", "Alzheimer Nederland", "[invullen]"),
        ("Eventdatum", "[april/mei 2027]", "[invullen]"),
        ("Locatie", "AFAS Stadion, Alkmaar", "[invullen]"),
        ("Verdeling baten", "70% clubs / 30% goed doel", "[invullen]"),
        ("Prijs loodje", "€ 5", "[invullen]"),
        ("Partner(s)", "AZ (eventafdeling)", "[invullen]"),
        ("Netto-opbrengst", "[na afrekening]", "—"),
        ("Aantal clubs / verkopers", "[na afrekening]", "—"),
    ], widths=[4.4, 5.8, 5.8])
    h2(doc, "Lessen voor volgend jaar")
    for item in [
        "Wat ging goed (minimaal 3 punten):",
        "Wat beter moet (minimaal 3 punten):",
        "Contacten en toezeggingen (AZ, gemeente, sponsors, clubs):",
        "Advies verdeling en loodjesprijs voor volgend jaar:",
    ]:
        bullet(doc, item)

    h1(doc, 16, "Bronverwijzingen")
    for item in [
        "Projectintake Jorick van Gemert / Lions Alkmaar Victorie, 18 augustus 2026",
        "LIONS Nevenactiviteiten-draaiboek (formaat-referentie), juli 2026",
        "AFAS Stadion (Victoriestadion), Alkmaar — locatiegegevens",
        "Alzheimer Nederland — goed doel editie 2026–2027",
    ]:
        bullet(doc, item)

    doc.save(f"{OUT_DIR}/Draaiboek-Traploop-Benefiet_v1.0.docx")
    return f"{OUT_DIR}/Draaiboek-Traploop-Benefiet_v1.0.docx"

if __name__ == "__main__":
    print(build_aanpak())
    print(build_draaiboek())
    print("KLAAR")
