#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Policy Ledenontmoetingsavond 13 oktober 2026 - District 110 AN
DOCX-generator conform MASTER_STYLEGUIDE.md par. 2.3 (Lions DOCX-standaard).
Techniek: python-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

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"
DOC_TITLE = u"Policy Ledenontmoetingsavond"
LOGO      = "/root/Documents/Lions database/Logo_rgb_LI_Signature_Vert1_3C.png"
OUT_DIR   = "/root/projects/jg/2026-pbm-ledenontmoetingsavond-13okt/deliverables/docx"
OUT_FILE  = os.path.join(OUT_DIR, "01_Policy_Ledenontmoetingsavond.docx")
VERSION, DATUM = "1.0", "25 augustus 2026"
BUL = u"\u2022"
SEC = u"\u00a7"

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):
    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(10.5)
        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 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(10.5)
            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)

# ---------------------------------------------------------------- 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"Policy Ledenontmoetingsavond 13 oktober 2026 - District 110 AN"
cp.author = u"JvG Consultancy namens District 110 AN"
cp.keywords = u"Lions; District 110AN; policy; ledenontmoetingsavond; 2e VDG; governance"
cp.category = u"Lions District Policy"

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, "POLICY", size=14, bold=True, color=LIONS_GOLD_RGB,
     align=WD_ALIGN_PARAGRAPH.CENTER, space_after=6)
para(doc, DOC_TITLE, size=26, bold=True, color=LIONS_BLUE,
     align=WD_ALIGN_PARAGRAPH.CENTER, space_after=6)
para(doc, u"Districtsbrede ledenontmoetingsavond met aankondiging van de "
          u"kandidaat 2e Vice District Governor",
     size=13, color=TEXT_SEC, align=WD_ALIGN_PARAGRAPH.CENTER, space_after=24)
para(doc, u"Dinsdag 13 oktober 2026  %s  Locatie: nader te bepalen "
          u"(centrale locatie in het district)" % BUL,
     size=11, italic=True, color=TEXT_SEC,
     align=WD_ALIGN_PARAGRAPH.CENTER, space_after=36)
para(doc, u"Opgesteld door JvG Consultancy namens District 110 AN",
     size=11, color=TEXT_SEC, align=WD_ALIGN_PARAGRAPH.CENTER, space_after=4)
para(doc, u"Versie %s  %s  %s" % (VERSION, BUL, DATUM), size=11, color=TEXT_SEC,
     align=WD_ALIGN_PARAGRAPH.CENTER)

page_break(doc)

# ---------------------------------------------------------------- documentbeheer
h1(doc, u"Documentbeheer", first=True)
table(doc,
      [u"Versie", u"Datum", u"Auteur", u"Status", u"Wijziging"],
      [[u"1.0", u"25-08-2026", u"JvG Consultancy namens District 110 AN",
        u"Definitief", u"Initi\u00eble release ter vaststelling door de District Governor"]],
      widths=[1.8, 2.2, 5.2, 2.2, 4.0])

h2(doc, u"Distributie")
table(doc,
      [u"Functie", u"Functionaris", u"Distributie"],
      [[u"District Governor (DG)", u"Arjan van Ommen", u"Originator / goedkeuring"],
       [u"1st Vice District Governor", u"Voorzitter GMT district", u"Ter kennisgeving / uitvoering"],
       [u"District Cabinet 2026-2027", u"Uitvoerend orgaan", u"Ter uitvoering"],
       [u"Clubpresidenten District 110 AN", u"Alle clubs in het district", u"Ter kennisgeving"],
       [u"Global Membership Team (GMT)", u"Districtsteam ledenbeleid", u"Ter uitvoering"]],
      widths=[5.0, 4.6, 5.8])

