docs(erp): complete German reference contract
Module Package Release / publish-packages (push) Successful in 10s

This commit is contained in:
2026-08-23 19:31:23 +02:00
parent a12e096366
commit 51dc33d8ae
4 changed files with 45 additions and 3 deletions
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "govoplan-erp" name = "govoplan-erp"
version = "0.1.19" version = "0.1.20"
description = "GovOPlaN governed ERP payable export and reconciliation module." description = "GovOPlaN governed ERP payable export and reconciliation module."
readme = "README.md" readme = "README.md"
requires-python = ">=3.12" requires-python = ">=3.12"
+27 -1
View File
@@ -26,7 +26,7 @@ from govoplan_core.core.provider_governance import (
MODULE_ID = "erp" MODULE_ID = "erp"
MODULE_VERSION = "0.1.19" MODULE_VERSION = "0.1.20"
READ_SCOPE = "erp:payables:read" READ_SCOPE = "erp:payables:read"
PLAN_SCOPE = "erp:payables:plan" PLAN_SCOPE = "erp:payables:plan"
RECONCILE_SCOPE = "erp:bookings:reconcile" 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.", "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, order=90,
), ),
DocumentationTopic( DocumentationTopic(
@@ -276,6 +277,31 @@ manifest = ModuleManifest(
"Reversals remain linked outcomes rather than destructive status replacement.", "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, order=100,
), ),
), ),
+16
View File
@@ -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"))
+1 -1
View File
@@ -129,7 +129,7 @@ def test_unknown_or_wrong_plan_observation_is_quarantined() -> None:
def test_manifest_documents_unconfigured_provider_and_german_workflow() -> None: def test_manifest_documents_unconfigured_provider_and_german_workflow() -> None:
manifest = get_manifest() 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.external_providers[0].id == "erp.payables_target"
assert manifest.architecture is not None assert manifest.architecture is not None
assert manifest.architecture.target_tested_providers == () assert manifest.architecture.target_tested_providers == ()