# Order Process

## Überblick

Das System bildet keinen klassischen E-Commerce-Checkout ab, sondern einen internen PSA-Anforderungsprozess mit optionaler E-Mail-Bestätigung vor der internen Weiterleitung.

- Einstieg: `index.php` -> `product.php` -> `cart.php` -> `checkout.php`
- Persistenz: `data/orders.json`
- Kernlogik: `includes/functions.php`
- Interne Bearbeitung: `admin/orders.php`
- Einstellungen für Bestätigung/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 wird der Warenkorb geleert und auf `order-success.php` weitergeleitet.

## Potenzielle Freigaben / Bestätigungen

### 1) Organisation als Vorbedingung

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

### 2) Optionale E-Mail-Bestätigung durch Besteller

Die Einstellung `order_confirmation_required` steuert, ob eine Bestätigung nötig ist:

- **Aktiviert**:
  - Status beim Anlegen: `confirmation_status = pending`
  - Es wird eine Bestätigungs-Mail mit Token-Link (`order-confirm.php?token=...`) versendet.
  - Interne Weiterleitung an die Empfängeradresse erfolgt erst nach erfolgreicher Bestätigung.
  - Frist über `order_confirmation_expiry_days`; danach `confirmation_status = expired`.
- **Deaktiviert**:
  - Status beim Anlegen: `confirmation_status = not_required`
  - Bestellung wird direkt intern weitergeleitet.

### 3) Keine separate Admin-Freigabe vor Eingang

Es gibt keinen expliziten Admin-Approve-Schritt, der den Eingang einer Bestellung freischaltet. Die formale Freigabelogik ist die optionale E-Mail-Bestätigung durch den Besteller.

## 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
- zusätzlich `pending`/`expired` über `confirmation_status`

Regeln:

- Positionsbearbeitung ist gesperrt, solange Bestellung `pending` oder `expired` ist.
- 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.

## 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.
- Optionaler Double-Opt-in-ähnlicher Schritt per E-Mail-Bestätigung vor interner Weiterleitung.
- Bearbeitung ist positionsbasiert im Admin (operativer Abarbeitungsstatus statt klassischer Versandstatus).
- Legacy-Routen `reservation.php` und `orders.php` (Frontend) sowie `admin/reservations.php` und `admin/backorders.php` leiten auf die Bestellverwaltung um und sind kein eigener Prozess mehr.
