Files
crewli/dev-docs/BACKLOG.md
bert.hausmans 1875e79ce1 docs(backlog): add gaps discovered during S3a PR 2
- TECH-06 — ESLint config ontbreekt in apps/portal (pendant van TECH-05).
- DOC-02 — VitePress docs:build faalt op missing image in
  /docs/volunteer/je-aanmelden-via-een-link.md.
- DOC-03 — Formulieren sidebar story is incompleet; nog geen
  publicatieflow, inzendingen-overzicht, templates, webhooks,
  conditionele logica.
- FORM-09 — TriggerPersonIdentityMatchOnFormSubmit ShouldQueue
  herzien: async queue-dispatch levert null bij submit-response;
  eager state + lazy resolution patroon invoeren nu de refactor
  nog klein is (voor FORM-05 landt).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 20:44:46 +02:00

26 KiB

Crewli — Product Backlog

Gedocumenteerde wensen en features die bewust zijn uitgesteld. Bijgewerkt: April 2026

Gebruik: Voeg nieuwe items toe als ze tijdens development ontstaan. Geef elk item een prioriteit en fase zodra je het gaat oppakken.


Fase 3 — Geplande features

ARCH-01 — Recurrence / Terugkerende events

Aanleiding: Schaatsbaan use case — 8 weken, elke za+zo openingsdagen. Wat: Organisator definieert één template sub-event met RRULE. Platform genereert automatisch alle instanties. Details:

  • RRULE formaat (RFC 5545): FREQ=WEEKLY;BYDAY=SA,SU;UNTIL=20270126
  • events.recurrence_rule (string nullable) — al gereserveerd in schema
  • events.recurrence_exceptions (JSON) — cancelled + modified dates
  • UI: "Genereer openingsdagen" wizard
  • Aanpassen van één instantie raakt template niet
  • "Alleen deze dag" / "Alle volgende dagen" / "Alle dagen" (Google Calendar patroon) Schema: Kolommen al aanwezig in v1.7. Alleen generator-logica ontbreekt.

ARCH-02 — Min/max shifts per vrijwilliger

Aanleiding: Zonder limiet claimen enthousiaste vrijwilligers 8+ shifts (48 uur in één weekend), resulterend in burn-out en no-shows op latere shifts. Wat: Per event/festival instelbaar minimum en maximum aantal shifts dat een vrijwilliger kan claimen. Details:

  • events.min_shifts_per_volunteer (int nullable)
  • events.max_shifts_per_volunteer (int nullable)
  • ShiftAssignmentService checkt limiet bij claim/assign
  • Portal toont voortgang: "Je hebt 2 van minimaal 4 shifts geclaimd"
  • Bij bereiken maximum: verdere claims geblokkeerd met melding Prioriteit: Laag — Nice-to-have. Geen prioriteit op dit moment. Afhankelijk van: Shift claiming flow

ARCH-03 — Sectie templates / kopiëren van vorig event

Aanleiding: Organisatoren die elk jaar dezelfde secties en shifts opzetten. Wat: "Kopieer secties van vorig festival" functie in de UI. Kopieert festival_sections + shifts structuur (zonder toewijzingen). Details:

  • UI: dropdown "Kopieer structuur van..." bij aanmaken festival
  • Optie: kopieer alleen secties / secties + shifts / alles
  • Tijden worden proportioneel aangepast aan nieuwe datums Prioriteit: Hoog — bespaart veel handmatig werk bij terugkerende festivals

ARCH-04 — Cross-festival conflictdetectie

Aanleiding: Vrijwilliger die bij twee festivals van dezelfde organisatie op dezelfde dag ingepland staat. Wat: Waarschuwing (geen blokkade) als iemand al actief is op een ander festival van dezelfde organisatie op dezelfde datum. Details:

  • Soft check — waarschuwing tonen, niet blokkeren
  • Relevant bij organisaties met meerdere festivals tegelijk
  • Query: shift_assignments cross-festival op person_id + datum

ARCH-05 — Shift fairness / prioriteitswachtrij

