Dieses Dokument beschreibt die Geschäftslogik der Bestellverwaltung im Admin-Bereich. Es richtet sich an Operatoren, die Bestellungen im Alltag bearbeiten: Welche Status es gibt, was sie bedeuten, wo Bestellungen und Positionen angezeigt werden, und welche Aktionen wo möglich sind.
Technische Details zum Kundenprozess (Checkout, E-Mail-Bestätigung) stehen in ORDER_PROCESS.md. Login und Admin-Konten: ADMIN_SYSTEM.md.
Vier Seiten sind für die Bestellbearbeitung relevant:
| Seite | Datei | Rolle für Operatoren |
|---|---|---|
| Dashboard | admin/index.php |
Tagesübersicht, offene Arbeit, Statistik |
| Bestellliste | admin/orders.php |
Suchen, filtern, alle Bestellungen finden |
| Bestelldetail | admin/order.php |
Positionen bearbeiten, stornieren |
| Nachbestellungen | admin/backorders.php |
Externe Bestellung und Lieferung verwalten |
Weitere Admin-Seiten (Produkte, Kategorien, Organisationen, FAQ, Einstellungen, Admins) haben keinen Bezug zu Bestellstatus oder -anzeige.
Eine Bestellung hat keinen einzelnen Status, sondern mehrere Felder, die unabhängig voneinander wirken:
flowchart TB
subgraph orderLevel [Bestellung]
confStatus["confirmation_status"]
opStatus["status"]
end
subgraph lineLevel [Position]
backorder["backorder_status"]
processed["is_processed"]
end
confStatus --> opStatus
backorder --> processed
confirmation_status): Hat der Kunde die E-Mail bestätigt? Blockiert Bearbeitung, solange unbestätigt oder abgelaufen.status): Wie weit ist die Abarbeitung insgesamt? Wird automatisch aus den Positionen berechnet (open, partial, processed) oder manuell gesetzt (cancelled).backorder_status): Liegt der Artikel auf Lager oder muss extern nachbestellt werden?is_processed): Wurde diese Position ausgegeben/abarbeitet?In Tabellen und Listen erscheint ein kombiniertes Anzeige-Label (z. B. „Unbestätigt" oder „Offen"). Die Nachbestellung wird auf Positionsebene geführt und erscheint zusätzlich als Badge „Nachbestellung" auf der Detailseite, wenn mindestens eine Position einen Nachbestell-Status hat.
Das sichtbare Label folgt einer festen Priorität. Höhere Priorität überschreibt niedrigere:
| Anzeige-Label | Bedingung | Bedeutung für Operatoren |
|---|---|---|
| Storniert | Bestellung storniert | Bestellung ist ungültig; nur „Stornierung aufheben" möglich |
| Unbestätigt | E-Mail-Bestätigung ausstehend | Kunde hat noch nicht bestätigt; keine Bearbeitung möglich |
| Bestätigung abgelaufen | Bestätigungsfrist abgelaufen | Kunde hat nicht rechtzeitig bestätigt; keine Bearbeitung möglich |
| Bearbeitet | Alle Positionen bearbeitet | Bestellung abgeschlossen |
| Teilweise bearbeitet | Mindestens eine, nicht alle Positionen bearbeitet | Bestellung in Arbeit |
| Offen | Sonst | Noch keine Position bearbeitet |
Wichtig: Die internen Werte not_required (Bestätigung nicht nötig) und confirmed (Kunde hat bestätigt) erscheinen nie als eigenes Label. Sobald keine Blockade durch Unbestätigt/Abgelaufen besteht, sehen Operatoren den operativen Status: Offen, Teilweise bearbeitet oder Bearbeitet.
| Wert | Wann gesetzt | Operator-Relevanz |
|---|---|---|
not_required |
Bestätigung in Einstellungen deaktiviert | Bestellung sofort bearbeitbar |
pending |
Bestätigung aktiviert, Kunde hat noch nicht bestätigt | Label „Unbestätigt"; Bearbeitung gesperrt |
confirmed |
Kunde hat per Link bestätigt | Bearbeitung freigegeben |
expired |
Frist (confirmation_expires_at) überschritten |
Label „Bestätigung abgelaufen"; Bearbeitung gesperrt |
Auf der Detailseite sind ggf. sichtbar: Bestätigungsfrist (bei Unbestätigt), Bestätigungszeitpunkt, Zeitpunkt der internen Weiterleitung.
| Wert | Bedeutung | Wie gesetzt |
|---|---|---|
open |
Keine Position bearbeitet | Automatisch |
partial |
Einige Positionen bearbeitet | Automatisch |
processed |
Alle Positionen bearbeitet | Automatisch |
cancelled |
Bestellung storniert | Manuell durch Operator |
Stornierte Bestellungen werden nicht automatisch aus Positionen neu berechnet. Nach „Stornierung aufheben" wird der Status wieder aus den Positionen abgeleitet.
is_processed)backorder_status)| Wert | Anzeige-Label | Bedeutung |
|---|---|---|
| (leer) | — | Normale offene Position (Lager/Abgabe) |
to_be_backordered |
Nachzubestellen | Position muss extern nachbestellt werden |
ordered |
Wartet auf Lieferung | Extern bestellt, Lieferung steht aus |
Manuelle Nachbestellungen (data/manual_backorders.json): Gleicher Ablauf wie bei Bestellpositionen, aber ohne Kundenbestellung — nur auf der Seite Nachbestellungen sichtbar und verwaltbar.
admin/index.php)| Karte | Was gezählt wird |
|---|---|
| Offen | Bestellungen mit operativem Status open, ohne Unbestätigt; inkl. abgelaufener Bestätigungen (siehe Bekannte Unstimmigkeiten) |
| Teilweise bearbeitet | status = partial, ohne Unbestätigt |
| Bearbeitet | status = processed, ohne Unbestätigt |
| Storniert | status = cancelled |
| Nachbestellung | Summe aller Positionen in to_be_backordered oder ordered (inkl. manueller Nachbestellungen) |
Unbestätigte Bestellungen (pending) werden in keiner Statistik-Karte gezählt.
Eine Bestellung erscheint hier nur, wenn:
Sortierung: neueste zuerst.
Eine Position erscheint hier nur, wenn:
Sortierung: älteste zuerst (FIFO-Arbeitsliste).
Operator-Hinweis: Positionen mit Nachbestell-Status (Nachzubestellen oder Wartet auf Lieferung) erscheinen nirgends auf dem Dashboard. Diese werden ausschließlich unter Nachbestellungen verwaltet.
admin/orders.php)Filter und Suchfeld (Bestellnummer):
| Filter | Was angezeigt wird |
|---|---|
| Alle | Alle Bestellungen (inkl. Unbestätigt) |
| Unbestätigt | confirmation_status = pending |
| Bestätigung abgelaufen | confirmation_status = expired |
| Offen | Nicht Unbestätigt und status = open |
| Teilweise bearbeitet | status = partial |
| Bearbeitet | status = processed |
| Storniert | status = cancelled |
Die Status-Spalte zeigt das kombinierte Anzeige-Label (Bestätigung hat Vorrang vor operativem Status).
Hinweis zum Filter „Offen": Enthält auch Bestellungen mit abgelaufener Bestätigung, solange der operative Status open ist (siehe Bekannte Unstimmigkeiten).
admin/order.php)Jede Bestellung ist immer über die Bestellliste oder Dashboard-Links erreichbar — unabhängig vom Status.
| Aktion | Wann sichtbar / erlaubt |
|---|---|
| Als bearbeitet / offen markieren | Bestellung nicht storniert; nicht Unbestätigt; nicht Abgelaufen |
| Als Nachbestellung markieren / aufheben | Wie oben; nur Wechsel zwischen (leer) und Nachzubestellen — nicht von Wartet auf Lieferung |
| Bestellung stornieren | Nicht storniert; nicht vollständig Bearbeitet |
| Stornierung aufheben | Bestellung storniert |
Zusätzliches Badge „Nachbestellung", wenn mindestens eine Position einen Nachbestell-Status hat.
Positionen im Status Wartet auf Lieferung (ordered): Kein Nachbestell-Toggle auf der Detailseite — Weiterbearbeitung nur über Nachbestellungen („Lieferung eingetroffen").
admin/backorders.php)Positionen werden nach Produkt und Größe gruppiert. Spalten Nachzubestellen und Wartet auf Lieferung werden getrennt gezählt.
| Aktion | Wirkung |
|---|---|
| Als bestellt markieren | Verschiebt N Positionen von Nachzubestellen → Wartet auf Lieferung |
| Lieferung eingetroffen | Setzt N Positionen von Wartet auf Lieferung → (leer); Position bleibt offen zur normalen Abarbeitung auf der Detailseite |
Manuelle Nachbestellungen können über ein Formular auf derselben Seite hinzugefügt werden.
Übersicht: Wo erscheint ein Zustand?
| Zustand / Bedingung | Dashboard-Statistik | Letzte offene Bestellungen | Offene Positionen | Bestellliste-Filter | Bestelldetail | Nachbestellungen |
|---|---|---|---|---|---|---|
Unbestätigt (pending) |
— (nicht gezählt) | — | — | Unbestätigt, Alle | Ja (nur Ansehen) | — |
Bestätigung abgelaufen (expired) |
Zählt als Offen | — | — | Abgelaufen, auch Offen | Ja (nur Ansehen) | — |
| Offen (bestätigt/nicht nötig) | Offen | Ja*, wenn offene Positionen ohne NB | Ja*, pro Position | Offen, Alle | Ja, bearbeitbar | Ja, wenn NB markiert |
| Teilweise bearbeitet | Teilweise | Ja*, wenn offene Positionen ohne NB | Ja*, pro Position | Teilweise, Alle | Ja, bearbeitbar | Ja, wenn NB markiert |
| Bearbeitet | Bearbeitet | — | — | Bearbeitet, Alle | Ja (nur Ansehen) | Ja, wenn NB markiert |
| Storniert | Storniert | — | — | Storniert, Alle | Ja (Stornierung aufheben) | — |
| Position Nachzubestellen | In NB-Statistik | Position ausgeblendet | Position ausgeblendet | Bestellung in Liste | Toggle auf Detail | Ja |
| Position Wartet auf Lieferung | In NB-Statistik | Position ausgeblendet | Position ausgeblendet | Bestellung in Liste | Kein Toggle auf Detail | Ja |
| Nur NB-Positionen, Bestellung operativ Offen | Offen | — (keine qualif. Position) | — | Alle, Offen | Ja | Ja |
| Manuelle Nachbestellung | In NB-Statistik | — | — | — | — | Ja |
NB = Nachbestell-Status. „Ja" = nur wenn mindestens eine unverarbeitete Position ohne Nachbestell-Status existiert.
Zurück auf Bestelldetail → „Als bearbeitet markieren".
stateDiagram-v2
direction LR
state backorder {
none --> toBeBackordered: Detail markieren
toBeBackordered --> ordered: Nachbestellungen bestellt
ordered --> none: Lieferung eingetroffen
toBeBackordered --> none: Detail aufheben
}
Unter Einstellungen (admin/settings.php):
Diese Einstellungen betreffen nur neu eingehende Bestellungen, nicht bereits gespeicherte.
Die folgenden Punkte sind keine Bedienanleitung, sondern dokumentierte Abweichungen in der Anzeige-Logik. Sie können später im Code behoben werden.
expirePendingOrders() speichert Ablauf ggf. nicht dauerhaft
In includes/functions.php: Der Vergleich $updated !== $order ist bei Arrays per Referenz immer falsch. Abgelaufene Bestätigungen werden beim Lesen berechnet, orders.json kann aber weiterhin pending enthalten, bis eine andere Speicherung erfolgt.
Dashboard-Zähler „Offen" inkl. abgelaufener Bestätigungen
Abgelaufene Bestellungen erhöhen die Karte Offen, zeigen in Listen aber Bestätigung abgelaufen — die Zahl kann irreführend sein.
Filter „Offen" in der Bestellliste inkl. abgelaufener Bestätigungen
Der Filter schließt nur pending aus, nicht expired. Abgelaufene Bestellungen mit operativem Status open erscheinen unter Offen und Bestätigung abgelaufen.
Kein Dashboard-Zähler für Unbestätigt
Unbestätigte Bestellungen fehlen in allen Statistik-Karten; sie sind nur über Bestellliste → Filter Unbestätigt oder Alle auffindbar.
Bestellung nur mit Nachbestellpositionen
Operativer Status kann Offen bleiben (0 Positionen bearbeitet), aber alle Positionen haben Nachbestell-Status → Bestellung erscheint nicht in Dashboard-Tabellen, nur in Alle und Nachbestellungen.
Status „Wartet auf Lieferung" nicht auf Detailseite änderbar
Bewusste Trennung: Weiterführung nur über Nachbestellungen. Operatoren, die nur die Detailseite nutzen, finden keinen Button dafür.
Stornierte Bestellungen können Nachbestell-Flags in den Daten behalten
In der Nachbestellungen-Ansicht ausgeblendet, in den Rohdaten ggf. noch vorhanden.
Position bearbeitbar trotz Nachbestell-Flag
„Als bearbeitet markieren" löscht den Nachbestell-Status nicht automatisch. Umgekehrt blockiert ein gesetzter Nachbestell-Status auf bereits bearbeiteten Positionen keine erneute Markierung als offen/bearbeitet.
FIFO-Sortierung bei Bulk-Aktionen inkonsistent
Anzeige in Nachbestellungen sortiert u. a. nach sort_at (Bestell-/Bestellzeitpunkt). Bulk-Updates sortieren Kandidaten nur nach created_at — Reihenfolge kann bei „Wartet auf Lieferung" abweichen.
MANUAL_BACKORDERS_FILE fehlt in config.sample.php
Manuelle Nachbestellungen setzen die Konstante voraus; fehlt sie in der produktiven config.php, kann die Nachbestellungen-Seite fehlschlagen.