calServer V2 – Entwicklungs-Roadmap¶
Stand: 2026-07-12 (Code-Audit vom 2026-07-11, Status-Update nach den Juli-Merges) Ziel: V2 (Laravel + Nuxt) ersetzt V1 (Yii 1.1, EOL 31.12.2026) Ersetzt: die Prioritätenliste aus
v1-v2-analysis.md(Stand März 2026, in weiten Teilen überholt)
0. Status-Update 2026-07-12¶
Seit dem Audit vom 2026-07-11 wurden gemergt — Phase A ist damit komplett, Phase B1 erledigt:
| Baustein | PR | Roadmap-Bezug |
|---|---|---|
| SAML 2.0/Entra-ID-Login (ACS, Metadata, SLO, JIT-Provisionierung) | #2776 | A1 ✅ |
| LDAP-Bind-Login (OpenLDAP + Active Directory, Test-Endpoint, Admin-Tab) | #2777 | A1 ✅ |
V2 (api-v2 + frontend) im Helm-/K8s-Chart (v2.enabled, Shared-MySQL oder eigene V2-DB) |
#2778 | A2 ✅ |
Berichtsmanagement: DMS-Ablage pro Bericht, Berichte im Grid (report-context), Vorlagen-Import ins DMS |
#2779 | — |
Dateien in Grids (file-context, versionierter Upload, Freigabe-Sichtbarkeitsregel) |
#2780 | — |
| Inbox revisionssicher: Statusmodell, Archivierung, lückenlose Erfassung, Pattern-Fixes | #2781 | — |
| Location-/Leihmanagement komplett (Current-Record, Verfügbarkeit, Massenausleihe, Rückgabe) | #2782/#2783 | B1 ✅ |
Grid-Buttons harmonisiert: Permission-Gating auf Button-Ebene, useGridActions, Bulk-Delete-Endpoints, Button-Katalog |
#2784 | — |
A3 (laravel/framework-CVEs) hatte sich bereits mit dem Laravel-13-Upgrade erledigt (composer audit sauber, siehe PR #2776).
1. Wo V2 heute steht¶
Die Gap-Analyse vom März 2026 wies ~33 % Action-Abdeckung aus. Seitdem wurde ein Großteil der damals als „HOCH" priorisierten Lücken geschlossen. Verifiziert vorhanden (Stand heute):
| Bereich | Beleg |
|---|---|
| Buchungen mit Geschäftslogik (Status-Workflow, Signatur, Mail-Logs, Sammelaufträge, Positionen/Artikel, Export, Nummernkreis) | laravel/app/Http/Controllers/Api/V2/BookingController.php, ArticleController.php (Auftragspositionen) |
| Report-Engine inkl. DCC-Export (PTB-XML), Letterhead-Overlay, Freigabe-Workflow, Signatur-Stempelung, Parameter-Prompt, Etikett-/Direktdruck | laravel/app/Services/Report/, ReportController.php, Frontend useReports() |
| Inventar: Hierarchie (Parent/Child), Batch-Statusänderung, QR-Code, Export | InventoryController.php (hierarchy, statusBatch, export), InventoryQrController.php |
Digitale Signaturen (generisch über link_table/link_id) |
SignatureController.php, Tests CalibrationSignTest, DocumentSignTest |
| Mailer: Trigger/Aktionen, Queue, Templates, Konfiguration | MailerActionController.php, MailerQueueController.php, SendMailJob |
| Tickets: Anhänge, Gruppen-Zuordnung, Kommentare, Admin | TicketAttachmentController.php, TicketController::assignGroup |
| User-Profil (Avatar, Settings, API-Key) | ProfileController.php |
| Notizen inkl. Kalender-Endpoint und UI | NotepadController.php, frontend-v2/pages/notepad/calendar.vue |
| V1→V2-Datenmigration (~20 Module, Chunking, modul-/tabellenweise) | MigrationService.php, SyncV1ToV2.php, frontend-v2/pages/admin/migration.vue |
Grid-System: TableMaster/useDataTable auf ~14 Listen-Pages, Feld-Registry konsolidiert (field_definitions) |
frontend-v2/components/table-master/, pages/admin/field-definitions/ |
| Frontend-Pages: Booking, Preise, Gerätetypen, Notizen, Inbox, Audit-Log, Report-Verwaltung (im März noch „FEHLT KOMPLETT") | frontend-v2/pages/ |
Infrastruktur: Laravel 13, Multi-DB (MySQL/PostgreSQL/MSSQL, DbDialect), Docker-Koexistenz V1+V2 (/api/v2, /v2 via nginx) |
docker/docker-compose.v2.yml, laravel/app/Support/DbDialect.php |
| Backend-Tests: 133 Testdateien, >1000 Tests grün (PHPStan L8, Pint) | laravel/tests/ |
Kurz: Der Kern des Kalibrier-/Inventar-Geschäfts ist in V2 funktional. Was fehlt, sind gezielte Blöcke — kein Flächenbrand mehr.
2. Verbleibende Lücken (verifiziert am 2026-07-11)¶
2.1 Harte Cutover-Blocker — alle drei erledigt (siehe §0)¶
| # | Lücke | Status |
|---|---|---|
| 1 | SSO/Auth-Parität (SAML/Entra-ID-Flow, LDAP-Bind) | ✅ erledigt — #2776/#2777 (SamlController, LdapAuthService, JIT über sso_role_group_mapping) |
| 2 | Kein V2 im Helm-/K8s-Chart | ✅ erledigt — #2778 (k8s/charts/calserver/templates/v2/, v2.enabled) |
| 3 | laravel/framework-CVEs |
✅ erledigt — Laravel-13-Upgrade, composer audit sauber |
2.2 Fehlende Fachmodule¶
| Modul | Umfang V1 | Status V2 | Priorität |
|---|---|---|---|
| Vermietung (Rental) | ~55 Actions (CRUD, Kalender, Reservierung, Reports, Adressen) | ✅ portiert (#2782): Current-Record, rented-dates-Verfügbarkeit, Massenausleihe, Rückgabe, Reports. ✅ Reservierungskalender (/v2/reservation, FullCalendar, reservation_view/edit-Trias vervollständigt). ✅ Kalender-Buchung POST /reservations (nur reservation_edit, V1-Parität) + Leihschein-Auto-Versand bei Buchung/Verschieben/Statuswechsel (location_create/location_update-Templates, Opt-out send_receipt) |
erledigt |
| Tabellen-Import (CSV/Excel) für Inventar | TableImport, UploadExcelFile | Nur Export vorhanden, kein Import-Endpoint | HOCH — Standard-Werkzeug bei Einführung/Datenpflege |
| Offenes Portal + QR-Code-Links | Public User, map_user-Kundenfreigabe, Portal-Grid, smallView-Detail, QR-Etiketten |
✅ umgesetzt (ADR-010): Public-API /api/v2/public/portal/* + /public/qr/{mtag}, Portal-Frontend /v2/portal + /v2/qr/<id>, Admin-Tab „Portal" — Strategie: evaluierung-portal-qrlinks-v2.md. Offen: nginx-Cutover-Mapping aktivieren (dokumentiert in docker/nginx/vhost.d/default_location) |
erledigt bis auf Cutover-Schritt |
| Wiki/Hilfe | ~25 Actions | Fehlt komplett | MITTEL |
| Artikel/News | ~18 Actions | Fehlt (V2-ArticleController = Buchungspositionen, kein CMS) |
NIEDRIG–MITTEL |
| Standard-Artikel-Seite (Katalog) | eigene Verwaltung | API vorhanden (StandardArticleController), keine Frontend-Page |
NIEDRIG |
| Fast-Insert / PDF-Import | FastInsert, ImportFromPDF | Fehlt | NIEDRIG (nach Tabellen-Import neu bewerten) |
| Eigenständige Pages für Verfahren/Spezifikationen/Standards/Ergebnisse/Prüfschritte | eigene Grids | Prozeduren: umgesetzt (PRs #2972–#2979: eigene Pages, Vorlagen-Versionierung mit Approve/Release, Vorlage↔Kalibrierung, Prüf-Wizard mit Metrologie-Mathematik). Spezifikationen/Standards/Ergebnisse weiterhin eingebettet | Restumfang: eingebettet kann UX-seitig gewollt sein |
2.3 Integrationen¶
| Integration | Status V2 | Empfehlung |
|---|---|---|
| Met/Team-Sync | Fehlt (nur Permission-Namen); V1-Implementierung wird aktiv gepflegt (Fixes Juni/Juli 2026) | Migrieren — wird produktiv genutzt |
| IMAP-Fetchmail für Tickets | Fehlt (V2-Inbox ist Dateisystem-basiert für DMS) | Migrieren, wenn Ticket-Kunden per Mail arbeiten |
MSSQL-Export-Sync (CopyAllToMSSQLOrMySQL) |
Fehlt; V2 kann aber nativ auf MSSQL laufen | Bewusst entscheiden: vermutlich abkündigen — nativer MSSQL-Betrieb ersetzt den Export-Umweg |
| SymmetricDS (~50 Actions) | Fehlt | Abkündigen oder weit nach hinten — in der alten Analyse bereits NIEDRIG |
| Google OAuth | Fehlt | Mit SSO-Block (2.1 #1) zusammen entscheiden |
2.4 Qualität / Betrieb¶
| Punkt | Status | Risiko |
|---|---|---|
Frontend-Tests: faktisch 0 (nur Screenshot-E2E; vitest.config.ts existiert ungenutzt) |
0 Unit-/Component-Tests bei wachsender UI | Regressionen in TableMaster/Detailseiten bleiben unbemerkt |
| Migrations-Validierung | sync + status vorhanden, aber kein Dry-Run-/Abgleich-Report (Zähl-/Checksummen-Vergleich V1↔V2) |
Cutover ohne Verifikationswerkzeug ist riskant |
Platzhalter-Tabs in admin/settings.vue („Vorgaben", „Datenbank") |
UI-Stubs | Vor Cutover füllen oder ausblenden |
3. Empfohlene Reihenfolge¶
Leitidee: Blocker zuerst, dann Funktionsparität, dann Integrationen — so wächst die Zahl der Kunden, die tatsächlich auf V2 wechseln können, am schnellsten. Der Notfallplan (Yii-1-Fork, MIGRATION_STRATEGY.md §6.2) bleibt als Sicherheitsnetz bestehen.
Phase A — Cutover-Fundament ✅ abgeschlossen (Juli 2026)¶
- A1 · SSO/Auth-Parität in V2 — ✅ #2776 (SAML/Entra ID) + #2777 (LDAP-Bind)
- A2 · V2 ins Helm-/K8s-Chart — ✅ #2778 (
v2.enabled, Koexistenz-Deployment) - A3 ·
laravel/framework-CVEs — ✅ mit dem Laravel-13-Upgrade erledigt
Phase B — Funktionsparität für den Alltag (August–Oktober)¶
- B1 · Vermietungs-Modul — ✅ #2782 + Reservierungskalender (FullCalendar-Ansicht
/v2/reservation, Feed + Drag-&-Drop-Verschieben, RBAC-Triasreservation_view/edit/delete) + Kalender-BuchungPOST /reservationsmit Leihschein-Auto-Versand (Opt-out) - B2 · Inventar-Tabellenimport (CSV/Excel) — inkl. Vorschau/Mapping wie V1; danach Fast-Insert/PDF-Import neu bewerten
- B3 · Entscheidung Verfahren/Spezifikationen/Standards als eigene Pages — ✅ Prozeduren umgesetzt (#2972–#2979: eigene Pages, Vorlagen-Lifecycle, Prüf-Wizard). Spezifikationen/Standards bleiben bewusst eingebettet
- B4 · Restliche Grid-Selektions-Buttons aus dem Button-Katalog §6: Add to Notepad, Release Documents, Create Order aus Auswahl, Bulk-ZIP-Download
Phase C — Integrationen (Oktober–November)¶
- C1 · Met/Team-Sync nach V2 (aktiv genutzte Integration, zuletzt mehrere V1-Fixes)
- C2 · IMAP-Fetchmail für Tickets
- C3 · Entscheidung MSSQL-Export-Sync + SymmetricDS: Vorschlag Abkündigung zugunsten nativem Multi-DB-Betrieb — mit betroffenen Kunden klären
- C4 · Wiki/News/Standard-Artikel: nachziehen oder V1-Wiki bis nach dem Cutover weiterbetreiben
Phase D — Pilot-Cutover (November–Dezember)¶
- D1 · Migrations-Validierung: Dry-Run-Report, Datensatz-Zähl-/Checksummen-Abgleich V1↔V2 pro Modul
- D2 · Pilotkunde vollständig auf V2 (Feature-Flags, V1 read-only als Fallback)
- D3 · Realistische Erwartung festhalten: Der vollständige Ersatz für alle Kunden bis 31.12.2026 ist ambitioniert. Die Blocker-Reihenfolge oben maximiert die Zahl cutover-fähiger Systeme; für den Rest greift der Yii-1-Fork-Notfallplan.
Querschnitt (fortlaufend)¶
- Frontend-Testfundament: Vitest für
useDataTable/TableMaster+ wenige Playwright-Happy-Paths (Login → Inventarliste → Detail → Report). Beginn parallel zu Phase A, Pflicht ab Phase B. - Doku-Hygiene: die mehrfach offenen, inhaltsgleichen
GRID_OVERVIEW-PRs konsolidieren (einen mergen, Rest schließen).
4. Nächster konkreter Schritt¶
(aktualisiert 2026-07-12 — A1/A2/A3 und B1 sind erledigt, siehe §0)
B2 — Inventar-Tabellenimport (CSV/Excel). Begründung: Nach dem Wegfall aller Cutover-Blocker ist der Tabellen-Import die größte verbliebene Alltagslücke — er ist das Standard-Werkzeug bei Neueinführung und Datenpflege und blockiert damit Onboarding-Szenarien. Parallel dazu als Querschnitt: das Frontend-Testfundament (§2.4) beginnen, bevor die UI-Fläche weiter wächst.