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:
@@ -17,8 +17,15 @@ from app.schemas.lager import (
|
||||
LagerplatzCreate,
|
||||
LagerplatzRead,
|
||||
MaterialbewegungRead,
|
||||
UmlagernRequest,
|
||||
)
|
||||
from app.services.lager import (
|
||||
GleicherLagerplatzError,
|
||||
NichtGenugBestandError,
|
||||
auslagern,
|
||||
einlagern,
|
||||
umlagern,
|
||||
)
|
||||
from app.services.lager import NichtGenugBestandError, auslagern, einlagern
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
@@ -154,6 +161,38 @@ async def route_auslagern(
|
||||
raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="Nicht genug Bestand am Lagerplatz") from exc
|
||||
|
||||
|
||||
@router.post(
|
||||
"/lagerplaetze/{lagerplatz_id}/umlagern",
|
||||
response_model=MaterialbewegungRead,
|
||||
status_code=status.HTTP_201_CREATED,
|
||||
)
|
||||
async def route_umlagern(
|
||||
lagerplatz_id: int,
|
||||
payload: UmlagernRequest,
|
||||
db: AsyncSession = Depends(get_db),
|
||||
current_user=Depends(get_current_user),
|
||||
) -> Materialbewegung:
|
||||
"""WH-005: Verschieben in einem Schritt statt Aus+Ein manuell."""
|
||||
await _get_or_404(db, Lagerplatz, lagerplatz_id, "Quell-Lagerplatz nicht gefunden")
|
||||
await _get_or_404(db, Lagerplatz, payload.nach_lagerplatz_id, "Ziel-Lagerplatz nicht gefunden")
|
||||
try:
|
||||
return await umlagern(
|
||||
db,
|
||||
von_lagerplatz_id=lagerplatz_id,
|
||||
nach_lagerplatz_id=payload.nach_lagerplatz_id,
|
||||
material_id=payload.material_id,
|
||||
menge=payload.menge,
|
||||
benutzer_id=current_user.id,
|
||||
grund=payload.grund,
|
||||
)
|
||||
except GleicherLagerplatzError as exc:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_409_CONFLICT, detail="Quell- und Ziel-Lagerplatz sind identisch"
|
||||
) from exc
|
||||
except NichtGenugBestandError as exc:
|
||||
raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="Nicht genug Bestand am Lagerplatz") from exc
|
||||
|
||||
|
||||
# -- Materialbewegung (WH-007) --------------------------------------------------
|
||||
|
||||
@router.get("/materialbewegungen", response_model=list[MaterialbewegungRead])
|
||||
|
||||
Reference in New Issue
Block a user