UNT-Segmentanzahl gegen tatsächliche Nachrichtenstruktur validieren

This commit is contained in:
2026-03-26 09:08:49 +01:00
parent 6a7d150007
commit 6152fe58d2
7 changed files with 178 additions and 1 deletions

View File

@@ -23,6 +23,7 @@ import de.gecheckt.asv.validation.model.ValidationSeverity;
* 5. Segmentpositionen innerhalb einer Nachricht müssen eindeutig und positiv sein
* 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
*/
public class DefaultStructureValidator implements StructureValidator {
@@ -87,6 +88,52 @@ public class DefaultStructureValidator implements StructureValidator {
// Regel 7: UNH- und UNT-Referenznummern müssen übereinstimmen
validateUnhUntReferenceNumbers(message, errors);
// Regel 8: UNT-Segmentanzahl muss mit tatsächlicher Segmentanzahl übereinstimmen
validateUntSegmentCount(message, errors);
}
}
/**
* Validiert, dass die im UNT angegebene Segmentanzahl der tatsächlichen Anzahl entspricht.
*
* @param message die zu validierende Nachricht
* @param errors die Liste zum Hinzufügen von Validierungsfehlern
*/
private void validateUntSegmentCount(Message message, List<ValidationError> errors) {
var untSegment = message.getFirstSegment("UNT");
// Nur prüfen, wenn UNT-Segment vorhanden ist
if (untSegment.isPresent()) {
var fields = untSegment.get().fields();
// Prüfen, ob das erste Feld (Segmentanzahl) vorhanden ist
if (!fields.isEmpty()) {
var countField = fields.get(0); // 0074 - Anzahl der Segmente
var countValue = countField.rawValue();
// Nur prüfen, wenn der Wert numerisch interpretiert werden kann
try {
int declaredCount = Integer.parseInt(countValue);
int actualCount = message.segments().size();
if (declaredCount != actualCount) {
errors.add(createError(
"STRUCTURE_008",
"Die im UNT angegebene Segmentanzahl entspricht nicht der tatsächlichen Anzahl",
ValidationSeverity.ERROR,
"UNT",
message.messagePosition(),
"0074",
1,
declaredCount + " != " + actualCount,
"Segmentanzahl in UNT muss mit tatsächlicher Anzahl übereinstimmen"
));
}
} catch (NumberFormatException e) {
// Nicht-numerischer Wert - keine zusätzliche Fehlermeldung gemäß Anforderung
}
}
}
}