"""Pflegt die EAN-Codes an einer Gruppe automatisch mit. Bisher entstand ein Gruppen-Code ausschließlich von Hand. Wurde ein Artikel einer Gruppe zugeordnet, blieb dessen EAN-Code dort unsichtbar – die Gruppe zeigte „0 EANs“, obwohl Artikel darin lagen, und der Versuch, den Code nachzutragen, scheiterte mit „bereits vergeben“ (er hing ja am Artikel). Jetzt wandert der Haupt-Barcode eines Artikels automatisch an die Gruppe: * beim Anlegen und beim Zuordnen einer Gruppe → Code kommt hinzu * beim Wechsel der Gruppe → Code wandert mit * beim Entfernen der Gruppe oder Löschen des Artikels → Code verschwindet Beim Scannen ändert das nichts an der Reihenfolge: ``routers.products.lookup`` findet weiterhin zuerst den Artikel, dessen Gruppe zählt. Der Gruppen-Eintrag ist Beleg in der Verwaltung und Rückfall, falls der Artikel später verschwindet. """ from __future__ import annotations from sqlalchemy.orm import Session from ..models import Barcode, Product def _group_row(db: Session, code: str) -> Barcode | None: """Vorhandene Gruppen-Zeile zu diesem Code (nicht: Artikel-Alias).""" return ( db.query(Barcode) .filter(Barcode.code == code, Barcode.group_id.isnot(None)) .first() ) def sync(db: Session, product: Product) -> None: """Bringt den Gruppen-Code eines Artikels auf den aktuellen Stand. Deckt Anlegen, Ändern und Entfernen der Gruppe gleichermaßen ab, damit die Aufrufer sich nicht merken müssen, was vorher galt. """ code = (product.barcode or "").strip() if not code: return row = _group_row(db, code) # Keine Gruppe mehr: einen früher angelegten Eintrag wieder entfernen. if product.group_id is None: if row is not None: db.delete(row) return if row is not None: # Gruppe gewechselt: Zeile umhängen statt löschen und neu anlegen, # damit eine hinterlegte Notiz erhalten bleibt. row.group_id = product.group_id return # Hängt der Code bereits als Alias an einem Artikel, gehört er dort hin - # code ist eindeutig, eine zweite Zeile wäre nicht möglich. if db.query(Barcode).filter(Barcode.code == code).first() is not None: return db.add(Barcode(code=code, group_id=product.group_id)) def detach(db: Session, product: Product) -> None: """Vor dem Löschen eines Artikels dessen Gruppen-Code aufräumen.""" code = (product.barcode or "").strip() if not code: return row = _group_row(db, code) if row is not None: db.delete(row)