Ga naar inhoud

Hoe werkt dit: dossier-import

Het interview levert de inrichting op. Wat er in de kennisbank van een club staat (Markdown volgens de sjablonen in _Templates), wordt de inhoud van de app. Deze pagina laat zien hoe dat werkt en wat je moet weten als je eraan bouwt.

Voor de clubbeheerder

  1. Ga naar Beheer → Dossier-import. Alleen de clubbeheerder ziet die pagina. Commissies en instellingen aanmaken is haar werk (functioneel ontwerp paragraaf 2.3).
  2. Wijs de map met het dossier aan en klik op Dossier lezen. Er verandert dan nog niets.
  3. Je krijgt een lijst met verschillen. Elk verschil heeft een label:
    • Nieuw: staat in het dossier, nog niet in de app.
    • Gewijzigd: staat in allebei, maar anders.
    • Verdwenen: staat in de app, niet meer in het dossier. Overnemen archiveert het. Verwijderen doet de app nooit, omdat het dossier zich kan vergissen.
    • Conflict: iets klopt niet met een regel van de club. Bijvoorbeeld twee commissies die hetzelfde onderwerp claimen als “hiervoor moet je bij ons zijn”, of een verwijzing naar een commissie die de app niet kent. Dit los je op in het dossier zelf. In de lijst kan dat niet.
    • Niet herkend: een sectie die de import niet kent. De app neemt hem niet over. Hij gaat ook niet verloren.
  4. Kies wat je overneemt en klik op Geselecteerde overnemen. Wat niet lukt, blijft open staan met de reden erbij.
  5. Lees na elke interviewronde opnieuw in. Wat je eerder overnam, is dan geen verschil meer.

Bestanden waar de import nog niets mee doet (interviewnotities, analyses, referentie), telt de app en laat hij verder met rust. Ze staan niet als verschil in de lijst.

Wat er wordt gelezen

Uit commissie.md (per commissie): naam, aanspreekpunt, status, functioneel mailadres, broncode, modules, doel, taken, bevoegdheden, “hiervoor moet je bij ons zijn”, “hiervoor moet je niet bij ons zijn” (met verwijzing), werkt samen met, overleggen en de bezettingstabel (functies met gewenst aantal en vitaal, personen met aard, sinds, beoogd einde en waar het werk eigenlijk hoort).

Uit bestuursfunctie.md: naam, portefeuille, dagelijks bestuur, financieel, bezetting.

De import herkent twee vormen: het sjabloon met kopjes, en de vorm die tijdens een interview ontstaat (vetgedrukte labels in een lopende sectie). Beide geven hetzelfde resultaat.

Voor wie eraan bouwt

src/kern/dossier/ heeft vier lagen, in deze volgorde:

Bestand Doet
markdown.ts frontmatter, koppen, tabellen en lijsten uit een bestand halen
lezen.ts die stukken herkennen als commissie, onderwerp, functie, bezetting
vergelijken.ts het dossier naast de stand van de app leggen; geeft verschillen terug, praat niet met de database
toepassen.ts de stand ophalen en gekozen verschillen uitvoeren, als de ingelogde gebruiker

Alleen index.ts wordt buiten de module gebruikt. vergelijken.ts is met opzet zonder database geschreven. Daar zit de logica, en die test je met npm run test.

Er is geen transactie over de hele import heen (supabase-js kent die niet). Daarom is de volgorde zo gekozen dat een halve import geen kapotte verwijzingen achterlaat: eerst commissies, dan functies en personen, dan bezetting, onderwerpen, samenwerking en overleg. Tussen elke groep haalt de app de stand opnieuw op, zodat wat net is aangemaakt gevonden wordt.

Een fout bij het ophalen van die stand stopt de vergelijking. Er komt dan geen lege lijst uit waaruit de app zou afleiden dat alles nieuw is. Wijzigingen gelden alleen voor de actieve club en tellen pas als overgenomen wanneer een rij is bijgewerkt. Mislukt het aanmaken van een commissie, dan plaatst de app haar functies, bezettingen en overleggen niet onder het bestuur of als algemeen cluboverleg. Herstel eerst die commissie en lees het dossier daarna opnieuw.

Nog niet gebouwd, komt in werkpakket 1.2b: het dossier als upload in plaats van een map op de server, en de kaderlijst uit Excel.