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 selbst gehosteter Dienst, um sowohl deinen **Lebensmittelvorrat** als auch
Ein-/Auslagern per Barcode, MHD-/Ablaufverwaltung mit Chargen, Mindestbestände, allgemeine **Gegenstände** (Haushalt, Elektronik, Kleidung, Verbrauchsmaterial …)
automatische Einkaufsliste mit **Web-UI** und (in Vorbereitung) **nativer iOS-App**. 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 ## Was Vorrania verwaltet
> [docs/ROADMAP.md](docs/ROADMAP.md).
## Features (Schritt 1) **Lebensmittel** laufen als **Chargen** mit Mindesthaltbarkeitsdatum. Beim
- **Barcode-Lookup** über [Open Food Facts](https://world.openfoodfacts.org) mit Auslagern wird automatisch die zuerst ablaufende Charge entnommen (**FEFO**).
lokalem Fallback (unbekannte Produkte selbst anlegen).
- **Chargen mit MHD:** Jedes Einlagern erzeugt eine Charge mit eigenem **Gegenstände** kennen drei Arten:
Mindesthaltbarkeitsdatum. Beim Auslagern wird automatisch die zuerst ablaufende - **Menge je Lagerort** reines Zählen (z. B. Unterhosen, Batterien).
Charge zuerst entnommen (**FEFO** First Expired, First Out). - **Einzelstücke** jedes Exemplar mit eigener **UID/QR**, Kaufdatum, Garantie,
- **Einheiten:** Basiseinheit Stück / Gramm / Milliliter plus optionale Bezugsquelle und Beleg (z. B. Powerbank, Kamera).
Packungsgröße → Ein-/Auslagern in Packungen **oder** Teilmengen (z. B. 200 g). - **Verbrauchsgegenstand** wie ein Lebensmittel als Charge mit Menge und
- **Mindestbestände** pro Produkt → automatische **Einkaufsliste**. Einheit geführt (z. B. Sonnencreme in ml), nur ohne eindeutigen Code.
- **Ablaufwarnung** für bald ablaufende Chargen (Frist konfigurierbar).
- **Lagerorte** (flach; Unterlagerorte folgen in Schritt 3). ## Features
- **Mehrbenutzer mit Rollen:** - **Barcode-Lookup** über [Open Food Facts](https://world.openfoodfacts.org) und
- **Admin** verwaltet Produkte, Lagerorte, Benutzer, Mindestbestände. Open Products Facts mit lokalem Fallback; unbekannte Produkte selbst anlegen,
- **Nutzer** nur ein-/auslagern und ansehen. Bild wird automatisch geholt.
- Bewegungen werden protokolliert (wer hat wann was ein-/ausgelagert). - **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 ## Architektur
| Teil | Technik | | Teil | Technik |
|---------|--------------------------------------| |---------|----------------------------------------|
| Backend | Python · FastAPI · SQLAlchemy | | Backend | Python · FastAPI · SQLAlchemy |
| DB | PostgreSQL | | DB | PostgreSQL (SQLite für Tests/lokal) |
| Web-UI | React · Vite (via nginx ausgeliefert) | | Web-UI | React · Vite (via nginx ausgeliefert) |
| iOS | SwiftUI (Schritt 2) | | iOS | Native SwiftUI-App (VisionKit-Scanner) |
| Deploy | Docker Compose · `install.sh` | | Deploy | Docker Compose · `install.sh` |
``` ```
backend/ FastAPI-App + Tests backend/ FastAPI-App + Tests
web/ React/Vite SPA 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 docs/ Roadmap
``` ```
Das Schema wird beim Start per idempotenter `ALTER TABLE`-Migration in
`backend/app/main.py` nachgezogen (kein Alembic).
## Installation (selfhosted, Linux) ## Installation (selfhosted, Linux)
Voraussetzung: eine Linux-Maschine (Server, NAS, Raspberry Pi …). Docker wird bei Voraussetzung: eine Linux-Maschine (Server, NAS, Raspberry Pi …). Docker wird bei
Bedarf automatisch installiert. Bedarf automatisch installiert.
@@ -59,6 +93,8 @@ Nach dem Start:
- Web-UI: `http://<server-ip>:8080` (Port konfigurierbar) - Web-UI: `http://<server-ip>:8080` (Port konfigurierbar)
- Anmeldung mit dem im Installer angezeigten Admin-Benutzer/Passwort. - Anmeldung mit dem im Installer angezeigten Admin-Benutzer/Passwort.
Die iOS-App wird mit derselben Adresse verbunden (`http://<server-ip>:8080`).
## Aktualisieren ## Aktualisieren
```bash ```bash
cd vorrania/deploy cd vorrania/deploy
@@ -99,13 +135,14 @@ npm install
npm run dev # http://localhost:5173, proxyt /api → localhost:8000 npm run dev # http://localhost:5173, proxyt /api → localhost:8000
``` ```
**iOS:** siehe [ios/README.md](ios/README.md) (XcodeGen-Projekt, `xcodegen generate`).
**Tests:** **Tests:**
```bash ```bash
cd backend cd backend
pip install -r requirements.txt pip install -r requirements.txt
pytest # prüft FEFO-Abbuchung und Einheiten-Umrechnung DATABASE_URL="sqlite://" pytest
``` ```
## Nächste Schritte ## Weiteres
Native iOS-App (Schritt 2) und fortgeschrittene Features (Gruppen-Intelligenz, Fahrplan und Ideen: [docs/ROADMAP.md](docs/ROADMAP.md).
Unterlagerorte, Push-Benachrichtigungen …) siehe [docs/ROADMAP.md](docs/ROADMAP.md).

View File

@@ -1,12 +1,16 @@
# Vorrania iOS-App # 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. REST-API wie die Web-Oberfläche.
> **Stand:** Läuft auf dem Gerät. Login, Scanner, Einlagern mit mehreren > **Stand:** Voll nutzbar. Login; Scannen von Barcode, MHD/Datum (per
> Chargen/MHDs, MHD per Texterkennung, Auslagern mit Chargenauswahl, Artikel > Texterkennung, auch nur Tag+Monat ohne Jahr), Lagerort-QR und Name/Marke;
> anlegen aus Open Food Facts, Einkaufsliste, Ablaufliste sowie Produkte > Ein-/Auslagern mit mehreren Chargen bzw. Menge je Lagerort; Einzelstücke mit
> ansehen und bearbeiten. > 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 ## 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) | | `ScannerView.swift` | Kamera + Barcode-Erkennung (EAN-8/13, UPC-E, Code128, QR) |
| `RootView.swift` | Startbildschirm und Routing | | `RootView.swift` | Startbildschirm und Routing |
| `LoginView.swift` | Server + Anmeldung | | `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 | | `CheckOutView.swift` | Scan → Menge, Chargenauswahl oder FEFO |
| `ProductViews.swift` | Artikelsuche und Anlegen (mit OFF-Vorbefüllung) | | `ProductViews.swift` | Artikelsuche und Anlegen (mit OFF-Vorbefüllung, Foto, Text-Scan) |
| `ProductDetailView.swift` | Produkt bearbeiten, Chargen korrigieren und löschen | | `ProductDetailView.swift` | Produkt bearbeiten, Verwaltungsart ändern, Chargen korrigieren |
| `ListViews.swift` | Einkaufsliste, „bald ablaufend", Produktliste | | `ObjectStockView.swift` | Gegenstände: Menge je Lagerort (hinzufügen/umlagern/entfernen) |
| `DateScanView.swift` / `BestBeforeText.swift` | MHD per Texterkennung ablesen | | `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 | | `DisplaySettings.swift` | Datumsformat und Einheiten-Beschriftungen vom Server |
| `CategoryPicker.swift` | Kategorie-Auswahl und Gruppe anlegen | | `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 Oberkategorie, erscheinen die Artikel ihrer Unterkategorien mit. Beim Anlegen
schlägt der Server eine Kategorie aus der Open-Food-Facts-Einordnung vor. schlägt der Server eine Kategorie aus der Open-Food-Facts-Einordnung vor.
## Noch offen ## Weiteres
- Push-Benachrichtigungen bei ablaufenden Produkten Push-Benachrichtigungen bei Ablauf und Lagerort je Charge beim Einlagern sind
- Lagerort je Charge beim Einlagern wählbar umgesetzt. Weitere Ideen stehen in [../docs/ROADMAP.md](../docs/ROADMAP.md).