Commit Graph
35 Commits
Author SHA1 Message Date
ScarriffleandClaude Opus 4.8 546a6bfc90 Tabellen bleiben Tabellen; Karten erst auf schmalen Bildschirmen
Uebersicht, Einheiten und Kategorien zeigten am Rechner die Karten-Ansicht
(Beschriftung links, Wert daneben), weil die Umschaltgrenze bei 700px lag und
neben diesen Bloecken noch etwas steht. Drei bis vier Spalten passen dort aber
locker nebeneinander.

- Grenze auf 480px gesenkt: Karten praktisch nur noch am Handy hochkant.
- .table-wrap faengt Zwischengroessen mit waagerechtem Scrollen ab, statt
  Inhalte abzuschneiden.
- Tooltip-Beschriftung ohne Fragezeichen-Cursor.

Geprueft: "npm run build" laeuft durch.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 08:07:28 +02:00
ScarriffleandClaude Opus 4.8 e4e22c7822 Karten-Darstellung der Tabellen entzerrt, Erklaerungen als Tooltip
Tabellen (Uebersicht, Einheiten, Kategorien):
Wird der Container schmal, stellen sich Tabellen auf Karten um. Dort trennte
"space-between" Beschriftung und Wert an die beiden Zeilenenden - der Wert stand
weit rechts und wirkte durch die unterschiedlichen Zeilenhoehen nicht auf einer
Linie. Jetzt zwei feste Spalten (Beschriftung, Wert direkt daneben) mit
Ausrichtung an der Schriftlinie. Zahlenspalten stehen in der Karte linksbuendig.

Artikelseite:
Die Erklaerungen unter "MHD-Angabe", "Gruppe" und "Kategorie" standen dauerhaft
im Formular und machten es lang. Sie haengen jetzt als Tooltip an der
Beschriftung; eine gepunktete Linie zeigt an, dass dort eine Erklaerung steht.
(Kategorie hatte denselben Text-Block - der Einheitlichkeit halber mit
umgestellt.)

Geprueft: "npm run build" laeuft durch.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 07:59:52 +02:00
ScarriffleandClaude Opus 4.8 32d49b47bd Tabellen entzerrt, EAN-Codes mit Marke und Artikelname, Codes-Block nach unten
EAN-Codes:
- Das Kennzeichen "Artikel" ist weg; stattdessen stehen Marke und Artikelname
  zusammen ("Zweifel - Moutarde Original Chips"). Die Marke allein reichte nicht,
  um einen Code wiederzuerkennen. Hinweistext entsprechend angepasst.

Produktseite:
- "Weitere EAN-Codes" steht jetzt unterhalb von Formular und Chargen statt als
  dritte Spalte dazwischen. Die Codes braucht man selten und sie schoben die
  beiden wichtigen Bloecke auseinander.

Tabellen:
- "overflow-wrap: anywhere" galt fuer ALLE Zellen und zerriss Woerter mitten
  drin ("PROD UKTE", "555 Gram m"). Jetzt nur noch gezielt per Klasse.
- Kopfzeilen und Zahl-plus-Einheit brechen nicht mehr um.
- Eingaben in Tabellen sind kompakter (kleinere Polsterung, Zahlenfelder 8ch),
  Auswahlfelder richten sich nach ihrem Text statt 132px Mindestbreite -
  dadurch sind die Zeilen deutlich schlanker.
- Kennzeichen wie "niedrig" oder "abgelaufen" sitzen ueber .cell-row in einer
  Zeile mit dem Wert und rutschen nicht mehr je nach Zeilenhoehe herum.

Geprueft: "npm run build" laeuft durch. Backend unveraendert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-23 07:50:42 +02:00
ScarriffleandClaude Opus 4.8 faa9d6a25d Langlebige API-Tokens fuer externe Zugriffe (Home Assistant)
Die Einkaufsliste war ueber /shopping-list und /shopping-list/groups schon
abrufbar, aber nur mit einem Login-JWT, das nach 7 Tagen ablaeuft - fuer HA
unpraktisch.

- Neue Tabelle api_tokens (Name, SHA-256-Hash, Ersteller, zuletzt genutzt).
  Der Klartext wird nur einmal beim Anlegen zurueckgegeben.
