Skip to content

Commit 60bf71b

Browse files
authored
0.2.0 (#2)
* Improve the way how the validator works
1 parent 847a8d5 commit 60bf71b

17 files changed

+484
-164
lines changed

README.md

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,23 @@ final class EN16931Validator
7474
```JSON
7575
{
7676
"meta": {
77-
"xml_syntax_type": "CII",
78-
"xml_profile_type": "FACTURX_EXTENDED"
77+
"xml_syntax_type": "UBL",
78+
"xml_profile_type": "PEPPOL_30"
7979
},
80-
"errors": [],
81-
"warnings": [],
80+
"validation_results": [
81+
{
82+
"name": "EN16931",
83+
"version": "1.3.13",
84+
"warnings": [],
85+
"errors": []
86+
},
87+
{
88+
"name": "Peppol BIS",
89+
"version": "3.0",
90+
"warnings": [],
91+
"errors": []
92+
}
93+
],
8294
"is_valid": true
8395
}
8496
```
@@ -89,28 +101,32 @@ final class EN16931Validator
89101
```JSON
90102
{
91103
"meta": {
92-
"xml_syntax_type": "CII",
93-
"xml_profile_type": "EN16931"
104+
"xml_syntax_type": "UBL",
105+
"xml_profile_type": "PEPPOL_30"
94106
},
95-
"errors": [
107+
"validation_results": [
96108
{
97-
"rule_id": "BR-CO-15",
98-
"rule_location": "/*:CrossIndustryInvoice[namespace-uri()='urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100'][1]",
99-
"rule_severity": "FATAL",
100-
"rule_messages": [
101-
"[BR-CO-15]-Invoice total amount with VAT (BT-112) = Invoice total amount without VAT (BT-109) + Invoice total VAT amount (BT-110)."
109+
"name": "EN16931",
110+
"version": "1.3.13",
111+
"warnings": [],
112+
"errors": [
113+
{
114+
"rule_id": "BR-CL-14",
115+
"rule_location": "/*:Invoice[namespace-uri()='urn:oasis:names:specification:ubl:schema:xsd:Invoice-2'][1]/*:AccountingSupplierParty[namespace-uri()='urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2'][1]/*:Party[namespace-uri()='urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2'][1]/*:PostalAddress[namespace-uri()='urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2'][1]/*:Country[namespace-uri()='urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2'][1]/*:IdentificationCode[namespace-uri()='urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2'][1]",
116+
"rule_severity": "FATAL",
117+
"rule_messages": [
118+
"[BR-CL-14]-Country codes in an invoice MUST be coded using ISO code list 3166-1"
119+
]
120+
}
102121
]
103122
},
104123
{
105-
"rule_id": "BR-CL-04",
106-
"rule_location": "/*:CrossIndustryInvoice[namespace-uri()='urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100'][1]/*:SupplyChainTradeTransaction[namespace-uri()='urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100'][1]/*:ApplicableHeaderTradeSettlement[namespace-uri()='urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100'][1]/*:InvoiceCurrencyCode[namespace-uri()='urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100'][1]",
107-
"rule_severity": "FATAL",
108-
"rule_messages": [
109-
"[BR-CL-04]-Invoice currency code MUST be coded using ISO code list 4217 alpha-3"
110-
]
124+
"name": "Peppol BIS",
125+
"version": "3.0",
126+
"warnings": [],
127+
"errors": []
111128
}
112129
],
113-
"warnings": [],
114130
"is_valid": false
115131
}
116132
```
Lines changed: 19 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,48 @@
11
package io.github.easybill.Dtos;
22

33
import com.fasterxml.jackson.annotation.JsonProperty;
4-
import com.helger.schematron.svrl.jaxb.FailedAssert;
5-
import com.helger.schematron.svrl.jaxb.SchematronOutputType;
4+
import io.github.easybill.Dtos.ValidatorResults.ValidatorResult;
65
import io.github.easybill.Enums.XmlProfileType;
6+
import java.util.Arrays;
77
import java.util.Collections;
88
import java.util.List;
9-
import java.util.Objects;
109
import org.checkerframework.checker.nullness.qual.NonNull;
1110

1211
public record ValidationResult(
1312
@NonNull ValidationResultMetaData meta,
14-
@NonNull List<@NonNull ValidationResultField> errors,
15-
@NonNull List<@NonNull ValidationResultField> warnings
13+
@JsonProperty("validation_results")
14+
@NonNull
15+
List<@NonNull ValidatorResult> validationResults
1616
) {
17-
public ValidationResult {
18-
errors = Collections.unmodifiableList(errors);
19-
warnings = Collections.unmodifiableList(warnings);
17+
public ValidationResult(
18+
@NonNull ValidationResultMetaData meta,
19+
@JsonProperty(
20+
"validation_results"
21+
) @NonNull List<@NonNull ValidatorResult> validationResults
22+
) {
23+
this.meta = meta;
24+
this.validationResults =
25+
Collections.unmodifiableList(validationResults);
2026
}
2127

2228
@JsonProperty("is_valid")
2329
public boolean isValid() {
24-
return errors.isEmpty();
30+
return validationResults
31+
.stream()
32+
.allMatch(element -> element.getErrors().isEmpty());
2533
}
2634

2735
public static ValidationResult of(
2836
XmlProfileType xmlProfileType,
2937
ValidationRequest validationRequest,
30-
SchematronOutputType schematronOutputType
38+
ValidatorResult... validatorResults
3139
) {
3240
return new ValidationResult(
3341
new ValidationResultMetaData(
3442
validationRequest.xmlSyntaxType(),
3543
xmlProfileType
3644
),
37-
getErrorsFromSchematronOutput(schematronOutputType),
38-
getWarningsFromSchematronOutput(schematronOutputType)
45+
Arrays.stream(validatorResults).toList()
3946
);
4047
}
41-
42-
private static List<@NonNull ValidationResultField> getErrorsFromSchematronOutput(
43-
@NonNull SchematronOutputType outputType
44-
) {
45-
return outputType
46-
.getActivePatternAndFiredRuleAndFailedAssert()
47-
.stream()
48-
.filter(element -> element instanceof FailedAssert)
49-
.filter(element ->
50-
Objects.equals(((FailedAssert) element).getFlag(), "fatal")
51-
)
52-
.map(element -> (FailedAssert) element)
53-
.map(ValidationResultField::fromFailedAssert)
54-
.toList();
55-
}
56-
57-
private static List<@NonNull ValidationResultField> getWarningsFromSchematronOutput(
58-
@NonNull SchematronOutputType outputType
59-
) {
60-
return outputType
61-
.getActivePatternAndFiredRuleAndFailedAssert()
62-
.stream()
63-
.filter(element -> element instanceof FailedAssert)
64-
.filter(element ->
65-
Objects.equals(((FailedAssert) element).getFlag(), "warning")
66-
)
67-
.map(element -> (FailedAssert) element)
68-
.map(ValidationResultField::fromFailedAssert)
69-
.toList();
70-
}
7148
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.github.easybill.Dtos.ValidatorResults;
2+
3+
import com.helger.schematron.svrl.jaxb.SchematronOutputType;
4+
import io.github.easybill.Dtos.ValidationResultField;
5+
import java.util.List;
6+
import org.checkerframework.checker.nullness.qual.NonNull;
7+
8+
public final class EN16931ValidatorResult extends ValidatorResult {
9+
10+
public EN16931ValidatorResult(
11+
@NonNull String name,
12+
@NonNull String version,
13+
@NonNull List<@NonNull ValidationResultField> errors,
14+
@NonNull List<@NonNull ValidationResultField> warnings
15+
) {
16+
super(name, version, errors, warnings);
17+
}
18+
19+
public static EN16931ValidatorResult of(
20+
@NonNull SchematronOutputType report
21+
) {
22+
return new EN16931ValidatorResult(
23+
"EN16931",
24+
"1.3.13",
25+
getErrorsFromSchematronOutput(report),
26+
getWarningsFromSchematronOutput(report)
27+
);
28+
}
29+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.github.easybill.Dtos.ValidatorResults;
2+
3+
import com.helger.schematron.svrl.jaxb.SchematronOutputType;
4+
import io.github.easybill.Dtos.ValidationResultField;
5+
import java.util.List;
6+
import org.checkerframework.checker.nullness.qual.NonNull;
7+
8+
public final class FacturXValidatorResult extends ValidatorResult {
9+
10+
public FacturXValidatorResult(
11+
@NonNull String name,
12+
@NonNull String version,
13+
@NonNull List<@NonNull ValidationResultField> errors,
14+
@NonNull List<@NonNull ValidationResultField> warnings
15+
) {
16+
super(name, version, errors, warnings);
17+
}
18+
19+
public static FacturXValidatorResult of(
20+
@NonNull SchematronOutputType report
21+
) {
22+
return new FacturXValidatorResult(
23+
"factur-x",
24+
"1.07.2",
25+
getErrorsFromSchematronOutput(report),
26+
getWarningsFromSchematronOutput(report)
27+
);
28+
}
29+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.github.easybill.Dtos.ValidatorResults;
2+
3+
import com.helger.schematron.svrl.jaxb.SchematronOutputType;
4+
import io.github.easybill.Dtos.ValidationResultField;
5+
import java.util.List;
6+
import org.checkerframework.checker.nullness.qual.NonNull;
7+
8+
public final class PeppolValidatorResult extends ValidatorResult {
9+
10+
public PeppolValidatorResult(
11+
@NonNull String name,
12+
@NonNull String version,
13+
@NonNull List<@NonNull ValidationResultField> errors,
14+
@NonNull List<@NonNull ValidationResultField> warnings
15+
) {
16+
super(name, version, errors, warnings);
17+
}
18+
19+
public static PeppolValidatorResult of(
20+
@NonNull SchematronOutputType report
21+
) {
22+
return new PeppolValidatorResult(
23+
"Peppol BIS",
24+
"3.0",
25+
getErrorsFromSchematronOutput(report),
26+
getWarningsFromSchematronOutput(report)
27+
);
28+
}
29+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package io.github.easybill.Dtos.ValidatorResults;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import com.helger.schematron.svrl.jaxb.FailedAssert;
5+
import com.helger.schematron.svrl.jaxb.SchematronOutputType;
6+
import io.github.easybill.Dtos.ValidationResultField;
7+
import java.util.Collections;
8+
import java.util.List;
9+
import java.util.Objects;
10+
import org.checkerframework.checker.nullness.qual.NonNull;
11+
12+
public abstract class ValidatorResult {
13+
14+
@NonNull
15+
private final String name;
16+
17+
@NonNull
18+
private final String version;
19+
20+
@NonNull
21+
private final List<@NonNull ValidationResultField> warnings;
22+
23+
@NonNull
24+
private final List<@NonNull ValidationResultField> errors;
25+
26+
public ValidatorResult(
27+
@JsonProperty("name") @NonNull String name,
28+
@JsonProperty("artifact_version") @NonNull String version,
29+
@NonNull List<@NonNull ValidationResultField> errors,
30+
@NonNull List<@NonNull ValidationResultField> warnings
31+
) {
32+
this.name = name;
33+
this.version = version;
34+
this.errors = Collections.unmodifiableList(errors);
35+
this.warnings = Collections.unmodifiableList(warnings);
36+
}
37+
38+
static List<@NonNull ValidationResultField> getErrorsFromSchematronOutput(
39+
@NonNull SchematronOutputType outputType
40+
) {
41+
return outputType
42+
.getActivePatternAndFiredRuleAndFailedAssert()
43+
.stream()
44+
.filter(element -> element instanceof FailedAssert)
45+
.filter(element ->
46+
Objects.equals(((FailedAssert) element).getFlag(), "fatal")
47+
)
48+
.map(element -> (FailedAssert) element)
49+
.map(ValidationResultField::fromFailedAssert)
50+
.toList();
51+
}
52+
53+
static List<@NonNull ValidationResultField> getWarningsFromSchematronOutput(
54+
@NonNull SchematronOutputType outputType
55+
) {
56+
return outputType
57+
.getActivePatternAndFiredRuleAndFailedAssert()
58+
.stream()
59+
.filter(element -> element instanceof FailedAssert)
60+
.filter(element ->
61+
Objects.equals(((FailedAssert) element).getFlag(), "warning")
62+
)
63+
.map(element -> (FailedAssert) element)
64+
.map(ValidationResultField::fromFailedAssert)
65+
.toList();
66+
}
67+
68+
public @NonNull List<@NonNull ValidationResultField> getErrors() {
69+
return errors;
70+
}
71+
72+
public @NonNull List<@NonNull ValidationResultField> getWarnings() {
73+
return warnings;
74+
}
75+
76+
public @NonNull String getName() {
77+
return name;
78+
}
79+
80+
public @NonNull String getVersion() {
81+
return version;
82+
}
83+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.github.easybill.Dtos.ValidatorResults;
2+
3+
import com.helger.schematron.svrl.jaxb.SchematronOutputType;
4+
import io.github.easybill.Dtos.ValidationResultField;
5+
import java.util.List;
6+
import org.checkerframework.checker.nullness.qual.NonNull;
7+
8+
public final class XRechnungValidatorResult extends ValidatorResult {
9+
10+
public XRechnungValidatorResult(
11+
@NonNull String name,
12+
@NonNull String version,
13+
@NonNull List<@NonNull ValidationResultField> errors,
14+
@NonNull List<@NonNull ValidationResultField> warnings
15+
) {
16+
super(name, version, errors, warnings);
17+
}
18+
19+
public static XRechnungValidatorResult of(
20+
@NonNull SchematronOutputType report
21+
) {
22+
return new XRechnungValidatorResult(
23+
"XRechnung",
24+
"3.2",
25+
getErrorsFromSchematronOutput(report),
26+
getWarningsFromSchematronOutput(report)
27+
);
28+
}
29+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package io.github.easybill.Exceptions;
2+
3+
public class ValidationChainException extends ValidatorException {
4+
5+
public ValidationChainException() {
6+
super();
7+
}
8+
}

0 commit comments

Comments
 (0)