Zum Hauptinhalt springen

Standorte

Zweck

Standorte (Niederlassungen) gehören zu genau einem Kunden und tragen die operativen Datensaetze: Anlagen (Brandmeldesysteme etc.), Aufträge, Verkaufsbelege, Kontakte und Sonderkonditionen. Sie sind die feinste Verortungs-Ebene und werden in Belegen als parentType = 'Location' referenziert.

Voraussetzungen

- Es gibt mindestens einen Kunden, dem der Standort zugeordnet wird. - Berechtigung `create:Location`.

Berechtigungen (CASL)

Frontend-Page-Guard:

ActionSubjectWirkungKeycloak-Rolle
viewFE_LocationStandortliste und -details aufrufbar
viewLocationDaten lesbarAPP_SPEAMCORE_VIEW_LOCATION
viewCustomerParent-Kunde sichtbarAPP_SPEAMCORE_VIEW_CUSTOMER

API-Datenzugriff:

ActionSubjectEndpointKeycloak-Rolle
viewLocationGET /api/locations, GET /api/locations/:idAPP_SPEAMCORE_VIEW_LOCATION
createLocationPOST /api/locationsAPP_SPEAMCORE_CREATE_LOCATION
updateLocationPATCH /api/locations/:idAPP_SPEAMCORE_UPDATE_LOCATION
deleteLocationDELETE /api/locations/:idAPP_SPEAMCORE_DELETE_LOCATION

GET-Antworten werden serverseitig 300 s gecacht, Mutationen invalidieren den Cache.

Schritt-für-Schritt-Anleitung

Standort anlegen

  1. Öffnen Sie den Kunden, dem der Standort gehören soll.
  2. Wechseln Sie in den Tab Standorte (/customers/:customerId/locations).
  3. Klicken Sie + Neu.
  4. Pflegen Sie Name und ggf. Adresse / Geokoordinaten.
  5. Speichern. locationNo wird automatisch generiert (fortlaufend pro Kunde).

Standort wechselnden Kunden zuordnen

Nicht möglich. customerId ist nach Anlage disabled, um Belege und Anlagen vor versehentlichem Parent-Wechsel zu schuetzen.

Listenansicht — locations

Toolbar (Detail-Seite)

Schlanke Toolbar oben rechts:

IconAktion (aria-label)CASLWirkung
ZurückgehenZurück zur Liste.
🏠Zur Startseite gehenSpringt auf das Dashboard / /.
⏮/◀/▶/⏭PaginationNavigation durch die gefilterte Liste — Massen-Bearbeitung ohne Liste-Sprung.

Wie auf jeder Detail-Seite verfuegbar — siehe Floating-Quickbar:

  • KAL. (Mini-Kalender)
  • ZEIT (Persoenliche Wochen-Arbeitszeit)
  • ARBEIT (Eigene bevorstehende Aufträge)

UI-Elemente

Button: „+ Neu"

Tab Standorte (innerhalb Kunde) oder unter /locations. Erfordert create:Location. Öffnet Detailseite mit customerId vorausgefuellt.

Felder und Eingaben

FeldnamePflichtDatentypBeschreibungWirkung beim AusfuellenVoraussetzung
locationNoautomatischStringFortlaufend pro Kunde. Disabled.Wird im beforeCreate-Hook aus MAX(parseInt(locationNo)) + 1 gesetzt. Erscheint in Auswahllisten und auf Belegen.Bestehende Standorte des Kunden mit numerischen locationNo.
nameneinStringStandortname.Anzeige in Auswahllisten und Reports.
customerIdja (disabled nach Create)UUIDParent-Kunde.Bestimmt den Mandanten-Kontext und die Sichtbarkeit. Nach dem Speichern nicht mehr änderbar — schuetzt verknuepfte Belege/Anlagen.view:Customer; Kunde muss aktiv sein.
statusjaAuswahl active/inactiveAktivitaetsstatus.inactive blendet den Standort in neuen Belegen/Aufträgen aus. Wird kaskadiert vom uebergeordneten Kunden gesetzt.
vatIdneinString(32)USt-IdNr. (separat vom Kunden möglich).Wird normalisiert. Bei innergemeinschaftlichen Belegen über den Standort wirkt diese USt-IdNr. statt der vom Kunden.Format [ISO-Code][Ziffern].
latitude / longitudeneinStringGeokoordinaten.Anker für Karten-Visualisierungen und Routenoptimierung.

Workflows und Zustaende

Status-Änderungen am Kunden kaskadieren auf Standorte (siehe Kunden).

Wiederverwendbare Konzepte

Verknuepfungen zu anderen Modulen

  • Kunden — Pflicht-Parent (Location.customerId).
  • Anlagen / Systeme (/systems) — System.locationId (1:N).
  • Aufträge — Workorder.locationId (1:N).
  • VerkaufsbelegeSalesDocument.parentType = 'Location'.
  • BankverbindungenBankAssignment.parentType = 'Location' (eigene Bankdaten pro Standort möglich).
  • Dokumente — Auto-DocumentFolder beim Anlegen.
  • CRM (/locations/:id/crm) — bei aktivem CRM-Tracking trägt der Standort ein eigenes CRM-Profil (z. B. um Standorte eines Kunden separat zu verfolgen).

Häufige Fehler und Lösungen

FehlerLösung
customerId nicht änderbarPer Design — Standort ist nach Anlage einem Kunden fest zugeordnet.
Änderungen werden nicht sofort sichtbarCache-Invalidate nach PATCH/POST/DELETE laeuft auf dem Server, GET-Antwort bei direktem Refresh kann kurz veraltet sein.
locationNo springtAuto-Generator zählt MAX(parseInt(locationNo)) + 1 — nicht-numerische Werte werden ignoriert.

API/Schnittstellen

MethodeEndpointZweckCASL
GET/api/locationsListeview Location
GET/api/locations/:idDetailview Location
POST/api/locationsAnlegencreate Location
PATCH/api/locations/:idÄndernupdate Location
DELETE/api/locations/:idSoft-Deletedelete Location

GET-Endpoints sind 300 s gecacht (cacheResponse-Middleware).

Versionshinweise

  • 2026-06-24: CRM-Tab (/locations/:id/crm) ergänzt — Standorte können ein eigenes CRM-Profil tragen. Verifiziert an LocationCrmPage.tsx.
  • 2026-04-29: Initiale Veroeffentlichung.