From d1bf9500b7e818157d6ba5f135fd42ba3332221c Mon Sep 17 00:00:00 2001 From: Albrecht Degering Date: Sun, 23 Aug 2026 19:31:23 +0200 Subject: [PATCH] docs(fit-connect): complete German reference contract --- pyproject.toml | 2 +- src/govoplan_fit_connect/backend/manifest.py | 29 +++++++++++++++++++- tests/test_documentation.py | 16 +++++++++++ tests/test_inbound.py | 2 +- 4 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 tests/test_documentation.py diff --git a/pyproject.toml b/pyproject.toml index 13dd95b..75c3329 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "govoplan-fit-connect" -version = "0.1.19" +version = "0.1.20" description = "GovOPlaN FIT-Connect inbound receipt and acknowledgement connector." readme = "README.md" requires-python = ">=3.12" diff --git a/src/govoplan_fit_connect/backend/manifest.py b/src/govoplan_fit_connect/backend/manifest.py index f80732f..94d782c 100644 --- a/src/govoplan_fit_connect/backend/manifest.py +++ b/src/govoplan_fit_connect/backend/manifest.py @@ -26,7 +26,7 @@ from govoplan_core.core.provider_governance import ( MODULE_ID = "fit_connect" -MODULE_VERSION = "0.1.19" +MODULE_VERSION = "0.1.20" READ_SCOPE = "fit_connect:submissions:read" VERIFY_SCOPE = "fit_connect:submissions:verify" ACK_SCOPE = "fit_connect:acknowledgements:plan" @@ -212,6 +212,7 @@ manifest = ModuleManifest( "body": "FIT-Connect verantwortet Zustellpunkt- und Abonnentenprofile, begrenzte Transportbelege, Prüfnachweise und Pläne für technische Bestätigungen. Antragssemantik, Fallentscheidungen, Kommunikation mit Antragstellenden und fachliche Annahme gehören nicht zum Modul. Ein technisches accept-submission-Ereignis belegt ausschließlich Empfang und technische Verarbeitbarkeit.", } }, + metadata={"kind": "reference"}, order=90, ), DocumentationTopic( @@ -280,6 +281,32 @@ manifest = ModuleManifest( "Technical problem details are operator evidence and must not be exposed directly to applicants.", ], }, + structured_translation_version="1", + structured_translations={ + "de": { + "prerequisites": [ + "Ein Zustellpunkt und ein Abonnentenclient bestehen in einer freigegebenen FIT-Connect-Umgebung.", + "Die Installation kann Verweise auf Entschlüsselungs- und Ereignissignaturschlüssel auflösen.", + "Ein fachlich verantwortlicher Service-, Formular- oder Fallablauf kann die exakte Einreichung dauerhaft übernehmen.", + ], + "steps": [ + "Alle verschlüsselten Komponenten und Anlagen für die exakte Einreichungs-ID abrufen.", + "Metadaten, Fachdaten, Anlagen und Authentifizierungs-Tags entschlüsseln und prüfen.", + "Vor der Bestätigung eine prüfsummengebundene Übergabe im fachlich verantwortlichen Ablauf speichern.", + "Annahme, Ablehnung oder Aufschub planen und jedes versendete SET im Ereignisprotokoll abgleichen.", + ], + "limitations": [ + "Standardmäßig werden weder Umgebung, Journey, Zustellpunkt, API-Profil noch Zugangsdaten aktiviert.", + "Diese Version erzeugt Belege und Bestätigungspläne, aber keine signierten SETs und versendet sie nicht.", + "Eine technische Bestätigung ist niemals die fachliche Annahme des Antrags.", + ], + "consequences": [ + "Erfolgreiche Annahme- oder Ablehnungsverarbeitung kann die Einreichung aus dem Zustelldienst entfernen.", + "Unvollständige lokale Dauerhaftigkeit verschiebt das Ereignis und bewahrt Wiederherstellungsoptionen.", + "Technische Problemdetails sind Betriebsnachweise und dürfen Antragstellenden nicht unmittelbar angezeigt werden.", + ], + } + }, order=100, ), ), diff --git a/tests/test_documentation.py b/tests/test_documentation.py new file mode 100644 index 0000000..083b126 --- /dev/null +++ b/tests/test_documentation.py @@ -0,0 +1,16 @@ +from __future__ import annotations + +from govoplan_core.core.modules import documentation_structured_translation_issues +from govoplan_fit_connect.backend.manifest import manifest + + +def test_fit_connect_german_reference_contract_is_complete() -> None: + topics = {topic.id: topic for topic in manifest.documentation} + assert topics["fit-connect.boundary"].metadata["kind"] == "reference" + workflow = topics["fit-connect.inbound-receipt"] + assert workflow.metadata["kind"] == "workflow" + assert workflow.structured_translation_version == "1" + assert "de" in workflow.structured_translations + assert documentation_structured_translation_issues(workflow) == () + for topic in topics.values(): + assert all(topic.translations["de"].get(key) for key in ("title", "summary", "body")) diff --git a/tests/test_inbound.py b/tests/test_inbound.py index 003d8ec..d513d8f 100644 --- a/tests/test_inbound.py +++ b/tests/test_inbound.py @@ -176,7 +176,7 @@ def test_receipt_from_another_submission_is_rejected() -> None: def test_manifest_declares_no_active_target_and_has_german_documentation() -> None: manifest = get_manifest() - assert manifest.version == "0.1.19" + assert manifest.version == "0.1.20" assert manifest.external_providers[0].id == "fit_connect.submission_api" assert manifest.architecture is not None assert manifest.architecture.target_tested_providers == ()