h1(doc, u"Inhoudsopgave")
for item in [
    u"1. Doelstelling en kader",
    u"2. Governance compliance (LCI, MD110 statuten)",
    u"3. Scope en toepassingsgebied",
    u"4. Verantwoordelijkheden (DG, Kabinet, Clubs)",
    u"5. Procedurele vereisten",
    u"6. Communicatie richtlijnen",
    u"7. Budget en resources",
    u"8. Kwaliteitsborging",
    u"9. Toetsing en validatie",
    u"Bijlage A %s Bronnenlijst" % BUL,
]:
    p = para(doc, item, size=11, space_after=3)
    p.paragraph_format.left_indent = Cm(0.5)

page_break(doc)

# ================================================================ 1
h1(doc, u"1. Doelstelling en kader", first=True)
h2(doc, u"1.1 Doelstelling")
para(doc, u"Deze policy regelt de organisatie, besluitvorming en verantwoordelijkheden "
          u"voor de Ledenontmoetingsavond van District 110 AN op dinsdag 13 oktober 2026. "
          u"Het evenement combineert twee doelstellingen uit het Werkplan 110 AN: het "
          u"versterken van clubvitaliteit en ledengroei, en het borgen van de "
          u"governance-continuiteit van het district middels de aankondiging van de "
          u"kandidaat 2e Vice District Governor (2e VDG) [1].")
bullet(doc, u"verbinden van leden uit alle clubs van District 110 AN tijdens \u00e9\u00e9n "
            u"districtsbijeenkomst;", bold_prefix=u"Netwerkontmoeting: ")
bullet(doc, u"delen van de districtsthema's clubvitaliteit, ledenwerving en -behoud "
            u"conform het Ledenbeleid GMT Lions Nederland [2] en het Club Vitaliteit "
            u"Programma v4 [3];", bold_prefix=u"Kadersignalering: ")
bullet(doc, u"formele aankondiging van de kandidaat 2e VDG voor het leeuwenjaar "
            u"2027-2028, ter voorbereiding op de districtsverkiezing conform de "
            u"verkiezingsrichtlijnen [4];", bold_prefix=u"Governance: ")
bullet(doc, u"oppakken van regionale service-initiatieven en jeugdprojecten uit het "
            u"werkplan [1].", bold_prefix=u"Service: ")

h2(doc, u"1.2 Kader")
para(doc, u"Deze policy is verankerd in de strategische kaders van Multiple District "
          u"110 en Lions Clubs International: het Meerjarenbeleidsplan MD110 2024-2030 "
          u"[5], het Werkplan 110 AN 2025-2026 [1] en de internationale "
          u"governance-documenten van LCI [6][7]. Waar in dit document functies worden "
          u"genoemd, gelden de functies zoals samengesteld in het kabinet 2025-2026, "
          u"vastgesteld op 11 april 2025 [8].")

# ================================================================ 2
h1(doc, u"2. Governance compliance (LCI, MD110 statuten)")
h2(doc, u"2.1 Statutaire basis")
para(doc, u"De Ledenontmoetingsavond en de daarin opgenomen 2e VDG-aankondiging worden "
          u"getoetst aan de volgende governance-documenten:")
table(doc,
      [u"Regelgeving", u"Bepaling", u"Toepassing op dit evenement"],
      [[u"Statuten MD110 Nederland (07-12-2021) [9]", u"\u00a7 4.2",
        u"Benoemingsprocedure 2e VDG; bevoegdheden District Governor"],
       [u"Huishoudelijk Reglement MD 110 (mei 2021 / concept 2025) [10]", u"Art. 12",
        u"Protocol voor districtbijeenkomsten: uitnodiging, agenda, verslaglegging"],
       [u"Protocol MD-Organen V1.0 (18-02-2025) [11]", u"\u00a7 3.1",
        u"Rol en samenstelling van het kabinet bij districtsevenementen; overdracht"],
       [u"International Constitution and By-Laws LCI [6]", u"Hoofdstuk IX",
        u"Verkiezings- en benoemingsprocedures voor district officers"],
       [u"LCI Board Policy Manual [7]", u"\u00a7 2.3",
        u"Ethische standaarden en gedragscode voor de District Governor"],
       [u"Lions District Election Guidelines [4]", u"Geheel",
        u"Kader voor de aankondiging van kandidaturen; geen campagne-uitingen "
        u"tijdens districtsbijeenkomsten"]],
      widths=[5.2, 2.2, 8.0])

