# Vorrania – iOS-App Native SwiftUI-App für Lebensmittel **und** Gegenstände. Sie spricht dieselbe REST-API wie die Web-Oberfläche. > **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 ### Variante A – mit XcodeGen (empfohlen) ```bash brew install xcodegen cd ios xcodegen generate open Vorrania.xcodeproj ``` `project.yml` beschreibt das Projekt vollständig (Bundle-ID, Info.plist, Shortcuts, URL-Schema). ### Variante B – ohne XcodeGen 1. Xcode → *File ▸ New ▸ Project…* → **App**, Interface **SwiftUI**, Sprache **Swift** 2. Produktname `Vorrania`, Bundle-ID z. B. `com.scarriffle.vorrania` 3. Die von Xcode erzeugte `ContentView.swift` und `…App.swift` löschen 4. Den Ordner `Sources/` per Drag & Drop ins Projekt ziehen („Copy items if needed") 5. In den Target-Einstellungen die mitgelieferte `Sources/Info.plist` als Info.plist setzen (*Build Settings ▸ Info.plist File*) und *Generate Info.plist File* auf **No** stellen ## Auf dem iPhone installieren 1. iPhone per Kabel verbinden, in Xcode als Ziel auswählen 2. *Signing & Capabilities* → dein Apple-Developer-Team wählen 3. ▶︎ Run. Beim ersten Start auf dem iPhone unter *Einstellungen ▸ Allgemein ▸ VPN & Geräteverwaltung* dem Entwickler vertrauen ## Erste Schritte in der App Beim Start nach der Server-Adresse fragen lassen, z. B. `http://192.168.1.50:8080` (dieselbe Adresse wie im Browser), dann mit deinem Benutzer anmelden. Adresse und Token bleiben gespeichert – das Token liegt im Keychain. ## Home-Screen-Shortcuts Es gibt zwei Wege direkt in den Scan-Bildschirm: **Schnellaktionen** – langer Druck auf das App-Symbol zeigt „Einlagern" und „Auslagern" (funktioniert ohne weitere Einrichtung). **Eigene Symbole auf dem Home-Bildschirm** – über die Apple-App *Kurzbefehle*: 1. Kurzbefehle ▸ **+** ▸ Aktion *URL öffnen* 2. URL `vorrania://checkin` (bzw. `vorrania://checkout`) eintragen 3. Kurzbefehl benennen, dann ▸ *Zum Home-Bildschirm hinzufügen* Beide Wege öffnen die App **direkt in der Kamera**. ## Aufbau der Quellen | Datei | Inhalt | |---|---| | `VorraniaApp.swift` | App-Einstieg, Schnellaktionen, URL-Schema | | `Session.swift` | Server-Adresse (UserDefaults) und Token (Keychain) | | `APIClient.swift` | REST-Aufrufe gegen `/api/...` | | `Models.swift` | Codable-Typen passend zu `backend/app/schemas.py` | | `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 → Charge (MHD), Menge je Lagerort oder Einzelstück | | `CheckOutView.swift` | Scan → Menge, Chargenauswahl oder FEFO | | `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 | ## Gruppe und Kategorie – zwei verschiedene Dinge **Gruppe** dient der *Bestandsrechnung*: Mehl von Rewe, Aldi und Migros zählen zusammen, wichtig ist „ich habe 5 kg Mehl“. Eine Gruppe hat deshalb einen gemeinsamen Mindestbestand mit Einheit und EAN-Codes. Ordnest du einen Artikel einer Gruppe zu, erscheint sein EAN-Code automatisch dort; wechselt er die Gruppe, wandert der Code mit. **Kategorie** dient *allein dem Überblick* („Süßwaren“, „Molkereiprodukte“) und ist verschachtelbar wie ein Lagerort (Süßwaren → Schokolade). Sie hat keinen 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. ## Weiteres Push-Benachrichtigungen bei Ablauf und Lagerort je Charge beim Einlagern sind umgesetzt. Weitere Ideen stehen in [../docs/ROADMAP.md](../docs/ROADMAP.md).