BSO Survival v2 is de schone, uitbreidbare basis voor de volgende ontwikkelfase van de plugin.
Laatste documentatie-update: 19 juli 2026.
De codebase staat nu in een vroeg maar werkend v2-fundament:
- plugin bootstrap en activatie zijn aanwezig
- het datamodel is volledig gedefinieerd
- migratie draait bij activatie
- golden dataset en unit tests zijn beschikbaar
- repositories en services vormen de huidige leeslaag
- read-only frontend shortcodes zijn beschikbaar (dashboard, onderdelen, teams, gecombineerde varianten)
- scoremethode-architectuur voor Fase 2 is opgezet (interface, registry, defaults)
- dashboard widget-architectuur voor Fase 3 is gestart (interface, registry, sectioning, default widgets)
- dagafsluitingsflow is operationeel (closeout/publicatie via REST, admin en CLI)
- persisted publicatiebron is beschikbaar voor top-3/eindstand (incl. admin refresh)
- template/outbox notificatieketen met retries is operationeel
- teaminschrijving (frontend shortcode + REST) is operationeel binnen registratievenster
- admin inschrijvingsdashboard en registratie-capaciteitswidget zijn toegevoegd
- admin eventbeheer toegevoegd: event aanmaken/bewerken, geldig part-filteren, bestaande parts koppelen en veilig verwijderen zonder part-verlies
- admin onderdelenbeheer toegevoegd: CRUD en JSON import/export voor herbruikbare onderdelen
- demo-simulatie voor scoreverloop via WP-CLI is beschikbaar en idempotent (update-only op bestaande score-records)
- score-invoer uitgebreid met numeriek bonusveld per score-entry, inclusief sortering in admin en shortcode-tabellen
- tie-resolutie bij gelijke ruwe score gebruikt bonuspunten als eerste tie-break
- admin toegang en rollen toegevoegd: gebruiker-override per WordPress account voor settings/score/meldingen rechten
- dashboard kernwaarden gebruikt nu expliciete registered-team telling (status-gedreven) i.p.v. impliciet totaal
- dashboard statuskaarten tonen event/registratie via SVG-statusiconen met hovertekst
- dashboard detailwidgets
OnderdelenenTeamszijn klikbaar voor directe navigatie naar helptekst en teamscore - dashboard widget-admin ondersteunt nu event-specifieke doelpagina's voor kliknavigatie van
OnderdelenenTeams - dashboard KPI-kaarten
OnderdelenenTeamstonen nu respectievelijksurvival-parts.svgensurvival-teams.svg
De basis voor dagafsluiting en publicatie is nu bruikbaar in beheerprocessen en kan verder worden uitgebreid met geavanceerde ranking- en communicatielagen.
- Plugin bootstrap: bso-survival.php
- Activatie en migratie: src/Core/Activator.php en src/Database/Migrator.php
- Datamodel: src/Database/Schema.php
- Repositories: src/Database/Repository
- Services: src/Service
- Scoring contracts: src/Contracts/ScoringMethodInterface.php
- Scoring registry: src/Service/ScoringMethodRegistry.php
- Scoring methods: src/Service/ScoringMethods
- Dashboard widget contract: src/Contracts/DashboardWidgetInterface.php
- Dashboard widget registry: src/Service/DashboardWidgetRegistry.php
- Dashboard widgets: src/Widgets
- Dashboard widget assets: assets/css/bso-survival-dashboard-widgets.css en assets/js/bso-survival-dashboard-widgets.js
- Dashboard widget admin UX assets: assets/css/bso-survival-admin-dashboard-widgets.css en assets/js/bso-survival-admin-dashboard-widgets.js
- Dashboard widget layout admin: src/Admin/DashboardWidgetAdminPage.php
- Dashboard widget layout service: src/Service/DashboardWidgetLayoutService.php
- Dashboard widget layout REST controller: src/Api/DashboardWidgetLayoutRestController.php
- Widgetbreedte per dashboard widget is configureerbaar in de adminlayout met de opties
1/5,1/4,3/4en1(hele breedte). - PartRule configuratie-service: src/Service/PartRuleConfiguratorService.php
- Scoreberekening op PartRule: src/Service/ScoreComputationService.php
- Admin configuratiepagina: src/Admin/PartRuleAdminPage.php
- Frontend controllers: src/Frontend
- Frontend templates: templates
- Golden dataset: tests/Support/GoldenDataset.php
- Regressietests: tests/Support en tests/Service
- Dagafsluitingsvoorbereiding: docs/Dagafsluiting_Voorbereiding.md
- Hooks en shortcodes: docs/hooks-and-filters.md
- Dagafsluitingsservice: src/Service/EventCloseoutService.php
- Dagafsluiting adminpagina: src/Admin/EventLifecycleAdminPage.php
- Dagafsluiting CLI-command: src/Core/Cli/EventLifecycleCommand.php
- Demo-score CLI-command: src/Core/Cli/SeedDemoScoresCommand.php
- Publicatienotificatieservice: src/Service/PublicationNotificationService.php
- Eventbeheer adminpagina: src/Admin/EventAdminPage.php
- Eventbeheer service: src/Service/EventAdminService.php
- Toegang en rollen adminpagina: src/Admin/AccessAdminPage.php
- Capabilities helper: src/Support/Capabilities.php
- Onderdelen adminpagina: src/Admin/PartAdminPage.php
- Onderdelen adminservice: src/Service/PartAdminService.php
- Eventbeheer handleiding: docs/Admin_Eventbeheer.md
- Beheer runbook demo-simulatie: docs/Runbook_Beheer_Demo_Simulatie.md
[bso_survival_dashboard]- Attributen:
event_id,title
- Attributen:
[bso_survival_parts]- Attributen:
event_id,title
- Attributen:
[bso_survival_teams]- Attributen:
event_id,title
- Attributen:
[bso_survival_event_overview]- Attributen:
event_id,title,compact(yes/no, defaultno)
- Attributen:
[bso_survival_event_summary]- Attributen:
event_id,title
- Attributen:
[bso_survival_team_registration]- Attributen:
event_id,title,button_label
- Attributen:
[bso_survival_team_score]- Attributen:
event_id,team_id,title - Zonder
team_idwordt automatisch het eerste team van het event gekozen; bovenin staat een team-combobox om direct te wisselen.
- Attributen:
[bso_survival_part_score]- Attributen:
event_id,part_id,title - Zonder
part_idwordt automatisch het eerste gekoppelde onderdeel van het event gekozen; bovenin staat een onderdeel-combobox om direct te wisselen.
- Attributen:
[bso_survival_timeslot_board]- Attributen:
event_id,part_id,title
- Attributen:
Belangrijk voor dashboardpagina's:
- Gebruik altijd
[bso_survival_dashboard](niet[bso_team_dashboard]). - Geef bij voorkeur altijd expliciet
event_idmee, bijvoorbeeld:[bso_survival_dashboard event_id="7"]. - Zonder
event_idkiest de shortcode automatisch het eerstvolgende actieve event vanaf vandaag. - Bovenin het dashboard staat een event-combobox met maximaal 5 actieve events vanaf vandaag naar de toekomst.
- De kaart
Statustoont een event-statusicoon uitassets/images/event-status/; de tekst verschijnt op hover/focus. - De kaart
Onderdelentoontassets/images/survival-parts.svgnaast de actuele teller. - De kaart
Teamstoontassets/images/survival-teams.svgnaast de actuele teller. - De kaart
Inschrijvingtoont een registratie-statusicoon uitassets/images/registration-status/; de status-tekst verschijnt op hover/focus, terwijl de teller zichtbaar blijft. - De widget
Onderdelenlinkt per onderdeel naar de helpweergave metevent_id+part_id. - De widget
Teamslinkt per team naar de teamscore-weergave metevent_id+team_id. - De widget
Contactzoekerondersteunt zoeken op team, contactnaam, e-mail, telefoon en status; zonder zoekterm worden geen resultaten getoond. Per team toont de widget direct klikbare e-mail en WhatsApp-contactlinks, plus eenx-knop om het filter direct te wissen. - De widget
Inschrijfcapaciteittoont de actuele verhouding tussen geregistreerde teams en maximale capaciteit, inclusief bezettingsindicator en statusbadge voor open, beperkt, volgeboekt of gesloten inschrijving. - De widget
Fallback-scoreinvoeris alleen zichtbaar voor gebruikers metmanage_optionsen toont op dit moment een noodinstructiekaart: gebruik alleen bij storing van de reguliere scoreflow. - In
Survival -> Dashboard Widgetskun je per event instellen op welke pagina de linksOnderdelen,TeamsenInschrijfcapaciteitmoeten openen.
Korte documentatieversie Contactzoeker:
De Contactzoeker is een widget waarmee bezoekers snel teamcontacten kunnen vinden. Zonder zoekterm toont de widget geen resultaten. De widget ondersteunt zoeken op team, contactnaam, e-mail, telefoon en status, opent telefoonnummers via WhatsApp-chat en heeft naast het zoekveld een
x-knop om het filter direct te wissen.
Doel
De widget Inschrijfcapaciteit geeft bezoekers inzicht in de actuele beschikbaarheid van plaatsen voor de Survival en ondersteunt het inschrijfproces door direct zichtbaar te maken hoeveel capaciteit nog over is.
Functionaliteit
- Toont de verhouding tussen het aantal geregistreerde inschrijvingen en de maximale capaciteit.
- Toont het huidige aantal inschrijvingen.
- Toont het aantal resterende beschikbare plaatsen wanneer een maximum is ingesteld.
- Toont een statusbadge voor de actuele inschrijfstatus: open, beperkt aantal plaatsen beschikbaar, volgeboekt of inschrijvingen gesloten.
- Toont een visuele indicator van de bezettingsgraad.
Gebruikersdoel
Bezoekers kunnen zonder aanvullende communicatie direct beoordelen of deelname nog mogelijk is. Dat voorkomt onnodige inschrijfpogingen zodra de capaciteit is bereikt en stimuleert tijdige aanmelding zolang er nog plaatsen beschikbaar zijn.
Resultaat
De widget maakt de beschikbare capaciteit transparant en helpt de organisatie het maximale aantal deelnemers te bewaken. Daarmee wordt het inschrijfproces duidelijker voor bezoekers en eenvoudiger te beheren.
Korte versie voor documentatie
De widget
Inschrijfcapaciteittoont de actuele beschikbaarheid van plaatsen voor de Survival. Bezoekers zien hoeveel inschrijvingen reeds zijn ontvangen, hoeveel plaatsen nog beschikbaar zijn en kunnen, zodra een inschrijfpagina is ingesteld, direct doorklikken naar het inschrijfformulier.
Zeer korte versie (voor een overzichtstabel)
Inschrijfcapaciteit: toont het aantal beschikbare plaatsen, de actuele status van de inschrijvingen en eventueel een directe inschrijflink.
Doel
De widget Fallback-scoreinvoer is een operationele noodkaart voor leiding wanneer de reguliere scoreflow tijdelijk niet bruikbaar is.
Functionaliteit (huidige implementatie)
- Widgettitel
Fallback-scoreinvoerin de dashboardsectieoperations. - Alleen zichtbaar voor gebruikers met capability
manage_options. - Toont een expliciete instructietekst: gebruik alleen bij storing van reguliere scoreflow.
- Geen eigen handmatige score-invoerformulier in deze widgetversie; scoreverwerking loopt via de bestaande scorekanalen.
Gebruikersdoel
Tijdens een storing ziet leiding direct dat fallback-procedure geldt en kan operationeel schakelen zonder verwarring over de normale scoreflow.
Resultaat
De continuiteit van het proces wordt ondersteund door duidelijke noodcommunicatie in het dashboard, terwijl technische score-opslag via de reguliere paden bewaakt blijft.
Korte versie voor documentatie
De Fallback-scoreinvoer is een leiding-only noodwidget die bij storing een duidelijke fallback-instructie toont. In de huidige versie bevat deze widget nog geen eigen handmatige score-invoer UI.
Zeer korte beschrijving (voor overzichtstabel)
Fallback-scoreinvoer: leiding-only noodkaart met fallback-instructie bij uitval van de reguliere scoreflow.
Optionele URL-overrides (filters):
bso_survival_dashboard_parts_help_url: override van basis-URL voor onderdeel-help links.bso_survival_dashboard_team_score_url: override van basis-URL voor team-score links.- Zonder filter gebruikt dashboard automatisch de ingestelde adminpagina (
parts_help_page_id/team_score_page_id) en anders de huidige pagina als fallback.
Voorbeeld:
[bso_survival_event_overview title="Gecombineerd Overzicht Event 2" event_id="2" compact="yes"]
[bso_survival_team_score title="Tussentijdse teamscore Team001" event_id="2" team_id="14"]
[bso_survival_part_score title="Tussentijdse onderdeelscore Kano Bungee" event_id="2" part_id="8"]
[bso_survival_timeslot_board title="Tijdslot overzicht Event 2" event_id="2" part_id="8"]
Een compacte index van de belangrijkste actions en filters staat ook in docs/hooks-and-filters.md.
| Domein | Hooks |
|---|---|
| Metadata | bso_survival_metadata_error |
| Registratie | bso_survival_register_scoring_methods, bso_survival_dashboard_widgets_init |
| Renderfouten | bso_survival_dashboard_render_error, bso_survival_parts_render_error, bso_survival_teams_render_error, bso_survival_event_overview_render_error, bso_survival_event_summary_render_error |
| Scoring | bso_survival_score_normalized_points, bso_survival_position_proposal |
| Score-invoer | bso_survival_before_score_validation, bso_survival_score_recorded |
| Eventstatus | bso_survival_before_event_status_change, bso_survival_event_status_changed |
| Ranking | bso_survival_before_ranking_refresh, bso_survival_ranking_updated |
| Certificaten | bso_survival_before_certificate_generated, bso_survival_certificate_generated |
| Auditlog | bso_survival_before_audit_log_write, bso_survival_audit_log_written, bso_survival_audit_log_failed |
- automatische eindstandberekening direct vanuit rankingservice (zonder handmatige standings-input)
- operationele rapportage op notificatiedelivery en foutpercentages
- GET
/wp-json/bso-survival/v1/dashboard-layout/{event_id} - POST
/wp-json/bso-survival/v1/dashboard-layout/{event_id}met body:
{
"layout": {
"main": ["team_ranking"],
"operations": ["message_widget"]
},
"widths": {
"main": {
"team_ranking": "3/4"
},
"operations": {
"message_widget": "1"
}
}
}Adminpagina gebruikt dezelfde endpoint voor realtime opslaan zonder page reload en toont inline succes/foutmeldingen.
- GET
/wp-json/bso-survival/v1/dashboard/messages?event_id={event_id}&scope=all&page=1&per_page=20 - POST
/wp-json/bso-survival/v1/dashboard/messages - PATCH
/wp-json/bso-survival/v1/dashboard/messages/{message_id} - DELETE
/wp-json/bso-survival/v1/dashboard/messages/{message_id}
Voor tijdgestuurde zichtbaarheid ondersteunt create/update de velden visible_from en visible_until.
Wanneer beide zijn gezet, moet visible_until groter zijn dan visible_from.
- Script: tests/manual/f6-03-smoke.sh
- Doel: randmomenten rond zichtvenster controleren (future, verlopen, huidig, invalid window)
Uitvoeren:
./tests/manual/f6-03-smoke.sh <event_id>Of:
BSO_EVENT_ID=<event_id> ./tests/manual/f6-03-smoke.sh- Lokale secrets (niet committen):
.dev/wp-dev.env - Voorbeeldbestand: .dev/wp-dev.env.example
- Runtime shortcode smoke runner: scripts/wp-runtime-shortcode-smoke.sh
- Runtime F6-03 visibility smoke runner: scripts/wp-runtime-f6-03-smoke.sh
- VS Code tasks: .vscode/tasks.json
Handmatig uitvoeren:
./scripts/wp-runtime-shortcode-smoke.sh
./scripts/wp-runtime-f6-03-smoke.shDe task Auto WP Runtime Smoke on Folder Open draait automatisch bij openen van de projectmap (na toestaan van auto-tasks in VS Code).
- Open
Survival -> Events. - Maak een nieuw event aan met naam, datum en max teams.
- Gebruik optioneel de vinkjes in
Nieuw event aanmakenom direct demo teams te maken, alle onderdelen te koppelen en planning + initiële score-records te genereren. - Kies een bestaand event, wijzig indien nodig naam/datum/max teams en sla op.
- Gebruik het onderdelenfilter om alleen geldig koppelbare parts snel te vinden.
- Gesloten/gepubliceerde events zijn read-only voor inhoudelijke mutaties.
- Verwijderen van event koppelt parts los maar verwijdert parts niet.
- Open
Survival -> obstacle-specific rules. - Kies het event en klik
Laden. - Voor actieve events zijn onderdeelregels bewerkbaar.
- Voor gesloten/gepubliceerde/verwijderde events draait de pagina in read-only modus.
- In read-only modus toont de pagina een nette melding en de beschikbare eventsamenvatting (headline, top-3, eindstand).
- Open
Survival -> Onderdelen. - Maak een nieuw onderdeel aan met minimaal naam en status.
- Leg optioneel GPS-coordinaten en uitbreidbare
meta_dataJSON vast. - Gebruik
Bewerkenom bestaand onderdeel inhoudelijk te wijzigen. - Per onderdeel kun je nu een
Help HTML-templatevastleggen met placeholders:{part_id},{part_name},{event_id},{latitude},{longitude},{meta_json}. - Voeg help-afbeeldingen toe via attachment IDs of URLs (JSON-array, komma-gescheiden of regel-per-regel).
- Op frontend shortcode
[bso_survival_parts]kun je door helpteksten bladeren via onderdelenlijst (desktop), selector (mobiel) enVorige/Volgende onderdeelknoppen. - Importeer een JSON-lijst voor bulktoevoeging of exporteer de huidige set als herbruikbaar JSON-bestand.
- Verwijderen faalt veilig als het onderdeel nog aan een actief event gekoppeld is.
Handleiding: docs/Admin_Eventbeheer.md
./scripts/run-admin-event-tests.sh
./scripts/run-admin-part-tests.sh- POST
/wp-json/bso-survival/v1/event-closeout/{event_id} - POST
/wp-json/bso-survival/v1/event-closeout/{event_id}/publish - GET
/wp-json/bso-survival/v1/event-closeout/{event_id}/publication
De closeout-route zet een event op afgesloten, registreert certificaatrecords en schrijft auditlog. De publish-route zet het event daarna op gepubliceerd, normaliseert publicatiepayload naar top_3 en final_standings, slaat het resultaat persisted op en verwerkt notificaties via template/outbox. De publication-route levert het persisted resultaat voor operationele controle in admin.
- POST
/wp-json/bso-survival/v1/registrations
Body (voorbeeld):
{
"event_id": 14,
"team_name": "Team Kompas",
"contact_name": "Ouder Voorbeeld",
"contact_email": "ouder@example.test",
"contact_phone": "0612345678",
"team_members": ["Kind 1", "Kind 2"],
"registration_nonce": "...",
"idempotency_key": "reg-..."
}Response bevat o.a. registration_id, team_id, status, en counts.registered_teams/max_teams.
- Plaats shortcode
[bso_survival_team_registration event_id="14"]op een frontend-pagina. - Laat vrijwilliger team + teamleden invoeren en submitten.
- Controleer in admin
BSO Rules -> Inschrijvingende tellerx / max_teamsen vensterstatus. - Controleer in dashboard de widget
Inschrijfcapaciteit, de verhoudingx / max_teams, de bezettingsindicator en de statusbadge (open,beperkt,VOL,gesloten).
- Open
BSO Rules -> Event Lifecyclein de WordPress admin. - Kies event, vul
Changed by, en laad eventueelVoorbeeld closeout. - Klik
JSON validerenen daarnaEvent afsluiten (closeout). - Vul/controleer publicatievelden, laad eventueel
Voorbeeld publicatie, controleer preview. - Klik
Event publicerenen controleerLaatste responseoptop_3,final_standingsennotifications.
Uitgebreide handleiding: docs/Dagafsluiting_Voorbereiding.md
- Open
Survival -> Score Invoer. - Kies event en klik
Laden. - Klik
Initialiseer scoresom ontbrekende score-records voor alle assignments van het event vooraf aan te maken. - Klik op een score-rij om rechts het flip-over paneel
Bewerken score, score ID #...te openen. - Wijzig
Ruwe score, zet optioneelBonus punten(numeriek, >= 0) en zet indien nodigJoker ingezet (score telt dubbel)aan of uit. - Klik
Opslaan, of klikAnnuleren. - Joker is technisch afgedwongen als eenmalig per team per event; dubbele inzet wordt geblokkeerd met foutmelding.
- Gebruik
Nieuwe scorenaastLadenals handmatige fallback voor uitzonderingen. - Een extra score op hetzelfde onderdeel voor hetzelfde team is alleen toegestaan via een andere assignment/tijdslot en zolang het totaal aantal scores van alle teams gelijk blijft; anders wordt opslaan geannuleerd.
- Voor simulaties zonder handmatige invoer: gebruik het runbook docs/Runbook_Beheer_Demo_Simulatie.md.
- De scoregrid bevat nu een kolom
Tijdsrange(sorteerbaar) zodat assignment-context direct zichtbaar is. - Rechtenafhankelijke UI: gebruikers met alleen scorebeheer zien wel invoer/bewerken, maar geen
Initialiseer scores(alleen volledige beheerrechten). - In de edit flip-over kan
Tijdsrangenu actief worden gewijzigd via een selectieveld; hiermee wissel je eenvoudig van tijdslot binnen hetzelfde team + onderdeel.
- Open
Survival -> Toegang. - Kies per WordPress gebruiker een override-profiel.
- Profielen:
Overnemen van WordPress rol: alleen standaard WP rechten gelden.Survival eigenaar: volledige pluginrechten (settings + toegang + score + meldingen).Survival coordinator: settings + score + meldingen.Alleen scorebeheer: alleen scorebeheerpagina en score-API acties.Alleen meldingen: alleen dashboard-meldingenbeheer.Geen Survival toegang: verwijdert pluginrechten voor deze gebruiker.
- Klik
Toegang opslaan. - Laat de gebruiker opnieuw inloggen zodat het menu met nieuwe rechten zichtbaar wordt.
- Onderdeelscore (
[bso_survival_part_score]) toont alle teams voor het geselecteerde onderdeel. - Onderdeelscore bevat een extra kolom
Tijdsrange(sorteerbaar) in het grid. - Tijdslot-overzicht (
[bso_survival_timeslot_board]) toont per tijdslot welke teams tegenover elkaar staan, met een groene of grijze status-led per team op basis van score-aanwezigheid. - Voor gebruikers met scorebeheerrechten (
manage_survival_scores) zijn score-rijen in onderdeelscore aanklikbaar en opent rechts een bewerk flip-over. - Zonder scorebeheerrechten toont onderdeelscore een duidelijke alleen-lezen UI en is bewerken uitgeschakeld.
- Teamscore hanteert nu hetzelfde gridgedrag als onderdeelscore: voor scorebeheerders aanklikbare rijen met rechter bewerkpaneel; voor read-only gebruikers alleen weergave.
- Posities worden per onderdeel opnieuw berekend op basis van ruwe score en onderdeelregel (
lower_raw_wins/higher_raw_wins, oftimeals lagere score wint). - Bij gelijke ruwe score geldt bonus als tie-break (meer bonus = hogere positie); pas bij gelijke bonus volgt alfabetische fallback op teamnaam.
- Per team wordt een tussentijdse waarde berekend met:
tussentijdse_score = positie * 10 * joker_factorjoker_factor = 1zonder joker,2met joker.
- Positie in het grid blijft de originele rangorde (1, 2, 3, ...).
- Voor de tussentijdse score wordt intern een omgekeerde weging gebruikt (bij 7 teams: beste rij telt als 7, laagste rij als 1).
- Teamscore (
[bso_survival_team_score]) toont voor het geselecteerde team per onderdeel:- tijdsrange
- ruwe score
- bonuspunten
- berekende positie binnen dat onderdeel
- tussentijdse score
- De tussentijdse eindscore van het team is de som van alle tussentijdse onderdelencores.
wp bso-survival lifecycle --phase=closeout --event_id=14 --changed_by=wedstrijdleiding --certificates='[{"team_id":5,"file_path":"/tmp/team-5.pdf"}]'wp bso-survival lifecycle --phase=publish --event_id=14 --changed_by=wedstrijdleiding --publication='{"headline":"Uitslag gepubliceerd","standings":[{"rank":1,"team_id":11,"team_name":"Team Rood","points":98.5}],"recipients":["coach@example.test"]}'
- Alle tijdsloten van een event seeden (standaardgedrag als
--slotontbreekt):WORDPRESS_DB_HOST=wordpress-db WORDPRESS_DB_NAME=wordpress WORDPRESS_DB_USER=wordpress WORDPRESS_DB_PASSWORD='<DB_PASSWORD>' wp --path=/var/www/html --allow-root bso-survival seed-demo-scores --event-id=7
- Alleen specifieke tijdsloten seeden:
WORDPRESS_DB_HOST=wordpress-db WORDPRESS_DB_NAME=wordpress WORDPRESS_DB_USER=wordpress WORDPRESS_DB_PASSWORD='<DB_PASSWORD>' wp --path=/var/www/html --allow-root bso-survival seed-demo-scores --slot=1,6,9,12 --event-id=7
- Idempotent gedrag:
- de command werkt update-only op bestaande score-records;
- er worden geen nieuwe score-entries toegevoegd door demo-seeding.
Volledige beheerstappen en checks staan in docs/Runbook_Beheer_Demo_Simulatie.md.
- Event closeout/publicatie routes actief en gekoppeld aan service-orchestratie.
- Frontend read-only/publicatiegedrag na statusovergang bevestigd.
- Audit logging op closeout en publicatie volledig gekoppeld.
- Nieuwe adminpagina
Event Lifecycletoegevoegd voor closeout/publicatie-acties. - Nieuwe CLI command
wp bso-survival lifecycletoegevoegd voor beheer/automation. - Realtime response feedback in admin voor snellere operationele controle.
- Publicatiepayload gestandaardiseerd met
headline,published_at,top_3,final_standings,recipients. - Top-3 en volledige eindstand komen nu uniform terug in publicatieresponse.
- Tests uitgebreid op payload-structuur en publicatieresultaat.
- Publicatienotificatieservice toegevoegd met recipient-normalisatie.
- Verzendsamenvatting (
sent_count,failed_count,sent_to,failed_to) opgenomen in result payload. - Hooks voor notificatiefase toegevoegd voor verdere uitbouw (templates/outbox/retry).
- Email templatebeheer toegevoegd in admin.
- Outbox/retry processor gekoppeld met retry-schema en foutafhandeling.
- End-to-end notificatiepipeline-tests toegevoegd.
- Persisted
event_publicationsbron toegevoegd voor publicatieresultaten. - Team ranking widget leest nu primair uit persisted
final_standings. - Dashboard-overview uitgebreid met publicatiestatus/count-velden.
- Lifecycle admin toont persisted eindstand inclusief top-3 en raw payload.
- Handmatige refresh en auto-refresh na publish toegevoegd.
- UX verbeterd met busy-labels, spinner, en specifieke statusmeldingen.
- Nieuwe registratie-REST endpoint en frontend shortcode-flow toegevoegd.
- Team + teamleden worden atomair opgeslagen met window/capacity-validatie.
- Admin inschrijvingspagina en dashboard capaciteit-widget (
x / max_teams,VOL) toegevoegd.
- Registratiebevestiging-template toegevoegd met MVP veldcodes.
- Email template admin uitgebreid met templatekeuze, preview en placeholder-validatie.
- Outbox status +
last_errorzichtbaar gemaakt in admin.
- Score Invoer toont nu een klikbare scorelijst per event met rechter edit flip-over.
- Nieuwe knop
Initialiseer scoresmaakt ontbrekende score-records voor alle event-assignments aan en slaat bestaande records over. - Score-overzicht query gebruikt bestaande kolom
entered_by_role(fix voor omgevingen zonderchanged_bykolom).
Nieuw event aanmakenbevat nu checkbox-opties voor demo teams, alle onderdelen koppelen en planning + score-records genereren.- Demo-planning maakt automatisch timeslots en assignments aan op basis van een round-robin-achtige teamindeling.
- Initiële score-records worden direct per gegenereerde assignment aangemaakt zodat Score Invoer meteen operationeel is.
- Score Invoer ondersteunt nu jokerregistratie via checkbox in het create- en edit-paneel.
- Jokergebruik wordt server-side afgedwongen als eenmalig per team per event en vastgelegd in
joker_usages. normalized_pointswordt bij jokerinzet verdubbeld en ranking-refresh gebruikt de effectieve genormaliseerde score.
- Nieuwe CLI command
wp bso-survival seed-demo-scorestoegevoegd voor beheersimulaties. - Demo-score dataset dekt alle tijdsloten van het event; zonder
--slotworden alle tijdsloten geupdate. - Seeder is idempotent gemaakt: update-only op bestaande score-records, zonder nieuwe score-entry inserts.
- Score Invoer ondersteunt nu een numeriek veld
bonus_pointsin create/edit flip-over en in de scoregrid (inclusief sortering). - Onderdeelscore en teamscore shortcodes tonen nu bonuspunten en ondersteunen sortering op bonus.
- Bij gelijke
raw_valuebepaalt bonuspunten de onderlinge rangorde (meer bonus wint tie).
- Nieuwe adminpagina
Survival -> Toegangtoegevoegd met per-gebruiker override-profielen. - Plugin gebruikt nu eigen capabilities voor settings, toegang, scorebeheer en meldingenbeheer.
- Settings-gebonden adminpagina's en relevante REST beheeracties respecteren toegewezen survival-caps.
Survival -> Score Invoertoont nu een sorteerbareTijdsrangekolom in de scoregrid en in assignmentcontext.Survival -> Score InvoerUI differentieert rechten: scorebeheer vs volledige beheerrechten (initialisatieknop alleen voor volledige rechten).Survival -> Score Invoeredit flip-over ondersteunt nu tijdslotwissel via selecteerbare tijdsrange.[bso_survival_part_score]toont nu eenTijdsrangekolom, inclusief sorteermogelijkheid en editorcontext met range-label.[bso_survival_team_score]toont nu ook deTijdsrangeper rij.
[bso_survival_part_score]gebruikt nu assignment/tijdslot-niveau rows, zodat per tijdslot beide teams zichtbaar blijven.[bso_survival_part_score]sorteert standaard op tijdsrange en toont visuele scheiding tussen tijdslotblokken.[bso_survival_team_score]gebruikt hetzelfde rechtenafhankelijke gridgedrag als onderdeelscore (click-to-edit voor scorebeheer).[bso_survival_team_score]forceert voor tijdsrange altijd oplopende sortering (vroeg naar laat), ook bij oude URL-sortparams.
- composer install
- ./vendor/bin/phpunit
- ./vendor/bin/phpunit tests/Service/EventOverviewControllerTest.php
- ./vendor/bin/phpunit tests/Service/EventSummaryControllerTest.php
- ./vendor/bin/phpunit tests/Service/ScoringMethodRegistryTest.php
- ./vendor/bin/phpunit tests/Service/ScoringMethodsTest.php
- ./vendor/bin/phpunit tests/Service/PartRuleConfiguratorServiceTest.php
- ./vendor/bin/phpunit tests/Service/PartRuleScoringFlowTest.php
Huidige teststatus: 125/125 groen.