Gegenstands-Verwaltung (Non-Food) neben Lebensmitteln
Die Kategorie bestimmt die Verwaltungsart (food/object). Gegenstaende: Menge je Lagerort statt Chargen/MHD, Umlagern (ohne Grund) und Entfernen mit Pflicht-Grund samt Entnahme-Statistik. Beliebig viele eigene Felder je Kategorie (vererbt an Unterkategorien), "gekauft bei" ueber eine verwaltbare Shop-Liste und ein Produktlink. Barcode-Lookup zusaetzlich ueber Open Products Facts. Der Lebensmittel-Teil (Chargen/MHD/FEFO) bleibt unveraendert. Umgesetzt in Backend (FastAPI, +Tests gruen), Web (React) und iOS (SwiftUI). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -7,12 +7,25 @@ from datetime import date
|
||||
from fastapi import HTTPException, status
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from .models import Barcode, Lot, Product
|
||||
from .models import Barcode, Category, CategoryTracking, Lot, Product
|
||||
from .schemas import BarcodeOut, ProductOut
|
||||
from .services.conversion import KIND_OF_BASE, display_unit_info
|
||||
from .services.stock import current_stock
|
||||
|
||||
|
||||
def product_tracking(db: Session, product: Product) -> str:
|
||||
"""Verwaltungsart eines Artikels: aus seiner Kategorie abgeleitet.
|
||||
|
||||
Ohne Kategorie gilt "food" – so bleibt das Verhalten bestehender
|
||||
(reiner Lebensmittel-)Installationen unverändert. Ein Artikel in einer
|
||||
Gegenstands-Kategorie wird als "object" geführt.
|
||||
"""
|
||||
if product.category_id is None:
|
||||
return CategoryTracking.food.value
|
||||
cat = product.category or db.get(Category, product.category_id)
|
||||
return cat.tracking if cat and cat.tracking else CategoryTracking.food.value
|
||||
|
||||
|
||||
def product_to_out(db: Session, product: Product) -> ProductOut:
|
||||
out = ProductOut.model_validate(product)
|
||||
out.stock = current_stock(db, product.id)
|
||||
@@ -31,6 +44,8 @@ def product_to_out(db: Session, product: Product) -> ProductOut:
|
||||
for b in db.query(Barcode).filter(Barcode.product_id == product.id).order_by(Barcode.id).all()
|
||||
]
|
||||
out.category_name = product.category.name if product.category else None
|
||||
out.tracking = CategoryTracking(product_tracking(db, product))
|
||||
out.shop_name = product.shop.name if product.shop else None
|
||||
out.kind = KIND_OF_BASE[product.base_unit].value
|
||||
name, factor = display_unit_info(product)
|
||||
out.unit_name = name
|
||||
|
||||
Reference in New Issue
Block a user