Release: merge development into beta#18
Open
github-actions[bot] wants to merge 281 commits intobetafrom
Open
Conversation
Add LegesCalculationService with support for all calculation types: vast bedrag, percentage, staffel (tiered), maximum (capped), and combinatie. Includes verrekening (deduction) and teruggaaf (refund). Add LegesExportService with CSV, ASCII, and XML export formats for financial system integration. Add LegesController with API endpoints for calculate, recalculate, verrekening, teruggaaf, and export.
Add ParaferingService for managing the ambtelijk parafering workflow: voorstel creation, configurable parafeerroutes with sequential and parallel steps, parafering actions (paraferen, terugsturen, adviseren, paraferen namens), route overrides with audit trail, and immutable audit trail recording. Add ParaferingController with API endpoints.
… and advice management Add VTH (Vergunningen, Toezicht, Handhaving) module foundations: - DSO intake service for processing omgevingsvergunning applications - Inspection checklist service with configurable templates and result recording - LHS enforcement matrix lookup (Landelijke Handhavingsstrategie) - Advice request management panel for inter-departmental consultation - Inspection checklist completion panel with pass/fail/n/a per item - Omgevingsvergunning case type template (7 stages, regulier/uitgebreid) - New schemas: inspectionChecklist, inspectionResult, adviceRequest
Add multi-tenant SaaS infrastructure for serving multiple municipalities: - TenantService with tenant resolution via Nextcloud groups, provisioning, resource tracking - TenantMiddleware for request-level tenant isolation (returns 404 for cross-tenant access) - TenantController with CRUD, provisioning, and resource usage endpoints - TenantSettingsTab admin UI for tenant management - TenantSwitcher component for platform admin context switching - tenantApi.js frontend service - Tenant schema in SettingsService - Tenant management routes - OpenSpec change artifacts (proposal, design, tasks)
Add configurable milestone tracking for cases:
- MilestoneService for CRUD, progress calculation, and duration analytics
- MilestoneController with API endpoints for progress, mark, and reverse
- MilestoneProgress step indicator component for case detail view
- MilestoneProgressBar compact component for case list view
- milestoneDefinition schema (identifier, label, order, trigger event)
- milestoneRecord schema (case, milestone, reachedAt, trigger type)
- Milestone reversal requires reason for audit trail
- API: GET /api/cases/{id}/milestones, POST mark, POST reverse
Add InspectionService for field inspection management with GPS location capture, Haversine distance validation, photo metadata tracking, and inspection lifecycle. Add ChecklistService with conformity tracking (conform/niet-conform/n.v.t.), mandatory photo validation, and progress monitoring. Add InspectionController with API endpoints. Add PWA manifest for Add to Home Screen support.
Add appointment scheduling (afsprakenbeheer) infrastructure: - AppointmentBackendInterface with pluggable backends (JCC, Qmatic, Local) - LocalBackend fallback with configurable business hours - JccBackend and QmaticBackend REST API integrations - AppointmentService with booking, cancellation, no-show, timeslot queries - AppointmentController for authenticated appointment management - PublicAppointmentController for citizen self-service via cancel token - AppointmentReminderJob daily background job - AppointmentSection and AppointmentBookingDialog Vue components - AppointmentSettingsTab admin settings - PublicAppointmentPage for citizen appointment management - appointmentApi.js frontend service - Appointment schemas and routes - OpenSpec change artifacts (proposal, design, tasks)
… responses
Add inter-departmental consultation (adviesaanvraag) as first-class entities:
- ConsultationService for CRUD, lifecycle management, overdue detection
- ConsultationController with REST API (create, status update, response, overdue)
- ConsultationPanel Vue component with create form, status tracking, advice display
- Consultation schema with lifecycle (open > in_behandeling > advies_uitgebracht > afgesloten)
- Structured responses (positief/positief_met_voorwaarden/negatief/niet_van_toepassing)
- Conditions (voorwaarden) from advice flow back to parent case
- Overdue detection and highlighting
- API: GET /api/cases/{id}/consultations, POST /api/consultations, etc.
Add StufFieldMappingService for bidirectional field mapping between StUF-ZKN/BG XML paths and OpenRegister properties, with date format conversion (YYYYMMDD <-> ISO 8601) and confidentiality enum mapping. Add StufMessageBuilder for constructing SOAP envelopes with StUF namespaces, stuurgegevens, Bv01 confirmations, and Fo01 faults. Add StufController for inbound SOAP message handling via raw XML POST, with dispatch for zakLk01, zakLv01, npsLv01, and edcLk01 messages.
Add Mijn Overheid Berichtenbox integration: - BerichtenboxAdapterInterface with MockAdapter for development - BerichtenboxService with message sending, BSN 11-proef validation, read status polling - BerichtenboxController with send, messages, types, poll endpoints - BerichtenboxReadStatusJob daily background job - BerichtenboxTab sidebar component for message history - BerichtenboxComposeDialog with BSN validation, plain text enforcement, bericht type selection - BerichtenboxSettingsTab admin settings with connection test - berichtenboxApi.js frontend service - berichtenboxMessage and berichtenboxTypeCode schemas - Routes and config keys - OpenSpec change artifacts (proposal, design, tasks)
Add email sending and receiving within case context:
- CaseEmailService for sending, template resolution, inbound processing
- EmailController with REST API (send, send-from-template, preview, templates)
- EmailComposer component with template selection and variable resolution
- EmailThread component showing chronological message history
- Template variable syntax {{variableName}} with preview and unresolved warnings
- Auto-link inbound emails by case number in subject [ZAAK-YYYY-NNNN]
- Email threading via In-Reply-To header
- emailTemplate schema (name, caseType, subjectPattern, body)
- emailMessage schema (case, direction, from, to, subject, body, threading)
Add comprehensive documentation for all Procest case management features: - 8 screenshots covering dashboard, cases, my work, tasks, case types, admin settings, and ZGW configuration - 8 feature docs with screenshots for implemented UI pages - 24 text-only feature docs for planned/backend features including werkvoorraad, roles-decisions, zaak-intake-flow, complaint-management, consultation-management, milestone-tracking, case-email-integration, woo-case-type, vth-module, case-sharing-collaboration, ai-assisted-processing, appointment-scheduling, bw-parafering, legesberekening, mobiel-inspectie, openregister-integration, prometheus-metrics, register-i18n, base-register-seed-data, multi-tenant-saas, case-definition-portability, mijn-overheid-integration, stuf-support, zaaktype-configuratie - Index README with feature tables and architecture overview
Replaces the static CaseDetail layout with CnDashboardPage-powered widget grid. Each case section (properties, timeline, tasks, documents, roles, decisions, milestones, notes) is now a configurable widget. - CasePropertiesWidget: case metadata, status, editable fields - CaseTimelineWidget: status timeline with change controls - CaseTasksWidget: compact task list with status/priority indicators - CaseDocumentsWidget: attached documents listing - CaseRolesWidget: wraps ParticipantsSection for widget context - CaseDecisionsWidget: decisions/results display - CaseMilestonesWidget: deadline panel + milestone progress - CaseNotesWidget: wraps ActivityTimeline for notes/activity feed
Audit and restructure all 42 specs in Procest: KEPT in specs/ (14 specs, >80% implemented): - admin-settings, case-management, case-types, dashboard, my-work, task-management, roles-decisions, openregister-integration, procest-app-scaffold, procest-object-store, procest-case-management, prometheus-metrics, zgw-api-mapping, case-dashboard-view - Added frontmatter with `status: implemented` - Fixed zgw-api-mapping status from `draft` to `implemented` MOVED to changes/ (28 specs, <50% implemented): - ai-assisted-processing, appointment-scheduling, base-register-seed-data, bw-parafering, case-definition-portability, case-email-integration, case-sharing-collaboration, complaint-management, consultation-management, document-zaakdossier, dso-omgevingsloket, legesberekening, method-decomposition, mijn-overheid-integration, milestone-tracking, mobiel-inspectie, multi-tenant-saas, open-raadsinformatie, pipelinq-app-scaffold, pipelinq-client-management, pipelinq-object-store, register-i18n, stuf-support, vth-module, werkvoorraad, woo-case-type, zaak-intake-flow, zaaktype-configuratie - Each change has: .openspec.yaml, proposal.md, specs/<name>/spec.md - Added frontmatter with `status: proposed`
…omplete change artifacts - Add `status: implemented` frontmatter to 37 specs that were missing it - Keep 5 genuinely unimplemented specs as `status: draft` - Rename `## ADDED Requirements` to `## Requirements` in 9 archived delta specs - Add missing `.openspec.yaml` to roles-decisions-mvp archived change - Add missing delta spec and tasks.md to zgw-business-rules-compliance change
All specs moved from openspec/specs/ to openspec/changes/ with proper proposal.md as the entry point. Follows the spec-driven workflow: proposal -> design -> specs -> tasks
…ecs, archive - Created design.md and tasks.md for all 38 active changes - Added 3 unit test files: ZgwPaginationHelperTest (7 tests), ZgwMappingServiceTest (11 tests), ZgwAuthMiddlewareTest (7 tests) - Total: 33 tests, 94 assertions, all passing - Synced 38 delta specs to openspec/specs/ - Archived all 38 changes to openspec/changes/archive/2026-03-21-* - Added dashboard and my-work screenshots to docs/screenshots/
Remove duplicate root route that conflicts with SPA catch-all. Change path regex from .+ to .* so empty path matches. Update documentation link to valid Gitbook URL.
Add strengthened ADR-011 rule listing concrete directories to search and common duplications to prevent future utility reimplementations.
…rements) Evidence-backed proposals from 39,600 tenders across 8 EU countries: 1. workflow-engine-enhancement (534 tenders) — foundational, prerequisites for 2-4 2. vth-workflow-configuration (436 tenders) — VTH domain config, depends on #1 3. bezwaar-beroep-workflow (280 tenders) — AWB-compliant, depends on #1 4. besluitvorming-workflow (126 tenders) — decision process, depends on #1 5. signalering-widgets (160 tenders) — dashboard alerts 6. doorlooptijd-dashboard (350 tenders) — SLA analytics 7. deelzaak-support (245 tenders) — sub-case hierarchy 8. gis-integration (300 tenders) — map views, PDOK, WMS/WFS
…led cases Add three new dashboard widgets for proactive case management alerting: - Deadline Alerts: shows cases approaching/past their processing deadline (configurable 3-day warning threshold) - Task Due Reminders: shows current user's tasks approaching/past due date - Stalled Cases: shows cases with no activity for 7+ days (via dateModified) Each widget appears both in the Procest dashboard (Vue components in CnDashboardPage grid) and as Nextcloud-native IWidget implementations for the main Nextcloud dashboard. New files: - Helper functions: getDeadlineAlerts, getTaskDueReminders, getStalledCases - Dashboard components: DeadlineAlerts.vue, TaskDueReminders.vue, StalledCases.vue - NC widgets: DeadlineAlertsWidget.php/.vue, TaskRemindersWidget.php/.vue, StalledCasesWidget.php/.vue - Webpack entry points for 3 new widget bundles - OpenSpec: signalering-widgets spec synced, dashboard spec updated Closes #88
Implement a zero-code workflow builder that allows administrators to define process steps, status transitions, guards, and automatic actions per zaaktype through a visual drag-and-drop interface. Key additions: - workflowTemplate schema in procest_register.json with steps, transitions, guards, and automatic actions stored as JSON - Pinia workflow store with guard evaluation, version management, import/export, and automatic action dispatch (email via n8n, task creation, webhooks) - Visual workflow editor with SVG canvas, draggable status nodes, connection ports, and pan/zoom support - Step and transition configuration panels with checklist editor, guard configuration (4 types), and action configuration (6 types) - Workflow tab integrated into CaseType admin with version selector, publish/edit/import/export controls - WorkflowTransitions component on case detail showing available transitions filtered by role and guard evaluation - Workflow version binding on case creation for version isolation - Auto-task creation from workflow steps on status transitions OpenSpec: workflow-engine-enhancement (534 tenders, 2,942 requirements)
Archive the completed workflow-engine-enhancement change and sync 8 new specification files to the main openspec/specs/ directory: - workflow-definition-model, visual-workflow-editor - status-transition-engine, process-step-configuration - zaaktype-versioning, workflow-import-export - automatic-actions, role-based-step-routing
Add a dedicated processing time analytics view with SLA compliance rate, compliance breakdown by case type (donut chart), processing time distribution histogram, monthly trend line chart, at-risk cases panel, and sortable performance table. Includes date range filter with presets and case type filter. Integrates with the main dashboard via a fifth SLA Compliance KPI card and a Doorlooptijd navigation button in the header. Closes #89
Add complete B&W (Board & Aldermen) decision-making workflow: Schema & Backend: - Add voorstel, parafeerroute, parafeeractie schemas to procest_register.json - Add config key mappings in SettingsService for new schemas - Create ParaferingNotificationService for Nextcloud notifications Frontend: - VoorstelList: dashboard with status, progress, overdue detection, reminders - VoorstelDetail: metadata, document preview, progress timeline, audit trail - VoorstelCreateDialog: type selector, case pre-fill - ProgressTimeline: visual step indicator (completed/current/future) - ParafeerActionBar: paraferen/adviseren/terugsturen with delegation support - ParafeerInbox: personal inbox integrated into MyWork view - VoorstellenPanel: B&W panel on case detail sidebar - BesluitRegistration: dialog using existing decision schema - AuditTrail: immutable chronological display with export - ParafeerRouteAdmin: admin CRUD for parafeerroutes with step management - parafeerEngine.js: sequential routing logic, snapshot, skip/ad-hoc steps Integration: - Vue Router: /voorstellen, /voorstellen/:id routes - Navigation: Voorstellen sidebar item - CaseDetail: B&W Voorstellen panel - AdminRoot: Parafeerroutes settings section OpenSpec: besluitvorming-workflow change archived with 7 specs synced. Depends on: workflow-engine-enhancement (PR #93) Closes #87
Add geographic information system capabilities to Procest: - Leaflet-based map component with PDOK base maps (BRT, Luchtfoto) - Case location tab on detail view with reverse geocoding - Location picker with PDOK address search and polygon drawing - Full-page case map overview with status-based markers and filtering - Spatial selection tools (rectangle, polygon) for geographic case queries - Admin-configurable WMS/WFS overlay layers with PDOK presets - Backend GIS proxy for CORS-restricted external services - MapLayer schema in OpenRegister for layer configuration - Dashboard map widget showing assigned cases - Coordinate transformation (RD/EPSG:28992 to WGS84) - Code-split map chunk for lazy loading (~80KB saved on non-map views) Closes #91
…eal handling Implements bezwaar (objection) and beroep (appeal) case management per Awb chapters 6, 7, and 8. Pre-seeds case types, status types, role types, and workflow templates with AWB-mandated process steps and transitions. Backend: - 4 new schemas: objection, hearingSession, advisoryReport, appealDecision - SeedDataService for idempotent case type seeding via repair step - SettingsService updated with new schema config key mappings Frontend: - bezwaar.js Pinia store with CRUD, deadline calculation, escalation - 6 bezwaar components: intake form, hearing panel, advisory report, decision form, timeline, deadline indicator - 2 beroep components: escalation panel, court proceedings panel - CaseDetail.vue conditionally renders bezwaar/beroep sections Specs: 5 new + 2 modified capability specs (21 requirements, 46 tasks) Closes #86
Configure the workflow engine for VTH (Vergunningen, Toezicht, Handhaving) with domain-specific schemas, workflow templates, seed data, and UI panels. Backend: - 4 new OpenRegister schemas: inspectieChecklist, inspectieRapport, handhavingsactie, adviesAanvraag in procest_register.json - 6 VTH case type seed data (Omgevingsvergunning, Sloopmelding, Toezichtzaak Bouw/Milieu, Handhavingszaak, Invorderingszaak) - 3 default inspection checklists for bouwtoezicht phases - LHS matrix + VTH schema config keys in SettingsService - Default LHS matrix (Landelijke Handhavingsstrategie) 4x4 grid Frontend stores: - inspection.js: Checklist CRUD, rapport creation, photo upload, follow-up tasks - enforcement.js: LHS matrix lookup, enforcement actions, dwangsom tracking - advice.js: Advice request lifecycle, deadline tracking, escalation Frontend components: - InspectionPanel: Progress bar, checklist completion form, rapport detail - EnforcementPanel + EnforcementWizard: 3-step wizard (classification, intervention, vooraankondiging), LHS classification display - AdvicePanel: Request form, status badges, deadline alerts - ChecklistAdmin: Drag-and-drop checklist editor with versioning - LhsMatrixAdmin: Editable 4x4 enforcement strategy grid - VthTemplateLibrary: Browsable VTH workflow template library Workflow templates (procest-workflow-v1 format): - Omgevingsvergunning regulier (7 steps, 8 weeks) - Omgevingsvergunning uitgebreid (9 steps, 26 weeks) - Toezichtzaak Bouw (7 steps, 3 inspection phases) - Toezichtzaak Milieu (5 steps) - Handhavingszaak (7 steps, LHS-based enforcement) - Sloopmelding (4 steps, 4 weeks) OpenSpec: 5 new specs, 1 modified (vth-module), archived change. Depends on: workflow-engine-enhancement (PR #93) Closes #85
Phase 1 of the OR-abstraction audit (2026-05-03). One doc-only fix. adr-000-data-model.md is the per-app entity catalogue (39 procest entities), not an architecture decision. Added a non-ADR header citing hydra ADR-001 (data layer) and ADR-022 (apps consume OR abstractions) as the authoritative contract this catalogue operates inside, so future readers don't mistake the OR-built-in fields and capabilities reminder for a duplicate decision (the anti-pattern hydra ADR-022 was written to prevent). Filename rename to `data-model.md` (no `adr-` prefix) is queued for the upcoming procest adoption change.
Path-based codeowner mapping per the OR-abstraction-audit follow-up (2026-05-03). PRs that touch each domain auto-request review from the matching owners; first-to-approve unblocks per the org ruleset.
… (4 specs → lifecycle annotation) (#311) Phase 3 of the OR-abstraction audit (2026-05-03). Spec-only — no code changes. Drafts the per-app adoption openspec change so each app can run /opsx-apply against it when ready. References .claude/audit-2026-05-03/ research, Phase 2 OR/nc-vue/ hydra specs (#1420, #113, #218), and ADRs 022/024/025.
…51/89, partial) (#312) Adds SPDX headers inside the existing main file docblock per `feedback_spdx-in-docblock.md`, alongside @author / @copyright / @license. EUPL-1.2; 2024 Conduction B.V. Scope: 51 PHP files in lib/ — partial coverage. The remaining 38 files (mostly Service/*ZGW* + Service/Appointment* + Service/ Berichtenbox* + a few BackgroundJob entries) are queued for a follow-up SPDX-headers PR; this batch was capped by an automation quota and the partial-commit ships the work that was completed. All edits are idempotent docblock additions — no code change. Audit reference: 2026-05-03 OR-abstraction audit, stream 3 (repo hygiene) — procest was flagged at 0/89 SPDX coverage. This brings it to 51/89.
Aligns this app's @conduction/nextcloud-vue dependency with the fleet-leading version (mydash). Per the 2026-05-03 OR-abstraction audit, stream 3 (repo hygiene): apps drifted across 6 versions from beta.1 to beta.17. Audit reference: .claude/audit-2026-05-03/03-repo-hygiene.md
Drafts the openspec change capturing procest's legacy quality-debt cleanup as a tracked initiative. Spec-only, markdown-only. Per the 2026-05-03 OR-abstraction audit, stream 3 (repo hygiene). References .claude/audit-2026-05-03/03-repo-hygiene.md.
…ts (#315) Each procest widget entry was inlining its own copy of Vue, @nextcloud/vue, @conduction/nextcloud-vue, pinia and the material-design-icon set, costing ~6.7 MB per bundle. With 7 widget entries that compounded to ~47 MB of duplicated framework JS attached to the dashboard. Webpack 'optimization.splitChunks' now extracts two stable-filename shared chunks (one for Vue + lightweight deps, one for the heavier @nextcloud/vue surface) so each widget keeps only widget-specific code. The shared chunks load once on the page and are cached indefinitely across navigations. Each widget's PHP load() now also Util::addScript()s the two shared chunks. Util::addScript dedupes by (app, file), so even with mydash eagerly loading every widget the shared chunks emit once. After 'npm run build' on the latest @nextcloud/vue: procest-shared-nc-vue.js : (new) 2.79 MB procest-shared-vendor.js : (new) 0.33 MB procest-main.js : 9 MB → 4.73 MB procest-settings.js : 6 MB → 3.35 MB procest-<each>Widget.js : 6.7 MB → 3.00 MB Total widget JS on /apps/mydash/ drops from ~47 MB to ~24 MB on cold load and to per-widget delta on warm cache. Validated locally via mydash page load; no new console errors versus baseline.
…duction.nl Migrates the Procest documentation site from procest.app to procest.conduction.nl and adopts @conduction/docusaurus-preset@^1.4.3 for shared brand defaults (tokens, theme swizzles, KvK / BTW footer copyright). Mirrors the docudesk migration since both apps embed an in-app reference to the docs URL. - docs/docusaurus.config.js: rewritten through createConfig() with brand theme + theme-mermaid, en + nl locales preserved, footer reduced to the brand Conduction column, minigames disabled, src/** excluded from plugin-content-docs to avoid the MDX-parser collision with plugin-content-pages. - docs/package.json: adds @conduction/docusaurus-preset@^1.4.3. Lockfile refreshed. - docs/static/CNAME: procest.conduction.nl. - .github/workflows/documentation.yml: cname updated. - docs/src/pages/index.js: replaced the legacy hero with the brand DetailHero + WidgetShelf composition, mirroring the connext detail page (clock-face icon, orange accent, three widgets reflecting Procest's value: werkvoorraad, deadlines, recent decisions). In-app fix: - src/views/settings/Settings.vue: doc-url switched from https://procest.app to https://procest.conduction.nl/docs/intro so the Settings panel deep-links into the new docs site.
…tion feat(docs): adopt @conduction/docusaurus-preset + move to procest.conduction.nl
* openspec: add server-side-kpi-aggregation change
Replaces client-side KPI aggregation on the dashboard with a dedicated
GET /api/dashboard/kpis endpoint that computes counts/sums via DB queries.
The current pattern (fetchCollection({_limit: 1000}).then(count)) silently
returns wrong totals when case volumes exceed 1000.
Includes per-user 60s cache via ICacheFactory with version-bump invalidation
on ObjectCreatedEvent/UpdatedEvent/DeletedEvent. Frontend migration of
KpiCards.vue is descoped to a follow-up (migrate-kpi-cards-to-aggregation-endpoint)
so this PR ships independently.
* openspec: include avgProcessingDays in v1 + document endDate invariant
Adds avgProcessingDays as a v1 KPI (AVG(DATEDIFF(endDate, startDate))
filtered to cases completed this month, null when no data). Avoids the
"no data" gap during the frontend migration window.
Documents the workflow invariant the open-case proxy relies on
(endDate IS NULL <-> not in final status) plus a verification task
that asserts the invariant in the deployed DB. Documents the accepted
risk that case counts are register-wide for v1 (matches today's
client-side behaviour; row-level ACL is not yet enabled in Procest).
* feat(procest): add KpiAggregationService with DB-side aggregation queries
Implements T01–T08b: computes 8 dashboard KPI metrics (openCount, newToday,
overdueCount, completedCount, taskCount, tasksDueToday, statusBreakdown,
avgProcessingDays) via single-pass SQL queries against openregister_objects.
Cases are scoped by schema title LIKE '%zaak%'; tasks by '%taak%'. Returns
typed PHP values with null (not 0) for avgProcessingDays when no data exists.
* feat(procest): add KpiController with per-user version-keyed cache (T09–T11)
Adds GET /api/dashboard/kpis endpoint backed by a 60-second local cache.
Uses a per-user version counter (procest_kpis_{userId}_ver) so the cache
can be invalidated by event listeners without a hard flush. Response
includes cacheHit and computedAt fields for observability.
* feat(procest): add KpiCacheInvalidationListener for OpenRegister event hooks (T12–T13)
Listens to ObjectCreatedEvent, ObjectUpdatedEvent, and ObjectDeletedEvent and
increments the per-user KPI cache version key so the next request recomputes
fresh KPIs. Wired in Application.php. Psalm suppressions added for the
OpenRegister event classes; phpmd.baseline.xml updated for Application.php
coupling (adding 4 use statements crossed the 13-class coupling threshold).
* test(procest): add Doctrine DBAL + OC stubs and fix PHPUnit bootstrap (T14)
OCP interfaces (IDBConnection, IQueryBuilder) reference Doctrine DBAL types
not present in vendor. Added DoctrineStubs.php with full Doctrine and OC\DB
stub classes so PHPUnit can mock these interfaces without a Nextcloud install.
Added OC stub with a minimal server that satisfies Response::getHeaders().
Updated bootstrap.php to register OCP/NCU PSR-4 paths from the ClassLoader.
* test(procest): add unit tests for KpiAggregationService, KpiController, KpiCacheInvalidationListener (T15–T17)
KpiAggregationServiceTest: 7 tests covering all KPI keys, zero-defaults on
DB error, typed integers, null avgProcessingDays, float cast, and exactly-8
query-builder calls.
KpiControllerTest: 7 tests covering 401-on-no-user, cache miss path
(cacheHit:false), cache hit path (no computeKpis call), all JSON fields,
correct userId forwarding, cache.set on miss, and exception tolerance.
KpiCacheInvalidationListenerTest: 9 tests covering type guard, increment
math (null→2, 3→4, '5'→6), constructor wiring, and key pattern consistency.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Automated PR to sync development changes to beta for beta release.
Merging this PR will trigger the beta release workflow.