h2(doc, u"2.2 Compliance-vereisten")
bullet(doc, u"De aankondiging van de kandidaat 2e VDG betreft een aankondiging van "
            u"kandidatuur, niet een verkiezingshandeling; stemprocedures blijven "
            u"voorbehouden aan de districtsconventie conform de Election Guidelines [4].")
bullet(doc, u"Alle onderdelen van de avond hebben een informerend en verbindend karakter; "
            u"formele districtsbesluiten vallen onder het Huishoudelijk Reglement "
            u"MD 110 [10] en vinden uitsluitend plaats in daarvoor aangewezen organen.")
bullet(doc, u"De District Governor en kabinetsleden handelen conform de ethische "
            u"standaarden voor district officers [7][12].")
bullet(doc, u"Geschillen die voortvloeien uit de voorbereiding of uitvoering van het "
            u"evenement worden afgehandeld conform de District Dispute Resolution "
            u"Procedure [13].")
bullet(doc, u"De evenementsdatum wordt afgestemd op de districtskalender conform het "
            u"Werkplan 110 AN [1]; overlapping met kabinetsvergaderingen en "
            u"zone-activiteiten is niet toegestaan.")

# ================================================================ 3
h1(doc, u"3. Scope en toepassingsgebied")
h2(doc, u"3.1 Toepassingsgebied")
para(doc, u"Deze policy is van toepassing op:")
bullet(doc, u"alle leden en officieren van de clubs die onder District 110 AN vallen;")
bullet(doc, u"het District Cabinet, de Global Membership Team en de zonevoorzitters "
            u"van District 110 AN;")
bullet(doc, u"alle door het district ingezette vrijwilligers, gasten en externe "
            u"sprekers tijdens de Ledenontmoetingsavond;")
bullet(doc, u"alle contracten, bestellingen en verplichtingen die voor rekening van "
            u"het district worden aangegaan ter voorbereiding van het evenement.")

h2(doc, u"3.2 Buiten scope")
para(doc, u"Clubspecifieke activiteiten rondom de avond (zoals vervoer dat individuele "
          u"clubs zelf regelen) vallen onder de verantwoordelijkheid van de betrokken "
          u"club. De districtsconventie en de daaraan verbonden verkiezingsprocedures "
          u"vallen buiten deze policy en zijn geregeld in het Handboek Lions Conventies "
          u"[14] en de Election Guidelines [4].")

h2(doc, u"3.3 Doelgroep en opkomst")
para(doc, u"De primaire doelgroep bestaat uit alle leden van District 110 AN; de "
          u"opkomstverwachting wordt onderbouwd met de actuele ledenstatistieken "
          u"(5 Year Membership Trend, Summary of Membership Types en club health "
          u"assessment) [15][16][17]. Op basis van de historische opkomst van "
          u"vergelijkbare districtsbijeenkomsten, zoals de eerdere inspiratieavond "
          u"[18], wordt een opkomstdoelstelling van minimaal \u00e9\u00e9n delegatie per club "
          u"gehanteerd. Zonevoorzitters monitoren de aanmeldingen per zone en sturen "
          u"actief bij vanaf vier weken voor het evenement.")

# ================================================================ 4
h1(doc, u"4. Verantwoordelijkheden (DG, Kabinet, Clubs)")
h2(doc, u"4.1 RACI-matrix")
para(doc, u"R = Responsible (uitvoerend) %s A = Accountable (eindverantwoordelijk) %s "
          u"C = Consulted (geconsulteerd) %s I = Informed (ge\u00efnformeerd)" % (BUL, BUL, BUL))
