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:
103
README.md
103
README.md
@@ -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).
|
|
||||||
|
|||||||
@@ -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).
|
||||||
|
|||||||
Reference in New Issue
Block a user