Docs: README auf aktuellen Stand (Gegenstaende, iOS, alle Features)

Root-README beschrieb noch "Schritt 1" mit iOS "in Vorbereitung". Jetzt
tatsaechlicher Umfang: Lebensmittel + Gegenstaende (3 Arten), verschachtelte
Lagerorte mit Inhaltsansicht, Kategorien/Gruppen, Mindestbestaende, Chargen-/
Einzelstuecklisten, Dashboards, Web-UI + native iOS-App. iOS-README-Stand,
Dateiuebersicht und "offene Punkte" ebenfalls aktualisiert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-07-29 14:47:18 +02:00
parent 7a7b40ff99
commit a0979a0780
2 changed files with 92 additions and 46 deletions

View File

@@ -1,44 +1,78 @@
# Vorrania Selfhostbare Lebensmittel-Lagerverwaltung
# Vorrania Selfhostbare Vorrats- und Gegenstandsverwaltung
Ein selbst gehosteter Dienst zur Verwaltung deines Lebensmittelvorrats:
Ein-/Auslagern per Barcode, MHD-/Ablaufverwaltung mit Chargen, Mindestbestände,
automatische Einkaufsliste mit **Web-UI** und (in Vorbereitung) **nativer iOS-App**.
Ein selbst gehosteter Dienst, um sowohl deinen **Lebensmittelvorrat** als auch
allgemeine **Gegenstände** (Haushalt, Elektronik, Kleidung, Verbrauchsmaterial …)
zu verwalten: Ein-/Auslagern per Barcode, Chargen mit MHD, Einzelstücke mit
eigener UID/QR, Mindestbestände, automatische Einkaufsliste, verschachtelte
Lagerorte, Gruppen, Kategorien und Dashboards mit **Web-UI** und **nativer
iOS-App**, die beide dieselbe REST-API nutzen.
> Dies ist **Schritt 1** (Fundament). Der komplette Fahrplan steht in
> [docs/ROADMAP.md](docs/ROADMAP.md).
## Was Vorrania verwaltet
## Features (Schritt 1)
- **Barcode-Lookup** über [Open Food Facts](https://world.openfoodfacts.org) mit
lokalem Fallback (unbekannte Produkte selbst anlegen).
- **Chargen mit MHD:** Jedes Einlagern erzeugt eine Charge mit eigenem
Mindesthaltbarkeitsdatum. Beim Auslagern wird automatisch die zuerst ablaufende
Charge zuerst entnommen (**FEFO** First Expired, First Out).
- **Einheiten:** Basiseinheit Stück / Gramm / Milliliter plus optionale
Packungsgröße → Ein-/Auslagern in Packungen **oder** Teilmengen (z. B. 200 g).
- **Mindestbestände** pro Produkt → automatische **Einkaufsliste**.
- **Ablaufwarnung** für bald ablaufende Chargen (Frist konfigurierbar).
- **Lagerorte** (flach; Unterlagerorte folgen in Schritt 3).
- **Mehrbenutzer mit Rollen:**
- **Admin** verwaltet Produkte, Lagerorte, Benutzer, Mindestbestände.
- **Nutzer** nur ein-/auslagern und ansehen.
- Bewegungen werden protokolliert (wer hat wann was ein-/ausgelagert).
**Lebensmittel** laufen als **Chargen** mit Mindesthaltbarkeitsdatum. Beim
Auslagern wird automatisch die zuerst ablaufende Charge entnommen (**FEFO**).
**Gegenstände** kennen drei Arten:
- **Menge je Lagerort** reines Zählen (z. B. Unterhosen, Batterien).
- **Einzelstücke** jedes Exemplar mit eigener **UID/QR**, Kaufdatum, Garantie,
Bezugsquelle und Beleg (z. B. Powerbank, Kamera).
- **Verbrauchsgegenstand** wie ein Lebensmittel als Charge mit Menge und
Einheit geführt (z. B. Sonnencreme in ml), nur ohne eindeutigen Code.
## Features
- **Barcode-Lookup** über [Open Food Facts](https://world.openfoodfacts.org) und
Open Products Facts mit lokalem Fallback; unbekannte Produkte selbst anlegen,
Bild wird automatisch geholt.
- **Chargen mit MHD & FEFO**, Mengen in Packungen **oder** Teilmengen
(Basiseinheit Stück / Gramm / Milliliter plus Packungsgröße/Gebinde).
- **Lagerorte** beliebig verschachtelt (Keller → Regal 2 → Fach A), mit
**QR-Etiketten**, **Inhaltsansicht** („was liegt hier?“), Umlagern und
Entfernen mit Grund. Chargen und Einzelstücke sind einem Lagerort zugeordnet.
- **Kategorien** verschachtelt und pro Typ (Lebensmittel/Gegenstand); für
Gegenstände mit **eigenen Feldern** (z. B. Kapazität, Größe, Farbe).
- **Gruppen** rechnen Bestände mehrerer Marken/Artikel zusammen (z. B. „5 kg
Mehl“) mit eigenem Mindestbestand und Einheit.
- **Mindestbestände** je Produkt und Gruppe gesamt **und je Lagerort** mit
zentraler Übersichtsseite, daraus die automatische **Einkaufsliste** und
**Ablaufwarnung** für bald ablaufende Chargen.
- **Übergreifende Listen** für Produkte (getrennt Lebensmittel/Gegenstände),
Einzelstücke und Chargen filter-, sortier- und spaltenkonfigurierbar; bei
Chargen lässt sich der Lagerort mehrerer auf einmal setzen.
- **Dashboards** mit konfigurierbaren Karten und Diagrammen, **Verlauf** (wer hat
wann was ein-/ausgelagert), **Stammdaten** (Einheiten, Gebinde, Shops) und
**Import/Export**.
- **Mehrbenutzer mit Rollen:** *Admin* verwaltet Stammdaten und Benutzer,
*Nutzer* lagert nur ein/aus und sieht Bestände; alle Bewegungen werden
protokolliert.
### In der iOS-App zusätzlich
- **Scannen** von Barcode, **MHD/Datum per Texterkennung** (auch nur Tag+Monat
ohne Jahr bei Frischware), **Lagerort-QR** und **Name/Marke per Text-Scan**.
- **Foto direkt beim Anlegen** (Kamera/Galerie), **Push-Benachrichtigungen** bei
ablaufenden Produkten, lokale Dashboards und Home-Screen-Schnellaktionen.
Details zur App: [ios/README.md](ios/README.md).
## Architektur
| Teil | Technik |
|---------|--------------------------------------|
|---------|----------------------------------------|
| Backend | Python · FastAPI · SQLAlchemy |
| DB | PostgreSQL |
| DB | PostgreSQL (SQLite für Tests/lokal) |
| Web-UI | React · Vite (via nginx ausgeliefert) |
| iOS | SwiftUI (Schritt 2) |
| iOS | Native SwiftUI-App (VisionKit-Scanner) |
| Deploy | Docker Compose · `install.sh` |
```
backend/ FastAPI-App + Tests
web/ React/Vite SPA
deploy/ docker-compose.yml, install.sh, .env.example
ios/ Native SwiftUI-App (XcodeGen-Projekt)
deploy/ docker-compose.yml, install.sh, update.sh, .env.example
docs/ Roadmap
```
Das Schema wird beim Start per idempotenter `ALTER TABLE`-Migration in
`backend/app/main.py` nachgezogen (kein Alembic).
## Installation (selfhosted, Linux)
Voraussetzung: eine Linux-Maschine (Server, NAS, Raspberry Pi …). Docker wird bei
Bedarf automatisch installiert.
@@ -59,6 +93,8 @@ Nach dem Start:
- Web-UI: `http://<server-ip>:8080` (Port konfigurierbar)
- Anmeldung mit dem im Installer angezeigten Admin-Benutzer/Passwort.
Die iOS-App wird mit derselben Adresse verbunden (`http://<server-ip>:8080`).
## Aktualisieren
```bash
cd vorrania/deploy
@@ -99,13 +135,14 @@ npm install
npm run dev # http://localhost:5173, proxyt /api → localhost:8000
```
**iOS:** siehe [ios/README.md](ios/README.md) (XcodeGen-Projekt, `xcodegen generate`).
**Tests:**
```bash
cd backend
pip install -r requirements.txt
pytest # prüft FEFO-Abbuchung und Einheiten-Umrechnung
DATABASE_URL="sqlite://" pytest
```
## Nächste Schritte
Native iOS-App (Schritt 2) und fortgeschrittene Features (Gruppen-Intelligenz,
Unterlagerorte, Push-Benachrichtigungen …) siehe [docs/ROADMAP.md](docs/ROADMAP.md).
## Weiteres
Fahrplan und Ideen: [docs/ROADMAP.md](docs/ROADMAP.md).

View File

@@ -1,12 +1,16 @@
# Vorrania iOS-App
Native SwiftUI-App zum Ein- und Auslagern per Barcode-Scan. Sie spricht dieselbe
Native SwiftUI-App für Lebensmittel **und** Gegenstände. Sie spricht dieselbe
REST-API wie die Web-Oberfläche.
> **Stand:** Läuft auf dem Gerät. Login, Scanner, Einlagern mit mehreren
> Chargen/MHDs, MHD per Texterkennung, Auslagern mit Chargenauswahl, Artikel
> anlegen aus Open Food Facts, Einkaufsliste, Ablaufliste sowie Produkte
> ansehen und bearbeiten.
> **Stand:** Voll nutzbar. Login; Scannen von Barcode, MHD/Datum (per
> Texterkennung, auch nur Tag+Monat ohne Jahr), Lagerort-QR und Name/Marke;
> Ein-/Auslagern mit mehreren Chargen bzw. Menge je Lagerort; Einzelstücke mit
> UID/QR, Kaufdatum, Garantie und Beleg; Verbrauchsgegenstände als Charge;
> Artikel anlegen (Open Food/Products Facts oder manuell, mit Foto); getrennte
> Listen für Lebensmittel/Gegenstände/Einzelstücke, Kategoriefilter, Sortierung;
> Einkaufsliste, Ablaufliste, Mindestbestände; Verlauf mit Sprung zum Produkt;
> lokale Dashboards und Push-Benachrichtigungen bei ablaufenden Produkten.
## Projekt in Xcode öffnen
@@ -62,12 +66,17 @@ Beide Wege öffnen die App **direkt in der Kamera**.
| `ScannerView.swift` | Kamera + Barcode-Erkennung (EAN-8/13, UPC-E, Code128, QR) |
| `RootView.swift` | Startbildschirm und Routing |
| `LoginView.swift` | Server + Anmeldung |
| `CheckInView.swift` / `CheckInFormView.swift` | Scan → Menge, mehrere Chargen mit MHD |
| `CheckInView.swift` / `CheckInFormView.swift` | Scan → Charge (MHD), Menge je Lagerort oder Einzelstück |
| `CheckOutView.swift` | Scan → Menge, Chargenauswahl oder FEFO |
| `ProductViews.swift` | Artikelsuche und Anlegen (mit OFF-Vorbefüllung) |
| `ProductDetailView.swift` | Produkt bearbeiten, Chargen korrigieren und löschen |
| `ListViews.swift` | Einkaufsliste, „bald ablaufend", Produktliste |
| `DateScanView.swift` / `BestBeforeText.swift` | MHD per Texterkennung ablesen |
| `ProductViews.swift` | Artikelsuche und Anlegen (mit OFF-Vorbefüllung, Foto, Text-Scan) |
| `ProductDetailView.swift` | Produkt bearbeiten, Verwaltungsart ändern, Chargen korrigieren |
| `ObjectStockView.swift` | Gegenstände: Menge je Lagerort (hinzufügen/umlagern/entfernen) |
| `ItemViews.swift` / `ItemListView.swift` | Einzelstücke anlegen, bearbeiten und auflisten |
| `AssignScanView.swift` | Einzelstück (Scan oder Liste) einem Lagerort-QR zuordnen |
| `ListViews.swift` | Produktlisten, Einkaufsliste, „bald ablaufend", Mindestbestände |
| `DashboardView.swift` / `DashboardCards.swift` / `ChartCards.swift` | Übersicht mit Karten und Diagrammen |
| `NotificationScheduler.swift` / `NotificationSettings*.swift` | Push-Benachrichtigungen bei Ablauf |
| `DateScanView.swift` / `BestBeforeText.swift` | MHD/Text per Texterkennung ablesen |
| `DisplaySettings.swift` | Datumsformat und Einheiten-Beschriftungen vom Server |
| `CategoryPicker.swift` | Kategorie-Auswahl und Gruppe anlegen |
@@ -84,6 +93,6 @@ Bestand, keinen Mindestbestand und keine EAN-Codes. Filterst du auf eine
Oberkategorie, erscheinen die Artikel ihrer Unterkategorien mit. Beim Anlegen
schlägt der Server eine Kategorie aus der Open-Food-Facts-Einordnung vor.
## Noch offen
- Push-Benachrichtigungen bei ablaufenden Produkten
- Lagerort je Charge beim Einlagern wählbar
## Weiteres
Push-Benachrichtigungen bei Ablauf und Lagerort je Charge beim Einlagern sind
umgesetzt. Weitere Ideen stehen in [../docs/ROADMAP.md](../docs/ROADMAP.md).