table(doc,
      [u"Activiteit", u"DG", u"Kabinet", u"GMT", u"Zonevz.", u"Clubs"],
      [[u"Vaststellen policy en agenda", u"A", u"C", u"C", u"I", u"I"],
       [u"Locatie en datum vaststellen", u"A", u"R", u"I", u"C", u"I"],
       [u"2e VDG-kandidaat aankondigen", u"A/R", u"C", u"I", u"I", u"I"],
       [u"Uitnodigingen verzenden", u"I", u"R", u"C", u"R", u"I"],
       [u"Aanmeldingen monitoren", u"I", u"C", u"R", u"R", u"C"],
       [u"Programma ledenvitaliteit invullen", u"A", u"C", u"R", u"C", u"C"],
       [u"Budgetbewaking", u"A", u"R", u"I", u"I", u"I"],
       [u"Verslaglegging en evaluatie", u"A", u"R", u"C", u"C", u"I"],
       [u"Delegaties aanwijzen per club", u"I", u"I", u"I", u"C", u"A/R"]],
      widths=[5.4, 1.6, 2.0, 1.6, 2.0, 1.6])

h2(doc, u"4.2 District Governor")
bullet(doc, u"draagt de eindverantwoordelijkheid voor het evenement en deze policy;")
bullet(doc, u"kondigt de kandidaat 2e VDG aan conform \u00a7 4.2 van de Statuten MD110 [9] "
            u"en de Election Guidelines [4];")
bullet(doc, u"keurt agenda, budget en locatie goed.")

h2(doc, u"4.3 District Cabinet")
bullet(doc, u"bereidt locatie, catering, logistiek en programma voor conform het "
            u"Protocol MD-Organen [11];")
bullet(doc, u"zorgt voor uitnodigingen, aanmeldregistratie en verslaglegging conform "
            u"artikel 12 van het Huishoudelijk Reglement [10];")
bullet(doc, u"bewaakt het budget en legt financi\u00eble verantwoording af aan de DG.")

h2(doc, u"4.4 Global Membership Team en zonevoorzitters")
bullet(doc, u"vertalen het Ledenbeleid GMT [2] en het Club Vitaliteit Programma v4 [3] "
            u"naar de programma-onderdelen van de avond;")
bullet(doc, u"stimuleren aanmelding en deelname binnen hun zones en rapporteren "
            u"wekelijks de aanmeldstand aan het kabinet.")

h2(doc, u"4.5 Clubs en clubbesturen")
bullet(doc, u"wijzen per club een delegatie aan en bevorderen brede deelname;")
bullet(doc, u"dragen clubleden voor die good practices rondom vitaliteit en "
            u"ledenwerving delen tijdens de avond;")
bullet(doc, u"dragen zorg voor tijdige aanmelding via het opgegeven "
            u"registratiekanaal uiterlijk zes dagen voor het evenement.")

# ================================================================ 5
h1(doc, u"5. Procedurele vereisten")
h2(doc, u"5.1 Voorbereiding (T-16 tot T-4 weken)")
table(doc,
      [u"Termijn", u"Actie", u"Verantwoordelijke"],
      [[u"T-16 weken", u"Policy vastgesteld; projectgroep ingericht", u"DG / Kabinet"],
       [u"T-12 weken", u"Locatie geboekt en datum gepubliceerd in districtskalender",
        u"Kabinet"],
       [u"T-8 weken", u"Definitieve agenda incl. 2e VDG-moment opgesteld", u"DG / GMT"],
       [u"T-6 weken", u"Uitnodigingen verzonden aan alle clubs conform HR MD110 [10]",
        u"Kabinet"],
       [u"T-4 weken", u"Aanmeldmonitoring per zone gestart; bijsturing opkomst",
        u"Zonevoorzitters"]],
      widths=[2.6, 8.8, 4.2])

