fix(import): Mengen zusammenführen bei Mehrfach-Fach desselben Materials
Realer Fund beim ersten Import-Lauf gegen den Zielserver: vorlagenposition erlaubt nur eine Zeile pro Material+Vorlage, Excel-Listen führen aber manches Material in mehreren Fächern - UniqueViolationError. Fix: Mengen addieren, Fächer als Liste zusammenführen statt zweite Zeile einzufügen. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L85hmKbvX7Cqkq47KnQhFt
This commit is contained in:
@@ -178,16 +178,28 @@ async def importiere_datei(db: AsyncSession, datei: ImportDatei, objekttyp: Obje
|
|||||||
db.add(vorlage)
|
db.add(vorlage)
|
||||||
await db.flush()
|
await db.flush()
|
||||||
|
|
||||||
|
positionen_je_material: dict[int, Vorlagenposition] = {}
|
||||||
for zeile in datei.zeilen:
|
for zeile in datei.zeilen:
|
||||||
material = await _hole_oder_erstelle_material(db, zeile)
|
material = await _hole_oder_erstelle_material(db, zeile)
|
||||||
db.add(
|
bestehende_position = positionen_je_material.get(material.id)
|
||||||
Vorlagenposition(
|
if bestehende_position is not None:
|
||||||
vorlage_id=vorlage.id,
|
# Gleiches Material in mehreren Fächern derselben Liste (z. B. Verbandsmaterial
|
||||||
material_id=material.id,
|
# in mehreren Taschen) - Schema erlaubt nur eine Zeile pro Material+Vorlage,
|
||||||
fach=zeile.fach,
|
# daher Mengen zusammenführen statt zweite Zeile einzufügen (führt sonst zu
|
||||||
sollmenge=zeile.menge,
|
# UniqueViolationError auf vorlage_id+material_id).
|
||||||
)
|
bestehende_position.sollmenge += zeile.menge
|
||||||
|
if zeile.fach and zeile.fach not in (bestehende_position.fach or ""):
|
||||||
|
bestehende_position.fach = f"{bestehende_position.fach}, {zeile.fach}" if bestehende_position.fach else zeile.fach
|
||||||
|
continue
|
||||||
|
|
||||||
|
position = Vorlagenposition(
|
||||||
|
vorlage_id=vorlage.id,
|
||||||
|
material_id=material.id,
|
||||||
|
fach=zeile.fach,
|
||||||
|
sollmenge=zeile.menge,
|
||||||
)
|
)
|
||||||
|
db.add(position)
|
||||||
|
positionen_je_material[material.id] = position
|
||||||
return vorlage
|
return vorlage
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -126,6 +126,7 @@ Grundlage: die drei bestehenden Listen im Repo (`Handball Rucksack.xlsx`, `Rettu
|
|||||||
- Uneindeutige/fehlende Artikelnummern in den Quell-Listen (falls vorhanden) verhindern automatischen Abgleich – in diesen Fällen manuelle Zuordnung beim Import nötig.
|
- Uneindeutige/fehlende Artikelnummern in den Quell-Listen (falls vorhanden) verhindern automatischen Abgleich – in diesen Fällen manuelle Zuordnung beim Import nötig.
|
||||||
- Import-Skript selbst ist Code (Prompt-19-Deployment-Regel gilt: bei Umsetzung nur Skript-Datei erzeugen, Ausführung gegen Test-DB erst auf Zielsystem/Test-Deployment, nicht lokal).
|
- Import-Skript selbst ist Code (Prompt-19-Deployment-Regel gilt: bei Umsetzung nur Skript-Datei erzeugen, Ausführung gegen Test-DB erst auf Zielsystem/Test-Deployment, nicht lokal).
|
||||||
- Spalte D ist in den xlsx-Rohdaten teils als Datum formatiert (Excel-Zellformat, nicht Inhalt) - Werte wie 12754 sind aber kein plausibles Datum (Jahr ~1934), Mapping D=Artikelnummer bleibt daher wie oben bestätigt. Skript (`backend/scripts/import_excel.py`) liest den Rohwert unabhängig vom Zellformat.
|
- Spalte D ist in den xlsx-Rohdaten teils als Datum formatiert (Excel-Zellformat, nicht Inhalt) - Werte wie 12754 sind aber kein plausibles Datum (Jahr ~1934), Mapping D=Artikelnummer bleibt daher wie oben bestätigt. Skript (`backend/scripts/import_excel.py`) liest den Rohwert unabhängig vom Zellformat.
|
||||||
|
- Gleiches Material kommt in einer Liste teils in mehreren Fächern vor (z. B. Verbandsmaterial in mehreren Taschen) - da `vorlagenposition` nur eine Zeile pro Material+Vorlage zulässt (Prompt 20-Schema), führt das Importskript solche Duplikate zusammen (Mengen addiert, Fächer als Liste), erste Erkenntnis erst beim echten Import-Lauf gegen den Zielserver, nicht vorher erkannt.
|
||||||
|
|
||||||
## Regeln übergreifend
|
## Regeln übergreifend
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user