feat(inventory): INV-007 Ausgabe/Rückgabe von Material und Leihgeräten
CI / backend-tests (push) Successful in 2m1s
CI / frontend-build (push) Successful in 18s

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
This commit is contained in:
2026-09-06 13:19:31 +02:00
co-authored by Claude Sonnet 5
parent 16a42c6b85
commit b6ada2b5a1
13 changed files with 495 additions and 7 deletions
+41
View File
@@ -0,0 +1,41 @@
"""INV-007: personenbezogene Ausgabe/Rueckgabe von Material/Leihgeraeten.
Revision ID: 0021_ausgabe
Revises: 0020_sollmenge_vorlage
Create Date: 2026-09-06
"""
from typing import Sequence, Union
from alembic import op
revision: str = "0021_ausgabe"
down_revision: Union[str, None] = "0020_sollmenge_vorlage"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
op.execute("CREATE TYPE ausgabe_status AS ENUM ('offen', 'zurueck')")
op.execute(
"""
CREATE TABLE ausgabe (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
material_id INTEGER NOT NULL REFERENCES material(id),
geraet_instanz_id UUID REFERENCES geraet_instanz(id),
menge NUMERIC NOT NULL,
empfaenger_id INTEGER NOT NULL REFERENCES benutzer(id),
ausgegeben_von INTEGER NOT NULL REFERENCES benutzer(id),
ausgegeben_am TIMESTAMPTZ NOT NULL,
rueckgabe_am TIMESTAMPTZ,
status ausgabe_status NOT NULL DEFAULT 'offen',
zweck TEXT
)
"""
)
op.execute("CREATE INDEX idx_ausgabe_empfaenger ON ausgabe (empfaenger_id)")
op.execute("CREATE INDEX idx_ausgabe_status ON ausgabe (status)")
def downgrade() -> None:
op.execute("DROP TABLE ausgabe")
op.execute("DROP TYPE ausgabe_status")