From 19c96e160e5795180530edc266c05e6836168e4a Mon Sep 17 00:00:00 2001 From: Conduction Release Bot Date: Sat, 15 Aug 2026 16:18:26 +0200 Subject: [PATCH 01/12] refactor(procest): translate 14 schema slugs, and the migration that moves them MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A schema slug is what OpenRegister's ImportHandler matches an incoming schema against (`SchemaMapper::findBySlugInIds()`). Changing it in the register JSON renames NOTHING: the import finds no match, creates a second schema, and every stored object stays on the old one. Nothing raises — it presents as an app with no records. So this adds `RenameDutchSchemaSlugs`, registered FIRST in post-migration, ahead of both import triggers (InitializeSettings for the procest register, RegisterOriRegister for ORI). The six ORI schemas move too. Open Raadsinformatie / VNG ODS-O is a standard, and a standard's own spelling belongs in a MAPPING — which is configuration, and out of scope for translation. A SCHEMA is English. procest has `LoadDefaultZgwMappings` for ZGW and nothing equivalent for ORI, so nothing consumes the standard's spelling from these schemas today; giving ORI a real mapping is separate work and worth doing. `bezwaar` is HELD BACK, and the reason is the interesting part. Renaming it onto `objection` produced a DUPLICATE JSON KEY. That is legal JSON: the file parsed, every check passed, and the consistency check I wrote passed too — because it read the already-deduplicated structure. Python, PHP and JS all keep the LAST key, so the `bezwaar` schema's `x-openregister-lifecycle` and `x-openregister-calculations` simply vanished. Nine tests caught it; no linter could have. **A file that parses is not a file that kept your data.** They are also not duplicates. PanelIndependenceChecker resolves `bacAdviceRequest.bezwaar -> bezwaar (lifecycle record) -> bezwaar.case -> objection (filed on that case)`, and SettingsService carries separate `bezwaar_schema` and `objection_schema` keys. Naming the lifecycle record in English is a design decision, not a translation. `rename-slugs.js` now refuses when the target is already a schema, and grew the schema-MAP-KEY pass it was missing: a slug lives in three places — the `slug` value, the `/components/schemas/` key, and the register's `configuration.schemas` key — and softwarecatalog #518 had to fix the last two by hand. `subsidieaanvraag` is deferred: the property should become `grantApplication`, but a seed caseType carries `subsidieaanvraag` as its `identifier` VALUE, which other cases reference. The applier refused it for the wrong reason (it saw an object slug) and was right to. Verified against a control built with `git archive origin/development`: PHPUnit 1926 vs 1921 tests (+5 new), identical 4 errors and 2 failures, none unique to this change. phpstan clean, psalm "No errors found", phpmd clean, 0 phpcs errors on the new files, 386 routes resolve, vitest 349, eslint 0 errors, l10n and manifest pass, no duplicate JSON keys anywhere, no dangling $refs, no key/slug mismatches, stale field references unchanged at 11. Dutch names 18 -> 7. --- appinfo/info.xml | 12 + lib/Controller/ContactMomentController.php | 2 +- lib/Controller/DwangsomController.php | 2 +- lib/Controller/NoticeOfDefaultController.php | 2 +- lib/Controller/ParafeerActieController.php | 4 +- .../ParaferingAuditExportController.php | 4 +- .../RaadsinformatieFeedController.php | 20 +- lib/Cron/OriDataQualityCheck.php | 42 +- .../ApprovalStepNotificationListener.php | 2 +- lib/Listener/ParaferingAuditListener.php | 4 +- lib/Repair/LoadDefaultZgwMappings.php | 42 +- lib/Repair/RenameDutchColumns.php | 14 + lib/Repair/RenameDutchSchemaSlugDecisions.php | 108 ++++ lib/Repair/RenameDutchSchemaSlugs.php | 235 ++++++++ lib/Service/AdviceDelegationService.php | 2 +- lib/Service/BerichtenboxRoutingService.php | 6 +- lib/Service/BesluitvormingParafeerService.php | 6 +- lib/Service/ContactMomentService.php | 4 +- lib/Service/DeadlineExtensionService.php | 2 +- lib/Service/DwangsomBezwaarService.php | 6 +- lib/Service/DwangsomCalculationService.php | 4 +- lib/Service/DwangsomUitbetalingService.php | 2 +- lib/Service/NoticeOfDefaultService.php | 16 +- lib/Service/NotificatieService.php | 8 +- .../Parafeer/ParaferingActionMapper.php | 2 +- lib/Service/ParafeerActieService.php | 28 +- lib/Service/ParafeerRouteService.php | 10 +- lib/Service/Parafering/AuditTrailService.php | 4 +- lib/Service/ParaferingApprovalBridge.php | 10 +- lib/Service/ParaferingNotificationService.php | 12 +- lib/Service/Settings/SchemaSlugMap.php | 14 +- lib/Service/TermijnNotificationService.php | 4 +- lib/Service/TermijnService.php | 4 +- .../BesluitvormingActivateHandler.php | 4 +- lib/Service/VergaderingCaseService.php | 16 +- lib/Service/ZgwMappingService.php | 4 +- lib/Service/ZgwService.php | 4 +- lib/Settings/ori_register.json | 544 +++++++++--------- lib/Settings/procest_register.json | 44 +- lib/Settings/register.d/30-beschikking.json | 4 +- lib/Settings/register.d/40-kcc-werkplek.json | 4 +- .../register.d/50-sociaal-domein.json | 42 +- .../register.d/60-termijnbewaking.json | 50 +- src/dialogs/BesluitRegistration.vue | 10 +- src/dialogs/ParafeerActieDialog.vue | 4 +- src/dialogs/VoorstelCreateDialog.vue | 6 +- src/manifest.json | 8 +- src/services/parafeerActieApi.js | 4 +- src/store/store.js | 2 +- .../besluitvorming/VergaderingDetailView.vue | 4 +- .../components/BeschikkingDetailView.vue | 4 +- .../cases/components/VoorstellenPanel.vue | 2 +- src/views/voorstellen/VoorstelDetail.vue | 60 +- .../components/ParafeerActionBar.vue | 40 +- .../voorstellen/components/ParafeerInbox.vue | 2 +- .../Unit/Lifecycle/VoorstelLifecycleTest.php | 2 +- .../ApprovalStepNotificationListenerTest.php | 2 +- .../Listener/ParaferingAuditListenerTest.php | 8 +- .../RenameDutchSchemaSlugDecisionsTest.php | 162 ++++++ .../BerichtenboxRoutingServiceTest.php | 6 +- .../Service/DeadlineDailyScanServiceTest.php | 30 +- .../DeadlineMonitoringEndToEndTest.php | 26 +- .../DeadlineMonitoringSeedDataServiceTest.php | 10 +- .../DeadlinePauseExtensionServiceTest.php | 6 +- .../Service/DeadlineReportingServiceTest.php | 4 +- .../Service/DwangsomBezwaarServiceTest.php | 12 +- .../DwangsomCalculationServiceTest.php | 48 +- .../DwangsomUitbetalingServiceTest.php | 10 +- .../Service/NoticeOfDefaultServiceTest.php | 40 +- .../RemainingDecisionDelegationTest.php | 2 +- .../TermijnNotificationServiceTest.php | 6 +- tests/Unit/Service/TermijnServiceTest.php | 28 +- .../Service/VergaderingCaseServiceTest.php | 8 +- tests/Unit/Service/WorkQueueServiceTest.php | 4 +- .../BezwaarCalculationRegistryTest.php | 8 +- .../Settings/SociaalDomeinFragmentTest.php | 14 +- tests/Unit/Settings/SubsidieFragmentTest.php | 2 +- .../parafering-audit-via-or.spec.ts | 2 +- tests/vitest/searchableSchemas.spec.js | 6 +- 79 files changed, 1238 insertions(+), 707 deletions(-) create mode 100644 lib/Repair/RenameDutchSchemaSlugDecisions.php create mode 100644 lib/Repair/RenameDutchSchemaSlugs.php create mode 100644 tests/Unit/Repair/RenameDutchSchemaSlugDecisionsTest.php diff --git a/appinfo/info.xml b/appinfo/info.xml index ee8273820..e74b1c535 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -120,6 +120,18 @@ Vrij en open source onder de EUPL-1.2-licentie. + + OCA\Procest\Repair\RenameDutchSchemaSlugs OCA\Procest\Repair\InitializeSettings OCA\Procest\Repair\LoadDefaultZgwMappings OCA\Procest\Repair\SeedBezwaarBeroepData diff --git a/lib/Controller/ContactMomentController.php b/lib/Controller/ContactMomentController.php index 54e1221e7..044f11b8b 100644 --- a/lib/Controller/ContactMomentController.php +++ b/lib/Controller/ContactMomentController.php @@ -98,7 +98,7 @@ public function create(): JSONResponse { } $data = [ - 'kanaal' => (string)$this->request->getParam('kanaal', ''), + 'notificationChannel' => (string)$this->request->getParam('notificationChannel', ''), 'direction' => (string)$this->request->getParam('direction', 'inbound'), 'callerIdentification' => (string)$this->request->getParam('callerIdentification', ''), 'nature' => (string)$this->request->getParam('nature', 'informatieverzoek'), diff --git a/lib/Controller/DwangsomController.php b/lib/Controller/DwangsomController.php index 9e18a8c2c..8c7dc3c49 100644 --- a/lib/Controller/DwangsomController.php +++ b/lib/Controller/DwangsomController.php @@ -109,7 +109,7 @@ private function denyUnlessMayAccess(string $calculationId, bool $mutation): ?JS $caseId = $this->owningCase->resolveVia( objectId: $calculationId, schemaKey: 'dwangsom_berekening_schema', - linkField: 'termijnInstance', + linkField: 'deadlineInstance', viaSchemaKey: 'termijn_instance_schema', caseField: 'case' ); diff --git a/lib/Controller/NoticeOfDefaultController.php b/lib/Controller/NoticeOfDefaultController.php index f628bf9ed..a8b8ae0a9 100644 --- a/lib/Controller/NoticeOfDefaultController.php +++ b/lib/Controller/NoticeOfDefaultController.php @@ -101,7 +101,7 @@ public function register(): JSONResponse { } $instanceId = (string)($body['termijnInstanceId'] ?? ''); - $channel = (string)($body['kanaal'] ?? ''); + $channel = (string)($body['notificationChannel'] ?? ''); $whenStr = (string)($body['receiptDate'] ?? ''); $documentLink = (string)($body['documentLink'] ?? ''); if ($instanceId === '' || $channel === '' || $whenStr === '') { diff --git a/lib/Controller/ParafeerActieController.php b/lib/Controller/ParafeerActieController.php index fb356f6c5..d2fca87b4 100644 --- a/lib/Controller/ParafeerActieController.php +++ b/lib/Controller/ParafeerActieController.php @@ -88,7 +88,7 @@ public function create(): JSONResponse { try { $data = $this->getRequestBody(); - $proposalId = (string)($data['voorstel'] ?? ''); + $proposalId = (string)($data['proposal'] ?? ''); if ($proposalId === '') { return new JSONResponse( ['message' => 'voorstel is required'], @@ -140,7 +140,7 @@ public function index(): JSONResponse { } try { - $proposalId = (string)($this->request->getParam('voorstel') ?? ''); + $proposalId = (string)($this->request->getParam('proposal') ?? ''); if ($proposalId === '') { return new JSONResponse( ['message' => 'voorstel is required'], diff --git a/lib/Controller/ParaferingAuditExportController.php b/lib/Controller/ParaferingAuditExportController.php index 901c5ad3c..20cdabb3f 100644 --- a/lib/Controller/ParaferingAuditExportController.php +++ b/lib/Controller/ParaferingAuditExportController.php @@ -130,7 +130,7 @@ public function export(string $id, string $format = 'json'): JSONResponse { } catch (Throwable $e) { $this->logger->error( 'Procest: parafering audit export failed', - ['voorstel' => $id, 'exception' => $e->getMessage()], + ['proposal' => $id, 'exception' => $e->getMessage()], ); return new JSONResponse( @@ -224,7 +224,7 @@ private function resolveProposalOnderwerp(string $proposalId): ?string { } catch (Throwable $e) { $this->logger->warning( 'Procest: failed to resolve voorstel onderwerp for export', - ['voorstel' => $proposalId, 'exception' => $e->getMessage()], + ['proposal' => $proposalId, 'exception' => $e->getMessage()], ); return null; diff --git a/lib/Controller/RaadsinformatieFeedController.php b/lib/Controller/RaadsinformatieFeedController.php index 48816d07a..222a18e62 100644 --- a/lib/Controller/RaadsinformatieFeedController.php +++ b/lib/Controller/RaadsinformatieFeedController.php @@ -100,7 +100,7 @@ public function __construct( public function vergaderingen(string $organisation = ''): DataDisplayResponse { return $this->buildFeed( type: 'vergaderingen', - schema: 'vergadering', + schema: 'meeting', organisation: $organisation ); @@ -121,7 +121,7 @@ public function vergaderingen(string $organisation = ''): DataDisplayResponse { public function agendapunten(string $organisation = ''): DataDisplayResponse { return $this->buildFeed( type: 'agendapunten', - schema: 'agendapunt', + schema: 'agendaItem', organisation: $organisation ); @@ -142,7 +142,7 @@ public function agendapunten(string $organisation = ''): DataDisplayResponse { public function documenten(string $organisation = ''): DataDisplayResponse { return $this->buildFeed( type: 'documenten', - schema: 'raadsdocument', + schema: 'councilDocument', organisation: $organisation ); @@ -172,7 +172,7 @@ private function buildFeed(string $type, string $schema, string $organisation): /** * Fetch the latest objects for the given schema from the ORI register. * - * @param string $schema The ORI schema slug (e.g. "vergadering") + * @param string $schema The ORI schema slug (e.g. "meeting") * @param string $organisation Optional organisatie filter * * @return array Array of object arrays @@ -279,9 +279,9 @@ private function renderEntry(string $schema, array $object): string { */ private function extractTitle(string $schema, array $object): string { return match ($schema) { - 'vergadering' => (string)($object['name'] ?? ''), - 'agendapunt' => (string)($object['subject'] ?? ''), - 'raadsdocument' => (string)($object['title'] ?? ''), + 'meeting' => (string)($object['name'] ?? ''), + 'agendaItem' => (string)($object['subject'] ?? ''), + 'councilDocument' => (string)($object['title'] ?? ''), default => (string)($object['name'] ?? ($object['titel'] ?? $schema)), }; @@ -296,7 +296,7 @@ private function extractTitle(string $schema, array $object): string { * @return string Summary string */ private function extractSummary(string $schema, array $object): string { - if ($schema === 'vergadering') { + if ($schema === 'meeting') { $parts = []; if (empty($object['startDate']) === false) { $parts[] = 'Datum: ' . $object['startDate']; @@ -313,11 +313,11 @@ private function extractSummary(string $schema, array $object): string { return implode(separator: ' | ', array: $parts); } - if ($schema === 'agendapunt') { + if ($schema === 'agendaItem') { return (string)($object['omschrijving'] ?? ''); } - if ($schema === 'raadsdocument') { + if ($schema === 'councilDocument') { $parts = []; if (empty($object['type']) === false) { $parts[] = 'Type: ' . $object['type']; diff --git a/lib/Cron/OriDataQualityCheck.php b/lib/Cron/OriDataQualityCheck.php index 5101827bb..a1130609a 100644 --- a/lib/Cron/OriDataQualityCheck.php +++ b/lib/Cron/OriDataQualityCheck.php @@ -123,7 +123,7 @@ private function checkVergaderingenQuality(object $objectService): array { $vergaderingen = $this->searchObjectsAsArrays( objectService: $objectService, register: 'ori', - schema: 'vergadering', + schema: 'meeting', filters: ['_limit' => 500] ); } catch (\Throwable $e) { @@ -139,7 +139,7 @@ private function checkVergaderingenQuality(object $objectService): array { if (empty($v['location']) === true) { $issues[] = [ - 'schema' => 'vergadering', + 'schema' => 'meeting', 'slug' => $slug, 'field' => 'location', 'severity' => 'warning', @@ -165,7 +165,7 @@ private function checkAgendapuntenReferenceIntegrity(object $objectService): arr $agendapunten = $this->searchObjectsAsArrays( objectService: $objectService, register: 'ori', - schema: 'agendapunt', + schema: 'agendaItem', filters: ['_limit' => 1000] ); } catch (\Throwable $e) { @@ -178,35 +178,35 @@ private function checkAgendapuntenReferenceIntegrity(object $objectService): arr foreach ($agendapunten as $ap) { $apSlug = (string)($ap['@self']['slug'] ?? ($ap['id'] ?? '?')); - $vergaderingRef = (string)($ap['vergadering'] ?? ''); + $vergaderingRef = (string)($ap['meeting'] ?? ''); if (empty($vergaderingRef) === true) { continue; } try { - $vergadering = $this->findObjectAsArray( + $meeting = $this->findObjectAsArray( objectService: $objectService, register: 'ori', - schema: 'vergadering', + schema: 'meeting', id: $vergaderingRef ); - if ($vergadering === null) { + if ($meeting === null) { $issues[] = [ - 'schema' => 'agendapunt', + 'schema' => 'agendaItem', 'slug' => $apSlug, - 'field' => 'vergadering', + 'field' => 'meeting', 'severity' => 'warning', - 'message' => 'Agendapunt references non-existent vergadering: ' . $vergaderingRef, + 'message' => 'Agendapunt references non-existent meeting: ' . $vergaderingRef, ]; } } catch (\Throwable $e) { // Reference resolution failure; log as issue. $issues[] = [ - 'schema' => 'agendapunt', + 'schema' => 'agendaItem', 'slug' => $apSlug, - 'field' => 'vergadering', + 'field' => 'meeting', 'severity' => 'warning', 'message' => 'Agendapunt vergadering reference could not be resolved: ' . $vergaderingRef, ]; @@ -230,7 +230,7 @@ private function checkRaadsledenReferenceIntegrity(object $objectService): array $raadsleden = $this->searchObjectsAsArrays( objectService: $objectService, register: 'ori', - schema: 'raadslid', + schema: 'councilMember', filters: ['_limit' => 500] ); } catch (\Throwable $e) { @@ -239,7 +239,7 @@ private function checkRaadsledenReferenceIntegrity(object $objectService): array foreach ($raadsleden as $rl) { $rlSlug = (string)($rl['@self']['slug'] ?? ($rl['id'] ?? '?')); - $politicalGroupRef = (string)($rl['fractie'] ?? ''); + $politicalGroupRef = (string)($rl['politicalGroup'] ?? ''); if (empty($politicalGroupRef) === true) { continue; @@ -249,17 +249,17 @@ private function checkRaadsledenReferenceIntegrity(object $objectService): array $politicalGroup = $this->findObjectAsArray( objectService: $objectService, register: 'ori', - schema: 'fractie', + schema: 'politicalGroup', id: $politicalGroupRef ); if ($politicalGroup === null) { $issues[] = [ - 'schema' => 'raadslid', + 'schema' => 'councilMember', 'slug' => $rlSlug, - 'field' => 'fractie', + 'field' => 'politicalGroup', 'severity' => 'warning', - 'message' => 'Raadslid references non-existent fractie: ' . $politicalGroupRef, + 'message' => 'Raadslid references non-existent politicalGroup: ' . $politicalGroupRef, ]; } } catch (\Throwable $e) { @@ -284,13 +284,13 @@ private function checkOrphanedDocumenten(object $objectService): array { $documenten = $this->searchObjectsAsArrays( objectService: $objectService, register: 'ori', - schema: 'raadsdocument', + schema: 'councilDocument', filters: ['_limit' => 500] ); $agendapunten = $this->searchObjectsAsArrays( objectService: $objectService, register: 'ori', - schema: 'agendapunt', + schema: 'agendaItem', filters: ['_limit' => 1000] ); } catch (\Throwable $e) { @@ -312,7 +312,7 @@ private function checkOrphanedDocumenten(object $objectService): array { $slug = (string)($doc['@self']['slug'] ?? ($doc['id'] ?? '?')); if (isset($referenced[$slug]) === false) { $issues[] = [ - 'schema' => 'raadsdocument', + 'schema' => 'councilDocument', 'slug' => $slug, 'field' => 'attachments', 'severity' => 'info', diff --git a/lib/Listener/ApprovalStepNotificationListener.php b/lib/Listener/ApprovalStepNotificationListener.php index bd0be0115..58e52bdfd 100644 --- a/lib/Listener/ApprovalStepNotificationListener.php +++ b/lib/Listener/ApprovalStepNotificationListener.php @@ -223,7 +223,7 @@ private function loadProposal(string $objectUuid): array { } catch (Throwable $e) { $this->logger->warning( 'Procest: could not load voorstel for approval notification', - ['voorstel' => $objectUuid, 'exception' => $e->getMessage()] + ['proposal' => $objectUuid, 'exception' => $e->getMessage()] ); } diff --git a/lib/Listener/ParaferingAuditListener.php b/lib/Listener/ParaferingAuditListener.php index 9f1a1a70c..423d15852 100644 --- a/lib/Listener/ParaferingAuditListener.php +++ b/lib/Listener/ParaferingAuditListener.php @@ -84,7 +84,7 @@ public function handle(Event $event): void { if ($object === null) { $this->logger->warning( 'Procest: ParaferingAuditListener could not resolve voorstel ObjectEntity; audit entry skipped', - ['voorstel' => $event->getVoorstelId()], + ['proposal' => $event->getVoorstelId()], ); return; } @@ -104,7 +104,7 @@ public function handle(Event $event): void { $this->logger->error( 'Procest: ParaferingAuditListener failed', [ - 'voorstel' => $event->getVoorstelId(), + 'proposal' => $event->getVoorstelId(), 'action' => $event->getAction(), 'exception' => $e->getMessage(), ], diff --git a/lib/Repair/LoadDefaultZgwMappings.php b/lib/Repair/LoadDefaultZgwMappings.php index dfd742a24..5a9b8163e 100644 --- a/lib/Repair/LoadDefaultZgwMappings.php +++ b/lib/Repair/LoadDefaultZgwMappings.php @@ -192,7 +192,7 @@ public function getDefaultMappings(string $registerId): array { $settings = $this->settingsService->getSettings(); return [ - 'catalogus' => $this->getCatalogusMapping( + 'catalog' => $this->getCatalogusMapping( registerId: $registerId, settings: $settings ), @@ -285,7 +285,7 @@ public function getDefaultMappings(string $registerId): array { settings: $settings ), 'applicatie' => $this->getApplicatieMapping(), - 'kanaal' => $this->getChannelMapping( + 'notificationChannel' => $this->getChannelMapping( registerId: $registerId, settings: $settings ), @@ -443,10 +443,10 @@ private function getCaseTypeMapping(string $registerId, array $settings): array 'identificatie' => '{{ identifier }}', 'omschrijving' => '{{ title }}', 'omschrijvingGeneriek' => '{{ description }}', - 'catalogus' => $this->tplUrl( + 'catalog' => $this->tplUrl( from: 'catalogi/zaaktypen', to: 'catalogi/catalogussen', - varName: 'catalogus' + varName: 'catalog' ), 'doel' => '{{ purpose }}', 'aanleiding' => '{{ trigger }}', @@ -475,7 +475,7 @@ private function getCaseTypeMapping(string $registerId, array $settings): array 'title' => '{{ omschrijving }}', 'description' => '{{ omschrijvingGeneriek }}', 'identifier' => '{{ identificatie }}', - 'catalogus' => '{{ catalogus | zgw_extract_uuid }}', + 'catalog' => '{{ catalogus | zgw_extract_uuid }}', 'purpose' => '{{ doel }}', 'trigger' => '{{ aanleiding }}', 'subject' => '{{ onderwerp }}', @@ -519,8 +519,8 @@ private function getCaseTypeMapping(string $registerId, array $settings): array 'identificatie' => [ 'field' => 'identifier', ], - 'catalogus' => [ - 'field' => 'catalogus', + 'catalog' => [ + 'field' => 'catalog', 'extractUuid' => true, ], ], @@ -954,10 +954,10 @@ private function getDecisionTypeMapping(string $registerId, array $settings): ar 'uuid' => '{{ _uuid }}', 'omschrijving' => '{{ name }}', 'notes' => '{{ description }}', - 'catalogus' => $this->tplUrl( + 'catalog' => $this->tplUrl( from: 'catalogi/besluittypen', to: 'catalogi/catalogussen', - varName: 'catalogus' + varName: 'catalog' ), 'zaaktypen' => 'caseTypes', 'concept' => '{{ isDraft }}', @@ -969,7 +969,7 @@ private function getDecisionTypeMapping(string $registerId, array $settings): ar 'reverseMapping' => [ 'name' => '{{ omschrijving }}', 'description' => '{{ toelichting }}', - 'catalogus' => '{{ catalogus | zgw_extract_uuid }}', + 'catalog' => '{{ catalogus | zgw_extract_uuid }}', 'isDraft' => '{{ concept }}', 'publicationRequired' => '{{ publicatieIndicatie }}', 'caseTypes' => 'zaaktypen', @@ -991,8 +991,8 @@ private function getDecisionTypeMapping(string $registerId, array $settings): ar 'field' => 'caseType', 'extractUuid' => true, ], - 'catalogus' => [ - 'field' => 'catalogus', + 'catalog' => [ + 'field' => 'catalog', 'extractUuid' => true, ], 'omschrijving' => [ @@ -1022,10 +1022,10 @@ private function getInformatieObjectTypeMapping(string $registerId, array $setti 'uuid' => '{{ _uuid }}', 'omschrijving' => '{{ name }}', 'notes' => '{{ description }}', - 'catalogus' => $this->tplUrl( + 'catalog' => $this->tplUrl( from: 'catalogi/informatieobjecttypen', to: 'catalogi/catalogussen', - varName: 'catalogus' + varName: 'catalog' ), 'concept' => '{{ isDraft }}', 'vertrouwelijkheidaanduiding' => '{{ confidentiality }}', @@ -1037,7 +1037,7 @@ private function getInformatieObjectTypeMapping(string $registerId, array $setti 'reverseMapping' => [ 'name' => '{{ omschrijving }}', 'description' => '{{ toelichting }}', - 'catalogus' => '{{ catalogus | zgw_extract_uuid }}', + 'catalog' => '{{ catalogus | zgw_extract_uuid }}', 'isDraft' => '{{ concept }}', 'confidentiality' => '{{ vertrouwelijkheidaanduiding }}', 'category' => '{{ informatieobjectcategorie }}', @@ -1055,8 +1055,8 @@ private function getInformatieObjectTypeMapping(string $registerId, array $setti ], 'valueMapping' => [], 'queryParameterMapping' => [ - 'catalogus' => [ - 'field' => 'catalogus', + 'catalog' => [ + 'field' => 'catalog', 'extractUuid' => true, ], ], @@ -1261,7 +1261,7 @@ private function getGebruiksrechtenMapping( */ private function getChannelMapping(string $registerId, array $settings): array { return [ - 'zgwResource' => 'kanaal', + 'zgwResource' => 'notificationChannel', 'zgwApiVersion' => '1', 'sourceRegister' => $registerId, 'sourceSchema' => ($settings['kanaal_schema'] ?? ''), @@ -1335,7 +1335,7 @@ private function getAbonnementMapping(string $registerId, array $settings): arra */ private function getCatalogusMapping(string $registerId, array $settings): array { return [ - 'zgwResource' => 'catalogus', + 'zgwResource' => 'catalog', 'zgwApiVersion' => '1', 'sourceRegister' => $registerId, 'sourceSchema' => ($settings['catalogus_schema'] ?? ''), @@ -1565,7 +1565,7 @@ private function getDefaultApplicaties(): array { */ private function createDefaultKanalen(IOutput $output): void { $channelMapping = $this->zgwMappingService->getMapping( - resourceKey: 'kanaal' + resourceKey: 'notificationChannel' ); if ($channelMapping === null) { $output->info('Kanaal mapping not configured. Skipping default channels.'); @@ -1814,7 +1814,7 @@ private function getKlantcontactMapping(string $registerId, array $settings): ar varName: 'case' ), 'datumtijd' => '{{ contactDateTime }}', - 'kanaal' => '{{ channel }}', + 'notificationChannel' => '{{ channel }}', 'subject' => '{{ subject }}', 'initiator' => '{{ initiator }}', ], diff --git a/lib/Repair/RenameDutchColumns.php b/lib/Repair/RenameDutchColumns.php index 374c0ef2b..f70ee8959 100644 --- a/lib/Repair/RenameDutchColumns.php +++ b/lib/Repair/RenameDutchColumns.php @@ -539,6 +539,20 @@ class RenameDutchColumns implements IRepairStep { 'wachtwoord_kluis_ref' => 'password_vault_ref', 'zaak_identificatie' => 'case_identification', 'zaak_identificatie_strategie' => 'case_identification_strategy', + 'agendapunt' => 'agenda_item', + 'avg_classificatie' => 'gdpr_classification', + 'catalogus' => 'catalog', + 'dwangsom_berekening' => 'penalty_payment_calculation', + 'fractie' => 'political_group', + 'ingebrekestelling' => 'notice_of_default', + 'kanaal' => 'notification_channel', + 'raadsdocument' => 'council_document', + 'raadslid' => 'council_member', + 'stemming' => 'vote', + 'termijn_definitie' => 'deadline_definition', + 'termijn_instance' => 'deadline_instance', + 'vergadering' => 'meeting', + 'voorstel' => 'proposal', ]; /** diff --git a/lib/Repair/RenameDutchSchemaSlugDecisions.php b/lib/Repair/RenameDutchSchemaSlugDecisions.php new file mode 100644 index 000000000..e6ac10996 --- /dev/null +++ b/lib/Repair/RenameDutchSchemaSlugDecisions.php @@ -0,0 +1,108 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * @link https://www.conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Procest\Repair; + +/** + * Pure predicates for the Dutch-to-English schema slug migration. + */ +class RenameDutchSchemaSlugDecisions { + + /** + * Decide which slugs may be renamed, given what the install actually holds. + * + * Returns the renames in the order they must be applied, plus the ones + * refused and why. Two schemas cannot share a slug, so a target that is + * already present means BOTH are left alone: merging them is a decision + * about data, not a rename. + * + * The `$existing` set is updated as it goes, so a rename earlier in the map + * is visible to the collision check of a later one — otherwise two entries + * targeting the same name would both look safe. + * + * @param array $map Old slug => new slug. + * @param array $existing Slugs currently present. + * + * @return array{renames: array, refused: array} + */ + public function plan(array $map, array $existing): array { + $renames = []; + $refused = []; + + foreach ($map as $old => $new) { + if (in_array($old, $existing, true) === false) { + // Not on this install — not a refusal, just nothing to do. + continue; + } + + if (in_array($new, $existing, true) === true) { + $refused[$old] = sprintf("target slug '%s' already exists", $new); + continue; + } + + $renames[$old] = $new; + $existing[] = $new; + } + + return [ + 'renames' => $renames, + 'refused' => $refused, + ]; + }//end plan() + + /** + * Pull the schema ids out of the registers' `schemas` JSON column. + * + * The column is JSON, and a register row can carry null, a malformed value + * or a list with non-numeric entries. Every one of those must yield "no ids" + * rather than a fatal, because this runs inside a repair step where an + * exception aborts the upgrade. + * + * @param array> $rows Register rows. + * + * @return array Distinct schema ids. + */ + public function schemaIdsFrom(array $rows): array { + $ids = []; + + foreach ($rows as $row) { + $decoded = json_decode((string)($row['schemas'] ?? '[]'), true); + if (is_array($decoded) === false) { + continue; + } + + foreach ($decoded as $id) { + if (is_numeric($id) === true) { + $ids[] = (int)$id; + } + } + } + + return array_values(array_unique($ids)); + }//end schemaIdsFrom() + +}//end class diff --git a/lib/Repair/RenameDutchSchemaSlugs.php b/lib/Repair/RenameDutchSchemaSlugs.php new file mode 100644 index 000000000..bce6b01e9 --- /dev/null +++ b/lib/Repair/RenameDutchSchemaSlugs.php @@ -0,0 +1,235 @@ + bezwaar (lifecycle + * record) -> bezwaar.case -> objection (filed on that case)`, and SettingsService + * carries separate `bezwaar_schema` and `objection_schema` keys. Naming the + * lifecycle record in English is a design decision, not a translation. + * + * @category Repair + * @package OCA\Procest\Repair + * @author Conduction Development Team + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * @link https://procest.nl + * + * SPDX-License-Identifier: EUPL-1.2 + * SPDX-FileCopyrightText: 2026 Conduction B.V. + */ + +declare(strict_types=1); + +namespace OCA\Procest\Repair; + +use OCP\DB\Exception; +use OCP\IDBConnection; +use OCP\Migration\IOutput; +use OCP\Migration\IRepairStep; +use Psr\Log\LoggerInterface; + +/** + * Renames Dutch schema slugs on the rows the import will match against. + */ +class RenameDutchSchemaSlugs implements IRepairStep { + + /** + * Old slug => new slug, for schemas this app owns. + * + * Targets are read off each schema's own English title where it had one: + * `catalogus` was already titled "Catalog", `voorstel` "Proposal", `kanaal` + * "Notification Channel". + * + * The six `ori` schemas are the Open Raadsinformatie / VNG ODS-O standard's + * vocabulary. They are renamed because a SCHEMA is English; the standard's + * own spelling belongs in a MAPPING, which is configuration. procest has no + * ORI mapping yet — it has `LoadDefaultZgwMappings` for ZGW and nothing + * equivalent for ORI — so nothing consumes the standard's spelling from + * these schemas today. + * + * @var array + */ + public const SLUG_MAP = [ + 'agendapunt' => 'agendaItem', + 'avgClassificatie' => 'gdprClassification', + 'catalogus' => 'catalog', + 'dwangsomBerekening' => 'penaltyPaymentCalculation', + 'fractie' => 'politicalGroup', + 'ingebrekestelling' => 'noticeOfDefault', + 'kanaal' => 'notificationChannel', + 'raadsdocument' => 'councilDocument', + 'raadslid' => 'councilMember', + 'stemming' => 'vote', + 'termijnDefinitie' => 'deadlineDefinition', + 'termijnInstance' => 'deadlineInstance', + 'vergadering' => 'meeting', + 'voorstel' => 'proposal', + ]; + + /** + * Registers whose schemas are in scope. + * + * @var array + */ + private const REGISTER_SLUGS = ['procest', 'ori']; + + /** + * Constructor. + * + * @param IDBConnection $db Database connection. + * @param LoggerInterface $logger Logger. + * @param RenameDutchSchemaSlugDecisions $decisions The pure predicates. + */ + public function __construct( + private readonly IDBConnection $db, + private readonly LoggerInterface $logger, + private readonly RenameDutchSchemaSlugDecisions $decisions = new RenameDutchSchemaSlugDecisions(), + ) { + }//end __construct() + + /** + * Step name shown by `occ maintenance:repair`. + * + * @return string + */ + public function getName(): string { + return 'Rename Dutch Procest schema slugs'; + }//end getName() + + /** + * Rename the slugs on this app's existing schema rows. + * + * @param IOutput $output Repair output. + * + * @return void + */ + public function run(IOutput $output): void { + $schemaIds = $this->inScopeSchemaIds(); + if ($schemaIds === []) { + $output->info('RenameDutchSchemaSlugs: no Procest registers on this install; nothing to do.'); + return; + } + + $existing = $this->slugsOf(schemaIds: $schemaIds); + $plan = $this->decisions->plan(map: self::SLUG_MAP, existing: $existing); + + foreach ($plan['refused'] as $old => $why) { + $this->logger->warning( + 'RenameDutchSchemaSlugs: ' . $why . '; renaming neither.', + ['old' => $old] + ); + } + + $renamed = 0; + foreach ($plan['renames'] as $old => $new) { + if ($this->renameSlug(old: $old, new: $new, schemaIds: $schemaIds) === true) { + $renamed++; + } + } + + $output->info( + sprintf( + 'RenameDutchSchemaSlugs: %d slug(s) renamed, %d refused.', + $renamed, + count($plan['refused']) + ) + ); + }//end run() + + /** + * Resolve the schema ids belonging to this app's registers. + * + * @return array + */ + private function inScopeSchemaIds(): array { + $placeholders = implode(',', array_fill(0, count(self::REGISTER_SLUGS), '?')); + + try { + $rows = $this->db->executeQuery( + 'SELECT schemas FROM `*PREFIX*openregister_registers` WHERE slug IN (' . $placeholders . ')', + self::REGISTER_SLUGS + )->fetchAll(); + } catch (Exception $e) { + $this->logger->warning( + 'RenameDutchSchemaSlugs: could not resolve the registers; skipping.', + ['exception' => $e->getMessage()] + ); + return []; + } + + return $this->decisions->schemaIdsFrom(rows: $rows); + }//end inScopeSchemaIds() + + /** + * Read the slugs currently held by the given schemas. + * + * @param array $schemaIds Schema ids to read. + * + * @return array + */ + private function slugsOf(array $schemaIds): array { + $placeholders = implode(',', array_fill(0, count($schemaIds), '?')); + + try { + $rows = $this->db->executeQuery( + 'SELECT slug FROM `*PREFIX*openregister_schemas` WHERE id IN (' . $placeholders . ')', + array_map(static fn (int $id): string => (string)$id, $schemaIds) + )->fetchAll(); + } catch (Exception $e) { + $this->logger->warning( + 'RenameDutchSchemaSlugs: could not read schema slugs; skipping.', + ['exception' => $e->getMessage()] + ); + return []; + } + + return array_map(static fn (array $row): string => (string)$row['slug'], $rows); + }//end slugsOf() + + /** + * Rename one slug, scoped to this app's schemas. + * + * @param string $old Current slug. + * @param string $new Replacement slug. + * @param array $schemaIds Schema ids in scope. + * + * @return bool True when the row was updated. + */ + private function renameSlug(string $old, string $new, array $schemaIds): bool { + $placeholders = implode(',', array_fill(0, count($schemaIds), '?')); + + try { + $this->db->executeStatement( + 'UPDATE `*PREFIX*openregister_schemas` SET slug = ? WHERE slug = ? AND id IN (' . $placeholders . ')', + array_merge([$new, $old], array_map(static fn (int $id): string => (string)$id, $schemaIds)) + ); + } catch (Exception $e) { + $this->logger->warning( + 'RenameDutchSchemaSlugs: slug rename failed.', + ['old' => $old, 'new' => $new, 'exception' => $e->getMessage()] + ); + return false; + } + + return true; + }//end renameSlug() +}//end class diff --git a/lib/Service/AdviceDelegationService.php b/lib/Service/AdviceDelegationService.php index 652d001cf..bcb77b9f5 100644 --- a/lib/Service/AdviceDelegationService.php +++ b/lib/Service/AdviceDelegationService.php @@ -116,7 +116,7 @@ public function raiseVoorstelBesluit(string $proposalId, array $payload = []): s externalReference: (string)($payload['externalReference'] ?? $proposalId), subject: [ 'subjectRegister' => (string)($payload['subjectRegister'] ?? ''), - 'subjectSchema' => 'voorstel', + 'subjectSchema' => 'proposal', 'subjectId' => $proposalId, 'subjectLabel' => (string)($payload['subjectLabel'] ?? ($payload['title'] ?? '')), ], diff --git a/lib/Service/BerichtenboxRoutingService.php b/lib/Service/BerichtenboxRoutingService.php index 2d2874d70..0d2d46790 100644 --- a/lib/Service/BerichtenboxRoutingService.php +++ b/lib/Service/BerichtenboxRoutingService.php @@ -56,7 +56,7 @@ public function __construct( * * @param array $decision The beschikking object. * - * @return array{kanaal: string, sentOn: string, sentBy: string, messageId: string} The verzending record. + * @return array{notificationChannel: string, sentOn: string, sentBy: string, messageId: string} The verzending record. * * @spec openspec/changes/beschikking-generatie/tasks.md#T15 */ @@ -74,12 +74,12 @@ public function routeToBerichtenbox(array $decision): array { 'BerichtenboxRoutingService: beschikking gerouteerd', [ 'reference' => $reference, - 'kanaal' => $channel, + 'notificationChannel' => $channel, ], ); return [ - 'kanaal' => $channel, + 'notificationChannel' => $channel, 'sentOn' => (new DateTimeImmutable())->format('c'), 'sentBy' => 'systeem', 'messageId' => $messageId, diff --git a/lib/Service/BesluitvormingParafeerService.php b/lib/Service/BesluitvormingParafeerService.php index 4fd35cd27..8e673d9bb 100644 --- a/lib/Service/BesluitvormingParafeerService.php +++ b/lib/Service/BesluitvormingParafeerService.php @@ -120,7 +120,7 @@ public function activate(string $proposalId): array { $updated = $objectService->saveObject(object: array_merge($proposal, $updateData), register: $register, schema: $proposalSchema); $this->logger->info( - 'Besluitvorming parafering activated for voorstel: ' . $proposalId, + 'Besluitvorming parafering activated for proposal: ' . $proposalId, ['app' => Application::APP_ID] ); @@ -205,7 +205,7 @@ public function handleParaafAction(string $proposalId, string $parafeeractieId): ); $this->logger->info( - 'All parafen collected for voorstel: ' . $proposalId . ', transitioning case.', + 'All parafen collected for proposal: ' . $proposalId . ', transitioning case.', ['app' => Application::APP_ID] ); @@ -321,7 +321,7 @@ public function allParafenCollected(string $proposalId): bool { objectService: $objectService, register: $register, schema: $actionSchema, - filters: ['voorstel' => $proposalId] + filters: ['proposal' => $proposalId] ); if (empty($acties) === true) { diff --git a/lib/Service/ContactMomentService.php b/lib/Service/ContactMomentService.php index 0c7ec1eeb..add07d9bf 100644 --- a/lib/Service/ContactMomentService.php +++ b/lib/Service/ContactMomentService.php @@ -84,7 +84,7 @@ public function createContactMoment(array $data): array { $now = date('c'); $record = [ - 'kanaal' => (string)$data['kanaal'], + 'notificationChannel' => (string)$data['notificationChannel'], 'direction' => (string)($data['direction'] ?? 'inbound'), 'startTime' => (string)($data['startTime'] ?? $now), 'endTime' => ($data['endTime'] ?? null), @@ -131,7 +131,7 @@ public function createContactMoment(array $data): array { * @throws RuntimeException When a required field is missing or invalid. */ private function validateInput(array $data): void { - $channel = (string)($data['kanaal'] ?? ''); + $channel = (string)($data['notificationChannel'] ?? ''); if (in_array($channel, self::VALID_KANALEN, true) === false) { throw new RuntimeException('Invalid kanaal'); } diff --git a/lib/Service/DeadlineExtensionService.php b/lib/Service/DeadlineExtensionService.php index 93b7e82e1..3a97996b2 100644 --- a/lib/Service/DeadlineExtensionService.php +++ b/lib/Service/DeadlineExtensionService.php @@ -283,7 +283,7 @@ private function resolveExtensionContext(string $mode): array { */ private function resolveMaxExtensions(array $instance): int { // Prefer to look up the definition by the linked id. - $defId = (string)($instance['termijnDefinitie'] ?? ''); + $defId = (string)($instance['deadlineDefinition'] ?? ''); if ($defId === '') { return 1; } diff --git a/lib/Service/DwangsomBezwaarService.php b/lib/Service/DwangsomBezwaarService.php index 81764ed11..e07b73181 100644 --- a/lib/Service/DwangsomBezwaarService.php +++ b/lib/Service/DwangsomBezwaarService.php @@ -119,7 +119,7 @@ public function registerBezwaar(string $calculationId, string $basis, string $ra } // Record event on termijn. - $instanceId = (string)($calculation['termijnInstance'] ?? ''); + $instanceId = (string)($calculation['deadlineInstance'] ?? ''); if ($instanceId !== '') { $this->termService->recordEvent( termInstanceId: $instanceId, @@ -202,7 +202,7 @@ public function resolveBezwaar(string $calculationId, int $newAmountCents, strin } } - $instanceId = (string)($calculation['termijnInstance'] ?? ''); + $instanceId = (string)($calculation['deadlineInstance'] ?? ''); if ($instanceId !== '') { $this->termService->recordEvent( termInstanceId: $instanceId, @@ -268,7 +268,7 @@ private function findUitbetalingen( objectService: $objectService, register: $register, schema: $uSchema, - filters: ['dwangsomBerekening' => $calculationId] + filters: ['penaltyPaymentCalculation' => $calculationId] ); } catch (\Throwable $e) { // Lookup failures must not block the bezwaar transition. diff --git a/lib/Service/DwangsomCalculationService.php b/lib/Service/DwangsomCalculationService.php index 06dcecb08..38027855b 100644 --- a/lib/Service/DwangsomCalculationService.php +++ b/lib/Service/DwangsomCalculationService.php @@ -295,7 +295,7 @@ public function stopForBeschikking(string $calculationId): ?array { * @return int Cents. */ private function resolveCustomDailyTariff(array $calculation): int { - $instanceId = (string)($calculation['termijnInstance'] ?? ''); + $instanceId = (string)($calculation['deadlineInstance'] ?? ''); if ($instanceId === '') { return self::AWB_TIER_1_CENTS; } @@ -352,7 +352,7 @@ private function resolveTermijnDefinitieId( return ''; } - return (string)($instance['termijnDefinitie'] ?? ''); + return (string)($instance['deadlineDefinition'] ?? ''); }//end resolveTermijnDefinitieId() /** diff --git a/lib/Service/DwangsomUitbetalingService.php b/lib/Service/DwangsomUitbetalingService.php index b50f6f7c6..cb201a069 100644 --- a/lib/Service/DwangsomUitbetalingService.php +++ b/lib/Service/DwangsomUitbetalingService.php @@ -99,7 +99,7 @@ public function prepareBetaling( $uiterlijk = $receiptDate->modify('+' . self::BETALING_UITERLIJK_OFFSET_DAYS . ' days')->format('Y-m-d'); $row = [ - 'dwangsomBerekening' => $calculationId, + 'penaltyPaymentCalculation' => $calculationId, 'amount' => $final, 'accountHolderName' => $accountHolderName, 'iban' => strtoupper(str_replace(' ', '', $iban)), diff --git a/lib/Service/NoticeOfDefaultService.php b/lib/Service/NoticeOfDefaultService.php index cc9b1ef86..98487c07f 100644 --- a/lib/Service/NoticeOfDefaultService.php +++ b/lib/Service/NoticeOfDefaultService.php @@ -90,9 +90,9 @@ public function registerNoticeOfDefault( $isValid = ($status === 'overschreden' && $deadline !== '' && $deadline < $receipt); $row = [ - 'termijnInstance' => $termInstanceId, + 'deadlineInstance' => $termInstanceId, 'receiptDate' => $receipt, - 'kanaal' => $channel, + 'notificationChannel' => $channel, 'gevalideerd' => $isValid, 'documentLink' => $documentLink, ]; @@ -108,7 +108,7 @@ public function registerNoticeOfDefault( if ($isValid === false) { $this->logger->info( 'Premature ingebrekestelling rejected', - ['termijnInstance' => $termInstanceId, 'receiptDate' => $receipt] + ['deadlineInstance' => $termInstanceId, 'receiptDate' => $receipt] ); return $row; } @@ -119,13 +119,13 @@ public function registerNoticeOfDefault( if ($existing !== '') { $this->logger->info( 'Additional ingebrekestelling recorded; first remains the dwangsom basis', - ['termijnInstance' => $termInstanceId, 'firstNotice' => $existing] + ['deadlineInstance' => $termInstanceId, 'firstNotice' => $existing] ); return $row; } // First valid notice: link it and start a DwangsomBerekening. - $row['dwangsomBerekening'] = $this->startPenaltyPaymentCalculation( + $row['penaltyPaymentCalculation'] = $this->startPenaltyPaymentCalculation( termInstanceId: $termInstanceId, instance: $instance, ingebrekestellingId: (string)$row['id'], @@ -173,8 +173,8 @@ private function startPenaltyPaymentCalculation( $calculation = $this->saveSchema( schemaConfigKey: 'dwangsom_berekening_schema', object: [ - 'ingebrekestelling' => $ingebrekestellingId, - 'termijnInstance' => $termInstanceId, + 'noticeOfDefault' => $ingebrekestellingId, + 'deadlineInstance' => $termInstanceId, 'startDate' => $startAt, 'currentDag' => 0, 'dailyRate' => 0, @@ -216,7 +216,7 @@ private function startPenaltyPaymentCalculation( * @return array{plafond:int,grace:int,custom:bool,dailyTariff?:int} */ private function resolveRegime(array $instance): array { - $defId = (string)($instance['termijnDefinitie'] ?? ''); + $defId = (string)($instance['deadlineDefinition'] ?? ''); if ($defId === '') { return ['plafond' => self::TARIFF_AWB_PLAFOND, 'grace' => self::TARIFF_AWB_GRACE, 'custom' => false]; } diff --git a/lib/Service/NotificatieService.php b/lib/Service/NotificatieService.php index 62b21d387..526847e6b 100644 --- a/lib/Service/NotificatieService.php +++ b/lib/Service/NotificatieService.php @@ -121,7 +121,7 @@ public function publish( array $characteristics = [], ): void { $notification = [ - 'kanaal' => $channel, + 'notificationChannel' => $channel, 'hoofdObject' => $hoofdObject, 'resource' => $resource, 'resourceUrl' => $resourceUrl, @@ -136,7 +136,7 @@ public function publish( $this->logger->warning( 'Failed to deliver notification', [ - 'kanaal' => $channel, + 'notificationChannel' => $channel, 'action' => $action, 'exception' => $e->getMessage(), ] @@ -206,7 +206,7 @@ private function deliverToSubscription( // Check if this subscription listens to the notification channel. $matches = false; foreach ($kanalen as $channelConfig) { - if (($channelConfig['name'] ?? '') === $notification['kanaal']) { + if (($channelConfig['name'] ?? '') === $notification['notificationChannel']) { $matches = true; break; } @@ -249,7 +249,7 @@ private function deliverToSubscription( $this->logger->info( 'Notification delivered', [ - 'kanaal' => $notification['kanaal'], + 'notificationChannel' => $notification['notificationChannel'], 'callbackUrl' => $callbackUrl, ] ); diff --git a/lib/Service/Parafeer/ParaferingActionMapper.php b/lib/Service/Parafeer/ParaferingActionMapper.php index b00b61216..6aed92e70 100644 --- a/lib/Service/Parafeer/ParaferingActionMapper.php +++ b/lib/Service/Parafeer/ParaferingActionMapper.php @@ -86,7 +86,7 @@ public function parseActionInput(array $data): array { */ public function buildActieData(string $proposalId, int $stepOrder, string $actor, array $input): array { $actionData = [ - 'voorstel' => $proposalId, + 'proposal' => $proposalId, 'step' => $stepOrder, 'actor' => $actor, 'actorType' => 'user', diff --git a/lib/Service/ParafeerActieService.php b/lib/Service/ParafeerActieService.php index 9d7caf134..ea174905e 100644 --- a/lib/Service/ParafeerActieService.php +++ b/lib/Service/ParafeerActieService.php @@ -221,7 +221,7 @@ private function dispatchTransition( $this->logger->warning( 'Procest: ParafeerTransitionEvent dispatch failed', [ - 'voorstel' => $proposalId, + 'proposal' => $proposalId, 'action' => $action, 'exception' => $e->getMessage(), ], @@ -260,7 +260,7 @@ public function recordAction(string $proposalId, array $data, IUser $currentUser } catch (\Throwable $e) { $this->logger->error( 'ParafeerActieService::recordAction failed', - ['voorstel' => $proposalId, 'exception' => $e->getMessage()] + ['proposal' => $proposalId, 'exception' => $e->getMessage()] ); throw new RuntimeException('Operation failed'); }//end try @@ -342,7 +342,7 @@ private function performRecordAction(string $proposalId, array $data, IUser $cur return [ 'parafeeractie' => $this->normalizer->toArray(value: $savedAction), - 'voorstel' => ['id' => $proposalId, 'status' => self::STATUS_TERUGGESTUURD], + 'proposal' => ['id' => $proposalId, 'status' => self::STATUS_TERUGGESTUURD], ]; } @@ -366,7 +366,7 @@ private function performRecordAction(string $proposalId, array $data, IUser $cur return [ 'parafeeractie' => $this->normalizer->toArray(value: $savedAction), - 'voorstel' => $this->normalizer->toArray(value: $updatedProposal), + 'proposal' => $this->normalizer->toArray(value: $updatedProposal), ]; }//end performRecordAction() @@ -477,7 +477,7 @@ private function applyAccorderingEffects( } catch (\Throwable $e) { $this->logger->warning( 'Failed to send accordering notification to steller', - ['voorstel' => $proposalId, 'exception' => $e->getMessage()] + ['proposal' => $proposalId, 'exception' => $e->getMessage()] ); } } @@ -567,7 +567,7 @@ private function delegateToApprovalWorkflow( } catch (\Throwable $e) { $this->logger->warning( 'Procest: approval-workflow delegation failed; legacy path governs', - ['voorstel' => $proposalId, 'action' => $action, 'exception' => $e->getMessage()] + ['proposal' => $proposalId, 'action' => $action, 'exception' => $e->getMessage()] ); }//end try }//end delegateToApprovalWorkflow() @@ -593,7 +593,7 @@ public function listActions(string $proposalId): array { objectService: $objectService, register: $register, schema: $actionSchema, - filters: ['voorstel' => $proposalId, '_limit' => 500], + filters: ['proposal' => $proposalId, '_limit' => 500], ); $rows = []; @@ -617,7 +617,7 @@ static function (array $a, array $b): int { } catch (\Throwable $e) { $this->logger->error( 'ParafeerActieService::listActions failed', - ['voorstel' => $proposalId, 'exception' => $e->getMessage()] + ['proposal' => $proposalId, 'exception' => $e->getMessage()] ); return []; }//end try @@ -652,7 +652,7 @@ public function applyPdfSignature( if (count($nodes) === 0) { $this->logger->warning( 'ParafeerActieService: voorstel document not found for PDF signing', - ['voorstel' => $proposalId, 'file' => $fileId] + ['proposal' => $proposalId, 'file' => $fileId] ); return; } @@ -661,7 +661,7 @@ public function applyPdfSignature( if (($file instanceof File) === false) { $this->logger->warning( 'ParafeerActieService: voorstel node is not a writable file', - ['voorstel' => $proposalId, 'file' => $fileId] + ['proposal' => $proposalId, 'file' => $fileId] ); return; } @@ -684,7 +684,7 @@ public function applyPdfSignature( $this->logger->info( 'ParafeerActieService: PDF signature annotation applied', [ - 'voorstel' => $proposalId, + 'proposal' => $proposalId, 'file' => $fileId, 'actor' => $actor->getUID(), ] @@ -692,12 +692,12 @@ public function applyPdfSignature( } catch (NotFoundException $e) { $this->logger->warning( 'ParafeerActieService: PDF signing skipped — file not found', - ['voorstel' => $proposalId, 'file' => $fileId] + ['proposal' => $proposalId, 'file' => $fileId] ); } catch (\Throwable $e) { $this->logger->warning( 'ParafeerActieService: PDF signature could not be applied', - ['voorstel' => $proposalId, 'file' => $fileId, 'exception' => $e->getMessage()] + ['proposal' => $proposalId, 'file' => $fileId, 'exception' => $e->getMessage()] ); }//end try }//end applyPdfSignature() @@ -746,7 +746,7 @@ private function handleReturn( } catch (\Throwable $e) { $this->logger->warning( 'Failed to send teruggestuurd notification', - ['voorstel' => $proposalId, 'exception' => $e->getMessage()] + ['proposal' => $proposalId, 'exception' => $e->getMessage()] ); } } diff --git a/lib/Service/ParafeerRouteService.php b/lib/Service/ParafeerRouteService.php index 16be502f0..9e5d76f63 100644 --- a/lib/Service/ParafeerRouteService.php +++ b/lib/Service/ParafeerRouteService.php @@ -142,7 +142,7 @@ private function dispatchTransition( $this->logger->warning( 'Procest: ParafeerTransitionEvent dispatch failed', [ - 'voorstel' => $proposalId, + 'proposal' => $proposalId, 'action' => $action, 'exception' => $e->getMessage(), ], @@ -243,7 +243,7 @@ private function createApprovalChain(string $voorstelUuid, array $route, array $ } catch (Throwable $e) { $this->logger->warning( 'Procest: ApprovalChain creation failed, falling back to in-array routing', - ['voorstel' => $voorstelUuid, 'exception' => $e->getMessage()] + ['proposal' => $voorstelUuid, 'exception' => $e->getMessage()] ); return null; } @@ -281,7 +281,7 @@ public function completeStep(string $proposalId, array $actionData): array { } $actieData = [ - 'voorstel' => $proposal['id'] ?? $proposal['uuid'] ?? $proposalId, + 'proposal' => $proposal['id'] ?? $proposal['uuid'] ?? $proposalId, 'step' => $currentStep, 'actor' => $this->requireUserId(), 'actorType' => (string)($actionData['actorType'] ?? 'user'), @@ -372,7 +372,7 @@ public function skipStep(string $proposalId, int $step, string $reason): array { $objectService->saveObject( object: [ - 'voorstel' => $proposal['id'] ?? $proposal['uuid'] ?? $proposalId, + 'proposal' => $proposal['id'] ?? $proposal['uuid'] ?? $proposalId, 'step' => $step, 'actor' => $userId, 'actorType' => 'user', @@ -532,7 +532,7 @@ public function addAdhocStep(string $proposalId, int $afterStep, array $stepData }//end addAdhocStep() /** - * Advance the voorstel: either activate the next step or mark geaccordeerd. + * Advance the proposal: either activate the next step or mark geaccordeerd. * * @param object $objectService The OpenRegister ObjectService * @param string $register The register slug/UUID diff --git a/lib/Service/Parafering/AuditTrailService.php b/lib/Service/Parafering/AuditTrailService.php index 64d0f9ed3..b0029d4e8 100644 --- a/lib/Service/Parafering/AuditTrailService.php +++ b/lib/Service/Parafering/AuditTrailService.php @@ -93,7 +93,7 @@ public function export(string $proposalId, string $proposalOnderwerp, string $ex objectService: $objectService, register: $register, schema: $schema, - filters: ['voorstel' => $proposalId, '_limit' => 5000], + filters: ['proposal' => $proposalId, '_limit' => 5000], ); $entries = []; @@ -131,7 +131,7 @@ static function (array $a, array $b): int { 'exportedAt' => (new DateTimeImmutable('now')) ->setTimezone(new DateTimeZone('UTC')) ->format('Y-m-d\TH:i:s\Z'), - 'voorstel' => $proposalId, + 'proposal' => $proposalId, 'voorstelOnderwerp' => $proposalOnderwerp, 'retentionUntil' => $retentionUntil, 'selectielijstCategory' => $selectielijst, diff --git a/lib/Service/ParaferingApprovalBridge.php b/lib/Service/ParaferingApprovalBridge.php index df05135dc..c07edca59 100644 --- a/lib/Service/ParaferingApprovalBridge.php +++ b/lib/Service/ParaferingApprovalBridge.php @@ -141,14 +141,14 @@ public function initializeChainForVoorstel(string $voorstelUuid, string $name, a $chainUuid = (string)($chain->getUuid() ?? ''); $this->logger->info( 'Procest: parafering ApprovalChain created in OpenRegister', - ['voorstel' => $voorstelUuid, 'chain' => $chainUuid, 'steps' => count($chainSteps)] + ['proposal' => $voorstelUuid, 'chain' => $chainUuid, 'steps' => count($chainSteps)] ); return $chainUuid; } catch (Throwable $e) { $this->logger->error( 'Procest: failed to create parafering ApprovalChain', - ['voorstel' => $voorstelUuid, 'exception' => $e->getMessage()] + ['proposal' => $voorstelUuid, 'exception' => $e->getMessage()] ); throw new RuntimeException('Approval chain creation failed'); }//end try @@ -190,7 +190,7 @@ public function approveCurrentStep(string $voorstelUuid, string $userId, string } catch (Throwable $e) { $this->logger->error( 'Procest: ApprovalService::approveStep failed', - ['voorstel' => $voorstelUuid, 'step' => $stepId, 'exception' => $e->getMessage()] + ['proposal' => $voorstelUuid, 'step' => $stepId, 'exception' => $e->getMessage()] ); throw new RuntimeException('Approval step transition failed'); } @@ -226,7 +226,7 @@ public function rejectCurrentStep(string $voorstelUuid, string $userId, string $ } catch (Throwable $e) { $this->logger->error( 'Procest: ApprovalService::rejectStep failed', - ['voorstel' => $voorstelUuid, 'step' => $stepId, 'exception' => $e->getMessage()] + ['proposal' => $voorstelUuid, 'step' => $stepId, 'exception' => $e->getMessage()] ); throw new RuntimeException('Rejection step transition failed'); } @@ -288,7 +288,7 @@ private function findPendingStepId(string $voorstelUuid): ?int { } catch (Throwable $e) { $this->logger->warning( 'Procest: could not resolve pending approval step', - ['voorstel' => $voorstelUuid, 'exception' => $e->getMessage()] + ['proposal' => $voorstelUuid, 'exception' => $e->getMessage()] ); } diff --git a/lib/Service/ParaferingNotificationService.php b/lib/Service/ParaferingNotificationService.php index d10831f5b..25fe885c4 100644 --- a/lib/Service/ParaferingNotificationService.php +++ b/lib/Service/ParaferingNotificationService.php @@ -69,7 +69,7 @@ public function notifyStepActivated( $notification->setApp(Application::APP_ID) ->setUser($actorUserId) ->setDateTime(new DateTime()) - ->setObject('voorstel', $proposalId) + ->setObject('proposal', $proposalId) ->setSubject( 'parafering_step_activated', [ @@ -84,7 +84,7 @@ public function notifyStepActivated( 'Failed to send parafering step notification', [ 'actor' => $actorUserId, - 'voorstel' => $proposalId, + 'proposal' => $proposalId, 'exception' => $e->getMessage(), ] ); @@ -116,7 +116,7 @@ public function notifyVoorstelReturned( $notification->setApp(Application::APP_ID) ->setUser($stellerUserId) ->setDateTime(new DateTime()) - ->setObject('voorstel', $proposalId) + ->setObject('proposal', $proposalId) ->setSubject( 'voorstel_returned', [ @@ -132,7 +132,7 @@ public function notifyVoorstelReturned( 'Failed to send voorstel return notification', [ 'author' => $stellerUserId, - 'voorstel' => $proposalId, + 'proposal' => $proposalId, 'exception' => $e->getMessage(), ] ); @@ -162,7 +162,7 @@ public function notifyParaferingReminder( $notification->setApp(Application::APP_ID) ->setUser($actorUserId) ->setDateTime(new DateTime()) - ->setObject('voorstel', $proposalId) + ->setObject('proposal', $proposalId) ->setSubject( 'parafering_reminder', [ @@ -177,7 +177,7 @@ public function notifyParaferingReminder( 'Failed to send parafering reminder notification', [ 'actor' => $actorUserId, - 'voorstel' => $proposalId, + 'proposal' => $proposalId, 'exception' => $e->getMessage(), ] ); diff --git a/lib/Service/Settings/SchemaSlugMap.php b/lib/Service/Settings/SchemaSlugMap.php index a7215370c..af411fa2d 100644 --- a/lib/Service/Settings/SchemaSlugMap.php +++ b/lib/Service/Settings/SchemaSlugMap.php @@ -46,7 +46,7 @@ class SchemaSlugMap { * @var array */ public const SLUG_TO_CONFIG_KEY = [ - 'catalogus' => 'catalogus_schema', + 'catalog' => 'catalogus_schema', 'case' => 'case_schema', 'task' => 'task_schema', 'status' => 'status_schema', @@ -71,7 +71,7 @@ class SchemaSlugMap { 'document' => 'document_schema', 'documentLink' => 'document_link_schema', 'usageRights' => 'usage_rights_schema', - 'kanaal' => 'kanaal_schema', + 'notificationChannel' => 'kanaal_schema', 'abonnement' => 'abonnement_schema', 'inspectieChecklist' => 'inspectie_checklist_schema', 'inspectieRapport' => 'inspectie_rapport_schema', @@ -87,7 +87,7 @@ class SchemaSlugMap { 'hearingSession' => 'hearing_session_schema', 'advisoryReport' => 'advisory_report_schema', 'appealDecision' => 'appeal_decision_schema', - 'voorstel' => 'voorstel_schema', + 'proposal' => 'voorstel_schema', 'parafeerroute' => 'parafeerroute_schema', 'parafeeractie' => 'parafeeractie_schema', 'paraferingAuditEntry' => 'parafering_audit_entry_schema', @@ -141,11 +141,11 @@ class SchemaSlugMap { 'portaalVerzoek' => 'portaal_verzoek_schema', 'portaalNotificatieVoorkeur' => 'portaal_notificatie_voorkeur_schema', // Termijnbewaking + dwangsom (AWB 4:13/4:14/4:17). - 'termijnDefinitie' => 'termijn_definitie_schema', - 'termijnInstance' => 'termijn_instance_schema', + 'deadlineDefinition' => 'termijn_definitie_schema', + 'deadlineInstance' => 'termijn_instance_schema', 'termijnGebeurtenis' => 'termijn_gebeurtenis_schema', - 'ingebrekestelling' => 'ingebrekestelling_schema', - 'dwangsomBerekening' => 'dwangsom_berekening_schema', + 'noticeOfDefault' => 'ingebrekestelling_schema', + 'penaltyPaymentCalculation' => 'dwangsom_berekening_schema', 'dwangsomUitbetaling' => 'dwangsom_uitbetaling_schema', // Mandaat-matrix authorization engine. // KEY renamed with the schema slug; VALUE deliberately left as-is. The diff --git a/lib/Service/TermijnNotificationService.php b/lib/Service/TermijnNotificationService.php index 948270d92..a4d01f425 100644 --- a/lib/Service/TermijnNotificationService.php +++ b/lib/Service/TermijnNotificationService.php @@ -135,7 +135,7 @@ public function sendTermijnNotification( $payload = $this->renderTemplate(type: $type, instance: $instance ?? [], context: $context); $payload['recipient'] = $recipientUserId; - $payload['termijnInstance'] = $termInstanceId; + $payload['deadlineInstance'] = $termInstanceId; $payload['template'] = $type; // Route the rendered notification through the procest notification @@ -155,7 +155,7 @@ public function sendTermijnNotification( 'type' => $type, 'recipient' => $recipientUserId, 'instance' => $termInstanceId, - 'kanaal' => $payload['dispatch']['kanaal'], + 'notificationChannel' => $payload['dispatch']['notificationChannel'], ] ); diff --git a/lib/Service/TermijnService.php b/lib/Service/TermijnService.php index e9d2b77e5..edf942b02 100644 --- a/lib/Service/TermijnService.php +++ b/lib/Service/TermijnService.php @@ -98,7 +98,7 @@ public function createTermijnInstance(string $caseId, string $caseType, ?DateTim $instance = [ 'case' => $caseId, - 'termijnDefinitie' => (string)($definitie['id'] ?? ''), + 'deadlineDefinition' => (string)($definitie['id'] ?? ''), 'startDate' => $startDate->format('Y-m-d\TH:i:sP'), 'endDateCalculated' => $endDate, 'endDateCurrent' => $endDate, @@ -371,7 +371,7 @@ public function recordEvent( ): ?array { $moment = ($moment ?? new DateTimeImmutable()); $event = [ - 'termijnInstance' => $termInstanceId, + 'deadlineInstance' => $termInstanceId, 'type' => $type, 'moment' => $moment->format('Y-m-d\TH:i:sP'), 'actor' => $actor, diff --git a/lib/Service/Transitions/BesluitvormingActivateHandler.php b/lib/Service/Transitions/BesluitvormingActivateHandler.php index 1e9a7d07e..a33a9ddad 100644 --- a/lib/Service/Transitions/BesluitvormingActivateHandler.php +++ b/lib/Service/Transitions/BesluitvormingActivateHandler.php @@ -80,7 +80,7 @@ public function handle(array $actionConfig, array $case, array $transitionContex $this->parafeerService->activate($proposalId); - return new ActionResult(succeeded: true, data: ['voorstel' => $proposalId]); + return new ActionResult(succeeded: true, data: ['proposal' => $proposalId]); } catch (\Throwable $e) { $this->logger->error( 'BesluitvormingActivateHandler failed', @@ -99,7 +99,7 @@ public function handle(array $actionConfig, array $case, array $transitionContex */ private function resolveProposalId(array $case): string { // A voorstel may be linked directly on the case. - $direct = (string)($case['voorstel'] ?? ''); + $direct = (string)($case['proposal'] ?? ''); if ($direct !== '') { return $direct; } diff --git a/lib/Service/VergaderingCaseService.php b/lib/Service/VergaderingCaseService.php index e1edbfc43..fe93237fe 100644 --- a/lib/Service/VergaderingCaseService.php +++ b/lib/Service/VergaderingCaseService.php @@ -82,13 +82,13 @@ public function __construct( * THEN a linked Procest case is created with status "gepland" * AND deadline = startDatum − 7 days (agenda publication deadline). * - * @param array $vergadering The vergadering object from the ORI register + * @param array $meeting The vergadering object from the ORI register * * @return array The created case object, or empty array when skipped * * @spec openspec/changes/open-raadsinformatie/tasks.md#task-5 */ - public function createForVergadering(array $vergadering): array { + public function createForVergadering(array $meeting): array { $objectService = $this->settingsService->getObjectService(); if ($objectService === null) { $this->logger->warning( @@ -109,7 +109,7 @@ public function createForVergadering(array $vergadering): array { return []; } - $startDate = ($vergadering['startDate'] ?? ''); + $startDate = ($meeting['startDate'] ?? ''); $deadline = ''; if (empty($startDate) === false) { @@ -125,13 +125,13 @@ public function createForVergadering(array $vergadering): array { } $caseData = [ - 'title' => ($vergadering['name'] ?? 'Vergadering'), + 'title' => ($meeting['name'] ?? 'Vergadering'), 'status' => 'gepland', 'deadline' => $deadline, - 'oriVergaderingId' => ($vergadering['@self']['slug'] ?? ''), + 'oriVergaderingId' => ($meeting['@self']['slug'] ?? ''), 'oriRegister' => 'ori', - 'type' => ($vergadering['type'] ?? ''), - 'organisation' => ($vergadering['organisation'] ?? ''), + 'type' => ($meeting['type'] ?? ''), + 'organisation' => ($meeting['organisation'] ?? ''), ]; try { @@ -144,7 +144,7 @@ public function createForVergadering(array $vergadering): array { $this->logger->info( 'Procest: created case for vergadering', [ - 'vergaderingSlug' => ($vergadering['@self']['slug'] ?? ''), + 'vergaderingSlug' => ($meeting['@self']['slug'] ?? ''), 'caseId' => ($case['id'] ?? ''), 'deadline' => $deadline, ] diff --git a/lib/Service/ZgwMappingService.php b/lib/Service/ZgwMappingService.php index b3a440fb4..048daebdd 100644 --- a/lib/Service/ZgwMappingService.php +++ b/lib/Service/ZgwMappingService.php @@ -49,7 +49,7 @@ class ZgwMappingService { * @var string[] */ private const RESOURCE_KEYS = [ - 'catalogus', + 'catalog', 'zaak', 'zaaktype', 'status', @@ -73,7 +73,7 @@ class ZgwMappingService { 'enkelvoudiginformatieobject', 'objectinformatieobject', 'gebruiksrechten', - 'kanaal', + 'notificationChannel', 'abonnement', ]; diff --git a/lib/Service/ZgwService.php b/lib/Service/ZgwService.php index 868f6a7a5..c2af1abe3 100644 --- a/lib/Service/ZgwService.php +++ b/lib/Service/ZgwService.php @@ -64,7 +64,7 @@ class ZgwService { 'klantcontacten' => 'klantcontact', ], 'catalogi' => [ - 'catalogussen' => 'catalogus', + 'catalogussen' => 'catalog', 'zaaktypen' => 'caseType', 'statustypen' => 'statustype', 'resultaattypen' => 'resultaattype', @@ -89,7 +89,7 @@ class ZgwService { 'verzendingen' => 'dispatch', ], 'notificaties' => [ - 'kanaal' => 'kanaal', + 'notificationChannel' => 'notificationChannel', 'abonnement' => 'abonnement', ], ]; diff --git a/lib/Settings/ori_register.json b/lib/Settings/ori_register.json index 9eb9067d8..ec2154997 100644 --- a/lib/Settings/ori_register.json +++ b/lib/Settings/ori_register.json @@ -21,19 +21,19 @@ "description": "Mock ORI register containing council information for the fictional municipality of Voorbeeldstad. Includes meetings, agenda items, documents, votes, council members, and parties based on the VNG ODS-Open-Raadsinformatie specification.", "published": "2025-01-01T00:00:00+00:00", "schemas": [ - "vergadering", - "agendapunt", - "raadsdocument", - "stemming", - "raadslid", - "fractie" + "meeting", + "agendaItem", + "councilDocument", + "vote", + "councilMember", + "politicalGroup" ], "folder": "Open Registers/ORI" } }, "schemas": { - "vergadering": { - "slug": "vergadering", + "meeting": { + "slug": "meeting", "x-schema-org": "schema:Event", "title": "Vergadering", "version": "1.0.0", @@ -118,8 +118,8 @@ ] } }, - "agendapunt": { - "slug": "agendapunt", + "agendaItem": { + "slug": "agendaItem", "title": "Agendapunt", "version": "1.0.0", "published": "2025-01-01T00:00:00+00:00", @@ -128,7 +128,7 @@ "required": [ "subject", "sortOrder", - "vergadering" + "meeting" ], "properties": { "subject": { @@ -150,7 +150,7 @@ "minimum": 1, "title": "Order" }, - "vergadering": { + "meeting": { "type": "string", "description": "Reference (slug) to the parent vergadering", "facetable": true, @@ -178,8 +178,8 @@ ] } }, - "raadsdocument": { - "slug": "raadsdocument", + "councilDocument": { + "slug": "councilDocument", "x-schema-org": "schema:DigitalDocument", "title": "Raadsdocument", "version": "1.0.0", @@ -253,8 +253,8 @@ ] } }, - "stemming": { - "slug": "stemming", + "vote": { + "slug": "vote", "x-schema-org": "schema:VoteAction", "title": "Stemming", "version": "1.0.0", @@ -292,7 +292,7 @@ "facetable": true, "title": "Result" }, - "agendapunt": { + "agendaItem": { "type": "string", "description": "Reference (slug) to the agenda item this vote belongs to", "facetable": true, @@ -322,7 +322,7 @@ "items": { "type": "object", "properties": { - "fractie": { + "politicalGroup": { "type": "string", "description": "Party name", "title": "Party" @@ -355,8 +355,8 @@ ] } }, - "raadslid": { - "slug": "raadslid", + "councilMember": { + "slug": "councilMember", "x-schema-org": "schema:Person", "title": "Raadslid", "version": "1.0.0", @@ -365,7 +365,7 @@ "description": "Represents a person serving in the municipal council, college, or council administration. Includes council members, aldermen, the mayor, and the clerk.", "required": [ "name", - "fractie", + "politicalGroup", "role" ], "properties": { @@ -376,7 +376,7 @@ "facetable": true, "title": "Name" }, - "fractie": { + "politicalGroup": { "type": "string", "description": "Reference (slug) to the party/politicalGroup this member belongs to", "facetable": true, @@ -409,8 +409,8 @@ ] } }, - "fractie": { - "slug": "fractie", + "politicalGroup": { + "slug": "politicalGroup", "x-schema-org": "schema:Organization", "title": "Fractie", "version": "1.0.0", @@ -459,7 +459,7 @@ { "@self": { "register": "ori", - "schema": "fractie", + "schema": "politicalGroup", "slug": "voorbeeldstad-vooruit" }, "name": "Voorbeeldstad Vooruit", @@ -469,7 +469,7 @@ { "@self": { "register": "ori", - "schema": "fractie", + "schema": "politicalGroup", "slug": "groen-links-voorbeeldstad" }, "name": "Groen Links Voorbeeldstad", @@ -479,7 +479,7 @@ { "@self": { "register": "ori", - "schema": "fractie", + "schema": "politicalGroup", "slug": "democraten-voorbeeldstad" }, "name": "Democraten Voorbeeldstad", @@ -489,7 +489,7 @@ { "@self": { "register": "ori", - "schema": "fractie", + "schema": "politicalGroup", "slug": "lokaal-belang" }, "name": "Lokaal Belang", @@ -499,7 +499,7 @@ { "@self": { "register": "ori", - "schema": "fractie", + "schema": "politicalGroup", "slug": "pvda-voorbeeldstad" }, "name": "PvdA Voorbeeldstad", @@ -509,7 +509,7 @@ { "@self": { "register": "ori", - "schema": "fractie", + "schema": "politicalGroup", "slug": "vvd-voorbeeldstad" }, "name": "VVD Voorbeeldstad", @@ -519,7 +519,7 @@ { "@self": { "register": "ori", - "schema": "fractie", + "schema": "politicalGroup", "slug": "sp-voorbeeldstad" }, "name": "SP Voorbeeldstad", @@ -529,7 +529,7 @@ { "@self": { "register": "ori", - "schema": "fractie", + "schema": "politicalGroup", "slug": "forum-voorbeeldstad" }, "name": "Forum Voorbeeldstad", @@ -539,392 +539,392 @@ { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "jan-willem-van-doesburg" }, "name": "Jan-Willem van Doesburg", - "fractie": "voorbeeldstad-vooruit", + "politicalGroup": "voorbeeldstad-vooruit", "role": "burgemeester", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "maria-bakker-de-wit" }, "name": "Maria Bakker-de Wit", - "fractie": "groen-links-voorbeeldstad", + "politicalGroup": "groen-links-voorbeeldstad", "role": "wethouder", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "ahmed-el-mansouri" }, "name": "Ahmed El-Mansouri", - "fractie": "democraten-voorbeeldstad", + "politicalGroup": "democraten-voorbeeldstad", "role": "wethouder", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "petra-koopmans" }, "name": "Petra Koopmans", - "fractie": "voorbeeldstad-vooruit", + "politicalGroup": "voorbeeldstad-vooruit", "role": "wethouder", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "henk-van-der-berg" }, "name": "Henk van der Berg", - "fractie": "voorbeeldstad-vooruit", + "politicalGroup": "voorbeeldstad-vooruit", "role": "griffier", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "klaas-de-vries" }, "name": "Klaas de Vries", - "fractie": "voorbeeldstad-vooruit", + "politicalGroup": "voorbeeldstad-vooruit", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "sandra-jansen" }, "name": "Sandra Jansen", - "fractie": "voorbeeldstad-vooruit", + "politicalGroup": "voorbeeldstad-vooruit", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "tom-willems" }, "name": "Tom Willems", - "fractie": "voorbeeldstad-vooruit", + "politicalGroup": "voorbeeldstad-vooruit", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "annemiek-van-rijn" }, "name": "Annemiek van Rijn", - "fractie": "voorbeeldstad-vooruit", + "politicalGroup": "voorbeeldstad-vooruit", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "bas-vermeulen" }, "name": "Bas Vermeulen", - "fractie": "voorbeeldstad-vooruit", + "politicalGroup": "voorbeeldstad-vooruit", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "lisa-de-groot" }, "name": "Lisa de Groot", - "fractie": "groen-links-voorbeeldstad", + "politicalGroup": "groen-links-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "robin-smit" }, "name": "Robin Smit", - "fractie": "groen-links-voorbeeldstad", + "politicalGroup": "groen-links-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "fatima-bouazza" }, "name": "Fatima Bouazza", - "fractie": "groen-links-voorbeeldstad", + "politicalGroup": "groen-links-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "jeroen-bos" }, "name": "Jeroen Bos", - "fractie": "groen-links-voorbeeldstad", + "politicalGroup": "groen-links-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "marieke-scholten" }, "name": "Marieke Scholten", - "fractie": "democraten-voorbeeldstad", + "politicalGroup": "democraten-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "pieter-van-dijk" }, "name": "Pieter van Dijk", - "fractie": "democraten-voorbeeldstad", + "politicalGroup": "democraten-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "eva-mulder" }, "name": "Eva Mulder", - "fractie": "democraten-voorbeeldstad", + "politicalGroup": "democraten-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "dirk-van-leeuwen" }, "name": "Dirk van Leeuwen", - "fractie": "lokaal-belang", + "politicalGroup": "lokaal-belang", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "ria-ter-horst" }, "name": "Ria ter Horst", - "fractie": "lokaal-belang", + "politicalGroup": "lokaal-belang", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "jan-kramer" }, "name": "Jan Kramer", - "fractie": "lokaal-belang", + "politicalGroup": "lokaal-belang", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "nienke-brouwer" }, "name": "Nienke Brouwer", - "fractie": "lokaal-belang", + "politicalGroup": "lokaal-belang", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "gerard-visser" }, "name": "Gerard Visser", - "fractie": "lokaal-belang", + "politicalGroup": "lokaal-belang", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "monique-peters" }, "name": "Monique Peters", - "fractie": "pvda-voorbeeldstad", + "politicalGroup": "pvda-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "willem-hendriks" }, "name": "Willem Hendriks", - "fractie": "pvda-voorbeeldstad", + "politicalGroup": "pvda-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "denise-van-dam" }, "name": "Denise van Dam", - "fractie": "pvda-voorbeeldstad", + "politicalGroup": "pvda-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "frank-de-boer" }, "name": "Frank de Boer", - "fractie": "pvda-voorbeeldstad", + "politicalGroup": "pvda-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "caroline-van-den-heuvel" }, "name": "Caroline van den Heuvel", - "fractie": "vvd-voorbeeldstad", + "politicalGroup": "vvd-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "robert-dekker" }, "name": "Robert Dekker", - "fractie": "vvd-voorbeeldstad", + "politicalGroup": "vvd-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "els-van-der-linden" }, "name": "Els van der Linden", - "fractie": "vvd-voorbeeldstad", + "politicalGroup": "vvd-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "marco-kuijpers" }, "name": "Marco Kuijpers", - "fractie": "sp-voorbeeldstad", + "politicalGroup": "sp-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "ingrid-wolf" }, "name": "Ingrid Wolf", - "fractie": "sp-voorbeeldstad", + "politicalGroup": "sp-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "hans-van-beek" }, "name": "Hans van Beek", - "fractie": "forum-voorbeeldstad", + "politicalGroup": "forum-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "tineke-groen" }, "name": "Tineke Groen", - "fractie": "forum-voorbeeldstad", + "politicalGroup": "forum-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "wim-van-houten" }, "name": "Wim van Houten", - "fractie": "voorbeeldstad-vooruit", + "politicalGroup": "voorbeeldstad-vooruit", "role": "raadslid", "actief": false }, { "@self": { "register": "ori", - "schema": "raadslid", + "schema": "councilMember", "slug": "joke-meijer" }, "name": "Joke Meijer", - "fractie": "lokaal-belang", + "politicalGroup": "lokaal-belang", "role": "raadslid", "actief": false }, { "@self": { "register": "ori", - "schema": "vergadering", + "schema": "meeting", "slug": "raadsvergadering-2025-09-02" }, "name": "Raadsvergadering 2 september 2025", @@ -938,7 +938,7 @@ { "@self": { "register": "ori", - "schema": "vergadering", + "schema": "meeting", "slug": "commissie-mens-samenleving-2025-09-11" }, "name": "Commissie Mens & Samenleving 11 september 2025", @@ -953,7 +953,7 @@ { "@self": { "register": "ori", - "schema": "vergadering", + "schema": "meeting", "slug": "raadsvergadering-2025-09-16" }, "name": "Raadsvergadering 16 september 2025", @@ -967,7 +967,7 @@ { "@self": { "register": "ori", - "schema": "vergadering", + "schema": "meeting", "slug": "raadsvergadering-2025-10-07" }, "name": "Raadsvergadering 7 oktober 2025", @@ -981,7 +981,7 @@ { "@self": { "register": "ori", - "schema": "vergadering", + "schema": "meeting", "slug": "commissie-ruimte-economie-2025-10-09" }, "name": "Commissie Ruimte & Economie 9 oktober 2025", @@ -996,7 +996,7 @@ { "@self": { "register": "ori", - "schema": "vergadering", + "schema": "meeting", "slug": "raadsvergadering-2025-10-21" }, "name": "Raadsvergadering 21 oktober 2025 (Begrotingsbehandeling)", @@ -1010,7 +1010,7 @@ { "@self": { "register": "ori", - "schema": "vergadering", + "schema": "meeting", "slug": "raadsvergadering-2025-11-04" }, "name": "Raadsvergadering 4 november 2025", @@ -1024,7 +1024,7 @@ { "@self": { "register": "ori", - "schema": "vergadering", + "schema": "meeting", "slug": "commissie-bestuur-financien-2025-11-13" }, "name": "Commissie Bestuur & Financien 13 november 2025", @@ -1039,7 +1039,7 @@ { "@self": { "register": "ori", - "schema": "vergadering", + "schema": "meeting", "slug": "raadsvergadering-2025-12-02" }, "name": "Raadsvergadering 2 december 2025", @@ -1053,7 +1053,7 @@ { "@self": { "register": "ori", - "schema": "vergadering", + "schema": "meeting", "slug": "raadsvergadering-2026-01-14" }, "name": "Raadsvergadering 14 januari 2026 (Nieuwjaar)", @@ -1067,46 +1067,46 @@ { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20250902-01-opening" }, "subject": "Opening en mededelingen", "omschrijving": "De voorzitter opent de vergadering en deelt de mededelingen.", "sortOrder": 1, - "vergadering": "raadsvergadering-2025-09-02" + "meeting": "raadsvergadering-2025-09-02" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20250902-02-agenda" }, "subject": "Vaststelling agenda", "omschrijving": "De raad stelt de agenda voor deze vergadering vast.", "sortOrder": 2, - "vergadering": "raadsvergadering-2025-09-02" + "meeting": "raadsvergadering-2025-09-02" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20250902-03-vragenuur" }, "subject": "Vragenuur", "omschrijving": "Raadsleden kunnen mondeling vragen stellen aan het college van burgemeester en wethouders.", "sortOrder": 3, - "vergadering": "raadsvergadering-2025-09-02" + "meeting": "raadsvergadering-2025-09-02" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20250902-04-herinrichting-marktplein" }, "subject": "Voorstel: Herinrichting marktplein", "omschrijving": "Het college stelt voor om het marktplein in het centrum van Voorbeeldstad opnieuw in te richten met meer groen, autoluwe zones en nieuwe terrassen. Het totale budget bedraagt 2,3 miljoen euro. De oppositie heeft een amendement ingediend om het ontwerp aan te passen.", "sortOrder": 4, - "vergadering": "raadsvergadering-2025-09-02", + "meeting": "raadsvergadering-2025-09-02", "attachments": [ "besluit-herinrichting-marktplein", "amendement-herinrichting-marktplein", @@ -1116,13 +1116,13 @@ { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20250902-05-subsidie-duurzame-energie" }, "subject": "Voorstel: Subsidieregeling duurzame energie", "omschrijving": "Voorstel tot vaststelling van een gemeentelijke subsidieregeling voor woningeigenaren die zonnepanelen, warmtepompen of isolatie willen aanschaffen. Totaal beschikbaar budget: 500.000 euro voor 2025-2026.", "sortOrder": 5, - "vergadering": "raadsvergadering-2025-09-02", + "meeting": "raadsvergadering-2025-09-02", "attachments": [ "besluit-subsidieregeling-duurzame-energie" ] @@ -1130,13 +1130,13 @@ { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20250902-06-bestemmingsplan" }, "subject": "Voorstel: Bestemmingsplan buitengebied", "omschrijving": "Vaststelling van het gewijzigde bestemmingsplan voor het buitengebied van Voorbeeldstad. Het plan maakt beperkte woningbouw mogelijk op drie locaties aan de dorpsrand, met behoud van het groene karakter.", "sortOrder": 6, - "vergadering": "raadsvergadering-2025-09-02", + "meeting": "raadsvergadering-2025-09-02", "attachments": [ "besluit-bestemmingsplan-buitengebied", "brief-provincie-buitengebied" @@ -1145,13 +1145,13 @@ { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20250902-07-ingekomen-stukken" }, "subject": "Ingekomen stukken", "omschrijving": "Behandeling van de ingekomen brieven en stukken van het college, inwoners en externe partijen.", "sortOrder": 7, - "vergadering": "raadsvergadering-2025-09-02", + "meeting": "raadsvergadering-2025-09-02", "attachments": [ "brief-college-jeugdzorg" ] @@ -1159,35 +1159,35 @@ { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20250902-08-sluiting" }, "subject": "Sluiting", "omschrijving": "De voorzitter sluit de vergadering.", "sortOrder": 8, - "vergadering": "raadsvergadering-2025-09-02" + "meeting": "raadsvergadering-2025-09-02" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "cie-ms-20250911-01-opening" }, "subject": "Opening", "omschrijving": "De voorzitter opent de commissievergadering.", "sortOrder": 1, - "vergadering": "commissie-mens-samenleving-2025-09-11" + "meeting": "commissie-mens-samenleving-2025-09-11" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "cie-ms-20250911-02-jeugdzorg" }, "subject": "Bespreking: Stand van zaken jeugdzorg", "omschrijving": "Bespreking van de brief van het college over de ontwikkelingen in de jeugdzorg. De wachtlijsten zijn opgelopen en het college wordt gevraagd maatregelen te treffen.", "sortOrder": 2, - "vergadering": "commissie-mens-samenleving-2025-09-11", + "meeting": "commissie-mens-samenleving-2025-09-11", "attachments": [ "brief-college-jeugdzorg" ] @@ -1195,45 +1195,45 @@ { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "cie-ms-20250911-03-wmo" }, "subject": "Bespreking: Evaluatie Wmo-beleid 2024", "omschrijving": "Evaluatie van het Wmo-beleid over het afgelopen jaar. Aandachtspunten zijn de toegankelijkheid van voorzieningen en de eigen bijdrage.", "sortOrder": 3, - "vergadering": "commissie-mens-samenleving-2025-09-11" + "meeting": "commissie-mens-samenleving-2025-09-11" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "cie-ms-20250911-04-sluiting" }, "subject": "Sluiting", "omschrijving": "De voorzitter sluit de commissievergadering.", "sortOrder": 4, - "vergadering": "commissie-mens-samenleving-2025-09-11" + "meeting": "commissie-mens-samenleving-2025-09-11" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20250916-01-opening" }, "subject": "Opening en mededelingen", "sortOrder": 1, - "vergadering": "raadsvergadering-2025-09-16" + "meeting": "raadsvergadering-2025-09-16" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20250916-02-notulen" }, "subject": "Vaststelling notulen raadsvergadering 2 september 2025", "omschrijving": "De raad stelt de notulen van de vorige vergadering vast.", "sortOrder": 2, - "vergadering": "raadsvergadering-2025-09-16", + "meeting": "raadsvergadering-2025-09-16", "attachments": [ "notulen-raad-2025-09-02" ] @@ -1241,13 +1241,13 @@ { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20250916-03-vuurwerkverbod" }, "subject": "Motie: Vuurwerkverbod jaarwisseling", "omschrijving": "Groen Links Voorbeeldstad dient een motie in om een gemeentelijk vuurwerkverbod in te stellen voor de komende jaarwisseling. De motie vraagt het college om een verbod voor te bereiden en alternatief entertainment te organiseren.", "sortOrder": 3, - "vergadering": "raadsvergadering-2025-09-16", + "meeting": "raadsvergadering-2025-09-16", "attachments": [ "motie-vuurwerkverbod" ] @@ -1255,33 +1255,33 @@ { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20250916-04-sluiting" }, "subject": "Sluiting", "sortOrder": 4, - "vergadering": "raadsvergadering-2025-09-16" + "meeting": "raadsvergadering-2025-09-16" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20251007-01-opening" }, "subject": "Opening en mededelingen", "sortOrder": 1, - "vergadering": "raadsvergadering-2025-10-07" + "meeting": "raadsvergadering-2025-10-07" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20251007-02-jaarrekening" }, "subject": "Vaststelling jaarrekening 2024", "omschrijving": "De raad behandelt de jaarrekening over het boekjaar 2024. De accountant heeft een goedkeurende verklaring afgegeven.", "sortOrder": 2, - "vergadering": "raadsvergadering-2025-10-07", + "meeting": "raadsvergadering-2025-10-07", "attachments": [ "rapport-jaarrekening-2024" ] @@ -1289,33 +1289,33 @@ { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20251007-03-sluiting" }, "subject": "Sluiting", "sortOrder": 3, - "vergadering": "raadsvergadering-2025-10-07" + "meeting": "raadsvergadering-2025-10-07" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "cie-re-20251009-01-opening" }, "subject": "Opening", "sortOrder": 1, - "vergadering": "commissie-ruimte-economie-2025-10-09" + "meeting": "commissie-ruimte-economie-2025-10-09" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "cie-re-20251009-02-woningbouw" }, "subject": "Bespreking: Woningbouwmonitor Voorbeeldstad", "omschrijving": "Bespreking van de halfjaarlijkse woningbouwmonitor. Er is een tekort van 1.200 woningen. Het college wordt gevraagd om versnellingsmaatregelen.", "sortOrder": 2, - "vergadering": "commissie-ruimte-economie-2025-10-09", + "meeting": "commissie-ruimte-economie-2025-10-09", "attachments": [ "rapport-woningbouwmonitor" ] @@ -1323,56 +1323,56 @@ { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "cie-re-20251009-03-sluiting" }, "subject": "Sluiting", "sortOrder": 3, - "vergadering": "commissie-ruimte-economie-2025-10-09" + "meeting": "commissie-ruimte-economie-2025-10-09" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20251021-01-opening" }, "subject": "Opening", "omschrijving": "De voorzitter opent de begrotingsvergadering.", "sortOrder": 1, - "vergadering": "raadsvergadering-2025-10-21" + "meeting": "raadsvergadering-2025-10-21" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20251021-02-algemene-beschouwingen" }, "subject": "Algemene beschouwingen", "omschrijving": "Alle fracties geven hun visie op de begroting en het beleid van het college voor het komende jaar.", "sortOrder": 2, - "vergadering": "raadsvergadering-2025-10-21" + "meeting": "raadsvergadering-2025-10-21" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20251021-03-programmabegroting" }, "subject": "Programmabegroting 2026", "omschrijving": "Behandeling en vaststelling van de programmabegroting 2026 van de gemeente Voorbeeldstad. Totale begroting: 89 miljoen euro.", "sortOrder": 3, - "vergadering": "raadsvergadering-2025-10-21" + "meeting": "raadsvergadering-2025-10-21" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20251021-04-motie-jeugdzorg" }, "subject": "Motie: Extra budget jeugdzorg", "omschrijving": "Voorbeeldstad Vooruit en Groen Links Voorbeeldstad dienen een motie in om 750.000 euro extra budget vrij te maken voor jeugdzorg om de wachtlijsten terug te dringen.", "sortOrder": 4, - "vergadering": "raadsvergadering-2025-10-21", + "meeting": "raadsvergadering-2025-10-21", "attachments": [ "motie-extra-budget-jeugdzorg" ] @@ -1380,13 +1380,13 @@ { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20251021-05-amendement-ozb" }, "subject": "Amendement: Verlaging OZB", "omschrijving": "Lokaal Belang en VVD Voorbeeldstad dienen een amendement in om de OZB-verhoging van 5% terug te brengen naar 2%, conform het inflatieniveau.", "sortOrder": 5, - "vergadering": "raadsvergadering-2025-10-21", + "meeting": "raadsvergadering-2025-10-21", "attachments": [ "amendement-verlaging-ozb" ] @@ -1394,13 +1394,13 @@ { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20251021-06-motie-woningbouw" }, "subject": "Motie: Onderzoek woningbouw", "omschrijving": "PvdA Voorbeeldstad dient een motie in om een extern onderzoek te laten uitvoeren naar mogelijkheden voor versnelling van de woningbouwopgave in Voorbeeldstad.", "sortOrder": 6, - "vergadering": "raadsvergadering-2025-10-21", + "meeting": "raadsvergadering-2025-10-21", "attachments": [ "motie-onderzoek-woningbouw" ] @@ -1408,32 +1408,32 @@ { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20251021-07-sluiting" }, "subject": "Sluiting", "sortOrder": 7, - "vergadering": "raadsvergadering-2025-10-21" + "meeting": "raadsvergadering-2025-10-21" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20251104-01-opening" }, "subject": "Opening en mededelingen", "sortOrder": 1, - "vergadering": "raadsvergadering-2025-11-04" + "meeting": "raadsvergadering-2025-11-04" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20251104-02-notulen" }, "subject": "Vaststelling notulen begrotingsbehandeling 21 oktober 2025", "sortOrder": 2, - "vergadering": "raadsvergadering-2025-11-04", + "meeting": "raadsvergadering-2025-11-04", "attachments": [ "notulen-raad-2025-10-21" ] @@ -1441,111 +1441,111 @@ { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20251104-03-sluiting" }, "subject": "Sluiting", "sortOrder": 3, - "vergadering": "raadsvergadering-2025-11-04" + "meeting": "raadsvergadering-2025-11-04" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "cie-bf-20251113-01-opening" }, "subject": "Opening", "sortOrder": 1, - "vergadering": "commissie-bestuur-financien-2025-11-13" + "meeting": "commissie-bestuur-financien-2025-11-13" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "cie-bf-20251113-02-ict-aanbesteding" }, "subject": "Bespreking: ICT-aanbesteding gemeentelijke dienstverlening", "omschrijving": "Het college informeert de commissie over de voortgang van de ICT-aanbesteding voor de modernisering van de gemeentelijke dienstverlening. Het betreft een meerjarig contract van 1,2 miljoen euro.", "sortOrder": 2, - "vergadering": "commissie-bestuur-financien-2025-11-13" + "meeting": "commissie-bestuur-financien-2025-11-13" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "cie-bf-20251113-03-sluiting" }, "subject": "Sluiting", "sortOrder": 3, - "vergadering": "commissie-bestuur-financien-2025-11-13" + "meeting": "commissie-bestuur-financien-2025-11-13" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20251202-01-opening" }, "subject": "Opening en mededelingen", "sortOrder": 1, - "vergadering": "raadsvergadering-2025-12-02" + "meeting": "raadsvergadering-2025-12-02" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20251202-02-decembercirculaire" }, "subject": "Bespreking: Decembercirculaire gemeentefonds", "omschrijving": "Bespreking van de gevolgen van de decembercirculaire van het gemeentefonds voor de begroting van Voorbeeldstad.", "sortOrder": 2, - "vergadering": "raadsvergadering-2025-12-02" + "meeting": "raadsvergadering-2025-12-02" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20251202-03-sluiting" }, "subject": "Sluiting", "sortOrder": 3, - "vergadering": "raadsvergadering-2025-12-02" + "meeting": "raadsvergadering-2025-12-02" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20260114-01-opening" }, "subject": "Opening en nieuwjaarstoespraak", "omschrijving": "De burgemeester opent het nieuwe raadsjaar met een nieuwjaarstoespraak.", "sortOrder": 1, - "vergadering": "raadsvergadering-2026-01-14" + "meeting": "raadsvergadering-2026-01-14" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20260114-02-werkprogramma" }, "subject": "Vaststelling werkprogramma raad 2026", "omschrijving": "De raad stelt het werkprogramma vast voor het kalenderjaar 2026, inclusief de vergaderplanning en de aandachtspunten per commissie.", "sortOrder": 2, - "vergadering": "raadsvergadering-2026-01-14" + "meeting": "raadsvergadering-2026-01-14" }, { "@self": { "register": "ori", - "schema": "agendapunt", + "schema": "agendaItem", "slug": "raad-20260114-03-sluiting" }, "subject": "Sluiting", "sortOrder": 3, - "vergadering": "raadsvergadering-2026-01-14" + "meeting": "raadsvergadering-2026-01-14" }, { "@self": { "register": "ori", - "schema": "raadsdocument", + "schema": "councilDocument", "slug": "motie-extra-budget-jeugdzorg" }, "title": "Motie: Extra budget jeugdzorg", @@ -1559,7 +1559,7 @@ { "@self": { "register": "ori", - "schema": "raadsdocument", + "schema": "councilDocument", "slug": "motie-onderzoek-woningbouw" }, "title": "Motie: Onderzoek versnelling woningbouw", @@ -1573,7 +1573,7 @@ { "@self": { "register": "ori", - "schema": "raadsdocument", + "schema": "councilDocument", "slug": "motie-vuurwerkverbod" }, "title": "Motie: Gemeentelijk vuurwerkverbod jaarwisseling 2025-2026", @@ -1587,7 +1587,7 @@ { "@self": { "register": "ori", - "schema": "raadsdocument", + "schema": "councilDocument", "slug": "amendement-verlaging-ozb" }, "title": "Amendement: Verlaging OZB-verhoging van 5% naar 2%", @@ -1601,7 +1601,7 @@ { "@self": { "register": "ori", - "schema": "raadsdocument", + "schema": "councilDocument", "slug": "amendement-herinrichting-marktplein" }, "title": "Amendement: Aanpassing ontwerp herinrichting marktplein", @@ -1615,7 +1615,7 @@ { "@self": { "register": "ori", - "schema": "raadsdocument", + "schema": "councilDocument", "slug": "besluit-herinrichting-marktplein" }, "title": "Besluit: Herinrichting marktplein Voorbeeldstad", @@ -1629,7 +1629,7 @@ { "@self": { "register": "ori", - "schema": "raadsdocument", + "schema": "councilDocument", "slug": "besluit-subsidieregeling-duurzame-energie" }, "title": "Besluit: Vaststelling subsidieregeling duurzame energie 2025-2026", @@ -1643,7 +1643,7 @@ { "@self": { "register": "ori", - "schema": "raadsdocument", + "schema": "councilDocument", "slug": "besluit-bestemmingsplan-buitengebied" }, "title": "Besluit: Vaststelling bestemmingsplan buitengebied Voorbeeldstad", @@ -1657,7 +1657,7 @@ { "@self": { "register": "ori", - "schema": "raadsdocument", + "schema": "councilDocument", "slug": "brief-college-jeugdzorg" }, "title": "Brief college: Stand van zaken jeugdzorg en wachtlijsten", @@ -1671,7 +1671,7 @@ { "@self": { "register": "ori", - "schema": "raadsdocument", + "schema": "councilDocument", "slug": "brief-inwoners-marktplein" }, "title": "Brief inwoners: Bezwaren herinrichting marktplein", @@ -1685,7 +1685,7 @@ { "@self": { "register": "ori", - "schema": "raadsdocument", + "schema": "councilDocument", "slug": "brief-provincie-buitengebied" }, "title": "Brief Provincie: Reactie op bestemmingsplan buitengebied", @@ -1699,7 +1699,7 @@ { "@self": { "register": "ori", - "schema": "raadsdocument", + "schema": "councilDocument", "slug": "rapport-jaarrekening-2024" }, "title": "Rapport: Jaarrekening 2024 gemeente Voorbeeldstad", @@ -1713,7 +1713,7 @@ { "@self": { "register": "ori", - "schema": "raadsdocument", + "schema": "councilDocument", "slug": "rapport-woningbouwmonitor" }, "title": "Rapport: Woningbouwmonitor Voorbeeldstad 2025", @@ -1727,7 +1727,7 @@ { "@self": { "register": "ori", - "schema": "raadsdocument", + "schema": "councilDocument", "slug": "notulen-raad-2025-09-02" }, "title": "Notulen raadsvergadering 2 september 2025", @@ -1741,7 +1741,7 @@ { "@self": { "register": "ori", - "schema": "raadsdocument", + "schema": "councilDocument", "slug": "notulen-raad-2025-10-21" }, "title": "Notulen raadsvergadering 21 oktober 2025 (Begrotingsbehandeling)", @@ -1755,54 +1755,54 @@ { "@self": { "register": "ori", - "schema": "stemming", + "schema": "vote", "slug": "stemming-herinrichting-marktplein" }, "subject": "Voorstel: Herinrichting marktplein Voorbeeldstad", - "type": "voorstel", + "type": "proposal", "result": "aangenomen", - "agendapunt": "raad-20250902-04-herinrichting-marktplein", + "agendaItem": "raad-20250902-04-herinrichting-marktplein", "votesFor": 19, "votesAgainst": 16, "onthoudingen": 0, "politicalGroupResults": [ { - "fractie": "Voorbeeldstad Vooruit", + "politicalGroup": "Voorbeeldstad Vooruit", "stem": "voor", "zetels": 8 }, { - "fractie": "Groen Links Voorbeeldstad", + "politicalGroup": "Groen Links Voorbeeldstad", "stem": "voor", "zetels": 6 }, { - "fractie": "Democraten Voorbeeldstad", + "politicalGroup": "Democraten Voorbeeldstad", "stem": "voor", "zetels": 5 }, { - "fractie": "Lokaal Belang", + "politicalGroup": "Lokaal Belang", "stem": "tegen", "zetels": 5 }, { - "fractie": "PvdA Voorbeeldstad", + "politicalGroup": "PvdA Voorbeeldstad", "stem": "tegen", "zetels": 4 }, { - "fractie": "VVD Voorbeeldstad", + "politicalGroup": "VVD Voorbeeldstad", "stem": "tegen", "zetels": 3 }, { - "fractie": "SP Voorbeeldstad", + "politicalGroup": "SP Voorbeeldstad", "stem": "tegen", "zetels": 2 }, { - "fractie": "Forum Voorbeeldstad", + "politicalGroup": "Forum Voorbeeldstad", "stem": "tegen", "zetels": 2 } @@ -1811,54 +1811,54 @@ { "@self": { "register": "ori", - "schema": "stemming", + "schema": "vote", "slug": "stemming-subsidieregeling-duurzame-energie" }, "subject": "Voorstel: Subsidieregeling duurzame energie 2025-2026", - "type": "voorstel", + "type": "proposal", "result": "aangenomen", - "agendapunt": "raad-20250902-05-subsidie-duurzame-energie", + "agendaItem": "raad-20250902-05-subsidie-duurzame-energie", "votesFor": 25, "votesAgainst": 10, "onthoudingen": 0, "politicalGroupResults": [ { - "fractie": "Voorbeeldstad Vooruit", + "politicalGroup": "Voorbeeldstad Vooruit", "stem": "voor", "zetels": 8 }, { - "fractie": "Groen Links Voorbeeldstad", + "politicalGroup": "Groen Links Voorbeeldstad", "stem": "voor", "zetels": 6 }, { - "fractie": "Democraten Voorbeeldstad", + "politicalGroup": "Democraten Voorbeeldstad", "stem": "voor", "zetels": 5 }, { - "fractie": "Lokaal Belang", + "politicalGroup": "Lokaal Belang", "stem": "tegen", "zetels": 5 }, { - "fractie": "PvdA Voorbeeldstad", + "politicalGroup": "PvdA Voorbeeldstad", "stem": "voor", "zetels": 4 }, { - "fractie": "VVD Voorbeeldstad", + "politicalGroup": "VVD Voorbeeldstad", "stem": "tegen", "zetels": 3 }, { - "fractie": "SP Voorbeeldstad", + "politicalGroup": "SP Voorbeeldstad", "stem": "voor", "zetels": 2 }, { - "fractie": "Forum Voorbeeldstad", + "politicalGroup": "Forum Voorbeeldstad", "stem": "tegen", "zetels": 2 } @@ -1867,54 +1867,54 @@ { "@self": { "register": "ori", - "schema": "stemming", + "schema": "vote", "slug": "stemming-motie-extra-budget-jeugdzorg" }, "subject": "Motie: Extra budget jeugdzorg", "type": "motie", "result": "aangenomen", - "agendapunt": "raad-20251021-04-motie-jeugdzorg", + "agendaItem": "raad-20251021-04-motie-jeugdzorg", "votesFor": 23, "votesAgainst": 12, "onthoudingen": 0, "politicalGroupResults": [ { - "fractie": "Voorbeeldstad Vooruit", + "politicalGroup": "Voorbeeldstad Vooruit", "stem": "voor", "zetels": 8 }, { - "fractie": "Groen Links Voorbeeldstad", + "politicalGroup": "Groen Links Voorbeeldstad", "stem": "voor", "zetels": 6 }, { - "fractie": "Democraten Voorbeeldstad", + "politicalGroup": "Democraten Voorbeeldstad", "stem": "voor", "zetels": 5 }, { - "fractie": "Lokaal Belang", + "politicalGroup": "Lokaal Belang", "stem": "tegen", "zetels": 5 }, { - "fractie": "PvdA Voorbeeldstad", + "politicalGroup": "PvdA Voorbeeldstad", "stem": "voor", "zetels": 4 }, { - "fractie": "VVD Voorbeeldstad", + "politicalGroup": "VVD Voorbeeldstad", "stem": "tegen", "zetels": 3 }, { - "fractie": "SP Voorbeeldstad", + "politicalGroup": "SP Voorbeeldstad", "stem": "tegen", "zetels": 2 }, { - "fractie": "Forum Voorbeeldstad", + "politicalGroup": "Forum Voorbeeldstad", "stem": "tegen", "zetels": 2 } @@ -1923,54 +1923,54 @@ { "@self": { "register": "ori", - "schema": "stemming", + "schema": "vote", "slug": "stemming-amendement-verlaging-ozb" }, "subject": "Amendement: Verlaging OZB-verhoging van 5% naar 2%", "type": "amendement", "result": "verworpen", - "agendapunt": "raad-20251021-05-amendement-ozb", + "agendaItem": "raad-20251021-05-amendement-ozb", "votesFor": 10, "votesAgainst": 25, "onthoudingen": 0, "politicalGroupResults": [ { - "fractie": "Voorbeeldstad Vooruit", + "politicalGroup": "Voorbeeldstad Vooruit", "stem": "tegen", "zetels": 8 }, { - "fractie": "Groen Links Voorbeeldstad", + "politicalGroup": "Groen Links Voorbeeldstad", "stem": "tegen", "zetels": 6 }, { - "fractie": "Democraten Voorbeeldstad", + "politicalGroup": "Democraten Voorbeeldstad", "stem": "tegen", "zetels": 5 }, { - "fractie": "Lokaal Belang", + "politicalGroup": "Lokaal Belang", "stem": "voor", "zetels": 5 }, { - "fractie": "PvdA Voorbeeldstad", + "politicalGroup": "PvdA Voorbeeldstad", "stem": "tegen", "zetels": 4 }, { - "fractie": "VVD Voorbeeldstad", + "politicalGroup": "VVD Voorbeeldstad", "stem": "voor", "zetels": 3 }, { - "fractie": "SP Voorbeeldstad", + "politicalGroup": "SP Voorbeeldstad", "stem": "tegen", "zetels": 2 }, { - "fractie": "Forum Voorbeeldstad", + "politicalGroup": "Forum Voorbeeldstad", "stem": "voor", "zetels": 2 } @@ -1979,54 +1979,54 @@ { "@self": { "register": "ori", - "schema": "stemming", + "schema": "vote", "slug": "stemming-motie-onderzoek-woningbouw" }, "subject": "Motie: Onderzoek versnelling woningbouw", "type": "motie", "result": "aangenomen", - "agendapunt": "raad-20251021-06-motie-woningbouw", + "agendaItem": "raad-20251021-06-motie-woningbouw", "votesFor": 35, "votesAgainst": 0, "onthoudingen": 0, "politicalGroupResults": [ { - "fractie": "Voorbeeldstad Vooruit", + "politicalGroup": "Voorbeeldstad Vooruit", "stem": "voor", "zetels": 8 }, { - "fractie": "Groen Links Voorbeeldstad", + "politicalGroup": "Groen Links Voorbeeldstad", "stem": "voor", "zetels": 6 }, { - "fractie": "Democraten Voorbeeldstad", + "politicalGroup": "Democraten Voorbeeldstad", "stem": "voor", "zetels": 5 }, { - "fractie": "Lokaal Belang", + "politicalGroup": "Lokaal Belang", "stem": "voor", "zetels": 5 }, { - "fractie": "PvdA Voorbeeldstad", + "politicalGroup": "PvdA Voorbeeldstad", "stem": "voor", "zetels": 4 }, { - "fractie": "VVD Voorbeeldstad", + "politicalGroup": "VVD Voorbeeldstad", "stem": "voor", "zetels": 3 }, { - "fractie": "SP Voorbeeldstad", + "politicalGroup": "SP Voorbeeldstad", "stem": "voor", "zetels": 2 }, { - "fractie": "Forum Voorbeeldstad", + "politicalGroup": "Forum Voorbeeldstad", "stem": "voor", "zetels": 2 } @@ -2035,54 +2035,54 @@ { "@self": { "register": "ori", - "schema": "stemming", + "schema": "vote", "slug": "stemming-bestemmingsplan-buitengebied" }, "subject": "Voorstel: Bestemmingsplan buitengebied Voorbeeldstad", - "type": "voorstel", + "type": "proposal", "result": "aangenomen", - "agendapunt": "raad-20250902-06-bestemmingsplan", + "agendaItem": "raad-20250902-06-bestemmingsplan", "votesFor": 27, "votesAgainst": 8, "onthoudingen": 0, "politicalGroupResults": [ { - "fractie": "Voorbeeldstad Vooruit", + "politicalGroup": "Voorbeeldstad Vooruit", "stem": "voor", "zetels": 8 }, { - "fractie": "Groen Links Voorbeeldstad", + "politicalGroup": "Groen Links Voorbeeldstad", "stem": "voor", "zetels": 6 }, { - "fractie": "Democraten Voorbeeldstad", + "politicalGroup": "Democraten Voorbeeldstad", "stem": "voor", "zetels": 5 }, { - "fractie": "Lokaal Belang", + "politicalGroup": "Lokaal Belang", "stem": "tegen", "zetels": 5 }, { - "fractie": "PvdA Voorbeeldstad", + "politicalGroup": "PvdA Voorbeeldstad", "stem": "voor", "zetels": 4 }, { - "fractie": "VVD Voorbeeldstad", + "politicalGroup": "VVD Voorbeeldstad", "stem": "voor", "zetels": 3 }, { - "fractie": "SP Voorbeeldstad", + "politicalGroup": "SP Voorbeeldstad", "stem": "tegen", "zetels": 2 }, { - "fractie": "Forum Voorbeeldstad", + "politicalGroup": "Forum Voorbeeldstad", "stem": "tegen", "zetels": 1 } diff --git a/lib/Settings/procest_register.json b/lib/Settings/procest_register.json index 06b392558..592105b82 100644 --- a/lib/Settings/procest_register.json +++ b/lib/Settings/procest_register.json @@ -45,7 +45,7 @@ "description": "Auto-generated identifier", "title": "Identifier" }, - "catalogus": { + "catalog": { "type": "string", "format": "uuid", "$ref": "catalogus", @@ -493,7 +493,7 @@ "x-translatable": true, "title": "Description" }, - "catalogus": { + "catalog": { "type": "string", "format": "uuid", "$ref": "catalogus", @@ -584,7 +584,7 @@ "x-translatable": true, "title": "Description" }, - "catalogus": { + "catalog": { "type": "string", "format": "uuid", "$ref": "catalogus", @@ -2195,8 +2195,8 @@ } } }, - "kanaal": { - "slug": "kanaal", + "notificationChannel": { + "slug": "notificationChannel", "icon": "BellRingOutline", "version": "1.0.0", "x-schema-org": "schema:BroadcastChannel", @@ -2260,8 +2260,8 @@ } } }, - "catalogus": { - "slug": "catalogus", + "catalog": { + "slug": "catalog", "icon": "BookOpenPageVariant", "version": "1.0.0", "x-schema-org": "schema:DataCatalog", @@ -2668,8 +2668,8 @@ } } }, - "voorstel": { - "slug": "voorstel", + "proposal": { + "slug": "proposal", "icon": "FileDocumentEditOutline", "version": "1.1.0", "x-schema-org": "schema:CreativeWork", @@ -2990,13 +2990,13 @@ "description": "An immutable record of a parafering action on a voorstel step", "type": "object", "required": [ - "voorstel", + "proposal", "step", "actor", "action" ], "properties": { - "voorstel": { + "proposal": { "type": "string", "format": "uuid", "$ref": "voorstel", @@ -3156,7 +3156,7 @@ "description": "DEPRECATED (migrate-parafering-to-or-audit): historical append-only audit entries for parafeerroute transitions. New transitions are recorded via OR's native audit trail instead of this schema. Existing rows remain readable for one major release. Originally: regulator-grade entry per transition (started, paraferd, advised, terugsturen, route-changed, completed) with actor, role, timestamp, reason, content snapshot, redacted IP, and SHA-256 tamper-detection hash.", "type": "object", "required": [ - "voorstel", + "proposal", "action", "actor", "actorRole", @@ -3165,7 +3165,7 @@ "auditEntryHash" ], "properties": { - "voorstel": { + "proposal": { "type": "string", "format": "uuid", "$ref": "voorstel", @@ -3409,7 +3409,7 @@ "description": "Required motivation when hearingWaived = true", "title": "Waiver Reason" }, - "ingebrekestelling": { + "noticeOfDefault": { "type": "string", "format": "date", "description": "Date the bezwaarmaker submitted an ingebrekestelling per AWB 4:17 — starts the 14-day grace clock", @@ -3494,7 +3494,7 @@ "from": { "dateAdd": { "date": { - "prop": "ingebrekestelling" + "prop": "noticeOfDefault" }, "amount": 14, "unit": "days" @@ -3533,7 +3533,7 @@ "from": { "dateAdd": { "date": { - "prop": "ingebrekestelling" + "prop": "noticeOfDefault" }, "amount": 14, "unit": "days" @@ -3575,7 +3575,7 @@ "from": { "dateAdd": { "date": { - "prop": "ingebrekestelling" + "prop": "noticeOfDefault" }, "amount": 14, "unit": "days" @@ -9241,7 +9241,7 @@ "decision", "document", "documentLink", - "catalogus", + "catalog", "zaaktypeInformatieobjecttype", "caseProperty", "caseDocument", @@ -9251,13 +9251,13 @@ "dispatch", "usageRights", "workflowTemplate", - "kanaal", + "notificationChannel", "abonnement", "objection", "hearingSession", "advisoryReport", "appealDecision", - "voorstel", + "proposal", "parafeerroute", "parafeeractie", "paraferingAuditEntry", @@ -9319,7 +9319,7 @@ "type": "string" }, { - "field": "voorstel", + "field": "proposal", "type": "string" }, { @@ -9345,7 +9345,7 @@ "label": "Actor role" }, { - "field": "voorstel", + "field": "proposal", "label": "Voorstel" }, { diff --git a/lib/Settings/register.d/30-beschikking.json b/lib/Settings/register.d/30-beschikking.json index 04130dd6f..45fab69e4 100644 --- a/lib/Settings/register.d/30-beschikking.json +++ b/lib/Settings/register.d/30-beschikking.json @@ -182,7 +182,7 @@ "title": "Dispatch", "description": "Berichtenbox delivery record", "properties": { - "kanaal": { "type": "string", "title": "Dispatch Channel", "description": "Channel used for dispatch, e.g. berichtenbox-mijnoverheid" }, + "notificationChannel": { "type": "string", "title": "Dispatch Channel", "description": "Channel used for dispatch, e.g. berichtenbox-mijnoverheid" }, "sentOn": { "type": "string", "title": "Sent On", "description": "Timestamp at which the beschikking was sent", "format": "date-time" }, "sentBy": { "type": "string", "title": "Sent By", "description": "Actor who sent the beschikking (user id or 'systeem')" }, "messageId": { "type": "string", "title": "Message ID", "description": "Berichtenbox message identifier" }, @@ -389,7 +389,7 @@ "validationRapportId": "val-2026-99231" }, "dispatch": { - "kanaal": "berichtenbox-mijnoverheid", + "notificationChannel": "berichtenbox-mijnoverheid", "sentOn": "2026-04-02T09:00:00+02:00", "sentBy": "systeem", "messageId": "MO-2026-04-02-771234" diff --git a/lib/Settings/register.d/40-kcc-werkplek.json b/lib/Settings/register.d/40-kcc-werkplek.json index 55c4adf59..971d3c1ae 100644 --- a/lib/Settings/register.d/40-kcc-werkplek.json +++ b/lib/Settings/register.d/40-kcc-werkplek.json @@ -31,9 +31,9 @@ "title": "Contactmoment", "description": "A single inbound or outbound contact (telefoon, email, chat, webformulier, social media, balie) handled in the KCC-werkplek, logged against the case and the identified burger.", "type": "object", - "required": ["kanaal", "direction", "identificationMethod", "kccEmployeeId", "nature", "summary"], + "required": ["notificationChannel", "direction", "identificationMethod", "kccEmployeeId", "nature", "summary"], "properties": { - "kanaal": {"type": "string", "title": "Channel", "enum": ["phone", "email", "webformulier", "chat", "social_media", "balie"], "description": "Communication channel"}, + "notificationChannel": {"type": "string", "title": "Channel", "enum": ["phone", "email", "webformulier", "chat", "social_media", "balie"], "description": "Communication channel"}, "direction": {"type": "string", "title": "Direction", "enum": ["inbound", "outbound"], "description": "Direction of the contact"}, "startTime": {"type": "string", "title": "Start Time", "format": "date-time", "description": "Start time of the contact"}, "endTime": {"type": "string", "title": "End Time", "format": "date-time", "description": "End time of the contact"}, diff --git a/lib/Settings/register.d/50-sociaal-domein.json b/lib/Settings/register.d/50-sociaal-domein.json index b9e12b70e..6c0c8802e 100644 --- a/lib/Settings/register.d/50-sociaal-domein.json +++ b/lib/Settings/register.d/50-sociaal-domein.json @@ -8,7 +8,7 @@ "title": "WMO Zaak", "description": "Sociaal-domein zaaktype wmo-melding (Wmo 2015, art. 2.3.2-2.3.6). Maatschappelijke ondersteuning voor volwassenen. Volledig OpenRegister-backed; status-lifecycle als configuratie, geen custom state machine.", "type": "object", - "required": ["caseType", "bsn", "districtTeam", "avgClassificatie"], + "required": ["caseType", "bsn", "districtTeam", "gdprClassification"], "properties": { "caseType": { "title": "Case Type", @@ -117,8 +117,8 @@ "type": "string", "description": "Referentie naar de bijbehorende Indicatiestelling" }, - "avgClassificatie": { - "$ref": "#/components/schemas/avgClassificatie" + "gdprClassification": { + "$ref": "#/components/schemas/gdprClassification" } } }, @@ -210,7 +210,7 @@ "title": "Jeugdwet Zaak", "description": "Sociaal-domein zaaktype jeugdwet-melding (Jeugdwet 2015, art. 2.3, 6.1.2, 7.3). Gezinsgerichte, multi-agency jeugdhulp. OpenRegister-backed.", "type": "object", - "required": ["caseType", "jeugdigeBsn", "districtTeam", "avgClassificatie"], + "required": ["caseType", "jeugdigeBsn", "districtTeam", "gdprClassification"], "properties": { "caseType": { "title": "Case Type", @@ -304,8 +304,8 @@ "items": {"type": "string"}, "description": "Historie van eerdere gezinsplannen (verlengingen)" }, - "avgClassificatie": { - "$ref": "#/components/schemas/avgClassificatie" + "gdprClassification": { + "$ref": "#/components/schemas/gdprClassification" } } }, @@ -482,7 +482,7 @@ "title": "Participatiewet Zaak", "description": "Sociaal-domein zaaktype bijstandsaanvraag (Participatiewet 2015, art. 18, 31-34, 9). Inkomens- en werkgerichte ondersteuning met vermogens-/inkomenstoets. OpenRegister-backed.", "type": "object", - "required": ["caseType", "bsn", "avgClassificatie"], + "required": ["caseType", "bsn", "gdprClassification"], "properties": { "caseType": { "title": "Case Type", @@ -612,8 +612,8 @@ "type": "boolean", "description": "True bij vermogen boven vrijstelling (auto-afwijzing)" }, - "avgClassificatie": { - "$ref": "#/components/schemas/avgClassificatie" + "gdprClassification": { + "$ref": "#/components/schemas/gdprClassification" } } }, @@ -814,8 +814,8 @@ } } }, - "avgClassificatie": { - "slug": "avgClassificatie", + "gdprClassification": { + "slug": "gdprClassification", "icon": "ShieldLockOutline", "version": "1.0.0", "title": "AVG Classificatie", @@ -998,7 +998,7 @@ "participatiewetZaak", "reIntegratieTraject", "toestemming", - "avgClassificatie", + "gdprClassification", "sociaalDomeinAuditLog", "avgIncident" ] @@ -1023,7 +1023,7 @@ "handlerId": "consulent-wmo-211", "status": "beschikking-verleend", "leadTimeStatutory": {"investigationWeeks": 6, "decisionWeeks": 2, "totalWeeks": 8}, - "avgClassificatie": { + "gdprClassification": { "categories": ["medisch"], "specialPersonalData": true, "justification": "artikel-9-2-h-avg", @@ -1053,7 +1053,7 @@ "handlerId": "consulent-wmo-211", "status": "uitvoering", "leadTimeStatutory": {"investigationWeeks": 6, "decisionWeeks": 2, "totalWeeks": 8}, - "avgClassificatie": { + "gdprClassification": { "categories": ["medisch", "gezinssituatie"], "specialPersonalData": true, "justification": "artikel-9-2-h-avg", @@ -1083,7 +1083,7 @@ "handlerId": "consulent-wmo-188", "status": "beschikking-voorbereiding", "leadTimeStatutory": {"investigationWeeks": 6, "decisionWeeks": 2, "totalWeeks": 8}, - "avgClassificatie": { + "gdprClassification": { "categories": ["medisch", "gezinssituatie"], "specialPersonalData": true, "justification": "artikel-9-2-h-avg", @@ -1112,7 +1112,7 @@ "districtTeam": "jeugdteam-noord", "handlerId": "jeugdconsulent-340", "status": "ondersteuning-loopt", - "avgClassificatie": { + "gdprClassification": { "categories": ["gezinssituatie", "medisch"], "specialPersonalData": true, "justification": "artikel-9-2-h-avg", @@ -1141,7 +1141,7 @@ "districtTeam": "jeugdteam-zuid", "handlerId": "jeugdconsulent-355", "status": "gezinsplan-gereed", - "avgClassificatie": { + "gdprClassification": { "categories": ["medisch", "gezinssituatie"], "specialPersonalData": true, "justification": "artikel-9-2-h-avg", @@ -1170,7 +1170,7 @@ "districtTeam": "jeugdteam-west", "handlerId": "jeugdconsulent-362", "status": "ondersteuning-gestart", - "avgClassificatie": { + "gdprClassification": { "categories": ["medisch", "gezinssituatie"], "specialPersonalData": true, "justification": "artikel-9-2-h-avg", @@ -1200,7 +1200,7 @@ "handlerId": "klantmanager-477", "districtTeam": "werk-en-inkomenteam-oost", "status": "re-integratie-loopt", - "avgClassificatie": { + "gdprClassification": { "categories": ["financieel", "gezinssituatie"], "specialPersonalData": true, "justification": "artikel-9-2-b-avg", @@ -1230,7 +1230,7 @@ "handlerId": "klantmanager-501", "districtTeam": "werk-en-inkomenteam-west", "status": "re-integratie-loopt", - "avgClassificatie": { + "gdprClassification": { "categories": ["financieel", "medisch"], "specialPersonalData": true, "justification": "artikel-9-2-b-avg", @@ -1260,7 +1260,7 @@ "handlerId": "klantmanager-512", "districtTeam": "werk-en-inkomenteam-centrum", "status": "beschikking-voorbereiding", - "avgClassificatie": { + "gdprClassification": { "categories": ["financieel", "gezinssituatie"], "specialPersonalData": true, "justification": "artikel-9-2-b-avg", diff --git a/lib/Settings/register.d/60-termijnbewaking.json b/lib/Settings/register.d/60-termijnbewaking.json index f3718bd21..89a7eb540 100644 --- a/lib/Settings/register.d/60-termijnbewaking.json +++ b/lib/Settings/register.d/60-termijnbewaking.json @@ -3,18 +3,18 @@ "registers": { "procest": { "schemas": [ - "termijnDefinitie", - "termijnInstance", + "deadlineDefinition", + "deadlineInstance", "termijnGebeurtenis", - "ingebrekestelling", - "dwangsomBerekening", + "noticeOfDefault", + "penaltyPaymentCalculation", "dwangsomUitbetaling" ] } }, "schemas": { - "termijnDefinitie": { - "slug": "termijnDefinitie", + "deadlineDefinition": { + "slug": "deadlineDefinition", "icon": "TimerOutline", "version": "1.0.0", "x-schema-org": "schema:DefinedTerm", @@ -108,8 +108,8 @@ } } }, - "termijnInstance": { - "slug": "termijnInstance", + "deadlineInstance": { + "slug": "deadlineInstance", "icon": "TimerSandFull", "version": "1.0.0", "x-schema-org": "schema:Action", @@ -118,7 +118,7 @@ "type": "object", "required": [ "case", - "termijnDefinitie", + "deadlineDefinition", "startDate", "endDateCalculated", "endDateCurrent", @@ -131,7 +131,7 @@ "description": "Reference to the procest case (case id)", "facetable": true }, - "termijnDefinitie": { + "deadlineDefinition": { "type": "string", "title": "Deadline Definition Reference", "description": "Reference to the TermijnDefinitie this instance materialised from" @@ -203,12 +203,12 @@ "description": "Immutable append-only audit log entry for any termijn lifecycle event. Once written, never updated.", "type": "object", "required": [ - "termijnInstance", + "deadlineInstance", "type", "moment" ], "properties": { - "termijnInstance": { + "deadlineInstance": { "type": "string", "title": "Deadline Instance Reference", "description": "TermijnInstance reference", @@ -266,8 +266,8 @@ } } }, - "ingebrekestelling": { - "slug": "ingebrekestelling", + "noticeOfDefault": { + "slug": "noticeOfDefault", "icon": "EmailAlert", "version": "1.0.0", "x-schema-org": "schema:Message", @@ -275,12 +275,12 @@ "description": "Burger notice that the deadline has lapsed (AWB 4:17). Validated against the TermijnInstance to start a DwangsomBerekening.", "type": "object", "required": [ - "termijnInstance", + "deadlineInstance", "receiptDate", - "kanaal" + "notificationChannel" ], "properties": { - "termijnInstance": { + "deadlineInstance": { "type": "string", "title": "Deadline Instance Reference", "description": "TermijnInstance the notice relates to", @@ -292,7 +292,7 @@ "title": "Receipt Date", "description": "Date the notice arrived" }, - "kanaal": { + "notificationChannel": { "type": "string", "enum": ["post", "email", "portaal", "balie", "phone"], "title": "Channel", @@ -324,8 +324,8 @@ } } }, - "dwangsomBerekening": { - "slug": "dwangsomBerekening", + "penaltyPaymentCalculation": { + "slug": "penaltyPaymentCalculation", "icon": "Calculator", "version": "1.0.0", "x-schema-org": "schema:MonetaryAmount", @@ -333,17 +333,17 @@ "description": "Daily-accruing dwangsom calculation per AWB 4:17. Tracks current day, tariff tier, cumulative amount in EUR cents, plafond enforcement.", "type": "object", "required": [ - "ingebrekestelling", + "noticeOfDefault", "startDate" ], "properties": { - "ingebrekestelling": { + "noticeOfDefault": { "type": "string", "title": "Default Notice Reference", "description": "Ingebrekestelling that started the calculation", "facetable": true }, - "termijnInstance": { + "deadlineInstance": { "type": "string", "title": "Deadline Instance Reference", "description": "Convenience back-reference to the termijn" @@ -419,12 +419,12 @@ "description": "Payment signal towards the burger after the dwangsom is locked.", "type": "object", "required": [ - "dwangsomBerekening", + "penaltyPaymentCalculation", "amount", "reference" ], "properties": { - "dwangsomBerekening": { + "penaltyPaymentCalculation": { "type": "string", "title": "Penalty Calculation Reference", "description": "Berekening reference", diff --git a/src/dialogs/BesluitRegistration.vue b/src/dialogs/BesluitRegistration.vue index 1bb9e57f8..d7da26a76 100644 --- a/src/dialogs/BesluitRegistration.vue +++ b/src/dialogs/BesluitRegistration.vue @@ -105,7 +105,7 @@ export default { }, props: { - voorstel: { + proposal: { type: Object, required: true, }, @@ -117,7 +117,7 @@ export default { decisionTypes: [], selectedDecisionType: null, form: { - title: this.voorstel.subject || '', + title: this.proposal.subject || '', effectiveDate: new Date().toISOString().split('T')[0], explanation: '', governingBody: 'College van B&W', @@ -175,7 +175,7 @@ export default { // procest keeps the parafeerroute untouched; only the besluit // decision is delegated, and the besluit is materialised from // the decidesk outcome. - await registerBesluit(this.voorstel.id || this.voorstel._self?.id, { + await registerBesluit(this.proposal.id || this.proposal._self?.id, { title: this.form.title.trim(), effectiveDate: this.form.effectiveDate || undefined, explanation: this.form.explanation || undefined, @@ -187,8 +187,8 @@ export default { // Reflect the awaiting-decidesk state on the voorstel (projection; // the decided besluit lands when decidesk posts the outcome). - await this.objectStore.saveObject('voorstel', { - ...this.voorstel, + await this.objectStore.saveObject('proposal', { + ...this.proposal, status: 'awaiting-decidesk', }) diff --git a/src/dialogs/ParafeerActieDialog.vue b/src/dialogs/ParafeerActieDialog.vue index 7fe0070ba..1e30c5899 100644 --- a/src/dialogs/ParafeerActieDialog.vue +++ b/src/dialogs/ParafeerActieDialog.vue @@ -244,7 +244,7 @@ export default { */ buildPayload(action) { const payload = { - voorstel: this.voorstelId, + proposal: this.voorstelId, action, } if (this.comment.trim() !== '') payload.comment = this.comment.trim() @@ -280,7 +280,7 @@ export default { } this.validationError = '' const payload = { - voorstel: this.voorstelId, + proposal: this.voorstelId, action: 'returned', comment: this.returnReason.trim(), } diff --git a/src/dialogs/VoorstelCreateDialog.vue b/src/dialogs/VoorstelCreateDialog.vue index 8fbea8ec5..9f793af8e 100644 --- a/src/dialogs/VoorstelCreateDialog.vue +++ b/src/dialogs/VoorstelCreateDialog.vue @@ -219,10 +219,10 @@ export default { voorstelData.parafeerroute = routeId } - await this.objectStore.saveObject('voorstel', voorstelData) + await this.objectStore.saveObject('proposal', voorstelData) this.$emit('created') } catch (error) { - console.error('Failed to create voorstel:', error) + console.error('Failed to create proposal:', error) this.errors.subject = error.message || t('procest', 'Failed to create') } finally { @@ -234,7 +234,7 @@ export default { diff --git a/src/views/voorstellen/components/ParafeerActionBar.vue b/src/views/voorstellen/components/ParafeerActionBar.vue index bce0a0b5e..87a7dc137 100644 --- a/src/views/voorstellen/components/ParafeerActionBar.vue +++ b/src/views/voorstellen/components/ParafeerActionBar.vue @@ -110,7 +110,7 @@ export default { }, props: { - voorstel: { + proposal: { type: Object, required: true, }, @@ -173,8 +173,8 @@ export default { // Create parafeeractie const actieData = { - voorstel: this.voorstel.id, - step: this.voorstel.currentStep, + proposal: this.proposal.id, + step: this.proposal.currentStep, actor: userId, actorType: this.isDelegating ? 'delegate' : 'user', action: 'parafered', @@ -186,11 +186,11 @@ export default { await this.objectStore.saveObject('parafeeractie', actieData) // Advance voorstel - const nextStep = getNextStep(this.voorstel) - const newStatus = getStatusAfterAdvance(this.voorstel) - await this.objectStore.saveObject('voorstel', { - ...this.voorstel, - currentStep: nextStep || this.voorstel.currentStep, + const nextStep = getNextStep(this.proposal) + const newStatus = getStatusAfterAdvance(this.proposal) + await this.objectStore.saveObject('proposal', { + ...this.proposal, + currentStep: nextStep || this.proposal.currentStep, status: newStatus, }) @@ -209,19 +209,19 @@ export default { const userId = getCurrentUser()?.uid || '' await this.objectStore.saveObject('parafeeractie', { - voorstel: this.voorstel.id, - step: this.voorstel.currentStep, + proposal: this.proposal.id, + step: this.proposal.currentStep, actor: userId, actorType: 'user', action: 'advised', advice: this.adviceText, }) - const nextStep = getNextStep(this.voorstel) - const newStatus = getStatusAfterAdvance(this.voorstel) - await this.objectStore.saveObject('voorstel', { - ...this.voorstel, - currentStep: nextStep || this.voorstel.currentStep, + const nextStep = getNextStep(this.proposal) + const newStatus = getStatusAfterAdvance(this.proposal) + await this.objectStore.saveObject('proposal', { + ...this.proposal, + currentStep: nextStep || this.proposal.currentStep, status: newStatus, }) @@ -245,18 +245,18 @@ export default { const userId = getCurrentUser()?.uid || '' await this.objectStore.saveObject('parafeeractie', { - voorstel: this.voorstel.id, - step: this.voorstel.currentStep, + proposal: this.proposal.id, + step: this.proposal.currentStep, actor: userId, actorType: 'user', action: 'returned', comment: this.returnComment.trim(), }) - await this.objectStore.saveObject('voorstel', { - ...this.voorstel, + await this.objectStore.saveObject('proposal', { + ...this.proposal, status: 'teruggestuurd', - returnedFromStep: this.voorstel.currentStep, + returnedFromStep: this.proposal.currentStep, }) this.$emit('action-completed') diff --git a/src/views/voorstellen/components/ParafeerInbox.vue b/src/views/voorstellen/components/ParafeerInbox.vue index 0ba024b5f..40b7966a0 100644 --- a/src/views/voorstellen/components/ParafeerInbox.vue +++ b/src/views/voorstellen/components/ParafeerInbox.vue @@ -102,7 +102,7 @@ export default { async loadVoorstellen() { this.loading = true try { - const results = await this.objectStore.fetchCollection('voorstel', { + const results = await this.objectStore.fetchCollection('proposal', { _limit: 200, }) this.voorstellen = Array.isArray(results) diff --git a/tests/Unit/Lifecycle/VoorstelLifecycleTest.php b/tests/Unit/Lifecycle/VoorstelLifecycleTest.php index 5834c8893..8bbfb0176 100644 --- a/tests/Unit/Lifecycle/VoorstelLifecycleTest.php +++ b/tests/Unit/Lifecycle/VoorstelLifecycleTest.php @@ -48,7 +48,7 @@ final class VoorstelLifecycleTest extends TestCase { protected function setUp(): void { $registerPath = __DIR__ . '/../../../lib/Settings/procest_register.json'; $register = json_decode((string)file_get_contents($registerPath), true); - $proposal = $register['components']['schemas']['voorstel'] ?? []; + $proposal = $register['components']['schemas']['proposal'] ?? []; $this->lifecycle = ($proposal['configuration']['x-openregister-lifecycle'] ?? []); }//end setUp() diff --git a/tests/Unit/Listener/ApprovalStepNotificationListenerTest.php b/tests/Unit/Listener/ApprovalStepNotificationListenerTest.php index 35372ceab..cae73de4d 100644 --- a/tests/Unit/Listener/ApprovalStepNotificationListenerTest.php +++ b/tests/Unit/Listener/ApprovalStepNotificationListenerTest.php @@ -161,7 +161,7 @@ public function find(string $id, ...$kw): array { $this->settings->method('getObjectService')->willReturn($objectService); $this->settings->method('getConfigValue')->willReturnCallback( static function (string $key): string { - return $key === 'register' ? 'reg' : 'voorstel'; + return $key === 'register' ? 'reg' : 'proposal'; } ); }//end stubVoorstel() diff --git a/tests/Unit/Listener/ParaferingAuditListenerTest.php b/tests/Unit/Listener/ParaferingAuditListenerTest.php index 66c5fd150..716220606 100644 --- a/tests/Unit/Listener/ParaferingAuditListenerTest.php +++ b/tests/Unit/Listener/ParaferingAuditListenerTest.php @@ -136,7 +136,7 @@ public function testApprovedTransitionEmitsOrAuditEntry(): void { $this->settings->method('getConfigValue')->willReturnMap( [ ['register', '', 'procest'], - ['voorstel_schema', '', 'voorstel'], + ['voorstel_schema', '', 'proposal'], ] ); @@ -186,7 +186,7 @@ public function testTransitionWithoutReasonOmitsComment(): void { $this->settings->method('getConfigValue')->willReturnMap( [ ['register', '', 'procest'], - ['voorstel_schema', '', 'voorstel'], + ['voorstel_schema', '', 'proposal'], ] ); @@ -230,7 +230,7 @@ public function testUnresolvableVoorstelSkipsWriteAndDoesNotThrow(): void { $this->settings->method('getConfigValue')->willReturnMap( [ ['register', '', 'procest'], - ['voorstel_schema', '', 'voorstel'], + ['voorstel_schema', '', 'proposal'], ] ); @@ -262,7 +262,7 @@ public function testRawTransitionNameNamespacedVerbatim(): void { $this->settings->method('getConfigValue')->willReturnMap( [ ['register', '', 'procest'], - ['voorstel_schema', '', 'voorstel'], + ['voorstel_schema', '', 'proposal'], ] ); diff --git a/tests/Unit/Repair/RenameDutchSchemaSlugDecisionsTest.php b/tests/Unit/Repair/RenameDutchSchemaSlugDecisionsTest.php new file mode 100644 index 000000000..ea11baeb8 --- /dev/null +++ b/tests/Unit/Repair/RenameDutchSchemaSlugDecisionsTest.php @@ -0,0 +1,162 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * @link https://www.conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Procest\Tests\Unit\Repair; + +use OCA\Procest\Repair\RenameDutchSchemaSlugDecisions; +use OCA\Procest\Repair\RenameDutchSchemaSlugs; +use PHPUnit\Framework\TestCase; + +/** + * The slug migration's decisions, exercised without a database. + * + * PHPUnit assertions take positional arguments; the named-parameter sniff does + * not apply to them. + * + * phpcs:disable CustomSniffs.Functions.NamedParameters + * + * @covers \OCA\Procest\Repair\RenameDutchSchemaSlugDecisions + */ +final class RenameDutchSchemaSlugDecisionsTest extends TestCase { + + /** + * The decisions under test. + * + * @var RenameDutchSchemaSlugDecisions + */ + private RenameDutchSchemaSlugDecisions $decisions; + + /** + * Set up the subject. + * + * @return void + */ + protected function setUp(): void { + parent::setUp(); + $this->decisions = new RenameDutchSchemaSlugDecisions(); + + }//end setUp() + + /** + * A slug present on the install is renamed; one that is absent is skipped. + * + * @return void + */ + public function testPlanRenamesOnlyWhatIsPresent(): void { + $plan = $this->decisions->plan( + ['catalogus' => 'catalog', 'voorstel' => 'proposal'], + ['catalogus', 'module'] + ); + + self::assertSame(['catalogus' => 'catalog'], $plan['renames']); + self::assertSame([], $plan['refused'], 'an absent slug is nothing to do, not a refusal'); + + }//end testPlanRenamesOnlyWhatIsPresent() + + /** + * A target that already exists refuses the rename rather than merging. + * + * Two schemas cannot share a slug, and combining them is a decision about + * data — never something a repair step should do on its own. + * + * @return void + */ + public function testPlanRefusesWhenTheTargetSlugExists(): void { + $plan = $this->decisions->plan( + ['catalogus' => 'catalog'], + ['catalogus', 'catalog'] + ); + + self::assertSame([], $plan['renames']); + self::assertArrayHasKey('catalogus', $plan['refused']); + self::assertStringContainsString('catalog', $plan['refused']['catalogus']); + + }//end testPlanRefusesWhenTheTargetSlugExists() + + /** + * A rename earlier in the map is visible to a later collision check. + * + * Without carrying the freshly taken name forward, two entries aiming at the + * same target would both read as safe and the second would collide at the + * database rather than here. + * + * @return void + */ + public function testPlanSeesItsOwnEarlierRenames(): void { + $plan = $this->decisions->plan( + ['catalogus' => 'catalog', 'catalogus2' => 'catalog'], + ['catalogus', 'catalogus2'] + ); + + self::assertSame(['catalogus' => 'catalog'], $plan['renames']); + self::assertArrayHasKey('catalogus2', $plan['refused']); + + }//end testPlanSeesItsOwnEarlierRenames() + + /** + * Schema ids are read out of the registers' JSON column defensively. + * + * A null, a malformed value or a non-numeric entry must yield no ids rather + * than a fatal: this runs inside a repair step, where an exception aborts + * the upgrade. + * + * @return void + */ + public function testSchemaIdsFromToleratesMalformedRows(): void { + $ids = $this->decisions->schemaIdsFrom([ + ['schemas' => '[34,35,35]'], + ['schemas' => '[40,"not-a-number",null]'], + ['schemas' => 'not json at all'], + ['schemas' => null], + [], + ]); + + self::assertSame([34, 35, 40], $ids, 'deduplicated, numeric only, no fatal'); + + }//end testSchemaIdsFromToleratesMalformedRows() + + + /** + * Every target in the shipped map is English and distinct. + * + * A duplicate target would mean two schemas aimed at one name; a target that + * is also somebody else's OLD name would mean the order of the map decides + * the outcome. + * + * @return void + */ + public function testShippedMapTargetsAreDistinctAndDoNotCollideWithSources(): void { + $map = RenameDutchSchemaSlugs::SLUG_MAP; + + self::assertSame( + count($map), + count(array_unique(array_values($map))), + 'two slugs must not target one name' + ); + + $sources = array_keys($map); + foreach ($map as $old => $new) { + self::assertNotContains( + $new, + $sources, + sprintf("target '%s' is also a source slug, so the map order would decide the result", $new) + ); + } + + }//end testShippedMapTargetsAreDistinctAndDoNotCollideWithSources() +}//end class diff --git a/tests/Unit/Service/BerichtenboxRoutingServiceTest.php b/tests/Unit/Service/BerichtenboxRoutingServiceTest.php index e384315ce..a099cddab 100644 --- a/tests/Unit/Service/BerichtenboxRoutingServiceTest.php +++ b/tests/Unit/Service/BerichtenboxRoutingServiceTest.php @@ -68,7 +68,7 @@ public function testBurgerRoutesToMijnOverheid(): void { ], ]); - $this->assertSame('berichtenbox-mijnoverheid', $result['kanaal']); + $this->assertSame('berichtenbox-mijnoverheid', $result['notificationChannel']); $this->assertNotEmpty($result['messageId']); $this->assertSame('systeem', $result['sentBy']); }//end testBurgerRoutesToMijnOverheid() @@ -88,7 +88,7 @@ public function testBedrijfRoutesToEherkenning(): void { ], ]); - $this->assertSame('berichtenbox-eherkenning', $result['kanaal']); + $this->assertSame('berichtenbox-eherkenning', $result['notificationChannel']); }//end testBedrijfRoutesToEherkenning() /** @@ -106,6 +106,6 @@ public function testFallbackToPrint(): void { ], ]); - $this->assertSame('print-post', $result['kanaal']); + $this->assertSame('print-post', $result['notificationChannel']); }//end testFallbackToPrint() }//end class diff --git a/tests/Unit/Service/DeadlineDailyScanServiceTest.php b/tests/Unit/Service/DeadlineDailyScanServiceTest.php index 17f1f5ac4..a93805e56 100644 --- a/tests/Unit/Service/DeadlineDailyScanServiceTest.php +++ b/tests/Unit/Service/DeadlineDailyScanServiceTest.php @@ -56,8 +56,8 @@ protected function setUp(): void { static function (string $key): string { return match ($key) { 'register' => 'procest', - 'termijn_definitie_schema' => 'termijnDefinitie', - 'termijn_instance_schema' => 'termijnInstance', + 'termijn_definitie_schema' => 'deadlineDefinition', + 'termijn_instance_schema' => 'deadlineInstance', 'termijn_gebeurtenis_schema' => 'termijnGebeurtenis', default => '', }; @@ -82,9 +82,9 @@ static function (string $key): string { * @return array */ private function seedInstance(string $deadline, string $status = 'lopend'): array { - return $this->objects->saveObject('procest', 'termijnInstance', [ + return $this->objects->saveObject('procest', 'deadlineInstance', [ 'case' => 'Z/2026/X', - 'termijnDefinitie' => 'td-ov', + 'deadlineDefinition' => 'td-ov', 'startDate' => '2026-01-01T10:00:00+00:00', 'endDateCalculated' => $deadline, 'endDateCurrent' => $deadline, @@ -134,7 +134,7 @@ public function testScanFlipsOverdueInstanceToOverschreden(): void { self::assertSame(1, $counts['overschreden']); self::assertSame(1, $counts['escalated']); - $rows = array_values($this->objects->store['termijnInstance']); + $rows = array_values($this->objects->store['deadlineInstance']); self::assertSame('overschreden', $rows[0]['status']); $events = array_values($this->objects->store['termijnGebeurtenis'] ?? []); @@ -148,7 +148,7 @@ public function testScanFlipsOverdueInstanceToOverschreden(): void { public function testScanRaisesPauseExpiredEvent(): void { $row = $this->seedInstance('2026-07-01', 'gepauzeerd'); $row['pauseDeadline'] = '2026-05-30'; - $this->objects->store['termijnInstance'][$row['id']] = $row; + $this->objects->store['deadlineInstance'][$row['id']] = $row; $counts = $this->scan->run(new DateTimeImmutable('2026-06-01T10:00:00+00:00')); self::assertSame(1, $counts['pauseExpired']); @@ -188,10 +188,10 @@ public function testScanAccruesEveryLopendDwangsomBerekening(): void { static function (string $key): string { return match ($key) { 'register' => 'procest', - 'termijn_definitie_schema' => 'termijnDefinitie', - 'termijn_instance_schema' => 'termijnInstance', + 'termijn_definitie_schema' => 'deadlineDefinition', + 'termijn_instance_schema' => 'deadlineInstance', 'termijn_gebeurtenis_schema' => 'termijnGebeurtenis', - 'dwangsom_berekening_schema' => 'dwangsomBerekening', + 'dwangsom_berekening_schema' => 'penaltyPaymentCalculation', default => '', }; }, @@ -208,9 +208,9 @@ static function (string $key): string { // Three lopend rows on day 0 — tier-1 increment is €23 (2300 cents). foreach (['b1', 'b2', 'b3'] as $id) { - $this->objects->saveObject('procest', 'dwangsomBerekening', [ + $this->objects->saveObject('procest', 'penaltyPaymentCalculation', [ 'id' => $id, - 'termijnInstance' => 'ti-' . $id, + 'deadlineInstance' => 'ti-' . $id, 'currentDag' => 0, 'cumulativeAmount' => 0, 'plafondBereikt' => false, @@ -218,9 +218,9 @@ static function (string $key): string { ]); } // One stopped row must be skipped. - $this->objects->saveObject('procest', 'dwangsomBerekening', [ + $this->objects->saveObject('procest', 'penaltyPaymentCalculation', [ 'id' => 'b-stopped', - 'termijnInstance' => 'ti-stopped', + 'deadlineInstance' => 'ti-stopped', 'currentDag' => 99, 'cumulativeAmount' => 999999, 'plafondBereikt' => false, @@ -233,11 +233,11 @@ static function (string $key): string { // Verify each lopend row advanced one tier-1 day; stopped row untouched. foreach (['b1', 'b2', 'b3'] as $id) { - $row = $this->objects->store['dwangsomBerekening'][$id]; + $row = $this->objects->store['penaltyPaymentCalculation'][$id]; self::assertSame(1, $row['currentDag'], $id . ' must advance huidigeDag by 1.'); self::assertSame(2300, $row['cumulativeAmount'], $id . ' must add tier-1 (2300 cents) once.'); } - $stopped = $this->objects->store['dwangsomBerekening']['b-stopped']; + $stopped = $this->objects->store['penaltyPaymentCalculation']['b-stopped']; self::assertSame(99, $stopped['currentDag'], 'stopped row must not advance.'); self::assertSame(999999, $stopped['cumulativeAmount'], 'stopped row must not accrue.'); } diff --git a/tests/Unit/Service/DeadlineMonitoringEndToEndTest.php b/tests/Unit/Service/DeadlineMonitoringEndToEndTest.php index 5a719a408..9a3fcbb74 100644 --- a/tests/Unit/Service/DeadlineMonitoringEndToEndTest.php +++ b/tests/Unit/Service/DeadlineMonitoringEndToEndTest.php @@ -69,11 +69,11 @@ protected function setUp(): void { static function (string $key): string { return match ($key) { 'register' => 'procest', - 'termijn_definitie_schema' => 'termijnDefinitie', - 'termijn_instance_schema' => 'termijnInstance', + 'termijn_definitie_schema' => 'deadlineDefinition', + 'termijn_instance_schema' => 'deadlineInstance', 'termijn_gebeurtenis_schema' => 'termijnGebeurtenis', - 'ingebrekestelling_schema' => 'ingebrekestelling', - 'dwangsom_berekening_schema' => 'dwangsomBerekening', + 'ingebrekestelling_schema' => 'noticeOfDefault', + 'dwangsom_berekening_schema' => 'penaltyPaymentCalculation', 'dwangsom_uitbetaling_schema' => 'dwangsomUitbetaling', default => '', }; @@ -103,7 +103,7 @@ static function (string $key): string { ); // Seed AWB-default Wmo definition. - $this->objects->saveObject('procest', 'termijnDefinitie', [ + $this->objects->saveObject('procest', 'deadlineDefinition', [ 'id' => 'td-ov', 'caseType' => 'omgevingsvergunning-regulier', 'wettelijkeGrondslag' => 'Wabo 3.9 lid 1', @@ -192,9 +192,9 @@ public function testScenario3ExtensionCase(): void { */ public function testScenario4OverschrijdingAndDwangsom(): void { // Seed overdue instance directly to simulate elapsed time without sleeping. - $instance = $this->objects->saveObject('procest', 'termijnInstance', [ + $instance = $this->objects->saveObject('procest', 'deadlineInstance', [ 'case' => 'Z/2026/S4', - 'termijnDefinitie' => 'td-ov', + 'deadlineDefinition' => 'td-ov', 'startDate' => '2026-01-01T10:00:00+00:00', 'endDateCalculated' => '2026-02-26', 'endDateCurrent' => '2026-02-26', @@ -211,14 +211,14 @@ public function testScenario4OverschrijdingAndDwangsom(): void { 'doc:notice' ); self::assertTrue($row['gevalideerd']); - self::assertArrayHasKey('dwangsomBerekening', $row); - $calculationId = (string)$row['dwangsomBerekening']['id']; + self::assertArrayHasKey('penaltyPaymentCalculation', $row); + $calculationId = (string)$row['penaltyPaymentCalculation']['id']; // Accrue 5 days. for ($i = 0; $i < 5; $i++) { $this->calcService->calculateDaily($calculationId); } - $accrued = $this->objects->store['dwangsomBerekening'][$calculationId]; + $accrued = $this->objects->store['penaltyPaymentCalculation'][$calculationId]; self::assertSame(5, $accrued['currentDag']); self::assertSame(11500, $accrued['cumulativeAmount']); @@ -254,15 +254,15 @@ public function testScenario4OverschrijdingAndDwangsom(): void { */ public function testScenario5Bezwaar(): void { // Stand up a stopped berekening + linked uitbetaling. - $this->objects->saveObject('procest', 'dwangsomBerekening', [ + $this->objects->saveObject('procest', 'penaltyPaymentCalculation', [ 'id' => 'b-s5', - 'termijnInstance' => 'ti-s5', + 'deadlineInstance' => 'ti-s5', 'status' => 'gestopt-wegens-beschikking', 'definitiveAmount' => 50000, ]); $this->objects->saveObject('procest', 'dwangsomUitbetaling', [ 'id' => 'u-s5', - 'dwangsomBerekening' => 'b-s5', + 'penaltyPaymentCalculation' => 'b-s5', 'amount' => 50000, 'status' => 'voorbereid', ]); diff --git a/tests/Unit/Service/DeadlineMonitoringSeedDataServiceTest.php b/tests/Unit/Service/DeadlineMonitoringSeedDataServiceTest.php index da460be1e..77e9e178b 100644 --- a/tests/Unit/Service/DeadlineMonitoringSeedDataServiceTest.php +++ b/tests/Unit/Service/DeadlineMonitoringSeedDataServiceTest.php @@ -48,7 +48,7 @@ protected function setUp(): void { static function (string $key): string { return match ($key) { 'register' => 'procest', - 'termijn_definitie_schema' => 'termijnDefinitie', + 'termijn_definitie_schema' => 'deadlineDefinition', default => '', }; }, @@ -69,7 +69,7 @@ public function testSeedCreatesThreeDefinitions(): void { self::assertSame(true, $result['success']); self::assertSame(3, $result['definities']); self::assertSame(0, $result['skipped']); - self::assertCount(3, $this->objects->store['termijnDefinitie']); + self::assertCount(3, $this->objects->store['deadlineDefinition']); } /** @@ -82,7 +82,7 @@ public function testSeedIsIdempotent(): void { self::assertSame(true, $second['success']); self::assertSame(0, $second['definities']); self::assertSame(3, $second['skipped']); - self::assertCount(3, $this->objects->store['termijnDefinitie']); + self::assertCount(3, $this->objects->store['deadlineDefinition']); } /** @@ -91,7 +91,7 @@ public function testSeedIsIdempotent(): void { public function testWooSeedHasCustomRegime(): void { $this->service->seed(); - $woo = $this->objects->store['termijnDefinitie']['td-woo-verzoek']; + $woo = $this->objects->store['deadlineDefinition']['td-woo-verzoek']; self::assertSame('woo-verzoek', $woo['caseType']); self::assertSame(28, $woo['standardDurationDays']); self::assertSame(1500, $woo['deviatingPenaltyPaymentRegime']['dailyTariff']); @@ -104,7 +104,7 @@ public function testWooSeedHasCustomRegime(): void { public function testWmoSeedHas42DayDuration(): void { $this->service->seed(); - $wmo = $this->objects->store['termijnDefinitie']['td-wmo-aanvraag']; + $wmo = $this->objects->store['deadlineDefinition']['td-wmo-aanvraag']; self::assertSame('wmo-melding', $wmo['caseType']); self::assertSame(42, $wmo['standardDurationDays']); self::assertSame(0, $wmo['countExtensions']); diff --git a/tests/Unit/Service/DeadlinePauseExtensionServiceTest.php b/tests/Unit/Service/DeadlinePauseExtensionServiceTest.php index 1ba6fcb7b..ac06034b7 100644 --- a/tests/Unit/Service/DeadlinePauseExtensionServiceTest.php +++ b/tests/Unit/Service/DeadlinePauseExtensionServiceTest.php @@ -57,8 +57,8 @@ protected function setUp(): void { static function (string $key): string { return match ($key) { 'register' => 'procest', - 'termijn_definitie_schema' => 'termijnDefinitie', - 'termijn_instance_schema' => 'termijnInstance', + 'termijn_definitie_schema' => 'deadlineDefinition', + 'termijn_instance_schema' => 'deadlineInstance', 'termijn_gebeurtenis_schema' => 'termijnGebeurtenis', default => '', }; @@ -71,7 +71,7 @@ static function (string $key): string { $this->extService = new DeadlineExtensionService($this->termService); // Seed an Omgevingsvergunning definition (max 1 extension). - $this->objects->saveObject('procest', 'termijnDefinitie', [ + $this->objects->saveObject('procest', 'deadlineDefinition', [ 'id' => 'td-ov', 'caseType' => 'omgevingsvergunning-regulier', 'wettelijkeGrondslag' => 'Wabo 3.9 lid 1', diff --git a/tests/Unit/Service/DeadlineReportingServiceTest.php b/tests/Unit/Service/DeadlineReportingServiceTest.php index f824114ab..01bbdd739 100644 --- a/tests/Unit/Service/DeadlineReportingServiceTest.php +++ b/tests/Unit/Service/DeadlineReportingServiceTest.php @@ -41,7 +41,7 @@ protected function setUp(): void { static function (string $key): string { return match ($key) { 'register' => 'procest', - 'termijn_instance_schema' => 'termijnInstance', + 'termijn_instance_schema' => 'deadlineInstance', 'dwangsom_uitbetaling_schema' => 'dwangsomUitbetaling', default => '', }; @@ -52,7 +52,7 @@ static function (string $key): string { // Seed 5 instances spread across Q2-2026 for one zaaktype. for ($i = 1; $i <= 5; $i++) { - $this->objects->saveObject('procest', 'termijnInstance', [ + $this->objects->saveObject('procest', 'deadlineInstance', [ 'id' => 'ti-q2-' . $i, 'caseType' => 'omgevingsvergunning-regulier', 'case' => 'Z/2026/' . (400 + $i), diff --git a/tests/Unit/Service/DwangsomBezwaarServiceTest.php b/tests/Unit/Service/DwangsomBezwaarServiceTest.php index 8f2707743..1d2e356cf 100644 --- a/tests/Unit/Service/DwangsomBezwaarServiceTest.php +++ b/tests/Unit/Service/DwangsomBezwaarServiceTest.php @@ -46,10 +46,10 @@ protected function setUp(): void { static function (string $key): string { return match ($key) { 'register' => 'procest', - 'termijn_definitie_schema' => 'termijnDefinitie', - 'termijn_instance_schema' => 'termijnInstance', + 'termijn_definitie_schema' => 'deadlineDefinition', + 'termijn_instance_schema' => 'deadlineInstance', 'termijn_gebeurtenis_schema' => 'termijnGebeurtenis', - 'dwangsom_berekening_schema' => 'dwangsomBerekening', + 'dwangsom_berekening_schema' => 'penaltyPaymentCalculation', 'dwangsom_uitbetaling_schema' => 'dwangsomUitbetaling', default => '', }; @@ -64,15 +64,15 @@ static function (string $key): string { ); // Seed berekening + uitbetaling. - $this->objects->saveObject('procest', 'dwangsomBerekening', [ + $this->objects->saveObject('procest', 'penaltyPaymentCalculation', [ 'id' => 'b-1', - 'termijnInstance' => 'ti-1', + 'deadlineInstance' => 'ti-1', 'status' => 'gestopt-wegens-beschikking', 'definitiveAmount' => 50000, ]); $this->objects->saveObject('procest', 'dwangsomUitbetaling', [ 'id' => 'u-1', - 'dwangsomBerekening' => 'b-1', + 'penaltyPaymentCalculation' => 'b-1', 'amount' => 50000, 'status' => 'voorbereid', ]); diff --git a/tests/Unit/Service/DwangsomCalculationServiceTest.php b/tests/Unit/Service/DwangsomCalculationServiceTest.php index a1c250446..4e8585cb6 100644 --- a/tests/Unit/Service/DwangsomCalculationServiceTest.php +++ b/tests/Unit/Service/DwangsomCalculationServiceTest.php @@ -45,9 +45,9 @@ protected function setUp(): void { static function (string $key): string { return match ($key) { 'register' => 'procest', - 'termijn_definitie_schema' => 'termijnDefinitie', - 'termijn_instance_schema' => 'termijnInstance', - 'dwangsom_berekening_schema' => 'dwangsomBerekening', + 'termijn_definitie_schema' => 'deadlineDefinition', + 'termijn_instance_schema' => 'deadlineInstance', + 'dwangsom_berekening_schema' => 'penaltyPaymentCalculation', default => '', }; }, @@ -72,10 +72,10 @@ public function testAwbTierBoundaries(): void { * @return void */ public function testCalculateDailyAdvancesOneDayAtTier1(): void { - $this->objects->saveObject('procest', 'dwangsomBerekening', [ + $this->objects->saveObject('procest', 'penaltyPaymentCalculation', [ 'id' => 'b1', - 'ingebrekestelling' => 'ig-1', - 'termijnInstance' => 'ti-1', + 'noticeOfDefault' => 'ig-1', + 'deadlineInstance' => 'ti-1', 'startDate' => '2026-03-29', 'currentDag' => 0, 'cumulativeAmount' => 0, @@ -96,10 +96,10 @@ public function testCalculateDailyAdvancesOneDayAtTier1(): void { * @return void */ public function testCalculateDailyTransitionsToTier2OnDay15(): void { - $this->objects->saveObject('procest', 'dwangsomBerekening', [ + $this->objects->saveObject('procest', 'penaltyPaymentCalculation', [ 'id' => 'b2', - 'ingebrekestelling' => 'ig-1', - 'termijnInstance' => 'ti-1', + 'noticeOfDefault' => 'ig-1', + 'deadlineInstance' => 'ti-1', 'startDate' => '2026-03-29', 'currentDag' => 14, 'cumulativeAmount' => 32200, @@ -119,10 +119,10 @@ public function testCalculateDailyTransitionsToTier2OnDay15(): void { * @return void */ public function testCalculateDailyTransitionsToTier3OnDay29(): void { - $this->objects->saveObject('procest', 'dwangsomBerekening', [ + $this->objects->saveObject('procest', 'penaltyPaymentCalculation', [ 'id' => 'b3', - 'ingebrekestelling' => 'ig-1', - 'termijnInstance' => 'ti-1', + 'noticeOfDefault' => 'ig-1', + 'deadlineInstance' => 'ti-1', 'startDate' => '2026-03-29', 'currentDag' => 28, 'cumulativeAmount' => 81200, @@ -142,10 +142,10 @@ public function testCalculateDailyTransitionsToTier3OnDay29(): void { * @return void */ public function testCalculateDailyCapsAtPlafond(): void { - $this->objects->saveObject('procest', 'dwangsomBerekening', [ + $this->objects->saveObject('procest', 'penaltyPaymentCalculation', [ 'id' => 'b4', - 'ingebrekestelling' => 'ig-1', - 'termijnInstance' => 'ti-1', + 'noticeOfDefault' => 'ig-1', + 'deadlineInstance' => 'ti-1', 'startDate' => '2026-03-29', 'currentDag' => 41, 'cumulativeAmount' => 142000, @@ -168,10 +168,10 @@ public function testCalculateDailyCapsAtPlafond(): void { * @return void */ public function testStopForBeschikkingLocksDefinitievBedrag(): void { - $this->objects->saveObject('procest', 'dwangsomBerekening', [ + $this->objects->saveObject('procest', 'penaltyPaymentCalculation', [ 'id' => 'b5', - 'ingebrekestelling' => 'ig-1', - 'termijnInstance' => 'ti-1', + 'noticeOfDefault' => 'ig-1', + 'deadlineInstance' => 'ti-1', 'startDate' => '2026-03-29', 'currentDag' => 5, 'cumulativeAmount' => 11500, @@ -194,20 +194,20 @@ public function testStopForBeschikkingLocksDefinitievBedrag(): void { */ public function testCustomRegimeUsesDefinitionTariff(): void { // Seed Woo definition + instance. - $this->objects->saveObject('procest', 'termijnDefinitie', [ + $this->objects->saveObject('procest', 'deadlineDefinition', [ 'id' => 'td-woo', 'caseType' => 'woo-verzoek', 'deviatingPenaltyPaymentRegime' => ['dailyTariff' => 1500, 'plafond' => 50000, 'grace' => 14], 'validFrom' => '2026-01-01', ]); - $this->objects->saveObject('procest', 'termijnInstance', [ + $this->objects->saveObject('procest', 'deadlineInstance', [ 'id' => 'ti-woo', - 'termijnDefinitie' => 'td-woo', + 'deadlineDefinition' => 'td-woo', ]); - $this->objects->saveObject('procest', 'dwangsomBerekening', [ + $this->objects->saveObject('procest', 'penaltyPaymentCalculation', [ 'id' => 'b-woo', - 'ingebrekestelling' => 'ig-woo', - 'termijnInstance' => 'ti-woo', + 'noticeOfDefault' => 'ig-woo', + 'deadlineInstance' => 'ti-woo', 'startDate' => '2026-03-29', 'currentDag' => 0, 'cumulativeAmount' => 0, diff --git a/tests/Unit/Service/DwangsomUitbetalingServiceTest.php b/tests/Unit/Service/DwangsomUitbetalingServiceTest.php index 9732e5130..6f46176d0 100644 --- a/tests/Unit/Service/DwangsomUitbetalingServiceTest.php +++ b/tests/Unit/Service/DwangsomUitbetalingServiceTest.php @@ -43,7 +43,7 @@ protected function setUp(): void { static function (string $key): string { return match ($key) { 'register' => 'procest', - 'dwangsom_berekening_schema' => 'dwangsomBerekening', + 'dwangsom_berekening_schema' => 'penaltyPaymentCalculation', 'dwangsom_uitbetaling_schema' => 'dwangsomUitbetaling', default => '', }; @@ -53,10 +53,10 @@ static function (string $key): string { $this->service = new DwangsomUitbetalingService($settings); // Seed a stopped berekening. - $this->objects->saveObject('procest', 'dwangsomBerekening', [ + $this->objects->saveObject('procest', 'penaltyPaymentCalculation', [ 'id' => 'b-stopped', - 'ingebrekestelling' => 'ig-1', - 'termijnInstance' => 'ti-1', + 'noticeOfDefault' => 'ig-1', + 'deadlineInstance' => 'ti-1', 'status' => 'gestopt-wegens-beschikking', 'definitiveAmount' => 35700, ]); @@ -112,7 +112,7 @@ public function testPrepareBetalingRejectsInvalidIban(): void { * @return void */ public function testPrepareBetalingRejectsZeroAmount(): void { - $this->objects->saveObject('procest', 'dwangsomBerekening', [ + $this->objects->saveObject('procest', 'penaltyPaymentCalculation', [ 'id' => 'b-zero', 'status' => 'gestopt-wegens-beschikking', 'definitiveAmount' => 0, diff --git a/tests/Unit/Service/NoticeOfDefaultServiceTest.php b/tests/Unit/Service/NoticeOfDefaultServiceTest.php index 1f380fe96..ebb511b37 100644 --- a/tests/Unit/Service/NoticeOfDefaultServiceTest.php +++ b/tests/Unit/Service/NoticeOfDefaultServiceTest.php @@ -51,11 +51,11 @@ protected function setUp(): void { static function (string $key): string { return match ($key) { 'register' => 'procest', - 'termijn_definitie_schema' => 'termijnDefinitie', - 'termijn_instance_schema' => 'termijnInstance', + 'termijn_definitie_schema' => 'deadlineDefinition', + 'termijn_instance_schema' => 'deadlineInstance', 'termijn_gebeurtenis_schema' => 'termijnGebeurtenis', - 'ingebrekestelling_schema' => 'ingebrekestelling', - 'dwangsom_berekening_schema' => 'dwangsomBerekening', + 'ingebrekestelling_schema' => 'noticeOfDefault', + 'dwangsom_berekening_schema' => 'penaltyPaymentCalculation', default => '', }; }, @@ -66,7 +66,7 @@ static function (string $key): string { $this->service = new NoticeOfDefaultService($settings, $this->termService, $logger); // Seed an AWB-default definition. - $this->objects->saveObject('procest', 'termijnDefinitie', [ + $this->objects->saveObject('procest', 'deadlineDefinition', [ 'id' => 'td-ov', 'caseType' => 'omgevingsvergunning-regulier', 'wettelijkeGrondslag' => 'Wabo 3.9 lid 1', @@ -76,10 +76,10 @@ static function (string $key): string { ]); // Seed an overdue TermijnInstance. - $this->objects->saveObject('procest', 'termijnInstance', [ + $this->objects->saveObject('procest', 'deadlineInstance', [ 'id' => 'ti-1', 'case' => 'Z/2026/300', - 'termijnDefinitie' => 'td-ov', + 'deadlineDefinition' => 'td-ov', 'startDate' => '2026-01-01T10:00:00+00:00', 'endDateCalculated' => '2026-02-25', 'endDateCurrent' => '2026-02-25', @@ -101,16 +101,16 @@ public function testValidNoticeCreatesBerekeningWithCorrectGrace(): void { self::assertTrue($row['gevalideerd']); self::assertSame('geldig', $row['validityStatus']); - self::assertArrayHasKey('dwangsomBerekening', $row); + self::assertArrayHasKey('penaltyPaymentCalculation', $row); - $b = $row['dwangsomBerekening']; + $b = $row['penaltyPaymentCalculation']; self::assertSame('2026-03-29', $b['startDate']); self::assertSame(144200, $b['plafondCalculated']); self::assertSame('awb-default', $b['regime']); self::assertSame('lopend', $b['status']); // Instance has the notice linked. - $updated = $this->objects->store['termijnInstance']['ti-1']; + $updated = $this->objects->store['deadlineInstance']['ti-1']; self::assertSame((string)$row['id'], $updated['relevantIngbrekes']); } @@ -119,10 +119,10 @@ public function testValidNoticeCreatesBerekeningWithCorrectGrace(): void { */ public function testPrematureNoticeIsRejected(): void { // Use a different instance still in lopend (not overschreden). - $this->objects->saveObject('procest', 'termijnInstance', [ + $this->objects->saveObject('procest', 'deadlineInstance', [ 'id' => 'ti-lopend', 'case' => 'Z/2026/301', - 'termijnDefinitie' => 'td-ov', + 'deadlineDefinition' => 'td-ov', 'startDate' => '2026-01-01T10:00:00+00:00', 'endDateCalculated' => '2026-12-31', 'endDateCurrent' => '2026-12-31', @@ -138,7 +138,7 @@ public function testPrematureNoticeIsRejected(): void { self::assertFalse($row['gevalideerd']); self::assertSame('premaat', $row['validityStatus']); - self::assertArrayNotHasKey('dwangsomBerekening', $row); + self::assertArrayNotHasKey('penaltyPaymentCalculation', $row); } /** @@ -150,7 +150,7 @@ public function testSecondNoticeDoesNotSpawnSecondBerekening(): void { new DateTimeImmutable('2026-03-15'), 'email' ); - self::assertArrayHasKey('dwangsomBerekening', $first); + self::assertArrayHasKey('penaltyPaymentCalculation', $first); $second = $this->service->registerNoticeOfDefault( 'ti-1', @@ -158,17 +158,17 @@ public function testSecondNoticeDoesNotSpawnSecondBerekening(): void { 'post' ); self::assertTrue($second['gevalideerd']); - self::assertArrayNotHasKey('dwangsomBerekening', $second); + self::assertArrayNotHasKey('penaltyPaymentCalculation', $second); // Only one berekening in the store. - self::assertCount(1, $this->objects->store['dwangsomBerekening'] ?? []); + self::assertCount(1, $this->objects->store['penaltyPaymentCalculation'] ?? []); } /** * @return void */ public function testCustomRegimeIsResolvedFromDefinition(): void { - $this->objects->saveObject('procest', 'termijnDefinitie', [ + $this->objects->saveObject('procest', 'deadlineDefinition', [ 'id' => 'td-woo', 'caseType' => 'woo-verzoek', 'wettelijkeGrondslag' => 'Woo art 4.4', @@ -177,10 +177,10 @@ public function testCustomRegimeIsResolvedFromDefinition(): void { 'deviatingPenaltyPaymentRegime' => ['dailyTariff' => 1500, 'plafond' => 50000, 'grace' => 14], 'validFrom' => '2026-01-01', ]); - $this->objects->saveObject('procest', 'termijnInstance', [ + $this->objects->saveObject('procest', 'deadlineInstance', [ 'id' => 'ti-woo', 'case' => 'Z/2026/302', - 'termijnDefinitie' => 'td-woo', + 'deadlineDefinition' => 'td-woo', 'startDate' => '2026-01-01T10:00:00+00:00', 'endDateCalculated' => '2026-01-29', 'endDateCurrent' => '2026-01-29', @@ -193,7 +193,7 @@ public function testCustomRegimeIsResolvedFromDefinition(): void { new DateTimeImmutable('2026-02-15'), 'post' ); - $b = $row['dwangsomBerekening']; + $b = $row['penaltyPaymentCalculation']; self::assertSame('afwijkend', $b['regime']); self::assertSame(50000, $b['plafondCalculated']); } diff --git a/tests/Unit/Service/RemainingDecisionDelegationTest.php b/tests/Unit/Service/RemainingDecisionDelegationTest.php index f916ab4eb..f2ce9c2bd 100644 --- a/tests/Unit/Service/RemainingDecisionDelegationTest.php +++ b/tests/Unit/Service/RemainingDecisionDelegationTest.php @@ -147,7 +147,7 @@ public function testVoorstelBesluitRaisesReportAdoption(): void { 'ra-1', function (DecisionRequestedEvent $event): void { $this->assertSame('report-adoption', $event->getDecisionType()); - $this->assertSame('voorstel', $event->getSubjectSchema()); + $this->assertSame('proposal', $event->getSubjectSchema()); } ); diff --git a/tests/Unit/Service/TermijnNotificationServiceTest.php b/tests/Unit/Service/TermijnNotificationServiceTest.php index b56372168..5854c8d52 100644 --- a/tests/Unit/Service/TermijnNotificationServiceTest.php +++ b/tests/Unit/Service/TermijnNotificationServiceTest.php @@ -49,13 +49,13 @@ protected function setUp(): void { static function (string $key): string { return match ($key) { 'register' => 'procest', - 'termijn_instance_schema' => 'termijnInstance', + 'termijn_instance_schema' => 'deadlineInstance', default => '', }; }, ); - $objects->saveObject('procest', 'termijnInstance', [ + $objects->saveObject('procest', 'deadlineInstance', [ 'id' => 'ti-1', 'case' => 'Z/2026/300', 'endDateCurrent' => '2026-07-27', @@ -78,7 +78,7 @@ public function testOntvangstbevestigingRendersZaakAndDeadline(): void { self::assertSame('Ontvangstbevestiging zaak Z/2026/300', $payload['subject']); self::assertStringContainsString('2026-07-27', $payload['body']); self::assertSame('burger-1', $payload['recipient']); - self::assertSame('ti-1', $payload['termijnInstance']); + self::assertSame('ti-1', $payload['deadlineInstance']); } /** diff --git a/tests/Unit/Service/TermijnServiceTest.php b/tests/Unit/Service/TermijnServiceTest.php index abf956eb5..c2271e919 100644 --- a/tests/Unit/Service/TermijnServiceTest.php +++ b/tests/Unit/Service/TermijnServiceTest.php @@ -49,8 +49,8 @@ protected function setUp(): void { static function (string $key): string { return match ($key) { 'register' => 'procest', - 'termijn_definitie_schema' => 'termijnDefinitie', - 'termijn_instance_schema' => 'termijnInstance', + 'termijn_definitie_schema' => 'deadlineDefinition', + 'termijn_instance_schema' => 'deadlineInstance', 'termijn_gebeurtenis_schema' => 'termijnGebeurtenis', default => '', }; @@ -62,7 +62,7 @@ static function (string $key): string { // Seed two definitions: omgevingsvergunning 56d (active) + Wmo 42d (active). $this->objects->saveObject( 'procest', - 'termijnDefinitie', + 'deadlineDefinition', [ 'id' => 'td-omgevingsvergunning-regulier', 'caseType' => 'omgevingsvergunning-regulier', @@ -74,7 +74,7 @@ static function (string $key): string { ); $this->objects->saveObject( 'procest', - 'termijnDefinitie', + 'deadlineDefinition', [ 'id' => 'td-wmo-aanvraag', 'caseType' => 'wmo-melding', @@ -94,7 +94,7 @@ public function testCreateTermijnInstanceForOmgevingsvergunningHas56DayDeadline( $instance = $this->service->createTermijnInstance('Z/2026/123', 'omgevingsvergunning-regulier', $start); self::assertSame('Z/2026/123', $instance['case']); - self::assertSame('td-omgevingsvergunning-regulier', $instance['termijnDefinitie']); + self::assertSame('td-omgevingsvergunning-regulier', $instance['deadlineDefinition']); self::assertSame('lopend', $instance['status']); self::assertSame('2026-07-27', $instance['endDateCalculated']); self::assertSame('2026-07-27', $instance['endDateCurrent']); @@ -135,7 +135,7 @@ public function testGetTermijnDefinitieReturnsLatestActiveVersion(): void { // Add a newer version of the omgevingsvergunning definition. $this->objects->saveObject( 'procest', - 'termijnDefinitie', + 'deadlineDefinition', [ 'id' => 'td-omgevingsvergunning-regulier-v2', 'caseType' => 'omgevingsvergunning-regulier', @@ -152,8 +152,8 @@ public function testGetTermijnDefinitieReturnsLatestActiveVersion(): void { static function (string $key): string { return match ($key) { 'register' => 'procest', - 'termijn_definitie_schema' => 'termijnDefinitie', - 'termijn_instance_schema' => 'termijnInstance', + 'termijn_definitie_schema' => 'deadlineDefinition', + 'termijn_instance_schema' => 'deadlineInstance', 'termijn_gebeurtenis_schema' => 'termijnGebeurtenis', default => '', }; @@ -223,14 +223,14 @@ public function testExistingTermijnInstanceRetainsOriginalDefinitieAfterVersionB 'omgevingsvergunning-regulier', new DateTimeImmutable('2026-01-15T09:00:00+00:00') ); - self::assertSame('td-omgevingsvergunning-regulier', $existing['termijnDefinitie']); + self::assertSame('td-omgevingsvergunning-regulier', $existing['deadlineDefinition']); // 2026-01-15 + 56 days = 2026-03-12. self::assertSame('2026-03-12', $existing['endDateCalculated']); // Phase 2 — publish a new v2 (70 days) for the same zaaktype. $this->objects->saveObject( 'procest', - 'termijnDefinitie', + 'deadlineDefinition', [ 'id' => 'td-omgevingsvergunning-regulier-v2', 'caseType' => 'omgevingsvergunning-regulier', @@ -245,7 +245,7 @@ public function testExistingTermijnInstanceRetainsOriginalDefinitieAfterVersionB // at creation time and is never re-resolved against the catalogue. $reloaded = $this->service->getTermijnInstance((string)$existing['id']); self::assertNotNull($reloaded); - self::assertSame('td-omgevingsvergunning-regulier', $reloaded['termijnDefinitie']); + self::assertSame('td-omgevingsvergunning-regulier', $reloaded['deadlineDefinition']); self::assertSame('2026-03-12', $reloaded['endDateCalculated']); // Phase 4 — a brand-new instance for the same zaaktype binds to v2. @@ -257,8 +257,8 @@ public function testExistingTermijnInstanceRetainsOriginalDefinitieAfterVersionB static function (string $key): string { return match ($key) { 'register' => 'procest', - 'termijn_definitie_schema' => 'termijnDefinitie', - 'termijn_instance_schema' => 'termijnInstance', + 'termijn_definitie_schema' => 'deadlineDefinition', + 'termijn_instance_schema' => 'deadlineInstance', 'termijn_gebeurtenis_schema' => 'termijnGebeurtenis', default => '', }; @@ -271,7 +271,7 @@ static function (string $key): string { 'omgevingsvergunning-regulier', new DateTimeImmutable('2026-04-01T09:00:00+00:00') ); - self::assertSame('td-omgevingsvergunning-regulier-v2', $fresh['termijnDefinitie']); + self::assertSame('td-omgevingsvergunning-regulier-v2', $fresh['deadlineDefinition']); // 2026-04-01 + 70 days = 2026-06-10. self::assertSame('2026-06-10', $fresh['endDateCalculated']); }//end testExistingTermijnInstanceRetainsOriginalDefinitieAfterVersionBump() diff --git a/tests/Unit/Service/VergaderingCaseServiceTest.php b/tests/Unit/Service/VergaderingCaseServiceTest.php index fed512f61..9c5166597 100644 --- a/tests/Unit/Service/VergaderingCaseServiceTest.php +++ b/tests/Unit/Service/VergaderingCaseServiceTest.php @@ -124,7 +124,7 @@ public function testCreateForVergaderingReturnsEmptyWhenNoObjectService(): void ->willReturn(null); $result = $this->service->createForVergadering( - vergadering: ['name' => 'Test', 'startDate' => '2026-06-15T19:00:00+02:00'] + meeting: ['name' => 'Test', 'startDate' => '2026-06-15T19:00:00+02:00'] ); $this->assertSame([], $result); @@ -144,7 +144,7 @@ public function testCreateForVergaderingReturnsEmptyWhenConfigMissing(): void { $this->settingsService->method('getConfigValue')->willReturn(''); $result = $this->service->createForVergadering( - vergadering: ['name' => 'Test', 'startDate' => '2026-06-15T19:00:00+02:00'] + meeting: ['name' => 'Test', 'startDate' => '2026-06-15T19:00:00+02:00'] ); $this->assertSame([], $result); @@ -176,7 +176,7 @@ static function (string $register, string $schema, array $object) use (&$capture ['case_schema', '', 'case-schema-id'], ]); - $vergadering = [ + $meeting = [ '@self' => ['slug' => 'raadsvergadering-2026-06-15'], 'name' => 'Raadsvergadering 15 juni 2026', 'startDate' => '2026-06-15T19:00:00+02:00', @@ -184,7 +184,7 @@ static function (string $register, string $schema, array $object) use (&$capture 'organisation' => 'Gemeente Voorbeeldstad', ]; - $result = $this->service->createForVergadering(vergadering: $vergadering); + $result = $this->service->createForVergadering(meeting: $meeting); $this->assertSame(['id' => 'case-123'], $result); $this->assertSame('gepland', $capturedObject['status']); diff --git a/tests/Unit/Service/WorkQueueServiceTest.php b/tests/Unit/Service/WorkQueueServiceTest.php index ed87f957d..b95c1f07d 100644 --- a/tests/Unit/Service/WorkQueueServiceTest.php +++ b/tests/Unit/Service/WorkQueueServiceTest.php @@ -58,7 +58,7 @@ static function (string $key): string { 'register' => 'procest', 'case_schema' => 'case', 'task_schema' => 'task', - 'termijn_instance_schema' => 'termijnInstance', + 'termijn_instance_schema' => 'deadlineInstance', default => '', }; } @@ -243,7 +243,7 @@ public function testComputeQueuePrefersActiveTermijnDeadlineOverCaseField(): voi 'deadline' => '2026-08-01', 'priority' => 'normal', ]); - $this->objects->saveObject('termijnInstance', [ + $this->objects->saveObject('deadlineInstance', [ 'id' => 'ti-1', 'case' => 'case-1', 'status' => 'lopend', diff --git a/tests/Unit/Settings/BezwaarCalculationRegistryTest.php b/tests/Unit/Settings/BezwaarCalculationRegistryTest.php index 0deadf6df..3f0ff5973 100644 --- a/tests/Unit/Settings/BezwaarCalculationRegistryTest.php +++ b/tests/Unit/Settings/BezwaarCalculationRegistryTest.php @@ -192,22 +192,22 @@ public function testDwangsomMatchesWorkedAwbExample(): void { $now = new DateTimeImmutable('2026-03-01T00:00:00+00:00'); // No ingebrekestelling -> no penalty clock -> EUR0 (not the plafond). - $none = $this->eval($expr, ['ingebrekestelling' => null], $now); + $none = $this->eval($expr, ['noticeOfDefault' => null], $now); $this->assertSame(0.0, (float)$none, 'null ingebrekestelling must yield EUR0, never the EUR1442 cap'); // Ingebrekestelling 2026-02-25: grace ends 2026-03-11 -> at 2026-03-01 the // grace has not lapsed -> EUR0. - $withinGrace = $this->eval($expr, ['ingebrekestelling' => '2026-02-25'], $now); + $withinGrace = $this->eval($expr, ['noticeOfDefault' => '2026-02-25'], $now); $this->assertSame(0.0, (float)$withinGrace, 'within the 14-day grace no dwangsom accrues'); // Ingebrekestelling 2026-01-25: grace ends 2026-02-08; at 2026-03-01 that // is 21 penalty days -> tier1 14*23=322 + tier2 7*35=245 = EUR567. - $midTier = $this->eval($expr, ['ingebrekestelling' => '2026-01-25'], $now); + $midTier = $this->eval($expr, ['noticeOfDefault' => '2026-01-25'], $now); $this->assertSame(567.0, (float)$midTier, '21 penalty days = 322 + 245 = 567'); // Ingebrekestelling 2026-01-01: grace ends 2026-01-15; at 2026-03-01 that // is 45 penalty days -> past 42 -> plafond EUR1442. - $capped = $this->eval($expr, ['ingebrekestelling' => '2026-01-01'], $now); + $capped = $this->eval($expr, ['noticeOfDefault' => '2026-01-01'], $now); $this->assertSame(1442.0, (float)$capped, '45 penalty days exceeds 42 -> capped at EUR1442'); }//end testDwangsomMatchesWorkedAwbExample() diff --git a/tests/Unit/Settings/SociaalDomeinFragmentTest.php b/tests/Unit/Settings/SociaalDomeinFragmentTest.php index 2c6fafaeb..5b46a125e 100644 --- a/tests/Unit/Settings/SociaalDomeinFragmentTest.php +++ b/tests/Unit/Settings/SociaalDomeinFragmentTest.php @@ -89,7 +89,7 @@ public function testSupportingSchemasPresent(): void { $this->assertArrayHasKey('mdoOverleg', $schemas); $this->assertArrayHasKey('reIntegratieTraject', $schemas); $this->assertArrayHasKey('toestemming', $schemas); - $this->assertArrayHasKey('avgClassificatie', $schemas); + $this->assertArrayHasKey('gdprClassification', $schemas); $this->assertArrayHasKey('sociaalDomeinAuditLog', $schemas); $this->assertArrayHasKey('avgIncident', $schemas); }//end testSupportingSchemasPresent() @@ -117,12 +117,12 @@ public function testZaaktypesRequireAvgClassificatie(): void { foreach (['wmoZaak', 'jeugdwetZaak', 'participatiewetZaak'] as $caseType) { $this->assertContains( - 'avgClassificatie', + 'gdprClassification', $schemas[$caseType]['required'], $caseType . ' must require an avgClassificatie block' ); $this->assertArrayHasKey( - 'avgClassificatie', + 'gdprClassification', $schemas[$caseType]['properties'], $caseType . ' must expose the avgClassificatie property' ); @@ -147,7 +147,7 @@ public function testRegisterMembershipUnioned(): void { 'participatiewetZaak', 'reIntegratieTraject', 'toestemming', - 'avgClassificatie', + 'gdprClassification', 'sociaalDomeinAuditLog', 'avgIncident', ] as $name) { @@ -200,9 +200,9 @@ public function testSeedRetentionTermsMatchSelectielijst(): void { } } - $this->assertSame(15, $bySlug['zaak-2026-wmo-04832']['avgClassificatie']['retentionTermYears']); - $this->assertSame(20, $bySlug['zaak-2026-jeugd-00921']['avgClassificatie']['retentionTermYears']); - $this->assertSame(10, $bySlug['zaak-2026-pw-01278']['avgClassificatie']['retentionTermYears']); + $this->assertSame(15, $bySlug['zaak-2026-wmo-04832']['gdprClassification']['retentionTermYears']); + $this->assertSame(20, $bySlug['zaak-2026-jeugd-00921']['gdprClassification']['retentionTermYears']); + $this->assertSame(10, $bySlug['zaak-2026-pw-01278']['gdprClassification']['retentionTermYears']); }//end testSeedRetentionTermsMatchSelectielijst() /** diff --git a/tests/Unit/Settings/SubsidieFragmentTest.php b/tests/Unit/Settings/SubsidieFragmentTest.php index 04f37a338..25f199a4e 100644 --- a/tests/Unit/Settings/SubsidieFragmentTest.php +++ b/tests/Unit/Settings/SubsidieFragmentTest.php @@ -102,7 +102,7 @@ public function testSubsidieSchemasPresent(): void { public function testBaseSchemasPreserved(): void { $schemas = $this->merged['components']['schemas']; $this->assertArrayHasKey('case', $schemas); - $this->assertArrayHasKey('voorstel', $schemas); + $this->assertArrayHasKey('proposal', $schemas); }//end testBaseSchemasPreserved() /** diff --git a/tests/e2e/spec-coverage/parafering-audit-via-or.spec.ts b/tests/e2e/spec-coverage/parafering-audit-via-or.spec.ts index a4981d9f6..40afb24e2 100644 --- a/tests/e2e/spec-coverage/parafering-audit-via-or.spec.ts +++ b/tests/e2e/spec-coverage/parafering-audit-via-or.spec.ts @@ -32,7 +32,7 @@ const REPO_ROOT = resolve(__dirname, '../../..') * even when the dev instance has not seeded data. */ function registerConfig(): { register: string; voorstelSchema: string } { - return { register: 'procest', voorstelSchema: 'voorstel' } + return { register: 'procest', voorstelSchema: 'proposal' } } test.describe('Parafering audit via OR — spec coverage', () => { diff --git a/tests/vitest/searchableSchemas.spec.js b/tests/vitest/searchableSchemas.spec.js index 7f510041d..84d3b4cd7 100644 --- a/tests/vitest/searchableSchemas.spec.js +++ b/tests/vitest/searchableSchemas.spec.js @@ -21,7 +21,7 @@ const REGISTER_PATH = path.resolve( ) const MANIFEST_PATH = path.resolve(__dirname, '../../src/manifest.json') -const EXPECTED_SEARCHABLE_SLUGS = ['case', 'task', 'bezwaar', 'voorstel', 'beroep'] +const EXPECTED_SEARCHABLE_SLUGS = ['case', 'task', 'bezwaar', 'proposal', 'beroep'] const loadJson = (filePath) => JSON.parse(fs.readFileSync(filePath, 'utf8')) @@ -61,7 +61,7 @@ describe('deep links cover all searchable schemas', () => { case: '/apps/procest/cases/{uuid}', task: '/apps/procest/tasks/{uuid}', bezwaar: '/apps/procest/bezwaren/{uuid}', - voorstel: '/apps/procest/voorstellen/{uuid}', + proposal: '/apps/procest/voorstellen/{uuid}', beroep: '/apps/procest/beroepen/{uuid}', } @@ -69,7 +69,7 @@ describe('deep links cover all searchable schemas', () => { case: '/cases/:id', task: '/tasks/:id', bezwaar: '/bezwaren/:id', - voorstel: '/voorstellen/:id', + proposal: '/voorstellen/:id', beroep: '/beroepen/:id', } From b98e820347fa39def37293630ba552dd827daba6 Mon Sep 17 00:00:00 2001 From: Conduction Release Bot Date: Sat, 15 Aug 2026 16:39:37 +0200 Subject: [PATCH 02/12] =?UTF-8?q?refactor(procest):=20leave=20the=20ORI=20?= =?UTF-8?q?schemas=20alone=20=E2=80=94=20decidesk=20already=20owns=20this?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reverts six of the fourteen slug renames. procest should not have an ORI schema register at all, so renaming its schemas cements a structure that is going away and mints names that collide conceptually with the ones that are already canonical elsewhere. decidesk already implements the intended architecture, and it is not a plan — it is on development today: Popolo-shaped schemas (Person, Membership, Post, Meeting, Vote, VotingRound, AgendaItem, GovernanceBody, Minutes, Transcript), extended with schema.org through `x-schema-org`, plus OriController and OriSerializer that map them onto ORI. The canonical structure is Popolo; ORI is the mapping over it; and a mapping is configuration, so its vocabulary may stay in the standard's own language. That leaves procest's `ori` register as a duplicate of decidesk's, and the fix is to remove it and consume decidesk's instead — a design change, not a rename. Recorded rather than attempted here. Reverted with the same tooling in reverse, then the twelve resulting column-map entries were removed by hand: the forward six, two of which the second pass had turned into identity mappings (`'stemming' => 'stemming'`), and the reverse six that pointed English at Dutch. Two column-map invariant tests caught exactly that — `testEveryEntryIsSnakeCase` and `testNoTargetIsAlsoASource`. Eight slugs remain in this PR, all procest's own vocabulary: avgClassificatie, catalogus, dwangsomBerekening, ingebrekestelling, kanaal, termijnDefinitie, termijnInstance, voorstel. Re-verified against the same control: PHPUnit 1926 vs 1921 (+5 new), identical 4 errors and 2 failures, none unique. phpstan, psalm, phpmd clean; 386 routes resolve; vitest 349; prettier clean; no duplicate JSON keys, no dangling $refs, no key/slug mismatches. --- appinfo/info.xml | 3 +- .../RaadsinformatieFeedController.php | 20 +- lib/Cron/OriDataQualityCheck.php | 46 +- lib/Repair/RenameDutchColumns.php | 6 - lib/Repair/RenameDutchSchemaSlugs.php | 26 +- lib/Service/VergaderingCaseService.php | 16 +- lib/Settings/ori_register.json | 538 +++++++++--------- .../besluitvorming/VergaderingDetailView.vue | 4 +- .../Service/VergaderingCaseServiceTest.php | 8 +- 9 files changed, 327 insertions(+), 340 deletions(-) diff --git a/appinfo/info.xml b/appinfo/info.xml index e74b1c535..b97f14290 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -128,8 +128,7 @@ Vrij en open source onder de EUPL-1.2-licentie. data stranded behind a schema nothing reads, which presents as an app with no records rather than as an error. Renaming the slug on the existing row first makes the import recognise it. - Ahead of BOTH import triggers: InitializeSettings (procest - register) and RegisterOriRegister (ORI register). + Ahead of the import trigger, InitializeSettings. --> OCA\Procest\Repair\RenameDutchSchemaSlugs OCA\Procest\Repair\InitializeSettings diff --git a/lib/Controller/RaadsinformatieFeedController.php b/lib/Controller/RaadsinformatieFeedController.php index 222a18e62..48816d07a 100644 --- a/lib/Controller/RaadsinformatieFeedController.php +++ b/lib/Controller/RaadsinformatieFeedController.php @@ -100,7 +100,7 @@ public function __construct( public function vergaderingen(string $organisation = ''): DataDisplayResponse { return $this->buildFeed( type: 'vergaderingen', - schema: 'meeting', + schema: 'vergadering', organisation: $organisation ); @@ -121,7 +121,7 @@ public function vergaderingen(string $organisation = ''): DataDisplayResponse { public function agendapunten(string $organisation = ''): DataDisplayResponse { return $this->buildFeed( type: 'agendapunten', - schema: 'agendaItem', + schema: 'agendapunt', organisation: $organisation ); @@ -142,7 +142,7 @@ public function agendapunten(string $organisation = ''): DataDisplayResponse { public function documenten(string $organisation = ''): DataDisplayResponse { return $this->buildFeed( type: 'documenten', - schema: 'councilDocument', + schema: 'raadsdocument', organisation: $organisation ); @@ -172,7 +172,7 @@ private function buildFeed(string $type, string $schema, string $organisation): /** * Fetch the latest objects for the given schema from the ORI register. * - * @param string $schema The ORI schema slug (e.g. "meeting") + * @param string $schema The ORI schema slug (e.g. "vergadering") * @param string $organisation Optional organisatie filter * * @return array Array of object arrays @@ -279,9 +279,9 @@ private function renderEntry(string $schema, array $object): string { */ private function extractTitle(string $schema, array $object): string { return match ($schema) { - 'meeting' => (string)($object['name'] ?? ''), - 'agendaItem' => (string)($object['subject'] ?? ''), - 'councilDocument' => (string)($object['title'] ?? ''), + 'vergadering' => (string)($object['name'] ?? ''), + 'agendapunt' => (string)($object['subject'] ?? ''), + 'raadsdocument' => (string)($object['title'] ?? ''), default => (string)($object['name'] ?? ($object['titel'] ?? $schema)), }; @@ -296,7 +296,7 @@ private function extractTitle(string $schema, array $object): string { * @return string Summary string */ private function extractSummary(string $schema, array $object): string { - if ($schema === 'meeting') { + if ($schema === 'vergadering') { $parts = []; if (empty($object['startDate']) === false) { $parts[] = 'Datum: ' . $object['startDate']; @@ -313,11 +313,11 @@ private function extractSummary(string $schema, array $object): string { return implode(separator: ' | ', array: $parts); } - if ($schema === 'agendaItem') { + if ($schema === 'agendapunt') { return (string)($object['omschrijving'] ?? ''); } - if ($schema === 'councilDocument') { + if ($schema === 'raadsdocument') { $parts = []; if (empty($object['type']) === false) { $parts[] = 'Type: ' . $object['type']; diff --git a/lib/Cron/OriDataQualityCheck.php b/lib/Cron/OriDataQualityCheck.php index a1130609a..12c3bd875 100644 --- a/lib/Cron/OriDataQualityCheck.php +++ b/lib/Cron/OriDataQualityCheck.php @@ -123,7 +123,7 @@ private function checkVergaderingenQuality(object $objectService): array { $vergaderingen = $this->searchObjectsAsArrays( objectService: $objectService, register: 'ori', - schema: 'meeting', + schema: 'vergadering', filters: ['_limit' => 500] ); } catch (\Throwable $e) { @@ -139,7 +139,7 @@ private function checkVergaderingenQuality(object $objectService): array { if (empty($v['location']) === true) { $issues[] = [ - 'schema' => 'meeting', + 'schema' => 'vergadering', 'slug' => $slug, 'field' => 'location', 'severity' => 'warning', @@ -165,7 +165,7 @@ private function checkAgendapuntenReferenceIntegrity(object $objectService): arr $agendapunten = $this->searchObjectsAsArrays( objectService: $objectService, register: 'ori', - schema: 'agendaItem', + schema: 'agendapunt', filters: ['_limit' => 1000] ); } catch (\Throwable $e) { @@ -178,35 +178,35 @@ private function checkAgendapuntenReferenceIntegrity(object $objectService): arr foreach ($agendapunten as $ap) { $apSlug = (string)($ap['@self']['slug'] ?? ($ap['id'] ?? '?')); - $vergaderingRef = (string)($ap['meeting'] ?? ''); + $vergaderingRef = (string)($ap['vergadering'] ?? ''); if (empty($vergaderingRef) === true) { continue; } try { - $meeting = $this->findObjectAsArray( + $vergadering = $this->findObjectAsArray( objectService: $objectService, register: 'ori', - schema: 'meeting', + schema: 'vergadering', id: $vergaderingRef ); - if ($meeting === null) { + if ($vergadering === null) { $issues[] = [ - 'schema' => 'agendaItem', + 'schema' => 'agendapunt', 'slug' => $apSlug, - 'field' => 'meeting', + 'field' => 'vergadering', 'severity' => 'warning', - 'message' => 'Agendapunt references non-existent meeting: ' . $vergaderingRef, + 'message' => 'Agendapunt references non-existent vergadering: ' . $vergaderingRef, ]; } } catch (\Throwable $e) { // Reference resolution failure; log as issue. $issues[] = [ - 'schema' => 'agendaItem', + 'schema' => 'agendapunt', 'slug' => $apSlug, - 'field' => 'meeting', + 'field' => 'vergadering', 'severity' => 'warning', 'message' => 'Agendapunt vergadering reference could not be resolved: ' . $vergaderingRef, ]; @@ -230,7 +230,7 @@ private function checkRaadsledenReferenceIntegrity(object $objectService): array $raadsleden = $this->searchObjectsAsArrays( objectService: $objectService, register: 'ori', - schema: 'councilMember', + schema: 'raadslid', filters: ['_limit' => 500] ); } catch (\Throwable $e) { @@ -239,27 +239,27 @@ private function checkRaadsledenReferenceIntegrity(object $objectService): array foreach ($raadsleden as $rl) { $rlSlug = (string)($rl['@self']['slug'] ?? ($rl['id'] ?? '?')); - $politicalGroupRef = (string)($rl['politicalGroup'] ?? ''); + $politicalGroupRef = (string)($rl['fractie'] ?? ''); if (empty($politicalGroupRef) === true) { continue; } try { - $politicalGroup = $this->findObjectAsArray( + $fractie = $this->findObjectAsArray( objectService: $objectService, register: 'ori', - schema: 'politicalGroup', + schema: 'fractie', id: $politicalGroupRef ); - if ($politicalGroup === null) { + if ($fractie === null) { $issues[] = [ - 'schema' => 'councilMember', + 'schema' => 'raadslid', 'slug' => $rlSlug, - 'field' => 'politicalGroup', + 'field' => 'fractie', 'severity' => 'warning', - 'message' => 'Raadslid references non-existent politicalGroup: ' . $politicalGroupRef, + 'message' => 'Raadslid references non-existent fractie: ' . $politicalGroupRef, ]; } } catch (\Throwable $e) { @@ -284,13 +284,13 @@ private function checkOrphanedDocumenten(object $objectService): array { $documenten = $this->searchObjectsAsArrays( objectService: $objectService, register: 'ori', - schema: 'councilDocument', + schema: 'raadsdocument', filters: ['_limit' => 500] ); $agendapunten = $this->searchObjectsAsArrays( objectService: $objectService, register: 'ori', - schema: 'agendaItem', + schema: 'agendapunt', filters: ['_limit' => 1000] ); } catch (\Throwable $e) { @@ -312,7 +312,7 @@ private function checkOrphanedDocumenten(object $objectService): array { $slug = (string)($doc['@self']['slug'] ?? ($doc['id'] ?? '?')); if (isset($referenced[$slug]) === false) { $issues[] = [ - 'schema' => 'councilDocument', + 'schema' => 'raadsdocument', 'slug' => $slug, 'field' => 'attachments', 'severity' => 'info', diff --git a/lib/Repair/RenameDutchColumns.php b/lib/Repair/RenameDutchColumns.php index f70ee8959..4ed72a639 100644 --- a/lib/Repair/RenameDutchColumns.php +++ b/lib/Repair/RenameDutchColumns.php @@ -539,19 +539,13 @@ class RenameDutchColumns implements IRepairStep { 'wachtwoord_kluis_ref' => 'password_vault_ref', 'zaak_identificatie' => 'case_identification', 'zaak_identificatie_strategie' => 'case_identification_strategy', - 'agendapunt' => 'agenda_item', 'avg_classificatie' => 'gdpr_classification', 'catalogus' => 'catalog', 'dwangsom_berekening' => 'penalty_payment_calculation', - 'fractie' => 'political_group', 'ingebrekestelling' => 'notice_of_default', 'kanaal' => 'notification_channel', - 'raadsdocument' => 'council_document', - 'raadslid' => 'council_member', - 'stemming' => 'vote', 'termijn_definitie' => 'deadline_definition', 'termijn_instance' => 'deadline_instance', - 'vergadering' => 'meeting', 'voorstel' => 'proposal', ]; diff --git a/lib/Repair/RenameDutchSchemaSlugs.php b/lib/Repair/RenameDutchSchemaSlugs.php index bce6b01e9..7eb64611c 100644 --- a/lib/Repair/RenameDutchSchemaSlugs.php +++ b/lib/Repair/RenameDutchSchemaSlugs.php @@ -15,9 +15,8 @@ * table is named for the register and schema IDs, which this step never * touches, so the rows move with the schema untouched. * - * ORDERING: this MUST run before `InitializeSettings` (which triggers the - * procest register import) and before `RegisterOriRegister` (which imports the - * ORI register). Registered first in info.xml's post-migration block. + * ORDERING: this MUST run before `InitializeSettings`, which triggers the + * procest register import. Registered first in info.xml's post-migration block. * * `bezwaar` is deliberately absent. procest declares BOTH `bezwaar` and * `objection`, and they are two entities rather than a duplicate — the @@ -59,29 +58,24 @@ class RenameDutchSchemaSlugs implements IRepairStep { * `catalogus` was already titled "Catalog", `voorstel` "Proposal", `kanaal` * "Notification Channel". * - * The six `ori` schemas are the Open Raadsinformatie / VNG ODS-O standard's - * vocabulary. They are renamed because a SCHEMA is English; the standard's - * own spelling belongs in a MAPPING, which is configuration. procest has no - * ORI mapping yet — it has `LoadDefaultZgwMappings` for ZGW and nothing - * equivalent for ORI — so nothing consumes the standard's spelling from - * these schemas today. + * The `ori` register's schemas are deliberately ABSENT. decidesk already + * owns the canonical Popolo-shaped schemas — Person, Membership, Post, + * Meeting, Vote, VotingRound, AgendaItem, GovernanceBody — extended with + * schema.org, plus an OriController/OriSerializer that maps them onto ORI. + * procest's `ori` register duplicates that and should be REMOVED rather than + * renamed: renaming would cement a structure that is going away, and mint + * names that collide conceptually with decidesk's canonical ones. * * @var array */ public const SLUG_MAP = [ - 'agendapunt' => 'agendaItem', 'avgClassificatie' => 'gdprClassification', 'catalogus' => 'catalog', 'dwangsomBerekening' => 'penaltyPaymentCalculation', - 'fractie' => 'politicalGroup', 'ingebrekestelling' => 'noticeOfDefault', 'kanaal' => 'notificationChannel', - 'raadsdocument' => 'councilDocument', - 'raadslid' => 'councilMember', - 'stemming' => 'vote', 'termijnDefinitie' => 'deadlineDefinition', 'termijnInstance' => 'deadlineInstance', - 'vergadering' => 'meeting', 'voorstel' => 'proposal', ]; @@ -90,7 +84,7 @@ class RenameDutchSchemaSlugs implements IRepairStep { * * @var array */ - private const REGISTER_SLUGS = ['procest', 'ori']; + private const REGISTER_SLUGS = ['procest']; /** * Constructor. diff --git a/lib/Service/VergaderingCaseService.php b/lib/Service/VergaderingCaseService.php index fe93237fe..e1edbfc43 100644 --- a/lib/Service/VergaderingCaseService.php +++ b/lib/Service/VergaderingCaseService.php @@ -82,13 +82,13 @@ public function __construct( * THEN a linked Procest case is created with status "gepland" * AND deadline = startDatum − 7 days (agenda publication deadline). * - * @param array $meeting The vergadering object from the ORI register + * @param array $vergadering The vergadering object from the ORI register * * @return array The created case object, or empty array when skipped * * @spec openspec/changes/open-raadsinformatie/tasks.md#task-5 */ - public function createForVergadering(array $meeting): array { + public function createForVergadering(array $vergadering): array { $objectService = $this->settingsService->getObjectService(); if ($objectService === null) { $this->logger->warning( @@ -109,7 +109,7 @@ public function createForVergadering(array $meeting): array { return []; } - $startDate = ($meeting['startDate'] ?? ''); + $startDate = ($vergadering['startDate'] ?? ''); $deadline = ''; if (empty($startDate) === false) { @@ -125,13 +125,13 @@ public function createForVergadering(array $meeting): array { } $caseData = [ - 'title' => ($meeting['name'] ?? 'Vergadering'), + 'title' => ($vergadering['name'] ?? 'Vergadering'), 'status' => 'gepland', 'deadline' => $deadline, - 'oriVergaderingId' => ($meeting['@self']['slug'] ?? ''), + 'oriVergaderingId' => ($vergadering['@self']['slug'] ?? ''), 'oriRegister' => 'ori', - 'type' => ($meeting['type'] ?? ''), - 'organisation' => ($meeting['organisation'] ?? ''), + 'type' => ($vergadering['type'] ?? ''), + 'organisation' => ($vergadering['organisation'] ?? ''), ]; try { @@ -144,7 +144,7 @@ public function createForVergadering(array $meeting): array { $this->logger->info( 'Procest: created case for vergadering', [ - 'vergaderingSlug' => ($meeting['@self']['slug'] ?? ''), + 'vergaderingSlug' => ($vergadering['@self']['slug'] ?? ''), 'caseId' => ($case['id'] ?? ''), 'deadline' => $deadline, ] diff --git a/lib/Settings/ori_register.json b/lib/Settings/ori_register.json index ec2154997..9dc4a26a8 100644 --- a/lib/Settings/ori_register.json +++ b/lib/Settings/ori_register.json @@ -21,19 +21,19 @@ "description": "Mock ORI register containing council information for the fictional municipality of Voorbeeldstad. Includes meetings, agenda items, documents, votes, council members, and parties based on the VNG ODS-Open-Raadsinformatie specification.", "published": "2025-01-01T00:00:00+00:00", "schemas": [ - "meeting", - "agendaItem", - "councilDocument", - "vote", - "councilMember", - "politicalGroup" + "vergadering", + "agendapunt", + "raadsdocument", + "stemming", + "raadslid", + "fractie" ], "folder": "Open Registers/ORI" } }, "schemas": { - "meeting": { - "slug": "meeting", + "vergadering": { + "slug": "vergadering", "x-schema-org": "schema:Event", "title": "Vergadering", "version": "1.0.0", @@ -118,8 +118,8 @@ ] } }, - "agendaItem": { - "slug": "agendaItem", + "agendapunt": { + "slug": "agendapunt", "title": "Agendapunt", "version": "1.0.0", "published": "2025-01-01T00:00:00+00:00", @@ -128,7 +128,7 @@ "required": [ "subject", "sortOrder", - "meeting" + "vergadering" ], "properties": { "subject": { @@ -150,7 +150,7 @@ "minimum": 1, "title": "Order" }, - "meeting": { + "vergadering": { "type": "string", "description": "Reference (slug) to the parent vergadering", "facetable": true, @@ -178,8 +178,8 @@ ] } }, - "councilDocument": { - "slug": "councilDocument", + "raadsdocument": { + "slug": "raadsdocument", "x-schema-org": "schema:DigitalDocument", "title": "Raadsdocument", "version": "1.0.0", @@ -253,8 +253,8 @@ ] } }, - "vote": { - "slug": "vote", + "stemming": { + "slug": "stemming", "x-schema-org": "schema:VoteAction", "title": "Stemming", "version": "1.0.0", @@ -292,7 +292,7 @@ "facetable": true, "title": "Result" }, - "agendaItem": { + "agendapunt": { "type": "string", "description": "Reference (slug) to the agenda item this vote belongs to", "facetable": true, @@ -322,7 +322,7 @@ "items": { "type": "object", "properties": { - "politicalGroup": { + "fractie": { "type": "string", "description": "Party name", "title": "Party" @@ -355,8 +355,8 @@ ] } }, - "councilMember": { - "slug": "councilMember", + "raadslid": { + "slug": "raadslid", "x-schema-org": "schema:Person", "title": "Raadslid", "version": "1.0.0", @@ -365,7 +365,7 @@ "description": "Represents a person serving in the municipal council, college, or council administration. Includes council members, aldermen, the mayor, and the clerk.", "required": [ "name", - "politicalGroup", + "fractie", "role" ], "properties": { @@ -376,7 +376,7 @@ "facetable": true, "title": "Name" }, - "politicalGroup": { + "fractie": { "type": "string", "description": "Reference (slug) to the party/politicalGroup this member belongs to", "facetable": true, @@ -409,8 +409,8 @@ ] } }, - "politicalGroup": { - "slug": "politicalGroup", + "fractie": { + "slug": "fractie", "x-schema-org": "schema:Organization", "title": "Fractie", "version": "1.0.0", @@ -459,7 +459,7 @@ { "@self": { "register": "ori", - "schema": "politicalGroup", + "schema": "fractie", "slug": "voorbeeldstad-vooruit" }, "name": "Voorbeeldstad Vooruit", @@ -469,7 +469,7 @@ { "@self": { "register": "ori", - "schema": "politicalGroup", + "schema": "fractie", "slug": "groen-links-voorbeeldstad" }, "name": "Groen Links Voorbeeldstad", @@ -479,7 +479,7 @@ { "@self": { "register": "ori", - "schema": "politicalGroup", + "schema": "fractie", "slug": "democraten-voorbeeldstad" }, "name": "Democraten Voorbeeldstad", @@ -489,7 +489,7 @@ { "@self": { "register": "ori", - "schema": "politicalGroup", + "schema": "fractie", "slug": "lokaal-belang" }, "name": "Lokaal Belang", @@ -499,7 +499,7 @@ { "@self": { "register": "ori", - "schema": "politicalGroup", + "schema": "fractie", "slug": "pvda-voorbeeldstad" }, "name": "PvdA Voorbeeldstad", @@ -509,7 +509,7 @@ { "@self": { "register": "ori", - "schema": "politicalGroup", + "schema": "fractie", "slug": "vvd-voorbeeldstad" }, "name": "VVD Voorbeeldstad", @@ -519,7 +519,7 @@ { "@self": { "register": "ori", - "schema": "politicalGroup", + "schema": "fractie", "slug": "sp-voorbeeldstad" }, "name": "SP Voorbeeldstad", @@ -529,7 +529,7 @@ { "@self": { "register": "ori", - "schema": "politicalGroup", + "schema": "fractie", "slug": "forum-voorbeeldstad" }, "name": "Forum Voorbeeldstad", @@ -539,392 +539,392 @@ { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "jan-willem-van-doesburg" }, "name": "Jan-Willem van Doesburg", - "politicalGroup": "voorbeeldstad-vooruit", + "fractie": "voorbeeldstad-vooruit", "role": "burgemeester", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "maria-bakker-de-wit" }, "name": "Maria Bakker-de Wit", - "politicalGroup": "groen-links-voorbeeldstad", + "fractie": "groen-links-voorbeeldstad", "role": "wethouder", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "ahmed-el-mansouri" }, "name": "Ahmed El-Mansouri", - "politicalGroup": "democraten-voorbeeldstad", + "fractie": "democraten-voorbeeldstad", "role": "wethouder", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "petra-koopmans" }, "name": "Petra Koopmans", - "politicalGroup": "voorbeeldstad-vooruit", + "fractie": "voorbeeldstad-vooruit", "role": "wethouder", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "henk-van-der-berg" }, "name": "Henk van der Berg", - "politicalGroup": "voorbeeldstad-vooruit", + "fractie": "voorbeeldstad-vooruit", "role": "griffier", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "klaas-de-vries" }, "name": "Klaas de Vries", - "politicalGroup": "voorbeeldstad-vooruit", + "fractie": "voorbeeldstad-vooruit", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "sandra-jansen" }, "name": "Sandra Jansen", - "politicalGroup": "voorbeeldstad-vooruit", + "fractie": "voorbeeldstad-vooruit", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "tom-willems" }, "name": "Tom Willems", - "politicalGroup": "voorbeeldstad-vooruit", + "fractie": "voorbeeldstad-vooruit", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "annemiek-van-rijn" }, "name": "Annemiek van Rijn", - "politicalGroup": "voorbeeldstad-vooruit", + "fractie": "voorbeeldstad-vooruit", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "bas-vermeulen" }, "name": "Bas Vermeulen", - "politicalGroup": "voorbeeldstad-vooruit", + "fractie": "voorbeeldstad-vooruit", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "lisa-de-groot" }, "name": "Lisa de Groot", - "politicalGroup": "groen-links-voorbeeldstad", + "fractie": "groen-links-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "robin-smit" }, "name": "Robin Smit", - "politicalGroup": "groen-links-voorbeeldstad", + "fractie": "groen-links-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "fatima-bouazza" }, "name": "Fatima Bouazza", - "politicalGroup": "groen-links-voorbeeldstad", + "fractie": "groen-links-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "jeroen-bos" }, "name": "Jeroen Bos", - "politicalGroup": "groen-links-voorbeeldstad", + "fractie": "groen-links-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "marieke-scholten" }, "name": "Marieke Scholten", - "politicalGroup": "democraten-voorbeeldstad", + "fractie": "democraten-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "pieter-van-dijk" }, "name": "Pieter van Dijk", - "politicalGroup": "democraten-voorbeeldstad", + "fractie": "democraten-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "eva-mulder" }, "name": "Eva Mulder", - "politicalGroup": "democraten-voorbeeldstad", + "fractie": "democraten-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "dirk-van-leeuwen" }, "name": "Dirk van Leeuwen", - "politicalGroup": "lokaal-belang", + "fractie": "lokaal-belang", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "ria-ter-horst" }, "name": "Ria ter Horst", - "politicalGroup": "lokaal-belang", + "fractie": "lokaal-belang", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "jan-kramer" }, "name": "Jan Kramer", - "politicalGroup": "lokaal-belang", + "fractie": "lokaal-belang", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "nienke-brouwer" }, "name": "Nienke Brouwer", - "politicalGroup": "lokaal-belang", + "fractie": "lokaal-belang", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "gerard-visser" }, "name": "Gerard Visser", - "politicalGroup": "lokaal-belang", + "fractie": "lokaal-belang", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "monique-peters" }, "name": "Monique Peters", - "politicalGroup": "pvda-voorbeeldstad", + "fractie": "pvda-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "willem-hendriks" }, "name": "Willem Hendriks", - "politicalGroup": "pvda-voorbeeldstad", + "fractie": "pvda-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "denise-van-dam" }, "name": "Denise van Dam", - "politicalGroup": "pvda-voorbeeldstad", + "fractie": "pvda-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "frank-de-boer" }, "name": "Frank de Boer", - "politicalGroup": "pvda-voorbeeldstad", + "fractie": "pvda-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "caroline-van-den-heuvel" }, "name": "Caroline van den Heuvel", - "politicalGroup": "vvd-voorbeeldstad", + "fractie": "vvd-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "robert-dekker" }, "name": "Robert Dekker", - "politicalGroup": "vvd-voorbeeldstad", + "fractie": "vvd-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "els-van-der-linden" }, "name": "Els van der Linden", - "politicalGroup": "vvd-voorbeeldstad", + "fractie": "vvd-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "marco-kuijpers" }, "name": "Marco Kuijpers", - "politicalGroup": "sp-voorbeeldstad", + "fractie": "sp-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "ingrid-wolf" }, "name": "Ingrid Wolf", - "politicalGroup": "sp-voorbeeldstad", + "fractie": "sp-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "hans-van-beek" }, "name": "Hans van Beek", - "politicalGroup": "forum-voorbeeldstad", + "fractie": "forum-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "tineke-groen" }, "name": "Tineke Groen", - "politicalGroup": "forum-voorbeeldstad", + "fractie": "forum-voorbeeldstad", "role": "raadslid", "actief": true }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "wim-van-houten" }, "name": "Wim van Houten", - "politicalGroup": "voorbeeldstad-vooruit", + "fractie": "voorbeeldstad-vooruit", "role": "raadslid", "actief": false }, { "@self": { "register": "ori", - "schema": "councilMember", + "schema": "raadslid", "slug": "joke-meijer" }, "name": "Joke Meijer", - "politicalGroup": "lokaal-belang", + "fractie": "lokaal-belang", "role": "raadslid", "actief": false }, { "@self": { "register": "ori", - "schema": "meeting", + "schema": "vergadering", "slug": "raadsvergadering-2025-09-02" }, "name": "Raadsvergadering 2 september 2025", @@ -938,7 +938,7 @@ { "@self": { "register": "ori", - "schema": "meeting", + "schema": "vergadering", "slug": "commissie-mens-samenleving-2025-09-11" }, "name": "Commissie Mens & Samenleving 11 september 2025", @@ -953,7 +953,7 @@ { "@self": { "register": "ori", - "schema": "meeting", + "schema": "vergadering", "slug": "raadsvergadering-2025-09-16" }, "name": "Raadsvergadering 16 september 2025", @@ -967,7 +967,7 @@ { "@self": { "register": "ori", - "schema": "meeting", + "schema": "vergadering", "slug": "raadsvergadering-2025-10-07" }, "name": "Raadsvergadering 7 oktober 2025", @@ -981,7 +981,7 @@ { "@self": { "register": "ori", - "schema": "meeting", + "schema": "vergadering", "slug": "commissie-ruimte-economie-2025-10-09" }, "name": "Commissie Ruimte & Economie 9 oktober 2025", @@ -996,7 +996,7 @@ { "@self": { "register": "ori", - "schema": "meeting", + "schema": "vergadering", "slug": "raadsvergadering-2025-10-21" }, "name": "Raadsvergadering 21 oktober 2025 (Begrotingsbehandeling)", @@ -1010,7 +1010,7 @@ { "@self": { "register": "ori", - "schema": "meeting", + "schema": "vergadering", "slug": "raadsvergadering-2025-11-04" }, "name": "Raadsvergadering 4 november 2025", @@ -1024,7 +1024,7 @@ { "@self": { "register": "ori", - "schema": "meeting", + "schema": "vergadering", "slug": "commissie-bestuur-financien-2025-11-13" }, "name": "Commissie Bestuur & Financien 13 november 2025", @@ -1039,7 +1039,7 @@ { "@self": { "register": "ori", - "schema": "meeting", + "schema": "vergadering", "slug": "raadsvergadering-2025-12-02" }, "name": "Raadsvergadering 2 december 2025", @@ -1053,7 +1053,7 @@ { "@self": { "register": "ori", - "schema": "meeting", + "schema": "vergadering", "slug": "raadsvergadering-2026-01-14" }, "name": "Raadsvergadering 14 januari 2026 (Nieuwjaar)", @@ -1067,46 +1067,46 @@ { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20250902-01-opening" }, "subject": "Opening en mededelingen", "omschrijving": "De voorzitter opent de vergadering en deelt de mededelingen.", "sortOrder": 1, - "meeting": "raadsvergadering-2025-09-02" + "vergadering": "raadsvergadering-2025-09-02" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20250902-02-agenda" }, "subject": "Vaststelling agenda", "omschrijving": "De raad stelt de agenda voor deze vergadering vast.", "sortOrder": 2, - "meeting": "raadsvergadering-2025-09-02" + "vergadering": "raadsvergadering-2025-09-02" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20250902-03-vragenuur" }, "subject": "Vragenuur", "omschrijving": "Raadsleden kunnen mondeling vragen stellen aan het college van burgemeester en wethouders.", "sortOrder": 3, - "meeting": "raadsvergadering-2025-09-02" + "vergadering": "raadsvergadering-2025-09-02" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20250902-04-herinrichting-marktplein" }, "subject": "Voorstel: Herinrichting marktplein", "omschrijving": "Het college stelt voor om het marktplein in het centrum van Voorbeeldstad opnieuw in te richten met meer groen, autoluwe zones en nieuwe terrassen. Het totale budget bedraagt 2,3 miljoen euro. De oppositie heeft een amendement ingediend om het ontwerp aan te passen.", "sortOrder": 4, - "meeting": "raadsvergadering-2025-09-02", + "vergadering": "raadsvergadering-2025-09-02", "attachments": [ "besluit-herinrichting-marktplein", "amendement-herinrichting-marktplein", @@ -1116,13 +1116,13 @@ { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20250902-05-subsidie-duurzame-energie" }, "subject": "Voorstel: Subsidieregeling duurzame energie", "omschrijving": "Voorstel tot vaststelling van een gemeentelijke subsidieregeling voor woningeigenaren die zonnepanelen, warmtepompen of isolatie willen aanschaffen. Totaal beschikbaar budget: 500.000 euro voor 2025-2026.", "sortOrder": 5, - "meeting": "raadsvergadering-2025-09-02", + "vergadering": "raadsvergadering-2025-09-02", "attachments": [ "besluit-subsidieregeling-duurzame-energie" ] @@ -1130,13 +1130,13 @@ { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20250902-06-bestemmingsplan" }, "subject": "Voorstel: Bestemmingsplan buitengebied", "omschrijving": "Vaststelling van het gewijzigde bestemmingsplan voor het buitengebied van Voorbeeldstad. Het plan maakt beperkte woningbouw mogelijk op drie locaties aan de dorpsrand, met behoud van het groene karakter.", "sortOrder": 6, - "meeting": "raadsvergadering-2025-09-02", + "vergadering": "raadsvergadering-2025-09-02", "attachments": [ "besluit-bestemmingsplan-buitengebied", "brief-provincie-buitengebied" @@ -1145,13 +1145,13 @@ { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20250902-07-ingekomen-stukken" }, "subject": "Ingekomen stukken", "omschrijving": "Behandeling van de ingekomen brieven en stukken van het college, inwoners en externe partijen.", "sortOrder": 7, - "meeting": "raadsvergadering-2025-09-02", + "vergadering": "raadsvergadering-2025-09-02", "attachments": [ "brief-college-jeugdzorg" ] @@ -1159,35 +1159,35 @@ { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20250902-08-sluiting" }, "subject": "Sluiting", "omschrijving": "De voorzitter sluit de vergadering.", "sortOrder": 8, - "meeting": "raadsvergadering-2025-09-02" + "vergadering": "raadsvergadering-2025-09-02" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "cie-ms-20250911-01-opening" }, "subject": "Opening", "omschrijving": "De voorzitter opent de commissievergadering.", "sortOrder": 1, - "meeting": "commissie-mens-samenleving-2025-09-11" + "vergadering": "commissie-mens-samenleving-2025-09-11" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "cie-ms-20250911-02-jeugdzorg" }, "subject": "Bespreking: Stand van zaken jeugdzorg", "omschrijving": "Bespreking van de brief van het college over de ontwikkelingen in de jeugdzorg. De wachtlijsten zijn opgelopen en het college wordt gevraagd maatregelen te treffen.", "sortOrder": 2, - "meeting": "commissie-mens-samenleving-2025-09-11", + "vergadering": "commissie-mens-samenleving-2025-09-11", "attachments": [ "brief-college-jeugdzorg" ] @@ -1195,45 +1195,45 @@ { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "cie-ms-20250911-03-wmo" }, "subject": "Bespreking: Evaluatie Wmo-beleid 2024", "omschrijving": "Evaluatie van het Wmo-beleid over het afgelopen jaar. Aandachtspunten zijn de toegankelijkheid van voorzieningen en de eigen bijdrage.", "sortOrder": 3, - "meeting": "commissie-mens-samenleving-2025-09-11" + "vergadering": "commissie-mens-samenleving-2025-09-11" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "cie-ms-20250911-04-sluiting" }, "subject": "Sluiting", "omschrijving": "De voorzitter sluit de commissievergadering.", "sortOrder": 4, - "meeting": "commissie-mens-samenleving-2025-09-11" + "vergadering": "commissie-mens-samenleving-2025-09-11" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20250916-01-opening" }, "subject": "Opening en mededelingen", "sortOrder": 1, - "meeting": "raadsvergadering-2025-09-16" + "vergadering": "raadsvergadering-2025-09-16" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20250916-02-notulen" }, "subject": "Vaststelling notulen raadsvergadering 2 september 2025", "omschrijving": "De raad stelt de notulen van de vorige vergadering vast.", "sortOrder": 2, - "meeting": "raadsvergadering-2025-09-16", + "vergadering": "raadsvergadering-2025-09-16", "attachments": [ "notulen-raad-2025-09-02" ] @@ -1241,13 +1241,13 @@ { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20250916-03-vuurwerkverbod" }, "subject": "Motie: Vuurwerkverbod jaarwisseling", "omschrijving": "Groen Links Voorbeeldstad dient een motie in om een gemeentelijk vuurwerkverbod in te stellen voor de komende jaarwisseling. De motie vraagt het college om een verbod voor te bereiden en alternatief entertainment te organiseren.", "sortOrder": 3, - "meeting": "raadsvergadering-2025-09-16", + "vergadering": "raadsvergadering-2025-09-16", "attachments": [ "motie-vuurwerkverbod" ] @@ -1255,33 +1255,33 @@ { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20250916-04-sluiting" }, "subject": "Sluiting", "sortOrder": 4, - "meeting": "raadsvergadering-2025-09-16" + "vergadering": "raadsvergadering-2025-09-16" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20251007-01-opening" }, "subject": "Opening en mededelingen", "sortOrder": 1, - "meeting": "raadsvergadering-2025-10-07" + "vergadering": "raadsvergadering-2025-10-07" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20251007-02-jaarrekening" }, "subject": "Vaststelling jaarrekening 2024", "omschrijving": "De raad behandelt de jaarrekening over het boekjaar 2024. De accountant heeft een goedkeurende verklaring afgegeven.", "sortOrder": 2, - "meeting": "raadsvergadering-2025-10-07", + "vergadering": "raadsvergadering-2025-10-07", "attachments": [ "rapport-jaarrekening-2024" ] @@ -1289,33 +1289,33 @@ { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20251007-03-sluiting" }, "subject": "Sluiting", "sortOrder": 3, - "meeting": "raadsvergadering-2025-10-07" + "vergadering": "raadsvergadering-2025-10-07" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "cie-re-20251009-01-opening" }, "subject": "Opening", "sortOrder": 1, - "meeting": "commissie-ruimte-economie-2025-10-09" + "vergadering": "commissie-ruimte-economie-2025-10-09" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "cie-re-20251009-02-woningbouw" }, "subject": "Bespreking: Woningbouwmonitor Voorbeeldstad", "omschrijving": "Bespreking van de halfjaarlijkse woningbouwmonitor. Er is een tekort van 1.200 woningen. Het college wordt gevraagd om versnellingsmaatregelen.", "sortOrder": 2, - "meeting": "commissie-ruimte-economie-2025-10-09", + "vergadering": "commissie-ruimte-economie-2025-10-09", "attachments": [ "rapport-woningbouwmonitor" ] @@ -1323,56 +1323,56 @@ { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "cie-re-20251009-03-sluiting" }, "subject": "Sluiting", "sortOrder": 3, - "meeting": "commissie-ruimte-economie-2025-10-09" + "vergadering": "commissie-ruimte-economie-2025-10-09" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20251021-01-opening" }, "subject": "Opening", "omschrijving": "De voorzitter opent de begrotingsvergadering.", "sortOrder": 1, - "meeting": "raadsvergadering-2025-10-21" + "vergadering": "raadsvergadering-2025-10-21" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20251021-02-algemene-beschouwingen" }, "subject": "Algemene beschouwingen", "omschrijving": "Alle fracties geven hun visie op de begroting en het beleid van het college voor het komende jaar.", "sortOrder": 2, - "meeting": "raadsvergadering-2025-10-21" + "vergadering": "raadsvergadering-2025-10-21" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20251021-03-programmabegroting" }, "subject": "Programmabegroting 2026", "omschrijving": "Behandeling en vaststelling van de programmabegroting 2026 van de gemeente Voorbeeldstad. Totale begroting: 89 miljoen euro.", "sortOrder": 3, - "meeting": "raadsvergadering-2025-10-21" + "vergadering": "raadsvergadering-2025-10-21" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20251021-04-motie-jeugdzorg" }, "subject": "Motie: Extra budget jeugdzorg", "omschrijving": "Voorbeeldstad Vooruit en Groen Links Voorbeeldstad dienen een motie in om 750.000 euro extra budget vrij te maken voor jeugdzorg om de wachtlijsten terug te dringen.", "sortOrder": 4, - "meeting": "raadsvergadering-2025-10-21", + "vergadering": "raadsvergadering-2025-10-21", "attachments": [ "motie-extra-budget-jeugdzorg" ] @@ -1380,13 +1380,13 @@ { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20251021-05-amendement-ozb" }, "subject": "Amendement: Verlaging OZB", "omschrijving": "Lokaal Belang en VVD Voorbeeldstad dienen een amendement in om de OZB-verhoging van 5% terug te brengen naar 2%, conform het inflatieniveau.", "sortOrder": 5, - "meeting": "raadsvergadering-2025-10-21", + "vergadering": "raadsvergadering-2025-10-21", "attachments": [ "amendement-verlaging-ozb" ] @@ -1394,13 +1394,13 @@ { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20251021-06-motie-woningbouw" }, "subject": "Motie: Onderzoek woningbouw", "omschrijving": "PvdA Voorbeeldstad dient een motie in om een extern onderzoek te laten uitvoeren naar mogelijkheden voor versnelling van de woningbouwopgave in Voorbeeldstad.", "sortOrder": 6, - "meeting": "raadsvergadering-2025-10-21", + "vergadering": "raadsvergadering-2025-10-21", "attachments": [ "motie-onderzoek-woningbouw" ] @@ -1408,32 +1408,32 @@ { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20251021-07-sluiting" }, "subject": "Sluiting", "sortOrder": 7, - "meeting": "raadsvergadering-2025-10-21" + "vergadering": "raadsvergadering-2025-10-21" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20251104-01-opening" }, "subject": "Opening en mededelingen", "sortOrder": 1, - "meeting": "raadsvergadering-2025-11-04" + "vergadering": "raadsvergadering-2025-11-04" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20251104-02-notulen" }, "subject": "Vaststelling notulen begrotingsbehandeling 21 oktober 2025", "sortOrder": 2, - "meeting": "raadsvergadering-2025-11-04", + "vergadering": "raadsvergadering-2025-11-04", "attachments": [ "notulen-raad-2025-10-21" ] @@ -1441,111 +1441,111 @@ { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20251104-03-sluiting" }, "subject": "Sluiting", "sortOrder": 3, - "meeting": "raadsvergadering-2025-11-04" + "vergadering": "raadsvergadering-2025-11-04" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "cie-bf-20251113-01-opening" }, "subject": "Opening", "sortOrder": 1, - "meeting": "commissie-bestuur-financien-2025-11-13" + "vergadering": "commissie-bestuur-financien-2025-11-13" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "cie-bf-20251113-02-ict-aanbesteding" }, "subject": "Bespreking: ICT-aanbesteding gemeentelijke dienstverlening", "omschrijving": "Het college informeert de commissie over de voortgang van de ICT-aanbesteding voor de modernisering van de gemeentelijke dienstverlening. Het betreft een meerjarig contract van 1,2 miljoen euro.", "sortOrder": 2, - "meeting": "commissie-bestuur-financien-2025-11-13" + "vergadering": "commissie-bestuur-financien-2025-11-13" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "cie-bf-20251113-03-sluiting" }, "subject": "Sluiting", "sortOrder": 3, - "meeting": "commissie-bestuur-financien-2025-11-13" + "vergadering": "commissie-bestuur-financien-2025-11-13" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20251202-01-opening" }, "subject": "Opening en mededelingen", "sortOrder": 1, - "meeting": "raadsvergadering-2025-12-02" + "vergadering": "raadsvergadering-2025-12-02" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20251202-02-decembercirculaire" }, "subject": "Bespreking: Decembercirculaire gemeentefonds", "omschrijving": "Bespreking van de gevolgen van de decembercirculaire van het gemeentefonds voor de begroting van Voorbeeldstad.", "sortOrder": 2, - "meeting": "raadsvergadering-2025-12-02" + "vergadering": "raadsvergadering-2025-12-02" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20251202-03-sluiting" }, "subject": "Sluiting", "sortOrder": 3, - "meeting": "raadsvergadering-2025-12-02" + "vergadering": "raadsvergadering-2025-12-02" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20260114-01-opening" }, "subject": "Opening en nieuwjaarstoespraak", "omschrijving": "De burgemeester opent het nieuwe raadsjaar met een nieuwjaarstoespraak.", "sortOrder": 1, - "meeting": "raadsvergadering-2026-01-14" + "vergadering": "raadsvergadering-2026-01-14" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20260114-02-werkprogramma" }, "subject": "Vaststelling werkprogramma raad 2026", "omschrijving": "De raad stelt het werkprogramma vast voor het kalenderjaar 2026, inclusief de vergaderplanning en de aandachtspunten per commissie.", "sortOrder": 2, - "meeting": "raadsvergadering-2026-01-14" + "vergadering": "raadsvergadering-2026-01-14" }, { "@self": { "register": "ori", - "schema": "agendaItem", + "schema": "agendapunt", "slug": "raad-20260114-03-sluiting" }, "subject": "Sluiting", "sortOrder": 3, - "meeting": "raadsvergadering-2026-01-14" + "vergadering": "raadsvergadering-2026-01-14" }, { "@self": { "register": "ori", - "schema": "councilDocument", + "schema": "raadsdocument", "slug": "motie-extra-budget-jeugdzorg" }, "title": "Motie: Extra budget jeugdzorg", @@ -1559,7 +1559,7 @@ { "@self": { "register": "ori", - "schema": "councilDocument", + "schema": "raadsdocument", "slug": "motie-onderzoek-woningbouw" }, "title": "Motie: Onderzoek versnelling woningbouw", @@ -1573,7 +1573,7 @@ { "@self": { "register": "ori", - "schema": "councilDocument", + "schema": "raadsdocument", "slug": "motie-vuurwerkverbod" }, "title": "Motie: Gemeentelijk vuurwerkverbod jaarwisseling 2025-2026", @@ -1587,7 +1587,7 @@ { "@self": { "register": "ori", - "schema": "councilDocument", + "schema": "raadsdocument", "slug": "amendement-verlaging-ozb" }, "title": "Amendement: Verlaging OZB-verhoging van 5% naar 2%", @@ -1601,7 +1601,7 @@ { "@self": { "register": "ori", - "schema": "councilDocument", + "schema": "raadsdocument", "slug": "amendement-herinrichting-marktplein" }, "title": "Amendement: Aanpassing ontwerp herinrichting marktplein", @@ -1615,7 +1615,7 @@ { "@self": { "register": "ori", - "schema": "councilDocument", + "schema": "raadsdocument", "slug": "besluit-herinrichting-marktplein" }, "title": "Besluit: Herinrichting marktplein Voorbeeldstad", @@ -1629,7 +1629,7 @@ { "@self": { "register": "ori", - "schema": "councilDocument", + "schema": "raadsdocument", "slug": "besluit-subsidieregeling-duurzame-energie" }, "title": "Besluit: Vaststelling subsidieregeling duurzame energie 2025-2026", @@ -1643,7 +1643,7 @@ { "@self": { "register": "ori", - "schema": "councilDocument", + "schema": "raadsdocument", "slug": "besluit-bestemmingsplan-buitengebied" }, "title": "Besluit: Vaststelling bestemmingsplan buitengebied Voorbeeldstad", @@ -1657,7 +1657,7 @@ { "@self": { "register": "ori", - "schema": "councilDocument", + "schema": "raadsdocument", "slug": "brief-college-jeugdzorg" }, "title": "Brief college: Stand van zaken jeugdzorg en wachtlijsten", @@ -1671,7 +1671,7 @@ { "@self": { "register": "ori", - "schema": "councilDocument", + "schema": "raadsdocument", "slug": "brief-inwoners-marktplein" }, "title": "Brief inwoners: Bezwaren herinrichting marktplein", @@ -1685,7 +1685,7 @@ { "@self": { "register": "ori", - "schema": "councilDocument", + "schema": "raadsdocument", "slug": "brief-provincie-buitengebied" }, "title": "Brief Provincie: Reactie op bestemmingsplan buitengebied", @@ -1699,7 +1699,7 @@ { "@self": { "register": "ori", - "schema": "councilDocument", + "schema": "raadsdocument", "slug": "rapport-jaarrekening-2024" }, "title": "Rapport: Jaarrekening 2024 gemeente Voorbeeldstad", @@ -1713,7 +1713,7 @@ { "@self": { "register": "ori", - "schema": "councilDocument", + "schema": "raadsdocument", "slug": "rapport-woningbouwmonitor" }, "title": "Rapport: Woningbouwmonitor Voorbeeldstad 2025", @@ -1727,7 +1727,7 @@ { "@self": { "register": "ori", - "schema": "councilDocument", + "schema": "raadsdocument", "slug": "notulen-raad-2025-09-02" }, "title": "Notulen raadsvergadering 2 september 2025", @@ -1741,7 +1741,7 @@ { "@self": { "register": "ori", - "schema": "councilDocument", + "schema": "raadsdocument", "slug": "notulen-raad-2025-10-21" }, "title": "Notulen raadsvergadering 21 oktober 2025 (Begrotingsbehandeling)", @@ -1755,54 +1755,54 @@ { "@self": { "register": "ori", - "schema": "vote", + "schema": "stemming", "slug": "stemming-herinrichting-marktplein" }, "subject": "Voorstel: Herinrichting marktplein Voorbeeldstad", "type": "proposal", "result": "aangenomen", - "agendaItem": "raad-20250902-04-herinrichting-marktplein", + "agendapunt": "raad-20250902-04-herinrichting-marktplein", "votesFor": 19, "votesAgainst": 16, "onthoudingen": 0, "politicalGroupResults": [ { - "politicalGroup": "Voorbeeldstad Vooruit", + "fractie": "Voorbeeldstad Vooruit", "stem": "voor", "zetels": 8 }, { - "politicalGroup": "Groen Links Voorbeeldstad", + "fractie": "Groen Links Voorbeeldstad", "stem": "voor", "zetels": 6 }, { - "politicalGroup": "Democraten Voorbeeldstad", + "fractie": "Democraten Voorbeeldstad", "stem": "voor", "zetels": 5 }, { - "politicalGroup": "Lokaal Belang", + "fractie": "Lokaal Belang", "stem": "tegen", "zetels": 5 }, { - "politicalGroup": "PvdA Voorbeeldstad", + "fractie": "PvdA Voorbeeldstad", "stem": "tegen", "zetels": 4 }, { - "politicalGroup": "VVD Voorbeeldstad", + "fractie": "VVD Voorbeeldstad", "stem": "tegen", "zetels": 3 }, { - "politicalGroup": "SP Voorbeeldstad", + "fractie": "SP Voorbeeldstad", "stem": "tegen", "zetels": 2 }, { - "politicalGroup": "Forum Voorbeeldstad", + "fractie": "Forum Voorbeeldstad", "stem": "tegen", "zetels": 2 } @@ -1811,54 +1811,54 @@ { "@self": { "register": "ori", - "schema": "vote", + "schema": "stemming", "slug": "stemming-subsidieregeling-duurzame-energie" }, "subject": "Voorstel: Subsidieregeling duurzame energie 2025-2026", "type": "proposal", "result": "aangenomen", - "agendaItem": "raad-20250902-05-subsidie-duurzame-energie", + "agendapunt": "raad-20250902-05-subsidie-duurzame-energie", "votesFor": 25, "votesAgainst": 10, "onthoudingen": 0, "politicalGroupResults": [ { - "politicalGroup": "Voorbeeldstad Vooruit", + "fractie": "Voorbeeldstad Vooruit", "stem": "voor", "zetels": 8 }, { - "politicalGroup": "Groen Links Voorbeeldstad", + "fractie": "Groen Links Voorbeeldstad", "stem": "voor", "zetels": 6 }, { - "politicalGroup": "Democraten Voorbeeldstad", + "fractie": "Democraten Voorbeeldstad", "stem": "voor", "zetels": 5 }, { - "politicalGroup": "Lokaal Belang", + "fractie": "Lokaal Belang", "stem": "tegen", "zetels": 5 }, { - "politicalGroup": "PvdA Voorbeeldstad", + "fractie": "PvdA Voorbeeldstad", "stem": "voor", "zetels": 4 }, { - "politicalGroup": "VVD Voorbeeldstad", + "fractie": "VVD Voorbeeldstad", "stem": "tegen", "zetels": 3 }, { - "politicalGroup": "SP Voorbeeldstad", + "fractie": "SP Voorbeeldstad", "stem": "voor", "zetels": 2 }, { - "politicalGroup": "Forum Voorbeeldstad", + "fractie": "Forum Voorbeeldstad", "stem": "tegen", "zetels": 2 } @@ -1867,54 +1867,54 @@ { "@self": { "register": "ori", - "schema": "vote", + "schema": "stemming", "slug": "stemming-motie-extra-budget-jeugdzorg" }, "subject": "Motie: Extra budget jeugdzorg", "type": "motie", "result": "aangenomen", - "agendaItem": "raad-20251021-04-motie-jeugdzorg", + "agendapunt": "raad-20251021-04-motie-jeugdzorg", "votesFor": 23, "votesAgainst": 12, "onthoudingen": 0, "politicalGroupResults": [ { - "politicalGroup": "Voorbeeldstad Vooruit", + "fractie": "Voorbeeldstad Vooruit", "stem": "voor", "zetels": 8 }, { - "politicalGroup": "Groen Links Voorbeeldstad", + "fractie": "Groen Links Voorbeeldstad", "stem": "voor", "zetels": 6 }, { - "politicalGroup": "Democraten Voorbeeldstad", + "fractie": "Democraten Voorbeeldstad", "stem": "voor", "zetels": 5 }, { - "politicalGroup": "Lokaal Belang", + "fractie": "Lokaal Belang", "stem": "tegen", "zetels": 5 }, { - "politicalGroup": "PvdA Voorbeeldstad", + "fractie": "PvdA Voorbeeldstad", "stem": "voor", "zetels": 4 }, { - "politicalGroup": "VVD Voorbeeldstad", + "fractie": "VVD Voorbeeldstad", "stem": "tegen", "zetels": 3 }, { - "politicalGroup": "SP Voorbeeldstad", + "fractie": "SP Voorbeeldstad", "stem": "tegen", "zetels": 2 }, { - "politicalGroup": "Forum Voorbeeldstad", + "fractie": "Forum Voorbeeldstad", "stem": "tegen", "zetels": 2 } @@ -1923,54 +1923,54 @@ { "@self": { "register": "ori", - "schema": "vote", + "schema": "stemming", "slug": "stemming-amendement-verlaging-ozb" }, "subject": "Amendement: Verlaging OZB-verhoging van 5% naar 2%", "type": "amendement", "result": "verworpen", - "agendaItem": "raad-20251021-05-amendement-ozb", + "agendapunt": "raad-20251021-05-amendement-ozb", "votesFor": 10, "votesAgainst": 25, "onthoudingen": 0, "politicalGroupResults": [ { - "politicalGroup": "Voorbeeldstad Vooruit", + "fractie": "Voorbeeldstad Vooruit", "stem": "tegen", "zetels": 8 }, { - "politicalGroup": "Groen Links Voorbeeldstad", + "fractie": "Groen Links Voorbeeldstad", "stem": "tegen", "zetels": 6 }, { - "politicalGroup": "Democraten Voorbeeldstad", + "fractie": "Democraten Voorbeeldstad", "stem": "tegen", "zetels": 5 }, { - "politicalGroup": "Lokaal Belang", + "fractie": "Lokaal Belang", "stem": "voor", "zetels": 5 }, { - "politicalGroup": "PvdA Voorbeeldstad", + "fractie": "PvdA Voorbeeldstad", "stem": "tegen", "zetels": 4 }, { - "politicalGroup": "VVD Voorbeeldstad", + "fractie": "VVD Voorbeeldstad", "stem": "voor", "zetels": 3 }, { - "politicalGroup": "SP Voorbeeldstad", + "fractie": "SP Voorbeeldstad", "stem": "tegen", "zetels": 2 }, { - "politicalGroup": "Forum Voorbeeldstad", + "fractie": "Forum Voorbeeldstad", "stem": "voor", "zetels": 2 } @@ -1979,54 +1979,54 @@ { "@self": { "register": "ori", - "schema": "vote", + "schema": "stemming", "slug": "stemming-motie-onderzoek-woningbouw" }, "subject": "Motie: Onderzoek versnelling woningbouw", "type": "motie", "result": "aangenomen", - "agendaItem": "raad-20251021-06-motie-woningbouw", + "agendapunt": "raad-20251021-06-motie-woningbouw", "votesFor": 35, "votesAgainst": 0, "onthoudingen": 0, "politicalGroupResults": [ { - "politicalGroup": "Voorbeeldstad Vooruit", + "fractie": "Voorbeeldstad Vooruit", "stem": "voor", "zetels": 8 }, { - "politicalGroup": "Groen Links Voorbeeldstad", + "fractie": "Groen Links Voorbeeldstad", "stem": "voor", "zetels": 6 }, { - "politicalGroup": "Democraten Voorbeeldstad", + "fractie": "Democraten Voorbeeldstad", "stem": "voor", "zetels": 5 }, { - "politicalGroup": "Lokaal Belang", + "fractie": "Lokaal Belang", "stem": "voor", "zetels": 5 }, { - "politicalGroup": "PvdA Voorbeeldstad", + "fractie": "PvdA Voorbeeldstad", "stem": "voor", "zetels": 4 }, { - "politicalGroup": "VVD Voorbeeldstad", + "fractie": "VVD Voorbeeldstad", "stem": "voor", "zetels": 3 }, { - "politicalGroup": "SP Voorbeeldstad", + "fractie": "SP Voorbeeldstad", "stem": "voor", "zetels": 2 }, { - "politicalGroup": "Forum Voorbeeldstad", + "fractie": "Forum Voorbeeldstad", "stem": "voor", "zetels": 2 } @@ -2035,54 +2035,54 @@ { "@self": { "register": "ori", - "schema": "vote", + "schema": "stemming", "slug": "stemming-bestemmingsplan-buitengebied" }, "subject": "Voorstel: Bestemmingsplan buitengebied Voorbeeldstad", "type": "proposal", "result": "aangenomen", - "agendaItem": "raad-20250902-06-bestemmingsplan", + "agendapunt": "raad-20250902-06-bestemmingsplan", "votesFor": 27, "votesAgainst": 8, "onthoudingen": 0, "politicalGroupResults": [ { - "politicalGroup": "Voorbeeldstad Vooruit", + "fractie": "Voorbeeldstad Vooruit", "stem": "voor", "zetels": 8 }, { - "politicalGroup": "Groen Links Voorbeeldstad", + "fractie": "Groen Links Voorbeeldstad", "stem": "voor", "zetels": 6 }, { - "politicalGroup": "Democraten Voorbeeldstad", + "fractie": "Democraten Voorbeeldstad", "stem": "voor", "zetels": 5 }, { - "politicalGroup": "Lokaal Belang", + "fractie": "Lokaal Belang", "stem": "tegen", "zetels": 5 }, { - "politicalGroup": "PvdA Voorbeeldstad", + "fractie": "PvdA Voorbeeldstad", "stem": "voor", "zetels": 4 }, { - "politicalGroup": "VVD Voorbeeldstad", + "fractie": "VVD Voorbeeldstad", "stem": "voor", "zetels": 3 }, { - "politicalGroup": "SP Voorbeeldstad", + "fractie": "SP Voorbeeldstad", "stem": "tegen", "zetels": 2 }, { - "politicalGroup": "Forum Voorbeeldstad", + "fractie": "Forum Voorbeeldstad", "stem": "tegen", "zetels": 1 } diff --git a/src/views/besluitvorming/VergaderingDetailView.vue b/src/views/besluitvorming/VergaderingDetailView.vue index a28d93dd5..4e3ac98f1 100644 --- a/src/views/besluitvorming/VergaderingDetailView.vue +++ b/src/views/besluitvorming/VergaderingDetailView.vue @@ -232,14 +232,14 @@ export default {