"""Kleine gemeinsame Helfer für Router.""" from __future__ import annotations from datetime import date from fastapi import HTTPException, status from sqlalchemy.orm import Session from .models import Lot, Product from .schemas import ProductOut from .services.conversion import KIND_OF_BASE, display_unit_info from .services.stock import current_stock def product_to_out(db: Session, product: Product) -> ProductOut: out = ProductOut.model_validate(product) out.stock = current_stock(db, product.id) out.expired_count = ( db.query(Lot) .filter( Lot.product_id == product.id, Lot.best_before.isnot(None), Lot.best_before < date.today(), Lot.quantity > 0, ) .count() ) out.kind = KIND_OF_BASE[product.base_unit].value name, factor = display_unit_info(product) out.unit_name = name out.unit_factor = factor # Mindestbestand in der Einheit anzeigen, in der er erfasst wurde. if product.min_stock is not None: if product.min_stock_in_packages and product.package_size: out.min_stock_display = product.min_stock / product.package_size out.min_stock_unit_label = "Pkg" elif product.min_stock_unit is not None: out.min_stock_display = product.min_stock / product.min_stock_unit.factor out.min_stock_unit_label = product.min_stock_unit.name else: out.min_stock_display = product.min_stock / factor out.min_stock_unit_label = name return out def resolve_product( db: Session, product_id: int | None, barcode: str | None ) -> Product: """Findet ein Produkt per ID oder Barcode; wirft 404, wenn keins passt.""" product: Product | None = None if product_id is not None: product = db.get(Product, product_id) elif barcode: product = db.query(Product).filter(Product.barcode == barcode).first() else: raise HTTPException( status.HTTP_400_BAD_REQUEST, "product_id oder barcode erforderlich" ) if product is None: raise HTTPException(status.HTTP_404_NOT_FOUND, "Produkt nicht gefunden") return product