- get_current_user akzeptiert jetzt JWT ODER API-Token im Authorization-Header;
  bei Nutzung wird last_used_at fortgeschrieben.
- Endpunkte /api-tokens (Admin): auflisten, erzeugen, widerrufen.
- Einstellungsseite: Tokens verwalten inkl. einmaliger Anzeige und einem
  aufklappbaren Konfigurationsbeispiel fuer Home Assistant.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 16:36:17 +02:00
ScarriffleandClaude Opus 4.8 93e487a1b0 Datumsformat konfigurierbar (Einstellungen -> Darstellung)
MHD wurde in den Ansichten noch roh als YYYY-MM-DD ausgegeben. Jetzt:
- Neue Einstellung date_format (23.12.2026 | 23.12.26 | 23. Dezember 2026 |
  2026-12-23 | 12/23/2026) mit Live-Beispiel auf der Einstellungsseite.
- SettingsProvider stellt Format und formatDate() app-weit bereit und laedt die
  Einstellungen nach dem Login.
- Verwendet in Uebersicht (bald ablaufend), Produktdetail (Chargen) und
  Auslagern (Chargenauswahl). Datumsfelder zur Eingabe bleiben ISO, wie es das
  HTML-Datumsfeld verlangt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 15:04:01 +02:00
ScarriffleandClaude Opus 4.8 4bb9a10366 iOS-App angefangen; Import-Modi; MHD-Formatierung; Gebinde in Ablauf-Ansichten
iOS (neu, ios/):
- SwiftUI-App: Login (Server + Keychain-Token), Kamera-Scanner (EAN/UPC/Code128),
  Einlagern mit mehreren Chargen und eigenem MHD, Auslagern mit Chargenauswahl
  oder FEFO, Artikelsuche, Anlegen mit Open-Food-Facts-Vorbefuellung.
- Home-Screen-Shortcuts: Schnellaktionen (langer Druck) und URL-Schema
  projectgood://checkin | ://checkout fuer eigene Symbole via Kurzbefehle.
- project.yml (XcodeGen) + README mit Build-Anleitung. NICHT kompiliert - auf
  diesem Rechner ist kein Xcode vorhanden.

Import-Modi (wie besprochen sinnvoll):
- add (Standard, nichts loeschen), replace_listed (Bestaende der in der Datei
  genannten Produkte ersetzen - fuer Inventur), replace_all (alles ersetzen).
  Geleerte Bestaende werden als Korrektur-Bewegung protokolliert; die Oberflaeche
  fragt bei den zerstoerenden Modi nach.

Anzeige:
- "Bald ablaufend"/"Abgelaufen" zeigen jetzt das Gebinde ("1 Glas") mit der
  Basiseinheit klein darunter (ExpiringItem liefert die Einheiten mit).
- MHD als Zeitspanne mit korrektem Numerus: "in 3 Tagen", "in 1 Woche",
  "vor 2 Wochen", dazu heute/morgen/gestern.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 14:59:04 +02:00
ScarriffleandClaude Opus 4.8 de6c8632a1 Mehrere EAN-Codes je Produkt und je Gruppe (mit Notiz) + Gruppen umbenennen
Barcodes:
- Neue Tabelle barcodes (code, note, product_id ODER group_id). Damit lassen sich
  einem Produkt mehrere Codes geben und einer Gruppe beliebig viele Marken
  zuordnen (z.B. alle Mehlmarken zu "Mehl"). Je Code eine Notiz wie
  "Mehl bei Aldi".
- Lookup loest jetzt auch Alias-Codes auf; ist ein Code einer Gruppe zugeordnet,
  liefert die API group_id/group_name zurueck. Beim Anlegen aus einem Scan wird
  diese Gruppe automatisch gesetzt (Vorrang vor dem Kategorie-Rateversuch).
- Endpunkte: POST/DELETE /products/{id}/barcodes und /groups/{id}/barcodes.
- Web: wiederverwendbare BarcodeList-Komponente, eingebunden im Produktformular
  und auf der Gruppen-Seite.

Gruppen:
- Namen lassen sich jetzt direkt in der Tabelle aendern (PATCH war vorhanden,
  nur die Oberflaeche fehlte).

