Zum Hauptinhalt springen

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

- Berechtigung `view:Customer` und `view:Location`. - Bestehender Standort, der über `Location.customerId = :id` mit dem Kunden verknuepft ist.

Berechtigungen (CASL)

ActionSubjectWirkungKeycloak-Rolle
viewFE_Customer, FE_Location, Customer, LocationListe/Detail aufrufbar
create/update/deleteLocationStandorte pflegenAPP_SPEAMCORE_CREATE/UPDATE/DELETE_LOCATION

Schritt-für-Schritt-Anleitung

  1. Kunde (/customers/:id) → Tab Standorte.
  2. + Neu legt einen Standort mit customerId = :id an. Direkter Anlegen-und-Springen-Pattern — kein Modal, keine Eingabemaske: LocationService.createLocation wird mit nur dem customerId aufgerufen, 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.
  3. 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:

SpalteInhaltQuelle
KontakteAnzahl Kontakte am StandortContactParent mit parentType = Location, parentId = location.id
AnlagenAnzahl Anlagen am StandortSystem 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/contactsStandort-Kontakte
/customers/:id/locations/:locId/systemsStandort-Anlagen
/customers/:id/locations/:locId/product-special-conditionsSonderpreise/-konditionen
/customers/:id/locations/:locId/documentsStandort-Dokumente
/customers/:id/locations/:locId/workordersWorkorders für den Standort
/customers/:id/locations/:locId/sales-documentsVerkaufsbelege für den Standort
/customers/:id/locations/:locId/systems/:sysId/checklistsStandort-Anlagen-Checklisten
/customers/:id/locations/:locId/systems/:sysId/componentsStandort-Anlagen-Komponenten

Listenansicht — customers-locations

Wiederverwendbare Konzepte

Verknuepfungen zu anderen Modulen

API/Schnittstellen

MethodeEndpointZweckCASL
GET/api/locations?filter[customerId]Liste der Kunden-Standorteview Location
POST/api/locationsAnlegen mit customerId = :idcreate Location

Versionshinweise

  • 2026-04-30: Initiale Veroeffentlichung.