Skip to content

Commit

Permalink
0.2.0 (#2)
Browse files Browse the repository at this point in the history
* Improve the way how the validator works
  • Loading branch information
BolZer authored Jan 30, 2025
1 parent 847a8d5 commit 60bf71b
Show file tree
Hide file tree
Showing 17 changed files with 484 additions and 164 deletions.
54 changes: 35 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,11 +74,23 @@ final class EN16931Validator
```JSON
{
"meta": {
"xml_syntax_type": "CII",
"xml_profile_type": "FACTURX_EXTENDED"
"xml_syntax_type": "UBL",
"xml_profile_type": "PEPPOL_30"
},
"errors": [],
"warnings": [],
"validation_results": [
{
"name": "EN16931",
"version": "1.3.13",
"warnings": [],
"errors": []
},
{
"name": "Peppol BIS",
"version": "3.0",
"warnings": [],
"errors": []
}
],
"is_valid": true
}
```
Expand All @@ -89,28 +101,32 @@ final class EN16931Validator
```JSON
{
"meta": {
"xml_syntax_type": "CII",
"xml_profile_type": "EN16931"
"xml_syntax_type": "UBL",
"xml_profile_type": "PEPPOL_30"
},
"errors": [
"validation_results": [
{
"rule_id": "BR-CO-15",
"rule_location": "/*:CrossIndustryInvoice[namespace-uri()='urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100'][1]",
"rule_severity": "FATAL",
"rule_messages": [
"[BR-CO-15]-Invoice total amount with VAT (BT-112) = Invoice total amount without VAT (BT-109) + Invoice total VAT amount (BT-110)."
"name": "EN16931",
"version": "1.3.13",
"warnings": [],
"errors": [
{
"rule_id": "BR-CL-14",
"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]",
"rule_severity": "FATAL",
"rule_messages": [
"[BR-CL-14]-Country codes in an invoice MUST be coded using ISO code list 3166-1"
]
}
]
},
{
"rule_id": "BR-CL-04",
"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]",
"rule_severity": "FATAL",
"rule_messages": [
"[BR-CL-04]-Invoice currency code MUST be coded using ISO code list 4217 alpha-3"
]
"name": "Peppol BIS",
"version": "3.0",
"warnings": [],
"errors": []
}
],
"warnings": [],
"is_valid": false
}
```
Expand Down
61 changes: 19 additions & 42 deletions src/main/java/io/github/easybill/Dtos/ValidationResult.java
Original file line number Diff line number Diff line change
@@ -1,71 +1,48 @@
package io.github.easybill.Dtos;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.helger.schematron.svrl.jaxb.FailedAssert;
import com.helger.schematron.svrl.jaxb.SchematronOutputType;
import io.github.easybill.Dtos.ValidatorResults.ValidatorResult;
import io.github.easybill.Enums.XmlProfileType;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import org.checkerframework.checker.nullness.qual.NonNull;

public record ValidationResult(
@NonNull ValidationResultMetaData meta,
@NonNull List<@NonNull ValidationResultField> errors,
@NonNull List<@NonNull ValidationResultField> warnings
@JsonProperty("validation_results")
@NonNull
List<@NonNull ValidatorResult> validationResults
) {
public ValidationResult {
errors = Collections.unmodifiableList(errors);
warnings = Collections.unmodifiableList(warnings);
public ValidationResult(
@NonNull ValidationResultMetaData meta,
@JsonProperty(
"validation_results"
) @NonNull List<@NonNull ValidatorResult> validationResults
) {
this.meta = meta;
this.validationResults =
Collections.unmodifiableList(validationResults);
}

@JsonProperty("is_valid")
public boolean isValid() {
return errors.isEmpty();
return validationResults
.stream()
.allMatch(element -> element.getErrors().isEmpty());
}

public static ValidationResult of(
XmlProfileType xmlProfileType,
ValidationRequest validationRequest,
SchematronOutputType schematronOutputType
ValidatorResult... validatorResults
) {
return new ValidationResult(
new ValidationResultMetaData(
validationRequest.xmlSyntaxType(),
xmlProfileType
),
getErrorsFromSchematronOutput(schematronOutputType),
getWarningsFromSchematronOutput(schematronOutputType)
Arrays.stream(validatorResults).toList()
);
}

private static List<@NonNull ValidationResultField> getErrorsFromSchematronOutput(
@NonNull SchematronOutputType outputType
) {
return outputType
.getActivePatternAndFiredRuleAndFailedAssert()
.stream()
.filter(element -> element instanceof FailedAssert)
.filter(element ->
Objects.equals(((FailedAssert) element).getFlag(), "fatal")
)
.map(element -> (FailedAssert) element)
.map(ValidationResultField::fromFailedAssert)
.toList();
}

private static List<@NonNull ValidationResultField> getWarningsFromSchematronOutput(
@NonNull SchematronOutputType outputType
) {
return outputType
.getActivePatternAndFiredRuleAndFailedAssert()
.stream()
.filter(element -> element instanceof FailedAssert)
.filter(element ->
Objects.equals(((FailedAssert) element).getFlag(), "warning")
)
.map(element -> (FailedAssert) element)
.map(ValidationResultField::fromFailedAssert)
.toList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package io.github.easybill.Dtos.ValidatorResults;

import com.helger.schematron.svrl.jaxb.SchematronOutputType;
import io.github.easybill.Dtos.ValidationResultField;
import java.util.List;
import org.checkerframework.checker.nullness.qual.NonNull;

public final class EN16931ValidatorResult extends ValidatorResult {

public EN16931ValidatorResult(
@NonNull String name,
@NonNull String version,
@NonNull List<@NonNull ValidationResultField> errors,
@NonNull List<@NonNull ValidationResultField> warnings
) {
super(name, version, errors, warnings);
}

public static EN16931ValidatorResult of(
@NonNull SchematronOutputType report
) {
return new EN16931ValidatorResult(
"EN16931",
"1.3.13",
getErrorsFromSchematronOutput(report),
getWarningsFromSchematronOutput(report)
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package io.github.easybill.Dtos.ValidatorResults;

import com.helger.schematron.svrl.jaxb.SchematronOutputType;
import io.github.easybill.Dtos.ValidationResultField;
import java.util.List;
import org.checkerframework.checker.nullness.qual.NonNull;

public final class FacturXValidatorResult extends ValidatorResult {

public FacturXValidatorResult(
@NonNull String name,
@NonNull String version,
@NonNull List<@NonNull ValidationResultField> errors,
@NonNull List<@NonNull ValidationResultField> warnings
) {
super(name, version, errors, warnings);
}

public static FacturXValidatorResult of(
@NonNull SchematronOutputType report
) {
return new FacturXValidatorResult(
"factur-x",
"1.07.2",
getErrorsFromSchematronOutput(report),
getWarningsFromSchematronOutput(report)
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package io.github.easybill.Dtos.ValidatorResults;

import com.helger.schematron.svrl.jaxb.SchematronOutputType;
import io.github.easybill.Dtos.ValidationResultField;
import java.util.List;
import org.checkerframework.checker.nullness.qual.NonNull;

public final class PeppolValidatorResult extends ValidatorResult {

public PeppolValidatorResult(
@NonNull String name,
@NonNull String version,
@NonNull List<@NonNull ValidationResultField> errors,
@NonNull List<@NonNull ValidationResultField> warnings
) {
super(name, version, errors, warnings);
}

public static PeppolValidatorResult of(
@NonNull SchematronOutputType report
) {
return new PeppolValidatorResult(
"Peppol BIS",
"3.0",
getErrorsFromSchematronOutput(report),
getWarningsFromSchematronOutput(report)
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package io.github.easybill.Dtos.ValidatorResults;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.helger.schematron.svrl.jaxb.FailedAssert;
import com.helger.schematron.svrl.jaxb.SchematronOutputType;
import io.github.easybill.Dtos.ValidationResultField;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import org.checkerframework.checker.nullness.qual.NonNull;

public abstract class ValidatorResult {

@NonNull
private final String name;

@NonNull
private final String version;

@NonNull
private final List<@NonNull ValidationResultField> warnings;

@NonNull
private final List<@NonNull ValidationResultField> errors;

public ValidatorResult(
@JsonProperty("name") @NonNull String name,
@JsonProperty("artifact_version") @NonNull String version,
@NonNull List<@NonNull ValidationResultField> errors,
@NonNull List<@NonNull ValidationResultField> warnings
) {
this.name = name;
this.version = version;
this.errors = Collections.unmodifiableList(errors);
this.warnings = Collections.unmodifiableList(warnings);
}

static List<@NonNull ValidationResultField> getErrorsFromSchematronOutput(
@NonNull SchematronOutputType outputType
) {
return outputType
.getActivePatternAndFiredRuleAndFailedAssert()
.stream()
.filter(element -> element instanceof FailedAssert)
.filter(element ->
Objects.equals(((FailedAssert) element).getFlag(), "fatal")
)
.map(element -> (FailedAssert) element)
.map(ValidationResultField::fromFailedAssert)
.toList();
}

static List<@NonNull ValidationResultField> getWarningsFromSchematronOutput(
@NonNull SchematronOutputType outputType
) {
return outputType
.getActivePatternAndFiredRuleAndFailedAssert()
.stream()
.filter(element -> element instanceof FailedAssert)
.filter(element ->
Objects.equals(((FailedAssert) element).getFlag(), "warning")
)
.map(element -> (FailedAssert) element)
.map(ValidationResultField::fromFailedAssert)
.toList();
}

public @NonNull List<@NonNull ValidationResultField> getErrors() {
return errors;
}

public @NonNull List<@NonNull ValidationResultField> getWarnings() {
return warnings;
}

public @NonNull String getName() {
return name;
}

public @NonNull String getVersion() {
return version;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package io.github.easybill.Dtos.ValidatorResults;

import com.helger.schematron.svrl.jaxb.SchematronOutputType;
import io.github.easybill.Dtos.ValidationResultField;
import java.util.List;
import org.checkerframework.checker.nullness.qual.NonNull;

public final class XRechnungValidatorResult extends ValidatorResult {

public XRechnungValidatorResult(
@NonNull String name,
@NonNull String version,
@NonNull List<@NonNull ValidationResultField> errors,
@NonNull List<@NonNull ValidationResultField> warnings
) {
super(name, version, errors, warnings);
}

public static XRechnungValidatorResult of(
@NonNull SchematronOutputType report
) {
return new XRechnungValidatorResult(
"XRechnung",
"3.2",
getErrorsFromSchematronOutput(report),
getWarningsFromSchematronOutput(report)
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package io.github.easybill.Exceptions;

public class ValidationChainException extends ValidatorException {

public ValidationChainException() {
super();
}
}
Loading

0 comments on commit 60bf71b

Please sign in to comment.