UI-Fix: Auswahlfelder in Tabellen richten sich nach ihrem Text statt nach der
Zellenbreite (Gruppen-/Benutzer-Dropdowns waren abgeschnitten).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 14:48:14 +02:00
ScarriffleandClaude Opus 4.8 8079d2d3f0 Import/Export von Bestaenden (CSV + JSON), rein additiv
Export:
- GET /export/stock.csv  - eine Zeile je Charge, Semikolon-getrennt mit BOM,
  direkt in Excel/LibreOffice bearbeitbar; Mengen in der Artikeleinheit.
- GET /export/backup.json - vollstaendiges Backup (Einheiten, Gruppen,
  Lagerorte, Produkte, Chargen), Referenzen ueber Namen statt IDs.

Import:
- POST /import/stock (Admin, Datei-Upload). Erkennt CSV oder JSON automatisch.
  Arbeitet ausschliesslich additiv: unbekannte Produkte/Gruppen/Lagerorte/
  Einheiten werden angelegt, Chargen ergaenzt - nichts wird geloescht.
  Mengen koennen in Gebinde ("Glas") oder Einheiten ("Gramm") angegeben werden,
  Datum als YYYY-MM-DD oder TT.MM.JJJJ. Fehlerhafte Zeilen werden uebersprungen
  und im Ergebnis gemeldet; jeder Import wird als Bewegung protokolliert.

Frontend: neue Seite "Import / Export" (Verwaltung) mit Download-Buttons,
Datei-Upload, Ergebniszusammenfassung und einer Beschreibung der CSV-Spalten.
api.js kann jetzt Datei-Downloads mit Auth-Header und FormData-Uploads.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 14:17:03 +02:00
ScarriffleandClaude Opus 4.8 2f1be8e2dd Verlauf zeigt Mengen in Artikeleinheiten (Gebinde) statt nur Basiseinheit
MovementOut liefert jetzt package_size, package_label sowie Name/Faktor der
Anzeigeeinheit mit. Die Verlauf-Tabelle zeigt die Bewegung als Leitangabe in
Gebinden (z.B. "1 Glas") und darunter klein die Basiseinheit ("195 g").
Ohne Gebinde/abweichende Einheit bleibt es bei einer Zeile.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 13:58:50 +02:00
ScarriffleandClaude Opus 4.8 0bc141a1be Ein-/Auslagern nutzt die Artikeleinheit (Gebinde) statt fest "Packung"
- buildUnitOptions verwendet product.package_label als Beschriftung der
  Gebinde-Option (Wert bleibt intern "package").
- Beim Auswaehlen eines Artikels ist das Gebinde vorbelegt, wenn eine
  Packungsgroesse hinterlegt ist.
- Auslagern: Chargen-Dropdown und Hinweis zeigen die Menge in der Artikeleinheit
  (z.B. "MHD 2026-12-23 - 1 Glas") statt in der Basiseinheit.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 13:46:14 +02:00
ScarriffleandClaude Opus 4.8 e67bdb32c4 Gebinde-Bezeichnung als normales Dropdown (statt Textfeld mit datalist)
Das datalist-Eingabefeld sah anders aus als die uebrigen Auswahlfelder im
Produktformular. Jetzt ein einheitliches <select>: leerer Standardwert
"Packung (Standard)" plus gaengige Bezeichnungen (Glas, Tuete, Flasche, Dose,
Tube, Becher, Beutel, Karton, Riegel, Rolle). Ein bereits gespeicherter
abweichender Wert bleibt als Option erhalten.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 13:43:00 +02:00
ScarriffleandClaude Opus 4.8 3884919a4c Gebinde-Bezeichnung je Produkt + Spalte "Einheiten (ist / soll)"
- Neues Feld products.package_label: pro Artikel einstellbar, wie das Gebinde
  heisst (Packung, Glas, Tuete, Flasche, Dose, Tube, ...) - Eingabe mit
  Vorschlagsliste, frei ueberschreibbar. Migration per ADD COLUMN IF NOT EXISTS.
- Produkttabelle: Spalte "Packungen" heisst jetzt "Einheiten (ist / soll)" und
  zeigt Bestand und Mindestbestand als "11 / 12 Glas"; die separate Spalte
  "Mindest" entfaellt. Das "niedrig"-Badge sitzt jetzt dort.
