Mehrere Standorte (Multi-Location)
Entscheidungshilfe: Welches Modell ist das richtige für Ihren Betrieb?#
| Kriterium | Mehrere Standorte (Multi-Location) | Franchise-Verbund (→ Kapitel 34) |
|---|---|---|
| Rechtsträger / Betreiber | Ein einziger Betreiber (eine juristische Person / ein Mandant) | Mehrere rechtlich selbstständige Betreiber (mehrere Mandanten) |
| Steuernummer | Eine gemeinsame Steuernummer für alle Filialen | Eigene Steuernummer pro Betrieb |
| Kassenbuch & Z-Berichte | Ein Kassenbuch über alle Kassen des Betreibers | Getrennte Kassenbücher und Z-Berichte pro Betreiber |
| DSFinV-K Export | Ein gemeinsamer Export für das Gesamtunternehmen | Getrennte Exporte pro Rechtsträger / Steuernummer |
| GoBD-Verfahrensdokumentation | Eine Verfahrensdokumentation für das Gesamtunternehmen | Eigene Verfahrensdokumentation pro Franchise-Nehmer |
| Preishoheit & Katalog | Zentrale Steuerung mit Standort-Preisen (LocationProductOverride) | Empfohlene (UVP) oder verbindliche Vorlagen der Zentrale |
| Steuerliche Konsequenz bei Falschwahl | Wenn rechtlich getrennte Firmen fälschlicherweise als "Standorte" angelegt werden, droht die Schätzung der Buchführung durch das Finanzamt wegen Datenvermischung! | Wenn Filialen desselben Unternehmens fälschlicherweise als "Franchise" angelegt werden, entstehen unnötige Kosten durch mehrfache TSE-Lizenzen und getrennte Mandanten. |
Wozu dient das?#
Das Modul für Mehrere Standorte (Multi-Location Central Management) dient Unternehmen, die mehrere Filialen oder Verkaufsstätten unter dem Dach eines einzigen Rechtsträgers (gleiche Steuernummer) betreiben. Es ermöglicht die zentrale Steuerung des Stammdatenkatalogs, das gezielte Übertragen von Sortimentsänderungen an ausgewählte Filialen sowie die konsolidierte Auswertung von Umsatz- und Leistungsdaten über alle Standorte hinweg – bei gleichzeitiger Wahrung individueller Standort-Preise.
Rollen#
- Administrator (Hauptgeschäft): Legt Standorte an, verwaltet den zentralen Stammdatenkatalog, führt den zentralen Katalog-Push durch und wertet die standortübergreifenden Berichte aus.
- Filialleiter / Location Manager: Verantwortlich für die operative Betreuung einer konkreten Filiale. Kann lokale Preis-Überschreibungen (
LocationProductOverride) im vorgegebenen Rahmen definieren und weist Kassenterminals dem Standort zu. - Servicekraft / Bediener: Meldet sich am Terminal einer bestimmten Filiale an. Kassiert und bucht ausschließlich im Kontext der zugewiesenen Filiale (
location_id).
Bildschirm für Bildschirm#
1. Backoffice: Standortverwaltung (/api/v1/locations)#
- 1 Standort hinzufügen öffnet die Maske Neuer Standort mit Standortname und Adresse (optional); Standort erstellen legt ihn an.
- 2 Eine Karte je Standort mit Name, Adresse (oder Keine Adresse angegeben), ID und dem Status Aktiv oder Inaktiv.
- 3 Deaktivieren oder Aktivieren schaltet den Standort.
- 4 Die Karte Küchenampel mit Gelb ab (Min.) und Rot ab (Min.): ab wie vielen Minuten ein Bon im Küchenmonitor gelb oder rot erscheint (→ Kapitel 15).
- 5 Speichern übernimmt die Schwellen. Die Kasse meldet Küchenampel gespeichert.
- Standort-Liste: Übersicht aller eingerichteten Filialen mit Name, Adresse, ID und Aktivitätsstatus.
- Schaltfläche: Standort hinzufügen; in der Maske Standort erstellen.
- Eingabemaske: Standortname (z. B.
Waterfront Bistro), Adresse (optional).
2. Backoffice: Standort-Katalog-Editor & Overrides (LocationProductOverride)#
- Produkt-Detailansicht: Anzeige des zentralen Stammdatenpreises.
- Standort-Auswahl: Wählen Sie die Filiale aus, für die abweichende Werte gelten sollen.
- Eingabefeld Standort-Preis: Eigener Verkaufspreis in EUR für diese Filiale.
- Schalter Artikel-Abmeldung: Checkbox Vom Standort abgemeldet (
is_opted_out). - Statusanzeige: Zeigt an, ob der Preis überschrieben (
is_overridden = True) oder abgemeldet ist.
3. Backoffice: Zentraler Katalog-Push Dialog (CentralCatalogPushRequest)#
- Ziel-Standorte: Auswahl aller Filialen oder bestimmter Standorte.
- Schalter Überschreiben erzwingen: Checkbox Bestehende Standort-Preise überschreiben (
override_existing). - Schaltfläche: Katalog übertragen (
push_catalog).
4. Backoffice: Push-Ausführungsbericht (CentralCatalogPushResponse)#
- Zusammenfassung: Anzahl übertragener Produkte (
pushed_product_count), aktualisierte Standorte (updated_locations), übersprungene Standorte (skipped_locations). - Detail-Audit-Log: Detaillierte Liste pro Produkt und Standort mit Grund für das Überspringen (
location_opted_outoderlocation_override_active).
5. Backoffice: Standortübergreifendes Analytics-Dashboard (CrossLocationReportResponse)#
- Kopfleiste Standort-Umschalter: Auswahl zwischen einzelnen Filialen oder Alle Standorte.
- Gesamtkennzahlen: Summe aus Bruttoumsatz, Bestellungen, Gedecken (PAX), Rabatten und Stornos.
- Filial-Vergleichstabelle: Anzeige pro Filiale mit Umsatz, Bon-Anzahl, Durchschnittsbon und Umsatzanteil in Prozent (
share_of_tenant_revenue_percent).
Schritt für Schritt (mit Verzweigungen)#
Ablauf 1: Filiale anlegen und Kassen zuweisen#
- Gehen Sie im Backoffice zu Einstellungen > Standorte (
/api/v1/locations). - Tippen Sie auf Standort hinzufügen und geben Sie den Namen (z. B.
Hafen-Filiale) ein. - Nach dem Speichern ist die Filiale aktiv.
- Weisen Sie Kassenterminals unter Einstellungen > Geräte dem neuen Standort zu. Sämtliche Buchungen dieses Terminals tragen fortan automatisch die entsprechende
location_id.
Ablauf 2: Zentraler Katalog-Push & Standort-Preise (Die 4 Prioritätsregeln)#
Beim Übertragen von Artikeländerungen aus der Zentrale an die Standorte (POST /locations/catalog/push) wendet das Kassensystem folgende strikte Prioritätsregeln an:
- Priorität 1: Opt-out (Abmeldung) gewinnt immer: Hat eine Filiale einen Artikel explizit abgemeldet (
is_opted_out = True), wird der Artikel bei dieser Filiale niemals überschrieben oder aktiviert – selbst wenn beim Push die Optionoverride_existing = Trueaktiviert ist. Anweisungen des Standorts haben absoluten Vorrang. - Priorität 2: Lokaler Standort-Preis schützt vor regulärem Push: Hat eine Filiale für ein Produkt einen eigenen Preis festgelegt (
is_overridden = True), überspringt ein Standard-Push diesen Artikel für den betroffenen Standort (location_override_active). Dadurch wird verhindert, dass bewusste Filialpreise (z. B. an Flughafen- oder Bahnhofsstandorten) versehentlich durch zentrale Preise überschrieben werden. - Priorität 3: Erzwungener Push (
override_existing = True): Mit dieser Option werden bestehende Standort-Preise bewusst durch die zentralen Stammdaten ersetzt. Ein aktives Opt-out kann jedoch auch dadurch nicht aufgehoben werden. - Priorität 4: Standard-Push: Fehlt eine lokale Überschreibung, wird die Änderung für den Standort übernommen.
Ablauf 3: Standortübergreifende Berichte auswerten#
- Stellen Sie den Standort-Umschalter in der Kopfleiste auf Alle Standorte.
- Das System führt eine hochperformante Datenbankabfrage mit SQL
GROUP BY Order.location_iddurch. - Verzweigung:
- Standort mit Umsatz: Die Kennzahlen werden aufaddiert und der Prozentanteil am Gesamtumsatz (
share_of_tenant_revenue_percent) berechnet. - Standort ohne Umsatz im Zeitraum: Die Filiale wird sauber mit 0 € Umsatz und 0 Bons in der Tabelle aufgeführt, ohne den Gesamtbericht zu beeinträchtigen.
- Standort mit Umsatz: Die Kennzahlen werden aufaddiert und der Prozentanteil am Gesamtumsatz (
Was passiert im Hintergrund#
Alle Standorte eines Betreibers teilen sich dieselbe Mandanten-ID (tenant_id). Sämtliche Verkaufsdaten, Schichten und Tischpläne tragen zusätzlich die jeweilige location_id.
Katalogabfragen an den Kassenterminals (CatalogService.get_products) prüfen bei jeder Anfrage, ob für die jeweilige location_id ein Eintrag in location_product_overrides existiert, und liefern automatisch den korrekten Standortpreis an das Terminal.
Die standortübergreifende Berichterstattung nutzt hochperformante Datenbankabfragen mit SQL GROUP BY Order.location_id innerhalb eines einzelnen Datenbankaufrufs. Dadurch werden Auswertungen auch bei zahlreichen Filialen ohne Verzögerung generiert.
Häufige Probleme#
1. Location not found#
- Ursache: Die übergebene Standort-ID (
location_id) existiert nicht in der Datenbank des Mandanten. - Lösung: Überprüfen Sie die Standort-ID unter Einstellungen > Standorte.
2. Start date must be before or equal to end date#
- Ursache: Beim Aufruf des standortübergreifenden Berichts (
CrossLocationReportResponse) wurde ein Startdatum gewählt, das zeitlich nach dem Enddatum liegt. - Lösung: Korrigieren Sie den Datumsfilter im Bericht.
3. No open shift for this location#
- Ursache: Es wurde versucht, an einem Kassen-Terminal eine Bestellung abzuschließen, obwohl für diese
location_idderzeit keine aktive Standortschicht geöffnet ist. - Lösung: Öffnen Sie zuerst eine Schicht für den entsprechenden Standort (→ Kapitel 12).
4. Invalid, inactive, or unresolvable location_id for tenant#
- Ursache: Das Kassenterminal ist einer
location_idzugewiesen, die deaktiviert (is_active = False) oder einem anderen Mandanten zugeordnet ist. - Lösung: Aktivieren Sie den Standort im Backoffice oder ordnen Sie das Terminal einem aktiven Standort zu.
5. Location does not belong to your tenant#
- Ursache: Ein Benutzer hat versucht, auf Daten oder Berichte einer Filiale zuzugreifen, die zu einem fremden Mandanten gehört.
- Lösung: Überprüfen Sie die Anmeldung und Mandanten-Zuordnung des Benutzers.
6. Location not found or access denied#
- Ursache: Fehlende Berechtigung für Echtzeit-Nachrichten (WebSockets) für den angeforderten Standort.
- Lösung: Vergewissern Sie sich, dass der angemeldete Bediener Zugriffsrechte auf die Filiale besitzt.
7. Location is closed at the requested reservation time#
- Ursache: Es wurde versucht, eine Tischreservierung außerhalb der für diesen Standort hinterlegten Öffnungszeiten vorzunehmen.
- Lösung: Überprüfen Sie die hinterlegten Standort-Öffnungszeiten in den Reservierungseinstellungen.
8. Some products do not belong to this tenant or do not exist: {missing} (oder Push-Überspringen durch location_override_active)#
- Ursache: Beim zentralen Katalog-Push wurden Produkt-IDs übergeben, die im Mandantenstamm nicht existieren, oder der Push wurde für eine Filiale übersprungen, weil dort ein lokaler Standortpreis aktiv ist.
- Lösung: Prüfen Sie den Ausführungsbericht des Katalog-Pushs (
CentralCatalogPushResponse). Aktivieren Sie bei Bedarf die Optionoverride_existing = True, um lokale Preise bewusst zu überschreiben.
Grenzen#
- Alle Standorte in diesem Modul müssen zwingend zum selben Rechtsträger (gleiche Steuernummer) gehören. Sollen rechtlich selbstständige Betriebe verwaltet werden, muss das Franchise-Modul genutzt werden (→ Kapitel 34).
- Standort-Überschreibungen müssen bei Bedarf manuell im Standort-Katalog zurückgesetzt werden, um wieder automatische Updates aus dem Hauptkatalog zu erhalten.
Dieses Kapitel gehört zum Merkuron-Handbuch für Inhaber und Servicepersonal.