From 51dc33d8ae3dacda55a7073a3028e5dc54b9c418 Mon Sep 17 00:00:00 2001 From: Albrecht Degering Date: Sun, 23 Aug 2026 19:31:23 +0200 Subject: [PATCH] docs(erp): complete German reference contract --- pyproject.toml | 2 +- src/govoplan_erp/backend/manifest.py | 28 +++++++++++++++++++++++++++- tests/test_documentation.py | 16 ++++++++++++++++ tests/test_payables.py | 2 +- 4 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 tests/test_documentation.py diff --git a/pyproject.toml b/pyproject.toml index 1656106..2b75c13 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "govoplan-erp" -version = "0.1.19" +version = "0.1.20" description = "GovOPlaN governed ERP payable export and reconciliation module." readme = "README.md" requires-python = ">=3.12" diff --git a/src/govoplan_erp/backend/manifest.py b/src/govoplan_erp/backend/manifest.py index a2645ef..62286b8 100644 --- a/src/govoplan_erp/backend/manifest.py +++ b/src/govoplan_erp/backend/manifest.py @@ -26,7 +26,7 @@ from govoplan_core.core.provider_governance import ( MODULE_ID = "erp" -MODULE_VERSION = "0.1.19" +MODULE_VERSION = "0.1.20" READ_SCOPE = "erp:payables:read" PLAN_SCOPE = "erp:payables:plan" RECONCILE_SCOPE = "erp:bookings:reconcile" @@ -211,6 +211,7 @@ manifest = ModuleManifest( "body": "ERP verantwortet Produktprofile, Zuordnung und Transportpläne, Korrelation sowie externe Buchungsbeobachtungen. Procurement, Payments und Ledger bleiben für Freigaben, Verbindlichkeiten, Zahlungen und Buchhaltungsprojektionen zuständig. Ein Übergabeplan ist kein Buchungsnachweis; eine unkonfigurierte Anbieterdeklaration ist keine produktive Integration.", } }, + metadata={"kind": "reference"}, order=90, ), DocumentationTopic( @@ -276,6 +277,31 @@ manifest = ModuleManifest( "Reversals remain linked outcomes rather than destructive status replacement.", ], }, + structured_translation_version="1", + structured_translations={ + "de": { + "prerequisites": [ + "Das fachlich verantwortliche Finanzmodul liefert eine freigegebene unveränderliche Verbindlichkeitsrevision.", + "Eine administrierende Person hat Zielschema und Rohstatuszuordnung geprüft.", + "Die Verbindungsreferenz wird über eine installationsverantwortete Berechtigungsgrenze aufgelöst.", + ], + "steps": [ + "Exakte kanonische Übergabenutzdaten und Planprüfsummen erzeugen und prüfen.", + "Nur über einen getrennt am Ziel geprüften Adapter versenden.", + "Die Buchung nach Erfolg, Zeitüberschreitung oder Wiederholung über die stabile Plankorrelation lesen.", + "Die deterministische Abgleichentscheidung erfassen, abwarten oder isolieren.", + ], + "limitations": [ + "Diese Version wählt weder ERP-Produkt, Schema, Endpunkt noch Transport aus.", + "Pläne können nicht versenden und Beobachtungen werden von diesem Modul nicht gespeichert.", + ], + "consequences": [ + "Eine Änderung an Verbindlichkeit oder Zuordnung erzeugt einen neuen Plan und eine neue Idempotenzidentität.", + "Eine Zeitüberschreitung bedeutet weder Erfolg noch Fehlschlag.", + "Stornos bleiben verknüpfte Ergebnisse, statt den ursprünglichen Status destruktiv zu ersetzen.", + ], + } + }, order=100, ), ), diff --git a/tests/test_documentation.py b/tests/test_documentation.py new file mode 100644 index 0000000..5cc0089 --- /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_erp.backend.manifest import manifest + + +def test_erp_german_reference_contract_is_complete() -> None: + topics = {topic.id: topic for topic in manifest.documentation} + assert topics["erp.boundary"].metadata["kind"] == "reference" + workflow = topics["erp.payable-reconciliation"] + 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_payables.py b/tests/test_payables.py index 1fa2683..27c906a 100644 --- a/tests/test_payables.py +++ b/tests/test_payables.py @@ -129,7 +129,7 @@ def test_unknown_or_wrong_plan_observation_is_quarantined() -> None: def test_manifest_documents_unconfigured_provider_and_german_workflow() -> None: manifest = get_manifest() - assert manifest.version == "0.1.19" + assert manifest.version == "0.1.20" assert manifest.external_providers[0].id == "erp.payables_target" assert manifest.architecture is not None assert manifest.architecture.target_tested_providers == ()