- Die Bezeichnung wird ueberall verwendet (Chargenanzeige, Einheiten-Umschalter
  beim Bearbeiten, Mindestbestand-Auswahl, Umrechnungshinweis).
- Speichern/Abbrechen im Chargen-Editor sind jetzt gleich breit (.btn-pair).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 13:39:44 +02:00
ScarriffleandClaude Opus 4.8 c065b8879d Fix zu schmale Eingabefelder in Inline-Reihen
Eingaben haben global width:100% und schrumpften im Flex-Layout zusammen
(Mindestbestand-Einheit abgeschnitten, Chargen-Bearbeitung winzig).
- .field-inline: Zahlenfelder wachsen (min 78px), Einheiten-Dropdowns behalten
  ihre Textbreite (min 132px).
- In Tabellenzellen brechen die Felder bei wenig Platz um statt zu quetschen.
- Einengende Inline-maxWidth entfernt; Menge-/MHD-Spalte mit Mindestbreite.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 13:14:57 +02:00
ScarriffleandClaude Opus 4.8 e901e456c1 Chargen: Packungen als Leitangabe, Produkteinheit klein darunter
Anzeige getauscht - oben gross die Packungszahl, darunter klein die Menge in der
Produkteinheit (z.B. "10 Pkg" / "1.945 Gramm"). Ohne Packungsgroesse bleibt die
Produkteinheit die Leitangabe. Das Bearbeiten startet passend in Packungen; per
Umschalter laesst sich weiterhin in der Produkteinheit eingeben.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 13:10:36 +02:00
ScarriffleandClaude Opus 4.8 07f1232d6b Chargen bearbeiten: Einheit waehlbar (Produkteinheit oder Packungen), Texte entschlackt
- Beim Bearbeiten einer Charge steht neben dem Mengenfeld ein Umschalter
  (z.B. Gramm <-> Packung(en)); der Wert wird beim Wechsel umgerechnet und beim
  Speichern korrekt in die Basiseinheit zurueckgerechnet.
- Umstaendlicher Hinweistext unter der Mindestmenge entfernt.
- Redundanter Fusstext unter den Chargen ("Mengen in ...") entfernt; es bleibt
  nur die knappe Umrechnung "1 Packung = 195 g".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 13:08:29 +02:00
ScarriffleandClaude Opus 4.8 2b1b28fdfe Update-Skript deploy/update.sh ergaenzt
Holt den neuesten Stand aus Git und baut die Container neu. Findet seinen
eigenen Pfad (von ueberall aufrufbar), nutzt die vorhandene deploy/.env,
erkennt docker compose v1/v2 und prueft am Ende /api/health.
Optionen: --prune (alte Images aufraeumen), --no-pull (nur neu bauen).
Bei fehlgeschlagenem git pull gibt es einen Hinweis auf lokale Aenderungen.
Im Repo direkt als ausfuehrbar markiert; README ergaenzt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 13:01:25 +02:00
ScarriffleandClaude Opus 4.8 4981418b97 Einheiten-Auswahl verstaendlicher: Gruppierung nach Art + Hinweis beim Mindestbestand
Die Produkt-Einheit bietet bewusst alle Einheiten an (sie legt die Art fest),
der Mindestbestand nur die passender Art. Das sah nach einem Fehler aus, war aber
gewollt - jetzt sichtbar gemacht:
- Produkt-Einheit nach Anzahl/Gewicht/Volumen gruppiert (optgroup).
- Mindestbestand mit Hinweistext auf die Art und "Packung(en) a <Groesse>".
- baseShort wird aus der gewaehlten Einheit abgeleitet (funktioniert auch bei
  neuen Produkten).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 12:58:18 +02:00
ScarriffleandClaude Opus 4.8 0d55d1f8d9 Mindestbestand in jeder angelegten Einheit erfassbar (und gemerkt)
- Produktformular: Auswahl aller verwalteten Einheiten passender Art (plus
  Packungen), inkl. Umrechnung beim Wechsel.
- Die gewaehlte Erfassungseinheit wird gespeichert (products.min_stock_unit_id /
  min_stock_in_packages) und exakt so wieder angezeigt - vorher wurde sie aus der
  Produkteinheit abgeleitet.