h2(doc, u"5.2 Uitvoering (13 oktober 2026)")
bullet(doc, u"ontvangst en registratie van deelnemers door het kabinet;")
bullet(doc, u"openingsprotocol door de District Governor;")
bullet(doc, u"programmablokken ledenvitaliteit en service conform het Werkplan [1];")
bullet(doc, u"aankondigingsmoment kandidaat 2e VDG door de DG, zonder "
            u"stemmingshandeling [4];")
bullet(doc, u"informele ontmoeting en netwerkgedeelte.")

h2(doc, u"5.3 Nazorg (tot T+4 weken)")
table(doc,
      [u"Termijn", u"Actie", u"Verantwoordelijke"],
      [[u"T+1 week", u"Verslag van de avond opgesteld en gedistribueerd conform "
                     u"HR MD110 art. 12 [10]", u"Kabinet"],
       [u"T+2 weken", u"Evaluatie met GMT en zonevoorzitters; opkomstcijfers "
                      u"geanalyseerd [15]", u"GMT"],
       [u"T+4 weken", u"Financi\u00eble afrekening conform districtbegroting; "
                      u"lessen-geleerd-rapportage", u"DG / Kabinet"]],
      widths=[2.6, 8.8, 4.2])

# ================================================================ 6
h1(doc, u"6. Communicatie richtlijnen")
h2(doc, u"6.1 Kanalen en middelen")
table(doc,
      [u"Middel", u"Inzet", u"Kanaal"],
      [[u"Districtscommunicatie (officieel)", u"Uitnodiging en agenda",
        u"E-mail via kabinet aan clubbesturen"],
       [u"Clubpresidenten-briefing", u"Doorvertaling naar leden",
        u"Clubvergaderingen / clubnieuwsbrieven"],
       [u"Zonebijeenkomsten", u"Opkomststimulering", u"Zonevoorzitters"],
       [u"Website Lions 110 AN / social media", u"Aankondiging en terugkoppeling",
        u"Districtskanalen conform huisstijl"]],
      widths=[4.6, 4.8, 6.2])

h2(doc, u"6.2 Huisstijl en toon")
bullet(doc, u"Alle communicatie draagt het offici\u00eble districtskennismerk en volgt de "
            u"Lions-huisstijl; het briefpapier 110 AN 25-26 vormt het referentie-"
            u"document [19].")
bullet(doc, u"De toon is zakelijk, inclusief en toegankelijk; taalgebruik conform de "
            u"waarden van Lions Clubs International.")
bullet(doc, u"Over de kandidaatstelling 2e VDG wordt uitsluitend feitelijk en "
            u"neutraal gecommuniceerd; campagne-uitingen zijn niet toegestaan "
            u"conform de Election Guidelines [4].")

h2(doc, u"6.3 Timeline communicatie")
table(doc,
      [u"Moment", u"Boodschap"],
      [[u"T-8 weken", u"Save-the-date met datum en locatie aan alle clubs"],
       [u"T-6 weken", u"Offici\u00eble uitnodiging met agenda en registratie-instructies"],
       [u"T-3 weken", u"Herinnering met opkomststimulering via zonevoorzitters"],
       [u"T-1 week", u"Sluiting registratie; praktische informatie deelnemers"],
       [u"T+1 week", u"Terugkoppeling met verslag en vervolgacties"]],
      widths=[3.0, 12.6])

# ================================================================ 7
h1(doc, u"7. Budget en resources")
h2(doc, u"7.1 Budgetkader")
para(doc, u"Het budget voor de Ledenontmoetingsavond maakt onderdeel uit van de "
          u"Districtbegroting 110 AN [20]. De definitieve bedragen worden bij "
          u"vaststelling van de begroting door de DG geactualiseerd. Het kabinet "
          u"bewaakt de kaders en rapporteert maandelijks.")
