# Order Process

## Überblick

Das System bildet keinen klassischen E-Commerce-Checkout ab, sondern einen internen PSA-Anforderungsprozess mit direkter interner Weiterleitung nach dem Absenden.

- Einstieg: `index.php` -> `product.php` -> `cart.php` -> `checkout.php`
- Persistenz: `data/orders.json`
- Kernlogik: `includes/functions.php`
- Interne Bearbeitung: `admin/orders.php`
- Nachbestellungen: `admin/backorders.php`
- Einstellungen für Weiterleitung: `admin/settings.php`

Hinweis:

- `config.php` liefert Startwerte, wirksam im Betrieb sind die normalisierten Einstellungen aus `data/settings.json` (über `getSystemSettings()`).

## Ablauf (Endnutzer)

1. Produkt wird in `product.php` in den Warenkorb gelegt (optional mit Größe).
2. Der Warenkorb (`cart.php`) enthält pro Produkt nur einen Eintrag; erneutes Hinzufügen aktualisiert ggf. die Größe statt eine Menge zu erhöhen.
3. Checkout (`checkout.php`) erfasst:
   - Name
   - E-Mail
   - Organisation (Pflicht, muss aktiv sein)
   - Kommentar (optional)
4. `createOrder(...)` erzeugt eine Bestellnummer (`ORDER_PREFIX-JAHR-LFDNR`, z. B. `FWFS-2026-001`) und speichert die Bestellung.
5. Nach dem Speichern werden interne Admin-Benachrichtigung und Kunden-Eingangsbestätigung per E-Mail versendet, der Warenkorb geleert und auf `order-success.php` weitergeleitet.

## Vorbedingungen

Eine Bestellung ist nur möglich, wenn die gewählte Organisation existiert und als aktiv markiert ist. Inaktive/ungültige Organisationen blockieren den Abschluss.

Es gibt keinen separaten Admin-Freigabeschritt vor dem Eingang einer Bestellung.

## Interner Prozess nach Eingang

In `admin/orders.php` werden Bestellungen nach Status geführt und manuell bearbeitet:

- `open`: keine Position bearbeitet
- `partial`: mindestens eine Position bearbeitet
- `processed`: alle Positionen bearbeitet
- `cancelled`: Bestellung storniert

Regeln:

- Stornierung ist jederzeit möglich (solange noch nicht storniert).
- Zeitstempel für interne Weiterleitung (`admin_notified_at`) wird gesetzt, wenn die Admin-Benachrichtigungsmail erfolgreich versendet wurde.

## Nachbestellungen (nur Admin)

Wenn Artikel nicht auf Lager sind, können Admins Positionen als Nachbestellung markieren. Der Vorgang ist nur im Admin-Bereich sichtbar, nicht im Frontend.

### Daten pro Position

Jede Bestellposition kann optional folgende Felder haben:

- `backorder_status`: `""` (keine), `to_be_backordered`, `ordered`
- `backordered_at`, `ordered_at` (Zeitstempel)

### Zustände

1. **Nachzubestellen** (`to_be_backordered`): Position ist als Nachbestellung markiert, externe Bestellung steht noch aus.
2. **Wartet auf Lieferung** (`ordered`): Extern bestellt, Lieferung ausstehend.

### Aktionen

| Aktion | Ort | Wirkung |
| --- | --- | --- |
| Als Nachbestellung markieren | `admin/orders.php` (pro Position) | Setzt `to_be_backordered` |
| Nachbestellung aufheben | `admin/orders.php` | Setzt `backorder_status` zurück auf `""` (nur aus Zustand 1) |
| Als bestellt markieren | `admin/backorders.php` | Verschiebt N Positionen von `to_be_backordered` nach `ordered` (FIFO) |
| Lieferung eingetroffen | `admin/backorders.php` | Setzt N Positionen von `ordered` zurück auf `""` (FIFO); Position bleibt offen zur normalen Abarbeitung |

In `admin/backorders.php` werden Positionen nach Produkt und Größe gruppiert. Die Spalten **Nachzubestellen** und **Wartet auf Lieferung** werden getrennt gezählt, damit neu markierte Artikel nicht mit bereits bestellten vermischt werden.

Positionen mit Nachbestell-Status (**Nachzubestellen** oder **Wartet auf Lieferung**) erscheinen nicht in **Offene Positionen** auf dem Dashboard; sie werden über **Nachbestellungen** verwaltet.

## Abweichungen zum Standard-Webshop

- Kein Payment-Schritt (kein Warenwert, keine Zahlungsarten, keine Zahlungsfreigabe).
- Keine Mengenlogik im Warenkorb (pro Produkt nur ein Eintrag, keine Stückzahl).
- Keine Lieferadresse / kein Versandprozess / kein Fulfillment-Tracking.
- Keine Endnutzer-Bestellhistorie oder Kundenkonto-Workflow.
- Bearbeitung ist positionsbasiert im Admin (operativer Abarbeitungsstatus statt klassischer Versandstatus).
- Checkout-Zähler für Rate-Limits wird erst nach erfolgreich gespeicherter Bestellung erhöht.
