From a0979a078070fb34c5ac636a367e70a896cb906a Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Wed, 29 Jul 2026 14:47:18 +0200 Subject: [PATCH] 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 --- README.md | 103 ++++++++++++++++++++++++++++++++++---------------- ios/README.md | 35 ++++++++++------- 2 files changed, 92 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 1641bfe..5db403e 100644 --- a/README.md +++ b/README.md @@ -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 | -| Web-UI | React · Vite (via nginx ausgeliefert)| -| iOS | SwiftUI (Schritt 2) | -| Deploy | Docker Compose · `install.sh` | +| Teil | Technik | +|---------|----------------------------------------| +| Backend | Python · FastAPI · SQLAlchemy | +| DB | PostgreSQL (SQLite für Tests/lokal) | +| Web-UI | React · Vite (via nginx ausgeliefert) | +| 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://:8080` (Port konfigurierbar) - Anmeldung mit dem im Installer angezeigten Admin-Benutzer/Passwort. +Die iOS-App wird mit derselben Adresse verbunden (`http://: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). diff --git a/ios/README.md b/ios/README.md index 26bf6f3..8448f3c 100644 --- a/ios/README.md +++ b/ios/README.md @@ -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).