feat(identity): IDENT-003 konfigurierbare Nummernschemata je Objekttyp
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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user