_synchronisiere_fehlbestand suchte nur nach Fehlbeständen der eigenen
Kontroll-Sitzung. Ein bereits offener Fehlbestand aus einer früheren
Kontrolle für dasselbe Objekt+Material wurde nicht wiedergefunden -
es entstand ein zweiter, paralleler Fehlbestand mit eigener (neuerer)
Sollmenge, der alte blieb mit veralteter Sollmenge offen liegen.
Lookup jetzt über objekt_id+material_id+status=offen statt
kontrolle_id; kontrolle_id am gefundenen Datensatz bleibt unverändert,
damit ein Abbruch der aktuellen Kontrolle ihn nicht fälschlich
mitlöscht. Löst sich die Abweichung über eine andere Kontrolle als
die erzeugende auf, wird der Fehlbestand jetzt sauber als erledigt
markiert (inkl. Mindermenge-Abschluss) statt stillschweigend gelöscht.
Nebenbei: Kommentare mit Kachel-/Datums-Referenzen ("Bug-Fund
2026-09-06", "UI-00X (Epic 20)") aus dem Code dieser Session entfernt.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
MABEA Backend – Sprint 0
FastAPI-Skeleton, Datenbankschema (Alembic), Auth (JWT), Rollen-Dependency. Details: ergebnisse/sprintplan.md, ergebnisse/19_technische_architektur.md, ergebnisse/20_datenbank_schema.md.
Setup (auf dem Zielsystem, nicht lokal)
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
cp example.env .env
# .env editieren: DATABASE_URL, JWT_SECRET_KEY, SYSTEMKNOTEN_ID
alembic upgrade head
uvicorn app.main:app --host 0.0.0.0 --port 8000
Tests (CI oder Zielsystem)
pytest
Erwartet eine per Alembic migrierte PostgreSQL-Test-Datenbank (DATABASE_URL zeigt darauf). CI-Workflow: .gitea/workflows/ci.yml.
Struktur
app/core/app_settings.py– Konfiguration aus Umgebungsvariablenapp/core/security.py– Passwort-Hashing, JWTapp/db/– SQLAlchemy Engine/Sessionapp/models/– ORM-Modelle (Sprint 0: nur Auth-relevante Tabellen; weitere Modelle folgen Sprint 1+)app/api/– FastAPI-Router, Dependencies (u.a.require_rolesfür Prompt-05-Berechtigungsmatrix)alembic/versions/0001_initial_schema.py– vollständiges Ziel-Schema (Prompt 20), auch für Tabellen, die erst spätere Sprints per API befüllenalembic/versions/0002_seed_hauptserver.py– Sprintplan E6: seedet den einensystemknoten-Datensatz (typ='haupt')