feat(dokumente): DOC-004 Original-vs-Kopie-Kennzeichnung
CI / backend-tests (push) Successful in 2m16s
CI / frontend-build (push) Successful in 27s

Neues Feld ist_original (Boolean, Migration 0029) - explizit beim Upload
und beim Ersetzen (DOC-003) setzbar, kein Default in eine Richtung erraten.
Wird beim Ersetzen bewusst NICHT vom Vorgänger übernommen (neue Version
könnte ein nachgereichtes Original sein, das eine bisherige Kopie ersetzt,
oder umgekehrt). Frontend: Checkbox "Original (nicht nur Kopie/Scan)" im
Upload-Formular, "Original"-Badge in der Dokumentenliste.

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 12:16:25 +02:00
co-authored by Claude Sonnet 5
parent 17cac8543f
commit ae09433c11
10 changed files with 118 additions and 5 deletions
+41
View File
@@ -368,3 +368,44 @@ async def test_versionshistorie_respektiert_zugriffsrechte(
mitarbeiter_token = await login(client, "mitarbeiter1")
verweigert = await client.get(f"/api/v1/dokumente/{v1_id}/versionen", headers=auth_header(mitarbeiter_token))
assert verweigert.status_code == 403
@pytest.mark.asyncio
async def test_original_kennzeichnung_default_false_und_explizit_setzbar(
client, objekt_mit_position, mitarbeiter_user
):
"""DOC-004: ohne Angabe gilt eine Datei als Kopie (False), kann aber
explizit als Original markiert werden - auch beim Ersetzen unabhängig
vom Vorgänger neu wählbar."""
objekt, _material = objekt_mit_position
token = await login(client, "mitarbeiter1")
ohne_angabe = await client.post(
"/api/v1/dokumente",
data={"entitaet_typ": "objekt", "entitaet_id": str(objekt.id), "dokumenttyp": "zulassungsdokument"},
files={"datei": ("kopie.pdf", b"%PDF-1.4 kopie", "application/pdf")},
headers=auth_header(token),
)
assert ohne_angabe.json()["ist_original"] is False
original = await client.post(
"/api/v1/dokumente",
data={
"entitaet_typ": "objekt",
"entitaet_id": str(objekt.id),
"dokumenttyp": "zulassungsdokument",
"ist_original": "true",
},
files={"datei": ("original.pdf", b"%PDF-1.4 original", "application/pdf")},
headers=auth_header(token),
)
original_body = original.json()
assert original_body["ist_original"] is True
ersetzt = await client.post(
f"/api/v1/dokumente/{original_body['id']}/ersetzen",
data={"ist_original": "false"},
files={"datei": ("nachtraeglich_kopie.pdf", b"%PDF-1.4 v2", "application/pdf")},
headers=auth_header(token),
)
assert ersetzt.json()["ist_original"] is False