Inline-Anlage (Kategorien/Felder), Artikelfoto und CSV-Spalte "art"
- Web: Kategorien/Unterkategorien und eigene Felder direkt im Artikelformular
anlegen (ohne Umweg über die Kategorien-Seite).
- Artikelfoto per Kamera oder Galerie hochladen – Backend-Endpunkt
(PUT/DELETE /products/{id}/image), Web (Foto machen / Galerie) und iOS
(Kamera + PhotosPicker, inline in der Produktansicht angezeigt).
- CSV-Import: neue Spalte "art" (Gegenstand/Lebensmittel) steuert den Modus
automatisch angelegter Kategorien; Export schreibt sie mit.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -49,8 +49,26 @@ router = APIRouter(tags=["transfer"])
|
||||
|
||||
CSV_FIELDS = [
|
||||
"barcode", "name", "marke", "einheit", "packungsgroesse", "gebinde",
|
||||
"gruppe", "kategorie", "mindestbestand", "menge", "menge_einheit", "mhd", "lagerort",
|
||||
"gruppe", "kategorie", "art", "mindestbestand", "menge", "menge_einheit", "mhd", "lagerort",
|
||||
]
|
||||
|
||||
|
||||
def _tracking_from_art(text) -> str:
|
||||
"""Spalte „art" → Verwaltungsart einer (neu angelegten) Kategorie.
|
||||
|
||||
Leer/unbekannt ⇒ Lebensmittel (bewahrt das Verhalten für zurückgespielte
|
||||
Lebensmittel-Exporte).
|
||||
"""
|
||||
t = (str(text) if text is not None else "").strip().lower()
|
||||
if t in ("gegenstand", "gegenstände", "object", "objekt", "non-food", "nonfood"):
|
||||
return CategoryTracking.object.value
|
||||
return CategoryTracking.food.value
|
||||
|
||||
|
||||
def _art_label(product: Product) -> str:
|
||||
if product.category and product.category.tracking == CategoryTracking.object.value:
|
||||
return "Gegenstand"
|
||||
return "Lebensmittel"
|
||||
PACKAGE_TOKENS = {"packung", "package", "pkg", "pack"}
|
||||
|
||||
|
||||
@@ -95,6 +113,7 @@ def export_stock_csv(
|
||||
product.package_label or "",
|
||||
product.group.name if product.group else "",
|
||||
_category_path(db, product.category),
|
||||
_art_label(product),
|
||||
product.min_stock if product.min_stock is not None else "",
|
||||
]
|
||||
lots = (
|
||||
@@ -437,7 +456,9 @@ def _get_or_create_product(db: Session, row: dict, created: list[str]) -> Produc
|
||||
if unit is None:
|
||||
raise ValueError(f"Unbekannte Einheit: {row.get('einheit')}")
|
||||
group = _get_or_create_group(db, row.get("gruppe"))
|
||||
category = _get_or_create_category(db, row.get("kategorie"))
|
||||
category = _get_or_create_category(
|
||||
db, row.get("kategorie"), tracking=_tracking_from_art(row.get("art"))
|
||||
)
|
||||
product = Product(
|
||||
barcode=barcode,
|
||||
name=name,
|
||||
|
||||
Reference in New Issue
Block a user