From 6bdb493929fff047d8f9bdb24aaae6b03699727e Mon Sep 17 00:00:00 2001 From: Matthias Kilian Date: Mon, 25 Aug 2025 16:09:35 +0200 Subject: [PATCH] Treat schematron rule flag "information" as notice. XRechnung 3.0.3 Summer 2025 edition introduced a rule with flag="information", breaking the Mustangproject validator which doesn't expect such a flag value. See https://projekte.kosit.org/xrechnung/xrechnung-schematron/-/commit/06be5b2c75f79a5f5e2f5156a34117f60f1fe099 Explicitly mapping "information" to ESeverity.notice hopefully fixes this and any future additions of rules with flag="information". --- .../validator/XMLValidator.java | 7 +++-- .../validator/ZUGFeRDValidatorTest.java | 6 ++--- validator/src/test/resources/validXRV30.xml | 26 +++++++++++++++++++ 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/validator/src/main/java/org/mustangproject/validator/XMLValidator.java b/validator/src/main/java/org/mustangproject/validator/XMLValidator.java index 5e8ce312..e7615f33 100644 --- a/validator/src/main/java/org/mustangproject/validator/XMLValidator.java +++ b/validator/src/main/java/org/mustangproject/validator/XMLValidator.java @@ -536,12 +536,15 @@ public class XMLValidator extends Validator { } ESeverity severity; + Node failNode = currentFailNode.getAttributes().getNamedItem("flag"); + String failVal = failNode == null ? null : failNode.getNodeValue(); if (defaultSeverity == ESeverity.notice) { severity = defaultSeverity; - } else if (currentFailNode.getAttributes().getNamedItem("flag") != null - && "warning".equals(currentFailNode.getAttributes().getNamedItem("flag").getNodeValue())) { + } else if ("warning".equals(failVal)) { // the XR issues warnings with flag=warning severity = ESeverity.warning; + } else if ("information".equals(failVal)) { + severity = ESeverity.notice; } else { severity = ESeverity.error; } diff --git a/validator/src/test/java/org/mustangproject/validator/ZUGFeRDValidatorTest.java b/validator/src/test/java/org/mustangproject/validator/ZUGFeRDValidatorTest.java index 4adb787b..5e28bdec 100644 --- a/validator/src/test/java/org/mustangproject/validator/ZUGFeRDValidatorTest.java +++ b/validator/src/test/java/org/mustangproject/validator/ZUGFeRDValidatorTest.java @@ -202,7 +202,7 @@ public class ZUGFeRDValidatorTest extends ResourceCase { assertThat(res).valueByXPath("count(//notice)") .asInt() - .isEqualTo(0); + .isEqualTo(1); assertThat(res).valueByXPath("/validation/summary/@status") .asString() .isEqualTo("valid");// expect to be valid because XR notices are, well, only notices @@ -216,14 +216,14 @@ public class ZUGFeRDValidatorTest extends ResourceCase { assertThat(res).valueByXPath("count(//error)") .asInt() - .isEqualTo(5); + .isEqualTo(4); assertThat(res).valueByXPath("count(//warning)") .asInt() .isEqualTo(1); assertThat(res).valueByXPath("count(//notice)") .asInt() - .isEqualTo(0); // 12 notices RE XRechnung 3.0 + .isEqualTo(1); // 12 notices RE XRechnung 3.0 assertThat(res).valueByXPath("/validation/summary/@status") .asString() .isEqualTo("invalid");// expect to be valid diff --git a/validator/src/test/resources/validXRV30.xml b/validator/src/test/resources/validXRV30.xml index adffb992..5a78754a 100644 --- a/validator/src/test/resources/validXRV30.xml +++ b/validator/src/test/resources/validXRV30.xml @@ -102,6 +102,32 @@ + + + Zeitlose Diensleistung + + + Zeitlose Diensleistung + + + + 0.00 + + + + 1 + + + + VAT + S + 7 + + + 0.00 + + + 04011000-12345-03