- ProductOut liefert min_stock_display + min_stock_unit_label; Produkttabelle
  zeigt den Mindestbestand damit in der erfassten Einheit mit Einheit dahinter.
- Migration: ADD COLUMN IF NOT EXISTS fuer die zwei neuen Spalten.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 12:54:47 +02:00
ScarriffleandClaude Opus 4.8 44e7c2ef90 Chargen: festgelegte Produkteinheit ist massgeblich (nicht die Packung)
Korrektur zum vorigen Commit: Anzeige und Bearbeitung der Chargen richten sich
nach der im Produkt eingestellten Einheit. Als Untermenge stehen darunter die
Basiseinheit (falls abweichend) und die Packungen (falls Packungsgroesse gesetzt).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 12:52:01 +02:00
ScarriffleandClaude Opus 4.8 82c1aacc55 Chargen: Packung als massgebliche Einheit, Basiseinheit als Untermenge
Ist eine Packungsgroesse hinterlegt, sind Anzeige UND Bearbeitung der Chargen in
Packungen; die Basiseinheit (z.B. Gramm) steht nur noch als Untermenge darunter.
Ohne Packungsgroesse bleibt die Produkteinheit massgeblich. Produktkopf nennt
ebenfalls zuerst die Packungen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 12:50:28 +02:00
ScarriffleandClaude Opus 4.8 7a4258a238 Chargen: Anzeige und Bearbeitung in derselben Einheit + Zweitangabe
- Chargen werden in der Produkteinheit angezeigt, darunter die Zweitangabe
  (Basiseinheit falls abweichend und/oder Packungen).
- Bearbeiten laeuft jetzt ebenfalls in der Produkteinheit (mit Einheit neben dem
  Feld) und rechnet beim Speichern in die Basiseinheit um - vorher zeigte die
  Bearbeitung einen anderen Wert als die Anzeige.
- Produktkopf zeigt den Bestand zusaetzlich in Packungen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 12:44:30 +02:00
ScarriffleandClaude Opus 4.8 6960f9e28d UI-Feinschliff: Button-Ausrichtung in Inline-Reihen + Einheit beim Mindestbestand
- .field-inline: Labels ohne eigenen margin-bottom, sonst rutschen daneben
  stehende Buttons (z.B. "Nachschlagen") optisch nach unten. Abstand traegt jetzt
  die Reihe selbst; verschachtelt in Label/Tabellenzelle bleibt er aus.
- Produkttabelle: Mindestbestand wird in der Produkteinheit mit nachgestellter
  Einheit angezeigt (zusaetzlich der Packungswert, falls Packungsgroesse gesetzt).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 12:41:54 +02:00
ScarriffleandClaude Opus 4.8 0310cdfbd6 Verwaltbare Einheiten mit Umrechnung + Chargen bearbeiten + gezieltes Auslagern
Einheiten (neu):
- Tabelle units (name, kind=count|weight|volume, factor, is_builtin); eingebaut
  Stueck/Gramm/Kilogramm/Milliliter/Liter, Admin kann eigene anlegen (z.B. Pfund=500g).
- Bestaende bleiben intern in kanonischer Basis (Stueck/Gramm/Milliliter);
  Product.display_unit_id und Group.min_stock_unit_id als nullable FKs.
- Neuer Umrechnungs-Service (services/conversion.py) ersetzt die feste Einheitenlogik;
  Ein-/Auslagern und Gruppen-Mindestbestand rechnen ueber den Faktor.
- Gruppen-Mindestbestand mit Einheit; Gruppenbestand summiert nur Produkte
  passender Art. Neue Verwaltungsseite "Einheiten" (Admin).
- Schonende Migration beim Start: ADD COLUMN IF NOT EXISTS (Postgres), damit
  bestehende Installationen ihre Daten behalten.

Chargen:
- PATCH /lots/{id} und DELETE /lots/{id}: Menge/MHD korrigieren, Charge loeschen
  (wird als Korrektur-Bewegung protokolliert). Bearbeitung im Produktdetail.

Auslagern:
- Optionales lot_id: gezielt aus einer bestimmten Charge/MHD abbuchen statt FEFO;
  Auswahl-Dropdown in der Auslagern-Seite.