Aanleiding: Populaire shifts worden direct volgeboekt door snelle vrijwilligers. Wat: Optionele wachtrij-modus waarbij het systeem eerlijk verdeelt op basis van: reliability score, aantal uren al ingepland, aanmeldvolgorde. Details:

  • shifts.assignment_mode (enum: first_come | fair_queue | manual)
  • Fair queue: systeem wijst toe op basis van algoritme
  • Organisator keurt resultaat goed voor publicatie Prioriteit: Middel — nice-to-have voor grote festivals

ARCH-06 — Locatie-gebaseerd shift-overzicht

Cross sub-event filter op location_id. Toont alle shifts op een fysieke locatie ongeacht programmaonderdeel. Schema: locations tabel en shifts.location_id bestaan al. Prioriteit: Laag


ARCH-07 — Accreditatie-templates per sectie/dag combinatie

MUST-HAVE bij accreditatie build. Templates worden primaire toewijzingsmethode. Per crowd_type + sectie + dag → automatisch voorgestelde accreditatie-items. Handmatige per-persoon toewijzing is de uitzondering, niet de norm. Schema: Nieuwe tabel accreditation_templates nodig. Prioriteit: Hoog — direct meebouwen bij accreditatie-module


Fase 3 — Communicatie & Notificaties

COMM-01 — Real-time WebSocket notificaties

Aanleiding: Differentiator — geen van de concurrenten heeft dit. Wat: Push notificaties via Laravel Echo + Soketi voor:

  • Nieuwe vrijwilliger aanmelding
  • Shift geclaimd
  • Uitnodiging geaccepteerd
  • Shift niet gevuld (waarschuwing)
  • No-show alert op show-dag Tech: Laravel Echo + Soketi (zelf-gehoste WebSocket server) Frontend: Notificatie bell in topbar activeren

COMM-02 — Topbar volledig activeren

