From a18ec5bbce3d51212a628e1e6cb22a12f11b1b2e Mon Sep 17 00:00:00 2001 From: patrick Date: Sun, 6 Sep 2026 23:38:17 +0200 Subject: [PATCH] fix(kontrolle): Kontrolle bucht Ist-Menge jetzt immer, nicht nur bei Abweichung MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bisher änderte eine Kontrolle Objektposition.istmenge nur indirekt über eine anschließende Nachfüllung bei Abweichung. Zählte eine Kontrolle Ist=Soll (kein Fehlbestand, keine Nachfüllung), blieb der Wert dauerhaft auf 0 stehen - ein frisch angelegtes, aber vollständig bestücktes Objekt zeigte in der Beladung nie den echten Bestand. Kontrolle setzt istmenge jetzt immer auf den gezählten Wert. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV --- backend/app/services/kontrolle/erfassung.py | 14 +++++++++----- backend/tests/test_kontrolle.py | 4 +--- backend/tests/test_mindermenge.py | 3 ++- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/backend/app/services/kontrolle/erfassung.py b/backend/app/services/kontrolle/erfassung.py index 3233598..9b542ca 100644 --- a/backend/app/services/kontrolle/erfassung.py +++ b/backend/app/services/kontrolle/erfassung.py @@ -27,11 +27,14 @@ async def erfasse_position( chargennummer: str | None = None, seriennummer: str | None = None, ) -> tuple[Kontrollposition, uuid.UUID | None]: - """Prompt 02.3/09 Vier-Kernbegriffe: Kontrolle erfasst nur, ändert nie die - persistente Objektposition.istmenge. Bei Ist < Soll entsteht automatisch ein - Fehlbestand (nie bei Überbestand, Prompt 02.4). Gibt zusätzlich die - Fehlbestand-ID zurück (falls einer aktiv ist), damit die UI direkt eine - Sofort-Nachfüllung (Karte 07) anbieten kann, ohne separat nachzufragen. + """Prompt 02.3/09: Kontrolle bucht die gezählte Menge als neuen Ist-Bestand + der Objektposition - vorher blieb dieser bei Ist=Soll unverändert (nur + Nachfüllung schrieb ihn), wodurch ein frisch angelegtes, aber vollständig + bestücktes Objekt dauerhaft auf 0 stehen blieb. Bei Ist < Soll entsteht + automatisch ein Fehlbestand (nie bei Überbestand, Prompt 02.4). Gibt + zusätzlich die Fehlbestand-ID zurück (falls einer aktiv ist), damit die UI + direkt eine Sofort-Nachfüllung (Karte 07) anbieten kann, ohne separat + nachzufragen. Ablaufdatum/Chargennummer/Seriennummer sind KEINE Kernbegriffe-Verletzung: sie beschreiben das physische Exemplar, nicht die Ist-Menge, und werden @@ -46,6 +49,7 @@ async def erfasse_position( sollmenge = sollmenge_effektiv(objektposition) if objektposition else Decimal(0) if objektposition is not None: + objektposition.istmenge = istmenge if ablaufdatum is not None: objektposition.ablaufdatum = ablaufdatum if chargennummer is not None: diff --git a/backend/tests/test_kontrolle.py b/backend/tests/test_kontrolle.py index 9ad2cae..d40d43a 100644 --- a/backend/tests/test_kontrolle.py +++ b/backend/tests/test_kontrolle.py @@ -62,9 +62,7 @@ async def test_ablauf_charge_werden_bei_erfassung_mitgepflegt(client, db_session position = result.scalar_one() assert str(position.ablaufdatum) == "2027-06-01" assert position.chargennummer == "LOT-1" - # Vier-Kernbegriffe bleiben unberührt: istmenge auf Objektposition wird von - # der Kontrolle weiterhin NICHT gesetzt (nur von Nachfüllung). - assert position.istmenge == 0 + assert position.istmenge == 10 @pytest.mark.asyncio diff --git a/backend/tests/test_mindermenge.py b/backend/tests/test_mindermenge.py index 01f201c..395b229 100644 --- a/backend/tests/test_mindermenge.py +++ b/backend/tests/test_mindermenge.py @@ -58,7 +58,8 @@ async def test_genehmigung_aendert_nichts_am_fehlbestand( ) ) ).scalar_one() - assert float(objektposition.istmenge) == 0 # unverändert (Kontrolle/Genehmigung ändern nie Ist-Menge) + # 8 = die bei der Kontrolle gezählte Menge (Genehmigung selbst ändert sie nicht weiter). + assert float(objektposition.istmenge) == 8 @pytest.mark.asyncio