diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index dcb87c955f6a9ac48226955cb7ee571d39695cca..fc53bf7f7acd4fc6247f670464a1a02596473e36 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -1,5 +1,8 @@ # Nemhandel e-Delivery Oxalis AS4 release notes +## 1.0.0 +Beta release of the Nemhandel e-Delivery Oxalis AS4 reference implementation based on Oxalis-AS4 5.5.0. + ## 0.9.0 Beta release of the Nemhandel e-Delivery Oxalis AS4 reference implementation based on Oxalis-AS4 5.5.0. diff --git a/docs/nemhandel-edelivery.md b/docs/nemhandel-edelivery.md new file mode 100644 index 0000000000000000000000000000000000000000..338243d6addfbfcd5e06012c293efb87d3bc5aa1 --- /dev/null +++ b/docs/nemhandel-edelivery.md @@ -0,0 +1,616 @@ +# NemHandel eDelivery connectivity + +>**NOTE: This BETA-version has a built-in end-of-life killswitch, which means it will stop working on september 30, 2023. See `EndOfLife` class for details.** + +This project includes a number of additions to the base oxalis-as4 both in terms of +facilitating NemHandel eDelivery connectivity, and modernizing the communication +between C1/C2 and C3/C4, respectively, in a traditional 4-corner model. + +Generally, all the new functionality is, as much as possible, added as classes under the `dk.erst.oxalis.as4` package +to separate it from the standard oxalis-as4 codebase. Some changes are necessary in the oxalis code itself, but we +strive to separate our code from oxalis' code, which simplifies pulling in upstream changes. To this end, there is a `NemHandelModule` which is +considered a "top-level" guice module for all additions to oxalis - meaning this module is the only module that is +directly configured in the `references.conf` module configuration, and our "sub-modules" are all installed via this +module. + +## Requirements +* Java 8 Update 252 or later (in order to support RSASSA-PSS signature algorithms used in MitID certificates) + +## 1 NemHandel eDelivery transport profile support +Oxalis has been extended with support for the transport profile `nemhandel-transport-as4-v2_0`. +The transport profile is defined in [reference.conf](../src/main/resources/reference.conf). +This transport profile is similar to Peppols `peppol-transport-as4-v2_0` transport profile in that it relies +on the same AS4 protocol for transmission. + +> **Note:** By default the `nemhandel-transport-as4-v2_0` transport profile is only enabled when +the Nemhandel e-Delivery Reference Access Point is started in Nemhandel mode. In this case, it will +be prioritized over Peppols `peppol-transport-as4-v2_0` transport profile. + +## 2 Oxalis improvements +This section contains a description of various improvements that have been made to the core Oxalis functionality. + +### 2.1 REST api +A REST api is exposed to facilitate both inbound and outbound message delivery - that is to +say C1 can send a message through the access point by calling the rest API, and C4 can +fetch incoming documents via the same REST api. The REST api is set up in the `ResteasyModule`. This REST api is implemented using the Resteasy library (which is an implementation of JAX-RS). Resteasy is integrated +with guice through the `ResteasyServlet`. + +The api is protected by simple HTTP basic authentication which allows for simple multi-tenancy. This is achieved +via a simple Servlet Filter `SecurityFilter` which handles the HTTP basic Authentication and validates the supplied +credentials against the Account table. Password storage/hashing uses PBKDF2-HMAC-SHA256 based on the recommendations +from OWASP (see `PasswordHasher` for details). + +The logic behind each api endpoint is implemented in a vertical fashion, meaning there is a handler class that is +specific to a given endpoint, which implements the logic required, see f.x. `SendSbdHandler`. This allows an easy +overview of what code is relevant for a given endpoint. + +The API is documented via OpenAPI 3.0 and is exposed at the following urls when running locally: +* OpenAPI Specification: http://localhost:8080/oxalis/openapi.json +* Swagger UI: http://localhost:8080/oxalis/openapi-ui + + + +### 2.2 Database and data model +To facilitate the REST api, a simple database has been introduced that stores inbound and outbound +messages, as well as account information. Out-of-the-box, the code is configured to use an in-memory H2 database, but can be changed +to use another database. + +> **_NOTE:_** We do not recommend using the H2 database in a production environment. See below for instructions how to switch +> to another database. + +The access point uses Liquibase to handle database schema changes. The database is automatically rolled forward on +application startup. To maximize database compatibility, we use Liquibase's XML-based changelog format. Currently, +Liquibase uses the same JDBC connection string and username/password as the running application, so it needs the proper +schema privileges to make changes to tables etc. + +In Liquibase, database changes are added as changesets that represents some change to the database schema. Each +changeset is an independent change to the schema, for example add a new table or add a new column to an existing table. +Changesets can be qualified with a context to facilitate changesets that should only run in specific situations (e.g. +environment-specific data or unit test data etc). +Currently, there are no environment-specific liquibase changesets (only for integration tests), but in case that will be +relevant later, the code is prepared to use Liquibase's contexts feature to allow qualifying which changesets to run. +See the Configuration section below for how to specify it for a given environment. + +Technically, Hibernate/JPA is used through the guice-persist module. This is configured in `JdbcModule`. +This allows us to work more logically with the data-model instead of raw JDBC Result sets. All entities inherits from +`AbstractEntity`, which handles equality/hashCode and audit columns. There is +an `AuditEntityListener` hooked up on the entity base class `AbstractEntity` which handles the +audit columns in all entities (created_by, created_date, updated_by, updated_date). + +The image below shows an ER diagram of the datamodel. + +![Oxalis ER-diagram](nemhandel-edelivery/oxalis-ER.png) + +A short description of each table is given below: + +| Table | Description | +|-----------------------|-------------------------------------------------------------------------------------------------------------------------------------------| +| Account | Table holding user accounts that can send/receive through the access point | +| Account_Receiver | Maps participant identifier to user accounts. This is used to match received documents to user accounts | +| Message | Holds metadata about the document being sent/received, including status of the message | +| Message_Content | Holds the actual content of a given document, both actual documents and receipts | +| databasechangelog | Liquibase system table that keeps track of which changesets have been applied to the database | +| databasechangeloglock | Liquibase system table which is used to handle concurrency and ensure only a single liquibase instance is updating the schema at the time | + + +### 2.3 Legacy file-based integration +> **_TODO:_** Not yet documented here. + +### 2.4 Configuration +Configuration of the additional features, e.g. database connection, is done through the oxalis.conf file +that you set up as part of an Oxalis installation. + +#### 2.4.1 Database connection +You can customize the database configuration if you do not want to use the in-memory +database. The following example shows how you can configure the system to use a MySQL database: +``` +jdbc { + url: jdbc:mysql:... + driver.class.name: com.mysql.cj.jdbc.Driver + user: db-user + password: foobar + hibernate.dialect: org.hibernate.dialect.MySQL8Dialect + # connection pool size + pool.size: 10 + # liquibase contexts (defaults to none) + liquibase.contexts: some-custom-contexts +} +``` + +A requirement for this to work is that you install the relevant JDBC driver (in this case MySQL) in Tomcat's lib +folder. It is possible to distribute the JDBC driver together with the Oxalis-AS4 plugin but this requires code changes, +as you have to register the JDBC-driver manually (like we do with the H2 JDBC driver in `JdbcModule`). This is due to +the way Oxalis-AS4 is loaded by tomcat in relation to the Oxalis war file. + +### 2.5 Validation +Messages can be validated using a `MessageValidator`. The default Message validator will perform inspection of the +message content to determine which document type the message contains (e.g. an Invoice or an Order). This is done using +a `DocumentTypeResolver` which will return a `DocumentTypeConfig` configuration object that specifies which XSD to use +for schema validation and which Schematron files (if any) to use for validation of the actual message content. + +The `DocumentTypeResolver` will attempt to detect the document type using the following +1. The namespace and local name of the root element of the payload (e.g. `urn:oasis:names:specification:ubl:schema:xsd:Invoice-2` and `Invoice` respectively) +2. Zero or more XPath-based "identifier discriminators". Each discriminator consists of and XPath expression and an expected value or regex pattern. This is often used to match on the `CustomizationID` element (e.g. `CustomizationID = OIOUBL-2.1`). +3. In special cases where the document type cannot be uniquely resolved by the above, we need to introduce a `ProfileID` element (e.g. `ProfileID = urn:fdc:peppol.eu:2017:poacc:billing:01:1.0`) + +> **Note:** If the document type cannot be uniquely resolved the validation will fail. Thus, care must be taken when +> configuring the document types to make sure they are distinct. + +The default supported document types are configured in the `reference.conf` file. The configuration for each document +type is loaded as a `DocumentTypeConfig` in the `DocumentTypeModule` and registered using a Guice multibinder. +An example of the configuration for an OIOUBL Invoice 2.1 is as follows +``` +document.type = { + peppolBISBillingCreditNote = { + friendlyName: "Peppol BIS Credit Note" + payloadRootLocalName: "CreditNote" + payloadRootNamespace: "urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2" + schemaPath: "META-INF/Schemas/UBL_v2.1/maindoc/UBL-CreditNote-2.1.xsd" + identifierDiscriminators = [ + { + xpathExpression: "/sbd:StandardBusinessDocument/root:CreditNote/cbc:CustomizationID" + xpathExpectedResult: "urn:cen\\.eu:en16931:2017#compliant#urn:fdc:peppol\\.eu:2017:poacc:billing:3\\.0" + }, + { + xpathExpression: "/sbd:StandardBusinessDocument/root:CreditNote/cbc:ProfileID" + xpathExpectedResult: "urn:fdc:peppol\\.eu:2017:poacc:billing:01:1\\.0" + + }] + namespaces = [ + { namespace: "http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader", prefix: "sbd" }, + { namespace: "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2", prefix: "cac" }, + { namespace: "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2", prefix: "cbc" }, + { namespace: "urn:oasis:names:specification:ubl:schema:xsd:CoreComponentParameters-2", prefix: "ccts" }, + { namespace: "urn:oasis:names:specification:ubl:schema:xsd:SpecializedDatatypes-2", prefix: "sdt"}, + { namespace: "urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2", prefix: "udt"}, + { namespace: "urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2", prefix: "root"} + ] + schematronDocuments = [ + { + schematronDocumentPath: "META-INF/Schematron/PEPPOL/CEN-EN16931-UBL.xslt" + errorXPath: "/svrl:schematron-output/svrl:failed-assert[@flag='fatal']" + errorMessageXPath: "svrl:text" + errorLocationXPath: "@location" + warningXPath: "/svrl:schematron-output/svrl:failed-assert[@flag='warning']" + warningMessageXPath: "svrl:text" + warningLocationXPath: "@location" + }, + { + schematronDocumentPath: "META-INF/Schematron/PEPPOL/PEPPOL-EN16931-UBL.xslt" + errorXPath: "/svrl:schematron-output/svrl:failed-assert[@flag='fatal']" + errorMessageXPath: "svrl:text" + errorLocationXPath: "@location" + warningXPath: "/svrl:schematron-output/svrl:failed-assert[@flag='warning']" + warningMessageXPath: "svrl:text" + warningLocationXPath: "@location" + }, + { + schematronDocumentPath: "META-INF/Schematron/PEPPOL/DK-EN16931-UBL.xslt" + errorXPath: "/svrl:schematron-output/svrl:failed-assert[@flag='fatal']" + errorMessageXPath: "svrl:text" + errorLocationXPath: "@location" + warningXPath: "/svrl:schematron-output/svrl:failed-assert[@flag='warning']" + warningMessageXPath: "svrl:text" + warningLocationXPath: "@location" + } + ] + } + + // other supported document types +} +``` +Once the document type has been determined the validation will perform schema (XSD) and schematron validation for the message. +Schematron validation will only be performed if the message passes schema validation. + +> **Note:** The schema and schematron validation will only be performed on the payload of the StandardBusinessDocument +> (e.g. an invoice or similar). + +For Schematron validation it is possible to configure one or more schematron stylesheets they will all be used during +validation. Additionally, for each schematron stylesheet the configuration will contain XPath expressions for +extracting errors and warnings from the resulting document. Note that it is optional to specify XPath expressions for +extracting warnings. + +#### 2.5.1 Adding additional document types +All that is needed to add validation support for additional document types is to create a custom Guice module which will +provide the relevant `DocumentTypeConfig` object(s). + +```java +package com.example.plugin.document.type; + +import com.google.inject.AbstractModule; + +public class AdditionalDocumentTypeModule extends AbstractModule { + @ProvidesIntoSet + DocumentTypeConfig provideAdditionalDocumentType1() { + DocumentTypeConfig cfg = new DocumentTypeConfig(); + // setup document type + return cfg; + } +} +``` + +In order to get oxalis to load this module include a `reference.conf` file in the `src/main/resources` folder with the +following content +``` +oxalis.module..class = com.example.plugin.document.type.AdditionalDocumentTypeModule +``` + +Package the code as a jar file and place the jar on the classpath for oxalis to load. + +#### 2.5.2 Supported document types +By default, the Nemhandel eDelivery reference Access Point supports the following document types in terms of schema and Schematron validation + +| Document type | Payload namespace | Payload local name | Identifier discriminitors | +|------------------------------------------------|-----------------------------------------------------------------------------------|------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| OIOUBL Reminder 2.1 | `urn:oasis:names:specification:ubl:schema:xsd:Reminder-2` | `Reminder` | `/sbd:StandardBusinessDocument/root:Reminder/cbc:CustomizationID` = `OIOUBL-2.(01|02|1)` | +| OIOUBL Utility Statement 2.1 | `urn:oasis:names:specification:ubl:schema:xsd:UtilityStatement-2` | `UtilityStatement` | `/sbd:StandardBusinessDocument/root:UtilityStatement/cbc:CustomizationID` = `OIOUBL-2.1` | +| OIOUBL Invoice 2.1 | `urn:oasis:names:specification:ubl:schema:xsd:Invoice-2` | `Invoice` | `/sbd:StandardBusinessDocument/root:Invoice/cbc:CustomizationID` = `OIOUBL-2.(01|02|1)` | +| OIOUBL Credit Note 2.1 | `urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2` | `CreditNote` | `/sbd:StandardBusinessDocument/root:CreditNote/cbc:CustomizationID` = `OIOUBL-2.(01|02|1)` | +| OIOUBL Application Response 2.1 | `urn:oasis:names:specification:ubl:schema:xsd:ApplicationResponse-2` | `ApplicationResponse` | `/sbd:StandardBusinessDocument/root:ApplicationResponse/cbc:CustomizationID` = `OIOUBL-2.(01|02|1)` | +| OIOUBL Statement 2.1 | `urn:oasis:names:specification:ubl:schema:xsd:Statement-2` | `Statement` | `/sbd:StandardBusinessDocument/root:Statement/cbc:CustomizationID` = `OIOUBL-2.(01|02|1)` | +| OIOUBL Order 2.1 | `urn:oasis:names:specification:ubl:schema:xsd:Order-2` | `Order` | `/sbd:StandardBusinessDocument/root:Order/cbc:CustomizationID` = `OIOUBL-2.(01|02|1)` | +| OIOUBL Order Response Simple 2.1 | `urn:oasis:names:specification:ubl:schema:xsd:OrderResponseSimple-2` | `OrderResponseSimple` | `/sbd:StandardBusinessDocument/root:OrderResponseSimple/cbc:CustomizationID` = `OIOUBL-2.(01|02|1)` | +| OIOUBL Order Response 2.1 | `urn:oasis:names:specification:ubl:schema:xsd:OrderResponse-2` | `OrderResponse` | `/sbd:StandardBusinessDocument/root:OrderResponse/cbc:CustomizationID` = `OIOUBL-2.(01|02|1)` | +| OIOUBL Order Cancellation 2.1 | `urn:oasis:names:specification:ubl:schema:xsd:OrderCancellation-2` | `OrderCancellation` | `/sbd:StandardBusinessDocument/root:OrderCancellation/cbc:CustomizationID` = `OIOUBL-2.(01|02|1)` | +| OIOUBL Order Change 2.1 | `urn:oasis:names:specification:ubl:schema:xsd:OrderChange-2` | `OrderChange` | `/sbd:StandardBusinessDocument/root:OrderChange/cbc:CustomizationID` = `OIOUBL-2.(01|02|1)` | +| OIOUBL Catalogue 2.1 | `urn:oasis:names:specification:ubl:schema:xsd:Catalogue-2` | `Catalogue` | `/sbd:StandardBusinessDocument/root:Catalogue/cbc:CustomizationID` = `OIOUBL-2.(01|02|1)` | +| OIOUBL Cataloge Deletion 2.1 | `urn:oasis:names:specification:ubl:schema:xsd:CatalogueDeletion-2` | `CatalogueDeletion` | `/sbd:StandardBusinessDocument/root:CatalogueDeletion/cbc:CustomizationID` = `OIOUBL-2.(01|02|1)` | +| OIOUBL Catalogue Request 2.1 | `urn:oasis:names:specification:ubl:schema:xsd:CatalogueRequest-2` | `CatalogueRequest` | `/sbd:StandardBusinessDocument/root:CatalogueRequest/cbc:CustomizationID` = `OIOUBL-2.(01|02|1)` | +| OIOUBL Catalogue Item Specification Update 2.1 | `urn:oasis:names:specification:ubl:schema:xsd:CatalogueItemSpecificationUpdate-2` | `CatalogueItemSpecificationUpdate` | `/sbd:StandardBusinessDocument/root:CatalogueItemSpecificationUpdate/cbc:CustomizationID` = `OIOUBL-2.(01|02|1)` | +| OIOUBL Catalogue Pricing Update 2.1 | `urn:oasis:names:specification:ubl:schema:xsd:CataloguePricingUpdate-2` | `CataloguePricingUpdate` | `/sbd:StandardBusinessDocument/root:CataloguePricingUpdate/cbc:CustomizationID` = `OIOUBL-2.(01|02|1)` | +| DK Peppol Catalogue Pricing Update | `urn:oasis:names:specification:ubl:schema:xsd:CataloguePricingUpdate-2` | `CataloguePricingUpdate` | `/sbd:StandardBusinessDocument/root:CataloguePricingUpdate/cbc:CustomizationID` = `urn:fdc:peppol.eu:poacc:trns:cataloguepricingupdate:3` | +| DK Peppol Catalogue Update Response | `urn:oasis:names:specification:ubl:schema:xsd:ApplicationResponse-2` | `ApplicationResponse` | `/sbd:StandardBusinessDocument/root:ApplicationResponse/cbc:CustomizationID` = `urn:fdc:peppol.eu:poacc:trns:catalogue_update_response:3` | +| DK Peppol Order Agreement | `urn:oasis:names:specification:ubl:schema:xsd:OrderResponse-2` | `OrderResponse` | `/sbd:StandardBusinessDocument/root:OrderResponse/cbc:CustomizationID` = `urn:fdc:peppol.eu:poacc:trns:order_agreement:3` | +| DK Peppol Order Agreement Response | `urn:oasis:names:specification:ubl:schema:xsd:ApplicationResponse-2` | `ApplicationResponse` | `/sbd:StandardBusinessDocument/root:ApplicationResponse/cbc:CustomizationID` = `urn:fdc:peppol.eu:poacc:trns:order_agreement_response:3` | +| OIOUBL Reminder 3.0 | `urn:oasis:names:specification:ubl:schema:xsd:Invoice-2` | `Invoice` | `/sbd:StandardBusinessDocument/root:Invoice/cbc:CustomizationID` = `urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0#conformant#urn:fdc:oioubl.dk:2020:oioubl:reminder:3.0` | +| OIOUBL Simplified Invoice 3.0 | `urn:oasis:names:specification:ubl:schema:xsd:Invoice-2` | `Invoice` | `/sbd:StandardBusinessDocument/root:Invoice/cbc:CustomizationID` = `urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0#conformant#urn:fdc:oioubl.dk:2020:oioubl:simplifiedinvoice:3.0` | +| OIOUBL Invoice Response Transaction 3.0 | `urn:oasis:names:specification:ubl:schema:xsd:ApplicationResponse-2` | `ApplicationResponse` | `/sbd:StandardBusinessDocument/root:ApplicationResponse/cbc:CustomizationID` = `urn:fdc:peppol.eu:poacc:trns:invoice_response:3` | +| OIOUBL Message Level Response Transaction 3.0 | `urn:oasis:names:specification:ubl:schema:xsd:ApplicationResponse-2` | `ApplicationResponse` | `/sbd:StandardBusinessDocument/root:ApplicationResponse/cbc:CustomizationID` = `urn:fdc:peppol.eu:poacc:trns:mlr:3` | +| Peppol BIS Billing - Invoice | `urn:oasis:names:specification:ubl:schema:xsd:Invoice-2` | `Invoice` | `/sbd:StandardBusinessDocument/root:Invoice/cbc:CustomizationID` = `urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0` in conjunction with `/sbd:StandardBusinessDocument/root:Invoice/cbc:ProfileID` = `urn:fdc:peppol.eu:2017:poacc:billing:01:1.0` | +| Peppol BIS Billing - Credit Note | `urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2` | `CreditNote` | `/sbd:StandardBusinessDocument/root:CreditNote/cbc:CustomizationID` = `urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0` in conjunction with `/sbd:StandardBusinessDocument/root:CreditNote/cbc:ProfileID` = `urn:fdc:peppol.eu:2017:poacc:billing:01:1.0` | +| Peppol Catalogue | `urn:oasis:names:specification:ubl:schema:xsd:Catalogue-2` | `Catalogue` | `/sbd:StandardBusinessDocument/root:Catalogue/cbc:CustomizationID` = `urn:fdc:peppol.eu:poacc:trns:catalogue:3` | +| Peppol Catalogue Response | `urn:oasis:names:specification:ubl:schema:xsd:ApplicationResponse-2` | `ApplicationResponse` | `/sbd:StandardBusinessDocument/root:ApplicationResponse/cbc:CustomizationID` = `urn:fdc:peppol.eu:poacc:trns:catalogue_response:3` | +| Peppol Order | `urn:oasis:names:specification:ubl:schema:xsd:Order-2` | `Order` | `/sbd:StandardBusinessDocument/root:Order/cbc:CustomizationID` = `urn:fdc:peppol.eu:poacc:trns:order:3` | +| Peppol Order Response | `urn:oasis:names:specification:ubl:schema:xsd:OrderResponse-2` | `OrderResponse` | `/sbd:StandardBusinessDocument/root:OrderResponse/cbc:CustomizationID` = `urn:fdc:peppol.eu:poacc:trns:order_agreement:3` | +| Peppol Despatch Advice | `urn:oasis:names:specification:ubl:schema:xsd:DespatchAdvice-2` | `DespatchAdvice` | `/sbd:StandardBusinessDocument/root:DespatchAdvice/cbc:CustomizationID` = `urn:fdc:peppol.eu:poacc:trns:despatch_advice:3` | +| Peppol Punch Out | `urn:oasis:names:specification:ubl:schema:xsd:Catalogue-2` | `Catalogue` | `/sbd:StandardBusinessDocument/root:Catalogue/cbc:CustomizationID` = `urn:fdc:peppol.eu:poacc:trns:punch_out:3` | +| Peppol Order Change | `urn:oasis:names:specification:ubl:schema:xsd:OrderChange-2` | `OrderChange` | `/sbd:StandardBusinessDocument/root:OrderChange/cbc:CustomizationID` = `urn:fdc:peppol.eu:poacc:trns:order_change:3` | +| Peppol Order Cancellation | `urn:oasis:names:specification:ubl:schema:xsd:OrderCancellation-2` | `OrderCancellation` | `/sbd:StandardBusinessDocument/root:OrderCancellation/cbc:CustomizationID` = `urn:fdc:peppol.eu:poacc:trns:order_cancellation:3` | + +For additional information regarding the XSD and schematron files used for these document types see the configuration in `reference.conf`. + +### 2.6 Support for MitID system certificates by mode detection +Oxalis come with a mode concept, which defines a number of properties for the trust store, certificate validation, etc. In this context, certificate validation is a recipe for which validations must take place on or certificates that are used in AP management (i.e. AS4 transport) and in SMP management (i.e. in connection with SMP). These performs issuer check, certificate expiration, certificate chains (root and intermediate CA), CRL, OCSP, etc. + +There are two modes TEST mode and a PRODUCTION mode. Both of these built-in modes are for Peppol certificates and the primary difference is that TEST mode supports Peppol test certificates and PRODUCTION mode supports Peppol production certificates.  +At startup, Oxalis will automatically detect the active mode based on the certificate configured by the AP. + +Since the reference AP is configured in either "Peppol mode" or "Nemhandel mode”, we need to introduce two new TEST and PRODUCTION modes to support Nemhandel mode. NEMHANDEL_TEST and NEMHANDEL_PRODUCTION. + +NEMHANDEL_TEST will support MitID test certificates (which are issued by MitID's test CA) and NEMHANDEL_PRODUCTION will support certificates issued by MitID's production CA. Like the built-in Peppol modes, Nemhandel modes will also perform CRL checks. + +### 2.7 Nemhandel e-Delivery signature (ASiC-E) +When starting the Oxalis Reference AP in Nemhandel e-Delivery mode (`NEMHANDEL_TEST` or `NEMHANDEL_PRODUCTION`) messages are expected to be signed using ASiC-E containers. +An ASiC-E container is basically a ZIP file containing the documents to be signed as well as the signatures and metadata. An ASiC-E container can be signed in various "formats" but Nemhandel e-Delivery uses the XAdES format. + +The ASiC-E container containing the signature must be placed in the Standard Business Document Header under the `` element with the type `NEMHANDEL_EDELIVERY_SIGNATURE`. The content of the ASiC-E container should be Base64 encoded and placed in the `` element like the following snippet: +```xml + + + ... + ... + ... + ... + + + DOCUMENTID + ... + + + PROCESSID + ... + + + NEMHANDEL_EDELIVERY_SIGNATURE + + + + + ... + +``` +> Note: there should only be one `NEMHANDEL_EDELIVERY_SIGNATURE` scope in a given SBD. + +The contents of the ASiC-E container is expected to be the following: +``` +asic-container.asice: + | + +-- mimetype + | + +-- standard-business-document.xml (2) + | + +-- original-standard-business-document.xml (3) + | + +-- transfer-delegation.xml (4) + | + +-- META-INF/ + | + +-- manifest.xml + | + +-- signatures001.xml (1) +``` +The following files are of specific interest: +1. The actual signature of the ASiC-E container is contained in this file. An ASiC-E container may contain multiple signatures though we only require one, which must include the following 3 files (1 optional). +2. The Standard Business Document (SBD) to be signed (thus this is excluding the ASiC-E container). This is the file that Corner X will send to Corner X+1. +3. The full "original" Standard Business Document including the ASiC-E container which has been received from Corner X-1. Note that for Corner 1 this file is optional in case this corner is responsible for generating the original SBD. For C2 this file should only be included if C1's SBD is signed! +4. A transfer delegation documents the intention of Corner X to transfer the SBD to Corner X+1. + +> Note: C1 is currently allowed to send unsigned SBDs through the C2 `/outbox` REST API. If C1 sends an unsigned SBD it will **_not_** be included in the ASiC-E container as `original-standard-business-document.xml`, because its contents cannot be trusted by C3 and C4 anyway. +> If C1 sends a signed SBD, C2 will include it as `original-standard-business-document.xml`. For C3, a document signature is required so C2 must always sign the document before sending it to C3 regardless C1s signature. At some point in the future C1 will be required to sign the SBD as well. + +Each Corner X will effectively have to resign the standard business document since it must at least produce a new transfer delegation between itself and Corner X+1. +Further, if Corner X wants to transform/convert the SBD in any way it must also resign the resulting document. +This includes producing and including a new ASiC-E container which must include the raw original SBD (including the ASiC-E container from Corner X-1). + +This is illustrated in the following figure: +![Nemhandel e-Delivery signature - resign example](nemhandel-edelivery/nemhandel-signature-resign-example.png) + +The Nemhandel e-Delivery signature will be recursively validated. As an example consider validation (by C3) of the C2 SBD (righthand side of the above figure. We assume that C1 has also signed the SBD). +First C2's ASiC-E container will be validated. Since C2's ASiC-E container contains `original-standard-business-document.xml` (C1's SBD) then the ASiC-E container of this document will be validated as well and so on until all nested ASiC-E containers have been validated. + +The following is a rough sketch of the algorithm used to validate this container + +1. Verify integrity of ASiC-E container + 1. Verify the signature + 2. Verify the signature certificate is a valid MitID certificate +2. Verify ASiC-E container contains the required files: + 1. standard-business-document.xml + 2. transfer-delegation.xml +3. Verify standard-business-document.xml matches SBD (minus the ASiC-E container). Example: this will verify the C2 SBD on the righthand side of the above figure (red text) minus the `NEMHANDEL_EDELIVERY_SIGNATURE` Scope element, matches the content of standard-business-document.xml +4. Verify transfer-delegation.xml +5. If original-standard-business-document.xml is present, perform step 1-5 on that document as well. + +The [Digital Signature Service (DSS)](https://github.com/esig/dss) framework is used both in the creation and validation of the ASiC-E containers (specifically the dss-asic-xades submodule of the framework). + + +#### 2.7.1 Signature certificates +The certificates used to in the creation of a Nemhandel e-Delivery signature must be valid MitID certificates (FOCES3). +That is they must be issued by the appropriate Certificate Authority and they must contain a CVR-number. For MitID certificates the CVR-number can be found in the Organization Identifier (OID.2.5.4.97) attribute of the subject. +See the truststores with the relevant CA certificates in [src/main/resources/truststore](../src/main/resources/truststore). + +In terms of the Nemhandel e-Delivery reference AP, the signature creation will use the private key of the AP's configured certificate. +As mentioned previously, the two added modes NEMHANDEL_TEST and NEMHANDEL_PRODUCTION are only applicable when the AP is configured +to use a MitID certificate. + + +#### 2.7.2 Transfer delegation +A transfer delegation describes Corner X's intention of transferring a standard business document to the next Corner X+1. +Thus, it only covers the transfer between two consecutive Corners and then a new transfer delegation will cover the transfer between the next two Corners. + +It is an XML document containing information about a sender and a receiver. +The following is an example of a transfer delegation from CVR 12345678 to CVR 98765432. +```xml + + + 12345678 + 98765432 + +``` + +Currently, both the sender and the receiver must be identified by a CVR number, thus only `SchemeID = DK:CVR` is supported. + +When validating a transfer delegation at a given recursion level, the sender CVR must match the CVR number of the MitID certificate used to sign the ASiC-E container at that level. +This serves to prove that transfer delegation is, in fact, created by the sender (and thus can be trusted) because only the actual sender (as per CVR) will be able to sign the ASiC-E container (and thus also the transfer delegation) with a valid MitID certificate containing that CVR. + +Further, for the top-level transfer delegation (recursion level 0) the receiver of the transfer delegation must match the CVR number of the MitID certificate which is configured for the access point. +This check is intended to verify that the access point is the intended receiver of the standard business document. +For non-top-level transfer delegations (recursion level > 0) the receiver of the transfer delegation should match the CVR number of the signing certificate for the ASiC-E container and the sender CVR number of the previous recursion level (because the validation is going in top-down order). +This ensures that transfer delegation "chain" is unbroken and no unexpected CVR number appears in the chain. + +### 2.8 Asynchronous processing +In order to facilitate Message Level Responses regarding validation errors in C3, Oxalis has been extended with support for asynchronous processing of messages. +Further, the validation has been split into a "synchronous" and "asynchronous" part. + +| Validation type | Validations | +|-----------------|--------------------------------------------| +| Synchronous | Schema (XSD) | +| Asynchronous | Schematron, Nemhandel e-Delivery signature | + +> **Note:** The split of the validation only affects the processing when receiving messages (C3). When sending messages (C2) the Oxalis reference AP will perform all validations synchronously. + +Initially, a simple thread-based asynchronous processing model has been implemented. +There are plans to implement support for more robust mechanisms for asynchronous processing later. + +#### 2.8.1 Simple asynchronous processing (thread-based) +The simple asynchronous processing mechanism is based on the java ExecutorService interface. +During startup the Oxalis Reference AP will create a thread-pool-based ExecutorService of a configurable size. +This ExecutorService maintains a queue of asynchronous processing tasks and will execute these as threads are available in its thread-pool. + +> **NOTE:** the simple asynchronous processing mechanism is *neither* persistent nor durable. +> Further, it contains only very limited error handling and there is no failure recovery or retry functionality. +> If errors do occur, we will do our best to mark messages with an ERROR status but even this may fail in extreme cases. + + +The simple asynchronous processing is configurable using the following properties. + +| Property | Type | Purpose | +|---------------------------------------------|--------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| async.executor.pool.size.core | Number | The core number of threads in the thread-pool | +| async.executor.pool.keep.alive.time.ms | Number | The time (in ms) to keep idle threads alive waiting for new tasks before they are terminated (when the thread-pool has more than the core number of threads) | +| async.executor.graceful.shutdown.timeout.ms | Number | The time (in ms) to wait for termination of in-progress tasks, after a shutdown has been requested, before forcefully shutting down the ExecutorService (including all threads in the pool). | +| async.executor.runnable.factory | String | The named Guice binding for the implementation of the [AsyncProcessingRunnableFactory](../src/main/java/dk/erst/oxalis/as4/async/AsyncProcessingRunnableFactory.java) interface to use for instantiating tasks (e.g. instances of the `Runnable` interface). Use this to override the default asynchronous processing. | + +The default values for these can be seen in [ExecutorServiceConf](../src/main/java/dk/erst/oxalis/as4/async/ExecutorServiceConf.java). + +When a new message is received via the AS4 protocol, the Oxalis Reference AP will perform the "synchronous" part of the validation and save the message in the database. +If the message is ok according to this validation, the message will be marked with status PROCESSING and finally be queued for asynchronous processing before a AS4 response is returned to C2. + +The asynchronous processing will start once the task reaches the front of the queue and a thread becomes available. The default asynchronous processing will include the following steps + +1. Perform the "asynchronous" part of the message validation +2. Update message status based on validation result +3. If no validation errors (only in Nemhandel Mode) + 1. Create transport delegation for C3 -> C4 + 2. Resign document (i.e. create Nemhandel e-Delivery signature) + 3. Save the resigned document +4. Generate and send an appropriate Message Level Response back to C2 if necessary + +For implementation details please refer to [AsyncProcessingRunnable](../src/main/java/dk/erst/oxalis/as4/async/AsyncProcessingRunnable.java). + +#### 2.8.2 Overriding the default asynchronous processing (thread-based) +The asynchronous processing mechanism can be overridden using the `async.executor.runnable.factory` configuration property mentioned above. + +First, create your custom implementation of the `Runnable` interface. +```java +public class CustomRunnable implements Runnable { + // your custom async processing implementation +} +``` + +Next, create a custom implementation of the `AsyncProcessingRunnableFactory` interface which instantiates your `CustomRunnable` for a given message. + +```java +public class CustomAsyncProcessingFactory implements AsyncProcessingRunnableFactory { + + private final Injector injector; + + public CustomAsyncProcessingFactory(Injector injector) { + this.injector = injector; + } + + @Override + public Runnable createRunnable(String messageUuid) { + return new CustomRunnable(injector, messageUuid); + } +} +``` +You are free to inject any registered Guice bindings into your `AsyncProcessingRunnableFactory` and provide these to your `CustomRunnable` - the above example just provides the full Guice `Injector` to the `CustomRunnable`. + +> NOTE: When using JPA in your `CustomRunnable` take care to handle the EntityManager properly. +> Prefer to use a thread-local EntityManager and perform the appropriate cleanup when your `CustomRunnable` terminates. + +Next, create a new Guice module which registers a named binding for the `CustomAsyncProcessingFactory`. The example below uses a +`@Provides` method, but the binding DSL can also be used if preferred. + +```java +public class CustomAsyncProcessingModule extends AbstractModule { + + @Provides + @Singleton + @Named("custom-async-factory") + AsyncProcessingRunnableFactory customAsyncProcessingFactory(Injector injector) { + return new CustomAsyncProcessingFactory(injector); + } +} +``` +> NOTE: the example uses the name `custom-async-factory` for the binding, but you can use whichever name you like. + +In order to get Oxalis to load this module, include a `reference.conf` file in the `src/main/resources` folder with the +following content +```properties +# the can be whatever your prefer your module to be called +oxalis.module..class = com.example.CustomAsyncProcessingModule +``` +Package the code as a jar file and place the jar on the classpath for Oxalis to load. + +Finally, configure the simple asynchronous processing mechanism in your `${OXALIS_HOME}\oxalis.conf` file using the +name of the binding from the module. +```properties +async.executor.runnable.factory = custom-async-factory +``` +The `CustomAsyncProcessingFactory` should now be used at runtime to create asynchronous processing tasks. +Thus, messages will be asynchronously processed using the `CustomRunnable` implementation instead of the default [AsyncProcessingRunnable](../src/main/java/dk/erst/oxalis/as4/async/AsyncProcessingRunnable.java) implementation. + +#### 2.8.3 Message Level Response +In the event of validation errors during the asynchronous processing, the AP will generate a Message Level Response which will be sent back to the sender of the document. +A Message Level Response will list all validation errors as well as reference the id of the original document. + +> NOTE: currently, no message level response is sent for documents which contain no validation errors. + +An example of an (unsigned) message level response is shown here: +```xml + + + + 1.0 + + 0184:22334455 + + + 0184:12345678 + + + urn:oasis:names:specification:ubl:schema:xsd:ApplicationResponse-2 + 2.1 + 76ce2330-39b2-412d-a76c-02dbc6164066 + ApplicationResponse + 2023-03-09T08:16:37.216+01:00 + + + + DOCUMENTID + urn:oasis:names:specification:ubl:schema:xsd:ApplicationResponse-2::ApplicationResponse##urn:fdc:peppol.eu:poacc:trns:mlr:3::2.1 + + + PROCESSID + urn:fdc:peppol.eu:poacc:bis:mlr:3 + + + + + urn:fdc:peppol.eu:poacc:trns:mlr:3 + urn:fdc:peppol.eu:poacc:bis:mlr:3 + 76ce2330-39b2-412d-a76c-02dbc6164066 + 2023-03-09 + 08:16:37+01:00 + + 22334455 + + + 12345678 + + + + RE + Document rejected due to validation errors + + + a2806f03-57d6-4aa1-b1fe-907f3a024bb1 + 1 + 2 + + + + /sbd:StandardBusinessDocument/sbd:StandardBusinessDocumentHeader/sbd:BusinessScope/sbd:Scope[sbd:Type='NEMHANDEL_EDELIVERY_SIGNATURE']/sbd:InstanceIdentifier + + + RE + E-REF21001: No Nemhandel e-Delivery documentsignature found for level 0 + + BV + + + + + + +``` + +The `DocumentReference/ID` element contains the id of the original document to which the message level response corresponds and the `LineResponse` elements lists the individual validation errors. + +Since a message level response is a new document, it is subject to the same requirements as all other documents in Nemhandel e-Delivery. That is, it must pass schema and schematron validation and be signed according to the description in [Nemhandel e-Delivery Signature (ASiC-E)](#27-nemhandel-e-delivery-signature-asic-e). + +#### 2.8.4 OIOUBL Application Response +The Message Level Response mentioned in the previous section is converted to an OIOUBL Application Response if the "original" +document is a OIOUBL document (e.g. an OIOUBL Invoice). For details regarding which response type is used for a specific document type, +please refer to the `messageLevelResponseType` configuration property for each document type. + +The conversion is performed using the [MLR_2_OIOUBL_ApplicationResponse](../src/main/resources/META-INF/Conversion/MLR_2_OIOUBL_ApplicationResponse.xslt) XSLT. + +### 2.9 Receiver exceptions +If an error occurs on the receiver side during reception of the SOAP message, exceptions will be thrown. Oxalis +automatically wraps these in an ebMS 3.0-compliant SoapFault. This is also utilized for exceptions thrown by NemHandel +eDelivery code, specifically the synchronous part. That is to say, if an exception occurs while processing the message +synchronously (e.g. XSD schema validation error, database connection issue or similar) we throw a proper +`IOException` from `NemHandelPersister` since these are automatically converted to an ebMS 3.0-compliant SoapFault +with error code `EBMS:0004`. \ No newline at end of file diff --git a/docs/nemhandel-edelivery/nemhandel-signature-resign-example.png b/docs/nemhandel-edelivery/nemhandel-signature-resign-example.png new file mode 100644 index 0000000000000000000000000000000000000000..78306ddb22e614ac6826de483f586d275e6830e6 Binary files /dev/null and b/docs/nemhandel-edelivery/nemhandel-signature-resign-example.png differ diff --git a/docs/nemhandel-edelivery/oxalis-ER.png b/docs/nemhandel-edelivery/oxalis-ER.png new file mode 100644 index 0000000000000000000000000000000000000000..5dba723d698f4d7e30a7c5fcea49316cd6696327 Binary files /dev/null and b/docs/nemhandel-edelivery/oxalis-ER.png differ diff --git a/docs/nemhandel-edelivery/oxalis-er-diagram.png b/docs/nemhandel-edelivery/oxalis-er-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..f58e5c7a038c9261fe2b21fe6d353a7c8bb09a00 Binary files /dev/null and b/docs/nemhandel-edelivery/oxalis-er-diagram.png differ diff --git a/pom.xml b/pom.xml old mode 100644 new mode 100755 index 097feb9391468d92a51ac7451de2982c3d396003..38928b747c49b43e0ac84d60639a14cd4edcf7ba --- a/pom.xml +++ b/pom.xml @@ -27,12 +27,12 @@ dk.erst.oxalis oxalis - 0.9.0-e2f4121ccb55b5a60e6edebf7b28d277741d6789 + 1.0.0-6a1c94c4e7428416dff7cecbe2ab1305e56fc33b dk.erst.oxalis oxalis-as4 - 0.9.0 + 1.0.0 jar Oxalis :: AS4 Extension adding Nemhandel e-Delivery AS4 support to Oxalis diff --git a/src/main/java/dk/erst/oxalis/as4/config/documenttype/DocumentTypeModule.java b/src/main/java/dk/erst/oxalis/as4/config/documenttype/DocumentTypeModule.java index 2d416fa0dc39281dd1357b702a5fde328d363178..3360f39ca28f9341286ad3b5cd493272e94e2cca 100644 --- a/src/main/java/dk/erst/oxalis/as4/config/documenttype/DocumentTypeModule.java +++ b/src/main/java/dk/erst/oxalis/as4/config/documenttype/DocumentTypeModule.java @@ -191,4 +191,13 @@ public class DocumentTypeModule extends AbstractModule { return ConfigBeanFactory.create(config.getConfig("document.type.peppolPunchOut"), DocumentTypeConfig.class); } + @ProvidesIntoSet + DocumentTypeConfig providePeppolOrderChangeConfig(Config config) { + return ConfigBeanFactory.create(config.getConfig("document.type.peppolOrderChange"), DocumentTypeConfig.class); + } + + @ProvidesIntoSet + DocumentTypeConfig providePeppolOrderCancellationConfig(Config config) { + return ConfigBeanFactory.create(config.getConfig("document.type.peppolOrderCancellation"), DocumentTypeConfig.class); + } } diff --git a/src/main/resources/META-INF/Schematron/PEPPOL/PEPPOLBIS-T114.xslt b/src/main/resources/META-INF/Schematron/PEPPOL/PEPPOLBIS-T114.xslt new file mode 100644 index 0000000000000000000000000000000000000000..6705aaa180b9d812e1552f7a36de91819a836acf --- /dev/null +++ b/src/main/resources/META-INF/Schematron/PEPPOL/PEPPOLBIS-T114.xslt @@ -0,0 +1,7703 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + + + + + + + + + + + + + + + + ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + / + + + + + + *: + + [namespace-uri()=' + + '] + + + + [ + + ] + + + + / + + @ + + + @*[local-name()=' + + ' and namespace-uri()=' + + '] + + + + + + + + / + + + [ + + ] + + + + /@ + + + + + + + / + + + [ + + ] + + + + /@ + + + + + + + + + + + + + + + + + + + + + + + . + + + + U + + U + + + + U. + + n + + + + U. + + _ + + _ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Rules for PEPPOL Order Change transaction 3.0 + + + + + + + + + + PEPPOL-COMMON-R001 + fatal + + + + Document MUST not contain empty elements. + + + + + + + + + + + + + + + + + + + PEPPOL-COMMON-R003 + warning + + + + Document SHOULD not contain schema location. + + + + + + + + + + + + + + PEPPOL-COMMON-R030 + fatal + + + + A date must be formatted YYYY-MM-DD. + + + + + + + + + + + + + + PEPPOL-COMMON-R040 + fatal + + + + GLN must have a valid format according to GS1 rules. + + + + + + + + + + + + + + PEPPOL-COMMON-R041 + fatal + + + + Norwegian organization number MUST be stated in the correct format. + + + + + + + + + + + + + + PEPPOL-COMMON-R043 + fatal + + + + Belgian enterprise number MUST be stated in the correct format. + + + + + + + + + + + + + + PEPPOL-COMMON-R044 + warning + + + + IPA Code (Codice Univoco Unità Organizzativa) must be stated in the correct format + + + + + + + + + + + + + + PEPPOL-COMMON-R045 + warning + + + + Tax Code (Codice Fiscale) must be stated in the correct format + + + + + + + + + + + + + + PEPPOL-COMMON-R046 + warning + + + + Tax Code (Codice Fiscale) must be stated in the correct format + + + + + + + + + + + + + + PEPPOL-COMMON-R047 + warning + + + + Italian VAT Code (Partita Iva) must be stated in the correct format + + + + + + + + + + + + + + PEPPOL-COMMON-R048 + warning + + + + Italian VAT Code (Partita Iva) must be stated in the correct format + + + + + + + + + + + + + + PEPPOL-COMMON-R049 + fatal + + + + Swedish organization number MUST be stated in the correct format. + + + + + + + + + + + + + + PEPPOL-COMMON-R050 + fatal + + + + Australian Business Number (ABN) MUST be stated in the correct format. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B00101 + fatal + + + + Element 'cbc:CustomizationID' MUST be provided. + + + + + + + + + PEPPOL-T114-B00102 + fatal + + + + Element 'cbc:ProfileID' MUST be provided. + + + + + + + + + PEPPOL-T114-B00103 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + PEPPOL-T114-B00104 + fatal + + + + Element 'cbc:IssueDate' MUST be provided. + + + + + + + + + PEPPOL-T114-B00105 + fatal + + + + Element 'cbc:DocumentCurrencyCode' MUST be provided. + + + + + + + + + PEPPOL-T114-B00106 + fatal + + + + Element 'cac:OrderReference' MUST be provided. + + + + + + + + + PEPPOL-T114-B00107 + fatal + + + + Element 'cac:BuyerCustomerParty' MUST be provided. + + + + + + + + + PEPPOL-T114-B00108 + fatal + + + + Element 'cac:SellerSupplierParty' MUST be provided. + + + + + + + + + PEPPOL-T114-B00109 + fatal + + + + Element 'cac:OrderLine' MUST be provided. + + + + + + + + + PEPPOL-T114-B00110 + fatal + + + + Document MUST not contain schema location. + + + + + + + + + + + + + + PEPPOL-T114-B00201 + fatal + + + + Element 'cbc:CustomizationID' MUST contain value 'urn:fdc:peppol.eu:poacc:trns:order_change:3'. + + + + + + + + + + + + + + PEPPOL-T114-B00301 + fatal + + + + Element 'cbc:ProfileID' MUST contain value 'urn:fdc:peppol.eu:poacc:bis:advanced_ordering:3'. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B01001 + fatal + + + + Value MUST be part of code list 'Currency codes (ISO 4217)'. + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B01301 + fatal + + + + Element 'cbc:EndDate' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B01302 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B01501 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B01502 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B01701 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B01702 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B01901 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B01902 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B02101 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B02501 + fatal + + + + Attribute 'mimeCode' MUST be present. + + + + + + + + + PEPPOL-T114-B02502 + fatal + + + + Value MUST be part of code list 'Mime code (IANA Subset)'. + + + + + + + + + PEPPOL-T114-B02503 + fatal + + + + Attribute 'filename' MUST be present. + + + + + + + + + + + + + + PEPPOL-T114-B02801 + fatal + + + + Element 'cbc:URI' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B02802 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B02401 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B02102 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B03001 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B03002 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B03201 + fatal + + + + Element 'cac:Party' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B03301 + fatal + + + + Element 'cbc:EndpointID' MUST be provided. + + + + + + + + + PEPPOL-T114-B03302 + fatal + + + + Element 'cac:PartyLegalEntity' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B03401 + fatal + + + + Attribute 'schemeID' MUST be present. + + + + + + + + + PEPPOL-T114-B03402 + fatal + + + + Value MUST be part of code list 'Electronic Address Scheme (EAS)'. + + + + + + + + + + + + + + PEPPOL-T114-B03601 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B03701 + fatal + + + + Value MUST be part of code list 'ISO 6523 ICD list'. + + + + + + + + + + + + + + PEPPOL-T114-B03901 + fatal + + + + Element 'cbc:Name' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B04101 + fatal + + + + Element 'cac:Country' MUST be provided. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B04901 + fatal + + + + Element 'cbc:IdentificationCode' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B05001 + fatal + + + + Value MUST be part of code list 'Country codes (ISO 3166-1:Alpha2)'. + + + + + + + + + + + + + + PEPPOL-T114-B04902 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B04102 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B05101 + fatal + + + + Element 'cbc:CompanyID' MUST be provided. + + + + + + + + + PEPPOL-T114-B05102 + fatal + + + + Element 'cac:TaxScheme' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B05301 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B05302 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B05103 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B05501 + fatal + + + + Element 'cbc:RegistrationName' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B05701 + fatal + + + + Value MUST be part of code list 'ISO 6523 ICD list'. + + + + + + + + + + + + + + PEPPOL-T114-B05901 + fatal + + + + Element 'cac:Country' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B06101 + fatal + + + + Element 'cbc:IdentificationCode' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B06201 + fatal + + + + Value MUST be part of code list 'Country codes (ISO 3166-1:Alpha2)'. + + + + + + + + + + + + + + PEPPOL-T114-B06102 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B05902 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B05502 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B06301 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B03303 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B03202 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B06701 + fatal + + + + Element 'cac:Party' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B06801 + fatal + + + + Element 'cbc:EndpointID' MUST be provided. + + + + + + + + + PEPPOL-T114-B06802 + fatal + + + + Element 'cac:PostalAddress' MUST be provided. + + + + + + + + + PEPPOL-T114-B06803 + fatal + + + + Element 'cac:PartyLegalEntity' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B06901 + fatal + + + + Attribute 'schemeID' MUST be present. + + + + + + + + + + + + + + PEPPOL-T114-B07101 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B07201 + fatal + + + + Value MUST be part of code list 'ISO 6523 ICD list'. + + + + + + + + + + + + + + PEPPOL-T114-B07401 + fatal + + + + Element 'cbc:Name' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B07601 + fatal + + + + Element 'cac:Country' MUST be provided. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B08401 + fatal + + + + Element 'cbc:IdentificationCode' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B08501 + fatal + + + + Value MUST be part of code list 'Country codes (ISO 3166-1:Alpha2)'. + + + + + + + + + + + + + + PEPPOL-T114-B08402 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B07602 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B08601 + fatal + + + + Element 'cbc:RegistrationName' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B08801 + fatal + + + + Value MUST be part of code list 'ISO 6523 ICD list'. + + + + + + + + + + + + + + PEPPOL-T114-B09001 + fatal + + + + Element 'cac:Country' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B09201 + fatal + + + + Element 'cbc:IdentificationCode' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B09301 + fatal + + + + Value MUST be part of code list 'Country codes (ISO 3166-1:Alpha2)'. + + + + + + + + + + + + + + PEPPOL-T114-B09202 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B09002 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B08602 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B09401 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B06804 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B06702 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B09801 + fatal + + + + Element 'cac:Party' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B10001 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B10101 + fatal + + + + Value MUST be part of code list 'ISO 6523 ICD list'. + + + + + + + + + + + + + + PEPPOL-T114-B10301 + fatal + + + + Element 'cbc:Name' MUST be provided. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B10501 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B09901 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B09802 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B10901 + fatal + + + + Element 'cac:Party' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B11001 + fatal + + + + Element 'cac:PostalAddress' MUST be provided. + + + + + + + + + PEPPOL-T114-B11002 + fatal + + + + Element 'cac:PartyLegalEntity' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B11101 + fatal + + + + Attribute 'schemeID' MUST contain value '0088' + + + + + + + + + PEPPOL-T114-B11102 + fatal + + + + Attribute 'schemeID' MUST be present. + + + + + + + + + + + + + + PEPPOL-T114-B11301 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B11401 + fatal + + + + Value MUST be part of code list 'ISO 6523 ICD list'. + + + + + + + + + + + + + + PEPPOL-T114-B11601 + fatal + + + + Element 'cbc:Name' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B11801 + fatal + + + + Element 'cac:Country' MUST be provided. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B12601 + fatal + + + + Element 'cbc:IdentificationCode' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B12701 + fatal + + + + Value MUST be part of code list 'Country codes (ISO 3166-1:Alpha2)'. + + + + + + + + + + + + + + PEPPOL-T114-B12602 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B11802 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B12801 + fatal + + + + Element 'cbc:CompanyID' MUST be provided. + + + + + + + + + PEPPOL-T114-B12802 + fatal + + + + Element 'cac:TaxScheme' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B13001 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B13002 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B12803 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B13201 + fatal + + + + Element 'cbc:RegistrationName' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B13401 + fatal + + + + Value MUST be part of code list 'ISO 6523 ICD list'. + + + + + + + + + + + + + + PEPPOL-T114-B13601 + fatal + + + + Element 'cac:Country' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B13801 + fatal + + + + Element 'cbc:IdentificationCode' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B13901 + fatal + + + + Value MUST be part of code list 'Country codes (ISO 3166-1:Alpha2)'. + + + + + + + + + + + + + + PEPPOL-T114-B13802 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B13602 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B13202 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B14001 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B11003 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B10902 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B14501 + fatal + + + + Element 'cac:Address' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B14601 + fatal + + + + Value MUST be part of code list 'ISO 6523 ICD list'. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B14901 + fatal + + + + Element 'cac:Country' MUST be provided. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B15501 + fatal + + + + Element 'cbc:Line' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B15701 + fatal + + + + Element 'cbc:IdentificationCode' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B15801 + fatal + + + + Value MUST be part of code list 'Country codes (ISO 3166-1:Alpha2)'. + + + + + + + + + + + + + + PEPPOL-T114-B15702 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B14902 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B14502 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B15901 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B16401 + fatal + + + + Element 'cac:PartyName' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B16501 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B16601 + fatal + + + + Value MUST be part of code list 'ISO 6523 ICD list'. + + + + + + + + + + + + + + PEPPOL-T114-B16801 + fatal + + + + Element 'cbc:Name' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B17001 + fatal + + + + Element 'cac:Country' MUST be provided. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B17601 + fatal + + + + Element 'cbc:Line' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B17801 + fatal + + + + Element 'cbc:IdentificationCode' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B17901 + fatal + + + + Value MUST be part of code list 'Country codes (ISO 3166-1:Alpha2)'. + + + + + + + + + + + + + + PEPPOL-T114-B17802 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B17002 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B18001 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B16402 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B18401 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B18601 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B18402 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B14401 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B19101 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B19102 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B18801 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B19301 + fatal + + + + Element 'cbc:Note' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B19302 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B19501 + fatal + + + + Element 'cbc:ChargeIndicator' MUST be provided. + + + + + + + + + PEPPOL-T114-B19502 + fatal + + + + Element 'cbc:AllowanceChargeReason' MUST be provided. + + + + + + + + + PEPPOL-T114-B19503 + fatal + + + + Element 'cbc:Amount' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B19601 + fatal + + + + Value MUST be part of code list 'Boolean indicator (openPEPPOL)'. + + + + + + + + + + + + + + PEPPOL-T114-B19701 + fatal + + + + Value MUST be part of code list 'Allowance reason codes (UNCL5189 subset)' or 'Charge reason code (UNCL7161)'. + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B20001 + fatal + + + + Attribute 'currencyID' MUST be present. + + + + + + + + + PEPPOL-T114-B20002 + fatal + + + + Value MUST be part of code list 'Currency codes (ISO 4217)'. + + + + + + + + + + + + + + PEPPOL-T114-B20201 + fatal + + + + Attribute 'currencyID' MUST be present. + + + + + + + + + PEPPOL-T114-B20202 + fatal + + + + Value MUST be part of code list 'Currency codes (ISO 4217)'. + + + + + + + + + + + + + + PEPPOL-T114-B20401 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + PEPPOL-T114-B20402 + fatal + + + + Element 'cac:TaxScheme' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B20501 + fatal + + + + Value MUST be part of code list 'Duty or tax or fee category code (UNCL5305)'. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B20701 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B20702 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B20403 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B19504 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B20901 + fatal + + + + Element 'cbc:TaxAmount' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B21001 + fatal + + + + Attribute 'currencyID' MUST be present. + + + + + + + + + PEPPOL-T114-B21002 + fatal + + + + Value MUST be part of code list 'Currency codes (ISO 4217)'. + + + + + + + + + + + + + + PEPPOL-T114-B20902 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B21201 + fatal + + + + Element 'cbc:LineExtensionAmount' MUST be provided. + + + + + + + + + PEPPOL-T114-B21202 + fatal + + + + Element 'cbc:PayableAmount' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B21301 + fatal + + + + Attribute 'currencyID' MUST be present. + + + + + + + + + PEPPOL-T114-B21302 + fatal + + + + Value MUST be part of code list 'Currency codes (ISO 4217)'. + + + + + + + + + + + + + + PEPPOL-T114-B21501 + fatal + + + + Attribute 'currencyID' MUST be present. + + + + + + + + + PEPPOL-T114-B21502 + fatal + + + + Value MUST be part of code list 'Currency codes (ISO 4217)'. + + + + + + + + + + + + + + PEPPOL-T114-B21701 + fatal + + + + Attribute 'currencyID' MUST be present. + + + + + + + + + PEPPOL-T114-B21702 + fatal + + + + Value MUST be part of code list 'Currency codes (ISO 4217)'. + + + + + + + + + + + + + + PEPPOL-T114-B21901 + fatal + + + + Attribute 'currencyID' MUST be present. + + + + + + + + + PEPPOL-T114-B21902 + fatal + + + + Value MUST be part of code list 'Currency codes (ISO 4217)'. + + + + + + + + + + + + + + PEPPOL-T114-B22101 + fatal + + + + Attribute 'currencyID' MUST be present. + + + + + + + + + PEPPOL-T114-B22102 + fatal + + + + Value MUST be part of code list 'Currency codes (ISO 4217)'. + + + + + + + + + + + + + + PEPPOL-T114-B22301 + fatal + + + + Attribute 'currencyID' MUST be present. + + + + + + + + + PEPPOL-T114-B22302 + fatal + + + + Value MUST be part of code list 'Currency codes (ISO 4217)'. + + + + + + + + + + + + + + PEPPOL-T114-B22501 + fatal + + + + Attribute 'currencyID' MUST be present. + + + + + + + + + PEPPOL-T114-B22502 + fatal + + + + Value MUST be part of code list 'Currency codes (ISO 4217)'. + + + + + + + + + + + + + + PEPPOL-T114-B22701 + fatal + + + + Attribute 'currencyID' MUST be present. + + + + + + + + + PEPPOL-T114-B22702 + fatal + + + + Value MUST be part of code list 'Currency codes (ISO 4217)'. + + + + + + + + + + + + + + PEPPOL-T114-B21203 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B22901 + fatal + + + + Element 'cac:LineItem' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B23101 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + PEPPOL-T114-B23102 + fatal + + + + Element 'cbc:LineStatusCode' MUST be provided. + + + + + + + + + PEPPOL-T114-B23103 + fatal + + + + Element 'cbc:Quantity' MUST be provided. + + + + + + + + + PEPPOL-T114-B23104 + fatal + + + + Element 'cac:Item' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B23301 + fatal + + + + Value MUST be part of code list 'Action code (UNCL1229) for Order Change'. + + + + + + + + + + + + + + PEPPOL-T114-B23401 + fatal + + + + Attribute 'unitCode' MUST be present. + + + + + + + + + PEPPOL-T114-B23402 + fatal + + + + Value MUST be part of code list 'Recommendation 20, including Recommendation 21 codes - prefixed with X (UN/ECE)'. + + + + + + + + + + + + + + PEPPOL-T114-B23601 + fatal + + + + Attribute 'currencyID' MUST be present. + + + + + + + + + PEPPOL-T114-B23602 + fatal + + + + Value MUST be part of code list 'Currency codes (ISO 4217)'. + + + + + + + + + + + + + + PEPPOL-T114-B23801 + fatal + + + + Value MUST be part of code list 'Boolean indicator (openPEPPOL)'. + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B24101 + fatal + + + + Value MUST be part of code list 'ISO 6523 ICD list'. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B24301 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B24001 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B24901 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B25001 + fatal + + + + Value MUST be part of code list 'ISO 6523 ICD list'. + + + + + + + + + + + + + + PEPPOL-T114-B25201 + fatal + + + + Element 'cbc:Name' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B24801 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B25401 + fatal + + + + Element 'cbc:ChargeIndicator' MUST be provided. + + + + + + + + + PEPPOL-T114-B25402 + fatal + + + + Element 'cbc:Amount' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B25601 + fatal + + + + Value MUST be part of code list 'Allowance reason codes (UNCL5189 subset)' or 'Charge reason code (UNCL7161)'. + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B25901 + fatal + + + + Attribute 'currencyID' MUST be present. + + + + + + + + + PEPPOL-T114-B25902 + fatal + + + + Value MUST be part of code list 'Currency codes (ISO 4217)'. + + + + + + + + + + + + + + PEPPOL-T114-B26101 + fatal + + + + Attribute 'currencyID' MUST be present. + + + + + + + + + PEPPOL-T114-B26102 + fatal + + + + Value MUST be part of code list 'Currency codes (ISO 4217)'. + + + + + + + + + + + + + + PEPPOL-T114-B25403 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B26301 + fatal + + + + Element 'cbc:PriceAmount' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B26401 + fatal + + + + Attribute 'currencyID' MUST be present. + + + + + + + + + PEPPOL-T114-B26402 + fatal + + + + Value MUST be part of code list 'Currency codes (ISO 4217)'. + + + + + + + + + + + + + + PEPPOL-T114-B26601 + fatal + + + + Value MUST be part of code list 'Recommendation 20, including Recommendation 21 codes - prefixed with X (UN/ECE)'. + + + + + + + + + + + + + + PEPPOL-T114-B26801 + fatal + + + + Element 'cbc:ChargeIndicator' MUST be provided. + + + + + + + + + PEPPOL-T114-B26802 + fatal + + + + Element 'cbc:Amount' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B26901 + fatal + + + + Element 'cbc:ChargeIndicator' MUST contain value 'false'. + + + + + + + + + + + + + + PEPPOL-T114-B27001 + fatal + + + + Attribute 'currencyID' MUST be present. + + + + + + + + + PEPPOL-T114-B27002 + fatal + + + + Value MUST be part of code list 'Currency codes (ISO 4217)'. + + + + + + + + + + + + + + PEPPOL-T114-B27201 + fatal + + + + Attribute 'currencyID' MUST be present. + + + + + + + + + PEPPOL-T114-B27202 + fatal + + + + Value MUST be part of code list 'Currency codes (ISO 4217)'. + + + + + + + + + + + + + + PEPPOL-T114-B26803 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B26302 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B27401 + fatal + + + + Element 'cbc:Name' MUST be provided. + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B27701 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B27702 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B27901 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B27902 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B28101 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B28201 + fatal + + + + Attribute 'schemeID' MUST be present. + + + + + + + + + PEPPOL-T114-B28202 + fatal + + + + Value MUST be part of code list 'ISO 6523 ICD list'. + + + + + + + + + + + + + + PEPPOL-T114-B28102 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B28401 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B28402 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B28701 + fatal + + + + Attribute 'listID' MUST be present. + + + + + + + + + PEPPOL-T114-B28702 + fatal + + + + Value MUST be part of code list 'Item type identification code (UNCL7143)'. + + + + + + + + + + + + + + PEPPOL-T114-B28601 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B29101 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + PEPPOL-T114-B29102 + fatal + + + + Element 'cac:TaxScheme' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T114-B29201 + fatal + + + + Value MUST be part of code list 'Duty or tax or fee category code (UNCL5305)'. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B29401 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B29402 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B29103 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B29601 + fatal + + + + Element 'cbc:Name' MUST be provided. + + + + + + + + + PEPPOL-T114-B29602 + fatal + + + + Element 'cbc:Value' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B29801 + fatal + + + + Attribute 'listID' MUST be present. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B30101 + fatal + + + + Attribute 'unitCode' MUST be present. + + + + + + + + + PEPPOL-T114-B30102 + fatal + + + + Value MUST be part of code list 'Recommendation 20, including Recommendation 21 codes - prefixed with X (UN/ECE)'. + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B29603 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-B30601 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B30401 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B27402 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B23105 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B22902 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T114-B00111 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-R031 + fatal + + + + An order change transaction MUST use profile advanced_ordering. + + + + + + + + + + + + + + PEPPOL-T114-R034 + fatal + + + + Specification identifier MUST start with the value 'urn:fdc:peppol.eu:poacc:trns:order_change:3'. + + + + + + + + + + + + + + PEPPOL-T114-R003 + fatal + + + + An order MUST be stated in a single currency + + + + + + + + + PEPPOL-T114-R028 + fatal + + + + Elements of data type amount cannot have more than 2 decimals (I.e. all amounts except unit price amounts) + + + + + + + + + + + + + + PEPPOL-T114-R002 + warning + + + + An order change SHOULD provide information about its validity end date. + + + + + + + + + + + + + + PEPPOL-T114-R014 + fatal + + + + An order change MUST have the originator party name or an identifier + + + + + + + + + + + + + + PEPPOL-T114-R026 + fatal + + + + When TAX is VAT then Party VAT identifiers MUST have a prefix in accordance with ISO code ISO 3166-1 alpha-2 by which the country of issue may be identified. Nevertheless, Greece may use the prefix ‘EL’. + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-R006 + fatal + + + + Expected total amount for payment MUST NOT be negative + + + + + + + + + PEPPOL-T114-R007 + fatal + + + + Expected total sum of line amounts MUST NOT be negative + + + + + + + + + PEPPOL-T114-R008 + fatal + + + + Expected total sum of line amounts MUST equal the sum of the order line amounts at order line level + + + + + + + + + PEPPOL-T114-R009 + fatal + + + + Expected total sum of allowance at document level MUST be equal to the sum of allowance amounts at document level + + + + + + + + + PEPPOL-T114-R010 + fatal + + + + Expected total sum of charges at document level MUST be equal to the sum of charge amounts at document level + + + + + + + + + PEPPOL-T114-R011 + fatal + + + + Expected total amount without TAX = Expected total sum of line amounts - Sum of allowances on document level + Sum of charges on document level + + + + + + + + + PEPPOL-T114-R016 + fatal + + + + Amount due for payment = Order change total amount with TAX - Paid amount + Rounding amount. + + + + + + + + + PEPPOL-T114-R017 + fatal + + + + Expected total amount with TAX = Expected total amount without TAX + Order total TAX amount. + + + + + + + + + + + + + + PEPPOL-T114-R020 + fatal + + + + Allowance/charge base amount MUST be provided when allowance/charge percentage is provided. + + + + + + + + + + + + + + PEPPOL-T114-R021 + fatal + + + + Allowance/charge percentage MUST be provided when allowance/charge base amount is provided. + + + + + + + + + + + + + + PEPPOL-T114-R022 + fatal + + + + Allowance/charge amount MUST equal base amount * percentage/100 if base amount and percentage exists + + + + + + + + + PEPPOL-T114-R023 + fatal + + + + Each document or line level allowance MUST have an allowance reason text or an allowance reason code. + + + + + + + + + PEPPOL-T114-R032 + fatal + + + + Allowance or charge amounts MUST NOT be negative. + + + + + + + + + + + + + + PEPPOL-T114-R029 + fatal + + + + Each Tax Category MUST have a TAX category rate, except if the order is not subject to TAX. + + + + + + + + + PEPPOL-T114-R030 + fatal + + + + When TAX category code is "Standard rated" (S) the TAX rate MUST be greater than zero. + + + + + + + + + + + + + + + + + + + + PEPPOL-T114-R024 + fatal + + + + Order line net amount MUST equal (Ordered quantity * (Item net price/item price base quantity) + Order line charge amount - Order line allowance amount + + + + + + + + + PEPPOL-T114-R025 + fatal + + + + Base quantity MUST be a positive number above zero. + + + + + + + + + PEPPOL-T114-R001 + fatal + + + + Each order line MUST have a document line identifier that is unique within the order. + + + + + + + + + PEPPOL-T114-R004 + fatal + + + + Each order line ordered quantity MUST not be negative + + + + + + + + + PEPPOL-T114-R013 + warning + + + + Each order line SHOULD have an ordered quantity + + + + + + + + + + + + + + PEPPOL-T114-R019 + fatal + + + + Item net price MUST equal (Gross price - Allowance amount) when gross price is provided. + + + + + + + + + + + + + + PEPPOL-T114-R005 + fatal + + + + Each order line item net price MUST not be negative + + + + + + + + + + PEPPOL-T114-R027 + fatal + + + + The Item gross price MUST NOT be negative. + + + + + + + + + PEPPOL-T114-R033 + fatal + + + + Allowance or charge amounts MUST NOT be negative. + + + + + + + + + + + + + + PEPPOL-T114-CL001 + fatal + + + + Reason code MUST be according to subset of UNCL 5189 D.16B. + + + + + + + + + + + + + + PEPPOL-T114-CL002 + fatal + + + + Reason code MUST be according to UNCL 7161 D.16B. + + + + + + + + + + diff --git a/src/main/resources/META-INF/Schematron/PEPPOL/PEPPOLBIS-T115.xslt b/src/main/resources/META-INF/Schematron/PEPPOL/PEPPOLBIS-T115.xslt new file mode 100644 index 0000000000000000000000000000000000000000..1260e06d8f5180060312a9e227a22ae858b8c744 --- /dev/null +++ b/src/main/resources/META-INF/Schematron/PEPPOL/PEPPOLBIS-T115.xslt @@ -0,0 +1,2828 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + + + + + + + + + + + + + + + + ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + / + + + + + + *: + + [namespace-uri()=' + + '] + + + + [ + + ] + + + + / + + @ + + + @*[local-name()=' + + ' and namespace-uri()=' + + '] + + + + + + + + / + + + [ + + ] + + + + /@ + + + + + + + / + + + [ + + ] + + + + /@ + + + + + + + + + + + + + + + + + + + + + + + . + + + + U + + U + + + + U. + + n + + + + U. + + _ + + _ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Rules for PEPPOL Order Cancellation transaction 3.0 + + + + + + + + + + PEPPOL-COMMON-R001 + fatal + + + + Document MUST not contain empty elements. + + + + + + + + + + + + + + + + + + + PEPPOL-COMMON-R003 + warning + + + + Document SHOULD not contain schema location. + + + + + + + + + + + + + + PEPPOL-COMMON-R030 + fatal + + + + A date must be formatted YYYY-MM-DD. + + + + + + + + + + + + + + PEPPOL-COMMON-R040 + fatal + + + + GLN must have a valid format according to GS1 rules. + + + + + + + + + + + + + + PEPPOL-COMMON-R041 + fatal + + + + Norwegian organization number MUST be stated in the correct format. + + + + + + + + + + + + + + PEPPOL-COMMON-R043 + fatal + + + + Belgian enterprise number MUST be stated in the correct format. + + + + + + + + + + + + + + PEPPOL-COMMON-R044 + warning + + + + IPA Code (Codice Univoco Unità Organizzativa) must be stated in the correct format + + + + + + + + + + + + + + PEPPOL-COMMON-R045 + warning + + + + Tax Code (Codice Fiscale) must be stated in the correct format + + + + + + + + + + + + + + PEPPOL-COMMON-R046 + warning + + + + Tax Code (Codice Fiscale) must be stated in the correct format + + + + + + + + + + + + + + PEPPOL-COMMON-R047 + warning + + + + Italian VAT Code (Partita Iva) must be stated in the correct format + + + + + + + + + + + + + + PEPPOL-COMMON-R048 + warning + + + + Italian VAT Code (Partita Iva) must be stated in the correct format + + + + + + + + + + + + + + PEPPOL-COMMON-R049 + fatal + + + + Swedish organization number MUST be stated in the correct format. + + + + + + + + + + + + + + PEPPOL-COMMON-R050 + fatal + + + + Australian Business Number (ABN) MUST be stated in the correct format. + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T115-B00101 + fatal + + + + Element 'cbc:CustomizationID' MUST be provided. + + + + + + + + + PEPPOL-T115-B00102 + fatal + + + + Element 'cbc:ProfileID' MUST be provided. + + + + + + + + + PEPPOL-T115-B00103 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + PEPPOL-T115-B00104 + fatal + + + + Element 'cbc:IssueDate' MUST be provided. + + + + + + + + + PEPPOL-T115-B00105 + fatal + + + + Element 'cbc:CancellationNote' MUST be provided. + + + + + + + + + PEPPOL-T115-B00106 + fatal + + + + Element 'cac:OrderReference' MUST be provided. + + + + + + + + + PEPPOL-T115-B00107 + fatal + + + + Element 'cac:BuyerCustomerParty' MUST be provided. + + + + + + + + + PEPPOL-T115-B00108 + fatal + + + + Element 'cac:SellerSupplierParty' MUST be provided. + + + + + + + + + PEPPOL-T115-B00109 + fatal + + + + Document MUST not contain schema location. + + + + + + + + + + + + + + PEPPOL-T115-B00201 + fatal + + + + Element 'cbc:CustomizationID' MUST contain value 'urn:fdc:peppol.eu:poacc:trns:order_cancellation:3'. + + + + + + + + + + + + + + PEPPOL-T115-B00301 + fatal + + + + Element 'cbc:ProfileID' MUST contain value 'urn:fdc:peppol.eu:poacc:bis:advanced_ordering:3'. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T115-B00901 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T115-B00902 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B01101 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T115-B01102 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B01301 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T115-B01701 + fatal + + + + Attribute 'mimeCode' MUST be present. + + + + + + + + + PEPPOL-T115-B01702 + fatal + + + + Value MUST be part of code list 'Mime code (IANA Subset)'. + + + + + + + + + PEPPOL-T115-B01703 + fatal + + + + Attribute 'filename' MUST be present. + + + + + + + + + + + + + + PEPPOL-T115-B02001 + fatal + + + + Element 'cbc:URI' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T115-B02002 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B01601 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B01302 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B02201 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T115-B02202 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B02401 + fatal + + + + Element 'cac:Party' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T115-B02501 + fatal + + + + Element 'cbc:EndpointID' MUST be provided. + + + + + + + + + PEPPOL-T115-B02502 + fatal + + + + Element 'cac:PartyLegalEntity' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T115-B02601 + fatal + + + + Attribute 'schemeID' MUST be present. + + + + + + + + + PEPPOL-T115-B02602 + fatal + + + + Value MUST be part of code list 'Electronic Address Scheme (EAS)'. + + + + + + + + + + + + + + PEPPOL-T115-B02801 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T115-B02901 + fatal + + + + Value MUST be part of code list 'ISO 6523 ICD list'. + + + + + + + + + + + + + + PEPPOL-T115-B03101 + fatal + + + + Element 'cbc:Name' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T115-B03301 + fatal + + + + Element 'cac:Country' MUST be provided. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T115-B04101 + fatal + + + + Element 'cbc:IdentificationCode' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T115-B04201 + fatal + + + + Value MUST be part of code list 'Country codes (ISO 3166-1:Alpha2)'. + + + + + + + + + + + + + + PEPPOL-T115-B04102 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B03302 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B04301 + fatal + + + + Element 'cbc:CompanyID' MUST be provided. + + + + + + + + + PEPPOL-T115-B04302 + fatal + + + + Element 'cac:TaxScheme' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T115-B04501 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T115-B04502 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B04303 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B04701 + fatal + + + + Element 'cbc:RegistrationName' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T115-B04901 + fatal + + + + Value MUST be part of code list 'ISO 6523 ICD list'. + + + + + + + + + + + + + + PEPPOL-T115-B05101 + fatal + + + + Element 'cac:Country' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T115-B05301 + fatal + + + + Element 'cbc:IdentificationCode' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T115-B05401 + fatal + + + + Value MUST be part of code list 'Country codes (ISO 3166-1:Alpha2)'. + + + + + + + + + + + + + + PEPPOL-T115-B05302 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B05102 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B04702 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T115-B05501 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B02503 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B02402 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B05901 + fatal + + + + Element 'cac:Party' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T115-B06001 + fatal + + + + Element 'cbc:EndpointID' MUST be provided. + + + + + + + + + PEPPOL-T115-B06002 + fatal + + + + Element 'cac:PostalAddress' MUST be provided. + + + + + + + + + PEPPOL-T115-B06003 + fatal + + + + Element 'cac:PartyLegalEntity' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T115-B06101 + fatal + + + + Attribute 'schemeID' MUST be present. + + + + + + + + + + + + + + PEPPOL-T115-B06301 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T115-B06401 + fatal + + + + Value MUST be part of code list 'ISO 6523 ICD list'. + + + + + + + + + + + + + + PEPPOL-T115-B06601 + fatal + + + + Element 'cbc:Name' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T115-B06801 + fatal + + + + Element 'cac:Country' MUST be provided. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T115-B07601 + fatal + + + + Element 'cbc:IdentificationCode' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T115-B07701 + fatal + + + + Value MUST be part of code list 'Country codes (ISO 3166-1:Alpha2)'. + + + + + + + + + + + + + + PEPPOL-T115-B07602 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B06802 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B07801 + fatal + + + + Element 'cbc:RegistrationName' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T115-B08001 + fatal + + + + Value MUST be part of code list 'ISO 6523 ICD list'. + + + + + + + + + + + + + + PEPPOL-T115-B08201 + fatal + + + + Element 'cac:Country' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T115-B08401 + fatal + + + + Element 'cbc:IdentificationCode' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T115-B08501 + fatal + + + + Value MUST be part of code list 'Country codes (ISO 3166-1:Alpha2)'. + + + + + + + + + + + + + + PEPPOL-T115-B08402 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B08202 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B07802 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T115-B08601 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B06004 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B05902 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B09001 + fatal + + + + Element 'cac:Party' MUST be provided. + + + + + + + + + + + + + + + + + + + PEPPOL-T115-B09201 + fatal + + + + Element 'cbc:ID' MUST be provided. + + + + + + + + + + + + + + PEPPOL-T115-B09301 + fatal + + + + Value MUST be part of code list 'ISO 6523 ICD list'. + + + + + + + + + + + + + + PEPPOL-T115-B09501 + fatal + + + + Element 'cbc:Name' MUST be provided. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PEPPOL-T115-B09701 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B09101 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B09002 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + PEPPOL-T115-B00110 + fatal + + + + Document MUST NOT contain elements not part of the data model. + + + + + + + + + + + + + + + + + + + PEPPOL-T115-R031 + fatal + + + + An order cancellation transaction MUST use profile advanced_ordering. + + + + + + + + + + + + + + PEPPOL-T115-R034 + fatal + + + + Specification identifier MUST start with the value 'urn:fdc:peppol.eu:poacc:trns:order_cancellation:3'. + + + + + + + + + + diff --git a/src/main/resources/reference.conf b/src/main/resources/reference.conf index a71fe875dcccb655915802c3f74f5a969c6725f2..21068b11c44cc8ad23a38b7dfa968bb9a7f2978f 100644 --- a/src/main/resources/reference.conf +++ b/src/main/resources/reference.conf @@ -1081,5 +1081,69 @@ document.type = { } ] messageLevelResponseType: "PEPPOL_MESSAGE_LEVEL_RESPONSE" - } + } + + peppolOrderChange = { + friendlyName: "Peppol Order Change" + payloadRootLocalName: "OrderChange" + payloadRootNamespace: "urn:oasis:names:specification:ubl:schema:xsd:OrderChange-2" + schemaPath: "META-INF/Schemas/UBL_v2.1/maindoc/UBL-OrderChange-2.1.xsd" + identifierDiscriminators = [{ + xpathExpression: "/sbd:StandardBusinessDocument/root:OrderChange/cbc:CustomizationID" + xpathExpectedResult: "urn:fdc:peppol\\.eu:poacc:trns:order_change:3" + }] + namespaces = [ + { namespace: "http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader", prefix: "sbd" }, + { namespace: "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2", prefix: "cac" }, + { namespace: "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2", prefix: "cbc" }, + { namespace: "urn:oasis:names:specification:ubl:schema:xsd:CoreComponentParameters-2", prefix: "ccts" }, + { namespace: "urn:oasis:names:specification:ubl:schema:xsd:SpecializedDatatypes-2", prefix: "sdt"}, + { namespace: "urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2", prefix: "udt"}, + { namespace: "urn:oasis:names:specification:ubl:schema:xsd:OrderChange-2", prefix: "root"} + ] + schematronDocuments = [ + { + schematronDocumentPath: "META-INF/Schematron/PEPPOL/PEPPOLBIS-T114.xslt" + errorXPath: "/svrl:schematron-output/svrl:failed-assert[@flag='fatal']" + errorMessageXPath: "svrl:text" + errorLocationXPath: "@location" + warningXPath: "/svrl:schematron-output/svrl:failed-assert[@flag='warning']" + warningMessageXPath: "svrl:text" + warningLocationXPath: "@location" + } + ] + messageLevelResponseType: "PEPPOL_MESSAGE_LEVEL_RESPONSE" + } + + peppolOrderCancellation = { + friendlyName: "Peppol Order Cancellation" + payloadRootLocalName: "OrderCancellation" + payloadRootNamespace: "urn:oasis:names:specification:ubl:schema:xsd:OrderCancellation-2" + schemaPath: "META-INF/Schemas/UBL_v2.1/maindoc/UBL-OrderCancellation-2.1.xsd" + identifierDiscriminators = [{ + xpathExpression: "/sbd:StandardBusinessDocument/root:OrderCancellation/cbc:CustomizationID" + xpathExpectedResult: "urn:fdc:peppol\\.eu:poacc:trns:order_cancellation:3" + }] + namespaces = [ + { namespace: "http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader", prefix: "sbd" }, + { namespace: "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2", prefix: "cac" }, + { namespace: "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2", prefix: "cbc" }, + { namespace: "urn:oasis:names:specification:ubl:schema:xsd:CoreComponentParameters-2", prefix: "ccts" }, + { namespace: "urn:oasis:names:specification:ubl:schema:xsd:SpecializedDatatypes-2", prefix: "sdt"}, + { namespace: "urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2", prefix: "udt"}, + { namespace: "urn:oasis:names:specification:ubl:schema:xsd:OrderCancellation-2", prefix: "root"} + ] + schematronDocuments = [ + { + schematronDocumentPath: "META-INF/Schematron/PEPPOL/PEPPOLBIS-T115.xslt" + errorXPath: "/svrl:schematron-output/svrl:failed-assert[@flag='fatal']" + errorMessageXPath: "svrl:text" + errorLocationXPath: "@location" + warningXPath: "/svrl:schematron-output/svrl:failed-assert[@flag='warning']" + warningMessageXPath: "svrl:text" + warningLocationXPath: "@location" + } + ] + messageLevelResponseType: "PEPPOL_MESSAGE_LEVEL_RESPONSE" + } } diff --git a/src/test/java/dk/erst/oxalis/as4/config/documenttype/DocumentTypeConfigResolverTest.java b/src/test/java/dk/erst/oxalis/as4/config/documenttype/DocumentTypeConfigResolverTest.java index eb61d2fbb5470bb3568a222b4153b36abe507d43..f40cccabbe9d25ce6444bac61b8145256ca2f57b 100644 --- a/src/test/java/dk/erst/oxalis/as4/config/documenttype/DocumentTypeConfigResolverTest.java +++ b/src/test/java/dk/erst/oxalis/as4/config/documenttype/DocumentTypeConfigResolverTest.java @@ -179,6 +179,16 @@ public class DocumentTypeConfigResolverTest extends AbstractXmlTest { assertCanResolveDocumentType("peppol-examples/MessageLevelResponse_Example-T71.xml", "Applikationsmeddelelse for besked (3.0)", "urn:oasis:names:specification:ubl:schema:xsd:ApplicationResponse-2", "ApplicationResponse"); } + @Test + public void testCanResolveDocumentTypePeppolOrderChange() throws Exception { + assertCanResolveDocumentType("peppol-BIS-examples/OrderChange_Example.xml", "Peppol Ordreændring", "urn:oasis:names:specification:ubl:schema:xsd:OrderChange-2", "OrderChange"); + } + + @Test + public void testCanResolveDocumentTypePeppolOrderCancellation() throws Exception { + assertCanResolveDocumentType("peppol-BIS-examples/OrderCancellation_Example.xml", "Peppol Ordreannullering", "urn:oasis:names:specification:ubl:schema:xsd:OrderCancellation-2", "OrderCancellation"); + } + @Test public void testUsesIdentifierDiscriminatorToResolveDocumentType() throws Exception { String xml = "ubl-examples/OIOUBL_Invoice_v2p2.xml"; diff --git a/src/test/java/dk/erst/oxalis/as4/config/documenttype/DocumentTypeModuleTest.java b/src/test/java/dk/erst/oxalis/as4/config/documenttype/DocumentTypeModuleTest.java index 980ee2c24923ec55d58909afe556cd1a11ee868c..bb44cb378d4107421f3fff9c0a621fcdbffabcad 100644 --- a/src/test/java/dk/erst/oxalis/as4/config/documenttype/DocumentTypeModuleTest.java +++ b/src/test/java/dk/erst/oxalis/as4/config/documenttype/DocumentTypeModuleTest.java @@ -828,6 +828,58 @@ public class DocumentTypeModuleTest { testDocumentTypeContainsCorrectValues(config); } + @Test + public void testProvidesPeppolOrderChangeDocumentTypeConfig() { + DocumentTypeConfig config = new DocumentTypeConfig(); + config.setFriendlyName("Peppol Order Change"); + config.setPayloadRootLocalName("OrderChange"); + config.setPayloadRootNamespace("urn:oasis:names:specification:ubl:schema:xsd:OrderChange-2"); + config.setSchemaPath(UBL_PATH_PREFIX + "/UBL-OrderChange-2.1.xsd"); + config.setIdentifierDiscriminators(Collections.singletonList( + new XpathDiscriminatorConfig("/sbd:StandardBusinessDocument/root:OrderChange/cbc:CustomizationID", "urn:fdc:peppol\\.eu:poacc:trns:order_change:3"))); + config.setNamespaces(Arrays.asList( + standardBusinessDocumentNamespace(), + commonAggregateComponentsNamespace(), + commonBasicComponentsNamespace(), + coreComponentParametersNamespace(), + specializedDatatypesNamespace(), + unqualifiedDatatypesNamespace(), + new PrefixedNamespace("urn:oasis:names:specification:ubl:schema:xsd:OrderChange-2", "root") + )); + config.setSchematronDocuments(Collections.singletonList( + new SchematronValidationConfig(SCHEMATRON_PEPPOL_PATH_PREFIX + "/PEPPOLBIS-T114.xslt", SCHEMATRON_PEPPOL_ERROR_XPATH, SCHEMATRON_PEPPOL_ERROR_DESCRIPTION_XPATH, SCHEMATRON_PEPPOL_ERROR_LOCATION_XPATH, SCHEMATRON_PEPPOL_WARNING_XPATH, SCHEMATRON_PEPPOL_WARNING_DESCRIPTION_XPATH, SCHEMATRON_PEPPOL_WARNING_LOCATION_XPATH) + )); + config.setMessageLevelResponseType(MessageLevelResponseType.PEPPOL_MESSAGE_LEVEL_RESPONSE); + + testDocumentTypeContainsCorrectValues(config); + } + + @Test + public void testProvidesPeppolOrderCancellationDocumentTypeConfig() { + DocumentTypeConfig config = new DocumentTypeConfig(); + config.setFriendlyName("Peppol Order Cancellation"); + config.setPayloadRootLocalName("OrderCancellation"); + config.setPayloadRootNamespace("urn:oasis:names:specification:ubl:schema:xsd:OrderCancellation-2"); + config.setSchemaPath(UBL_PATH_PREFIX + "/UBL-OrderCancellation-2.1.xsd"); + config.setIdentifierDiscriminators(Collections.singletonList( + new XpathDiscriminatorConfig("/sbd:StandardBusinessDocument/root:OrderCancellation/cbc:CustomizationID", "urn:fdc:peppol\\.eu:poacc:trns:order_cancellation:3"))); + config.setNamespaces(Arrays.asList( + standardBusinessDocumentNamespace(), + commonAggregateComponentsNamespace(), + commonBasicComponentsNamespace(), + coreComponentParametersNamespace(), + specializedDatatypesNamespace(), + unqualifiedDatatypesNamespace(), + new PrefixedNamespace("urn:oasis:names:specification:ubl:schema:xsd:OrderCancellation-2", "root") + )); + config.setSchematronDocuments(Collections.singletonList( + new SchematronValidationConfig(SCHEMATRON_PEPPOL_PATH_PREFIX + "/PEPPOLBIS-T115.xslt", SCHEMATRON_PEPPOL_ERROR_XPATH, SCHEMATRON_PEPPOL_ERROR_DESCRIPTION_XPATH, SCHEMATRON_PEPPOL_ERROR_LOCATION_XPATH, SCHEMATRON_PEPPOL_WARNING_XPATH, SCHEMATRON_PEPPOL_WARNING_DESCRIPTION_XPATH, SCHEMATRON_PEPPOL_WARNING_LOCATION_XPATH) + )); + config.setMessageLevelResponseType(MessageLevelResponseType.PEPPOL_MESSAGE_LEVEL_RESPONSE); + + testDocumentTypeContainsCorrectValues(config); + } + @Test public void testProvidesPeppolDespatchAdviceDocumentTypeConfig() { DocumentTypeConfig config = new DocumentTypeConfig(); diff --git a/src/test/java/dk/erst/oxalis/as4/validation/schema/SchemaResolverTest.java b/src/test/java/dk/erst/oxalis/as4/validation/schema/SchemaResolverTest.java index eac960a2794b39a7102fd0568ad83cc1e3c0e16c..2afcf610fc306ad1c5a3f2ae907e7b13086b9e09 100644 --- a/src/test/java/dk/erst/oxalis/as4/validation/schema/SchemaResolverTest.java +++ b/src/test/java/dk/erst/oxalis/as4/validation/schema/SchemaResolverTest.java @@ -175,6 +175,15 @@ public class SchemaResolverTest extends AbstractXmlTest { assertCanLocateSchema("peppol-examples/OrderAgreementResponse_Example-T112-.xml"); } + @Test + public void testCanLocateDKPeppolOrderChangeSchema() throws Exception { + assertCanLocateSchema("peppol-BIS-examples/OrderChange_Example.xml"); + } + @Test + public void testCanLocateDKPeppolOrderCancellationSchema() throws Exception { + assertCanLocateSchema("peppol-BIS-examples/OrderCancellation_Example.xml"); + } + @Test public void testCanLocateReminder30Schema() throws Exception { assertCanLocateSchema("peppol-examples/Reminder-Example-3.xml"); diff --git a/src/test/java/dk/erst/oxalis/as4/validation/schema/SchemaValidatorTest.java b/src/test/java/dk/erst/oxalis/as4/validation/schema/SchemaValidatorTest.java index ecb178363e89a42b7afa23d788e8b3145246f6df..b629b88822f7a9baee749234d229e2396b79c35a 100644 --- a/src/test/java/dk/erst/oxalis/as4/validation/schema/SchemaValidatorTest.java +++ b/src/test/java/dk/erst/oxalis/as4/validation/schema/SchemaValidatorTest.java @@ -230,6 +230,16 @@ public class SchemaValidatorTest extends AbstractXmlTest { assertValidateValidXml("peppol-BIS-examples/OrderResponse_Example.xml"); } + @Test + public void testCanValidatePeppolOrderChange() throws Exception { + assertValidateValidXml("peppol-BIS-examples/OrderChange_Example.xml"); + } + + @Test + public void testCanValidatePeppolOrderCancellation() throws Exception { + assertValidateValidXml("peppol-BIS-examples/OrderCancellation_Example.xml"); + } + @Test public void testCanValidatePeppolOrderAgreement() throws Exception { assertValidateValidXml("peppol-BIS-examples/OrderAgreement_Example.xml"); diff --git a/src/test/java/dk/erst/oxalis/as4/validation/schematron/SchematronValidatorTest.java b/src/test/java/dk/erst/oxalis/as4/validation/schematron/SchematronValidatorTest.java index 247f4f01e1e161c7d1ef0a16cf039ab2d873bd41..310708ed758b51bef32d1ba4b4df73e5b2c49f9c 100644 --- a/src/test/java/dk/erst/oxalis/as4/validation/schematron/SchematronValidatorTest.java +++ b/src/test/java/dk/erst/oxalis/as4/validation/schematron/SchematronValidatorTest.java @@ -236,6 +236,16 @@ public class SchematronValidatorTest extends AbstractXmlTest { assertValidateSchematronOk("peppol-BIS-examples/PunchOut_Example.xml"); } + @Test + public void testCanSchematronValidatePeppolOrderChange() throws Exception { + assertValidateSchematronOk("peppol-BIS-examples/OrderChange_Example.xml"); + } + + @Test + public void testCanSchematronValidatePeppolOrderCancellation() throws Exception { + assertValidateSchematronOk("peppol-BIS-examples/OrderCancellation_Example.xml"); + } + @Test public void testReturnsValidationErrorsFromSchematronValidation() throws Exception { String xmlPath = "schematron-error-examples/F-INV134_INV_The_Sum_of_PaymentTerms_Amount_Does_Not_Equal_PayableAmount_BZ1425.xml"; diff --git a/src/test/resources/peppol-BIS-examples/OrderCancellation_Example.xml b/src/test/resources/peppol-BIS-examples/OrderCancellation_Example.xml new file mode 100644 index 0000000000000000000000000000000000000000..45f9bad09a9914cd489661c0726654c312b62117 --- /dev/null +++ b/src/test/resources/peppol-BIS-examples/OrderCancellation_Example.xml @@ -0,0 +1,45 @@ + + + urn:fdc:peppol.eu:poacc:trns:order_cancellation:3 + urn:fdc:peppol.eu:poacc:bis:advanced_ordering:3 + Cancellation-1 + 2022-02-01 + With reference to phone call + + Order-1 + + + + 7300010000001 + + 5541277711 + + + City Hospital 345433 + + + + + + 7302347231110 + + 5546577799 + + + The Supplier AB + + + + SE + + + + The Supplier AB + + + + diff --git a/src/test/resources/peppol-BIS-examples/OrderChange_Example.xml b/src/test/resources/peppol-BIS-examples/OrderChange_Example.xml new file mode 100644 index 0000000000000000000000000000000000000000..66e2ffa02746b6fe6b45ec9881ed9dcf24f140c1 --- /dev/null +++ b/src/test/resources/peppol-BIS-examples/OrderChange_Example.xml @@ -0,0 +1,146 @@ + + + urn:fdc:peppol.eu:poacc:trns:order_change:3 + urn:fdc:peppol.eu:poacc:bis:advanced_ordering:3 + Change-1 + 2022-02-01 + 1 + Changes according to Order reponse + EUR + + 2022-03-01 + + + Order-1 + + + + 7300010000001 + + 5541277711 + + + City Hospital + + + City Hospital 345433 + 5541277711 + + Eurocity + + SE + + + + + Martin Foggerty + +46555785488 + martin.foggerty@cityhospital.se + + + + + + 7302347231110 + + 5546577799 + + + Harbour street + Dock 45 + Bergen + + NO + + + + The Supplier AB + + + + + + + Lower street 5 + Reception + Stockholm + 11120 + + Right + + + SE + + + + + 2013-07-15 + 2013-07-16 + + + + Hospital Tourist Department + + + John + +465558877523 + john@cityhospital.se + + + + + 100 + + + 500 + 500 + 600 + 600 + + + + 1 + 3 + 5 + 200 + + 40 + + + Item 1 + + S + 20 + + VAT + + + + + + + + 2 + 3 + 50 + 300 + + 6 + + + Item 2 + + S + 20 + + VAT + + + + + + diff --git a/src/test/resources/reference.conf b/src/test/resources/reference.conf index 9159ef8f83473fe5ef7a94986298079d89cfc4d8..dc6c6dca17cafbd083d7703eeecce3545cdc0234 100644 --- a/src/test/resources/reference.conf +++ b/src/test/resources/reference.conf @@ -1,28 +1,28 @@ -brave.reporter = noop -oxalis.statistics.service = noop -oxalis.persister.payload = noop -oxalis.persister.receipt = noop -oxalis.persister.exception = noop -oxalis.persister.handler = default - -oxalis.http.pool.max_route = 10 - -oxalis.truststore.path=peppol_trust_g2.jks -oxalis.truststore.password=changeit - -// Default configuration uses H2 -jdbc { - url : "jdbc:h2:mem:oxalis-as4-test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=true;MODE=MYSQL;" - driver.class.name : "org.h2.Driver" - user: "SA" - password : "" - hibernate.dialect: "org.hibernate.dialect.H2Dialect" - pool.size: 1 -} - -folder.monitor { - enabled: true, - folder: "./dummy", - poll.interval.seconds: 5 - file.signature.timeout.seconds: 300 +brave.reporter = noop +oxalis.statistics.service = noop +oxalis.persister.payload = noop +oxalis.persister.receipt = noop +oxalis.persister.exception = noop +oxalis.persister.handler = default + +oxalis.http.pool.max_route = 10 + +oxalis.truststore.path=peppol_trust_g2.jks +oxalis.truststore.password=changeit + +// Default configuration uses H2 +jdbc { + url : "jdbc:h2:mem:oxalis-as4-test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=true;MODE=MYSQL;" + driver.class.name : "org.h2.Driver" + user: "SA" + password : "" + hibernate.dialect: "org.hibernate.dialect.H2Dialect" + pool.size: 1 +} + +folder.monitor { + enabled: true, + folder: "./dummy", + poll.interval.seconds: 5 + file.signature.timeout.seconds: 300 } \ No newline at end of file