Sonstiges: Roadmap aktualisiert, Tests fuer die Umrechnung.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 12:33:14 +02:00
ScarriffleandClaude Opus 4.8 d4e7ff8e3d Ablauf-Warnungen + Packungen-Spalte + Farbcodierung
- Backend: ProductOut.expired_count (Anzahl abgelaufener Chargen je Produkt).
- Einlagern: Inline-Warnung pro Charge, wenn MHD in der Vergangenheit liegt.
- Produkte-Liste: Badge "N abgelaufen"; neue Spalte "Packungen" (Bestand/Packungsgroesse,
  bei Stueck-Produkten = Bestand).
- Produktdetail: abgelaufene Chargen rot, Warnfrist gelb (Warnfrist aus Settings),
  Warnbanner bei abgelaufenem Bestand.
- Uebersicht: alle Ablaufzeilen gelb, abgelaufene rot; deutlicher Warnbanner.
- units.js: daysUntil/isExpired/expiryRowClass/amountText.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 11:21:14 +02:00
ScarriffleandClaude Opus 4.8 a3dbb971f7 Fix Einkaufsliste: Mindestbestand in Packungen angebbar (Einheiten-Missverstaendnis)
Problem: min_stock wird in Basiseinheiten verglichen. Bei einem 190g-Glas (base
gram, package 190) bedeutete "min 2" 2 Gramm statt 2 Glaeser -> Produkt tauchte
nie auf der Einkaufsliste auf.

Fix:
- Produktformular: Mindestbestand wahlweise in Basiseinheit ODER Packungen
  eingebbar (mit Umrechnung); Default Packungen bei Packungsprodukten.
- ShoppingItem liefert package_size; Einkaufsliste/Dashboard zeigen Bedarf in
  Packungen (+ Basiseinheit in Klammern) via amountText().

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 10:55:34 +02:00
ScarriffleandClaude Opus 4.8 4c17705290 Einlagern-UX: 3-Wege-Barcode, Inline-Anlage aus OFF, Mehr-Chargen mit MHD
Einlagern:
- Barcode-Erkennung dreiteilig: bekannt -> direkt Menge; unbekannt aber in OFF
  -> "Anlegen & einlagern" inline; gar nicht gefunden -> manuell anlegen.
- Mehrere Chargen pro Vorgang: je Zeile eigene Menge + eigenes MHD
  (z.B. 5 Glaeser mit unterschiedlichen Daten). Neuer Endpoint /stock/checkin/batch.

Produkte/OFF:
- OFF-Fuellmenge (quantity) wird in Basiseinheit + Packungsgroesse geparst
  (kg->g, l->ml, cl/dl); parse_quantity + Tests.
- Produktformular uebernimmt Barcode aus ?barcode= und schlaegt automatisch nach,
  fuellt Packungsgroesse; gemeinsame offUtils (guessGroup/suggestionToProduct).

Lagerorte:
- Baum jetzt rekursiv ueber beliebig viele Ebenen (Schrank->Fach->Kiste->...).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 10:40:54 +02:00
ScarriffleandClaude Opus 4.8 b683f2d93b Web-UI: professionelles Redesign (Icons statt Emojis) + neue Features
Design:
- Neues Icon-Set (Inline-SVG, Feather-Stil), keine Emojis mehr
- Kohaerentes Design-System (Sidebar-Layout, Palette, Spacing, Light/Dark)
- Alle Seiten ueberarbeitet (Login, Dashboard, Produkte, Formular, Ein-/Auslagern,
  Lagerorte, Benutzer, Einkaufsliste)

Neue Features:
- Gruppen-Verwaltung (anlegen/bearbeiten/loeschen, Produktzahl + Bestand,
  Gruppen-Mindestbestand) inkl. Einkaufsliste
- Einfache Gruppen-Auto-Zuordnung aus OFF-Kategorie im Produktformular
- Verlauf-Seite (Bewegungen: wer/was/wann) via neuem /movements-Endpoint
- Einstellungen-Seite (Ablauf-Warnfrist)
- Lagerorte mit optional uebergeordnetem Ort (verschachtelbar)

