From a804a196393e906782bd17c4efe6d0ba5b3c9999 Mon Sep 17 00:00:00 2001 From: Marcus van Elst Date: Thu, 26 Mar 2026 21:14:41 +0100 Subject: [PATCH] =?UTF-8?q?Rechnungskennzeichen=20in=20REA=20f=C3=BCr=20AS?= =?UTF-8?q?VREC=20fachlich=20einschr=C3=A4nken?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../structure/DefaultStructureValidator.java | 14 ++- ...lidatorAsvrecRechnungskennzeichenTest.java | 100 ++++++++++++++++++ ...faultStructureValidatorTestAdditional.java | 7 +- 3 files changed, 117 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/gecheckt/asv/validation/structure/DefaultStructureValidator.java b/src/main/java/de/gecheckt/asv/validation/structure/DefaultStructureValidator.java index 13f3cf6..e5dd77f 100644 --- a/src/main/java/de/gecheckt/asv/validation/structure/DefaultStructureValidator.java +++ b/src/main/java/de/gecheckt/asv/validation/structure/DefaultStructureValidator.java @@ -676,8 +676,20 @@ public class DefaultStructureValidator implements StructureValidator { "LEA-Segment verboten bei Rechnungskennzeichen '1'" )); } + } else { + // Ungültiges Rechnungskennzeichen: nur "0" oder "1" sind erlaubt + errors.add(createError( + "STRUCTURE_026", + "Rechnungskennzeichen in REA muss '0' oder '1' sein", + ValidationSeverity.ERROR, + "REA", + message.messagePosition(), + "", + 0, + kennzeichen, + "Rechnungskennzeichen muss '0' oder '1' sein" + )); } - // Anderes Kennzeichen: keine Prüfung durch diese Regel } /** diff --git a/src/test/java/de/gecheckt/asv/validation/structure/DefaultStructureValidatorAsvrecRechnungskennzeichenTest.java b/src/test/java/de/gecheckt/asv/validation/structure/DefaultStructureValidatorAsvrecRechnungskennzeichenTest.java index 4542564..5ed0429 100644 --- a/src/test/java/de/gecheckt/asv/validation/structure/DefaultStructureValidatorAsvrecRechnungskennzeichenTest.java +++ b/src/test/java/de/gecheckt/asv/validation/structure/DefaultStructureValidatorAsvrecRechnungskennzeichenTest.java @@ -259,4 +259,104 @@ class DefaultStructureValidatorAsvrecRechnungskennzeichenTest { || "STRUCTURE_020".equals(e.errorCode())), "Kein Rechnungskennzeichen-Fehler erwartet wenn REA keine Felder hat"); } + + // --- Test 9: Kennzeichen "2" -> genau ein Fehler STRUCTURE_026 --- + + @Test + void validate_kennzeichen2_fehlerSTRUCTURE026() { + InputFile inputFile = buildAsvrec(List.of( + new Segment("IFA", 2), + rea(3, "2"), + new Segment("IVA", 4) + )); + + ValidationResult result = validator.validate(inputFile); + + assertTrue(result.hasErrors()); + assertEquals(1, result.getErrors().size()); + + ValidationError error = result.getErrors().get(0); + assertEquals("STRUCTURE_026", error.errorCode()); + assertEquals("Rechnungskennzeichen in REA muss '0' oder '1' sein", + error.description()); + assertEquals("REA", error.segmentName()); + assertEquals(1, error.segmentPosition()); + assertEquals("2", error.actualValue()); + assertEquals("Rechnungskennzeichen muss '0' oder '1' sein", error.expectedRule()); + } + + // --- Test 10: Kennzeichen "" (leer) -> genau ein Fehler STRUCTURE_026 --- + + @Test + void validate_kennzeichenLeer_fehlerSTRUCTURE026() { + InputFile inputFile = buildAsvrec(List.of( + new Segment("IFA", 2), + rea(3, ""), + new Segment("IVA", 4) + )); + + ValidationResult result = validator.validate(inputFile); + + assertTrue(result.hasErrors()); + assertEquals(1, result.getErrors().size()); + + ValidationError error = result.getErrors().get(0); + assertEquals("STRUCTURE_026", error.errorCode()); + assertEquals("Rechnungskennzeichen in REA muss '0' oder '1' sein", + error.description()); + assertEquals("REA", error.segmentName()); + assertEquals(1, error.segmentPosition()); + assertEquals("", error.actualValue()); + assertEquals("Rechnungskennzeichen muss '0' oder '1' sein", error.expectedRule()); + } + + // --- Test 11: Kennzeichen "X" -> genau ein Fehler STRUCTURE_026 --- + + @Test + void validate_kennzeichenX_fehlerSTRUCTURE026() { + InputFile inputFile = buildAsvrec(List.of( + new Segment("IFA", 2), + rea(3, "X"), + new Segment("IVA", 4) + )); + + ValidationResult result = validator.validate(inputFile); + + assertTrue(result.hasErrors()); + assertEquals(1, result.getErrors().size()); + + ValidationError error = result.getErrors().get(0); + assertEquals("STRUCTURE_026", error.errorCode()); + assertEquals("Rechnungskennzeichen in REA muss '0' oder '1' sein", + error.description()); + assertEquals("REA", error.segmentName()); + assertEquals(1, error.segmentPosition()); + assertEquals("X", error.actualValue()); + assertEquals("Rechnungskennzeichen muss '0' oder '1' sein", error.expectedRule()); + } + + // --- Test 12: Kennzeichen "01" -> genau ein Fehler STRUCTURE_026 --- + + @Test + void validate_kennzeichen01_fehlerSTRUCTURE026() { + InputFile inputFile = buildAsvrec(List.of( + new Segment("IFA", 2), + rea(3, "01"), + new Segment("IVA", 4) + )); + + ValidationResult result = validator.validate(inputFile); + + assertTrue(result.hasErrors()); + assertEquals(1, result.getErrors().size()); + + ValidationError error = result.getErrors().get(0); + assertEquals("STRUCTURE_026", error.errorCode()); + assertEquals("Rechnungskennzeichen in REA muss '0' oder '1' sein", + error.description()); + assertEquals("REA", error.segmentName()); + assertEquals(1, error.segmentPosition()); + assertEquals("01", error.actualValue()); + assertEquals("Rechnungskennzeichen muss '0' oder '1' sein", error.expectedRule()); + } } diff --git a/src/test/java/de/gecheckt/asv/validation/structure/DefaultStructureValidatorTestAdditional.java b/src/test/java/de/gecheckt/asv/validation/structure/DefaultStructureValidatorTestAdditional.java index 71e6716..4730539 100644 --- a/src/test/java/de/gecheckt/asv/validation/structure/DefaultStructureValidatorTestAdditional.java +++ b/src/test/java/de/gecheckt/asv/validation/structure/DefaultStructureValidatorTestAdditional.java @@ -54,10 +54,11 @@ class DefaultStructureValidatorTestAdditional { @Test void validate_shouldNotReportErrorWhenMessageTypeIsASVFEH() { - // Given + // Given: ASVFEH-Nachricht mit erforderlichem FHL-Segment Segment unh = new Segment("UNH", 1, List.of(new Field(1, "12345"), new Field(2, "ASVFEH:D:03B:UN:EAN008"))); - Segment unt = new Segment("UNT", 2, List.of(new Field(1, "2"), new Field(2, "12345"))); - Message message = new Message(1, List.of(unh, unt)); + Segment fhl = new Segment("FHL", 2, List.of(new Field(1, "1"))); + Segment unt = new Segment("UNT", 3, List.of(new Field(1, "3"), new Field(2, "12345"))); + Message message = new Message(1, List.of(unh, fhl, unt)); InputFile inputFile = new InputFile("test.txt", List.of(message)); // When