Skip to content

calServer V2 – Development Roadmap

As of: 2026-07-12 (code audit of 2026-07-11, status update after the July merges) Goal: V2 (Laravel + Nuxt) replaces V1 (Yii 1.1, EOL Dec 31, 2026) Supersedes: the priority list in v1-v2-analysis.md (March 2026, largely outdated)


0. Status update 2026-07-12

Merged since the audit of 2026-07-11 — phase A is thereby complete, phase B1 done:

Building block PR Roadmap item
SAML 2.0/Entra ID login (ACS, metadata, SLO, JIT provisioning) #2776 A1 ✅
LDAP bind login (OpenLDAP + Active Directory, test endpoint, admin tab) #2777 A1 ✅
V2 (api-v2 + frontend) in the Helm/K8s chart (v2.enabled, shared MySQL or dedicated V2 DB) #2778 A2 ✅
Report management: DMS filing per report, reports in the grid (report-context), template import into the DMS #2779
Files in grids (file-context, versioned upload, release visibility rule) #2780
Audit-proof inbox: status model, archiving, complete registration, pattern fixes #2781
Complete location/loan management (current record, availability, bulk loan, return) #2782/#2783 B1 ✅
Harmonized grid buttons: button-level permission gating, useGridActions, bulk-delete endpoints, button catalog #2784

