# Wildfleisch – Bestand und Reservierungen

Lokal nutzbarer MVP mit Python 3.10+ und SQLite, ohne zusätzliche Pakete. Öffentliche deutsche Website mit verfügbaren Portionen, Mengenauswahl und Reservierungsanfrage; Verwaltung für Artikel, freien Bestand und Reservierungsstatus. Kein Checkout, keine Zahlung und kein verbindlicher Kauf.

## Einrichtung und Start

Im Ordner `projekt_wildfleisch`:

```bash
python3 app.py admin-password
python3 app.py serve
```

Das Passwort wird verdeckt interaktiv abgefragt, muss mindestens zwölf Zeichen haben und wird ausschließlich als gesalzener scrypt-Hash gespeichert. Es gibt keine Standardzugangsdaten. Anschließend `http://127.0.0.1:8080` öffnen, unter „Verwaltung“ anmelden und Artikel anlegen. Ein anderer lokaler Port ist mit `--port 8081` möglich. Server mit Strg+C beenden. Nach Passwortänderung einen laufenden Server beenden und erneut starten, um bestehende Sitzungen zu verwerfen.

Die Anwendung erstellt `data/wildfleisch.sqlite3` beim ersten Start, ohne Beispielbestände. Diese Datei enthält Passwort-Hash, Bestand und personenbezogene Reservierungsdaten; nicht veröffentlichen oder in Git aufnehmen. Sicherungen nur bei beendetem Server erstellen. Rücksicherung ersetzt den gesamten Datenstand. Sitzungen liegen ausschließlich im Arbeitsspeicher und verfallen nach einer Stunde oder beim Serverende.

## Bedienung und Bestandsregeln

- Artikel als zählbare Einheiten pflegen, beispielsweise „Packung à 500 g“. Mengen sind ganze Einheiten; kein Wiegen oder automatisches Berechnen von Preisen.
- Zu jedem Artikel kann ein eigenes Bild hochgeladen oder eines der Beispielbilder gewählt werden: Hirsch (Rücken, Schulter, Keule, Ragout), Wildschwein (Rücken, Schulter), Reh (Rücken) und Hase (Keule). Eigenes Bild hat Vorrang, höchstens 2 MB, JPEG, PNG, WEBP oder GIF. Beispielbilder liegen in `beispiele/` und zeigen typische Zuschnitte, nicht die konkrete Ware. Hochgeladene Dateien liegen unter `data/images/` und werden nicht direkt aus dem Webverzeichnis ausgeliefert.
- „Frei verfügbare Einheiten“ enthält ausschließlich noch nicht reservierten Bestand. Vorhandene Reservierungen nicht nochmals abziehen.
- Reservierungen reduzieren den Bestand sofort und atomar. Bei mehreren Artikeln wird die ganze Anfrage übernommen oder vollständig zurückgerollt. Gleichzeitige Anfragen können nicht mehr Bestand reservieren als verfügbar.
- Status: offen → bestätigt → abgeholt; offene und bestätigte Anfragen können storniert werden. Stornierung gibt Bestand einmalig zurück. Abgeholt und storniert sind abgeschlossen.
- Artikel löschen entfernt ihn aus Bestand und Verwaltung, solange keine Reservierung ihn enthält. Anfragen lassen sich ebenfalls löschen: bei offen und bestätigt kommt der Bestand zurück, bei abgeholt und storniert bleibt er unverändert.
- Kunden erhalten eine Reservierungsnummer im Browser. Kontaktaufnahme und Bestätigung erfolgen manuell anhand der Verwaltungsübersicht. Es werden keine E-Mails oder Nachrichten versendet.

## Prüfen

Vom Workspace-Root ausschließlich:

```bash
python3 agents/helfer tests wildfleisch
```

Tests verwenden temporäre Datenbanken, prüfen atomare Reservierungen mit konkurrierenden Threads, Rückabwicklung, Stornierung, Passworthashing sowie HTTP-Login, Sitzungsrotation, CSRF und HTML-Escaping.

## Grenzen vor öffentlicher Nutzung

Der Server bindet ausschließlich an die lokale Adresse 127.0.0.1. Dies ist ein lokaler MVP, kein öffentliches Hosting-Setup. Der Standardbibliothek-HTTP-Server ist nicht für den Internetbetrieb ausgelegt. Ein öffentlicher Betrieb benötigt eine eigene geprüfte Bereitstellung mit HTTPS und Secure-Cookies, belastbaren Missbrauchsschutz für öffentliche Reservierungen sowie einen definierten Sicherungs- und Löschprozess. Anmeldungen sind lokal auf fünf Fehlversuche je Client-Adresse in fünf Minuten begrenzt. Öffentliche Reservierungen haben noch keine Kontaktverifikation oder automatische Ablaufzeit.

Betreiberangaben, Datenschutzhinweise, Aufbewahrungsfristen, tatsächliche Wareninformationen und Bedingungen für Lebensmittelabgabe und Abholung sind vor Veröffentlichung mit dem Betreiber zu klären. Die Website enthält keine erfundenen Herkunfts-, Preis- oder Zertifizierungsangaben. Keine Onlinezahlung, kein Versand, keine Kundenkonten, keine automatische Bestätigung. Historische Reservierungspositionen zeigen die aktuell gepflegte Artikelbezeichnung, solange der Artikel noch existiert.

## Betrieb auf diesem Server

Öffentlich unter https://dp-smartsolutions.de/fabian/. Der Python-Prozess bindet nur an 127.0.0.1:8091; Apache spricht per HTTPS dorthin. Systemdienst: `fabian.service`. URL-Präfix über die Umgebungsvariable `WILD_BASE=/fabian`.

Admin-Passwort (mindestens 12 Zeichen), danach den Dienst neu starten:

```bash
sudo -u ftpuser python3 /var/www/html/fabian/app.py admin-password
sudo systemctl restart fabian
```

Die Datenbank liegt in `data/wildfleisch.sqlite3` und gehört `ftpuser`.
