- 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>
- 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>
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>
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>
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>
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>
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>
- 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>