Backend:
- groups: PATCH + Anreicherung (product_count, stock)
- views: /shopping-list/groups, /movements
- schemas: GroupUpdate, GroupShoppingItem, MovementOut

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 10:18:30 +02:00
ScarriffleandClaude Opus 4.8 9d4fd030d8 Fix Barcode-Lookup: Open Food Facts v0-API statt v2
Die v2-API liefert kein status:1-Feld (nur code+product) und antwortet mit
HTTP 404 bei Nicht-Treffern; unser Code prueft aber auf status==1 -> selbst
vorhandene Produkte wurden als "unbekannt" gemeldet. Umstellung auf die v0-API
(status 1/0, HTTP 200), plus robustes JSON-Parsing und follow_redirects.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 09:52:14 +02:00
ScarriffleandClaude Opus 4.8 12823a6d73 Backend: python-multipart ergaenzen (Fix fuer Startup-Crash)
Der Login-Endpunkt nutzt OAuth2PasswordRequestForm (Form-Data); FastAPI
benoetigt dafuer python-multipart. Fehlte in requirements.txt -> RuntimeError
beim Import von auth.py -> Backend-Restart-Loop -> 502.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 09:46:06 +02:00
ScarriffleandClaude Opus 4.8 025cb5b0f6 install.sh im Repo als ausfuehrbar markieren (100755)
Verhindert, dass 'chmod +x install.sh' lokal als Aenderung erscheint und
kuenftige 'git pull' mit "local changes would be overwritten" blockiert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 09:41:00 +02:00
ScarriffleandClaude Opus 4.8 022a6d5ea8 Backend: passlib entfernt, bcrypt direkt nutzen (Fix fuer Startup-Crash/Restart-Loop)
passlib 1.7.4 vertraegt sich schlecht mit bcrypt 4.x und kann beim Hashen des
Admin-Passworts im Startup (ensure_first_admin) crashen -> Backend-Container in
Restart-Loop -> 502 in der Web-UI. hash_password/verify_password nutzen jetzt
bcrypt direkt (mit 72-Byte-Grenze). passlib aus requirements entfernt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 09:39:36 +02:00
ScarriffleandClaude Opus 4.8 f0f652ddbe Installer: .env-Hinweis + Beispiel-.env + Backend-Health-Check; freundlichere API-Fehler
- install.sh: ensure_example legt .env.example an falls fehlend; env_hint weist
  klar auf die anpassbare .env hin; wait_for_backend pollt /api/health und meldet
  502-Ursachen mit Log-Hinweis.
- web/api.js: HTML-Fehlerseiten (z.B. nginx 502) nicht mehr roh anzeigen,
  stattdessen verständliche Meldung.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 09:35:14 +02:00
ScarriffleandClaude Opus 4.8 575dd1a354 install.sh: curl bei Bedarf automatisch installieren
Neue Helfer ensure_curl + pkg_install (apt/dnf/yum/apk/pacman/zypper) mit
sudo-Erkennung; wird vor der Docker-Installation aufgerufen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 09:28:22 +02:00
ScarriffleandClaude Opus 4.8 ea67e6c1b0 Umbenennung Pantry -> Project-Good; README mit echter Clone-URL
- Anzeigename, Paketname, Token-Key, DB-/Volume-Namen auf project_good
- README Clone-Abschnitt mit git.scarriffle.com/Scarriffle/project-good

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 09:24:54 +02:00
ScarriffleandClaude Opus 4.8 639126468f Schritt 1: Fundament der Lebensmittel-Lagerverwaltung (Pantry)
Backend (FastAPI + PostgreSQL): Chargen mit MHD, FEFO-Auslagern,
Einheiten-Umrechnung (Stueck/g/ml + Packungen), Open-Food-Facts-Lookup
mit lokalem Fallback, JWT-Auth mit Rollen (Admin/Nutzer), erster Admin
beim Setup, Einkaufsliste, Ablaufwarnung, Lagerorte, pytest fuer FEFO.

Web-UI (React/Vite): Login, Dashboard, Ein-/Auslagern, Produkte,
Lagerorte, Benutzerverwaltung, Einkaufsliste - rollenabhaengig.

Deploy: docker-compose + install.sh (Docker-Autoinstall, Secrets),
README und Roadmap fuer Schritt 2 (iOS) und Schritt 3.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 09:14:14 +02:00