A3 (laravel/framework CVEs) had already been resolved by the Laravel 13 upgrade (composer audit clean, see PR #2776).


1. Where V2 stands today

The March 2026 gap analysis reported ~33% action coverage. Since then most of the items prioritized "HIGH" back then have been closed. Verified present (as of today):

Area Evidence
Bookings with business logic (status workflow, signature, mail logs, collective orders, line items/articles, export, number sequence) laravel/app/Http/Controllers/Api/V2/BookingController.php, ArticleController.php (order line items)
Report engine incl. DCC export (PTB XML), letterhead overlay, release workflow, signature stamping, parameter prompt, label/direct print laravel/app/Services/Report/, ReportController.php, frontend useReports()
Inventory: hierarchy (parent/child), batch status change, QR code, export InventoryController.php (hierarchy, statusBatch, export), InventoryQrController.php
Digital signatures (generic via link_table/link_id) SignatureController.php, tests CalibrationSignTest, DocumentSignTest
Mailer: triggers/actions, queue, templates, configuration MailerActionController.php, MailerQueueController.php, SendMailJob
Tickets: attachments, group assignment, comments, admin TicketAttachmentController.php, TicketController::assignGroup
User profile (avatar, settings, API key) ProfileController.php
Notes incl. calendar endpoint and UI NotepadController.php, frontend-v2/pages/notepad/calendar.vue
V1→V2 data migration (~20 modules, chunking, per module/table) MigrationService.php, SyncV1ToV2.php, frontend-v2/pages/admin/migration.vue
Grid system: TableMaster/useDataTable on ~14 list pages, consolidated field registry (field_definitions) frontend-v2/components/table-master/, pages/admin/field-definitions/
Frontend pages: booking, prices, device types, notes, inbox, audit log, report management (all "COMPLETELY MISSING" in March) frontend-v2/pages/
Infrastructure: Laravel 13, multi-DB (MySQL/PostgreSQL/MSSQL, DbDialect), Docker coexistence V1+V2 (/api/v2, /v2 via nginx) docker/docker-compose.v2.yml, laravel/app/Support/DbDialect.php
Backend tests: 133 test files, >1000 tests green (PHPStan L8, Pint) laravel/tests/

In short: the core calibration/inventory business works in V2. What remains are targeted blocks — no longer a wildfire.


2. Remaining gaps (verified 2026-07-11)

2.1 Hard cutover blockers — all three resolved (see §0)

# Gap Status
1 SSO/auth parity (SAML/Entra ID flow, LDAP bind) ✅ done — #2776/#2777 (SamlController, LdapAuthService, JIT via sso_role_group_mapping)
2 No V2 in the Helm/K8s chart ✅ done — #2778 (k8s/charts/calserver/templates/v2/, v2.enabled)
3 laravel/framework CVEs ✅ done — Laravel 13 upgrade, composer audit clean

2.2 Missing functional modules

Module V1 scope V2 status Priority
Rental ~55 actions (CRUD, calendar, reservation, reports, addresses) ported (#2782): current record, rented-dates availability, bulk loan, return, reports. Open: FullCalendar reservation view, loan-slip mailing done except calendar UI
Table import (CSV/Excel) for inventory TableImport, UploadExcelFile Export only, no import endpoint HIGH — standard tool for onboarding/data maintenance
Open portal + QR code links public user, map_user customer approval, portal grid, smallView detail, QR labels implemented (ADR-010): public API /api/v2/public/portal/* + /public/qr/{mtag}, portal frontend /v2/portal + /v2/qr/<id>, admin tab "Portal" — strategy: evaluierung-portal-qrlinks-v2.md. Open: activate the nginx cutover mapping (documented in docker/nginx/vhost.d/default_location) done except the cutover step
Wiki/help ~25 actions Completely missing MEDIUM
Articles/news ~18 actions Missing (V2 ArticleController = booking line items, not a CMS) LOW–MEDIUM
Standard articles page (catalog) dedicated management API exists (StandardArticleController), no frontend page LOW
Fast insert / PDF import FastInsert, ImportFromPDF Missing LOW (re-evaluate after table import)
Dedicated pages for procedures/specifications/standards/results/test steps own grids Procedures: implemented (PRs #2972–#2979: dedicated pages, template versioning with approve/release, template↔calibration, execution wizard with metrology math). Specifications/standards/results still embedded Remainder: embedded may be the intended UX

2.3 Integrations

Integration V2 status Recommendation
Met/Team sync Missing (permission names only); the V1 implementation is actively maintained (fixes June/July 2026) Migrate — actively used in production
IMAP fetchmail for tickets Missing (the V2 inbox is filesystem-based, for DMS) Migrate if ticket customers work via e-mail
MSSQL export sync (CopyAllToMSSQLOrMySQL) Missing; but V2 can run natively on MSSQL Decide deliberately: probably retire — native MSSQL operation replaces the export detour
SymmetricDS (~50 actions) Missing Retire or push far back — already LOW in the old analysis
Google OAuth Missing Decide together with the SSO block (2.1 #1)

2.4 Quality / operations

Item Status Risk
Frontend tests: effectively 0 (screenshot E2E only; vitest.config.ts exists unused) 0 unit/component tests while the UI grows Regressions in TableMaster/detail pages go unnoticed
Migration validation sync + status exist, but no dry-run/reconciliation report (record count/checksum comparison V1↔V2) Cutover without a verification tool is risky
Placeholder tabs in admin/settings.vue ("Vorgaben", "Datenbank") UI stubs Fill or hide before cutover

Guiding idea: blockers first, then functional parity, then integrations — this grows the number of customers who can actually switch to V2 the fastest. The contingency plan (Yii 1 fork, MIGRATION_STRATEGY.md §6.2) remains the safety net.

Phase A — Cutover foundation ✅ complete (July 2026)

  1. A1 · SSO/auth parity in V2 — ✅ #2776 (SAML/Entra ID) + #2777 (LDAP bind)
  2. A2 · V2 into the Helm/K8s chart — ✅ #2778 (v2.enabled, coexistence deployment)
  3. A3 · laravel/framework CVEs — ✅ resolved by the Laravel 13 upgrade

Phase B — Functional parity for daily work (August–October)

  1. B1 · Rental module — ✅ #2782 (remaining: FullCalendar reservation view, loan-slip mailing as follow-ups)
  2. B2 · Inventory table import (CSV/Excel) — incl. preview/mapping like V1; re-evaluate fast insert/PDF import afterwards
  3. B3 · Decision on dedicated pages for procedures/specifications/standards — ✅ procedures implemented (#2972–#2979: dedicated pages, template lifecycle, execution wizard). Specifications/standards stay deliberately embedded
  4. B4 · Remaining grid selection buttons from the button catalog §6: add to notepad, release documents, create order from selection, bulk ZIP download

Phase C — Integrations (October–November)

  1. C1 · Met/Team sync to V2 (actively used integration, several recent V1 fixes)
  2. C2 · IMAP fetchmail for tickets
  3. C3 · Decision on MSSQL export sync + SymmetricDS: proposal is retirement in favor of native multi-DB operation — align with affected customers
  4. C4 · Wiki/news/standard articles: follow up, or keep running the V1 wiki until after cutover

Phase D — Pilot cutover (November–December)

  1. D1 · Migration validation: dry-run report, record count/checksum reconciliation V1↔V2 per module
  2. D2 · Pilot customer fully on V2 (feature flags, V1 read-only as fallback)
  3. D3 · Record realistic expectations: replacing V1 for all customers by Dec 31, 2026 is ambitious. The blocker order above maximizes the number of cutover-ready systems; the Yii 1 fork contingency plan covers the rest.

Cross-cutting (continuous)

  • Frontend test foundation: Vitest for useDataTable/TableMaster + a few Playwright happy paths (login → inventory list → detail → report). Start in parallel with Phase A, mandatory from Phase B.
  • Docs hygiene: consolidate the multiple open, content-identical GRID_OVERVIEW PRs (merge one, close the rest).

4. Next concrete step

(updated 2026-07-12 — A1/A2/A3 and B1 are done, see §0)

B2 — Inventory table import (CSV/Excel). Rationale: with all cutover blockers gone, the table import is the largest remaining daily-work gap — it is the standard tool for onboarding and data maintenance and thus blocks onboarding scenarios. In parallel, as a cross-cutting item: start the frontend test foundation (§2.4) before the UI surface grows further.