Personenbezogene Ausgabe ergänzt die reine Standort-/Lagerplatz-Sicht
um "wer hat das Ding gerade": neues Modell ausgabe (Material +
optional geraet_instanz_id), POST /ausgaben, GET /ausgaben (Filter
status/empfaenger), POST /ausgaben/{id}/rueckgabe mit Schutz vor
Doppel-Rueckgabe. Frontend als Admin-Tab "Ausgabe/Rückgabe" +
Command-Palette-Eintrag.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
64 lines
2.2 KiB
Python
64 lines
2.2 KiB
Python
import uuid
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from sqlalchemy import select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.api.deps import get_current_user
|
|
from app.db.session import get_db
|
|
from app.models.ausgabe import Ausgabe, AusgabeStatus
|
|
from app.models.auth import Benutzer
|
|
from app.schemas.ausgabe import AusgabeCreate, AusgabeRead
|
|
from app.services.ausgabe import AusgabeBereitsZurueckError, ausgeben, zurueckgeben
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/ausgaben", response_model=list[AusgabeRead])
|
|
async def liste_ausgaben(
|
|
status_filter: AusgabeStatus | None = None,
|
|
empfaenger_id: int | None = None,
|
|
db: AsyncSession = Depends(get_db),
|
|
_=Depends(get_current_user),
|
|
) -> list[Ausgabe]:
|
|
stmt = select(Ausgabe)
|
|
if status_filter is not None:
|
|
stmt = stmt.where(Ausgabe.status == status_filter)
|
|
if empfaenger_id is not None:
|
|
stmt = stmt.where(Ausgabe.empfaenger_id == empfaenger_id)
|
|
stmt = stmt.order_by(Ausgabe.ausgegeben_am.desc())
|
|
result = await db.execute(stmt)
|
|
return list(result.scalars().all())
|
|
|
|
|
|
@router.post("/ausgaben", response_model=AusgabeRead, status_code=status.HTTP_201_CREATED)
|
|
async def erstelle_ausgabe(
|
|
payload: AusgabeCreate,
|
|
db: AsyncSession = Depends(get_db),
|
|
current_user: Benutzer = Depends(get_current_user),
|
|
) -> Ausgabe:
|
|
return await ausgeben(
|
|
db,
|
|
material_id=payload.material_id,
|
|
geraet_instanz_id=payload.geraet_instanz_id,
|
|
menge=payload.menge,
|
|
empfaenger_id=payload.empfaenger_id,
|
|
ausgegeben_von=current_user.id,
|
|
zweck=payload.zweck,
|
|
)
|
|
|
|
|
|
@router.post("/ausgaben/{ausgabe_id}/rueckgabe", response_model=AusgabeRead)
|
|
async def route_rueckgabe(
|
|
ausgabe_id: uuid.UUID, db: AsyncSession = Depends(get_db), _=Depends(get_current_user)
|
|
) -> Ausgabe:
|
|
ausgabe = await db.get(Ausgabe, ausgabe_id)
|
|
if ausgabe is None:
|
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Ausgabe nicht gefunden")
|
|
try:
|
|
return await zurueckgeben(db, ausgabe=ausgabe)
|
|
except AusgabeBereitsZurueckError as exc:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_409_CONFLICT, detail="Ausgabe wurde bereits zurückgegeben"
|
|
) from exc
|