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 |
3. Recommended order¶
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)¶
- A1 · SSO/auth parity in V2 — ✅ #2776 (SAML/Entra ID) + #2777 (LDAP bind)
- A2 · V2 into the Helm/K8s chart — ✅ #2778 (
v2.enabled, coexistence deployment) - A3 ·
laravel/frameworkCVEs — ✅ resolved by the Laravel 13 upgrade
Phase B — Functional parity for daily work (August–October)¶
- B1 · Rental module — ✅ #2782 (remaining: FullCalendar reservation view, loan-slip mailing as follow-ups)
- B2 · Inventory table import (CSV/Excel) — incl. preview/mapping like V1; re-evaluate fast insert/PDF import afterwards
- B3 · Decision on dedicated pages for procedures/specifications/standards — ✅ procedures implemented (#2972–#2979: dedicated pages, template lifecycle, execution wizard). Specifications/standards stay deliberately embedded
- 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)¶
- C1 · Met/Team sync to V2 (actively used integration, several recent V1 fixes)
- C2 · IMAP fetchmail for tickets
- C3 · Decision on MSSQL export sync + SymmetricDS: proposal is retirement in favor of native multi-DB operation — align with affected customers
- C4 · Wiki/news/standard articles: follow up, or keep running the V1 wiki until after cutover
Phase D — Pilot cutover (November–December)¶
- D1 · Migration validation: dry-run report, record count/checksum reconciliation V1↔V2 per module
- D2 · Pilot customer fully on V2 (feature flags, V1 read-only as fallback)
- 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_OVERVIEWPRs (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.