#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Projectaanpak - Ledenontmoetingsavond 13 oktober 2026 (District 110 AN)
DOCX-generator conform MASTER_STYLEGUIDE.md par. 2.3 (Lions DOCX-standaard).
Techniek: python-docx. Consistent met 06_Plan_van_Aanpak.docx.
"""
import os
from docx import Document
from docx.shared import Pt, Cm, RGBColor, Inches
from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_BREAK
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import qn
from docx.oxml import OxmlElement

# ------------------------------------------------------------------ branding
LIONS_BLUE     = RGBColor(0x00, 0x33, 0x66)
LIONS_GOLD_RGB = RGBColor(0xFF, 0xB8, 0x1C)
LIONS_GOLD     = "FFB81C"
TEXT_DARK      = RGBColor(0x1F, 0x29, 0x37)
TEXT_SEC       = RGBColor(0x37, 0x41, 0x51)
WHITE          = RGBColor(0xFF, 0xFF, 0xFF)
ZEBRA          = "F8F9FA"
HEADER_BG      = "003366"

DISTRICT = u"Lions Clubs International \u2014 District 110 AN"
LOGO     = "/root/projects/jg/2026-pbm-ledenontmoetingsavond-13okt/assets/logo_lions_emblem.png"
OUT_DIR  = "/root/projects/jg/2026-pbm-ledenontmoetingsavond-13okt/deliverables/docx"
OUT_FILE = os.path.join(OUT_DIR, "07_Projectaanpak.docx")
VERSION, DATUM = "1.0", "25 augustus 2026"
BUL = u"\u2022"
DATUM_EVENT = "dinsdag 13 oktober 2026"

# ------------------------------------------------------------------ helpers
def set_cell_bg(cell, hex_color):
    shd = OxmlElement("w:shd")
    shd.set(qn("w:val"), "clear"); shd.set(qn("w:fill"), hex_color)
    cell._tc.get_or_add_tcPr().append(shd)

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

def h1(doc, text, first=False):
    p = para(doc, text, size=16, bold=True, color=LIONS_BLUE,
             space_before=18 if not first else 0, space_after=6)
    pPr = p._p.get_or_add_pPr()
    pbdr = OxmlElement("w:pBdr")
    bottom = OxmlElement("w:bottom")
    bottom.set(qn("w:val"), "single"); bottom.set(qn("w:sz"), "12")
    bottom.set(qn("w:space"), "2"); bottom.set(qn("w:color"), LIONS_GOLD)
    pbdr.append(bottom); pPr.append(pbdr)
    p.paragraph_format.keep_with_next = True
    return p

def h2(doc, text):
    p = para(doc, text, size=13, bold=True, color=LIONS_BLUE,
             space_before=12, space_after=4)
    p.paragraph_format.keep_with_next = True
    return p

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

def table(doc, headers, rows, widths=None, zebra=True, font=10.5):
    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]
        set_cell_bg(c, HEADER_BG)
        r = c.paragraphs[0].add_run(htxt)
        r.font.name = "Calibri"; r.font.size = Pt(font)
        r.font.bold = True; r.font.color.rgb = WHITE
    for ri, row in enumerate(rows):
        cells = t.add_row().cells
        for ci, val in enumerate(row):
            if zebra and ri % 2 == 1: set_cell_bg(cells[ci], ZEBRA)
            r = cells[ci].paragraphs[0].add_run(val)
            r.font.name = "Calibri"; r.font.size = Pt(font)
            r.font.color.rgb = TEXT_DARK
    if widths:
        for ci, w in enumerate(widths):
            for row in t.rows:
                row.cells[ci].width = Cm(w)
    para(doc, "", size=6, space_after=2)
    return t

def page_break(doc):
    doc.add_paragraph().add_run().add_break(WD_BREAK.PAGE)

def add_page_field(p):
    r = p.add_run(); r.font.name = "Calibri"; r.font.size = Pt(9)
    fld1 = OxmlElement("w:fldChar"); fld1.set(qn("w:fldCharType"), "begin")
    instr = OxmlElement("w:instrText"); instr.set(qn("xml:space"), "preserve")
    instr.text = "PAGE"
    fld2 = OxmlElement("w:fldChar"); fld2.set(qn("w:fldCharType"), "end")
    r._r.append(fld1); r._r.append(instr); r._r.append(fld2)

def add_toc_field(doc):
    p = doc.add_paragraph()
    r = p.add_run()
    fld1 = OxmlElement("w:fldChar"); fld1.set(qn("w:fldCharType"), "begin")
    instr = OxmlElement("w:instrText"); instr.set(qn("xml:space"), "preserve")
    instr.text = 'TOC \\o "1-2" \\h \\z \\u'
    fld2 = OxmlElement("w:fldChar"); fld2.set(qn("w:fldCharType"), "separate")
    t = OxmlElement("w:t")
    t.text = u"Inhoudsopgave: klik met de rechtermuisknop en kies 'Veld bijwerken' (F9)."
    fld3 = OxmlElement("w:fldChar"); fld3.set(qn("w:fldCharType"), "end")
    r._r.append(fld1); r._r.append(instr); r._r.append(fld2)
    r._r.append(t); r._r.append(fld3)

# ------------------------------------------------------------------ document
doc = Document()
for section in doc.sections:
    section.top_margin = Cm(2.2); section.bottom_margin = Cm(2.0)
    section.left_margin = Cm(2.4); section.right_margin = Cm(2.4)

cp = doc.core_properties
cp.title = u"Projectaanpak - Ledenontmoetingsavond 13 oktober 2026 - District 110 AN"
cp.author = u"JvG Consultancy namens District 110 AN"
cp.keywords = u"Lions; District 110AN; projectaanpak; ledenontmoetingsavond; 2e VDG; workpackages; planning"
cp.category = u"Lions District Projectaanpak"

for section in doc.sections:
    fp = section.footer.paragraphs[0]
    fp.alignment = WD_ALIGN_PARAGRAPH.CENTER
    r = fp.add_run(u"District 110 AN %s Ledenontmoetingsavond 13 oktober 2026  %s  pagina " % (BUL, BUL))
    r.font.name = "Calibri"; r.font.size = Pt(9); r.font.color.rgb = TEXT_SEC
    add_page_field(fp)

# ------------------------------------------------------------------ cover
para(doc, DISTRICT, size=14, bold=True, color=LIONS_BLUE,
     align=WD_ALIGN_PARAGRAPH.CENTER, space_before=36, space_after=18)
if os.path.exists(LOGO):
    lp = doc.add_paragraph(); lp.alignment = WD_ALIGN_PARAGRAPH.CENTER
    lp.add_run().add_picture(LOGO, height=Inches(2.2))
    lp.paragraph_format.space_after = Pt(18)
para(doc, "PROJECTAANPAK", size=14, bold=True, color=LIONS_GOLD_RGB,
     align=WD_ALIGN_PARAGRAPH.CENTER, space_after=6)
para(doc, u"Projectaanpak \u2014 Ledenontmoetingsavond 13 oktober 2026", size=24,
     bold=True, color=LIONS_BLUE, align=WD_ALIGN_PARAGRAPH.CENTER, space_after=6)
para(doc, u"Projectfasen, werkpakketten, planning, kwaliteit en beheersing "
          u"voor de districtsbrede ledenontmoetingsavond met aankondiging van "
          u"de kandidaat 2e Vice District Governor",
     size=13, color=TEXT_SEC, align=WD_ALIGN_PARAGRAPH.CENTER, space_after=24)
para(doc, u"%s  %s  Locatie: nader te bepalen (centrale locatie in het district)" % (DATUM_EVENT, BUL),
     size=11, italic=True, color=TEXT_SEC, align=WD_ALIGN_PARAGRAPH.CENTER, space_after=36)
para(doc, u"Versie %s  %s  %s" % (VERSION, BUL, DATUM), size=11,
     color=TEXT_SEC, align=WD_ALIGN_PARAGRAPH.CENTER, space_after=4)
para(doc, u"Auteur: JvG Consultancy namens District 110 AN", size=11,
     color=TEXT_SEC, align=WD_ALIGN_PARAGRAPH.CENTER, space_after=4)
para(doc, u"Status: Definitief", size=11, color=TEXT_SEC,
     align=WD_ALIGN_PARAGRAPH.CENTER)
page_break(doc)

# ------------------------------------------------------- documentbeheer + TOC
h1(doc, u"Documentbeheer", first=True)
table(doc,
      [u"Versie", u"Datum", u"Auteur", u"Wijziging", u"Status"],
      [[u"1.0", DATUM, u"JvG Consultancy", u"Eerste uitgave", u"Definitief"]],
      widths=[2.0, 3.2, 3.6, 5.2, 2.6])

h1(doc, u"Inhoudsopgave")
add_toc_field(doc)
page_break(doc)

# ------------------------------------------------------------------ 1. inleiding
h1(doc, u"1. Inleiding", first=True)

h2(doc, u"1.1 Doel van dit document")
para(doc, u"Deze Projectaanpak beschrijft de fasering, werkpakketten, "
          u"activiteiten, planning, middelen, kwaliteitspoorten en "
          u"beheersmaatregelen voor de realisatie van de "
          u"ledenontmoetingsavond van " + DATUM_EVENT + u" van Lions "
          u"District 110 AN. Het document is de operationele leidraad voor "
          u"projectleider en kernteam: het vertaalt de doelstellingen uit "
          u"het Plan van Aanpak (PvA) naar concrete activiteiten met "
          u"verantwoordelijkheden, doorlooptijden en afhankelijkheden. "
          u"Daarmee vormt dit document de basis voor voortgangsrapportage, "
          u"resource-inzet en kwaliteits- en wijzigingsbeheersing gedurende "
          u"de gehele projectduur (25 augustus tot en met 31 oktober 2026).")

h2(doc, u"1.2 Relatie met het Plan van Aanpak")
para(doc, u"De Projectaanpak is het uitvoeringsniveau onder het Plan van "
          u"Aanpak. De verhouding tussen beide documenten:")
table(doc,
      [u"Aspect", u"Plan van Aanpak (PvA)", u"Projectaanpak (dit document)"],
      [[u"Abstraktieniveau", u"Strategisch / besluitvorming", u"Operationeel / uitvoering"],
       [u"Kernvraag", u"Wat bereiken we en waarom?", u"Hoe, door wie en wanneer wordt het gerealiseerd?"],
       [u"Bestandsdelen", u"Doelstellingen, scope, risico's, budgetkader, besluitvorming", u"Fasen, werkpakketten, activiteiten, planning, resources, kwaliteit, communicatie, monitoring"],
       [u"Doelgroep", u"District Governor, kabinet, opdrachtgever", u"Projectleider, kernteam, WP-co\u00f6rdinatoren"],
       [u"Status", u"Definitief (v1.0)", u"Definitief (v1.0), wijzigingen via change management (hoofdstuk 10)"]],
      widths=[3.2, 6.0, 6.4])
para(doc, u"Waar de Projectaanpak afwijkt van het PvA, prevaleert het PvA; "
          u"afwijkingen worden via de change control procedure (hoofdstuk 10) "
          u"vastgesteld en teruggekoppeld.")

h2(doc, u"1.3 Doelgroep")
bullet(doc, u" District Governor en het kabinet 2025-2026 (definitief vastgesteld 11 april 2025) [4];", u"Bestuurlijk:")
bullet(doc, u" Projectleider (JvG Consultancy) en de co\u00f6rdinatoren van de zes werkpakketten;", u"Uitvoerend:")
bullet(doc, u" Clubpresidenten, zonevoorzitters en leden van District 110 AN;", u"Deelnemers:")
bullet(doc, u" Penningmeester en de controlecommissie van het district.", u"Financieel:")

# ------------------------------------------------------------------ 2. fasen
page_break(doc)
h1(doc, u"2. Projectfasen", first=True)
para(doc, u"Het project doorloopt zes fasen van initiatie tot en met "
          u"evaluatie en nazorg. Elke fase kent een duidelijk doel, "
          u"afgebakende deliverables, een deadline en \u00e9\u00e9n "
          u"eindverantwoordelijke. De fase-overgangen vormen quality gates "
          u"(hoofdstuk 8); go/no-go beslissingen worden genomen door de "
          u"stuurgroep (District Governor en projectleider).")

h2(doc, u"2.1 Faseoverzicht")
table(doc,
      [u"Fase", u"Naam", u"Periode", u"Eindverantwoordelijke"],
      [[u"F1", u"Initiatie", u"25 aug \u2013 28 aug 2026 (1 week)", u"Projectleider"],
       [u"F2", u"Definitie & ontwerp", u"29 aug \u2013 18 sep 2026 (3 weken)", u"Projectleider"],
       [u"F3", u"Realisatie & voorbereiding", u"19 sep \u2013 10 okt 2026 (3 weken)", u"Projectleider"],
       [u"F4", u"Evenement", u"11 okt \u2013 13 okt 2026 (opbouwdag + avond)", u"Evenementmanager (WP1)"],
       [u"F5", u"Evaluatie & afronding", u"14 okt \u2013 31 okt 2026 (2,5 week)", u"Projectleider"],
       [u"F6", u"Overdracht & archivering", u"26 okt \u2013 31 okt 2026 (parallel)", u"Projectleider"]],
      widths=[1.5, 5.0, 5.5, 3.6])

h2(doc, u"2.2 F1 \u2014 Initiatie")
para(doc, u"Doel: het project formeel starten, opdracht bevestigen en de "
          u"projectorganisatie (stuurgroep, kernteam, WP-co\u00f6rdinatoren) inrichten.")
bullet(doc, u" goedgekeurde Projectaanpak en Plan van Aanpak (v1.0);", u"Deliverables:")
bullet(doc, u" benoemd kernteam met rollen en beschikbaarheid (resourceplan);")
bullet(doc, u" vastgesteld communicatiekader en rapportagecyclus.")
para(doc, u"Deadline: 28 augustus 2026. Verantwoordelijke: Projectleider (JvG Consultancy).", size=10.5, color=TEXT_SEC, italic=True)

h2(doc, u"2.3 F2 \u2014 Definitie & ontwerp")
para(doc, u"Doel: alle kaders voor het evenement definitief vaststellen: "
          u"locatie, programma-ontwerp, budget, communicatieplan en het "
          u"protocol voor de 2e VDG-aankondiging conform MD110 Statuten en "
          u"Protocol MD-Organen [2][3].")
bullet(doc, u" gecontracteerde locatie en catering;", u"Deliverables:")
bullet(doc, u" vastgesteld budget en machtigingen;")
bullet(doc, u" definitief programma-ontwerp (inclusief script aankondiging);")
bullet(doc, u" uitnodigingsteksten en verzendplanning;")
bullet(doc, u" registratieproces ingericht (bijv. via formulier/districtszender).")
para(doc, u"Deadline: 18 september 2026. Verantwoordelijke: Projectleider, met WP1/WP3/WP4/WP5-co\u00f6rdinatoren.", size=10.5, color=TEXT_SEC, italic=True)

h2(doc, u"2.4 F3 \u2014 Realisatie & voorbereiding")
para(doc, u"Doel: alle middelen, materialen en afspraken gereed hebben voor "
          u"de avond: uitnodigingen verzonden, registratie gemonitoroerd, "
          u"presentaties en draaiboek definitief, logistiek en AV geregeld.")
bullet(doc, u" uitnodigingen verzonden en RSVP-monitoring gestart;", u"Deliverables:")
bullet(doc, u" definitief eventprogramma (uiterlijk 3 oktober 2026);")
bullet(doc, u" presentatiemateriaal inclusief 2e VDG-aankondiging;")
bullet(doc, u" draaiboek dag/nacht-tijdlijn, rollen en scripts (8 oktober 2026);")
bullet(doc, u" AV- en locatie-checklist afgetekend.")
para(doc, u"Deadline: 10 oktober 2026. Verantwoordelijke: Projectleider, met alle WP-co\u00f6rdinatoren.", size=10.5, color=TEXT_SEC, italic=True)

h2(doc, u"2.5 F4 \u2014 Evenement")
para(doc, u"Doel: het onberispelijk laten verlopen van de "
          u"ledenontmoetingsavond zelf, inclusief de formele aankondiging "
          u"van de kandidaat 2e VDG.")
bullet(doc, u" uitgevoerd programma met registratie-aantallen;", u"Deliverables:")
bullet(doc, u" vastgelegde 2e VDG-aankondiging (notulen/fotografie);")
bullet(doc, u" opgeloste incidenten conform draaiboek.")
para(doc, u"Deadline: 13 oktober 2026. Verantwoordelijke: Evenementmanager (WP1), DG voor het formele moment.", size=10.5, color=TEXT_SEC, italic=True)

h2(doc, u"2.6 F5 \u2014 Evaluatie & afronding")
para(doc, u"Doel: de resultaten meten tegen de doelstellingen (PvA \u00a71.2), "
          u"financieel afrekenen en lessen vastleggen.")
bullet(doc, u" evaluatierapport met opkomstcijfers, KPI's en aanbevelingen (31 oktober 2026);", u"Deliverables:")
bullet(doc, u" financi\u00eble eindafrekening en declaratieverwerking;")
bullet(doc, u" bedank- en follow-upcommunicatie naar deelnemers en clubs.")
para(doc, u"Deadline: 31 oktober 2026. Verantwoordelijke: Projectleider, met WP5/WP6.", size=10.5, color=TEXT_SEC, italic=True)

h2(doc, u"2.7 F6 \u2014 Overdracht & archivering")
para(doc, u"Doel: alle projectdocumenten en lessen overdragen aan het "
          u"kabinet voor hergebruik bij toekomstige districtsevenementen, "
          u"conform het Protocol MD-Organen [3].")
bullet(doc, u" compleet projectdossier (documenten, templates, contactenlijsten);", u"Deliverables:")
bullet(doc, u" lessons-learned-register;")
bullet(doc, u" archivering in het districtarchief.")
para(doc, u"Deadline: 31 oktober 2026. Verantwoordelijke: Projectleider.", size=10.5, color=TEXT_SEC, italic=True)

# ------------------------------------------------------------------ 3. werkpakketten
page_break(doc)
h1(doc, u"3. Werkpakketten", first=True)
para(doc, u"De projectomvang is opgedeeld in zes werkpakketten (Work "
          u"Packages, WP). Elk werkpakket heeft \u00e9\u00e9n co\u00f6rdinator, een "
          u"eenduidige afbakening en koppeling aan de fasen en activiteiten "
          u"in hoofdstuk 4 en 5.")

h2(doc, u"3.1 WP-overzicht")
table(doc,
      [u"WP", u"Naam", u"Scope kern", u"Co\u00f6rdinator", u"Fasen"],
      [[u"WP1", u"Evenement planning", u"Programma, sprekers, locatie-afstemming, draaiboek, uitvoering avond", u"Evenementmanager", u"F2\u2013F4"],
       [u"WP2", u"Governance & Compliance", u"Statutaire toetsing 2e VDG-aankondiging, protocollen, mandaat, verslaglegging", u"Governance-officer (juridisch adviseur district)", u"F1\u2013F5"],
       [u"WP3", u"Communicatie", u"Uitnodigingen, districtszender, website/socials, pers, follow-up", u"Communicatieco\u00f6rdinator", u"F2\u2013F5"],
       [u"WP4", u"Logistiek", u"Locatie, catering, AV, registratie, parkeer- en toegankelijkheidsvoorzieningen", u"Logistiekco\u00f6rdinator", u"F2\u2013F4"],
       [u"WP5", u"Financi\u00ebn", u"Budgetbewaking, contracten, machtigingen, declaraties, eindafrekening", u"Penningmeester district", u"F1\u2013F5"],
       [u"WP6", u"Evaluatie & Rapportage", u"KPI-meting, evaluatieformulier, evaluatierapport, lessons learned", u"Projectleider + QA", u"F3\u2013F6"]],
      widths=[1.3, 4.0, 5.6, 3.1, 1.6])

h2(doc, u"3.2 WP1 \u2014 Evenement planning")
para(doc, u"WP1 ontwerpt en realiseert het programma van de avond: "
          u"invulling, sprekers, timing, de vormgeving van het formele "
          u"aankondigingsmoment en het draaiboek van de avond. De "
          u"evenementmanager stuurt hiervoor een inhoudelijk team aan met "
          u"vertegenwoordigers van GMT en de kabinetsleden die het "
          u"vitaliteits- en ledenbeleid toelichten [1][8].")

h2(doc, u"3.3 WP2 \u2014 Governance & Compliance")
para(doc, u"WP2 waarborgt dat de organisatie en met name de 2e VDG-aankondiging "
          u"voldoen aan de MD110 Statuten \u00a74.2, het Huishoudelijk Reglement "
          u"MD 110 artikel 12, het Protocol MD-Organen \u00a73.1 en de LCI "
          u"International Constitution and By-Laws [2][3][10][11]. De "
          u"governance-officer toetst het programma-ontwerp, het script van "
          u"de aankondiging en de verslaglegging, en adviseert de stuurgroep.")

h2(doc, u"3.4 WP3 \u2014 Communicatie")
para(doc, u"WP3 verzorgt alle interne en externe communicatie: "
          u"uitnodigingen aan clubs en leden (via clubpresidenten en "
          u"zonevoorzitters), publicatie via de districtszender en "
          u"website/socials, herinneringen en de follow-up na afloop. "
          u"Communicatie volgt het kader uit het communicatieplan "
          u"(hoofdstuk 9).")

h2(doc, u"3.5 WP4 \u2014 Logistiek")
para(doc, u"WP4 contracteert en co\u00f6rdineert locatie, catering, "
          u"audiovisuele voorzieningen, registratie aan de deur, parkeren en "
          u"toegankelijkheid. Capaciteitsplanning is gebaseerd op de "
          u"ledenstatistieken en RSVP-monitoring [6][7].")

h2(doc, u"3.6 WP5 \u2014 Financi\u00ebn")
para(doc, u"WP5 bewaakt het budget conform de districtbegroting 25-26, "
          u"behandelt contracten en machtigingen, voert declaraties af "
          u"conform MD110-regelgeving per 01-07-2023 en levert de "
          u"eindafrekening voor de controlecommissie [12].")

h2(doc, u"3.7 WP6 \u2014 Evaluatie & Rapportage")
para(doc, u"WP6 definieert de KPI's, verzorgt de evaluatie onder "
          u"deelnemers, rapporteert de resultaten aan de stuurgroep en "
          u"borgt de lessen in een lessons-learned-register voor "
          u"hergebruik door toekomstige kabinetten.")

# ------------------------------------------------------------------ 4. activiteitendetail
page_break(doc)
h1(doc, u"4. Activiteitendetail", first=True)
para(doc, u"Per werkpakket zijn de activiteiten uitgewerkt met een "
          u"eenduidige activiteit-ID (A<WP>.<nr>), doorlooptijd, benodigde "
          u"resources en afhankelijkheden. Voorgangers verwijzen naar "
          u"activiteit-ID's; 'FG<x>' verwijst naar fase-overgang "
          u"(quality gate, hoofdstuk 8).")

h2(doc, u"4.1 WP1 \u2014 Evenement planning")
table(doc,
      [u"ID", u"Activiteit", u"Duur", u"Resources", u"Afhankelijkheden"],
      [[u"A1.1", u"Programma-ontwerp avond opstellen (incl. vorm aankondigingsmoment)", u"5 d", u"Evenementmanager, PL, GMT-vert.", u"FG1"],
       [u"A1.2", u"Sprekers en bijdragen kabinet/GMT bevestigen", u"7 d", u"Evenementmanager, kabinet", u"A1.1"],
       [u"A1.3", u"Script 2e VDG-aankondiging opstellen (met WP2)", u"4 d", u"Evenementmanager, Governance-officer, DG", u"A1.1, A2.2"],
       [u"A1.4", u"Draaiboek avond opstellen (tijdlijn, rollen, scripts)", u"5 d", u"Evenementmanager, PL", u"A1.2, A4.3"],
       [u"A1.5", u"Generale repetitie en walkthrough", u"1 d", u"Kernteam, sprekers, AV", u"A1.4, A4.4"],
       [u"A1.6", u"Uitvoering ledenontmoetingsavond", u"1 d", u"Kernteam, kabinet, vrijwilligers", u"A1.5, FG3"]],
      widths=[1.2, 6.4, 1.3, 3.4, 3.3])

h2(doc, u"4.2 WP2 \u2014 Governance & Compliance")
table(doc,
      [u"ID", u"Activiteit", u"Duur", u"Resources", u"Afhankelijkheden"],
      [[u"A2.1", u"Compliance-scan: toetsing plan aan statuten en protocollen", u"3 d", u"Governance-officer", u"FG1"],
       [u"A2.2", u"Benoemingsproces 2e VDG verifi\u00ebren en vastleggen (procedure-check)", u"5 d", u"Governance-officer, DG", u"A2.1"],
       [u"A2.3", u"Programma en script toetsen op governance-eisen", u"2 d", u"Governance-officer", u"A1.1, A1.3"],
       [u"A2.4", u"Notulen en besluitenlijst avond opstellen", u"3 d", u"Secretaris functie", u"A1.6"],
       [u"A2.5", u"Governance-verklaring opleveren (compliance-oordeel)", u"2 d", u"Governance-officer", u"A2.4"]],
      widths=[1.2, 6.4, 1.3, 3.4, 3.3])

h2(doc, u"4.3 WP3 \u2014 Communicatie")
table(doc,
      [u"ID", u"Activiteit", u"Duur", u"Resources", u"Afhankelijkheden"],
      [[u"A3.1", u"Communicatieplan en key messages opstellen", u"4 d", u"Comm.-co\u00f6rdinator, PL", u"FG1"],
       [u"A3.2", u"Uitnodigingsteksten en beeld opstellen (huisstijl)", u"3 d", u"Comm.-co\u00f6rdinator", u"A3.1"],
       [u"A3.3", u"Uitnodigingen verzenden via clubpresidenten/zones", u"2 d", u"Comm.-co\u00f6rdinator, zones", u"A3.2, FG2"],
       [u"A3.4", u"RSVP-monitoring en herinneringscampagne", u"14 d", u"Comm.-co\u00f6rdinator, registratie", u"A3.3"],
       [u"A3.5", u"Pers- en socialmediaberichtgeving vooraf/nadien", u"4 d", u"Comm.-co\u00f6rdinator", u"A3.3, A1.6"],
       [u"A3.6", u"Follow-up: bedankje, presentaties en verslag delen", u"4 d", u"Comm.-co\u00f6rdinator", u"A1.6, A2.4"]],
      widths=[1.2, 6.4, 1.3, 3.4, 3.3])

h2(doc, u"4.4 WP4 \u2014 Logistiek")
table(doc,
      [u"ID", u"Activiteit", u"Duur", u"Resources", u"Afhankelijkheden"],
      [[u"A4.1", u"Locatie-eisen opstellen en locaties selecteren", u"4 d", u"Logistiekco\u00f6rdinator", u"FG1"],
       [u"A4.2", u"Locatie en catering contracteren", u"5 d", u"Logistiekco\u00f6rdinator, Penningmeester", u"A4.1, A5.2"],
       [u"A4.3", u"AV- en faciliteitenplan opstellen (geluid, beeld, registratie)", u"3 d", u"Logistiekco\u00f6rdinator, AV-leverancier", u"A4.2"],
       [u"A4.4", u"Capaciteits- en zitplan finaliseren op basis van RSVP", u"3 d", u"Logistiekco\u00f6rdinator", u"A3.4"],
       [u"A4.5", u"Opbouw locatie en AV-test", u"1 d", u"Logistiekteam, AV", u"A4.3, A4.4"],
       [u"A4.6", u"Afbouw en retourneren materialen", u"1 d", u"Logistiekteam", u"A1.6"]],
      widths=[1.2, 6.4, 1.3, 3.4, 3.3])

h2(doc, u"4.5 WP5 \u2014 Financi\u00ebn")
table(doc,
      [u"ID", u"Activiteit", u"Duur", u"Resources", u"Afhankelijkheden"],
      [[u"A5.1", u"Detailbudget opstellen (posten, machtigingsgrenzen)", u"4 d", u"Penningmeester, PL", u"FG1"],
       [u"A5.2", u"Budget goedkeuren door stuurgroep/DG", u"2 d", u"Stuurgroep, DG", u"A5.1"],
       [u"A5.3", u"Contracten en offertes beoordelen en authoriseren", u"5 d", u"Penningmeester", u"A4.2, A5.2"],
       [u"A5.4", u"Betalingsbewaking en kasbeheer avond", u"lopend", u"Penningmeester", u"A5.3"],
       [u"A5.5", u"Declaraties verwerken (conform MD110-regelgeving)", u"7 d", u"Penningmeester", u"A1.6"],
       [u"A5.6", u"Eindafrekening en budget-verslag opleveren", u"5 d", u"Penningmeester, PL", u"A5.5"]],
      widths=[1.2, 6.4, 1.3, 3.4, 3.3])

h2(doc, u"4.6 WP6 \u2014 Evaluatie & Rapportage")
table(doc,
      [u"ID", u"Activiteit", u"Duur", u"Resources", u"Afhankelijkheden"],
      [[u"A6.1", u"KPI-set en meetinstrument (evaluatieformulier) defini\u00ebren", u"3 d", u"PL, QA", u"FG1"],
       [u"A6.2", u"Nulmeting deelnemersverwachtingen (optioneel, bij registratie)", u"7 d", u"PL, registratie", u"A3.3"],
       [u"A6.3", u"Evaluatieformulier afnemen onder deelnemers", u"5 d", u"QA, comm.", u"A1.6"],
       [u"A6.4", u"Opkomst- en KPI-analyse uitvoeren", u"3 d", u"QA", u"A6.3"],
       [u"A6.5", u"Evaluatierapport opstellen en aanbieden stuurgroep", u"5 d", u"PL, QA", u"A6.4, A5.6"],
       [u"A6.6", u"Lessons-learned-sessie en archivering", u"2 d", u"Kernteam", u"A6.5"]],
      widths=[1.2, 6.4, 1.3, 3.4, 3.3])

# ------------------------------------------------------------------ 5. tijdlijn
page_break(doc)
h1(doc, u"5. Tijdlijn en Milestones", first=True)
para(doc, u"De onderstaande planning is een tabelvormige Gantt: alle "
          u"activiteiten met start- en einddatum, duur en verantwoordelijke. "
          u"Kalenderdagen; activiteiten in weekenden zijn vrijwilligerswerk "
          u"of bezettingsafhankelijk.")

h2(doc, u"5.1 Gantt-tabel")
table(doc,
      [u"ID", u"Omschrijving", u"Start", u"Eind", u"Dagen", u"Verantw."],
      [[u"A1.1", u"Programma-ontwerp avond", u"29-08-2026", u"02-09-2026", u"5", u"Evenementmgr"],
       [u"A1.2", u"Sprekers en bijdragen bevestigen", u"03-09-2026", u"09-09-2026", u"7", u"Evenementmgr"],
       [u"A1.3", u"Script 2e VDG-aankondiging", u"08-09-2026", u"11-09-2026", u"4", u"Evenem.+Gov"],
       [u"A1.4", u"Draaiboek avond", u"29-09-2026", u"08-10-2026", u"5", u"Evenementmgr"],
       [u"A1.5", u"Generale repetitie", u"11-10-2026", u"11-10-2026", u"1", u"Evenementmgr"],
       [u"A1.6", u"Uitvoering ledenontmoetingsavond", u"13-10-2026", u"13-10-2026", u"1", u"Evenementmgr"],
       [u"A2.1", u"Compliance-scan statuten/protocollen", u"25-08-2026", u"27-08-2026", u"3", u"Gov-officer"],
       [u"A2.2", u"Benoemingsproces 2e VDG verifieren", u"28-08-2026", u"01-09-2026", u"5", u"Gov-officer"],
       [u"A2.3", u"Programma/script governance-toets", u"14-09-2026", u"15-09-2026", u"2", u"Gov-officer"],
       [u"A2.4", u"Notulen en besluitenlijst avond", u"14-10-2026", u"16-10-2026", u"3", u"Secretaris"],
       [u"A2.5", u"Governance-verklaring", u"19-10-2026", u"20-10-2026", u"2", u"Gov-officer"],
       [u"A3.1", u"Communicatieplan en key messages", u"29-08-2026", u"01-09-2026", u"4", u"Comm.-co\u00f6rd."],
       [u"A3.2", u"Uitnodigingsteksten en beeld", u"02-09-2026", u"04-09-2026", u"3", u"Comm.-co\u00f6rd."],
       [u"A3.3", u"Uitnodigingen verzenden", u"15-09-2026", u"16-09-2026", u"2", u"Comm.-co\u00f6rd."],
       [u"A3.4", u"RSVP-monitoring en herinneringen", u"17-09-2026", u"10-10-2026", u"14", u"Comm.-co\u00f6rd."],
       [u"A3.5", u"Pers- en socialmedia", u"05-10-2026", u"20-10-2026", u"4", u"Comm.-co\u00f6rd."],
       [u"A3.6", u"Follow-up deelnemers en clubs", u"14-10-2026", u"21-10-2026", u"4", u"Comm.-co\u00f6rd."],
       [u"A4.1", u"Locatie-eisen en selectie", u"28-08-2026", u"01-09-2026", u"4", u"Logistiekco\u00f6rd."],
       [u"A4.2", u"Locatie en catering contracteren", u"02-09-2026", u"08-09-2026", u"5", u"Logistiek+Penningm."],
       [u"A4.3", u"AV- en faciliteitenplan", u"09-09-2026", u"11-09-2026", u"3", u"Logistiekco\u00f6rd."],
       [u"A4.4", u"Capaciteits- en zitplan (RSVP)", u"06-10-2026", u"08-10-2026", u"3", u"Logistiekco\u00f6rd."],
       [u"A4.5", u"Opbouw locatie en AV-test", u"11-10-2026", u"12-10-2026", u"1", u"Logistiekteam"],
       [u"A4.6", u"Afbouw en retour materialen", u"13-10-2026", u"14-10-2026", u"1", u"Logistiekteam"],
       [u"A5.1", u"Detailbudget opstellen", u"26-08-2026", u"29-08-2026", u"4", u"Penningmeester"],
       [u"A5.2", u"Budgetgoedkeuring stuurgroep", u"31-08-2026", u"01-09-2026", u"2", u"Stuurgroep"],
       [u"A5.3", u"Contracten authoriseren", u"09-09-2026", u"15-09-2026", u"5", u"Penningmeester"],
       [u"A5.4", u"Betalingsbewaking (lopend)", u"15-09-2026", u"13-10-2026", u"lopend", u"Penningmeester"],
       [u"A5.5", u"Declaraties verwerken", u"14-10-2026", u"22-10-2026", u"7", u"Penningmeester"],
       [u"A5.6", u"Eindafrekening en verslag", u"23-10-2026", u"29-10-2026", u"5", u"Penningmeester"],
       [u"A6.1", u"KPI-set en evaluatieformulier", u"26-08-2026", u"28-08-2026", u"3", u"PL + QA"],
       [u"A6.2", u"Nulmeting bij registratie", u"17-09-2026", u"10-10-2026", u"7", u"PL"],
       [u"A6.3", u"Evaluatieformulier afnemen", u"14-10-2026", u"19-10-2026", u"5", u"QA"],
       [u"A6.4", u"Opkomst- en KPI-analyse", u"20-10-2026", u"22-10-2026", u"3", u"QA"],
       [u"A6.5", u"Evaluatierapport stuurgroep", u"23-10-2026", u"29-10-2026", u"5", u"PL"],
       [u"A6.6", u"Lessons learned en archivering", u"30-10-2026", u"31-10-2026", u"2", u"Kernteam"]],
      widths=[1.2, 5.6, 2.2, 2.2, 1.6, 2.8], font=9.5)

h2(doc, u"5.2 Milestones")
table(doc,
      [u"M", u"Milestone", u"Datum", u"Criterium", u"Besluit"],
      [[u"M1", u"Kick-off en projectorganisatie operationeel", u"28-08-2026", u"Teams benoemd, documenten goedgekeurd", u"Go/no-go F2"],
       [u"M2", u"Locatie en catering gecontracteerd", u"08-09-2026", u"Contract getekend, machtiging af", u"—"],
       [u"M3", u"Uitnodigingen verzonden", u"16-09-2026", u"100% clubs bereikt via presidents/zone", u"—"],
       [u"M4", u"Programma definitief", u"03-10-2026", u"Programma + script aankondiging vastgesteld en getoetst", u"Go/no-go F4-voorbereiding"],
       [u"M5", u"Draaiboek definitief en generale repetitie", u"11-10-2026", u"Draaiboek afgetekend, walkthrough geslaagd", u"Go/no-go evenement"],
       [u"M6", u"Ledenontmoetingsavond incl. 2e VDG-aankondiging", u"13-10-2026", u"Programma uitgevoerd, aankondiging vastgelegd", u"—"],
       [u"M7", u"Evaluatierapport en eindafrekening opgeleverd", u"31-10-2026", u"Rapport geaccordeerd door DG", u"Project sluiting"]],
      widths=[1.2, 5.4, 2.2, 5.0, 2.6])

h2(doc, u"5.3 Critical path")
para(doc, u"Het kritieke pad loopt via de activitiesketen waarvan vertraging "
          u"de evenementdatum direct verschuift:")
para(doc, u"FG1 \u2192 A4.1 (locatie-eisen) \u2192 A5.2 (budgetgoedkeuring) \u2192 "
          u"A4.2 (locatie contracteren, tot 08-09) \u2192 A4.3 (AV-plan) \u2192 "
          u"A3.3 (uitnodigingen, 16-09) \u2192 A3.4 (RSVP-monitoring, tot 10-10) "
          u"\u2192 A4.4 (zitplan) \u2192 A1.4 (draaiboek) \u2192 A4.5/A1.5 (opbouw + "
          u"repetitie, 11/12-10) \u2192 A1.6 (evenement 13-10).",
     bold=True, color=LIONS_BLUE)
bullet(doc, u" buffers: tussen A4.3 en A3.3 zit 4 dagen buffer; tussen A4.4 en A4.5 zit 2 dagen buffer;", u"Slack:")
bullet(doc, u" geen slack op de keten A4.1\u2192A4.2\u2192A3.3 en op de laatste week "
          u"voorafgaand aan het evenement;", u"Kritiek:")
bullet(doc, u" vertraging groter dan de buffer in de locatieketen of het "
          u"draaiboek leidt tot escalatie naar de stuurgroep en, indien "
          u"nodig, heroverweging van locatie of programma (change "
          u"management, hoofdstuk 10).", u"Consequentie:")

# ------------------------------------------------------------------ 6. resources
page_break(doc)
h1(doc, u"6. Resource Planning", first=True)

h2(doc, u"6.1 Rollen en capaciteit")
table(doc,
      [u"Rol", u"Persoon/ Funktionele rol", u"Inzet", u"Capaciteit", u"Periode"],
      [[u"Opdrachtgever", u"District Governor (Arjan van Ommen)", u"Besluitvorming, aankondiging", u"4 u/week", u"25-08 tot 31-10"],
       [u"Projectleider (PL)", u"JvG Consultancy", u"Algemene leiding, planning, rapportage", u"8 u/week", u"25-08 tot 31-10"],
       [u"Evenementmanager", u"Kabinetslid (nader te benoemen)", u"Werkpakket 1", u"6 u/week", u"29-08 tot 14-10"],
       [u"Governance-officer", u"Juridisch adviseur district", u"Werkpakket 2", u"3 u/week", u"25-08 tot 20-10"],
       [u"Communicatieco\u00f6rdinator", u"Districtszender-redacteur", u"Werkpakket 3", u"4 u/week", u"29-08 tot 21-10"],
       [u"Logistiekco\u00f6rdinator", u"Kabinetslid/vrijwilliger", u"Werkpakket 4", u"5 u/week", u"28-08 tot 14-10"],
       [u"Penningmeester", u"Districts penningmeester", u"Werkpakket 5", u"2 u/week + klussen", u"26-08 tot 29-10"],
       [u"QA / evaluatie", u"PL + ondersteuner", u"Werkpakket 6", u"2 u/week", u"26-08 tot 31-10"],
       [u"Vrijwilligers avond", u"Leden gastclub/hostclub", u"Registratie, welcoming, techniek", u"8-12 personen", u"11-10 tot 13-10"]],
      widths=[3.4, 4.2, 4.2, 2.2, 2.6])

h2(doc, u"6.2 Toewijzing per activiteit")
para(doc, u"De resource-toewijzing per activiteit staat in de tabellen van "
          u"hoofdstuk 4 (kolom 'Resources'). Belangrijke toewijzingsregels:")
bullet(doc, u" de projectleider is nooit uitvoerend co\u00f6rdinator van een werkpakket, om conflicten te voorkomen;", u"Scheiding:")
bullet(doc, u" de District Governor is alleen ingezet voor bestuurlijke momenten (kick-off, aankondiging, accordering) met maximaal 4 uur per week;")
bullet(doc, u" piekbelasting (opbouw, avond zelf, afbouw) wordt gedekt door vrijwilligers van de gastclub;")
bullet(doc, u" declaratieregels en vergoedingen volgen de MD110-regelgeving per 01-07-2023.")

h2(doc, u"6.3 Beschikbaarheid en risico's")
table(doc,
      [u"Resource", u"Beschikbaarheid", u"Risico", u"Mitigatie"],
      [[u"DG", u"Agenda-dependent (kabinetsagenda FY25-26)", u"Dubbele agenda's in oktober", u"Agenda vroeg blokkeren (M1); 1e VDG als back-up"],
       [u"Kabinetsleden", u"Deeltijd, vrijwillig", u"Uitval door omstandigheden", u"Plaatsvervangers benoemen per WP"],
       [u"Locatie/AV-leveranciers", u"Contractueel", u"Overbooking/techniekstoring", u"Contractbepalingen + AV-back-upplan"],
       [u"Vrijwilligers avond", u"Eenmalig", u"Te weinig aanmeldingen", u"Recrutering via zones vanaf M2; min. 30% overbezetting"]],
      widths=[3.2, 4.0, 3.6, 4.8])

# ------------------------------------------------------------------ 7. quality gates
page_break(doc)
h1(doc, u"7. Quality Gates", first=True)
para(doc, u"Elke fase-overgang is een quality gate (QG): een formeel "
          u"toetsingsmoment waar de stuurgroep op basis van vaste criteria "
          u"beslist om door te gaan (go), bij te sturen (conditionally go) "
          u"of te stoppen (no-go).")

h2(doc, u"7.1 Quality gate criteria per fase")
table(doc,
      [u"QG", u"Na fase", u"Criteria (allemaal vervuld = go)", u"Beslisser"],
      [[u"QG1", u"F1 Initiatie", u"Projectaanpak en PvA goedgekeurd; kernteam en WP-co\u00f6rdinatoren benoemd; budgetkader geaccordeerd; communicatiekader vastgesteld", u"Stuurgroep (DG + PL)"],
       [u"QG2", u"F2 Definitie & ontwerp", u"Locatie en catering gecontracteerd binnen budget; programma-ontwerp inclusief aankondigingsvorm getoetst door WP2; uitnodigingspakket klaar; registratieproces getest", u"Stuurgroep"],
       [u"QG3", u"F3 Realisatie", u"Uitnodigingen 100% verzonden; RSVP \u2265 ijkpunt (tussenmeting); programma definitief; draaiboek afgetekend; AV-plan compleet; vrijwilligersteam compleet", u"Stuurgroep"],
       [u"QG4", u"F4 Evenement", u"Programma uitgevoerd volgens draaiboek; 2e VDG-aankondiging conform script en statutair vastgelegd; geen ongecontroleerde incidenten", u"PL (operational debrief)"],
       [u"QG5", u"F5/F6 Evaluatie", u"Evaluatierapport met KPI-uitslagen opgeleverd; eindafrekening sluitend; lessons learned vastgelegd; dossier overgedragen", u"DG (project sluiting)"]],
      widths=[1.2, 3.0, 8.6, 2.8])

h2(doc, u"7.2 Toetsingsprocedure")
bullet(doc, u" Voor elke QG stelt de PL een QG-dossier samen: status per criterium, bewijsstukken en open punten;", u"Stap 1:")
bullet(doc, u" De governance-officer toetst de governance-criteria (met name QG2 en QG4) onafhankelijk;", u"Stap 2:")
bullet(doc, u" De stuurgroep beslist binnen 2 werkdagen: go / conditioneel met herstelacties en deadline / no-go met escalatie;", u"Stap 3:")
bullet(doc, u" Besluit en acties worden vastgelegd in het besluitenregister;", u"Stap 4:")
bullet(doc, u" Bij no-go wordt het change management proces (hoofdstuk 10) geactiveerd voor herplanning.", u"Stap 5:")

h2(doc, u"7.3 Go/no-go beslissingsmomenten")
para(doc, u"De zwaarste beslismomenten zijn QG2 (locatie definitief: laatste "
          u"moment voor kostbare herziene keuzes) en QG3/M5 (laatste week: "
          u"go/no-go over het doorgaan met alle middelen gereed). Voor beide "
          u"gelden expliciete stopcriteria:")
bullet(doc, u" geen gecontracteerde locatie of budgetoverstijging > 10% zonder machtiging;", u"No-go QG2:")
bullet(doc, u" draaiboek niet af, of minder dan 40% clubs vertegenwoordigd in RSVP zonder herstelactie die de opkomst kan verbeteren;", u"No-go QG3:")
bullet(doc, u" bij no-go wordt, met de DG, een alternatieve datum/vorm overwogen; statutaire termijnen (2e VDG-proces) worden opnieuw tegen het licht gehouden met de governance-officer.", u"Vervolg:")

# ------------------------------------------------------------------ 8. communicatieplan
page_break(doc)
h1(doc, u"8. Communicatieplan", first=True)
para(doc, u"Het communicatieplan volgt de communicatiematrix uit het Plan "
          u"van Aanpak en geeft kanalen, frequentie en doelen per "
          u"stakeholder. Uitvoering ligt bij WP3.")

h2(doc, u"8.1 Stakeholder mapping")
table(doc,
      [u"Stakeholder", u"Belang", u"Invloed", u"Houding", u"Strategie"],
      [[u"District Governor + kabinet", u"Bestuurlijk succes, statutaire correctheid", u"Hoog", u"Promotor", u"Direct betrekken, wekelijkse rapportage"],
       [u"Clubpresidenten en zonevoorzitters", u"Informatie voor hun leden", u"Middel-hoog", u"Neutraal-positief", u"Duidelijke toolkits en herinneringen"],
       [u"Leden district 110 AN", u"Deelname, netwerken, vernieuwing", u"Middel", u"Ge\u00efnteresseerd", u"Laagdrempelige uitnodiging en follow-up"],
       [u"Kandidaat 2e VDG (en gezin)", u"Correcte, waardige aankondiging", u"Middel", u"Aandacht voor discretie", u"Persoonlijke begeleiding en script"],
       [u"GMT en Lions Nederland", u"Vitaliteits- en ledenbeleid uitdragen", u"Middel", u"Ondersteunend", u"Content delen, sprekers betrekken"],
       [u"Leveranciers (locatie, catering, AV)", u"Correcte opdrachtuitvoering", u"Laag-middel", u"Commercieel", u"Contracten en \u00e9\u00e9n aanspreekpunt"],
       [u"Externe pers/regionale media", u"Positive publiciteit Lions", u"Laag", u"Neutraal", u"Persbericht vooraf en nadien"]],
      widths=[3.6, 3.6, 2.0, 3.0, 3.4])

h2(doc, u"8.2 Communicatiematrix")
table(doc,
      [u"Communicatie", u"Kanaal", u"Frequentie", u"Zender", u"Doel"],
      [[u"Voortgangsrapportage project", u"E-mail + kort verslag", u"Wekelijks (wo)", u"PL", u"Besturing en tijdige signalering"],
       [u"Stuurgroepoverleg", u"Vergadering/hybrid", u"2-wekelijks + bij QG's", u"DG + PL", u"Besluitvorming, go/no-go"],
       [u"Kabinetsinformantie", u"Kabinetsagenda FY25-26", u"Maandelijks", u"PL via DG", u"Alignment kabinet"],
       [u"Uitnodiging leden", u"E-mail via presidents + districtszender", u"1x + herinnering", u"WP3", u"Opkomst maximaliseren"],
       [u"Herinnering/RSVP-boost", u"Districtszender + socials", u"Wekelijks vanaf 17-09", u"WP3", u"Registratie stimuleren"],
       [u"Persbericht", u"Pers + website/socials", u"Vooraf en na afloop", u"WP3", u"Publiciteit Lions"],
       [u"Follow-up na avond", u"E-mail + documentendeling", u"1x binnen week", u"WP3", u"Dank, presentaties, verslag"],
       [u"Escalatie", u"Telefoon/e-mail DG", u"Direct bij nood", u"PL", u"Snelle besluitvorming"]],
      widths=[3.8, 3.8, 3.2, 2.4, 3.4])

# ------------------------------------------------------------------ 9. change management
page_break(doc)
h1(doc, u"9. Change Management", first=True)
para(doc, u"Wijzigingen aan scope, planning, budget of governance-aspecten "
          u"worden beheerst via een vaste change control procedure, zodat "
          u"het overzicht bewaard blijft en bestuurlijke besluiten "
          u"traceerbaar zijn.")

h2(doc, u"9.1 Change control procedure")
bullet(doc, u" Elke wijzigingsvoorstel wordt ingediend via een change request (CR) met: beschrijving, reden, impact op tijd/geld/kwaliteit/governance en alternatieven;", u"Stap 1 \u2014 Indienen:")
bullet(doc, u" De PL beoordeelt binnen 2 werkdagen de impact (impactanalyse, \u00a79.3) en kiest de afhandelroute;", u"Stap 2 \u2014 Analyse:")
bullet(doc, u" Kleine wijzigingen (< \u20ac 250 en geen effect op critical path) beslist de PL zelf; middelgrote (< \u20ac 1.000 of lokaal plangeffect) de stuurgroep; grote (scope, datum, > \u20ac 1.000, governance-aspecten) de District Governor;", u"Stap 3 \u2014 Beslissen:")
bullet(doc, u" Goedgekeurde CR's worden verwerkt in planning/budget en gecommuniceerd naar betrokken WP's;", u"Stap 4 \u2014 Verwerken:")
bullet(doc, u" Alle CR's worden bijgehouden in het change log (onderdeel van het projectdossier, appendix B).", u"Stap 5 \u2014 Registreren:")

h2(doc, u"9.2 Approval workflow")
table(doc,
      [u"Categorie", u"Criteria", u"Goedkeuring door", u"Doorlooptijd"],
      [[u"Klein", u"< \u20ac 250, geen critical path-effect", u"Projectleider", u"2 werkdagen"],
       [u"Middel", u"< \u20ac 1.000 of plangeffect binnen WP", u"Stuurgroep (DG + PL)", u"5 werkdagen"],
       [u"Groot", u"Scope-, datum-, of governancewijziging; > \u20ac 1.000", u"District Governor (met governance-advies)", u"7 werkdagen"]],
      widths=[2.2, 6.2, 4.6, 2.6])

h2(doc, u"9.3 Impact analyse")
para(doc, u"Elke CR beoordeelt in ieder geval:")
bullet(doc, u" effect op de critical path en milestones (hoofdstuk 5);", u"Tijd:")
bullet(doc, u" effect op budget en machtigingen (WP5);", u"Geld:")
bullet(doc, u" effect op kwaliteit, draaiboek en deelnemerservaring (WP1/WP6);", u"Kwaliteit:")
bullet(doc, u" effect op statutaire/protocollaire vereisten, met name rond de 2e VDG-aankondiging (WP2, [2][3]);", u"Governance:")
bullet(doc, u" effect op communicatie-afspraken (WP3) en logistiekcontracten (WP4).", u"Overig:")

# ------------------------------------------------------------------ 10. monitoring
page_break(doc)
h1(doc, u"10. Monitoring & Controle", first=True)

h2(doc, u"10.1 KPI's")
table(doc,
      [u"KPI", u"Definitie", u"Doel", u"Meetmoment"],
      [[u"Club-dekking", u"% clubs met \u2265 1 geregistreerde deelnemer", u"\u2265 60%", u"Registratie + deurlijst"],
       [u"Deelnemersaantal", u"Aantal aanwezigen t.o.v. streefbeeld (75+)", u"\u2265 75", u"Deurregistratie"],
       [u"RSVP-conversie", u"Aantal registraties t.o.v. uitgenodigde leden", u"\u2265 25%", u"Tussenmetingen (24-09, 01-10, 08-10)"],
       [u"Budgetrealisatie", u"Realisatie t.o.v. goedgekeurd budget", u"\u2264 100%", u"Weekelijks (WP5), eindafrekening"],
       [u"Planningsschema", u"% milestones op tijd gehaald", u"100%", u"Wekelijkse rapportage"],
       [u"Deelnemerstevredenheid", u"Gemiddelde score evaluatieformulier (1-5)", u"\u2265 4,0", u"Evaluatie na afloop"],
       [u"Informatiebeleving vitaliteitsbeleid", u"% dat deelnemer zich voldoende ge\u00efnformeerd voelt", u"\u2265 80%", u"Evaluatie (doelstelling D3 PvA)"]],
      widths=[3.4, 6.0, 2.2, 4.0])

h2(doc, u"10.2 Rapportagecycli")
table(doc,
      [u"Rapport", u"Frequentie", u"Aan", u"Inhoud"],
      [[u"Voortgangsrapport (status + KPI's + risico's)", u"Wekelijks (woensdag)", u"Stuurgroep, WP-co\u00f6rdinatoren", u"Voortgang per WP, planning vs. echt, issues"],
       [u"QG-dossier", u"Per fase-overgang", u"Stuurgroep", u"Criteriumtoetsing en besluitvoorstel"],
       [u"Financieel overzicht", u"2-wekelijks", u"Stuurgroep, penningmeester", u"Bestedingen, verplichtingen, prognose"],
       [u"Debrief evenement", u"Binnen 3 dagen na 13-10", u"Stuurgroep", u"Uitvoering, incidenten, eerste cijfers"],
       [u"Eindrapportage", u"31-10-2026", u"DG, kabinet, archief", u"KPI-eindstand, evaluatie, lessen, eindafrekening"]],
      widths=[4.6, 3.2, 3.8, 4.0])

h2(doc, u"10.3 Escalatieprocedure")
table(doc,
      [u"Niveau", u"Trigger", u"Route", u"Reactietijd"],
      [[u"0 \u2014 WP", u"Issue binnen werkpakket, oplosbaar binnen mandaat", u"WP-co\u00f6rdinator lost op, meldt in wekelijkse rapportage", u"3 werkdagen"],
       [u"1 \u2014 Project", u"Cross-WP issue, bedreiging planning/budget binnen grenzen", u"PL beslist of legt voor aan stuurgroep", u"2 werkdagen"],
       [u"2 \u2014 Stuurgroep", u"Critical path bedreigd, budgetoverschrijding middel, no-go-risico QG", u"Stuurgroep (DG + PL) beslist", u"2 werkdagen"],
       [u"3 \u2014 DG/Bestuurlijk", u"Evenementdatum, governance-niet-conformiteit, grote budgetoverschrijding", u"District Governor met governance-advies; zo nodig kabinet", u"Direct (telefonisch) + 5 werkdagen besluit"]],
      widths=[2.6, 5.4, 5.0, 2.6])
para(doc, u"Escalaties worden altijd schriftelijk vastgelegd in het "
          u"besluitenregister en teruggekoppeld in de eerstvolgende "
          u"voortgangsrapportage.")

# ------------------------------------------------------------------ 11. appendix
page_break(doc)
h1(doc, u"11. Appendix", first=True)

h2(doc, u"11.1 Referenties")
refs = [
    u"[1] Lions Club Vitaliteit Programma v4 \u2014 Lions Nederland (april 2025).",
    u"[2] MD110 Nederland Statuten \u2014 versie 2021.12.07.",
    u"[3] Protocol MD-Organen V1.0 \u2014 Lions MD110 (18 februari 2025).",
    u"[4] Samenstelling kabinet 25-26, definitief vastgesteld 11-04-2025 (districtsdocument).",
    u"[5] Ledenbeleid GMT Lions Nederland \u2014 2025-versie.",
    u"[6] District 110AN 5 Year Membership Trend (ledenoverzicht district).",
    u"[7] District 110AN Summary of Membership Types and Gender by Club (ledenoverzicht district).",
    u"[8] Werkplan 110 AN 2025-2026 (districtsdocument).",
    u"[9] Inspiratie avond 110AN \u2014 presentatie eerdere ledenontmoetingsavond (referentie).",
    u"[10] Huishoudelijk Reglement MD 110 \u2014 mei 2021; concept 2025.",
    u"[11] LCI International Constitution and By-Laws (actuele versie).",
    u"[12] Districtbegroting 110 AN 25-26 (districtsdocument).",
]
for ref in refs:
    para(doc, ref, size=10, space_after=2, color=TEXT_SEC)

h2(doc, u"11.2 Templates")
para(doc, u"De volgende templates maken onderdeel uit van het projectdossier "
          u"en worden via de WP-co\u00f6rdinatoren beheerd:")
table(doc,
      [u"Template", u"Doel", u"Eigenaar"],
      [[u"Change request (CR)-formulier", u"Wijzigingsvoorstellen vastleggen", u"PL"],
       [u"QG-dossier-format", u"Quality gate-toetsing per fase", u"PL"],
       [u"Draaiboek-format", u"Tijdlijn, rollen en scripts avond", u"WP1"],
       [u"Uitnodigingstemplate (huisstijl 110 AN)", u"Uitnodigingen en herinneringen", u"WP3"],
       [u"Registratie-/RSVP-overzicht", u"Deelnemersadministratie", u"WP3/WP4"],
       [u"Evaluatieformulier", u"KPI-meting deelnemers", u"WP6"],
       [u"Lessons-learned-register", u"Kennisborging voor volgend kabinet", u"WP6"]],
      widths=[5.4, 6.6, 2.6])

h2(doc, u"11.3 Afkortingenlijst")
table(doc,
      [u"Afkorting", u"Begrip"],
      [[u"AV", u"Audiovisueel (geluid, beeld, presentatietechniek)"],
       [u"CR", u"Change Request (wijzigingsverzoek)"],
       [u"DG", u"District Governor"],
       [u"1e/2e VDG", u"(Vice) District Governor \u2014 eerste/tweede vice-voorzitter van het district"],
       [u"GMT", u"Global Membership Team (ledenwerving en -behoud Lions)"],
       [u"HR", u"Huishoudelijk Reglement"],
       [u"KPI", u"Key Performance Indicator (prestatie-indicator)"],
       [u"LCI", u"Lions Clubs International"],
       [u"MD110", u"Multiple District 110 (Lions Nederland)"],
       [u"PL", u"Projectleider"],
       [u"PvA", u"Plan van Aanpak"],
       [u"QA", u"Quality Assurance (kwaliteitsborging)"],
       [u"QG", u"Quality Gate (kwaliteitspoort)"],
       [u"RSVP", u"Répondez s'il vous pla\u00eet (aanmelding/terugkoppeling)"],
       [u"WP", u"Work Package (werkpakket)"]],
      widths=[3.0, 11.6])

# ------------------------------------------------------------------ opslaan
os.makedirs(OUT_DIR, exist_ok=True)
doc.save(OUT_FILE)
print("OK:", OUT_FILE, os.path.getsize(OUT_FILE), "bytes")
