Files
Scarriffle e00eef275c Gruppen hierarchisch: in allen Auswahlfeldern und in der Artikelliste
Die Gruppen-Dropdowns waren flache, alphabetische Listen - man sah nicht, dass
"Grillwurst" unter "Wurst" haengt. Ein gemeinsamer Helfer (gruppenOptionen)
rollt den Graphen zum Baum aus und rueckt ein; eine Gruppe mit mehreren
Obergruppen erscheint unter jeder, denn genau das ist ihr Sinn, und ausgewaehlt
wird ohnehin dieselbe ID.

Eingerueckt wird mit GESCHUETZTEN Leerzeichen - normale fasst der Browser in
einem <option> zusammen, die Einrueckung waere sonst wirkungslos.

Betroffen: Gruppen-Auswahl im Artikelformular (beide Zweige), beim Einlagern,
die Ziel-Auswahl der Mindestbestaende und die Obergruppen-Mehrfachauswahl (die
beim Suchen bewusst abflacht, weil eine Einrueckung ohne die Eltern in die Irre
fuehrt). In der App dasselbe in beiden Gruppen-Pickern.

Die Gruppen-Spalte der Artikelliste zeigt jetzt den Weg von oben statt eines
Etiketts - "Wurst → Grillwurst", mit gedaempften Vorfahren wie bei der
Kategorie. Gefiltert wird ueber ALLE Wege: wer auf "Wurst" filtert, sieht auch
die Artikel aus den Untergruppen. Dafuer gibt es gruppenInfoMap als Gegenstueck
zu categoryInfoMap, das mit mehreren Wegen je Gruppe umgehen kann.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 09:59:32 +02:00
..

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)

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.