feat(identity): IDENT-003 konfigurierbare Nummernschemata je Objekttyp
CI / backend-tests (push) Successful in 2m24s
CI / frontend-build (push) Successful in 27s

Neue Stammdaten-Tabelle nummernschema (Migration 0032): Präfix + Stellenzahl
einmal je Objekttyp festlegen statt bei jeder Objekt-Anlage manuell
einzutippen (Fehlerquelle - Tippfehler, uneinheitliche Schreibweise,
falsches Präfix für den Typ). GET /objekte/naechster-code akzeptiert jetzt
objekttyp_id als Alternative zu praefix; ohne konfiguriertes Schema bleibt
der bisherige manuelle Präfix-Weg nutzbar (Rückwärtskompatibilität).

Admin-UI: Nummernschema-Pflege direkt in der Objekttyp-Verwaltung
(ObjekttypSection). ObjektAnlegenFormular versucht zuerst das Schema des
gewählten Objekttyps, fällt bei 404 auf manuelles Präfix zurück.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
This commit is contained in:
2026-09-08 20:23:14 +02:00
co-authored by Claude Sonnet 5
parent 15f783fb5e
commit 3b5cf8feab
12 changed files with 380 additions and 53 deletions
+65
View File
@@ -262,6 +262,71 @@ async def test_naechster_objekt_code_zaehlt_hoch(
assert response.json()["code"] == "RK-00018"
@pytest.mark.asyncio
async def test_nummernschema_liefert_code_ohne_manuelles_praefix(
client, objekttyp_factory, admin_user
):
"""IDENT-003: Präfix + Stellenzahl kommen aus dem konfigurierten Schema,
nicht mehr manuell eingegeben."""
objekttyp = await objekttyp_factory("Typ-Nummernschema")
token = await login(client, "admin1")
schema = await client.post(
"/api/v1/nummernschemata",
json={"objekttyp_id": objekttyp.id, "praefix": "SEG", "stellenzahl": 3},
headers=auth_header(token),
)
assert schema.status_code == 201
duplikat = await client.post(
"/api/v1/nummernschemata",
json={"objekttyp_id": objekttyp.id, "praefix": "ANDERES"},
headers=auth_header(token),
)
assert duplikat.status_code == 409
vorschlag = await client.get(
f"/api/v1/objekte/naechster-code?objekttyp_id={objekttyp.id}", headers=auth_header(token)
)
assert vorschlag.status_code == 200
assert vorschlag.json()["code"] == "SEG-001"
aenderung = await client.patch(
f"/api/v1/nummernschemata/{schema.json()['id']}",
json={"stellenzahl": 4},
headers=auth_header(token),
)
assert aenderung.json()["stellenzahl"] == 4
@pytest.mark.asyncio
async def test_nummernschema_ohne_konfiguration_verlangt_praefix(
client, objekttyp_factory, admin_user
):
objekttyp = await objekttyp_factory("Typ-Ohne-Schema")
token = await login(client, "admin1")
ohne_schema = await client.get(
f"/api/v1/objekte/naechster-code?objekttyp_id={objekttyp.id}", headers=auth_header(token)
)
assert ohne_schema.status_code == 404
ohne_beides = await client.get("/api/v1/objekte/naechster-code", headers=auth_header(token))
assert ohne_beides.status_code == 422
@pytest.mark.asyncio
async def test_mitarbeiter_darf_nummernschema_nicht_anlegen(client, objekttyp_factory, mitarbeiter_user):
objekttyp = await objekttyp_factory("Typ-Nummernschema-Verboten")
token = await login(client, "mitarbeiter1")
response = await client.post(
"/api/v1/nummernschemata",
json={"objekttyp_id": objekttyp.id, "praefix": "X"},
headers=auth_header(token),
)
assert response.status_code == 403
@pytest.mark.asyncio
async def test_naechster_objektposition_code(
client, db_session, objekt_mit_position, materialverantwortlicher_user