table(doc,
      [u"Budgetpost", u"Indicatie", u"Toelichting"],
      [[u"Locatie en faciliteiten", u"Conform districtbegroting [20]",
        u"Zaalhuur inclusief AV-middelen"],
       [u"Catering", u"Conform districtbegroting [20]",
        u"Koffie/thee en lichte consumpties, afgestemd op aanmeldingen"],
       [u"Communicatie", u"Conform districtbegroting [20]",
        u"Drukwerk en verzendkosten"],
       [u"Reserve (10%)", u"Berekend op subtotaal",
        u"Onvoorziene kosten; uitgifte uitsluitend na akkoord DG"]],
      widths=[4.0, 5.0, 6.6])

h2(doc, u"7.2 Resources")
bullet(doc, u"Projectgroep: DG, kabinetsleden, GMT-co\u00f6rdinator, "
            u"communicatieverantwoordelijke en vertegenwoordigers van de "
            u"zonevoorzitters;")
bullet(doc, u"Vrijwilligers tijdens de avond: registratie, ontvangst en techniek;")
bullet(doc, u"Materiaal: districtsbanner, logo-presentie, presentatievoorzieningen "
            u"en evaluatieformulieren.")

h2(doc, u"7.3 Financi\u00eble beheersing")
bullet(doc, u"Opdrachten boven \u20ac 500 vereisen voorafgaand akkoord van de DG;")
bullet(doc, u"Onkostenvergoedingen conform MD110-regelgeving per 01-07-2023 [21] en "
            u"de richtlijnen voor reis- en onkostenvergoedingen [22];")
bullet(doc, u"Na afloop vindt financi\u00eble verantwoording plaats binnen vier weken, "
            u"inclusief evaluatie van de reserve-annotatie.")

# ================================================================ 8
h1(doc, u"8. Kwaliteitsborging")
h2(doc, u"8.1 Kwaliteitscriteria")
table(doc,
      [u"Criterium", u"Norm", u"Meetmoment"],
      [[u"Opkomst", u"Minimaal \u00e9\u00e9n delegatie per club van het district [15]",
        u"Registratie T-1 week en avond zelf"],
       [u"Tevredenheid deelnemers", u"Gemiddelde evaluatiescore \u2265 7,5 (10-puntsschaal)",
        u"Evaluatieformulier direct na afloop"],
       [u"Governance-naleving", u"Nul afwijkingen van statuten en HR MD110 [9][10]",
        u"Toetsing agenda en verslag"],
       [u"Budgethandhaving", u"Realisatie binnen goedgekeurd budget inclusief reserve",
        u"Financi\u00eble verantwoording T+4 weken"],
       [u"Verslaglegging", u"Verslag binnen \u00e9\u00e9n week conform HR art. 12 [10]",
        u"T+1 week"]],
      widths=[3.8, 6.6, 5.2])

h2(doc, u"8.2 Kwaliteitsborgende maatregelen")
bullet(doc, u"Voorafgaande compliance-check van agenda en aankondigingsmoment aan de "
            u"hand van de matrix in hoofdstuk 2;")
bullet(doc, u"Steekproefsgewijze controle van aanmeld- en registratiegegevens door "
            u"de GMT-co\u00f6rdinator;")
bullet(doc, u"Evaluatieverplichting: alle deelnemers ontvangen een evaluatieformulier; "
            u"de resultaten worden opgenomen in het lessen-geleerd-rapport.")

# ================================================================ 9
h1(doc, u"9. Toetsing en validatie")
h2(doc, u"9.1 Toetsingskader")
para(doc, u"Deze policy wordt getoetst op drie niveaus v\u00f3\u00f3r vaststelling en wordt "
          u"na het evenement ge\u00ebvalueerd op effectiviteit:")
table(doc,
      [u"Niveau", u"Toetsing", u"Door"],
      [[u"Juridisch/statutair", u"Conformiteit met Statuten MD110, HR MD110, Protocol "
        u"MD-Organen en LCI-documenten [6][7][9][10][11]",
        u"Compliance-aandachtige kabinet / externe toets"],
       [u"Strategisch", u"Bijdrage aan doelstellingen Werkplan 110 AN en "
        u"Meerjarenbeleidsplan 2024-2030 [1][5]", u"DG met kabinet"],
       [u"Operationeel", u"Uitvoerbaarheid: planning, budget, resources, "
        u"communicatie", u"Projectgroep"]],
      widths=[3.4, 8.0, 4.2])

