Pflicht-Präsenz von UNH und UNT pro Nachricht validieren

This commit is contained in:
2026-03-26 10:30:43 +01:00
parent 6152fe58d2
commit f7af574a97
10 changed files with 405 additions and 21 deletions

View File

@@ -24,6 +24,8 @@ import de.gecheckt.asv.validation.model.ValidationSeverity;
* 6. Nachrichtenpositionen innerhalb einer Eingabedatei müssen eindeutig und positiv sein
* 7. UNH- und UNT-Referenznummern müssen innerhalb einer Nachricht übereinstimmen
* 8. Die im UNT angegebene Segmentanzahl muss der tatsächlichen Anzahl der Segmente entsprechen
* 9. Eine Nachricht muss mindestens ein UNH-Segment enthalten
* 10. Eine Nachricht muss mindestens ein UNT-Segment enthalten
*/
public class DefaultStructureValidator implements StructureValidator {
@@ -86,11 +88,79 @@ public class DefaultStructureValidator implements StructureValidator {
// Validiere Segmente in dieser Nachricht
validateSegments(message.segments(), messagePosition, errors);
// Prüfe zuerst, ob grundlegende Strukturfehler vorliegen (keine Segmente)
// In diesem Fall können wir keine UNH/UNT-Prüfung durchführen
if (message.segments().isEmpty()) {
continue;
}
// Regel 9: Nachricht muss mindestens ein UNH-Segment enthalten
validateUnhPresence(message, errors);
// Regel 10: Nachricht muss mindestens ein UNT-Segment enthalten
validateUntPresence(message, errors);
// Regel 7: UNH- und UNT-Referenznummern müssen übereinstimmen
validateUnhUntReferenceNumbers(message, errors);
// Nur prüfen, wenn beide Segmente vorhanden sind
if (message.getFirstSegment("UNH").isPresent() && message.getFirstSegment("UNT").isPresent()) {
validateUnhUntReferenceNumbers(message, errors);
}
// Regel 8: UNT-Segmentanzahl muss mit tatsächlicher Segmentanzahl übereinstimmen
validateUntSegmentCount(message, errors);
// Nur prüfen, wenn UNT-Segment vorhanden ist
if (message.getFirstSegment("UNT").isPresent()) {
validateUntSegmentCount(message, errors);
}
}
}
/**
* Validiert, dass mindestens ein UNH-Segment in der Nachricht vorhanden ist.
*
* @param message die zu validierende Nachricht
* @param errors die Liste zum Hinzufügen von Validierungsfehlern
*/
private void validateUnhPresence(Message message, List<ValidationError> errors) {
var unhSegment = message.getFirstSegment("UNH");
// Wenn kein UNH-Segment vorhanden ist, Fehler hinzufügen
if (unhSegment.isEmpty()) {
errors.add(createError(
"STRUCTURE_009",
"Nachricht muss mindestens ein UNH-Segment enthalten",
ValidationSeverity.ERROR,
"",
message.messagePosition(),
"",
0,
"",
"UNH-Segment erforderlich"
));
}
}
/**
* Validiert, dass mindestens ein UNT-Segment in der Nachricht vorhanden ist.
*
* @param message die zu validierende Nachricht
* @param errors die Liste zum Hinzufügen von Validierungsfehlern
*/
private void validateUntPresence(Message message, List<ValidationError> errors) {
var untSegment = message.getFirstSegment("UNT");
// Wenn kein UNT-Segment vorhanden ist, Fehler hinzufügen
if (untSegment.isEmpty()) {
errors.add(createError(
"STRUCTURE_010",
"Nachricht muss mindestens ein UNT-Segment enthalten",
ValidationSeverity.ERROR,
"",
message.messagePosition(),
"",
0,
"",
"UNT-Segment erforderlich"
));
}
}
@@ -243,7 +313,9 @@ public class DefaultStructureValidator implements StructureValidator {
}
// Validate fields in this segment
validateFields(segment.fields(), segmentName, segmentPosition, errors);
if (!segment.fields().isEmpty()) {
validateFields(segment.fields(), segmentName, segmentPosition, errors);
}
}
}
@@ -256,6 +328,10 @@ public class DefaultStructureValidator implements StructureValidator {
* @param errors die Liste zum Hinzufügen von Validierungsfehlern
*/
private void validateFields(List<Field> fields, String segmentName, int segmentPosition, List<ValidationError> errors) {
if (fields.isEmpty()) {
return;
}
var fieldPositions = new HashSet<Integer>();
for (var field : fields) {