Aanleiding: Vuexy topbar staat er maar is niet aangesloten op Crewli. Wat:

  • Zoekbalk (CTRL+K) aansluiten op Crewli-entiteiten (personen, events, secties zoeken)
  • Notificatie bell koppelen aan COMM-01
  • App switcher: Organizer / Portal wisselen (admin SPA retired; platform admin in /platform/*)
  • User avatar: gekoppeld aan ingelogde gebruiker (deels al gedaan) Prioriteit: Middel — werkt zonder maar verbetert UX significant

COMM-03 — Globale zoekfunctie (cmd+K)

Aanleiding: Differentiator — cross-entiteit zoeken. Wat: Modal zoekbalk die zoekt over: personen, events, artiesten, secties, shifts Tech: Meilisearch of database full-text search Prioriteit: Laag — Fase 4


COMM-04 — SMS + WhatsApp campagnes via Zender

Aanleiding: WeezCrew heeft dit als sterk punt. Wat: Bulk communicatie via Zender (zelf-gehoste SMS/WhatsApp gateway)

  • Normal urgency → email
  • Urgent → WhatsApp
  • Emergency → SMS + WhatsApp parallel Tech: ZenderService (al gedocumenteerd in dev guide) Afhankelijk van: Communicatie module backend

Fase 3 — Show Day & Operationeel

OPS-01 — Mission Control

Aanleiding: In2Event's sterkste feature. Wat: Real-time operationele hub op show-dag:

  • Live check-in overzicht per sectie
  • Artiest handling (aankomst, soundcheck, performance status)
  • No-show alerts met automatische opvolging
  • Inventaris uitgifte (portofoons, hesjes) Prioriteit: Hoog voor show-dag gebruik

OPS-02 — No-show automatisering

Aanleiding: 30-minuten alert voor niet-ingecheckte vrijwilligers. Wat: Automatische WhatsApp/SMS via Zender als vrijwilliger niet is ingecheckt 30 min na shift-starttijd. Schema: show_day_absence_alerts al aanwezig Afhankelijk van: COMM-04 (Zender), OPS-01 (Mission Control)


OPS-03 — Allocatiesheet PDF generator

Aanleiding: WeezCrew heeft branded PDF per crew. Wat: Gepersonaliseerde PDF per vrijwilliger/crew: taakbeschrijving, tijden, locatie, QR-code voor check-in. Tech: DomPDF (al geïnstalleerd) Prioriteit: Middel


OPS-04 — Scanner infrastructuur

Aanleiding: QR check-in op locatie. Wat: Scanstations configureren, koppelen aan hardware. scanners tabel al aanwezig in schema Prioriteit: Laag — Fase 4


Fase 3 — Vrijwilligers & Portal

VOL-01 — apps/portal/ vrijwilliger self-service

Aanleiding: Vrijwilligers moeten zichzelf kunnen aanmelden en shifts claimen zonder toegang tot de Organizer app. Wat:

  • Publiek registratieformulier (multi-step)
  • Login portal voor vrijwilligers
  • Beschikbaarheid opgeven (time slots kiezen)
  • My Shifts overzicht
  • Shift claimen met conflictdetectie
  • "Ik kan toch niet komen" workflow Afhankelijk van: Sections + Shifts backend (al klaar )

VOL-02 — Vrijwilliger paspoort + reliability score

Aanleiding: Platform-breed profiel dat accumuleert over jaren. Wat:

  • Festival-paspoort: visuele tijdlijn van deelgenomen festivals
  • Reliability score (0.0-5.0): berekend via scheduled job
  • Coordinator-beoordeling per festival (intern, nooit zichtbaar)
  • "Would reinvite" indicator bij heruitnodiging Schema: volunteer_profiles, volunteer_festival_history al aanwezig

VOL-03 — Post-festival evaluatie + retrospectief

Aanleiding: Automatische feedback na het festival. Wat:

  • 24u na laatste shift: evaluatiemail naar vrijwilligers
  • Max 5 vragen (beleving, shift kwaliteit, terugkomen?)
  • Gegenereerd retrospectief rapport per festival
  • Coordinator-beoordeling parallel (intern) Schema: post_festival_evaluations, festival_retrospectives al aanwezig

VOL-04 — Shift swap workflow (portal)

Aanleiding: Vrijwilliger wil shift ruilen met collega. Wat:

  • Open swap: iedereen mag reageren
  • Persoonlijke swap: specifieke collega vragen
  • Na akkoord beide: coordinator bevestigt (of auto-approve)
  • Wachtlijst: bij uitval automatisch aanschrijven Schema: shift_swap_requests, shift_absences, shift_waitlist al aanwezig

Fase 3 — Artiesten & Advancing

ART-01 — Artist advancing portal (apps/portal/)

Aanleiding: Crescat's sterkste feature. Wat:

  • Sectie-gebaseerd advance portal via gesignde URL
  • Per sectie onafhankelijk submitbaar (Guest List, Contacts, Production)
  • Milestone pipeline: Offer In → Advance Received
  • Per-artiest zichtbaarheidscontrole van advance secties
  • Submission diff tracking (created/updated/untouched/deleted) Schema: advance_sections, advance_submissions al aanwezig

ART-02 — Timetable (stage + drag-drop)

Aanleiding: FullCalendar timeline view voor podia-planning. Wat:

  • Timeline view per podium
  • Drag-and-drop performances
  • B2B detectie (twee artiesten op zelfde podium zelfde tijd) Tech: FullCalendar (al in stack )

Fase 3 — Formulieren & Leveranciers

FORM-01 — Formulierbouwer

Aanleiding: WeezCrew heeft een krachtige drag-sorteerbare builder. Wat:

  • Drag-sorteerbaar, conditionele logica
  • Live preview
  • Iframe embed voor externe websites
  • Configureerbare velden per crowd type Schema: public_forms al aanwezig

FORM-02 — TAG_PICKER → user_organisation_tags sync rebuild Done in S2b (2026-04-17)

Aanleiding: TagSyncService verwijderd in S2a Form Builder legacy purge. Semantiek (TAG_PICKER-antwoorden syncen naar user_organisation_tags bij registratie-goedkeuring) blijft valide. Wat: Herbouwen als listener op FormSubmissionSubmitted tegen de nieuwe FormValue + TAG_PICKER field_type. Integreren via PersonIdentityService::confirmMatch zonder directe service-injection in PersonController. Eerdere call-sites (nu verwijderd): PersonController::approve(), PersonIdentityService::syncRegistrationTags(). Landed artefacts:

  • App\Services\FormBuilder\FormTagSyncService::rebuildForPerson — idempotent union-of-TAG_PICKER-values rebuild, only mutates source=self_reported rows, no-op when person.user_id IS NULL.
  • App\Listeners\FormBuilder\SyncTagPickerSelectionsOnSubmit — ShouldQueue listener on FormSubmissionSubmitted, filters to event_registration purpose with subject_type=person + at least one TAG_PICKER value. Logs + swallows errors so sibling listeners (§31.1/§31.3/§31.8) keep running.
  • App\Services\PersonIdentityService::confirmMatch — calls FormTagSyncService::rebuildForPerson after setting person.user_id (deferred-sync path for person who submitted before the user account existed).
  • Contract frozen in ARCH-FORM-BUILDER.md §31.10 (authoritative block) and covered by tests/Feature/FormBuilder/Integration/TagPickerSyncListenerTest.

Deferred integration tests (move under FORM-03 if needed): GdprDeleteCascadeTest, EmailNotificationFlowTest, CodeOfConductGatingTest, SupplierIntakeFlowTest, CrowdListAutoAddTest (§31.9). Only §31.10 ships with S2b; other contracts wait until their feature arrives.


FORM-04 — grace_days configurable on public_token rotation

Aanleiding: S2c §10.4 opgeleverd met een hardgecodeerd 7-daagse grace window in PublicFormTokenResolver. rotatePublicToken endpoint accepteert wel een grace_days request param maar schrijft die nergens naartoe; form_schemas heeft geen grace_days kolom. Wat:

  • Kolom form_schemas.public_token_grace_days (unsignedSmallInteger nullable, default null).
  • rotatePublicToken service persisteert de ontvangen grace_days value (fallback: config default).
  • PublicFormTokenResolver::GRACE_DAYS leest uit form_schemas.public_token_grace_days ?? config('form_builder.public_token.default_grace_days', 7).
  • Test: rotatie met grace_days=3 levert 410 na 4 dagen. Prioriteit: Laag — operationele tuning, niet frontend-blocking.

DOC-01 — Scramble / OpenAPI generator voor API.md

Aanleiding: dev-docs/API.md wordt met de hand bijgehouden per sprint — bij snelle iteratie landt hij altijd een slag achter de code. Scramble (of equivalent) genereert OpenAPI uit FormRequest + Resource introspectie zonder annotaties. Wat: Scramble installeren, publieke form endpoints een dedicated public tag geven, CI-hook die de generated spec vergelijkt met een checked-in dev-docs/api.openapi.yaml, README link naar de live viewer. Prioriteit: Middel — verlaagt docs-drift substantieel; past in een "developer-experience" sprint.


DOC-02 — VitePress docs:build faalt op missing image

Aanleiding: /docs/volunteer/je-aanmelden-via-een-link.md verwijst naar ./images/placeholder.png dat niet bestaat. Dev mode werkt, build faalt. Blokkeert CI als die docs:build gaat draaien. Wat: Placeholder afbeelding toevoegen OF de referentie weghalen / vervangen door een echte screenshot van het registratieflow. Prioriteit: Laag — cosmetisch, niet blokkerend voor dev.


DOC-03 — Formulieren sidebar story is incompleet

Aanleiding: Tijdens S3a PR 2 is docs/organizer/forms/concepts/wat-is-een-formulier.md gewired in de sidebar, samen met de nieuwe veldtype-pagina's. Maar de bredere Formulieren-sidebar mist nog: publicatieflow, inzendingen-overzicht, templates, webhook-configuratie, conditionele logica. Wat: Dedicated docs-sprint voor de Formulieren-module in VitePress. Schat: 6-8 pagina's in Nederlands, aimed at organisatoren die formulieren configureren. Prioriteit: Middel — landt best vlak voor/na S3b (organizer form-builder UI), omdat screenshots pas zin hebben als de UI staat.


FORM-05 — Smart identity-match on public submission values

Stub-status (S3a PR 2, 2026-04-23): Public event_registration submissions landen al met identity_match_status='pending' via de bestaande TriggerPersonIdentityMatchOnFormSubmit listener. De portal IdentityMatchBanner leest dit veld en toont de juiste copy. Contract ligt vast in tests/Feature/FormBuilder/Listeners/TriggerPersonIdentityMatchOnFormSubmitTest.

Resterend werk (de eigenlijke FORM-05): public form submissions (subject_type=null) krijgen momenteel altijd 'pending' omdat er nog geen Person bestaat om tegen te matchen. Breid uit met:

  • Nieuwe methode op PersonIdentityService: detectMatchesByValues(array $values, string $organisationId): MatchResult
  • Een extra tak in TriggerPersonIdentityMatchOnFormSubmit::resolveStatus die voor public submissions de values uit FormSubmission->values extraheert (email / first_name / last_name via de schema binding), deze methode aanroept, en 'matched' / 'pending' / 'none' schrijft.

Zo krijgt de portal-UX een betekenisvol signaal in plaats van een constante 'pending'.

Prioriteit: Medium. Kan gebundeld worden met de organizer person_identity_matches UI (ook nog een frontend gap).


FORM-09 — TriggerPersonIdentityMatchOnFormSubmit ShouldQueue herzien

Aanleiding: De bestaande listener implements ShouldQueue. Gevolg: bij een public event_registration submission is identity_match_status nog null op het moment dat de submit-HTTP- response terugkeert. De confirmation page rendert daardoor zonder banner bij first load — pas na een refresh (of queue-worker tick) is de pending staat zichtbaar. Tijdens S3a PR 2 is dit genoteerd als "dev ergonomics" (draai queue:work erbij), maar dat is een workaround, geen fix. Wat: Verwijder implements ShouldQueue uit TriggerPersonIdentityMatchOnFormSubmit. De listener wordt orchestrator: schrijft identity_match_status synchroon in de request-lifecycle zodat de submit-response direct klopt. Wanneer FORM-05 proper landt met zwaardere matching-logica (PersonIdentityService::detectMatchesByValues met fuzzy name matching over de hele org), wordt dat zware werk gedispatched als aparte ResolveIdentityMatchJob vanuit deze listener. Eager state transition blijft sync, heavy resolution blijft async.

Zie ook: architectuur-discussie in de S3a planning-sessie ("eager state + lazy resolution" patroon).

Prioriteit: Middel — niet user-facing blocking vandaag (draait met queue:work gewoon), maar architecturaal is de refactor juist nu klein (1 regel weghalen + test-aanpassing). Wordt groter als FORM-05 landt zonder deze refactor.

Impact: ~5 regels code, 1-2 test-aanpassingen. Eén commit, aparte PR.


SUP-01 — Leveranciersportal + productieverzoeken

Aanleiding: Leveranciers moeten productie-informatie kunnen indienen. Wat:

  • Token-gebaseerde portal toegang (geen account nodig)
  • Productieverzoek indienen (mensen, tech, stroom, voertuigen)
  • Crowd list indienen voor hun crew Schema: production_requests, material_requests al aanwezig

Fase 4 — Differentiators

DIFF-01 — Cross-event crew pool + reliability score

Aanleiding: Vrijwilligers hergebruiken over events van dezelfde organisatie. Wat: Eén klik heruitnodiging op basis van vorig jaar. Reliability score zichtbaar naast naam in de lijst.


DIFF-02 — Crew PWA (mobiel)

Aanleiding: On-site zelfservice voor crew op hun telefoon. Wat: Progressive Web App voor: shifts bekijken, briefing lezen, clock-in, push notificaties.


DIFF-03 — Publieke REST API + webhooks

Aanleiding: Enterprise integraties. Wat: Gedocumenteerde publieke API + webhook systeem voor third-party integraties (ticketing, HR, etc.)


DIFF-04 — CO2 / Duurzaamheidsrapportage

Aanleiding: Toenemende focus op duurzame events. Wat: Emissieberekeningen op basis van transport en energieverbruik. Status: Expliciet out of scope voor v1.x


Apps & Platforms

APPS-01 — apps/admin/ volledig bouwen RETIRED

Status: Retired — admin SPA (apps/admin/) is afgeschaft. Super admin functionaliteit is verplaatst naar apps/app/ onder /platform/* routes voor super_admin gebruikers.


APPS-02 — OrganisationSwitcher ingeklapte staat fix

Aanleiding: Flikkering/hover-bug bij ingeklapte sidebar. Wat: Correcte weergave en animatie in ingeklapte staat. Prioriteit: Low — cosmetisch, werkt functioneel wel


Technische schuld

TECH-01 — Bestaande tests bijwerken na festival/event refactor

Aanleiding: Na toevoegen parent_event_id worden bestaande tests mogelijk fragiel door gewijzigde factory-setup. Wat: Alle Feature tests reviewen en bijwerken waar nodig.


TECH-05 — ESLint configuratie herstellen in apps/app/

Aanleiding: npm run lint faalt omdat .eslintrc.cjs niet bestaat en er ook geen flat-config equivalent aanwezig is. Effectief draait de app zonder lint, wat botst met CLAUDE.md's zero-compromise regels. Wat: Juiste flat-config installeren en afstemmen op het huidige Vuexy 9.5 template. Moet in één keer groen draaien. Prioriteit: Middel — tooling-gap.


TECH-06 — ESLint config ontbreekt in apps/portal

Aanleiding: npm run lint faalt in apps/portal/ omdat .eslintrc.cjs niet bestaat. Geen flat-config equivalent aanwezig. Portal draait dus effectief zonder lint, wat botst met CLAUDE.md's zero-compromise regels. Apart van TECH-05 (dat over apps/app gaat). Wat: Flat-config ESLint installeren in apps/portal/, afgestemd op Vue 3 + TypeScript + Vuexy 10.11.1. In één keer groen laten draaien. Bij voorkeur gedeelde shared-config tussen apps/app en apps/portal om drift te voorkomen. Prioriteit: Middel — tooling-gap, niet user-facing.


TECH-02 — scopeForFestival helper op Event model OPGELOST


TECH-03 — DevSeeder uitbreiden met festival-structuur OPGELOST


TECH-04 — EventController.store() redundante ternary OPGELOST


Opgeloste items (april 2026)

De volgende items zijn geïmplementeerd en afgerond (673+ tests):

  • TECH-02: scopeForFestival + scopeWithChildren helper scopes op Event model
  • TECH-03: DevSeeder uitgebreid met festival-structuur (secties, tijdsloten, personen)
  • TECH-04: EventController.store() redundante ternary
  • Auth race condition (CTRL+R fix)
  • Section edit dialog bug
  • Time slot duplicate button
  • Browser autocomplete disabled op dialog form fields
  • Category + icon fields op festival_sections
  • IconPicker component
  • Crowd Types beheer-UI
  • Companies CRUD
  • Person tags backend (person_tags + user_organisation_tags)
  • Event status state machine (dedicated transition endpoint, prerequisites, festival cascade)
  • Event status transition buttons (frontend + backend, state machine, cascade)
  • Festival tab-navigatie (uniform tabs, Programmaonderdelen tab)
  • SectionsShiftsPanel extractie als herbruikbaar component
  • Cross-event section auto-redirect
  • Shift claiming in portal (5 endpoints, 26 tests, ClaimenTab + RoosterTab)
  • Cross-app auth isolation (CookieBearerToken per app, 3 isolatietests)
  • Password reset (beide SPAs, custom notification, app-aware links)
  • Email change with verification (self-service + admin, 24h token expiry)
  • Password change while logged in
  • "Lid toevoegen als deelnemer" shortcut (2 endpoints, 11 tests)
  • Person Identity Matching (detect→suggest→confirm, fuzzy name, DOB tiebreaker)
  • Naam-splitsing first_name + last_name (66 files)
  • Date of birth op persons en users
  • Smart assign dialog (tags, preferences, availability, cascading filters)
  • Soft capacity + approve overbook fix
  • Cancellation source tracking + re-assignment
  • VitePress user documentation (3 core pages)
  • Registration settings (show_in_registration)
  • Premium portal wizard (banner, branding, success page)
  • Global error handling (useNotificationStore + axios 422 interceptor)
  • S3a PR 2: TAG_PICKER / AVAILABILITY_PICKER / SECTION_PRIORITY renderen in het publieke registratieformulier. Seeder uitgebreid met twee showcase-velden + parent-level VOLUNTEER time slot + duplicate section name voor dedup-dekking. SECTION_PRIORITY waarde-shape gevalideerd in FormValueService. FormSubmissionResource krijgt admin-facing identity_match block. 64 nieuwe assertions over backend + Vitest.

Bekende gaps — nog te bouwen

Overzicht van bekende ontbrekende onderdelen die nog niet gebouwd zijn:

Item Status Prioriteit
Person Tags frontend UI Backend compleet, geen organiser UI Hoog
Accreditatie Engine (SCHEMA 3.5.6, ARCH-07 templates) Volgende grote module Hoog
ARCH-03 — Sectie templates / kopiëren van vorig event Niet gestart Hoog
Briefings & Communicatie basis Niet gestart Middel
Artist Advancing portal Niet gestart Middel
UX-01 — Festival setup checklist Niet gestart Middel
UX-03 — Personen per sub-event Niet gestart Middel
ARCH-06 — Locatie-gebaseerd shift-overzicht Niet gestart Laag

Nieuwe backlog items

ARCH-06 — Locatie-gebaseerd shift-overzicht

Cross sub-event filter op location_id. Toont alle shifts op een fysieke locatie ongeacht programmaonderdeel. Prioriteit: Laag


ARCH-07 — Accreditatie-templates per sectie/dag combinatie

MUST-HAVE bij accreditatie build. Templates worden primaire toewijzingsmethode. Per crowd_type + sectie + dag → automatisch voorgestelde accreditatie-items. Prioriteit: Hoog — direct meebouwen bij accreditatie-module


ARCH-08 — Recurrence voor time slots

Herhalingsfunctie: "genereer 5 time slots in één keer" voor opbouwdagen etc. Prioriteit: Middel


ART-03 — Artist profile met cross-event rider defaults

Organisatie-niveau artiest-profiel dat rider-defaults, contacten en interne notities opslaat over events heen. "Importeer van vorig jaar" functie. Prioriteit: Laag


UX-01 — Festival setup checklist / onboarding wizard

Checklist widget op festival dashboard die door de configuratiestappen leidt. Items worden groen als ze zijn afgerond. Prioriteit: Middel


UX-02 — Aandachtsmatrix op event dashboard

Aanleiding: Organisator verliest overzicht bij 200+ vrijwilligers en 30 secties. Kritieke problemen (onderbezette shifts, wachtende goedkeuringen, onopgeloste identity matches) worden pas ontdekt als het te laat is. Wat: Drie metric cards op het event Overzicht-tab:

  • Goedgekeurde personen zonder shift-toewijzing (telling)
  • Wachtende shift-claims (telling)
  • Onopgeloste identiteitsmatches (telling) Elke card is klikbaar en navigeert naar de relevante module. Prioriteit: Hoog — eerste frontend-taak op Overzicht-tab. Data is beschikbaar via bestaande endpoints (aggregate queries).

UX-03 — Personen-tab op sub-event niveau

Gefilterde view: alleen personen met shifts in dit programmaonderdeel. Met link "Bekijk alle personen op festival-niveau". Prioriteit: Middel


COMM-05 — Resend invitation endpoint

Aanleiding: Uitnodigingen kunnen nu alleen ingetrokken worden of verlopen vanzelf. Organisatoren willen een "opnieuw versturen" actie voor gevallen waarin de oorspronkelijke mail in de spamfilter belandde, gemist werd, of het e-mailadres net gecorrigeerd is. Wat:

  • Backend: POST /api/v1/organisations/{org}/invitations/{id}/resend (idempotent: regenereert de mail zonder token of verloopdatum te wijzigen). Zelfde endpoint voor /admin scope.
  • Frontend: "Opnieuw versturen" actie activeren in de sectie openstaande uitnodigingen op /members (useMembers heeft al een useResendInvitation stub-ready). Prioriteit: Middel — user-requested UX-verbetering.

UX-04 — Leveranciers-deadline waarschuwing

Aanleiding: Leveranciers die hun personeelslijst niet tijdig indienen veroorzaken last-minute chaos. De organisator heeft geen zicht op welke externe lijsten nog niet compleet zijn. Wat: Op het event dashboard en in de publiekslijsten-tab:

  • Badge "Nog niet compleet" op externe lijsten waar persons_count < max_persons
  • Optioneel: deadline-datum veld op crowd_lists (nieuw kolom)
  • Waarschuwingsbanner X dagen voor de deadline: "3 leveranciers hebben hun lijst nog niet compleet ingediend" Prioriteit: Middel — meebouwen bij leveranciersportaal (SUP-01)

Laatste update: April 2026 Voeg nieuwe items toe met prefix: ARCH-, COMM-, OPS-, VOL-, ART-, FORM-, SUP-, DIFF-, APPS-, TECH-, UX-