h2(doc, u"9.2 Validatiemomenten")
bullet(doc, u"Concept-toets: deze policy-versie wordt v\u00f3\u00f3r publicatie getoetst door de "
            u"DG en het kabinet en, indien aangewezen, door de compliance-aandachtige "
            u"van MD110;")
bullet(doc, u"Pre-event check (T-1 week): volledigheidscontrole agenda, "
            u"compliance-matrix en registratiestand;")
bullet(doc, u"Post-event evaluatie (T+4 weken): toetsing van de kwaliteitsnormen uit "
            u"hoofdstuk 8; afwijkingen worden gemeld aan de DG met verbetervoorstellen "
            u"voor volgende districtsbijeenkomsten.")

h2(doc, u"9.3 Versiebeheer en geldigheid")
para(doc, u"Deze policy is vastgesteld voor de Ledenontmoetingsavond van 13 oktober "
          u"2026 en vervalt na afronding van de nazorg (T+4 weken). Wijzigingen "
          u"vinden uitsluitend plaats na akkoord van de District Governor en worden "
          u"vastgelegd in de documentbeheer-tabel. Voor daaropvolgende "
          u"ledenontmoetingsavonden dient de policy opnieuw te worden getoetst aan de "
          u"dan geldende regelgeving en kabinetsamenstelling.")

# ================================================================ Bijlage A
page_break(doc)
h1(doc, u"Bijlage A %s Bronnenlijst" % BUL, first=True)
bronnen = [
    u"Werkplan 110 AN 2025-2026, District 110 AN (intern document, Lions database)",
    u"Ledenbeleid GMT Lions Nederland, versie 2025 (30-03-2025)",
    u"Lions Club Vitaliteit, versie 4 (13-04-2025), Lions Nederland",
    u"Lions District Election Guidelines, Lions Clubs International",
    u"Meerjarenbeleidsplan MD110 2024-2030 (vs. 3.0)",
    u"International Constitution and By-Laws, Lions Clubs International",
    u"Board Policy Manual, Lions Clubs International",
    u"Samenstelling kabinet 25-26, definitief per 11-04-2025 (District 110 AN)",
    u"Statuten MD110 Nederland, d.d. 07-12-2021",
    u"Huishoudelijk Reglement MD 110, mei 2021; conceptversie 19-02-2025",
    u"Protocol MD-Organen, versie 1.0, 18-02-2025",
    u"Ethical Standards and Conduct (District Governor), LCI",
    u"District Dispute Resolution Procedure, Lions Clubs International",
    u"Handboek Lions Conventies, versie 06, 29-07-2024",
    u"District 110AN 5 Year Membership Trend (ledenstatistieken)",
    u"District 110AN Summary of Membership Types and Gender by Club",
    u"District 110AN club health assessment",
    u"Inspiratie avond 110AN (presentatie eerdere ledenontmoetingsavond)",
    u"Briefpapier 110 AN 25-26 (huisstijldocument)",
    u"Districtbegroting 110 AN 25-26",
    u"MD110-regelgeving onkostenvergoedingen per 01-07-2023",
    u"District Governor Travel Expense Claim Form %s Instruction Tips, LCI" % BUL,
]
for i, b in enumerate(bronnen, start=1):
    p = para(doc, u"[%d] %s" % (i, b), size=10, space_after=3)
    p.paragraph_format.left_indent = Cm(1.0)
    p.paragraph_format.first_line_indent = Cm(-1.0)

para(doc, "", space_after=6)
para(doc, u"%s Einde document %s" % (BUL, BUL), size=10, italic=True, color=TEXT_SEC,
     align=WD_ALIGN_PARAGRAPH.CENTER)

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