docs: design-document v1.8, dev-docs restructure, VitePress user docs scaffold, backlog update

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-10 11:16:43 +02:00
parent 03ca1a50a7
commit 83437378c8
53 changed files with 3924 additions and 114 deletions

View File

@@ -0,0 +1,26 @@
---
title: [Concept naam]
description: [Eén zin uitleg van het concept]
tags: []
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
## In het kort
[2-3 zinnen die het concept uitleggen alsof je het aan iemand zonder technische kennis vertelt.]
## Hoe past dit in Crewli?
[Beschrijf de context: waar kom je dit concept tegen, en waarom is het belangrijk?]
## Voorbeeld
[Concreet voorbeeld uit de praktijk van festivalbeheer.]
## Gerelateerde concepten
- [Concept A](/guide/concepts#...)
- [Concept B](/guide/concepts#...)

View File

@@ -0,0 +1,41 @@
---
title: [Feature naam]
description: [Eén zin die beschrijft wat de feature doet]
tags: []
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
## Wat is dit?
[Korte uitleg in 2-3 zinnen: wat doet deze feature en waarom is het nuttig?]
## Hoe werkt het?
### Stap 1 — [Actie]
[Beschrijving met eventueel een screenshot placeholder: `![Beschrijving](./images/placeholder.png)`]
### Stap 2 — [Actie]
[Beschrijving]
## Rollen en toegang
| Rol | Toegang |
|-----|---------|
| Organisatie Admin | Volledige toegang |
| Event Manager | [Specificeer] |
| Vrijwilliger | [Specificeer] |
## Veelgestelde vragen
### [Vraag 1]?
[Antwoord]
## Gerelateerde pagina's
- [Gerelateerde feature](/organizer/...)

View File

@@ -0,0 +1,65 @@
# Crewli Documentatie Stijlgids
## Doelgroep
Crewli-documentatie is geschreven voor mensen die evenementen en festivals organiseren.
Zij zijn praktisch ingesteld, hebben weinig tijd, en willen snel weten hoe iets werkt.
Ga NIET uit van technische kennis.
## Toon en stijl
- Schrijf in het **Nederlands** (informeel "je/jij", niet "u")
- Wees **direct en bondig** — geen inleidingen van drie alinea's
- Gebruik **actieve zinnen**: "Klik op Opslaan" in plaats van "Er kan op Opslaan geklikt worden"
- Vermijd jargon — als een term nodig is, leg hem uit of link naar de woordenlijst
## Vaste terminologie
Gebruik ALTIJD deze termen — geen synoniemen:
| Term in Crewli | NIET gebruiken |
|----------------|----------------|
| Evenement | Event (in user-facing docs) |
| Sectie | Afdeling, area, zone (tenzij Access Zone) |
| Dienst | Shift (in user-facing docs) |
| Tijdslot | Tijdblok, slot |
| Vrijwilliger | Volunteer (in user-facing docs) |
| Persoon | Deelnemer, gast (tenzij specifieke crowd type) |
| Crowd type | Bezoekerstype, categorie |
| Crowd lijst | Gastenlijst (alleen als het crowd type 'guest' is) |
| Accreditatie | Badge, pas |
| Access zone | Toegangszone |
| Advancing | Rider, tech spec |
| Briefing | Instructie, info |
| Festival serie | Festival reeks, parent event |
## Paginastructuur
1. **Titel** — wat het IS (niet wat het doet)
2. **Eerste alinea** — wat en waarom, max 3 zinnen
3. **Hoe werkt het** — stappen met screenshots
4. **Rollen en toegang** — wie mag wat
5. **FAQ** — alleen als er echte vragen zijn, geen opvulling
6. **Gerelateerde pagina's** — links naar verwante features
## Screenshots
- Gebruik placeholders tijdens ontwikkeling: `![Alt tekst](./images/placeholder.png)`
- Naamgeving: `feature-naam-stap-nummer.png` (bijv. `event-aanmaken-stap-2.png`)
- Bewaar in een `images/` map binnen de betreffende sectie
- Geen persoonlijke data zichtbaar in screenshots
## Frontmatter
Elke pagina MOET deze frontmatter hebben:
```yaml
---
title: Paginatitel
description: Eén zin beschrijving
tags: [relevante, tags, voor, zoeken]
---
```
Tags gebruiken de Crewli-terminologie (zie tabel hierboven).
Gebruik minimaal 2 tags, maximaal 6.

162
docs/.vitepress/config.ts Normal file
View File

@@ -0,0 +1,162 @@
import { defineConfig } from "vitepress";
export default defineConfig({
title: "Crewli Docs",
description: "Documentatie voor het Crewli event management platform",
lang: "nl-NL",
head: [["link", { rel: "icon", href: "/favicon.ico" }]],
themeConfig: {
logo: "/logo.svg",
nav: [
{ text: "Handleiding", link: "/guide/getting-started" },
{ text: "Organisator", link: "/organizer/" },
{ text: "Vrijwilliger", link: "/volunteer/" },
{ text: "Portal", link: "/portal/" },
],
sidebar: {
"/guide/": [
{
text: "Aan de slag",
items: [
{ text: "Introductie", link: "/guide/getting-started" },
{ text: "Kernconcepten", link: "/guide/concepts" },
{ text: "Woordenlijst", link: "/guide/glossary" },
],
},
],
"/organizer/": [
{
text: "Organisatie",
items: [
{ text: "Overzicht", link: "/organizer/" },
{
text: "Organisatie inrichten",
link: "/organizer/organisation-setup",
},
{ text: "Teamleden beheren", link: "/organizer/team-members" },
],
},
{
text: "Evenementen",
items: [
{ text: "Event aanmaken", link: "/organizer/events/create-event" },
{
text: "Festival series",
link: "/organizer/events/festival-series",
},
{
text: "Event statussen",
link: "/organizer/events/event-statuses",
},
],
},
{
text: "Secties & Diensten",
items: [
{ text: "Secties beheren", link: "/organizer/shifts/sections" },
{ text: "Tijdslots", link: "/organizer/shifts/time-slots" },
{ text: "Diensten plannen", link: "/organizer/shifts/planning" },
{ text: "Toewijzingen", link: "/organizer/shifts/assignments" },
],
},
{
text: "Personen & Crowd",
items: [
{ text: "Personen beheren", link: "/organizer/persons/manage" },
{ text: "Crowd types", link: "/organizer/persons/crowd-types" },
{ text: "Crowd lijsten", link: "/organizer/persons/crowd-lists" },
{ text: "Tags", link: "/organizer/persons/tags" },
],
},
{
text: "Accreditatie",
items: [
{
text: "Accreditatie overzicht",
link: "/organizer/accreditation/overview",
},
{
text: "Access zones",
link: "/organizer/accreditation/access-zones",
},
{ text: "Templates", link: "/organizer/accreditation/templates" },
],
},
{
text: "Artiesten",
items: [
{ text: "Artiesten beheren", link: "/organizer/artists/manage" },
{
text: "Advancing workflow",
link: "/organizer/artists/advancing",
},
{ text: "Programma", link: "/organizer/artists/programme" },
],
},
{
text: "Communicatie",
items: [
{ text: "Briefings", link: "/organizer/communication/briefings" },
{ text: "Berichten", link: "/organizer/communication/messages" },
],
},
],
"/volunteer/": [
{
text: "Vrijwilliger",
items: [
{ text: "Overzicht", link: "/volunteer/" },
{ text: "Registreren", link: "/volunteer/registration" },
{ text: "Diensten kiezen", link: "/volunteer/shift-signup" },
{ text: "Mijn paspoort", link: "/volunteer/passport" },
{ text: "Check-in", link: "/volunteer/check-in" },
],
},
],
"/portal/": [
{
text: "Artiestenportaal",
items: [
{ text: "Overzicht", link: "/portal/" },
{ text: "Advancing invullen", link: "/portal/artist-advancing" },
],
},
{
text: "Leveranciersportaal",
items: [{ text: "Toegang", link: "/portal/supplier-access" }],
},
{
text: "Persportaal",
items: [
{
text: "Accreditatie aanvragen",
link: "/portal/press-accreditation",
},
],
},
],
},
search: {
provider: "local",
},
socialLinks: [
// { icon: 'github', link: 'https://github.com/...' },
],
footer: {
message: "Crewli — Event Management Platform",
},
editLink: {
pattern:
"https://gitea.hausmans.cloud/bert.hausmans/crewli/_edit/main/docs/:path",
text: "Bewerk deze pagina",
},
},
});

View File

@@ -1,92 +0,0 @@
# Crewli API Contract
Base path: `/api/v1/`
Auth: Bearer token (Sanctum)
## Auth
- `POST /auth/login`
- `POST /auth/logout`
- `GET /auth/me`
## Organisations
- `GET /organisations` — list (super admin)
- `POST /organisations` — create
- `GET /organisations/{org}` — show
- `PUT /organisations/{org}` — update
- `GET /organisations/{org}/members` — members
- `POST /organisations/{org}/invite` — invite user
## Events
- `GET /organisations/{org}/events`
- `POST /organisations/{org}/events`
- `GET /organisations/{org}/events/{event}`
- `PUT /organisations/{org}/events/{event}`
## Crowd Types
- `GET /organisations/{org}/crowd-types`
- `POST /organisations/{org}/crowd-types`
- `PUT /organisations/{org}/crowd-types/{type}`
- `DELETE /organisations/{org}/crowd-types/{type}`
## Companies
- `GET /organisations/{org}/companies`
- `POST /organisations/{org}/companies`
- `PUT /organisations/{org}/companies/{company}`
- `DELETE /organisations/{org}/companies/{company}`
## Festival Sections
- `GET /events/{event}/sections`
- `POST /events/{event}/sections`
- `PUT /events/{event}/sections/{section}`
- `DELETE /events/{event}/sections/{section}`
- `POST /events/{event}/sections/reorder`
## Time Slots
- `GET /events/{event}/time-slots`
- `POST /events/{event}/time-slots`
- `PUT /events/{event}/time-slots/{timeSlot}`
- `DELETE /events/{event}/time-slots/{timeSlot}`
## Shifts
- `GET /events/{event}/sections/{section}/shifts`
- `POST /events/{event}/sections/{section}/shifts`
- `PUT /events/{event}/sections/{section}/shifts/{shift}`
- `DELETE /events/{event}/sections/{section}/shifts/{shift}`
- `POST /events/{event}/sections/{section}/shifts/{shift}/assign`
- `POST /events/{event}/sections/{section}/shifts/{shift}/claim`
## Persons
- `GET /events/{event}/persons`
- `POST /events/{event}/persons`
- `GET /events/{event}/persons/{person}`
- `PUT /events/{event}/persons/{person}`
- `POST /events/{event}/persons/{person}/approve`
- `DELETE /events/{event}/persons/{person}`
## Crowd Lists
- `GET /events/{event}/crowd-lists`
- `POST /events/{event}/crowd-lists`
- `PUT /events/{event}/crowd-lists/{list}`
- `DELETE /events/{event}/crowd-lists/{list}`
- `POST /events/{event}/crowd-lists/{list}/persons`
- `DELETE /events/{event}/crowd-lists/{list}/persons/{person}`
## Locations
- `GET /events/{event}/locations`
- `POST /events/{event}/locations`
- `PUT /events/{event}/locations/{location}`
- `DELETE /events/{event}/locations/{location}`
_(Extend this contract per module as endpoints are implemented.)_

View File

@@ -1,384 +0,0 @@
# 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 per serie
**Aanleiding:** Schaatsbaan — eerlijke verdeling, minimum commitment.
**Wat:** Per festival/serie instelbaar minimum en maximum aantal shifts
dat een vrijwilliger kan claimen.
**Details:**
- `festivals.min_shifts_per_volunteer` (int nullable)
- `festivals.max_shifts_per_volunteer` (int nullable)
- Portal toont voortgang: "Jij hebt 2 van minimaal 4 shifts geclaimd"
- Bij bereiken maximum: verdere claims geblokkeerd
**Afhankelijk van:** ARCH-01 (recurrence), Portal self-service
---
### 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
---
## 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 / Admin / Portal wisselen
- 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 ✅
---
### 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
**Aanleiding:** Super Admin panel voor platform-beheer.
**Wat:**
- Alle organisaties beheren
- Billing status wijzigen
- Platform-gebruikers beheren
- Usage statistieken
---
### 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-02 — scopeForFestival helper op Event model
**Aanleiding:** Queries die door parent/child heen moeten werken.
**Wat:** `Event::scopeWithChildren()` en `Event::scopeForFestival()`
helper scopes zodat queries automatisch parent + children bevatten.
---
### TECH-03 — DevSeeder uitbreiden met festival-structuur
**Aanleiding:** Na festival/event refactor heeft de DevSeeder
realistische testdata nodig met parent/child events.
**Wat:** DevSeeder aanpassen met:
- Test festival (parent)
- 2-3 sub-events (children)
- Personen op festival-niveau
---
_Laatste update: April 2026_
_Voeg nieuwe items toe met prefix: ARCH-, COMM-, OPS-, VOL-, ART-, FORM-, SUP-, DIFF-, APPS-, TECH-_

File diff suppressed because it is too large Load Diff

View File

@@ -1,286 +0,0 @@
# Crewli - Setup Guide
This guide walks you through setting up the Crewli project from scratch.
## Cursor AI Configuration
The project includes comprehensive AI instructions:
```
.cursor/
├── instructions.md # Quick start and common prompts
├── ARCHITECTURE.md # System design and database schema
└── rules/
├── 001_workspace.mdc # Project structure and conventions
├── 100_laravel.mdc # Laravel API patterns
├── 101_vue.mdc # Vue + Vuexy patterns
└── 200_testing.mdc # Testing strategies
```
**Read these files first!** They contain everything Cursor needs to generate code correctly.
## Prerequisites
Install these before starting:
### macOS (Homebrew)
```bash
# PHP 8.3
brew install php@8.3
brew link php@8.3
# Composer
brew install composer
# Node.js (via fnm)
brew install fnm
fnm install 20
fnm use 20
# pnpm
npm install -g pnpm
# Docker Desktop
# Download from: https://www.docker.com/products/docker-desktop/
```
### Verify Installation
```bash
php -v # Should show 8.3.x
composer -V # Should show 2.x
node -v # Should show v20.x
pnpm -v # Should show 8.x or 9.x
docker -v # Should show Docker version
```
---
## Step 1: Start Docker Services
```bash
cd crewli
make services
```
This starts:
- **MySQL 8.0** on port 3306
- **Redis** on port 6379
- **Mailpit** on port 8025 (email testing UI)
---
## Step 2: Create Laravel API
Open the project in Cursor and use this prompt:
```
Create a new Laravel 12 project in the api/ folder.
Requirements:
- Use the command: composer create-project laravel/laravel api
- After creation, install Sanctum: composer require laravel/sanctum
- Configure for API-only (we don't need web routes)
- Set up CORS for localhost:5173, localhost:5174, localhost:5175
- Use MySQL with these credentials:
- Host: 127.0.0.1
- Database: crewli
- Username: crewli
- Password: secret
Follow the conventions in .cursor/rules for code style.
```
### Manual Alternative
```bash
cd crewli
composer create-project laravel/laravel api
cd api
composer require laravel/sanctum
php artisan install:api
```
Then configure `api/.env`:
```env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=crewli
DB_USERNAME=crewli
DB_PASSWORD=secret
FRONTEND_ADMIN_URL=http://localhost:5173
FRONTEND_APP_URL=http://localhost:5174
FRONTEND_PORTAL_URL=http://localhost:5175
SANCTUM_STATEFUL_DOMAINS=localhost:5173,localhost:5174,localhost:5175
SESSION_DOMAIN=localhost
```
**Production (domain `crewli.app`):** set `APP_URL=https://api.crewli.app`, point `FRONTEND_ADMIN_URL` / `FRONTEND_APP_URL` / `FRONTEND_PORTAL_URL` to `https://admin.crewli.app`, `https://app.crewli.app`, and `https://portal.crewli.app`, and `SANCTUM_STATEFUL_DOMAINS=admin.crewli.app,app.crewli.app,portal.crewli.app` (hostnames only). Each SPA build should use `VITE_API_URL=https://api.crewli.app/api/v1`. Full template: `api/.env.example`. The product uses **`crewli.app`** only; **`crewli.nl`** is for a future public marketing site, not this API or SPAs.
---
## Step 3: Vuexy frontends (this repo)
This monorepo already contains three SPAs under `apps/`:
| Directory | Role | Typical Vuexy source |
|-----------|------|----------------------|
| `apps/admin/` | Super Admin | full-version (TypeScript) |
| `apps/app/` | Organizer (main product) | full-version or customized starter |
| `apps/portal/` | External portal (volunteers, token links) | stripped starter / custom layout |
If you ever need to re-copy from a Vuexy ZIP, use the paths above — not legacy `apps/band` or `apps/customers`.
```bash
# Example only — adjust to your Vuexy download path
cp -r ~/Downloads/vuexy/typescript-version/full-version/* apps/admin/
```
---
## Step 4: Configure SPAs
### Install Dependencies
```bash
cd apps/admin && pnpm install
cd ../app && pnpm install
cd ../portal && pnpm install
```
### Create Environment Files
**apps/admin/.env.local**
```env
VITE_API_URL=http://localhost:8000/api/v1
VITE_APP_NAME="Crewli Admin"
```
**apps/app/.env.local**
```env
VITE_API_URL=http://localhost:8000/api/v1
VITE_APP_NAME="Crewli Organizer"
```
**apps/portal/.env.local**
```env
VITE_API_URL=http://localhost:8000/api/v1
VITE_APP_NAME="Crewli Portal"
```
### Dev server ports
From the repo root, `make admin`, `make app`, and `make portal` start Vite on **5173**, **5174**, and **5175** respectively. If you run `pnpm dev` manually, configure the same ports in each apps `vite.config.ts` under `server.port`.
---
## Step 5: API client in SPAs
`apps/admin/src/lib/api-client.ts`, `apps/app/src/lib/api-client.ts`, and `apps/portal/src/lib/api-client.ts` share the same pattern: `VITE_API_URL` base, Bearer token from the `accessToken` cookie, 401 → clear cookies and redirect to `/login`. Build new composables on `apiClient`; keep Vuexy `useApi` for template demos only.
---
## Step 6: Create database schema
Implement migrations from the canonical schema, not a legacy intranet model:
- **`docs/SCHEMA.md`** — table list, columns, indexes
- **`.cursor/ARCHITECTURE.md`** — overview and relationships
- **`.cursor/rules/103_database.mdc`** — ULIDs, soft deletes, index rules
**Checked-in foundation (this repo):** Laravel defaults (`users`, `cache`, `jobs`) then `2026_04_07_*` migrations: Sanctum tokens → Spatie permission → activity log → `organisations``organisation_user``events``user_invitations``event_user_roles`. New modules should append migrations with a later timestamp in dependency order.
Typical next expansion order from `103_database.mdc`: festival sections, time slots, persons, shifts, …
Then run:
```bash
cd api && php artisan migrate
```
---
## Step 7: Start development
Open separate terminals (or use the Makefile from the repo root):
```bash
# Tab 1: Services (Docker)
make services
# Tab 2: Laravel API
make api
# Tab 3: Admin SPA (optional)
make admin
# Tab 4: Organizer SPA (optional)
make app
# Tab 5: Portal SPA (optional)
make portal
```
---
## Building features
Use Cursor with **`CLAUDE.md`** and **`.cursor/instructions.md`**. Example directions:
### Authentication
```
Wire Sanctum API auth: login, logout, me; form requests; API resources; Vue apps use axios + token storage (see .cursor/rules).
```
### Events module (Crewli)
```
Events nested under organisations: ULID PK, OrganisationScope, policies, EventResource, feature tests (200/401/403/422).
```
### Portal token flow
```
Portal token middleware and routes for artist/supplier contexts; document links on https://portal.crewli.app/... (see .cursor/rules/102_multi_tenancy.mdc).
```
---
## Troubleshooting
### MySQL Connection Refused
```bash
# Check if Docker is running
docker ps
# Restart services
make services-stop
make services
```
### CORS Errors
Check `api/config/cors.php` allows your frontend origins.
### Vuexy TypeScript Errors
```bash
cd apps/admin
pnpm install
pnpm type-check
```
---
## Next steps
1. Services running (Docker)
2. Laravel API configured and migrated
3. SPAs installed (`apps/admin`, `apps/app`, `apps/portal`)
4. Environment files for API + each SPA
5. Authentication and organisation switching
6. Events, sections, time slots, shifts
7. Persons, crowd types, portal flows
8. Accreditation, briefings, operational modules per roadmap in `.cursor/instructions.md`

View File

@@ -1,122 +0,0 @@
# Crewli — End-to-End Testscenario Fase 2
## Scenario: "Test Festival BV organiseert Echt Feesten 2026"
Dit scenario valideert de complete operationele kern van Crewli.
Voer dit uit na elke Fase 2 module om regressie te voorkomen.
---
## Stap 1 — Voorbereiding (al werkend na Fase 1)
- [ ] Login als orgadmin@crewli.test / password
- [ ] Organisatie "Test Festival BV" is automatisch actief
- [ ] Navigeer naar Evenementen
- [ ] Maak aan: "Echt Feesten 2026" | slug: echt-feesten-2026
start: 10-07-2026 | eind: 12-07-2026 | timezone: Europe/Amsterdam
- [ ] Evenement verschijnt in lijst met status "draft"
- [ ] Klik door naar detail pagina — header toont naam, datum, status
---
## Stap 2 — Festival Secties (Fase 2 Module 1)
- [ ] Navigeer naar evenement detail > tab "Secties"
- [ ] Maak sectie aan: "Bar" (sort_order: 1)
- [ ] Maak sectie aan: "Security" (sort_order: 2)
- [ ] Maak sectie aan: "Hospitality" (sort_order: 3)
- [ ] Drie secties zichtbaar in lijst, correct gesorteerd
---
## Stap 3 — Time Slots (Fase 2 Module 1)
- [ ] Navigeer naar evenement detail > tab "Time Slots"
- [ ] Maak time slot aan:
Naam: "Vrijdag Avond" | type: VOLUNTEER
datum: 10-07-2026 | start: 18:00 | eind: 02:00
- [ ] Maak time slot aan:
Naam: "Zaterdag Dag" | type: VOLUNTEER
datum: 11-07-2026 | start: 10:00 | eind: 18:00
- [ ] Maak time slot aan:
Naam: "Zaterdag Avond" | type: VOLUNTEER
datum: 11-07-2026 | start: 18:00 | eind: 02:00
- [ ] Maak time slot aan:
Naam: "Zondag" | type: CREW
datum: 12-07-2026 | start: 10:00 | eind: 20:00
- [ ] Vier time slots zichtbaar, correct gesorteerd op datum/tijd
---
## Stap 4 — Shifts aanmaken (Fase 2 Module 2)
- [ ] Navigeer naar sectie "Bar"
- [ ] Maak shift aan: Time Slot "Vrijdag Avond" | slots_total: 4
slots_open_for_claiming: 3
- [ ] Maak shift aan: Time Slot "Zaterdag Dag" | slots_total: 5
slots_open_for_claiming: 4
- [ ] Maak shift aan: Time Slot "Zaterdag Avond" | slots_total: 4
slots_open_for_claiming: 3
- [ ] Navigeer naar sectie "Security"
- [ ] Maak shift aan: Time Slot "Vrijdag Avond" | slots_total: 3
slots_open_for_claiming: 2
- [ ] Maak shift aan: Time Slot "Zaterdag Avond" | slots_total: 3
slots_open_for_claiming: 2
- [ ] Shifts tonen fill_rate: 0/4, 0/5, etc.
---
## Stap 5 — Personen aanmaken (Fase 2 Module 3)
- [ ] Navigeer naar Personen (event-scoped)
- [ ] Maak 5 personen aan als crowd_type "Volunteer": 1. Jan de Vries | jan@test.nl 2. Lisa Bakker | lisa@test.nl 3. Ahmed Hassan | ahmed@test.nl 4. Sara Jansen | sara@test.nl 5. Tom Visser | tom@test.nl
- [ ] Vijf personen zichtbaar in lijst, status "pending"
---
## Stap 6 — Shift toewijzing (Fase 2 Module 2)
- [ ] Wijs Jan de Vries toe aan: Bar > Vrijdag Avond
- [ ] Wijs Jan de Vries toe aan: Bar > Zaterdag Dag
- [ ] Wijs Lisa Bakker toe aan: Bar > Vrijdag Avond
- [ ] Wijs Ahmed Hassan toe aan: Security > Vrijdag Avond
- [ ] Fill rate Bar > Vrijdag Avond: 2/4 ✓
---
## Stap 7 — Conflictdetectie (Fase 2 Module 2)
- [ ] Probeer Jan de Vries toe te wijzen aan:
Security > Vrijdag Avond (zelfde time slot!)
- [ ] Systeem weigert met foutmelding:
"Jan de Vries is al ingepland voor Vrijdag Avond"
- [ ] Conflictdetectie werkt op DB-niveau (UNIQUE constraint)
---
## Stap 8 — Overzicht validatie
- [ ] Event dashboard tiles tonen correcte aantallen:
Secties: 3 | Shifts: 5 | Personen: 5
- [ ] Sectie "Bar" toont 3 shifts, totaal 13 slots
- [ ] Persoon "Jan de Vries" toont 2 shift-toewijzingen
- [ ] Geen console errors in browser DevTools
---
## Regressie — controleer na elke nieuwe module
- [ ] Login werkt nog (admin@crewli.test en orgadmin@crewli.test)
- [ ] Organisatie switcher werkt nog
- [ ] Events lijst laadt zonder errors
- [ ] php artisan test → alle tests groen
## Openstaande FK constraints (worden toegevoegd bij persons module)
- shift_assignments.person_id → persons
- shift_check_ins.person_id → persons
- volunteer_availabilities.person_id → persons
person_id kolommen zonder FK constraint in:
- shift_assignments
- shift_check_ins
- volunteer_availabilities

11
docs/guide/concepts.md Normal file
View File

@@ -0,0 +1,11 @@
---
title: Kernconcepten
description: De belangrijkste begrippen en concepten binnen Crewli uitgelegd.
tags: ['concepten', 'uitleg', 'basis']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina legt de kernconcepten van Crewli uit: organisaties, evenementen, secties, diensten, personen en meer. Begin hier als je voor het eerst met Crewli werkt.

View File

@@ -0,0 +1,11 @@
---
title: Aan de slag met Crewli
description: Leer de basis van Crewli en begin met het beheren van je evenementen.
tags: ['introductie', 'aan de slag', 'basis']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina helpt je op weg met je eerste stappen in Crewli: een organisatie aanmaken, je team uitnodigen, en je eerste evenement opzetten.

11
docs/guide/glossary.md Normal file
View File

@@ -0,0 +1,11 @@
---
title: Woordenlijst
description: Alle Crewli-termen op een rij met uitleg.
tags: ['woordenlijst', 'terminologie', 'begrippen']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Een alfabetisch overzicht van alle termen die je in Crewli tegenkomt, met een korte uitleg per begrip.

31
docs/index.md Normal file
View File

@@ -0,0 +1,31 @@
---
layout: home
title: Crewli Documentatie
description: Leer hoe je Crewli gebruikt voor je evenementen en festivals
hero:
name: Crewli Docs
text: Documentatie voor het Crewli platform
tagline: Alles wat je nodig hebt om je evenementen en festivals te beheren
actions:
- theme: brand
text: Aan de slag
link: /guide/getting-started
- theme: alt
text: Organisator handleiding
link: /organizer/
features:
- title: Evenementen beheren
details: Maak evenementen aan, plan festival series, en beheer je volledige evenementportfolio.
link: /organizer/events/create-event
- title: Diensten plannen
details: Richt secties in, maak tijdslots aan, en plan diensten voor je crew.
link: /organizer/shifts/planning
- title: Vrijwilligers
details: Registratie, dienstkeuze, check-in en het vrijwilligerspaspoort.
link: /volunteer/
- title: Artiesten & Advancing
details: Beheer je line-up en verzamel technische specificaties via het portaal.
link: /organizer/artists/advancing
---

View File

@@ -0,0 +1,11 @@
---
title: Access zones
description: Definieer toegangszones en koppel ze aan accreditaties.
tags: ['access zone', 'accreditatie', 'organisator']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft hoe je access zones instelt voor je evenement en hoe je ze koppelt aan accreditaties om de toegang te regelen.

View File

@@ -0,0 +1,11 @@
---
title: Accreditatie overzicht
description: Beheer accreditaties voor je evenement met access zones en templates.
tags: ['accreditatie', 'overzicht', 'organisator']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina geeft een overzicht van het accreditatiesysteem in Crewli: hoe je accreditaties instelt, toewijst en beheert.

View File

@@ -0,0 +1,11 @@
---
title: Accreditatie templates
description: Maak herbruikbare templates voor accreditaties met vooraf ingestelde access zones.
tags: ['accreditatie', 'template', 'organisator']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft hoe je accreditatie templates aanmaakt en gebruikt om snel accreditaties toe te wijzen met de juiste toegangsrechten.

View File

@@ -0,0 +1,11 @@
---
title: Advancing workflow
description: Verzamel technische specificaties van artiesten via het advancing-formulier.
tags: ['advancing', 'artiest', 'organisator']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft de advancing workflow: hoe je formulieren verstuurt naar artiesten, antwoorden bijhoudt, en technische specificaties verzamelt.

View File

@@ -0,0 +1,11 @@
---
title: Artiesten beheren
description: Voeg artiesten toe aan je evenement en beheer hun gegevens.
tags: ['artiest', 'beheer', 'organisator']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft hoe je artiesten toevoegt, hun gegevens beheert, en ze koppelt aan je programmering.

View File

@@ -0,0 +1,11 @@
---
title: Programma
description: Stel het programma samen met artiesten, tijden en podia.
tags: ['programma', 'artiest', 'planning', 'organisator']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft hoe je het programma van je evenement opbouwt: artiesten toewijzen aan podia en tijden, en het programmaoverzicht beheren.

View File

@@ -0,0 +1,11 @@
---
title: Briefings
description: Stuur briefings naar je crew met alle informatie die ze nodig hebben.
tags: ['briefing', 'communicatie', 'organisator']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft hoe je briefings aanmaakt, verstuurt naar specifieke groepen, en bijhoudt wie de briefing heeft gelezen.

View File

@@ -0,0 +1,11 @@
---
title: Berichten
description: Stuur berichten naar personen en groepen binnen je evenement.
tags: ['berichten', 'communicatie', 'organisator']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft hoe je berichten verstuurt, ontvangt en beheert binnen Crewli.

View File

@@ -0,0 +1,11 @@
---
title: Evenement aanmaken
description: Maak een nieuw evenement aan binnen je organisatie.
tags: ['evenement', 'aanmaken', 'organisator']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft stap voor stap hoe je een nieuw evenement aanmaakt, het type kiest, en de basisgegevens invult.

View File

@@ -0,0 +1,11 @@
---
title: Evenement statussen
description: Begrijp de verschillende statussen van een evenement en wat ze betekenen.
tags: ['evenement', 'status', 'workflow', 'organisator']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft de levenscyclus van een evenement: van concept tot afgerond, en welke acties bij elke status horen.

View File

@@ -0,0 +1,11 @@
---
title: Festival series
description: Beheer terugkerende festivals als een serie met gedeelde instellingen.
tags: ['festival serie', 'evenement', 'organisator']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft hoe festival series werken: hoe je een parent-evenement aanmaakt, edities toevoegt, en instellingen deelt tussen edities.

11
docs/organizer/index.md Normal file
View File

@@ -0,0 +1,11 @@
---
title: Organisator overzicht
description: Alles wat je als organisator moet weten over het beheren van evenementen in Crewli.
tags: ['organisator', 'overzicht', 'beheer']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Als organisator beheer je evenementen, secties, diensten, personen en communicatie. Dit overzicht helpt je navigeren naar de juiste handleiding.

View File

@@ -0,0 +1,11 @@
---
title: Organisatie inrichten
description: Stel je organisatie in met naam, logo en basisinstellingen.
tags: ['organisatie', 'instellingen', 'organisator']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft hoe je je organisatie inricht in Crewli: basisgegevens instellen, logo uploaden, en je organisatie klaar maken voor gebruik.

View File

@@ -0,0 +1,11 @@
---
title: Crowd lijsten
description: Beheer lijsten van personen per crowd type voor je evenement.
tags: ['crowd lijst', 'persoon', 'organisator']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft hoe je crowd lijsten bekijkt, filtert en exporteert, en hoe ze samenhangen met crowd types en accreditatie.

View File

@@ -0,0 +1,11 @@
---
title: Crowd types
description: Definieer categorieën voor verschillende soorten bezoekers en deelnemers.
tags: ['crowd type', 'persoon', 'organisator']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft hoe je crowd types aanmaakt en gebruikt om personen te categoriseren, zoals vrijwilligers, artiesten, pers en leveranciers.

View File

@@ -0,0 +1,11 @@
---
title: Personen beheren
description: Voeg personen toe, bewerk gegevens en beheer je personenbestand.
tags: ['persoon', 'beheer', 'organisator']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft hoe je personen toevoegt, bewerkt en verwijdert, en hoe het personenbestand samenhangt met crowd types en tags.

View File

@@ -0,0 +1,11 @@
---
title: Tags
description: Gebruik tags om personen flexibel te labelen en te filteren.
tags: ['tag', 'persoon', 'filter', 'organisator']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft hoe je tags aanmaakt, toewijst aan personen, en gebruikt om snel de juiste mensen te vinden.

View File

@@ -0,0 +1,11 @@
---
title: Toewijzingen
description: Wijs personen toe aan diensten en beheer de dienstlijst.
tags: ['toewijzing', 'dienst', 'organisator']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft hoe je personen toewijst aan diensten, hoe de wachtlijst werkt, en hoe je toewijzingen beheert.

View File

@@ -0,0 +1,11 @@
---
title: Diensten plannen
description: Plan diensten door secties, tijdslots en personen aan elkaar te koppelen.
tags: ['dienst', 'planning', 'organisator']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft de complete workflow voor het plannen van diensten: van het opzetten van secties tot het toewijzen van personen.

View File

@@ -0,0 +1,11 @@
---
title: Secties beheren
description: Maak secties aan en organiseer je evenement in logische onderdelen.
tags: ['sectie', 'organisator', 'beheer']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft hoe je secties aanmaakt, hernoemt, herordent en verwijdert binnen je evenement.

View File

@@ -0,0 +1,11 @@
---
title: Tijdslots
description: Definieer tijdslots waarbinnen diensten gepland worden.
tags: ['tijdslot', 'planning', 'organisator']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft hoe je tijdslots aanmaakt en beheert, en hoe ze samenhangen met secties en diensten.

View File

@@ -0,0 +1,11 @@
---
title: Teamleden beheren
description: Nodig teamleden uit en beheer hun rollen binnen je organisatie.
tags: ['teamleden', 'rollen', 'uitnodigen', 'organisator']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft hoe je teamleden uitnodigt, rollen toewijst, en toegang beheert binnen je organisatie.

2514
docs/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

13
docs/package.json Normal file
View File

@@ -0,0 +1,13 @@
{
"name": "crewli-docs",
"private": true,
"type": "module",
"scripts": {
"docs:dev": "vitepress dev",
"docs:build": "vitepress build",
"docs:preview": "vitepress preview"
},
"devDependencies": {
"vitepress": "^1.6.4"
}
}

View File

@@ -0,0 +1,11 @@
---
title: Advancing invullen
description: Vul als artiest je technische specificaties en wensen in via het portaal.
tags: ['portal', 'advancing', 'artiest']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft hoe je als artiest het advancing-formulier invult: technische specificaties, cateringwensen, en overige informatie.

11
docs/portal/index.md Normal file
View File

@@ -0,0 +1,11 @@
---
title: Portal overzicht
description: Toegang tot Crewli voor artiesten, leveranciers en pers via het externe portaal.
tags: ['portal', 'overzicht', 'extern']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Het Crewli portaal biedt externe partijen — artiesten, leveranciers en pers — toegang tot de informatie en formulieren die ze nodig hebben.

View File

@@ -0,0 +1,11 @@
---
title: Persaccreditatie aanvragen
description: Vraag als persfotograaf of journalist accreditatie aan voor een evenement.
tags: ['portal', 'pers', 'accreditatie']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft hoe pers accreditatie aanvraagt via het portaal, welke gegevens nodig zijn, en hoe de beoordeling werkt.

View File

@@ -0,0 +1,11 @@
---
title: Leverancierstoegang
description: Krijg als leverancier toegang tot relevante evenementinformatie via het portaal.
tags: ['portal', 'leverancier', 'toegang']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft hoe leveranciers toegang krijgen tot het portaal en welke informatie er beschikbaar is.

View File

@@ -0,0 +1,11 @@
---
title: Check-in
description: Check in bij je dienst met je QR-code of handmatig.
tags: ['vrijwilliger', 'check-in', 'dienst']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft hoe de check-in werkt: je QR-code tonen, handmatig inchecken, en wat er gebeurt als je incheckt.

11
docs/volunteer/index.md Normal file
View File

@@ -0,0 +1,11 @@
---
title: Vrijwilliger overzicht
description: Alles wat je als vrijwilliger moet weten over het gebruik van Crewli.
tags: ['vrijwilliger', 'overzicht']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Als vrijwilliger gebruik je Crewli om je te registreren voor een evenement, diensten te kiezen, je paspoort te bekijken en in te checken.

View File

@@ -0,0 +1,11 @@
---
title: Mijn paspoort
description: Bekijk je persoonlijke vrijwilligerspaspoort met je diensten en accreditatie.
tags: ['vrijwilliger', 'paspoort', 'accreditatie']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft het vrijwilligerspaspoort: wat je er vindt, hoe je het gebruikt, en hoe het samenhangt met je diensten en accreditatie.

View File

@@ -0,0 +1,11 @@
---
title: Registreren
description: Meld je aan als vrijwilliger voor een evenement.
tags: ['vrijwilliger', 'registratie', 'aanmelden']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft hoe je je registreert als vrijwilliger, je profiel invult, en toegang krijgt tot het evenement.

View File

@@ -0,0 +1,11 @@
---
title: Diensten kiezen
description: Bekijk beschikbare diensten en schrijf je in.
tags: ['vrijwilliger', 'dienst', 'inschrijven']
---
# {{ $frontmatter.title }}
{{ $frontmatter.description }}
Deze pagina beschrijft hoe je beschikbare diensten bekijkt, je voorkeuren aangeeft, en je inschrijft voor diensten.