Kunden — Standorte (Sub-Route)
Zweck
Sub-Route /customers/:id/locations listet alle Standorte (Liegenschaften), die einem Kunden zugeordnet sind. Klick auf einen Standort fuehrt zur Detail-Sicht /customers/:id/locations/:locationId mit allen Sub-Tabs des Standorts (Kontakte, Systeme, Sonderkonditionen, Workorders, Sales-Documents, Documents).
Diese verschachtelten URL-Pfade ermoeglichen es Anwendern, im Kunden-Kontext zu bleiben — der gleiche Standort ist auch global über /locations/:id erreichbar.
Voraussetzungen
Berechtigungen (CASL)
| Action | Subject | Wirkung | Keycloak-Rolle |
|---|---|---|---|
view | FE_Customer, FE_Location, Customer, Location | Liste/Detail aufrufbar | — |
create/update/delete | Location | Standorte pflegen | APP_SPEAMCORE_CREATE/UPDATE/DELETE_LOCATION |
Schritt-für-Schritt-Anleitung
- Kunde (
/customers/:id) → Tab Standorte. - + Neu legt einen Standort mit
customerId = :idan. Direkter Anlegen-und-Springen-Pattern — kein Modal, keine Eingabemaske:LocationService.createLocationwird mit nur demcustomerIdaufgerufen, anschliessend wird auf den Detail des neuen Standorts navigiert (/customers/:id/locations/:locationId/general-data). Der Standort hat erst dort einen Namen, eine Adresse usw. - Klick auf einen Standort →
/customers/:id/locations/:locationId(eingebetteter Standort-Detail-Container mit allen Standort-Sub-Tabs).
Sonderspalten in der Standort-Liste
Die DataGrid hat zusaetzlich zu den Standard-Standort-Spalten zwei aggregierte Counter-Spalten:
| Spalte | Inhalt | Quelle |
|---|---|---|
Kontakte | Anzahl Kontakte am Standort | ContactParent mit parentType = Location, parentId = location.id |
Anlagen | Anzahl Anlagen am Standort | System mit locationId = location.id |
Beide nutzen die DisplayCountModel-Komponente und brauchen view:Statistics plus die Subject-Permission (view:Contact + view:ContactParent resp. view:System). Ohne diese Berechtigung sind die Counter-Spalten nicht sichtbar.
Status-Filter
Default zeigt nur aktive Standorte (status = active). Filter-Dropdown bietet showActive (Default) / showInactive.
Verfuegbare Sub-Tabs am eingebetteten Standort
| Sub-Pfad (im Customer-Kontext) | Inhalt |
|---|---|
/customers/:id/locations/:locId/contacts | Standort-Kontakte |
/customers/:id/locations/:locId/systems | Standort-Anlagen |
/customers/:id/locations/:locId/product-special-conditions | Sonderpreise/-konditionen |
/customers/:id/locations/:locId/documents | Standort-Dokumente |
/customers/:id/locations/:locId/workorders | Workorders für den Standort |
/customers/:id/locations/:locId/sales-documents | Verkaufsbelege für den Standort |
/customers/:id/locations/:locId/systems/:sysId/checklists | Standort-Anlagen-Checklisten |
/customers/:id/locations/:locId/systems/:sysId/components | Standort-Anlagen-Komponenten |

Wiederverwendbare Konzepte
Verknuepfungen zu anderen Modulen
- Kunden — Eltern-Modul.
- Standorte — globale Sicht; identisches Datenmodell.
- Anlagen-Konzept — Systeme pro Standort.
- Workorders — werden pro Standort durchgeführt.
API/Schnittstellen
| Methode | Endpoint | Zweck | CASL |
|---|---|---|---|
GET | /api/locations?filter[customerId] | Liste der Kunden-Standorte | view Location |
POST | /api/locations | Anlegen mit customerId = :id | create Location |
Versionshinweise
- 2026-04-30: Initiale Veroeffentlichung.