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