feat(warehouse): WH-005 Umlagerung zwischen Lagerplätzen
Atomare Aus+Ein-Buchung in einer Materialbewegung-Zeile statt zwei Einzelschritten. NOTIF-001 war bereits produktiv umgesetzt, Backlog war nur veraltet - korrigiert. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
This commit is contained in:
@@ -42,6 +42,51 @@ async def einlagern(
|
||||
return bewegung
|
||||
|
||||
|
||||
class GleicherLagerplatzError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
async def umlagern(
|
||||
db: AsyncSession,
|
||||
*,
|
||||
von_lagerplatz_id: int,
|
||||
nach_lagerplatz_id: int,
|
||||
material_id: int,
|
||||
menge: Decimal,
|
||||
benutzer_id: int,
|
||||
grund: str | None,
|
||||
) -> Materialbewegung:
|
||||
"""WH-005: Aus- und Einlagerung atomar in einer Transaktion (get_db committet
|
||||
erst nach Request-Ende), eine einzige Materialbewegung-Zeile mit Von+Nach
|
||||
statt zwei Einzelbuchungen wie bei WH-004."""
|
||||
if von_lagerplatz_id == nach_lagerplatz_id:
|
||||
raise GleicherLagerplatzError
|
||||
|
||||
quelle = await _bestand_zeile(db, von_lagerplatz_id, material_id)
|
||||
if quelle is None or quelle.menge < menge:
|
||||
raise NichtGenugBestandError
|
||||
quelle.menge -= menge
|
||||
|
||||
ziel = await _bestand_zeile(db, nach_lagerplatz_id, material_id)
|
||||
if ziel is None:
|
||||
ziel = Bestand(lagerplatz_id=nach_lagerplatz_id, material_id=material_id, menge=Decimal(0))
|
||||
db.add(ziel)
|
||||
ziel.menge += menge
|
||||
|
||||
bewegung = Materialbewegung(
|
||||
material_id=material_id,
|
||||
menge=menge,
|
||||
von_lagerplatz_id=von_lagerplatz_id,
|
||||
nach_lagerplatz_id=nach_lagerplatz_id,
|
||||
benutzer_id=benutzer_id,
|
||||
zeitpunkt=datetime.now(timezone.utc),
|
||||
grund=grund,
|
||||
)
|
||||
db.add(bewegung)
|
||||
await db.flush()
|
||||
return bewegung
|
||||
|
||||
|
||||
async def auslagern(
|
||||
db: AsyncSession, *, lagerplatz_id: int, material_id: int, menge: Decimal, benutzer_id: int, grund: str | None
|
||||
) -> Materialbewegung:
|
||||
|
||||
Reference in New Issue
Block a user