From bbb4472ab8784de8a2ccdcc8ad9d617dd187974c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20BEAU?= Date: Tue, 26 May 2026 14:47:01 +0200 Subject: [PATCH 1/5] Add copier config --- .copier-answers.yml | 17 + .github/workflows/ci.yml | 34 + .github/workflows/release.yml | 29 + .gitignore | 121 +- .pre-commit-config.yaml | 16 + LICENSE => LICENSE.txt | 1 + facturx/__init__.py | 13 - facturx/scripts/pdfgen.py | 199 --- pyproject.toml | 88 +- src/facturx/__init__.py | 15 + {facturx => src/facturx}/facturx.py | 1135 ++++++++++------- {facturx => src/facturx}/scripts/__init__.py | 0 .../facturx}/scripts/pdfextractxml.py | 85 +- src/facturx/scripts/pdfgen.py | 268 ++++ .../facturx}/scripts/webservice.py | 124 +- {facturx => src/facturx}/scripts/xmlcheck.py | 72 +- .../xmp/Factur-X_extension_schema.xmp | 6 +- .../facturx}/xmp/ZUGFeRD_extension_schema.xmp | 6 +- .../Factur-X_1.08_BASIC-compiled.xsl | 4 +- .../xsd/facturx-basic/Factur-X_1.08_BASIC.xsd | 0 .../Factur-X_1.08_BASIC_codedb.xml | 0 ...ct_data_standard_QualifiedDataType_100.xsd | 0 ...AggregateBusinessInformationEntity_100.xsd | 0 ..._data_standard_UnqualifiedDataType_100.xsd | 0 .../Factur-X_1.08_BASICWL-compiled.xsl | 4 +- .../facturx-basicwl/Factur-X_1.08_BASICWL.xsd | 0 .../Factur-X_1.08_BASICWL_codedb.xml | 0 ...ct_data_standard_QualifiedDataType_100.xsd | 0 ...AggregateBusinessInformationEntity_100.xsd | 0 ..._data_standard_UnqualifiedDataType_100.xsd | 0 .../Factur-X_1.08_EN16931-compiled.xsl | 4 +- .../facturx-en16931/Factur-X_1.08_EN16931.xsd | 0 .../Factur-X_1.08_EN16931_codedb.xml | 0 ...ct_data_standard_QualifiedDataType_100.xsd | 0 ...AggregateBusinessInformationEntity_100.xsd | 0 ..._data_standard_UnqualifiedDataType_100.xsd | 0 .../Factur-X_1.08_EXTENDED-compiled.xsl | 4 +- .../Factur-X_1.08_EXTENDED.xsd | 0 .../Factur-X_1.08_EXTENDED_codedb.xml | 0 ...ct_data_standard_QualifiedDataType_100.xsd | 0 ...AggregateBusinessInformationEntity_100.xsd | 0 ..._data_standard_UnqualifiedDataType_100.xsd | 0 .../Factur-X_1.08_MINIMUM-compiled.xsl | 4 +- .../facturx-minimum/Factur-X_1.08_MINIMUM.xsd | 0 .../Factur-X_1.08_MINIMUM_codedb.xml | 0 ...ct_data_standard_QualifiedDataType_100.xsd | 0 ...AggregateBusinessInformationEntity_100.xsd | 0 ..._data_standard_UnqualifiedDataType_100.xsd | 0 ...ACIOMessageStructure_100pD20B-compiled.xsl | 4 +- ...SCRDMCCBDACIOMessageStructure_100pD20B.xsd | 0 ...d_ISO_ISO3AlphaCurrencyCode_2012-08-31.xsd | 0 ...odelist_standard_UNECE_ActionCode_D20A.xsd | 0 ..._standard_UNECE_DeliveryTermsCode_2010.xsd | 0 ...d_UNECE_DeliveryTermsFunctionCode_D20A.xsd | 0 ...t_standard_UNECE_DocumentNameCode_D20A.xsd | 0 ...standard_UNECE_DocumentStatusCode_D20A.xsd | 0 ...tandard_UNECE_MessageFunctionCode_D20A.xsd | 0 ...ct_data_standard_QualifiedDataType_128.xsd | 0 ...AggregateBusinessInformationEntity_128.xsd | 0 ..._data_standard_UnqualifiedDataType_128.xsd | 0 ...wo-letterCountryCode_SecondEdition2006.xsd | 0 ...ACIOMessageStructure_100pD20B-compiled.xsl | 4 +- ...SCRDMCCBDACIOMessageStructure_100pD20B.xsd | 0 ...EDIFICAS-EU_AccountingAccountType_D11A.xsd | 0 ...EN16931_AllowanceChargeReasonCode_D20A.xsd | 0 ...d_ISO_ISO3AlphaCurrencyCode_2012-08-31.xsd | 0 ...odelist_standard_UNECE_ActionCode_D20A.xsd | 0 ...tandard_UNECE_ContactFunctionCode_D20A.xsd | 0 ..._standard_UNECE_DeliveryTermsCode_2010.xsd | 0 ...d_UNECE_DeliveryTermsFunctionCode_D20A.xsd | 0 ...t_standard_UNECE_DocumentNameCode_D20A.xsd | 0 ...standard_UNECE_DocumentStatusCode_D20A.xsd | 0 ...standard_UNECE_DutyTaxFeeTypeCode_D20A.xsd | 0 ..._UNECE_DutyorTaxorFeeCategoryCode_D20A.xsd | 0 ...tandard_UNECE_MessageFunctionCode_D20A.xsd | 0 ...st_standard_UNECE_PackageTypeCode_2006.xsd | 0 ...t_standard_UNECE_PaymentMeansCode_D20A.xsd | 0 ..._standard_UNECE_ReferenceTypeCode_D20A.xsd | 0 ...ct_data_standard_QualifiedDataType_128.xsd | 0 ...AggregateBusinessInformationEntity_128.xsd | 0 ..._data_standard_UnqualifiedDataType_128.xsd | 0 ...wo-letterCountryCode_SecondEdition2006.xsd | 0 ...ACIOMessageStructure_100pD20B-compiled.xsl | 4 +- ...SCRDMCCBDACIOMessageStructure_100pD20B.xsd | 0 ...EDIFICAS-EU_AccountingAccountType_D11A.xsd | 0 ...EN16931_AllowanceChargeReasonCode_D20A.xsd | 0 ...d_ISO_ISO3AlphaCurrencyCode_2012-08-31.xsd | 0 ...odelist_standard_UNECE_ActionCode_D20A.xsd | 0 ...tandard_UNECE_ContactFunctionCode_D20A.xsd | 0 ..._standard_UNECE_DeliveryTermsCode_2010.xsd | 0 ...d_UNECE_DeliveryTermsFunctionCode_D20A.xsd | 0 ...t_standard_UNECE_DocumentNameCode_D20A.xsd | 0 ...standard_UNECE_DocumentStatusCode_D20A.xsd | 0 ...standard_UNECE_DutyTaxFeeTypeCode_D20A.xsd | 0 ..._UNECE_DutyorTaxorFeeCategoryCode_D20A.xsd | 0 ...dard_UNECE_EventTimeReferenceCode_D20A.xsd | 0 ...tandard_UNECE_MessageFunctionCode_D20A.xsd | 0 ...st_standard_UNECE_PackageTypeCode_2006.xsd | 0 ...t_standard_UNECE_PaymentMeansCode_D20A.xsd | 0 ..._standard_UNECE_ReferenceTypeCode_D20A.xsd | 0 ...tandard_UNECE_TimePointFormatCode_D19B.xsd | 0 ...ct_data_standard_QualifiedDataType_128.xsd | 0 ...AggregateBusinessInformationEntity_128.xsd | 0 ..._data_standard_UnqualifiedDataType_128.xsd | 0 ...wo-letterCountryCode_SecondEdition2006.xsd | 0 .../facturx}/xsd/zugferd/ZUGFeRD1p0.xsd | 0 ...act_data_standard_QualifiedDataType_12.xsd | 0 ...eAggregateBusinessInformationEntity_12.xsd | 0 ...t_data_standard_UnqualifiedDataType_15.xsd | 0 tests/__init__.py | 0 110 files changed, 1307 insertions(+), 954 deletions(-) create mode 100644 .copier-answers.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/release.yml create mode 100644 .pre-commit-config.yaml rename LICENSE => LICENSE.txt (99%) delete mode 100644 facturx/__init__.py delete mode 100755 facturx/scripts/pdfgen.py create mode 100644 src/facturx/__init__.py rename {facturx => src/facturx}/facturx.py (60%) rename {facturx => src/facturx}/scripts/__init__.py (100%) rename {facturx => src/facturx}/scripts/pdfextractxml.py (55%) create mode 100755 src/facturx/scripts/pdfgen.py rename {facturx => src/facturx}/scripts/webservice.py (52%) rename {facturx => src/facturx}/scripts/xmlcheck.py (57%) rename {facturx => src/facturx}/xmp/Factur-X_extension_schema.xmp (95%) rename {facturx => src/facturx}/xmp/ZUGFeRD_extension_schema.xmp (98%) rename {facturx => src/facturx}/xsd/facturx-basic/Factur-X_1.08_BASIC-compiled.xsl (99%) rename {facturx => src/facturx}/xsd/facturx-basic/Factur-X_1.08_BASIC.xsd (100%) rename {facturx => src/facturx}/xsd/facturx-basic/Factur-X_1.08_BASIC_codedb.xml (100%) rename {facturx => src/facturx}/xsd/facturx-basic/Factur-X_1.08_BASIC_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd (100%) rename {facturx => src/facturx}/xsd/facturx-basic/Factur-X_1.08_BASIC_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd (100%) rename {facturx => src/facturx}/xsd/facturx-basic/Factur-X_1.08_BASIC_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd (100%) rename {facturx => src/facturx}/xsd/facturx-basicwl/Factur-X_1.08_BASICWL-compiled.xsl (99%) rename {facturx => src/facturx}/xsd/facturx-basicwl/Factur-X_1.08_BASICWL.xsd (100%) rename {facturx => src/facturx}/xsd/facturx-basicwl/Factur-X_1.08_BASICWL_codedb.xml (100%) rename {facturx => src/facturx}/xsd/facturx-basicwl/Factur-X_1.08_BASICWL_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd (100%) rename {facturx => src/facturx}/xsd/facturx-basicwl/Factur-X_1.08_BASICWL_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd (100%) rename {facturx => src/facturx}/xsd/facturx-basicwl/Factur-X_1.08_BASICWL_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd (100%) rename {facturx => src/facturx}/xsd/facturx-en16931/Factur-X_1.08_EN16931-compiled.xsl (99%) rename {facturx => src/facturx}/xsd/facturx-en16931/Factur-X_1.08_EN16931.xsd (100%) rename {facturx => src/facturx}/xsd/facturx-en16931/Factur-X_1.08_EN16931_codedb.xml (100%) rename {facturx => src/facturx}/xsd/facturx-en16931/Factur-X_1.08_EN16931_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd (100%) rename {facturx => src/facturx}/xsd/facturx-en16931/Factur-X_1.08_EN16931_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd (100%) rename {facturx => src/facturx}/xsd/facturx-en16931/Factur-X_1.08_EN16931_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd (100%) rename {facturx => src/facturx}/xsd/facturx-extended/Factur-X_1.08_EXTENDED-compiled.xsl (99%) rename {facturx => src/facturx}/xsd/facturx-extended/Factur-X_1.08_EXTENDED.xsd (100%) rename {facturx => src/facturx}/xsd/facturx-extended/Factur-X_1.08_EXTENDED_codedb.xml (100%) rename {facturx => src/facturx}/xsd/facturx-extended/Factur-X_1.08_EXTENDED_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd (100%) rename {facturx => src/facturx}/xsd/facturx-extended/Factur-X_1.08_EXTENDED_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd (100%) rename {facturx => src/facturx}/xsd/facturx-extended/Factur-X_1.08_EXTENDED_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd (100%) rename {facturx => src/facturx}/xsd/facturx-minimum/Factur-X_1.08_MINIMUM-compiled.xsl (99%) rename {facturx => src/facturx}/xsd/facturx-minimum/Factur-X_1.08_MINIMUM.xsd (100%) rename {facturx => src/facturx}/xsd/facturx-minimum/Factur-X_1.08_MINIMUM_codedb.xml (100%) rename {facturx => src/facturx}/xsd/facturx-minimum/Factur-X_1.08_MINIMUM_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd (100%) rename {facturx => src/facturx}/xsd/facturx-minimum/Factur-X_1.08_MINIMUM_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd (100%) rename {facturx => src/facturx}/xsd/facturx-minimum/Factur-X_1.08_MINIMUM_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B-compiled.xsl (99%) rename {facturx => src/facturx}/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_ISO_ISO3AlphaCurrencyCode_2012-08-31.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ActionCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsCode_2010.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsFunctionCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentNameCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentStatusCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_MessageFunctionCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_QualifiedDataType_128.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_128.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_128.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_identifierlist_standard_ISO_ISOTwo-letterCountryCode_SecondEdition2006.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B-compiled.xsl (99%) rename {facturx => src/facturx}/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_EDIFICAS-EU_AccountingAccountType_D11A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_EN16931_AllowanceChargeReasonCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_ISO_ISO3AlphaCurrencyCode_2012-08-31.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ActionCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ContactFunctionCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsCode_2010.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsFunctionCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentNameCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentStatusCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DutyTaxFeeTypeCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DutyorTaxorFeeCategoryCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_MessageFunctionCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_PackageTypeCode_2006.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_PaymentMeansCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ReferenceTypeCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_QualifiedDataType_128.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_128.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_128.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_identifierlist_standard_ISO_ISOTwo-letterCountryCode_SecondEdition2006.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B-compiled.xsl (99%) rename {facturx => src/facturx}/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_EDIFICAS-EU_AccountingAccountType_D11A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_EN16931_AllowanceChargeReasonCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_ISO_ISO3AlphaCurrencyCode_2012-08-31.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ActionCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ContactFunctionCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsCode_2010.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsFunctionCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentNameCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentStatusCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DutyTaxFeeTypeCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DutyorTaxorFeeCategoryCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_EventTimeReferenceCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_MessageFunctionCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_PackageTypeCode_2006.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_PaymentMeansCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ReferenceTypeCode_D20A.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_TimePointFormatCode_D19B.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_QualifiedDataType_128.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_128.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_128.xsd (100%) rename {facturx => src/facturx}/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_identifierlist_standard_ISO_ISOTwo-letterCountryCode_SecondEdition2006.xsd (100%) rename {facturx => src/facturx}/xsd/zugferd/ZUGFeRD1p0.xsd (100%) rename {facturx => src/facturx}/xsd/zugferd/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_QualifiedDataType_12.xsd (100%) rename {facturx => src/facturx}/xsd/zugferd/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_12.xsd (100%) rename {facturx => src/facturx}/xsd/zugferd/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_15.xsd (100%) create mode 100644 tests/__init__.py diff --git a/.copier-answers.yml b/.copier-answers.yml new file mode 100644 index 0000000..3faaba1 --- /dev/null +++ b/.copier-answers.yml @@ -0,0 +1,17 @@ +# Do NOT update manually; changes here will be overwritten by Copier +_commit: 55503af +_src_path: https://github.com/akretion/copier-python-package +author_email: alexis.delattre@akretion.com +author_name: Alexis de Lattre +development_status: 5 - Production/Stable +github_repo: factur-x +licence: BSD License +package_description: 'Factur-X and Order-X: electronic invoicing and ordering standards' +package_name: factur-x +python_version: +- '3.9' +- '3.10' +- '3.11' +- '3.12' +- '3.13' +- '3.14' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..7bbc9d7 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,34 @@ +--- +name: CI + +on: + push: + branches: ["master"] + tags: ["*"] + pull_request: + +jobs: + tests: + name: "Python ${{ matrix.python-version }}" + runs-on: "ubuntu-latest" + strategy: + fail-fast: false + matrix: + python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14'] + steps: + - uses: "actions/checkout@v3" + - uses: "actions/setup-python@v4" + with: + python-version: "${{ matrix.python-version }}" + allow-prereleases: true + - name: "Install dependencies" + run: | + set -xe + python -VV + python -m site + python -m pip install .[test] + - name: "Run pytest targets for ${{ matrix.python-version }}" + run: | + coverage run --source src -m pytest tests -v + coverage xml + - uses: codecov/codecov-action@v3 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..ae06a3f --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,29 @@ +on: + release: + types: + - published + +name: release + +jobs: + pypi: + name: upload release to PyPI + runs-on: ubuntu-latest + environment: release + + permissions: + # Used to authenticate to PyPI via OIDC. + id-token: write + + steps: + - uses: actions/checkout@v3 + + - uses: actions/setup-python@v4 + with: + python-version: ">= 3.7" + + - name: build + run: pipx run build + + - name: publish + uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.gitignore b/.gitignore index 7bbc71c..26e7180 100644 --- a/.gitignore +++ b/.gitignore @@ -1,101 +1,28 @@ -# Byte-compiled / optimized / DLL files +# Global directories __pycache__/ -*.py[cod] -*$py.class -# C extensions +# Global files +*.py[cod] +*.dll *.so - -# Distribution / packaging -.Python -env/ -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -*.egg-info/ -.installed.cfg -*.egg - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -.hypothesis/ - -# Translations -*.mo -*.pot - -# Django stuff: *.log -local_settings.py - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# pyenv -.python-version - -# celery beat schedule file -celerybeat-schedule - -# SageMath parsed files -*.sage.py - -# dotenv -.env - -# virtualenv -.venv -venv/ -ENV/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ +*.swp + +# Root directories +/.benchmarks/ +/.cache/ +/.env/ +/.idea/ +/.mypy_cache/ +/.pytest_cache/ +/.ruff_cache/ +/.vscode/ +/backend/dist/ +/dist/ +/site/ + +# Root files +/.coverage* + +# Auto-generated during builds +/src/factur-x/_version.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..0179350 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,16 @@ +default_language_version: + python: python3 +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: check-toml + - id: check-yaml + - id: end-of-file-fixer + - id: trailing-whitespace + - repo: https://github.com/charliermarsh/ruff-pre-commit + rev: v0.4.2 + hooks: + - id: ruff + args: [--exit-non-zero-on-fix] + - id: ruff-format diff --git a/LICENSE b/LICENSE.txt similarity index 99% rename from LICENSE rename to LICENSE.txt index 1c413dc..a5e4f2f 100644 --- a/LICENSE +++ b/LICENSE.txt @@ -1,3 +1,4 @@ + Copyright (c) 2016-2023, Alexis de Lattre All rights reserved. diff --git a/facturx/__init__.py b/facturx/__init__.py deleted file mode 100644 index c2d5da8..0000000 --- a/facturx/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -__version__ = "4.2" -from .facturx import generate_from_file, \ - generate_from_binary, \ - get_xml_namespaces, \ - get_flavor, \ - get_facturx_level, \ - get_level, \ - xml_check_xsd, \ - xml_check_schematron, \ - get_facturx_xml_from_pdf, \ - get_orderx_xml_from_pdf, \ - get_xml_from_pdf, \ - get_orderx_type diff --git a/facturx/scripts/pdfgen.py b/facturx/scripts/pdfgen.py deleted file mode 100755 index 2e9de5d..0000000 --- a/facturx/scripts/pdfgen.py +++ /dev/null @@ -1,199 +0,0 @@ -#! /usr/bin/env python -# Copyright 2017-2023 Alexis de Lattre - -import argparse -import sys -from facturx import generate_from_file, __version__ as fxversion -from facturx.facturx import logger -import logging -from os.path import isfile, isdir, basename - -__author__ = "Alexis de Lattre " -__date__ = "October 2025" -__version__ = "0.9" - - -def pdfgen(args): - logger.info('pdfgen version %s using factur-x lib version %s', __version__, fxversion) - if args.log_level: - log_level = args.log_level.lower() - log_map = { - 'debug': logging.DEBUG, - 'info': logging.INFO, - 'warn': logging.WARN, - 'error': logging.ERROR, - } - if log_level in log_map: - logger.setLevel(log_map[log_level]) - else: - logger.error( - 'Wrong value for log level (%s). Possible values: %s', - log_level, ', '.join(log_map.keys())) - sys.exit(1) - - pdf_filename = args.regular_pdf_file - output_pdf_filename = args.facturx_orderx_pdf_file - additional_attachment_filenames = args.optional_attachments - for filename in [pdf_filename, args.xml_file] + additional_attachment_filenames: - if not isfile(filename): - logger.error('Argument %s is not a filename', filename) - sys.exit(1) - if isdir(output_pdf_filename): - logger.error( - '3rd argument %s is a directory name (should be a the ' - 'Factur-X or Order-X PDF filename)', output_pdf_filename) - sys.exit(1) - check_xsd = not args.disable_xsd_check - check_schematron = not args.disable_schematron_check - pdf_metadata = None - if ( - args.meta_author or - args.meta_keywords or - args.meta_title or - args.meta_subject): - pdf_metadata = { - 'author': args.meta_author, - 'keywords': args.meta_keywords, - 'title': args.meta_title, - 'subject': args.meta_subject, - } - if isfile(output_pdf_filename): - if args.overwrite: - logger.warning( - 'File %s already exists. Overwriting it.', - output_pdf_filename) - else: - logger.error( - 'File %s already exists. Exit.', output_pdf_filename) - sys.exit(1) - attachments = {} - for additional_attachment_filename in additional_attachment_filenames: - attachments[basename(additional_attachment_filename)] = { - 'filepath': additional_attachment_filename} - lang = args.lang or None - xmp_compression = not args.disable_xmp_compression - try: - # The important line of code is below ! - generate_from_file( - pdf_filename, args.xml_file, - check_xsd=check_xsd, check_schematron=check_schematron, - flavor=args.flavor, level=args.level, orderx_type=args.orderx_type, - pdf_metadata=pdf_metadata, lang=lang, output_pdf_file=output_pdf_filename, - attachments=attachments, afrelationship=args.afrelationship, - xmp_compression=xmp_compression) - except Exception: - # no need to re-print the error log, it is already present in the logs - logger.error('factur-x lib call failed, exiting.') - sys.exit(1) - - -def main(args=None): - if args is None: - args = sys.argv[1:] - usage = "facturx-pdfgen "\ - " " - epilog = "Author: %s - Version: %s" % (__author__, __version__) - description = "This script generate a Factur-X or Order-X PDF from a "\ - "regular PDF/A document and a Factur-X or Order-X XML file. "\ - "It can also include additional embedded files in the PDF. "\ - "To generate a valid PDF/A-3 document as requested by the "\ - "Factur-X/Order-X standards, you need to give a valid PDF/A "\ - "document as input."\ - "\n\nIf you use one of the --meta-* arguments, you should specify "\ - "all the meta-* arguments because the default values for "\ - "metadata only apply if none of the meta-* arguments are used." - parser = argparse.ArgumentParser( - usage=usage, epilog=epilog, description=description) - parser.add_argument( - '-l', '--log-level', dest='log_level', default='info', - help="Set log level. Possible values: debug, info, warn, error. " - "Default value: info.") - parser.add_argument( - '-d', '--disable-xsd-check', dest='disable_xsd_check', - action='store_true', - help="De-activate XML Schema Definition check on XML file " - "(the check is enabled by default)") - parser.add_argument( - '-ds', '--disable-schematron-check', dest='disable_schematron_check', - action='store_true', - help="De-activate Schematron check on XML file " - "(the check is enabled by default)") - parser.add_argument( - '-f', '--flavor', dest='flavor', default='autodetect', - help="Specify if you want to generate a Factur-X or Order-X PDF file. " - "Default: autodetect. If you specify a particular flavor instead of " - "using autodetection from the XML, you will win a very small amount of time " - "(less than 1 millisecond). " - "Possible values: order-x, factur-x or autodetect.") - parser.add_argument( - '-n', '--level', '--facturx-level', dest='level', default='autodetect', - help="Specify the Factur-X or Order-X level of the XML file. " - "Default: autodetect. If you specify a particular level instead of " - "using autodetection, you will win a very small amount of time " - "(less than 1 millisecond). " - "Possible values for Factur-X: minimum, basicwl, basic, en16931, extended." - "Possible values for Order-X: basic, comfort, extended." - ) - parser.add_argument( - '-p', '--orderx-type', dest='orderx_type', default='autodetect', - help="When you generate an Order-X document, specify the order type. " - "Default: autodetect. If you specify a particular order type instead of " - "using autodetection, you will win a very small amount of time " - "(less than 1 millisecond). " - "Possible values: order, order_change, order_response.") - parser.add_argument( - '-g', '--lang', dest='lang', - help="Set the language identifier as RFC 3066 to specify the " - "natural language of the PDF document. Example: en-US.") - parser.add_argument( - '-r', '--afrelationship', dest='afrelationship', default='data', - help="Set the AFRelationship PDF property of the Factur-X/Order-X XML file. " - "Possible values: data, source, alternative. " - "Default value: data.") - parser.add_argument( - '-a', '--meta-author', dest='meta_author', - help="Specify the author for PDF metadata. Default: use the vendor " - "name extracted from the XML file.") - parser.add_argument( - '-k', '--meta-keywords', dest='meta_keywords', - help="Specify the keywords for PDF metadata. " - "Default for Factur-X: 'Invoice, Factur-X'." - "Default for Order-X: 'Order Change, Order-X' where 'Order Change' is " - "the order type.") - parser.add_argument( - '-t', '--meta-title', dest='meta_title', - help="Specify the title of PDF metadata. " - "Default: generic English title with information extracted from " - "the XML file such as: 'Akretion: Invoice I1242'") - parser.add_argument( - '-s', '--meta-subject', dest='meta_subject', - help="Specify the subject of PDF metadata. " - "Default: generic English subject with information extracted from the " - "XML file such as: " - "'Factur-X invoice I1242 dated 2017-08-17 issued by Akretion'") - parser.add_argument( - '-nz', '--disable-xmp-compression', dest="disable_xmp_compression", - action='store_true', help="Disable flate compression of the XMP metadata " - "(compression is enabled by default). You should disable compression of " - "the XMP metadata if you plan to later add a PAdES signature " - "on the generated PDF file.") - parser.add_argument( - '-w', '--overwrite', dest='overwrite', action='store_true', - help="Overwrite output PDF file if it already exists.") - parser.add_argument("regular_pdf_file", help="Regular PDF invoice") - parser.add_argument("xml_file", help="Factur-X or Order-X XML file") - parser.add_argument( - "facturx_orderx_pdf_file", help="Generated Factur-X or Order-X PDF file") - parser.add_argument( - "optional_attachments", nargs='*', - help="Optional list of additionnal attachments") - args = parser.parse_args() - pdfgen(args) - - -def run(): - if __name__ == '__main__': - main() - - -run() diff --git a/pyproject.toml b/pyproject.toml index 290131a..c145406 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,26 +1,34 @@ +[build-system] +requires = ["hatchling", "hatch-vcs"] +build-backend = "hatchling.build" + [project] name = "factur-x" description = "Factur-X and Order-X: electronic invoicing and ordering standards" authors = [{name = "Alexis de Lattre", email = "alexis.delattre@akretion.com"}] -readme = "README.rst" classifiers = [ - "Programming Language :: Python", "Topic :: Office/Business :: Financial :: Accounting", "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", ] +readme = "README.rst" keywords = ["e-invoice", "ZUGFeRD", "Factur-X", "Order-X", "e-procurement"] -license = {file = "LICENSE"} -requires-python = ">=3.7" -dynamic = ["dependencies", "version"] +license = {file = "LICENSE.txt"} +dependencies = [ +] +requires-python = ">=3.9" +dynamic = ["version"] -# Needed if we enable facturx-webservice -# [project.optional-dependencies] -# web = [ -# "flask" -# ] +[project.optional-dependencies] +test = [ + "pytest", + "coverage[toml]", +] [project.urls] Homepage = "https://github.com/akretion/factur-x" @@ -34,15 +42,59 @@ facturx-xmlcheck = "facturx.scripts.xmlcheck:main" # I consider the webservice scripts as a proof of concept, not real clean code # facturx-webservice = "facturx.scripts.webservice:main" -[build-system] -requires = ["hatchling", "hatch-requirements-txt"] -build-backend = "hatchling.build" +[tool.hatch.version] +source = "vcs" -[tool.hatch.metadata.hooks.requirements_txt] -files = ["requirements.txt"] +[tool.hatch.build] +exclude = [ + "/.github", +] [tool.hatch.build.targets.wheel] -packages = ["facturx"] +packages = ["src/facturx"] -[tool.hatch.version] -path = "facturx/__init__.py" +[tool.ruff] +target-version = "py39" +fix = true + +[tool.ruff.lint] +select = [ + "B", + "E", + "F", + "I", + "UP", + "W", +] +ignore = [ +] +exclude = [ + "docs/conf.py", +] + +[tool.ruff.lint.isort] +known-first-party = [] + + +[tool.coverage.run] +branch = true +source_pkgs = ["factur-x"] + +[tool.coverage.paths] +source = ["src", ".tox/*/site-packages"] + +[tool.coverage.report] +show_missing = true +exclude_lines = [ + "pragma: no cover", +] + + + +[tool.towncrier] +package = "factur-x" +package_dir = "src" +filename = "HISTORY.rst" +directory = "news" +issue_format = "`#{issue} `_" +title_format = "{version} ({project_date})" diff --git a/src/facturx/__init__.py b/src/facturx/__init__.py new file mode 100644 index 0000000..7c7d28a --- /dev/null +++ b/src/facturx/__init__.py @@ -0,0 +1,15 @@ +__version__ = "4.2" +from .facturx import ( + generate_from_binary, + generate_from_file, + get_facturx_level, + get_facturx_xml_from_pdf, + get_flavor, + get_level, + get_orderx_type, + get_orderx_xml_from_pdf, + get_xml_from_pdf, + get_xml_namespaces, + xml_check_schematron, + xml_check_xsd, +) diff --git a/facturx/facturx.py b/src/facturx/facturx.py similarity index 60% rename from facturx/facturx.py rename to src/facturx/facturx.py index bac4d6d..5df3b51 100644 --- a/facturx/facturx.py +++ b/src/facturx/facturx.py @@ -27,89 +27,97 @@ # - add automated tests (currently, we only have tests at odoo module level) # - keep original metadata by copy of pdf_tailer[/Info] ? +import importlib.resources as importlib_resources +from datetime import datetime from io import BytesIO, IOBase -from lxml import etree from tempfile import NamedTemporaryFile -from datetime import datetime -from pypdf import PdfWriter, PdfReader -from pypdf.generic import DictionaryObject, DecodedStreamObject, \ - NameObject, NumberObject, ArrayObject, create_string_object, ByteStringObject + import saxonche -import importlib.resources as importlib_resources +from lxml import etree +from pypdf import PdfReader, PdfWriter +from pypdf.generic import ( + ArrayObject, + ByteStringObject, + DecodedStreamObject, + DictionaryObject, + NameObject, + NumberObject, + create_string_object, +) + try: importlib_resources.files # added in py3.9 except AttributeError: import importlib_resources # py3.8 compat: pip install importlib-resources -import importlib.metadata -import os.path -import mimetypes import hashlib +import importlib.metadata import logging - +import mimetypes +import os.path VERSION = importlib.metadata.version("factur-x") -FORMAT = '%(asctime)s [%(levelname)s] %(message)s' +FORMAT = "%(asctime)s [%(levelname)s] %(message)s" logging.basicConfig(format=FORMAT) -logger = logging.getLogger('factur-x') +logger = logging.getLogger("factur-x") logger.setLevel(logging.INFO) -FACTURX_FILENAME = 'factur-x.xml' -ZUGFERD_FILENAMES = ['zugferd-invoice.xml', 'ZUGFeRD-invoice.xml'] -ORDERX_FILENAME = 'order-x.xml' +FACTURX_FILENAME = "factur-x.xml" +ZUGFERD_FILENAMES = ["zugferd-invoice.xml", "ZUGFeRD-invoice.xml"] +ORDERX_FILENAME = "order-x.xml" ALL_FILENAMES = [FACTURX_FILENAME] + ZUGFERD_FILENAMES + [ORDERX_FILENAME] FACTURX_LEVEL2xsd = { - 'minimum': 'facturx-minimum/Factur-X_1.08_MINIMUM.xsd', - 'basicwl': 'facturx-basicwl/Factur-X_1.08_BASICWL.xsd', - 'basic': 'facturx-basic/Factur-X_1.08_BASIC.xsd', - 'en16931': 'facturx-en16931/Factur-X_1.08_EN16931.xsd', - 'extended': 'facturx-extended/Factur-X_1.08_EXTENDED.xsd', + "minimum": "facturx-minimum/Factur-X_1.08_MINIMUM.xsd", + "basicwl": "facturx-basicwl/Factur-X_1.08_BASICWL.xsd", + "basic": "facturx-basic/Factur-X_1.08_BASIC.xsd", + "en16931": "facturx-en16931/Factur-X_1.08_EN16931.xsd", + "extended": "facturx-extended/Factur-X_1.08_EXTENDED.xsd", } ORDERX_LEVEL2xsd = { - 'basic': 'orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B.xsd', - 'comfort': 'orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B.xsd', - 'extended': 'orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B.xsd', - } + "basic": "orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B.xsd", + "comfort": "orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B.xsd", + "extended": "orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B.xsd", +} FACTURX_LEVEL2xmp = { - 'minimum': 'MINIMUM', - 'basicwl': 'BASIC WL', - 'basic': 'BASIC', - 'en16931': 'EN 16931', - 'extended': 'EXTENDED', - } -ORDERX_TYPES = ('order', 'order_change', 'order_response') + "minimum": "MINIMUM", + "basicwl": "BASIC WL", + "basic": "BASIC", + "en16931": "EN 16931", + "extended": "EXTENDED", +} +ORDERX_TYPES = ("order", "order_change", "order_response") ORDERX_code2type = { - '220': 'order', - '230': 'order_change', - '231': 'order_response', - } -XML_AFRelationship = ('data', 'source', 'alternative') -ATTACHMENTS_AFRelationship = ('supplement', 'unspecified') + "220": "order", + "230": "order_change", + "231": "order_response", +} +XML_AFRelationship = ("data", "source", "alternative") +ATTACHMENTS_AFRelationship = ("supplement", "unspecified") XML_NAMESPACES = { - 'factur-x': { - 'qdt': 'urn:un:unece:uncefact:data:standard:QualifiedDataType:100', - 'ram': 'urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100', - 'rsm': 'urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100', - 'udt': 'urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100', - 'xsi': 'http://www.w3.org/2001/XMLSchema-instance', + "factur-x": { + "qdt": "urn:un:unece:uncefact:data:standard:QualifiedDataType:100", + "ram": "urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100", + "rsm": "urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100", + "udt": "urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100", + "xsi": "http://www.w3.org/2001/XMLSchema-instance", + }, + "order-x": { + "qdt": "urn:un:unece:uncefact:data:standard:QualifiedDataType:128", + "ram": "urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:128", + "rsm": "urn:un:unece:uncefact:data:SCRDMCCBDACIOMessageStructure:100", + "udt": "urn:un:unece:uncefact:data:standard:UnqualifiedDataType:128", + "xsi": "http://www.w3.org/2001/XMLSchema-instance", }, - 'order-x': { - 'qdt': 'urn:un:unece:uncefact:data:standard:QualifiedDataType:128', - 'ram': 'urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:128', - 'rsm': 'urn:un:unece:uncefact:data:SCRDMCCBDACIOMessageStructure:100', - 'udt': 'urn:un:unece:uncefact:data:standard:UnqualifiedDataType:128', - 'xsi': 'http://www.w3.org/2001/XMLSchema-instance', - }, - 'zugferd': { - 'ram': 'urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:12', - 'rsm': 'urn:ferd:CrossIndustryDocument:invoice:1p0', - 'udt': 'urn:un:unece:uncefact:data:standard:UnqualifiedDataType:15', - 'xsi': 'http://www.w3.org/2001/XMLSchema-instance', + "zugferd": { + "ram": "urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:12", + "rsm": "urn:ferd:CrossIndustryDocument:invoice:1p0", + "udt": "urn:un:unece:uncefact:data:standard:UnqualifiedDataType:15", + "xsi": "http://www.w3.org/2001/XMLSchema-instance", }, } -CREATOR = f'factur-x Python lib v{VERSION} by Alexis de Lattre' +CREATOR = f"factur-x Python lib v{VERSION} by Alexis de Lattre" -def xml_check_xsd(xml, flavor='autodetect', level='autodetect'): +def xml_check_xsd(xml, flavor="autodetect", level="autodetect"): """ Validate the XML file against the XSD :param xml: the Factur-X or Order-X XML @@ -125,95 +133,91 @@ def xml_check_xsd(xml, flavor='autodetect', level='autodetect'): :return: True if the XML is valid against the XSD raise an error if it is not valid against the XSD """ - logger.debug( - 'xml_check_xsd with factur-x lib %s', VERSION) + logger.debug("xml_check_xsd with factur-x lib %s", VERSION) if not isinstance(flavor, str): - raise ValueError('Wrong type for flavor argument') + raise ValueError("Wrong type for flavor argument") if not isinstance(level, (type(None), str)): - raise ValueError('Wrong type for level argument') + raise ValueError("Wrong type for level argument") start_chrono = datetime.now() xml_etree = None if isinstance(xml, bytes): xml_bytes = xml elif isinstance(xml, str): - xml_bytes = xml.encode('utf8') - elif isinstance(xml, type(etree.Element('pouet'))): + xml_bytes = xml.encode("utf8") + elif isinstance(xml, type(etree.Element("pouet"))): xml_etree = xml xml_bytes = etree.tostring( - xml, pretty_print=True, encoding='UTF-8', - xml_declaration=True) + xml, pretty_print=True, encoding="UTF-8", xml_declaration=True + ) elif isinstance(xml, IOBase): xml.seek(0) xml_bytes = xml.read() xml.close() else: - raise ValueError('Wrong type for xml argument') + raise ValueError("Wrong type for xml argument") if not xml_bytes: - raise ValueError('xml argument is empty') + raise ValueError("xml argument is empty") # autodetect - if flavor not in ('factur-x', 'facturx', 'zugferd', 'order-x', 'orderx'): + if flavor not in ("factur-x", "facturx", "zugferd", "order-x", "orderx"): if xml_etree is None: try: xml_etree = etree.fromstring(xml_bytes) except Exception as e: - raise Exception( - "The XML syntax is invalid: %s." % str(e)) + raise Exception("The XML syntax is invalid: %s." % str(e)) flavor = get_flavor(xml_etree) - if flavor in ('factur-x', 'facturx'): + if flavor in ("factur-x", "facturx"): if level not in FACTURX_LEVEL2xsd: if xml_etree is None: try: xml_etree = etree.fromstring(xml_bytes) except Exception as e: - raise Exception( - "The XML syntax is invalid: %s." % str(e)) + raise Exception("The XML syntax is invalid: %s." % str(e)) level = get_level(xml_etree, flavor) if level not in FACTURX_LEVEL2xsd: - raise ValueError( - "Wrong level '%s' for Factur-X invoice." % level) - xsd_file = 'xsd/%s' % FACTURX_LEVEL2xsd[level] - elif flavor == 'zugferd': - xsd_file = 'xsd/zugferd/ZUGFeRD1p0.xsd' - elif flavor in ('order-x', 'orderx'): + raise ValueError("Wrong level '%s' for Factur-X invoice." % level) + xsd_file = "xsd/%s" % FACTURX_LEVEL2xsd[level] + elif flavor == "zugferd": + xsd_file = "xsd/zugferd/ZUGFeRD1p0.xsd" + elif flavor in ("order-x", "orderx"): if level not in ORDERX_LEVEL2xsd: if xml_etree is None: try: xml_etree = etree.fromstring(xml_bytes) except Exception as e: - raise Exception( - "The XML syntax is invalid: %s." % str(e)) + raise Exception("The XML syntax is invalid: %s." % str(e)) level = get_level(xml_etree, flavor) if level not in ORDERX_LEVEL2xsd: - raise ValueError( - "Wrong level '%s' for Order-X document." % level) - xsd_file = 'xsd/%s' % ORDERX_LEVEL2xsd[level] + raise ValueError("Wrong level '%s' for Order-X document." % level) + xsd_file = "xsd/%s" % ORDERX_LEVEL2xsd[level] xsd_absolute_filepath = importlib_resources.files(__package__).joinpath(xsd_file) - logger.debug('Using XSD file %s', xsd_absolute_filepath) + logger.debug("Using XSD file %s", xsd_absolute_filepath) official_schema = etree.XMLSchema(file=xsd_absolute_filepath) try: t = etree.parse(BytesIO(xml_bytes)) official_schema.assertValid(t) except Exception as e: # if the validation of the XSD fails, we arrive here - logger.error( - "The XML file is invalid against the XML Schema Definition") - logger.error('XSD Error: %s', e) + logger.error("The XML file is invalid against the XML Schema Definition") + logger.error("XSD Error: %s", e) raise Exception( "The %s XML file is not valid against the official " "XML Schema Definition. " "Here is the error, which may give you an idea on the " - "cause of the problem: %s." % (flavor.capitalize(), str(e))) + "cause of the problem: %s." % (flavor.capitalize(), str(e)) + ) end_chrono = datetime.now() logger.info( - '%s XML file successfully validated against XSD in %s sec', - flavor, (end_chrono - start_chrono).total_seconds()) + "%s XML file successfully validated against XSD in %s sec", + flavor, + (end_chrono - start_chrono).total_seconds(), + ) return True -def xml_check_schematron(xml, flavor='autodetect', level='autodetect'): +def xml_check_schematron(xml, flavor="autodetect", level="autodetect"): """ Validate the XML file against the schematron :param xml: the Factur-X or Order-X XML @@ -229,80 +233,74 @@ def xml_check_schematron(xml, flavor='autodetect', level='autodetect'): :return: True if the XML is valid against the schematron raise an error if it is not valid against the schematron """ - logger.debug( - 'xml_check_schematron with factur-x lib %s', VERSION) + logger.debug("xml_check_schematron with factur-x lib %s", VERSION) if not isinstance(flavor, str): - raise ValueError('Wrong type for flavor argument') + raise ValueError("Wrong type for flavor argument") if not isinstance(level, (type(None), str)): - raise ValueError('Wrong type for level argument') + raise ValueError("Wrong type for level argument") start_chrono = datetime.now() xml_etree = None if isinstance(xml, bytes): xml_bytes = xml - xml_str = xml_bytes.decode('utf-8') + xml_str = xml_bytes.decode("utf-8") elif isinstance(xml, str): xml_str = xml - xml_bytes = xml_str.encode('utf-8') - elif isinstance(xml, type(etree.Element('pouet'))): + xml_bytes = xml_str.encode("utf-8") + elif isinstance(xml, type(etree.Element("pouet"))): xml_etree = xml xml_bytes = etree.tostring( - xml, pretty_print=True, encoding='UTF-8', - xml_declaration=True) - xml_str = xml_bytes.decode('utf-8') + xml, pretty_print=True, encoding="UTF-8", xml_declaration=True + ) + xml_str = xml_bytes.decode("utf-8") elif isinstance(xml, IOBase): xml.seek(0) xml_bytes = xml.read() xml.close() - xml_str = xml_bytes.decode('utf-8') + xml_str = xml_bytes.decode("utf-8") else: - raise ValueError('Wrong type for xml argument') + raise ValueError("Wrong type for xml argument") if not xml_str or not xml_bytes: - raise ValueError('xml argument is empty') + raise ValueError("xml argument is empty") # autodetect - if flavor not in ('factur-x', 'facturx', 'zugferd', 'order-x', 'orderx'): + if flavor not in ("factur-x", "facturx", "zugferd", "order-x", "orderx"): if xml_etree is None: try: xml_etree = etree.fromstring(xml_bytes) except Exception as e: - raise Exception( - f"The XML syntax is invalid: {str(e)}.") + raise Exception(f"The XML syntax is invalid: {str(e)}.") flavor = get_flavor(xml_etree) - if flavor in ('factur-x', 'facturx'): + if flavor in ("factur-x", "facturx"): if level not in FACTURX_LEVEL2xsd: if xml_etree is None: try: xml_etree = etree.fromstring(xml_bytes) except Exception as e: - raise Exception( - f"The XML syntax is invalid: {str(e)}.") + raise Exception(f"The XML syntax is invalid: {str(e)}.") level = get_level(xml_etree, flavor) if level not in FACTURX_LEVEL2xsd: - raise ValueError( - f"Wrong level '{level}' for Factur-X invoice.") + raise ValueError(f"Wrong level '{level}' for Factur-X invoice.") xsd_filename = FACTURX_LEVEL2xsd[level] - elif flavor in ('order-x', 'orderx'): + elif flavor in ("order-x", "orderx"): if level not in ORDERX_LEVEL2xsd: if xml_etree is None: try: xml_etree = etree.fromstring(xml_bytes) except Exception as e: - raise Exception( - f"The XML syntax is invalid: {str(e)}.") + raise Exception(f"The XML syntax is invalid: {str(e)}.") level = get_level(xml_etree, flavor) if level not in ORDERX_LEVEL2xsd: - raise ValueError( - f"xsd/{ORDERX_LEVEL2xsd[level][:-4]}-compiled-saxonc.xsl") + raise ValueError(f"xsd/{ORDERX_LEVEL2xsd[level][:-4]}-compiled-saxonc.xsl") xsd_filename = ORDERX_LEVEL2xsd[level] else: - logger.warning('There is no schematron check for flavor %s', flavor) + logger.warning("There is no schematron check for flavor %s", flavor) return True relative_xsl_file = f"xsd/{xsd_filename[:-4]}-compiled.xsl" xsl_file = str(importlib_resources.files(__package__).joinpath(relative_xsl_file)) - logger.debug('Using schematron XSL file %s', xsl_file) - xml_str_no_bom = xml_str.lstrip('\ufeff') + logger.debug("Using schematron XSL file %s", xsl_file) + xml_str_no_bom = xml_str.lstrip("\ufeff") errors = [] with saxonche.PySaxonProcessor() as saxproc: xslt_proc = saxproc.new_xslt30_processor() @@ -312,42 +310,52 @@ def xml_check_schematron(xml, flavor='autodetect', level='autodetect'): # stylesheet export files can then be used by saxon HE executable = xslt_proc.compile_stylesheet(stylesheet_file=xsl_file) result_str = executable.transform_to_string(xdm_node=xdm_node) - logger.debug('schematron result_str=%s', result_str) + logger.debug("schematron result_str=%s", result_str) try: - svrl_root = etree.fromstring(result_str.encode('utf-8')) + svrl_root = etree.fromstring(result_str.encode("utf-8")) except Exception as e: - logger.error(f"Schematron check generated an invalid XML output. Error: {str(e)}") - logger.info('Unable to validate %s XML file against schematron', flavor) + logger.error( + f"Schematron check generated an invalid XML output. Error: {str(e)}" + ) + logger.info("Unable to validate %s XML file against schematron", flavor) return False xpath_errors = svrl_root.xpath( - ".//svrl:successful-report | .//svrl:failed-assert", namespaces=svrl_root.nsmap) + ".//svrl:successful-report | .//svrl:failed-assert", namespaces=svrl_root.nsmap + ) error_nr = 1 for xpath_error in xpath_errors: - detail_xpath = xpath_error.xpath("*[local-name() = 'text']", namespaces=svrl_root.nsmap) + detail_xpath = xpath_error.xpath( + "*[local-name() = 'text']", namespaces=svrl_root.nsmap + ) if detail_xpath: error_msg = detail_xpath[0].text and detail_xpath[0].text.strip() - error_msg = f'{error_nr}. {error_msg}' - location = xpath_error.attrib and xpath_error.attrib.get('location') + error_msg = f"{error_nr}. {error_msg}" + location = xpath_error.attrib and xpath_error.attrib.get("location") if location: - error_msg = f'{error_msg}\nError location: {location}' + error_msg = f"{error_msg}\nError location: {location}" errors.append(error_msg) error_nr += 1 if errors: logger.error( - "The XML file is invalid against the schematron: %d errors found.", len(errors)) + "The XML file is invalid against the schematron: %d errors found.", + len(errors), + ) for error_msg in errors: logger.error(error_msg) - error_list_str = '\n'.join(errors) + error_list_str = "\n".join(errors) full_error = ( f"The Factur-X XML file is not valid against the official " - f"schematron. {len(errors)} errors found:\n{error_list_str}") + f"schematron. {len(errors)} errors found:\n{error_list_str}" + ) raise Exception(full_error) end_chrono = datetime.now() logger.info( - '%s XML file successfully validated against schematron in %s sec', - flavor, (end_chrono - start_chrono).total_seconds()) + "%s XML file successfully validated against schematron in %s sec", + flavor, + (end_chrono - start_chrono).total_seconds(), + ) return True @@ -357,7 +365,8 @@ def get_facturx_xml_from_pdf(pdf_file, check_xsd=True, check_schematron=True): pdf_file, check_xsd=check_xsd, check_schematron=check_schematron, - filenames=filenames) + filenames=filenames, + ) def get_orderx_xml_from_pdf(pdf_file, check_xsd=True, check_schematron=True): @@ -366,20 +375,20 @@ def get_orderx_xml_from_pdf(pdf_file, check_xsd=True, check_schematron=True): pdf_file, check_xsd=check_xsd, check_schematron=check_schematron, - filenames=filenames) + filenames=filenames, + ) def get_xml_from_pdf(pdf_file, check_xsd=True, check_schematron=True, filenames=[]): - logger.debug( - 'get_xml_from_pdf with factur-x lib %s', VERSION) + logger.debug("get_xml_from_pdf with factur-x lib %s", VERSION) if not pdf_file: - raise ValueError('Missing pdf_invoice argument') + raise ValueError("Missing pdf_invoice argument") if not isinstance(check_xsd, bool): - raise ValueError('Bad type for check_xsd argument') + raise ValueError("Bad type for check_xsd argument") if not isinstance(check_schematron, bool): - raise ValueError('Bad type for check_schematron argument') + raise ValueError("Bad type for check_schematron argument") if not isinstance(filenames, list): - raise ValueError('Bad type for filenames argument') + raise ValueError("Bad type for filenames argument") if isinstance(pdf_file, (str, bytes)): pdf_file_in = BytesIO(pdf_file) elif isinstance(pdf_file, IOBase): @@ -387,41 +396,44 @@ def get_xml_from_pdf(pdf_file, check_xsd=True, check_schematron=True, filenames= else: raise TypeError( "The first argument of the method get_xml_from_pdf must " - "be either a byte or a file (it is a %s)." % type(pdf_file)) + "be either a byte or a file (it is a %s)." % type(pdf_file) + ) if not filenames: filenames = ALL_FILENAMES - logger.debug('Searching for filenames %s', filenames) + logger.debug("Searching for filenames %s", filenames) xml_bytes = xml_filename = False pdf_reader = PdfReader(pdf_file_in) for attach_obj in pdf_reader.attachment_list: filename = attach_obj.name - logger.debug('Found filename=%s', filename) - if filename.lower().endswith('.xml') and attach_obj.content: + logger.debug("Found filename=%s", filename) + if filename.lower().endswith(".xml") and attach_obj.content: try: xml_root = etree.fromstring(attach_obj.content) - logger.info( - 'A valid XML file %s has been found in the PDF', - filename) + logger.info("A valid XML file %s has been found in the PDF", filename) except Exception as e: - logger.warning( - 'File %s is not a valid XML file: %s', filename, str(e)) + logger.warning("File %s is not a valid XML file: %s", filename, str(e)) continue try: flavor = get_flavor(xml_root) except Exception as e: logger.warning( "File %s is not a factur-x/order-x/zugferd/xrechnung file. Error: %s", - filename, e) + filename, + e, + ) continue - if ( - (filename == ORDERX_FILENAME and flavor != 'order-x') or - (filename == FACTURX_FILENAME and flavor != "factur-x")): + if (filename == ORDERX_FILENAME and flavor != "order-x") or ( + filename == FACTURX_FILENAME and flavor != "factur-x" + ): # Don't do that when filename is zugferd-invoice.xml # because it can be either zugferd (ie zugferd 1.0) # or 'factur-x' i.e. zugferd 2.0, see bug #41 logger.warning( "Filename is %s but detected flavor is %s. " - "This is very weird: skipping file.", filename, flavor) + "This is very weird: skipping file.", + filename, + flavor, + ) continue level = False if check_xsd or check_schematron: @@ -429,32 +441,37 @@ def get_xml_from_pdf(pdf_file, check_xsd=True, check_schematron=True, filenames= level = get_level(xml_root, flavor) except Exception: logger.warning( - 'Skipping file %s because the level could not be identified', - filename) + "Skipping file %s because the level could not be identified", + filename, + ) continue if check_xsd and level: try: xml_check_xsd(xml_root, flavor=flavor, level=level) except Exception: logger.warning( - 'Skipping file %s because it is not valid against the XSD', - filename) + "Skipping file %s because it is not valid against the XSD", + filename, + ) continue if check_schematron and level: try: xml_check_schematron(xml_root, flavor=flavor, level=level) except Exception: logger.warning( - 'Skipping file %s because it is not valid against the schematron', - filename) + "Skipping file %s because it is not valid against the schematron", + filename, + ) continue xml_bytes = attach_obj.content xml_filename = filename - logger.info('XML file %s extracted from PDF', xml_filename) - logger.debug('Content of the XML file: %s', xml_bytes) + logger.info("XML file %s extracted from PDF", xml_filename) + logger.debug("Content of the XML file: %s", xml_bytes) break if not xml_filename: - logger.warning("No valid factur-x/order-x/zugferd/xrechnung XML file found in this PDF") + logger.warning( + "No valid factur-x/order-x/zugferd/xrechnung XML file found in this PDF" + ) return (xml_filename, xml_bytes) @@ -469,21 +486,21 @@ def _get_pdf_timestamp(date=None): def _get_metadata_timestamp(): now_dt = datetime.now() # example format : 2014-07-25T14:01:22+02:00 - meta_date = now_dt.strftime('%Y-%m-%dT%H:%M:%S+00:00') + meta_date = now_dt.strftime("%Y-%m-%dT%H:%M:%S+00:00") return meta_date def _prepare_pdf_metadata_txt(pdf_metadata): pdf_date = _get_pdf_timestamp() info_dict = { - '/Author': pdf_metadata.get('author', ''), - '/CreationDate': pdf_date, - '/Creator': CREATOR, - '/Keywords': pdf_metadata.get('keywords', ''), - '/ModDate': pdf_date, - '/Subject': pdf_metadata.get('subject', ''), - '/Title': pdf_metadata.get('title', ''), - } + "/Author": pdf_metadata.get("author", ""), + "/CreationDate": pdf_date, + "/Creator": CREATOR, + "/Keywords": pdf_metadata.get("keywords", ""), + "/ModDate": pdf_date, + "/Subject": pdf_metadata.get("subject", ""), + "/Title": pdf_metadata.get("title", ""), + } return info_dict @@ -571,39 +588,45 @@ def _prepare_pdf_metadata_xml(flavor, level, orderx_type, pdf_metadata): """ # noqa: E501 tail = """""" key2value = { - "title": pdf_metadata.get('title', ''), - "author": pdf_metadata.get('author', ''), - "subject": pdf_metadata.get('subject', ''), - "producer": 'pypdf', + "title": pdf_metadata.get("title", ""), + "author": pdf_metadata.get("author", ""), + "subject": pdf_metadata.get("subject", ""), + "producer": "pypdf", "creator_tool": CREATOR, "timestamp": _get_metadata_timestamp(), - "version": '1.0', - } + "version": "1.0", + } - if flavor == 'order-x': - key2value.update({ - "documenttype": orderx_type.upper(), - "xml_filename": ORDERX_FILENAME, - "xmp_level": level.upper(), - }) - urn = 'urn:factur-x:pdfa:CrossIndustryDocument:1p0#' + if flavor == "order-x": + key2value.update( + { + "documenttype": orderx_type.upper(), + "xml_filename": ORDERX_FILENAME, + "xmp_level": level.upper(), + } + ) + urn = "urn:factur-x:pdfa:CrossIndustryDocument:1p0#" else: - key2value.update({ - "documenttype": 'INVOICE', - "xml_filename": FACTURX_FILENAME, - "xmp_level": FACTURX_LEVEL2xmp[level], - }) - urn = 'urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#' + key2value.update( + { + "documenttype": "INVOICE", + "xml_filename": FACTURX_FILENAME, + "xmp_level": FACTURX_LEVEL2xmp[level], + } + ) + urn = "urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#" xml_str = xml_str.format(urn=urn) xml_root = etree.fromstring(xml_str) namespaces = xml_root.nsmap - namespaces.update({ - 'rdf': "http://www.w3.org/1999/02/22-rdf-syntax-ns#", - "dc": "http://purl.org/dc/elements/1.1/", - "fx": "urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#", - "pdf": "http://ns.adobe.com/pdf/1.3/", - "xmp": "http://ns.adobe.com/xap/1.0/", - }) + namespaces.update( + { + "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + "dc": "http://purl.org/dc/elements/1.1/", + "fx": "urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#", + "pdf": "http://ns.adobe.com/pdf/1.3/", + "xmp": "http://ns.adobe.com/xap/1.0/", + } + ) xpath2key = { "/x:xmpmeta/rdf:RDF/rdf:Description/dc:title//rdf:li": "title", "/x:xmpmeta/rdf:RDF/rdf:Description/dc:creator//rdf:li": "author", @@ -616,153 +639,193 @@ def _prepare_pdf_metadata_xml(flavor, level, orderx_type, pdf_metadata): "/x:xmpmeta/rdf:RDF/rdf:Description/fx:DocumentFileName": "xml_filename", "/x:xmpmeta/rdf:RDF/rdf:Description/fx:Version": "version", "/x:xmpmeta/rdf:RDF/rdf:Description/fx:ConformanceLevel": "xmp_level", - } + } for xpath, key in xpath2key.items(): xml_nodes = xml_root.xpath(xpath, namespaces=namespaces) if len(xml_nodes) != 1: raise Exception( - f"XMP generation: wrong xpath {xpath} for {key}. Please report it as a bug.") + f"XMP generation: wrong xpath {xpath} for {key}. Please report it as a bug." + ) xml_node = xml_nodes[0] expected_node_text = f"##{key}" if xml_node.text != expected_node_text: raise Exception( f"XMP generation: xpath {xpath} contains {xml_node.text} " - f"instead of {expected_node_text}. Please report it as a bug.") + f"instead of {expected_node_text}. Please report it as a bug." + ) value = key2value[key] xml_node.text = value xml_bytes = etree.tostring(xml_root) - xml_str_final = "\n".join([head, xml_bytes.decode('utf-8'), tail]) - xml_bytes_final = xml_str_final.encode('utf-8') - logger.debug('metadata XML:') + xml_str_final = "\n".join([head, xml_bytes.decode("utf-8"), tail]) + xml_bytes_final = xml_str_final.encode("utf-8") + logger.debug("metadata XML:") logger.debug(xml_bytes_final) return xml_bytes_final def _filespec_additional_attachments( - pdf_writer, name_arrayobj_cdict, file_dict, filename): - logger.debug('_filespec_additional_attachments filename=%s', filename) - md5sum_bytes = hashlib.md5(file_dict['filedata']).digest() + pdf_writer, name_arrayobj_cdict, file_dict, filename +): + logger.debug("_filespec_additional_attachments filename=%s", filename) + md5sum_bytes = hashlib.md5(file_dict["filedata"]).digest() md5sum_obj = ByteStringObject(md5sum_bytes) - params_dict = DictionaryObject({ - NameObject('/CheckSum'): md5sum_obj, - NameObject('/Size'): NumberObject(len(file_dict['filedata'])), - }) + params_dict = DictionaryObject( + { + NameObject("/CheckSum"): md5sum_obj, + NameObject("/Size"): NumberObject(len(file_dict["filedata"])), + } + ) # creation date and modification date are optional - if isinstance(file_dict.get('modification_datetime'), datetime): - mod_date_pdf = _get_pdf_timestamp(file_dict['modification_datetime']) - params_dict[NameObject('/ModDate')] = create_string_object(mod_date_pdf) - if isinstance(file_dict.get('creation_datetime'), datetime): - creation_date_pdf = _get_pdf_timestamp(file_dict['creation_datetime']) - params_dict[NameObject('/CreationDate')] = create_string_object( - creation_date_pdf) + if isinstance(file_dict.get("modification_datetime"), datetime): + mod_date_pdf = _get_pdf_timestamp(file_dict["modification_datetime"]) + params_dict[NameObject("/ModDate")] = create_string_object(mod_date_pdf) + if isinstance(file_dict.get("creation_datetime"), datetime): + creation_date_pdf = _get_pdf_timestamp(file_dict["creation_datetime"]) + params_dict[NameObject("/CreationDate")] = create_string_object( + creation_date_pdf + ) file_entry = DecodedStreamObject() - file_entry.set_data(file_dict['filedata']) + file_entry.set_data(file_dict["filedata"]) file_entry = file_entry.flate_encode() file_mimetype = mimetypes.guess_type(filename)[0] if not file_mimetype: - file_mimetype = 'application/octet-stream' - file_entry.update({ - NameObject("/Type"): NameObject("/EmbeddedFile"), - NameObject("/Params"): params_dict, - NameObject("/Subtype"): NameObject('/%s' % file_mimetype), - }) + file_mimetype = "application/octet-stream" + file_entry.update( + { + NameObject("/Type"): NameObject("/EmbeddedFile"), + NameObject("/Params"): params_dict, + NameObject("/Subtype"): NameObject("/%s" % file_mimetype), + } + ) file_entry_obj = pdf_writer._add_object(file_entry) - ef_dict = DictionaryObject({ - NameObject("/F"): file_entry_obj, - }) + ef_dict = DictionaryObject( + { + NameObject("/F"): file_entry_obj, + } + ) fname_obj = create_string_object(filename) - afrelationship = file_dict.get('afrelationship') + afrelationship = file_dict.get("afrelationship") if afrelationship not in ATTACHMENTS_AFRelationship: - afrelationship = 'unspecified' - filespec_dict = DictionaryObject({ - NameObject("/AFRelationship"): NameObject("/%s" % afrelationship.capitalize()), - NameObject("/Desc"): create_string_object(file_dict.get('description', '')), - NameObject("/Type"): NameObject("/Filespec"), - NameObject("/F"): fname_obj, - NameObject("/EF"): ef_dict, - NameObject("/UF"): fname_obj, - }) + afrelationship = "unspecified" + filespec_dict = DictionaryObject( + { + NameObject("/AFRelationship"): NameObject( + "/%s" % afrelationship.capitalize() + ), + NameObject("/Desc"): create_string_object(file_dict.get("description", "")), + NameObject("/Type"): NameObject("/Filespec"), + NameObject("/F"): fname_obj, + NameObject("/EF"): ef_dict, + NameObject("/UF"): fname_obj, + } + ) filespec_obj = pdf_writer._add_object(filespec_dict) name_arrayobj_cdict[fname_obj] = filespec_obj def _facturx_update_metadata_add_attachment( - pdf_writer, xml_bytes, pdf_metadata, flavor, level, orderx_type=None, - lang=None, additional_attachments={}, afrelationship='data', - xmp_compression=True): - '''This method is inspired from the code of the add_attachment() - method of the pypdf lib''' + pdf_writer, + xml_bytes, + pdf_metadata, + flavor, + level, + orderx_type=None, + lang=None, + additional_attachments={}, + afrelationship="data", + xmp_compression=True, +): + """This method is inspired from the code of the add_attachment() + method of the pypdf lib""" # The entry for the file # facturx_xml_str = facturx_xml_str.encode('utf-8') - if flavor == 'order-x' and orderx_type not in ORDERX_TYPES: + if flavor == "order-x" and orderx_type not in ORDERX_TYPES: raise ValueError( - 'Wrong value for orderx_type (%s), must be in %s' - % (orderx_type, ORDERX_TYPES)) + "Wrong value for orderx_type (%s), must be in %s" + % (orderx_type, ORDERX_TYPES) + ) if afrelationship not in XML_AFRelationship: raise ValueError( "Wrong value for afrelationship (%s). Possible values: %s." - % (afrelationship, XML_AFRelationship)) + % (afrelationship, XML_AFRelationship) + ) md5sum_bytes = hashlib.md5(xml_bytes).digest() md5sum_obj = ByteStringObject(md5sum_bytes) - params_dict = DictionaryObject({ - NameObject('/CheckSum'): md5sum_obj, - NameObject('/ModDate'): create_string_object(_get_pdf_timestamp()), - NameObject('/Size'): NumberObject(len(xml_bytes)), - }) + params_dict = DictionaryObject( + { + NameObject("/CheckSum"): md5sum_obj, + NameObject("/ModDate"): create_string_object(_get_pdf_timestamp()), + NameObject("/Size"): NumberObject(len(xml_bytes)), + } + ) file_entry = DecodedStreamObject() file_entry.set_data(xml_bytes) # here we integrate the file itself file_entry = file_entry.flate_encode() - file_entry.update({ - NameObject("/Type"): NameObject("/EmbeddedFile"), - NameObject("/Params"): params_dict, - NameObject("/Subtype"): NameObject("/text/xml"), - }) + file_entry.update( + { + NameObject("/Type"): NameObject("/EmbeddedFile"), + NameObject("/Params"): params_dict, + NameObject("/Subtype"): NameObject("/text/xml"), + } + ) file_entry_obj = pdf_writer._add_object(file_entry) # The Filespec entry - ef_dict = DictionaryObject({ - NameObject("/F"): file_entry_obj, - NameObject('/UF'): file_entry_obj, - }) + ef_dict = DictionaryObject( + { + NameObject("/F"): file_entry_obj, + NameObject("/UF"): file_entry_obj, + } + ) - if flavor == 'order-x': + if flavor == "order-x": xml_filename = ORDERX_FILENAME - desc = 'Order-X XML file' + desc = "Order-X XML file" else: xml_filename = FACTURX_FILENAME - desc = 'Factur-X XML file' + desc = "Factur-X XML file" fname_obj = create_string_object(xml_filename) - filespec_dict = DictionaryObject({ - NameObject("/AFRelationship"): NameObject("/%s" % afrelationship.capitalize()), - NameObject("/Desc"): create_string_object(desc), - NameObject("/Type"): NameObject("/Filespec"), - NameObject("/F"): fname_obj, - NameObject("/EF"): ef_dict, - NameObject("/UF"): fname_obj, - }) + filespec_dict = DictionaryObject( + { + NameObject("/AFRelationship"): NameObject( + "/%s" % afrelationship.capitalize() + ), + NameObject("/Desc"): create_string_object(desc), + NameObject("/Type"): NameObject("/Filespec"), + NameObject("/F"): fname_obj, + NameObject("/EF"): ef_dict, + NameObject("/UF"): fname_obj, + } + ) filespec_obj = pdf_writer._add_object(filespec_dict) name_arrayobj_cdict = {fname_obj: filespec_obj} for attach_filename, attach_dict in additional_attachments.items(): _filespec_additional_attachments( - pdf_writer, name_arrayobj_cdict, attach_dict, attach_filename) - logger.debug('name_arrayobj_cdict=%s', name_arrayobj_cdict) + pdf_writer, name_arrayobj_cdict, attach_dict, attach_filename + ) + logger.debug("name_arrayobj_cdict=%s", name_arrayobj_cdict) name_arrayobj_content_sort = list( - sorted(name_arrayobj_cdict.items(), key=lambda x: x[0])) - logger.debug('name_arrayobj_content_sort=%s', name_arrayobj_content_sort) + sorted(name_arrayobj_cdict.items(), key=lambda x: x[0]) + ) + logger.debug("name_arrayobj_content_sort=%s", name_arrayobj_content_sort) name_arrayobj_content_final = [] af_list = [] - for (fname_obj, filespec_obj) in name_arrayobj_content_sort: + for fname_obj, filespec_obj in name_arrayobj_content_sort: name_arrayobj_content_final += [fname_obj, filespec_obj] af_list.append(filespec_obj) - embedded_files_names_dict = DictionaryObject({ - NameObject("/Names"): ArrayObject(name_arrayobj_content_final), - }) + embedded_files_names_dict = DictionaryObject( + { + NameObject("/Names"): ArrayObject(name_arrayobj_content_final), + } + ) # Then create the entry for the root, as it needs a # reference to the Filespec - embedded_files_dict = DictionaryObject({ - NameObject("/EmbeddedFiles"): embedded_files_names_dict, - }) + embedded_files_dict = DictionaryObject( + { + NameObject("/EmbeddedFiles"): embedded_files_names_dict, + } + ) # Update the root af_value_obj = pdf_writer._add_object(ArrayObject(af_list)) update_root_dict = { @@ -770,124 +833,147 @@ def _facturx_update_metadata_add_attachment( NameObject("/Names"): embedded_files_dict, # show attachments when opening PDF NameObject("/PageMode"): NameObject("/UseAttachments"), - } + } metadata_xml_bytes = _prepare_pdf_metadata_xml( - flavor, level, orderx_type, pdf_metadata) + flavor, level, orderx_type, pdf_metadata + ) metadata_file_entry = DecodedStreamObject() - metadata_file_entry.update({ - NameObject('/Subtype'): NameObject('/XML'), - NameObject('/Type'): NameObject('/Metadata'), - }) + metadata_file_entry.update( + { + NameObject("/Subtype"): NameObject("/XML"), + NameObject("/Type"): NameObject("/Metadata"), + } + ) metadata_file_entry.set_data(metadata_xml_bytes) if xmp_compression: metadata_file_entry = metadata_file_entry.flate_encode() - existing_metadata_obj = pdf_writer._root_object.get('/Metadata') + existing_metadata_obj = pdf_writer._root_object.get("/Metadata") if existing_metadata_obj: - logger.debug('Found existing /Metadata entry in catalog: replacing it.') + logger.debug("Found existing /Metadata entry in catalog: replacing it.") pdf_writer._replace_object(existing_metadata_obj, metadata_file_entry) else: - logger.debug('No existing /Metadata entry in catalog: creating one.') + logger.debug("No existing /Metadata entry in catalog: creating one.") metadata_obj = pdf_writer._add_object(metadata_file_entry) update_root_dict[NameObject("/Metadata")] = metadata_obj pdf_writer._root_object.update(update_root_dict) if lang: - pdf_writer._root_object.update({ - NameObject("/Lang"): create_string_object(lang.replace('_', '-')), - }) + pdf_writer._root_object.update( + { + NameObject("/Lang"): create_string_object(lang.replace("_", "-")), + } + ) metadata_txt_dict = _prepare_pdf_metadata_txt(pdf_metadata) pdf_writer.add_metadata(metadata_txt_dict) - logger.info('%s file added to PDF document', xml_filename) + logger.info("%s file added to PDF document", xml_filename) def _extract_base_info(facturx_xml_etree, flavor): - if flavor not in ('factur-x', 'facturx', 'order-x', 'orderx', 'zugferd'): + if flavor not in ("factur-x", "facturx", "order-x", "orderx", "zugferd"): raise ValueError("Wrong value for flavor argument.") namespaces = get_xml_namespaces(flavor) date_xpath = facturx_xml_etree.xpath( - '//rsm:ExchangedDocument/ram:IssueDateTime/udt:DateTimeString', - namespaces=namespaces) + "//rsm:ExchangedDocument/ram:IssueDateTime/udt:DateTimeString", + namespaces=namespaces, + ) date = date_xpath[0].text - date_format = date_xpath[0].attrib and date_xpath[0].attrib.get('format') or '102' + date_format = date_xpath[0].attrib and date_xpath[0].attrib.get("format") or "102" format_map = { - '102': '%Y%m%d', - '203': '%Y%m%d%H%M', - } - date_dt = datetime.strptime(date, format_map.get(date_format, format_map['102'])) + "102": "%Y%m%d", + "203": "%Y%m%d%H%M", + } + date_dt = datetime.strptime(date, format_map.get(date_format, format_map["102"])) number_xpath = facturx_xml_etree.xpath( - '//rsm:ExchangedDocument/ram:ID', namespaces=namespaces) + "//rsm:ExchangedDocument/ram:ID", namespaces=namespaces + ) number = number_xpath[0].text seller_xpath = facturx_xml_etree.xpath( - '//ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:Name', - namespaces=namespaces) + "//ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:Name", + namespaces=namespaces, + ) seller = seller_xpath[0].text buyer_xpath = facturx_xml_etree.xpath( - '//ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:Name', - namespaces=namespaces) + "//ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:Name", + namespaces=namespaces, + ) buyer = buyer_xpath[0].text doc_type_xpath = facturx_xml_etree.xpath( - '//rsm:ExchangedDocument/ram:TypeCode', namespaces=namespaces) + "//rsm:ExchangedDocument/ram:TypeCode", namespaces=namespaces + ) doc_type = doc_type_xpath[0].text base_info = { - 'seller': seller, - 'buyer': buyer, - 'number': number, - 'date': date_dt, - 'doc_type': doc_type, - } - logger.debug('Extraction of base_info: %s', base_info) + "seller": seller, + "buyer": buyer, + "number": number, + "date": date_dt, + "doc_type": doc_type, + } + logger.debug("Extraction of base_info: %s", base_info) return base_info def _base_info2pdf_metadata(base_info): doc_type_map = { - '220': 'Order', - '230': 'Order Change', - '231': 'Order Response', - '380': 'Invoice', - '381': 'Refund', - } - doc_type_name = doc_type_map.get(base_info['doc_type'], 'Invoice') - date_str = datetime.strftime(base_info['date'], '%Y-%m-%d') - if base_info['doc_type'] == '231': - title = '%s: Order Response on Order %s from %s' % ( - base_info['seller'], base_info['number'], base_info['buyer']) - subject = 'Response of %s on %s to order %s from %s' % ( - base_info['seller'], date_str, base_info['number'], base_info['buyer']) - doc_x = 'Order-X' - author = base_info['seller'] - elif base_info['doc_type'] in ('220', '230'): - title = '%s: %s %s' % ( - base_info['buyer'], doc_type_name, base_info['number']) - subject = '%s %s issued by %s on %s' % ( - doc_type_name, base_info['number'], base_info['buyer'], date_str) - doc_x = 'Order-X' - author = base_info['buyer'] + "220": "Order", + "230": "Order Change", + "231": "Order Response", + "380": "Invoice", + "381": "Refund", + } + doc_type_name = doc_type_map.get(base_info["doc_type"], "Invoice") + date_str = datetime.strftime(base_info["date"], "%Y-%m-%d") + if base_info["doc_type"] == "231": + title = "%s: Order Response on Order %s from %s" % ( + base_info["seller"], + base_info["number"], + base_info["buyer"], + ) + subject = "Response of %s on %s to order %s from %s" % ( + base_info["seller"], + date_str, + base_info["number"], + base_info["buyer"], + ) + doc_x = "Order-X" + author = base_info["seller"] + elif base_info["doc_type"] in ("220", "230"): + title = "%s: %s %s" % (base_info["buyer"], doc_type_name, base_info["number"]) + subject = "%s %s issued by %s on %s" % ( + doc_type_name, + base_info["number"], + base_info["buyer"], + date_str, + ) + doc_x = "Order-X" + author = base_info["buyer"] else: - title = '%s: %s %s' % ( - base_info['seller'], doc_type_name, base_info['number']) - subject = '%s %s dated %s issued by %s' % ( - doc_type_name, base_info['number'], date_str, base_info['seller']) - doc_x = 'Factur-X' - author = base_info['seller'] + title = "%s: %s %s" % (base_info["seller"], doc_type_name, base_info["number"]) + subject = "%s %s dated %s issued by %s" % ( + doc_type_name, + base_info["number"], + date_str, + base_info["seller"], + ) + doc_x = "Factur-X" + author = base_info["seller"] pdf_metadata = { - 'author': author, - 'keywords': '%s, %s' % (doc_type_name, doc_x), - 'title': title, - 'subject': subject, - } - logger.debug('Converted base_info to pdf_metadata: %s', pdf_metadata) + "author": author, + "keywords": "%s, %s" % (doc_type_name, doc_x), + "title": title, + "subject": subject, + } + logger.debug("Converted base_info to pdf_metadata: %s", pdf_metadata) return pdf_metadata def get_xml_namespaces(flavor): - if flavor not in ('factur-x', 'facturx', 'order-x', 'orderx', 'zugferd'): + if flavor not in ("factur-x", "facturx", "order-x", "orderx", "zugferd"): raise ValueError("Wrong value for flavor argument.") - if flavor == 'facturx': - flavor = 'factur-x' - elif flavor == 'orderx': - flavor = 'order-x' + if flavor == "facturx": + flavor = "factur-x" + elif flavor == "orderx": + flavor = "order-x" return XML_NAMESPACES[flavor] @@ -895,25 +981,36 @@ def get_facturx_level(facturx_xml_etree): return get_level(facturx_xml_etree) -def get_level(xml_etree, flavor='autodetect'): - if not isinstance(xml_etree, type(etree.Element('pouet'))): - raise ValueError('xml_etree must be an etree.Element() object') - if flavor not in ('autodetect', 'factur-x', 'facturx', 'order-x', 'orderx', 'zugferd'): - raise ValueError('Wrong value for flavor argument.') - if flavor == 'autodetect': +def get_level(xml_etree, flavor="autodetect"): + if not isinstance(xml_etree, type(etree.Element("pouet"))): + raise ValueError("xml_etree must be an etree.Element() object") + if flavor not in ( + "autodetect", + "factur-x", + "facturx", + "order-x", + "orderx", + "zugferd", + ): + raise ValueError("Wrong value for flavor argument.") + if flavor == "autodetect": flavor = get_flavor(xml_etree) namespaces = get_xml_namespaces(flavor) # Factur-X and Order-X doc_id_xpath = xml_etree.xpath( "//rsm:ExchangedDocumentContext" "/ram:GuidelineSpecifiedDocumentContextParameter" - "/ram:ID", namespaces=namespaces) + "/ram:ID", + namespaces=namespaces, + ) if not doc_id_xpath: # ZUGFeRD 1.0 doc_id_xpath = xml_etree.xpath( "//rsm:SpecifiedExchangedDocumentContext" "/ram:GuidelineSpecifiedDocumentContextParameter" - "/ram:ID", namespaces=namespaces) + "/ram:ID", + namespaces=namespaces, + ) if not doc_id_xpath: raise ValueError( "This XML is not a Factur-X nor Order-X XML because it misses the XML tag " @@ -921,7 +1018,8 @@ def get_level(xml_etree, flavor='autodetect'): "GuidelineSpecifiedDocumentContextParameter/ID. It is not a ZUGFeRD 1.0 " "XML either because it misses the XML tag " "SpecifiedExchangedDocumentContext/" - "GuidelineSpecifiedDocumentContextParameter/ID.") + "GuidelineSpecifiedDocumentContextParameter/ID." + ) doc_id = doc_id_xpath[0].text # Content of the ID field per level for Factur-X: # minimum: urn:factur-x.eu:1p0:minimum @@ -938,60 +1036,72 @@ def get_level(xml_etree, flavor='autodetect'): # ZUGFeRD 1.0 levels are the same as orderx possible_values = dict(FACTURX_LEVEL2xsd) possible_values.update(ORDERX_LEVEL2xsd) - level = doc_id.split(':')[-1] + level = doc_id.split(":")[-1] if level == "extended-ctc-fr": level = "extended" if level not in possible_values: # Ignore what is after the first "#" - doc_id_cut = doc_id.split('#')[0] + doc_id_cut = doc_id.split("#")[0] if len(doc_id_cut) > 1: - level = doc_id_cut.split(':')[-2] + level = doc_id_cut.split(":")[-2] if level not in possible_values: - raise ValueError( - "Invalid Factur-X/Order-X URN: '%s'" % doc_id) - logger.info('Level is %s (autodetected)', level) + raise ValueError("Invalid Factur-X/Order-X URN: '%s'" % doc_id) + logger.info("Level is %s (autodetected)", level) return level def get_flavor(xml_etree): - if not isinstance(xml_etree, type(etree.Element('pouet'))): - raise ValueError('xml_etree must be an etree.Element() object') - logger.debug('First XML tag: %s', xml_etree.tag) - if xml_etree.tag.endswith('CrossIndustryInvoice'): - flavor = 'factur-x' - elif xml_etree.tag.endswith('CrossIndustryDocument'): - flavor = 'zugferd' - elif xml_etree.tag.endswith('SCRDMCCBDACIOMessageStructure'): - flavor = 'order-x' + if not isinstance(xml_etree, type(etree.Element("pouet"))): + raise ValueError("xml_etree must be an etree.Element() object") + logger.debug("First XML tag: %s", xml_etree.tag) + if xml_etree.tag.endswith("CrossIndustryInvoice"): + flavor = "factur-x" + elif xml_etree.tag.endswith("CrossIndustryDocument"): + flavor = "zugferd" + elif xml_etree.tag.endswith("SCRDMCCBDACIOMessageStructure"): + flavor = "order-x" else: raise Exception( "Could not detect if the document is a Factur-X, ZUGFeRD 1.0 " - "or Order-X document.") - logger.info('Flavor is %s (autodetected)', flavor) + "or Order-X document." + ) + logger.info("Flavor is %s (autodetected)", flavor) return flavor def get_orderx_type(xml_etree): - if not isinstance(xml_etree, type(etree.Element('pouet'))): - raise ValueError('xml_etree must be an etree.Element() object') - type_code_xpath = \ + if not isinstance(xml_etree, type(etree.Element("pouet"))): + raise ValueError("xml_etree must be an etree.Element() object") + type_code_xpath = ( "/rsm:SCRDMCCBDACIOMessageStructure/rsm:ExchangedDocument/ram:TypeCode" - xpath_res = xml_etree.xpath(type_code_xpath, namespaces=XML_NAMESPACES['order-x']) + ) + xpath_res = xml_etree.xpath(type_code_xpath, namespaces=XML_NAMESPACES["order-x"]) code = xpath_res and xpath_res[0].text and xpath_res[0].text.strip() or None if code not in ORDERX_code2type: raise Exception( "The TypeCode extracted from the XML is %s. " - "This is not a valid Order-X TypeCode." % code) + "This is not a valid Order-X TypeCode." % code + ) logger.info( - 'Order-X type is %s code %s (autodetected)', ORDERX_code2type[code], code) + "Order-X type is %s code %s (autodetected)", ORDERX_code2type[code], code + ) return ORDERX_code2type[code] def generate_from_binary( - pdf_file, xml, flavor='autodetect', level='autodetect', - orderx_type='autodetect', - check_xsd=True, check_schematron=True, pdf_metadata=None, lang=None, - attachments=None, afrelationship='data', xmp_compression=True): + pdf_file, + xml, + flavor="autodetect", + level="autodetect", + orderx_type="autodetect", + check_xsd=True, + check_schematron=True, + pdf_metadata=None, + lang=None, + attachments=None, + afrelationship="data", + xmp_compression=True, +): """ Generate a Factur-X or Order-X PDF from a regular PDF and a factur-X or Order-X XML file. The method uses a binary as input (the regular PDF) @@ -1068,16 +1178,24 @@ def generate_from_binary( """ if not isinstance(pdf_file, bytes): - raise ValueError('pdf_invoice argument must be a string') + raise ValueError("pdf_invoice argument must be a string") result_pdf = False - with NamedTemporaryFile(prefix='facturx-', suffix='.pdf') as f: + with NamedTemporaryFile(prefix="facturx-", suffix=".pdf") as f: f.write(pdf_file) generate_from_file( - f, xml, flavor=flavor, level=level, orderx_type=orderx_type, - check_xsd=check_xsd, check_schematron=check_schematron, - pdf_metadata=pdf_metadata, lang=lang, - attachments=attachments, afrelationship=afrelationship, - xmp_compression=xmp_compression) + f, + xml, + flavor=flavor, + level=level, + orderx_type=orderx_type, + check_xsd=check_xsd, + check_schematron=check_schematron, + pdf_metadata=pdf_metadata, + lang=lang, + attachments=attachments, + afrelationship=afrelationship, + xmp_compression=xmp_compression, + ) f.seek(0) result_pdf = f.read() f.close() @@ -1085,11 +1203,20 @@ def generate_from_binary( def generate_from_file( - pdf_file, xml, flavor='autodetect', level='autodetect', - orderx_type='autodetect', - check_xsd=True, check_schematron=True, pdf_metadata=None, lang=None, - output_pdf_file=None, - attachments=None, afrelationship='data', xmp_compression=True): + pdf_file, + xml, + flavor="autodetect", + level="autodetect", + orderx_type="autodetect", + check_xsd=True, + check_schematron=True, + pdf_metadata=None, + lang=None, + output_pdf_file=None, + attachments=None, + afrelationship="data", + xmp_compression=True, +): """ Generate a Factur-X or Order-X PDF file from a regular PDF and a Factur-X or Order-X XML file. The method uses a file as input (regular PDF file) @@ -1168,80 +1295,83 @@ def generate_from_file( :rtype: bool """ start_chrono = datetime.now() - logger.debug( - 'generate_from_file with factur-x lib %s', VERSION) - logger.debug('1st arg pdf_file type=%s', type(pdf_file)) - logger.debug('2nd arg xml type=%s', type(xml)) - logger.debug('optional arg flavor=%s', flavor) - logger.debug('optional arg level=%s', level) - logger.debug('optional arg orderx_type=%s', orderx_type) - logger.debug('optional arg check_xsd=%s', check_xsd) + logger.debug("generate_from_file with factur-x lib %s", VERSION) + logger.debug("1st arg pdf_file type=%s", type(pdf_file)) + logger.debug("2nd arg xml type=%s", type(xml)) + logger.debug("optional arg flavor=%s", flavor) + logger.debug("optional arg level=%s", level) + logger.debug("optional arg orderx_type=%s", orderx_type) + logger.debug("optional arg check_xsd=%s", check_xsd) logger.debug(f"optional arg check_schematron={check_schematron}") - logger.debug('optional arg pdf_metadata=%s', pdf_metadata) - logger.debug('optional arg lang=%s', lang) - logger.debug('optional arg output_pdf_file=%s', output_pdf_file) - logger.debug('optional arg attachments=%s', attachments) - logger.debug('optional arg afrelationship=%s', afrelationship) + logger.debug("optional arg pdf_metadata=%s", pdf_metadata) + logger.debug("optional arg lang=%s", lang) + logger.debug("optional arg output_pdf_file=%s", output_pdf_file) + logger.debug("optional arg attachments=%s", attachments) + logger.debug("optional arg afrelationship=%s", afrelationship) if not pdf_file: - raise ValueError('Missing pdf_file argument') + raise ValueError("Missing pdf_file argument") if not xml: - raise ValueError('Missing xml argument') + raise ValueError("Missing xml argument") if not isinstance(flavor, str): - raise ValueError('flavor argument is a %s, must be a string' % type(flavor)) + raise ValueError("flavor argument is a %s, must be a string" % type(flavor)) if not isinstance(level, str): - raise ValueError('level argument is a %s, must be a string' % type(level)) + raise ValueError("level argument is a %s, must be a string" % type(level)) if not isinstance(orderx_type, (str, type(None))): raise ValueError( - 'orderx_type argument is a %s, must be a string or None' - % type(orderx_type)) + "orderx_type argument is a %s, must be a string or None" % type(orderx_type) + ) if not isinstance(check_xsd, bool): raise ValueError( - 'check_xsd argument is a %s, must be a boolean' % type(check_xsd)) + "check_xsd argument is a %s, must be a boolean" % type(check_xsd) + ) if not isinstance(check_schematron, bool): raise ValueError( - "check_schematron argument is a {type(check_schematron)}, must be a boolean") + "check_schematron argument is a {type(check_schematron)}, must be a boolean" + ) if not isinstance(pdf_metadata, (dict, type(None))): raise ValueError( - 'pdf_metadata argument is a %s, must be a dict or None' - % type(pdf_metadata)) + "pdf_metadata argument is a %s, must be a dict or None" % type(pdf_metadata) + ) if not isinstance(lang, (type(None), str)): - raise ValueError( - 'lang argument is a %s, must be a string or None' % type(lang)) + raise ValueError("lang argument is a %s, must be a string or None" % type(lang)) if not isinstance(output_pdf_file, (type(None), str)): raise ValueError( - 'output_pdf_file argument is a %s, must be a string or None' - % type(output_pdf_file)) + "output_pdf_file argument is a %s, must be a string or None" + % type(output_pdf_file) + ) if not isinstance(attachments, (dict, type(None))): raise ValueError( - 'attachments argument is a %s, must be a dict or None' % type(attachments)) + "attachments argument is a %s, must be a dict or None" % type(attachments) + ) if not isinstance(afrelationship, (str, type(None))): raise ValueError( - 'afrelationship argument is a %s, must be a string or None' - % type(afrelationship)) + "afrelationship argument is a %s, must be a string or None" + % type(afrelationship) + ) # Tolerance on arguments - reformatting flavor = flavor.lower() flavor_fix_mapping = { - 'orderx': 'order-x', - 'facturx': 'factur-x', - } + "orderx": "order-x", + "facturx": "factur-x", + } flavor = flavor_fix_mapping.get(flavor, flavor) - level = level.lower().replace(' ', '') + level = level.lower().replace(" ", "") if orderx_type: - orderx_type = orderx_type.lower().replace('-', '_').replace(' ', '_') + orderx_type = orderx_type.lower().replace("-", "_").replace(" ", "_") if afrelationship: afrelationship = afrelationship.lower() else: - afrelationship = 'data' + afrelationship = "data" if afrelationship not in XML_AFRelationship: logger.warning( - "Wrong value for afrelationship (%s). Forcing it to 'data'.", - afrelationship) - afrelationship = 'data' + "Wrong value for afrelationship (%s). Forcing it to 'data'.", afrelationship + ) + afrelationship = "data" if isinstance(pdf_file, str): - file_type = 'path' + file_type = "path" else: - file_type = 'file' + file_type = "file" xml_root = None if isinstance(xml, bytes): xml_bytes = xml @@ -1251,12 +1381,12 @@ def generate_from_file( with open(xml, "rb") as xml_file: xml_bytes = xml_file.read() else: - xml_bytes = xml.encode('utf8') - elif isinstance(xml, type(etree.Element('pouet'))): + xml_bytes = xml.encode("utf8") + elif isinstance(xml, type(etree.Element("pouet"))): xml_root = xml xml_bytes = etree.tostring( - xml_root, pretty_print=True, encoding='UTF-8', - xml_declaration=True) + xml_root, pretty_print=True, encoding="UTF-8", xml_declaration=True + ) elif isinstance(xml, IOBase): xml.seek(0) xml_bytes = xml.read() @@ -1267,7 +1397,8 @@ def generate_from_file( raise TypeError( "The second argument of the method generate_from_file must be " "either a string, an etree.Element() object or a file " - "(it is a %s)." % type(xml)) + "(it is a %s)." % type(xml) + ) if attachments is None: attachments = {} if attachments: @@ -1276,63 +1407,69 @@ def generate_from_file( for filename in list(attachments.keys()): if filename in ALL_FILENAMES: logger.warning( - 'You cannot provide as attachment a file named %s. ' - 'This file will NOT be attached.', filename) + "You cannot provide as attachment a file named %s. " + "This file will NOT be attached.", + filename, + ) attachments.pop(filename) for fadict in attachments.values(): - if fadict.get('filepath') and not fadict.get('filedata'): - with open(fadict['filepath'], 'rb') as fa: + if fadict.get("filepath") and not fadict.get("filedata"): + with open(fadict["filepath"], "rb") as fa: fa.seek(0) - fadict['filedata'] = fa.read() + fadict["filedata"] = fa.read() fa.close() # As explained here # https://stackoverflow.com/questions/237079/how-to-get-file-creation-modification-date-times-in-python # creation date is not easy to get. # So we only implement getting the modification date - if not fadict.get('modification_datetime'): - mod_timestamp = os.path.getmtime(fadict['filepath']) - fadict['modification_datetime'] = datetime.fromtimestamp( - mod_timestamp) - if fadict.get('afrelationship'): - fadict['afrelationship'] = fadict['afrelationship'].lower() - if fadict.get('afrelationship') not in ATTACHMENTS_AFRelationship: + if not fadict.get("modification_datetime"): + mod_timestamp = os.path.getmtime(fadict["filepath"]) + fadict["modification_datetime"] = datetime.fromtimestamp( + mod_timestamp + ) + if fadict.get("afrelationship"): + fadict["afrelationship"] = fadict["afrelationship"].lower() + if fadict.get("afrelationship") not in ATTACHMENTS_AFRelationship: # set default value - fadict['afrelationship'] = 'unspecified' - if flavor not in ('factur-x', 'order-x'): + fadict["afrelationship"] = "unspecified" + if flavor not in ("factur-x", "order-x"): if xml_root is None: xml_root = etree.fromstring(xml_bytes) - logger.debug('Flavor will be autodetected') + logger.debug("Flavor will be autodetected") flavor = get_flavor(xml_root) - if flavor == 'zugferd': + if flavor == "zugferd": raise ValueError( "XML is ZUGFeRD 1.x. Generating ZUGFeRD 1.x PDF is not supported. " - "You should update the XML to ZUGFeRD 2.x.") - if ( - (flavor == 'factur-x' and level not in FACTURX_LEVEL2xsd) or - (flavor == 'order-x' and level not in ORDERX_LEVEL2xsd)): + "You should update the XML to ZUGFeRD 2.x." + ) + if (flavor == "factur-x" and level not in FACTURX_LEVEL2xsd) or ( + flavor == "order-x" and level not in ORDERX_LEVEL2xsd + ): if xml_root is None: xml_root = etree.fromstring(xml_bytes) - logger.debug('level will be autodetected') + logger.debug("level will be autodetected") level = get_level(xml_root, flavor) if ( - flavor == 'factur-x' and - level in ('minimum', 'basicwl') and - afrelationship in ('source', 'alternative')): + flavor == "factur-x" + and level in ("minimum", "basicwl") + and afrelationship in ("source", "alternative") + ): logger.warning( "afrelationship switched from '%s' to 'data' because it must be 'data' " - "for Factur-X profile '%s'.", afrelationship, level) - afrelationship = 'data' - if flavor == 'order-x' and orderx_type not in ORDERX_TYPES: + "for Factur-X profile '%s'.", + afrelationship, + level, + ) + afrelationship = "data" + if flavor == "order-x" and orderx_type not in ORDERX_TYPES: if xml_root is None: xml_root = etree.fromstring(xml_bytes) orderx_type = get_orderx_type(xml_root) if check_xsd: - xml_check_xsd( - xml_bytes, flavor=flavor, level=level) - if flavor in ('factur-x', 'order-x') and check_schematron: - xml_check_schematron( - xml_bytes, flavor=flavor, level=level) + xml_check_xsd(xml_bytes, flavor=flavor, level=level) + if flavor in ("factur-x", "order-x") and check_schematron: + xml_check_schematron(xml_bytes, flavor=flavor, level=level) if pdf_metadata is None: if xml_root is None: xml_root = etree.fromstring(xml_bytes) @@ -1342,31 +1479,39 @@ def generate_from_file( # clean-up pdf_metadata dict for key, value in pdf_metadata.items(): if not isinstance(value, str): - pdf_metadata[key] = '' + pdf_metadata[key] = "" pdf_reader = PdfReader(pdf_file) pdf_writer = PdfWriter() pdf_writer._header = b"%PDF-1.6" pdf_writer.clone_document_from_reader(pdf_reader) _facturx_update_metadata_add_attachment( - pdf_writer, xml_bytes, pdf_metadata, flavor, level, - orderx_type=orderx_type, lang=lang, + pdf_writer, + xml_bytes, + pdf_metadata, + flavor, + level, + orderx_type=orderx_type, + lang=lang, additional_attachments=attachments, afrelationship=afrelationship, - xmp_compression=xmp_compression) + xmp_compression=xmp_compression, + ) if output_pdf_file: - with open(output_pdf_file, 'wb') as output_f: + with open(output_pdf_file, "wb") as output_f: pdf_writer.write(output_f) output_f.close() else: - if file_type == 'path': - with open(pdf_file, 'wb') as f: + if file_type == "path": + with open(pdf_file, "wb") as f: pdf_writer.write(f) f.close() - elif file_type == 'file': + elif file_type == "file": pdf_writer.write(pdf_file) end_chrono = datetime.now() logger.info( - '%s PDF generated in %s sec', - flavor, (end_chrono - start_chrono).total_seconds()) + "%s PDF generated in %s sec", + flavor, + (end_chrono - start_chrono).total_seconds(), + ) return True diff --git a/facturx/scripts/__init__.py b/src/facturx/scripts/__init__.py similarity index 100% rename from facturx/scripts/__init__.py rename to src/facturx/scripts/__init__.py diff --git a/facturx/scripts/pdfextractxml.py b/src/facturx/scripts/pdfextractxml.py similarity index 55% rename from facturx/scripts/pdfextractxml.py rename to src/facturx/scripts/pdfextractxml.py index 4d6832d..001c240 100755 --- a/facturx/scripts/pdfextractxml.py +++ b/src/facturx/scripts/pdfextractxml.py @@ -2,11 +2,13 @@ # Copyright 2017-2023 Alexis de Lattre import argparse +import logging import sys -from facturx import get_xml_from_pdf, __version__ as fxversion +from os.path import isdir, isfile + +from facturx import __version__ as fxversion +from facturx import get_xml_from_pdf from facturx.facturx import logger -import logging -from os.path import isfile, isdir __author__ = "Alexis de Lattre " __date__ = "March 2026" @@ -14,53 +16,59 @@ def pdfextractxml(args): - logger.info('pdfextractxml version %s using factur-x lib version %s', __version__, fxversion) + logger.info( + "pdfextractxml version %s using factur-x lib version %s", __version__, fxversion + ) if args.log_level: log_level = args.log_level.lower() log_map = { - 'debug': logging.DEBUG, - 'info': logging.INFO, - 'warn': logging.WARN, - 'error': logging.ERROR, + "debug": logging.DEBUG, + "info": logging.INFO, + "warn": logging.WARN, + "error": logging.ERROR, } if log_level in log_map: logger.setLevel(log_map[log_level]) else: logger.error( - 'Wrong value for log level (%s). Possible values: %s', - log_level, ', '.join(log_map.keys())) + "Wrong value for log level (%s). Possible values: %s", + log_level, + ", ".join(log_map.keys()), + ) sys.exit(1) pdf_filename = args.facturx_orderx_file out_xml_filename = args.xml_file_to_create if not isfile(pdf_filename): - logger.error('Argument %s is not a filename', pdf_filename) + logger.error("Argument %s is not a filename", pdf_filename) sys.exit(1) if isdir(out_xml_filename): logger.error( - '2nd argument %s is a directory name (should be a the ' - 'output XML filename)', out_xml_filename) + "2nd argument %s is a directory name (should be a the " + "output XML filename)", + out_xml_filename, + ) sys.exit(1) - pdf_file = open(pdf_filename, 'rb') + pdf_file = open(pdf_filename, "rb") check_xsd = not args.disable_xsd_check check_schematron = not args.disable_schematron_check # The important line of code is below ! try: (xml_filename, xml_string) = get_xml_from_pdf( - pdf_file, check_xsd=check_xsd, check_schematron=check_schematron) + pdf_file, check_xsd=check_xsd, check_schematron=check_schematron + ) except Exception as e: logger.error(e) sys.exit(1) if xml_filename and xml_string: if isfile(out_xml_filename): - logger.warning( - 'File %s already exists. Overwriting it!', out_xml_filename) - xml_file = open(out_xml_filename, 'wb') + logger.warning("File %s already exists. Overwriting it!", out_xml_filename) + xml_file = open(out_xml_filename, "wb") xml_file.write(xml_string) xml_file.close() - logger.info('File %s generated', out_xml_filename) + logger.info("File %s generated", out_xml_filename) else: - logger.warning('File %s has not been created', out_xml_filename) + logger.warning("File %s has not been created", out_xml_filename) sys.exit(1) @@ -71,32 +79,43 @@ def main(args=None): epilog = "Author: %s - Version: %s" % (__author__, __version__) description = "This extracts the XML file from a Factur-X or Order-X PDF file." parser = argparse.ArgumentParser( - usage=usage, epilog=epilog, description=description) + usage=usage, epilog=epilog, description=description + ) parser.add_argument( - '-l', '--log-level', dest="log_level", default='info', + "-l", + "--log-level", + dest="log_level", + default="info", help="Set log level. Possible values: debug, info, warn, error. " - "Default value: info.") + "Default value: info.", + ) parser.add_argument( - '-d', '--disable-xsd-check', dest='disable_xsd_check', - action='store_true', + "-d", + "--disable-xsd-check", + dest="disable_xsd_check", + action="store_true", help="De-activate XML Schema Definition check on Factur-X/Order-X XML file " - "(the check is enabled by default)") + "(the check is enabled by default)", + ) parser.add_argument( - '-ds', '--disable-schematron-check', dest='disable_schematron_check', - action='store_true', + "-ds", + "--disable-schematron-check", + dest="disable_schematron_check", + action="store_true", help="De-activate Schematron check on Factur-X/Order-X XML file " - "(the check is enabled by default)") - parser.add_argument( - "facturx_orderx_file", help="PDF Factur-X or Order-X file") + "(the check is enabled by default)", + ) + parser.add_argument("facturx_orderx_file", help="PDF Factur-X or Order-X file") parser.add_argument( "xml_file_to_create", - help="Filename of the XML file that will be extracted from the PDF") + help="Filename of the XML file that will be extracted from the PDF", + ) args = parser.parse_args() pdfextractxml(args) def run(): - if __name__ == '__main__': + if __name__ == "__main__": main() diff --git a/src/facturx/scripts/pdfgen.py b/src/facturx/scripts/pdfgen.py new file mode 100755 index 0000000..6efcba9 --- /dev/null +++ b/src/facturx/scripts/pdfgen.py @@ -0,0 +1,268 @@ +#! /usr/bin/env python +# Copyright 2017-2023 Alexis de Lattre + +import argparse +import logging +import sys +from os.path import basename, isdir, isfile + +from facturx import __version__ as fxversion +from facturx import generate_from_file +from facturx.facturx import logger + +__author__ = "Alexis de Lattre " +__date__ = "October 2025" +__version__ = "0.9" + + +def pdfgen(args): + logger.info( + "pdfgen version %s using factur-x lib version %s", __version__, fxversion + ) + if args.log_level: + log_level = args.log_level.lower() + log_map = { + "debug": logging.DEBUG, + "info": logging.INFO, + "warn": logging.WARN, + "error": logging.ERROR, + } + if log_level in log_map: + logger.setLevel(log_map[log_level]) + else: + logger.error( + "Wrong value for log level (%s). Possible values: %s", + log_level, + ", ".join(log_map.keys()), + ) + sys.exit(1) + + pdf_filename = args.regular_pdf_file + output_pdf_filename = args.facturx_orderx_pdf_file + additional_attachment_filenames = args.optional_attachments + for filename in [pdf_filename, args.xml_file] + additional_attachment_filenames: + if not isfile(filename): + logger.error("Argument %s is not a filename", filename) + sys.exit(1) + if isdir(output_pdf_filename): + logger.error( + "3rd argument %s is a directory name (should be a the " + "Factur-X or Order-X PDF filename)", + output_pdf_filename, + ) + sys.exit(1) + check_xsd = not args.disable_xsd_check + check_schematron = not args.disable_schematron_check + pdf_metadata = None + if args.meta_author or args.meta_keywords or args.meta_title or args.meta_subject: + pdf_metadata = { + "author": args.meta_author, + "keywords": args.meta_keywords, + "title": args.meta_title, + "subject": args.meta_subject, + } + if isfile(output_pdf_filename): + if args.overwrite: + logger.warning( + "File %s already exists. Overwriting it.", output_pdf_filename + ) + else: + logger.error("File %s already exists. Exit.", output_pdf_filename) + sys.exit(1) + attachments = {} + for additional_attachment_filename in additional_attachment_filenames: + attachments[basename(additional_attachment_filename)] = { + "filepath": additional_attachment_filename + } + lang = args.lang or None + xmp_compression = not args.disable_xmp_compression + try: + # The important line of code is below ! + generate_from_file( + pdf_filename, + args.xml_file, + check_xsd=check_xsd, + check_schematron=check_schematron, + flavor=args.flavor, + level=args.level, + orderx_type=args.orderx_type, + pdf_metadata=pdf_metadata, + lang=lang, + output_pdf_file=output_pdf_filename, + attachments=attachments, + afrelationship=args.afrelationship, + xmp_compression=xmp_compression, + ) + except Exception: + # no need to re-print the error log, it is already present in the logs + logger.error("factur-x lib call failed, exiting.") + sys.exit(1) + + +def main(args=None): + if args is None: + args = sys.argv[1:] + usage = ( + "facturx-pdfgen " + " " + ) + epilog = "Author: %s - Version: %s" % (__author__, __version__) + description = ( + "This script generate a Factur-X or Order-X PDF from a " + "regular PDF/A document and a Factur-X or Order-X XML file. " + "It can also include additional embedded files in the PDF. " + "To generate a valid PDF/A-3 document as requested by the " + "Factur-X/Order-X standards, you need to give a valid PDF/A " + "document as input." + "\n\nIf you use one of the --meta-* arguments, you should specify " + "all the meta-* arguments because the default values for " + "metadata only apply if none of the meta-* arguments are used." + ) + parser = argparse.ArgumentParser( + usage=usage, epilog=epilog, description=description + ) + parser.add_argument( + "-l", + "--log-level", + dest="log_level", + default="info", + help="Set log level. Possible values: debug, info, warn, error. " + "Default value: info.", + ) + parser.add_argument( + "-d", + "--disable-xsd-check", + dest="disable_xsd_check", + action="store_true", + help="De-activate XML Schema Definition check on XML file " + "(the check is enabled by default)", + ) + parser.add_argument( + "-ds", + "--disable-schematron-check", + dest="disable_schematron_check", + action="store_true", + help="De-activate Schematron check on XML file " + "(the check is enabled by default)", + ) + parser.add_argument( + "-f", + "--flavor", + dest="flavor", + default="autodetect", + help="Specify if you want to generate a Factur-X or Order-X PDF file. " + "Default: autodetect. If you specify a particular flavor instead of " + "using autodetection from the XML, you will win a very small amount of time " + "(less than 1 millisecond). " + "Possible values: order-x, factur-x or autodetect.", + ) + parser.add_argument( + "-n", + "--level", + "--facturx-level", + dest="level", + default="autodetect", + help="Specify the Factur-X or Order-X level of the XML file. " + "Default: autodetect. If you specify a particular level instead of " + "using autodetection, you will win a very small amount of time " + "(less than 1 millisecond). " + "Possible values for Factur-X: minimum, basicwl, basic, en16931, extended." + "Possible values for Order-X: basic, comfort, extended.", + ) + parser.add_argument( + "-p", + "--orderx-type", + dest="orderx_type", + default="autodetect", + help="When you generate an Order-X document, specify the order type. " + "Default: autodetect. If you specify a particular order type instead of " + "using autodetection, you will win a very small amount of time " + "(less than 1 millisecond). " + "Possible values: order, order_change, order_response.", + ) + parser.add_argument( + "-g", + "--lang", + dest="lang", + help="Set the language identifier as RFC 3066 to specify the " + "natural language of the PDF document. Example: en-US.", + ) + parser.add_argument( + "-r", + "--afrelationship", + dest="afrelationship", + default="data", + help="Set the AFRelationship PDF property of the Factur-X/Order-X XML file. " + "Possible values: data, source, alternative. " + "Default value: data.", + ) + parser.add_argument( + "-a", + "--meta-author", + dest="meta_author", + help="Specify the author for PDF metadata. Default: use the vendor " + "name extracted from the XML file.", + ) + parser.add_argument( + "-k", + "--meta-keywords", + dest="meta_keywords", + help="Specify the keywords for PDF metadata. " + "Default for Factur-X: 'Invoice, Factur-X'." + "Default for Order-X: 'Order Change, Order-X' where 'Order Change' is " + "the order type.", + ) + parser.add_argument( + "-t", + "--meta-title", + dest="meta_title", + help="Specify the title of PDF metadata. " + "Default: generic English title with information extracted from " + "the XML file such as: 'Akretion: Invoice I1242'", + ) + parser.add_argument( + "-s", + "--meta-subject", + dest="meta_subject", + help="Specify the subject of PDF metadata. " + "Default: generic English subject with information extracted from the " + "XML file such as: " + "'Factur-X invoice I1242 dated 2017-08-17 issued by Akretion'", + ) + parser.add_argument( + "-nz", + "--disable-xmp-compression", + dest="disable_xmp_compression", + action="store_true", + help="Disable flate compression of the XMP metadata " + "(compression is enabled by default). You should disable compression of " + "the XMP metadata if you plan to later add a PAdES signature " + "on the generated PDF file.", + ) + parser.add_argument( + "-w", + "--overwrite", + dest="overwrite", + action="store_true", + help="Overwrite output PDF file if it already exists.", + ) + parser.add_argument("regular_pdf_file", help="Regular PDF invoice") + parser.add_argument("xml_file", help="Factur-X or Order-X XML file") + parser.add_argument( + "facturx_orderx_pdf_file", help="Generated Factur-X or Order-X PDF file" + ) + parser.add_argument( + "optional_attachments", + nargs="*", + help="Optional list of additionnal attachments", + ) + args = parser.parse_args() + pdfgen(args) + + +def run(): + if __name__ == "__main__": + main() + + +run() diff --git a/facturx/scripts/webservice.py b/src/facturx/scripts/webservice.py similarity index 52% rename from facturx/scripts/webservice.py rename to src/facturx/scripts/webservice.py index dbc84bb..dac7b4e 100755 --- a/facturx/scripts/webservice.py +++ b/src/facturx/scripts/webservice.py @@ -14,14 +14,17 @@ # -F 'xml=@/home/alexis/factur-x.xml' -o result_facturx.pdf # http://localhost:5000/generate_facturx -from flask import Flask, request, send_file -from tempfile import NamedTemporaryFile -from facturx import generate_from_file, __version__ as fxversion -from facturx.facturx import logger as fxlogger import argparse import logging import sys from logging.handlers import RotatingFileHandler +from tempfile import NamedTemporaryFile + +from flask import Flask, request, send_file + +from facturx import __version__ as fxversion +from facturx import generate_from_file +from facturx.facturx import logger as fxlogger MAX_ATTACHMENTS = 3 # TODO make it a cmd line option __author__ = "Alexis de Lattre " @@ -30,42 +33,47 @@ app = Flask(__name__) -@app.route('/generate_facturx', methods=['POST']) +@app.route("/generate_facturx", methods=["POST"]) def generate_facturx(): - app.logger.debug('request.files=%s', request.files) + app.logger.debug("request.files=%s", request.files) attachments = {} for i in range(MAX_ATTACHMENTS): - attach_key = 'attachment%d' % (i + 1) + attach_key = "attachment%d" % (i + 1) if request.files.get(attach_key): - with NamedTemporaryFile(prefix='fx-api-attach-') as attach_file: + with NamedTemporaryFile(prefix="fx-api-attach-") as attach_file: request.files[attach_key].save(attach_file.name) attach_file.seek(0) attachments[request.files[attach_key].filename] = { - 'filedata': attach_file.read(), - } + "filedata": attach_file.read(), + } attach_file.close() - with NamedTemporaryFile(prefix='fx-api-xml-', suffix='.xml') as xml_file: - request.files['xml'].save(xml_file.name) - app.logger.debug('xml_file.name=%s', xml_file.name) + with NamedTemporaryFile(prefix="fx-api-xml-", suffix=".xml") as xml_file: + request.files["xml"].save(xml_file.name) + app.logger.debug("xml_file.name=%s", xml_file.name) xml_file.seek(0) xml_byte = xml_file.read() xml_file.close() - res = '' - with NamedTemporaryFile(prefix='fx-api-pdf-', suffix='.pdf') as pdf_file: + res = "" + with NamedTemporaryFile(prefix="fx-api-pdf-", suffix=".pdf") as pdf_file: with NamedTemporaryFile( - prefix='fx-api-outpdf-', suffix='.pdf') as output_pdf_file: - request.files['pdf'].save(pdf_file.name) - app.logger.debug('pdf_file.name=%s', pdf_file.name) - app.logger.debug('output_pdf_file.name=%s', output_pdf_file.name) - app.logger.debug('attachments keys=%s', attachments.keys()) + prefix="fx-api-outpdf-", suffix=".pdf" + ) as output_pdf_file: + request.files["pdf"].save(pdf_file.name) + app.logger.debug("pdf_file.name=%s", pdf_file.name) + app.logger.debug("output_pdf_file.name=%s", output_pdf_file.name) + app.logger.debug("attachments keys=%s", attachments.keys()) generate_from_file( - pdf_file, xml_byte, output_pdf_file=output_pdf_file.name, - attachments=attachments) + pdf_file, + xml_byte, + output_pdf_file=output_pdf_file.name, + attachments=attachments, + ) output_pdf_file.seek(0) res = send_file(output_pdf_file.name, as_attachment=True) app.logger.info( - 'Factur-X or Order-X document successfully returned by webservice') + "Factur-X or Order-X document successfully returned by webservice" + ) output_pdf_file.close() pdf_file.close() return res @@ -75,46 +83,60 @@ def main(args=None): if args is None: args = sys.argv[1:] usage = "facturx_webservice.py [options]" - epilog = "Script written by Alexis de Lattre. "\ - "Published under the BSD licence." - description = "This is a Flask application that exposes a REST "\ - "webservice to generate a Factur-X invoice from a PDF file and an "\ + epilog = "Script written by Alexis de Lattre. " "Published under the BSD licence." + description = ( + "This is a Flask application that exposes a REST " + "webservice to generate a Factur-X invoice from a PDF file and an " "XML file." + ) parser = argparse.ArgumentParser( - usage=usage, epilog=epilog, description=description) + usage=usage, epilog=epilog, description=description + ) parser.add_argument( - '-s', '--host', dest='host', default='127.0.0.1', + "-s", + "--host", + dest="host", + default="127.0.0.1", help="The hostname to listen on. Defaults to '127.0.0.1': " - "the webservice will only accept connexions from localhost. Use " - "'0.0.0.0' to have the webservice available from a remote host (but " - "it is recommended to listen on localhost and use an HTTPS proxy to " - "listen to remote connexions).") + "the webservice will only accept connexions from localhost. Use " + "'0.0.0.0' to have the webservice available from a remote host (but " + "it is recommended to listen on localhost and use an HTTPS proxy to " + "listen to remote connexions).", + ) parser.add_argument( - '-p', '--port', dest='port', type=int, default=5000, + "-p", + "--port", + dest="port", + type=int, + default=5000, help="Port on which the webservice listens. You can select " - "any port between 1024 and 65535. Default port is 5000.") + "any port between 1024 and 65535. Default port is 5000.", + ) parser.add_argument( - '-d', '--debug', dest='debug', action='store_true', - help="Enable debug mode.") + "-d", "--debug", dest="debug", action="store_true", help="Enable debug mode." + ) parser.add_argument( - '-l', '--logfile', dest='logfile', - help="Logs to a file instead of stdout.") + "-l", "--logfile", dest="logfile", help="Logs to a file instead of stdout." + ) parser.add_argument( - '-n', '--loglevel', dest='loglevel', default='info', + "-n", + "--loglevel", + dest="loglevel", + default="info", help="Log level. Possible values: critical, error, warning, " - "info (default), debug.") + "info (default), debug.", + ) args = parser.parse_args() if args.logfile: - formatter = logging.Formatter( - "[%(asctime)s] %(levelname)s %(message)s") + formatter = logging.Formatter("[%(asctime)s] %(levelname)s %(message)s") handler = RotatingFileHandler(args.logfile) - if args.loglevel == 'debug': + if args.loglevel == "debug": level = logging.DEBUG - elif args.loglevel == 'critical': + elif args.loglevel == "critical": level = logging.CRITICAL - elif args.loglevel == 'warning': + elif args.loglevel == "warning": level = logging.WARNING - elif args.loglevel == 'error': + elif args.loglevel == "error": level = logging.ERROR else: level = logging.INFO @@ -123,13 +145,15 @@ def main(args=None): fxlogger.setLevel(level) fxlogger.addHandler(handler) app.logger.addHandler(handler) - app.logger.info('Start webservice to generate Factur-X invoices') - fxlogger.info('webservice version %s using factur-x lib version %s', __version__, fxversion) + app.logger.info("Start webservice to generate Factur-X invoices") + fxlogger.info( + "webservice version %s using factur-x lib version %s", __version__, fxversion + ) app.run(debug=args.debug, port=args.port, host=args.host) def run(): - if __name__ == '__main__': + if __name__ == "__main__": main() diff --git a/facturx/scripts/xmlcheck.py b/src/facturx/scripts/xmlcheck.py similarity index 57% rename from facturx/scripts/xmlcheck.py rename to src/facturx/scripts/xmlcheck.py index cd05c72..78ce425 100755 --- a/facturx/scripts/xmlcheck.py +++ b/src/facturx/scripts/xmlcheck.py @@ -2,43 +2,48 @@ # Copyright 2017-2023 Alexis de Lattre import argparse -import sys -from facturx import xml_check_xsd, xml_check_schematron, __version__ as fxversion -from facturx.facturx import logger import logging +import sys from os.path import isfile +from facturx import __version__ as fxversion +from facturx import xml_check_schematron, xml_check_xsd +from facturx.facturx import logger + __author__ = "Alexis de Lattre " __date__ = "March 2026" __version__ = "0.5" def xmlcheck(args): - logger.info('xmlcheck version %s using factur-x lib version %s', __version__, fxversion) + logger.info( + "xmlcheck version %s using factur-x lib version %s", __version__, fxversion + ) if args.log_level: log_level = args.log_level.lower() log_map = { - 'debug': logging.DEBUG, - 'info': logging.INFO, - 'warn': logging.WARN, - 'error': logging.ERROR, + "debug": logging.DEBUG, + "info": logging.INFO, + "warn": logging.WARN, + "error": logging.ERROR, } if log_level in log_map: logger.setLevel(log_map[log_level]) else: logger.error( - 'Wrong value for log level (%s). Possible values: %s', - log_level, ', '.join(log_map.keys())) + "Wrong value for log level (%s). Possible values: %s", + log_level, + ", ".join(log_map.keys()), + ) sys.exit(1) if not isfile(args.xml_file): - logger.error('%s is not a filename', args.xml_file) + logger.error("%s is not a filename", args.xml_file) sys.exit(1) - with open(args.xml_file, 'rb') as xml_file: + with open(args.xml_file, "rb") as xml_file: xml_bytes = xml_file.read() try: - xml_check_xsd( - xml_bytes, flavor=args.flavor, level=args.level) + xml_check_xsd(xml_bytes, flavor=args.flavor, level=args.level) except Exception as e: logger.error(e) sys.exit(1) @@ -54,35 +59,48 @@ def main(args=None): args = sys.argv[1:] usage = "facturx-xmlcheck " epilog = "Author: %s - Version: %s" % (__author__, __version__) - description = "This script checks the Factur-X or Order-XML XML against the XML "\ - "Schema Definition." + description = ( + "This script checks the Factur-X or Order-XML XML against the XML " + "Schema Definition." + ) parser = argparse.ArgumentParser( - usage=usage, epilog=epilog, description=description) + usage=usage, epilog=epilog, description=description + ) parser.add_argument( - '-l', '--log-level', dest='log_level', default='info', + "-l", + "--log-level", + dest="log_level", + default="info", help="Set log level. Possible values: debug, info, warn, error. " - "Default value: info.") + "Default value: info.", + ) parser.add_argument( - '-f', '--flavor', dest='flavor', default='autodetect', + "-f", + "--flavor", + dest="flavor", + default="autodetect", help="Set XML flavor. Possible values: factur-x, zugferd, order-x or autodetect. " - "Default value: autodetect.") + "Default value: autodetect.", + ) parser.add_argument( - '-n', '--facturx-level', dest='level', - default='autodetect', + "-n", + "--facturx-level", + dest="level", + default="autodetect", help="Specify the level of the Factur-X or Order-X XML file. " "Default: autodetect. If you specify a particular level instead of " "using autodetection, you will win a very small amount of time " "(less than 1 millisecond). " "Possible values for Factur-X: minimum, basicwl, basic, en16931, extended. " - "Possible values for Order-X: basic, comfort, extended.") - parser.add_argument( - "xml_file", help="Factur-X or Order-X XML file to check") + "Possible values for Order-X: basic, comfort, extended.", + ) + parser.add_argument("xml_file", help="Factur-X or Order-X XML file to check") args = parser.parse_args() xmlcheck(args) def run(): - if __name__ == '__main__': + if __name__ == "__main__": main() diff --git a/facturx/xmp/Factur-X_extension_schema.xmp b/src/facturx/xmp/Factur-X_extension_schema.xmp similarity index 95% rename from facturx/xmp/Factur-X_extension_schema.xmp rename to src/facturx/xmp/Factur-X_extension_schema.xmp index 0639209..c59a257 100644 --- a/facturx/xmp/Factur-X_extension_schema.xmp +++ b/src/facturx/xmp/Factur-X_extension_schema.xmp @@ -23,14 +23,14 @@ Notes on the Factur-X schema namespace URI: --> - + BASIC factur-x.xml INVOICE 1.0 - + - \ No newline at end of file + diff --git a/facturx/xmp/ZUGFeRD_extension_schema.xmp b/src/facturx/xmp/ZUGFeRD_extension_schema.xmp similarity index 98% rename from facturx/xmp/ZUGFeRD_extension_schema.xmp rename to src/facturx/xmp/ZUGFeRD_extension_schema.xmp index d5e068c..3f39dc9 100644 --- a/facturx/xmp/ZUGFeRD_extension_schema.xmp +++ b/src/facturx/xmp/ZUGFeRD_extension_schema.xmp @@ -43,14 +43,14 @@ around bug #4433 in PDFlib 9.0.0 which has been fixed in PDFlib 9.0.1. --> - + BASIC ZUGFeRD-invoice.xml INVOICE 1.0 - + - \ No newline at end of file + diff --git a/facturx/xsd/facturx-basic/Factur-X_1.08_BASIC-compiled.xsl b/src/facturx/xsd/facturx-basic/Factur-X_1.08_BASIC-compiled.xsl similarity index 99% rename from facturx/xsd/facturx-basic/Factur-X_1.08_BASIC-compiled.xsl rename to src/facturx/xsd/facturx-basic/Factur-X_1.08_BASIC-compiled.xsl index 8c44eb8..4eb2138 100644 --- a/facturx/xsd/facturx-basic/Factur-X_1.08_BASIC-compiled.xsl +++ b/src/facturx/xsd/facturx-basic/Factur-X_1.08_BASIC-compiled.xsl @@ -10,7 +10,7 @@ xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" - version="2.0"> @@ -93,7 +93,7 @@ - diff --git a/facturx/xsd/facturx-basic/Factur-X_1.08_BASIC.xsd b/src/facturx/xsd/facturx-basic/Factur-X_1.08_BASIC.xsd similarity index 100% rename from facturx/xsd/facturx-basic/Factur-X_1.08_BASIC.xsd rename to src/facturx/xsd/facturx-basic/Factur-X_1.08_BASIC.xsd diff --git a/facturx/xsd/facturx-basic/Factur-X_1.08_BASIC_codedb.xml b/src/facturx/xsd/facturx-basic/Factur-X_1.08_BASIC_codedb.xml similarity index 100% rename from facturx/xsd/facturx-basic/Factur-X_1.08_BASIC_codedb.xml rename to src/facturx/xsd/facturx-basic/Factur-X_1.08_BASIC_codedb.xml diff --git a/facturx/xsd/facturx-basic/Factur-X_1.08_BASIC_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd b/src/facturx/xsd/facturx-basic/Factur-X_1.08_BASIC_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd similarity index 100% rename from facturx/xsd/facturx-basic/Factur-X_1.08_BASIC_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd rename to src/facturx/xsd/facturx-basic/Factur-X_1.08_BASIC_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd diff --git a/facturx/xsd/facturx-basic/Factur-X_1.08_BASIC_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd b/src/facturx/xsd/facturx-basic/Factur-X_1.08_BASIC_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd similarity index 100% rename from facturx/xsd/facturx-basic/Factur-X_1.08_BASIC_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd rename to src/facturx/xsd/facturx-basic/Factur-X_1.08_BASIC_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd diff --git a/facturx/xsd/facturx-basic/Factur-X_1.08_BASIC_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd b/src/facturx/xsd/facturx-basic/Factur-X_1.08_BASIC_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd similarity index 100% rename from facturx/xsd/facturx-basic/Factur-X_1.08_BASIC_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd rename to src/facturx/xsd/facturx-basic/Factur-X_1.08_BASIC_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd diff --git a/facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL-compiled.xsl b/src/facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL-compiled.xsl similarity index 99% rename from facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL-compiled.xsl rename to src/facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL-compiled.xsl index ddddce4..cf84534 100644 --- a/facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL-compiled.xsl +++ b/src/facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL-compiled.xsl @@ -10,7 +10,7 @@ xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" - version="2.0"> @@ -93,7 +93,7 @@ - diff --git a/facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL.xsd b/src/facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL.xsd similarity index 100% rename from facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL.xsd rename to src/facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL.xsd diff --git a/facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL_codedb.xml b/src/facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL_codedb.xml similarity index 100% rename from facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL_codedb.xml rename to src/facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL_codedb.xml diff --git a/facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd b/src/facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd similarity index 100% rename from facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd rename to src/facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd diff --git a/facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd b/src/facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd similarity index 100% rename from facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd rename to src/facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd diff --git a/facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd b/src/facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd similarity index 100% rename from facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd rename to src/facturx/xsd/facturx-basicwl/Factur-X_1.08_BASICWL_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd diff --git a/facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931-compiled.xsl b/src/facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931-compiled.xsl similarity index 99% rename from facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931-compiled.xsl rename to src/facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931-compiled.xsl index 9f35502..c5d9166 100644 --- a/facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931-compiled.xsl +++ b/src/facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931-compiled.xsl @@ -10,7 +10,7 @@ xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" - version="2.0"> @@ -93,7 +93,7 @@ - diff --git a/facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931.xsd b/src/facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931.xsd similarity index 100% rename from facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931.xsd rename to src/facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931.xsd diff --git a/facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931_codedb.xml b/src/facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931_codedb.xml similarity index 100% rename from facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931_codedb.xml rename to src/facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931_codedb.xml diff --git a/facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd b/src/facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd similarity index 100% rename from facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd rename to src/facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd diff --git a/facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd b/src/facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd similarity index 100% rename from facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd rename to src/facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd diff --git a/facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd b/src/facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd similarity index 100% rename from facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd rename to src/facturx/xsd/facturx-en16931/Factur-X_1.08_EN16931_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd diff --git a/facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED-compiled.xsl b/src/facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED-compiled.xsl similarity index 99% rename from facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED-compiled.xsl rename to src/facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED-compiled.xsl index 05c5e8b..a5b8f53 100644 --- a/facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED-compiled.xsl +++ b/src/facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED-compiled.xsl @@ -10,7 +10,7 @@ xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" - version="2.0"> @@ -93,7 +93,7 @@ - diff --git a/facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED.xsd b/src/facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED.xsd similarity index 100% rename from facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED.xsd rename to src/facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED.xsd diff --git a/facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED_codedb.xml b/src/facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED_codedb.xml similarity index 100% rename from facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED_codedb.xml rename to src/facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED_codedb.xml diff --git a/facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd b/src/facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd similarity index 100% rename from facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd rename to src/facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd diff --git a/facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd b/src/facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd similarity index 100% rename from facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd rename to src/facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd diff --git a/facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd b/src/facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd similarity index 100% rename from facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd rename to src/facturx/xsd/facturx-extended/Factur-X_1.08_EXTENDED_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd diff --git a/facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM-compiled.xsl b/src/facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM-compiled.xsl similarity index 99% rename from facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM-compiled.xsl rename to src/facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM-compiled.xsl index 32212a0..6b2810c 100644 --- a/facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM-compiled.xsl +++ b/src/facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM-compiled.xsl @@ -10,7 +10,7 @@ xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" - version="2.0"> @@ -93,7 +93,7 @@ - diff --git a/facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM.xsd b/src/facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM.xsd similarity index 100% rename from facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM.xsd rename to src/facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM.xsd diff --git a/facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM_codedb.xml b/src/facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM_codedb.xml similarity index 100% rename from facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM_codedb.xml rename to src/facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM_codedb.xml diff --git a/facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd b/src/facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd similarity index 100% rename from facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd rename to src/facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM_urn_un_unece_uncefact_data_standard_QualifiedDataType_100.xsd diff --git a/facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd b/src/facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd similarity index 100% rename from facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd rename to src/facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_100.xsd diff --git a/facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd b/src/facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd similarity index 100% rename from facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd rename to src/facturx/xsd/facturx-minimum/Factur-X_1.08_MINIMUM_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_100.xsd diff --git a/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B-compiled.xsl b/src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B-compiled.xsl similarity index 99% rename from facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B-compiled.xsl rename to src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B-compiled.xsl index 2948196..ff31136 100644 --- a/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B-compiled.xsl +++ b/src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B-compiled.xsl @@ -164,7 +164,7 @@ xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" - version="1.0"> @@ -245,7 +245,7 @@ - diff --git a/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B.xsd b/src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B.xsd similarity index 100% rename from facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B.xsd rename to src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B.xsd diff --git a/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_ISO_ISO3AlphaCurrencyCode_2012-08-31.xsd b/src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_ISO_ISO3AlphaCurrencyCode_2012-08-31.xsd similarity index 100% rename from facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_ISO_ISO3AlphaCurrencyCode_2012-08-31.xsd rename to src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_ISO_ISO3AlphaCurrencyCode_2012-08-31.xsd diff --git a/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ActionCode_D20A.xsd b/src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ActionCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ActionCode_D20A.xsd rename to src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ActionCode_D20A.xsd diff --git a/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsCode_2010.xsd b/src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsCode_2010.xsd similarity index 100% rename from facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsCode_2010.xsd rename to src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsCode_2010.xsd diff --git a/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsFunctionCode_D20A.xsd b/src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsFunctionCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsFunctionCode_D20A.xsd rename to src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsFunctionCode_D20A.xsd diff --git a/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentNameCode_D20A.xsd b/src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentNameCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentNameCode_D20A.xsd rename to src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentNameCode_D20A.xsd diff --git a/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentStatusCode_D20A.xsd b/src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentStatusCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentStatusCode_D20A.xsd rename to src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentStatusCode_D20A.xsd diff --git a/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_MessageFunctionCode_D20A.xsd b/src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_MessageFunctionCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_MessageFunctionCode_D20A.xsd rename to src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_MessageFunctionCode_D20A.xsd diff --git a/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_QualifiedDataType_128.xsd b/src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_QualifiedDataType_128.xsd similarity index 100% rename from facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_QualifiedDataType_128.xsd rename to src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_QualifiedDataType_128.xsd diff --git a/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_128.xsd b/src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_128.xsd similarity index 100% rename from facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_128.xsd rename to src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_128.xsd diff --git a/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_128.xsd b/src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_128.xsd similarity index 100% rename from facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_128.xsd rename to src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_128.xsd diff --git a/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_identifierlist_standard_ISO_ISOTwo-letterCountryCode_SecondEdition2006.xsd b/src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_identifierlist_standard_ISO_ISOTwo-letterCountryCode_SecondEdition2006.xsd similarity index 100% rename from facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_identifierlist_standard_ISO_ISOTwo-letterCountryCode_SecondEdition2006.xsd rename to src/facturx/xsd/orderx-basic/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_identifierlist_standard_ISO_ISOTwo-letterCountryCode_SecondEdition2006.xsd diff --git a/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B-compiled.xsl b/src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B-compiled.xsl similarity index 99% rename from facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B-compiled.xsl rename to src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B-compiled.xsl index 1e04ae9..6fd865a 100644 --- a/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B-compiled.xsl +++ b/src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B-compiled.xsl @@ -164,7 +164,7 @@ xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" - version="1.0"> @@ -245,7 +245,7 @@ - diff --git a/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B.xsd b/src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B.xsd similarity index 100% rename from facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B.xsd rename to src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B.xsd diff --git a/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_EDIFICAS-EU_AccountingAccountType_D11A.xsd b/src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_EDIFICAS-EU_AccountingAccountType_D11A.xsd similarity index 100% rename from facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_EDIFICAS-EU_AccountingAccountType_D11A.xsd rename to src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_EDIFICAS-EU_AccountingAccountType_D11A.xsd diff --git a/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_EN16931_AllowanceChargeReasonCode_D20A.xsd b/src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_EN16931_AllowanceChargeReasonCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_EN16931_AllowanceChargeReasonCode_D20A.xsd rename to src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_EN16931_AllowanceChargeReasonCode_D20A.xsd diff --git a/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_ISO_ISO3AlphaCurrencyCode_2012-08-31.xsd b/src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_ISO_ISO3AlphaCurrencyCode_2012-08-31.xsd similarity index 100% rename from facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_ISO_ISO3AlphaCurrencyCode_2012-08-31.xsd rename to src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_ISO_ISO3AlphaCurrencyCode_2012-08-31.xsd diff --git a/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ActionCode_D20A.xsd b/src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ActionCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ActionCode_D20A.xsd rename to src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ActionCode_D20A.xsd diff --git a/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ContactFunctionCode_D20A.xsd b/src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ContactFunctionCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ContactFunctionCode_D20A.xsd rename to src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ContactFunctionCode_D20A.xsd diff --git a/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsCode_2010.xsd b/src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsCode_2010.xsd similarity index 100% rename from facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsCode_2010.xsd rename to src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsCode_2010.xsd diff --git a/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsFunctionCode_D20A.xsd b/src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsFunctionCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsFunctionCode_D20A.xsd rename to src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsFunctionCode_D20A.xsd diff --git a/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentNameCode_D20A.xsd b/src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentNameCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentNameCode_D20A.xsd rename to src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentNameCode_D20A.xsd diff --git a/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentStatusCode_D20A.xsd b/src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentStatusCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentStatusCode_D20A.xsd rename to src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentStatusCode_D20A.xsd diff --git a/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DutyTaxFeeTypeCode_D20A.xsd b/src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DutyTaxFeeTypeCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DutyTaxFeeTypeCode_D20A.xsd rename to src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DutyTaxFeeTypeCode_D20A.xsd diff --git a/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DutyorTaxorFeeCategoryCode_D20A.xsd b/src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DutyorTaxorFeeCategoryCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DutyorTaxorFeeCategoryCode_D20A.xsd rename to src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DutyorTaxorFeeCategoryCode_D20A.xsd diff --git a/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_MessageFunctionCode_D20A.xsd b/src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_MessageFunctionCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_MessageFunctionCode_D20A.xsd rename to src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_MessageFunctionCode_D20A.xsd diff --git a/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_PackageTypeCode_2006.xsd b/src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_PackageTypeCode_2006.xsd similarity index 100% rename from facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_PackageTypeCode_2006.xsd rename to src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_PackageTypeCode_2006.xsd diff --git a/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_PaymentMeansCode_D20A.xsd b/src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_PaymentMeansCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_PaymentMeansCode_D20A.xsd rename to src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_PaymentMeansCode_D20A.xsd diff --git a/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ReferenceTypeCode_D20A.xsd b/src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ReferenceTypeCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ReferenceTypeCode_D20A.xsd rename to src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ReferenceTypeCode_D20A.xsd diff --git a/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_QualifiedDataType_128.xsd b/src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_QualifiedDataType_128.xsd similarity index 100% rename from facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_QualifiedDataType_128.xsd rename to src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_QualifiedDataType_128.xsd diff --git a/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_128.xsd b/src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_128.xsd similarity index 100% rename from facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_128.xsd rename to src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_128.xsd diff --git a/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_128.xsd b/src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_128.xsd similarity index 100% rename from facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_128.xsd rename to src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_128.xsd diff --git a/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_identifierlist_standard_ISO_ISOTwo-letterCountryCode_SecondEdition2006.xsd b/src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_identifierlist_standard_ISO_ISOTwo-letterCountryCode_SecondEdition2006.xsd similarity index 100% rename from facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_identifierlist_standard_ISO_ISOTwo-letterCountryCode_SecondEdition2006.xsd rename to src/facturx/xsd/orderx-comfort/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_identifierlist_standard_ISO_ISOTwo-letterCountryCode_SecondEdition2006.xsd diff --git a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B-compiled.xsl b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B-compiled.xsl similarity index 99% rename from facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B-compiled.xsl rename to src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B-compiled.xsl index 7201dfe..2c8a3b1 100644 --- a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B-compiled.xsl +++ b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B-compiled.xsl @@ -164,7 +164,7 @@ xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" - version="1.0"> @@ -245,7 +245,7 @@ - diff --git a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B.xsd b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B.xsd similarity index 100% rename from facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B.xsd rename to src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B.xsd diff --git a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_EDIFICAS-EU_AccountingAccountType_D11A.xsd b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_EDIFICAS-EU_AccountingAccountType_D11A.xsd similarity index 100% rename from facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_EDIFICAS-EU_AccountingAccountType_D11A.xsd rename to src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_EDIFICAS-EU_AccountingAccountType_D11A.xsd diff --git a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_EN16931_AllowanceChargeReasonCode_D20A.xsd b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_EN16931_AllowanceChargeReasonCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_EN16931_AllowanceChargeReasonCode_D20A.xsd rename to src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_EN16931_AllowanceChargeReasonCode_D20A.xsd diff --git a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_ISO_ISO3AlphaCurrencyCode_2012-08-31.xsd b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_ISO_ISO3AlphaCurrencyCode_2012-08-31.xsd similarity index 100% rename from facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_ISO_ISO3AlphaCurrencyCode_2012-08-31.xsd rename to src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_ISO_ISO3AlphaCurrencyCode_2012-08-31.xsd diff --git a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ActionCode_D20A.xsd b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ActionCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ActionCode_D20A.xsd rename to src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ActionCode_D20A.xsd diff --git a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ContactFunctionCode_D20A.xsd b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ContactFunctionCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ContactFunctionCode_D20A.xsd rename to src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ContactFunctionCode_D20A.xsd diff --git a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsCode_2010.xsd b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsCode_2010.xsd similarity index 100% rename from facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsCode_2010.xsd rename to src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsCode_2010.xsd diff --git a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsFunctionCode_D20A.xsd b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsFunctionCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsFunctionCode_D20A.xsd rename to src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DeliveryTermsFunctionCode_D20A.xsd diff --git a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentNameCode_D20A.xsd b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentNameCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentNameCode_D20A.xsd rename to src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentNameCode_D20A.xsd diff --git a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentStatusCode_D20A.xsd b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentStatusCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentStatusCode_D20A.xsd rename to src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DocumentStatusCode_D20A.xsd diff --git a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DutyTaxFeeTypeCode_D20A.xsd b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DutyTaxFeeTypeCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DutyTaxFeeTypeCode_D20A.xsd rename to src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DutyTaxFeeTypeCode_D20A.xsd diff --git a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DutyorTaxorFeeCategoryCode_D20A.xsd b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DutyorTaxorFeeCategoryCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DutyorTaxorFeeCategoryCode_D20A.xsd rename to src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_DutyorTaxorFeeCategoryCode_D20A.xsd diff --git a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_EventTimeReferenceCode_D20A.xsd b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_EventTimeReferenceCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_EventTimeReferenceCode_D20A.xsd rename to src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_EventTimeReferenceCode_D20A.xsd diff --git a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_MessageFunctionCode_D20A.xsd b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_MessageFunctionCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_MessageFunctionCode_D20A.xsd rename to src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_MessageFunctionCode_D20A.xsd diff --git a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_PackageTypeCode_2006.xsd b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_PackageTypeCode_2006.xsd similarity index 100% rename from facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_PackageTypeCode_2006.xsd rename to src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_PackageTypeCode_2006.xsd diff --git a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_PaymentMeansCode_D20A.xsd b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_PaymentMeansCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_PaymentMeansCode_D20A.xsd rename to src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_PaymentMeansCode_D20A.xsd diff --git a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ReferenceTypeCode_D20A.xsd b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ReferenceTypeCode_D20A.xsd similarity index 100% rename from facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ReferenceTypeCode_D20A.xsd rename to src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_ReferenceTypeCode_D20A.xsd diff --git a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_TimePointFormatCode_D19B.xsd b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_TimePointFormatCode_D19B.xsd similarity index 100% rename from facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_TimePointFormatCode_D19B.xsd rename to src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_codelist_standard_UNECE_TimePointFormatCode_D19B.xsd diff --git a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_QualifiedDataType_128.xsd b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_QualifiedDataType_128.xsd similarity index 100% rename from facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_QualifiedDataType_128.xsd rename to src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_QualifiedDataType_128.xsd diff --git a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_128.xsd b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_128.xsd similarity index 100% rename from facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_128.xsd rename to src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_128.xsd diff --git a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_128.xsd b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_128.xsd similarity index 100% rename from facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_128.xsd rename to src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_128.xsd diff --git a/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_identifierlist_standard_ISO_ISOTwo-letterCountryCode_SecondEdition2006.xsd b/src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_identifierlist_standard_ISO_ISOTwo-letterCountryCode_SecondEdition2006.xsd similarity index 100% rename from facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_identifierlist_standard_ISO_ISOTwo-letterCountryCode_SecondEdition2006.xsd rename to src/facturx/xsd/orderx-extended/SCRDMCCBDACIOMessageStructure_100pD20B_urn_un_unece_uncefact_identifierlist_standard_ISO_ISOTwo-letterCountryCode_SecondEdition2006.xsd diff --git a/facturx/xsd/zugferd/ZUGFeRD1p0.xsd b/src/facturx/xsd/zugferd/ZUGFeRD1p0.xsd similarity index 100% rename from facturx/xsd/zugferd/ZUGFeRD1p0.xsd rename to src/facturx/xsd/zugferd/ZUGFeRD1p0.xsd diff --git a/facturx/xsd/zugferd/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_QualifiedDataType_12.xsd b/src/facturx/xsd/zugferd/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_QualifiedDataType_12.xsd similarity index 100% rename from facturx/xsd/zugferd/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_QualifiedDataType_12.xsd rename to src/facturx/xsd/zugferd/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_QualifiedDataType_12.xsd diff --git a/facturx/xsd/zugferd/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_12.xsd b/src/facturx/xsd/zugferd/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_12.xsd similarity index 100% rename from facturx/xsd/zugferd/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_12.xsd rename to src/facturx/xsd/zugferd/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_ReusableAggregateBusinessInformationEntity_12.xsd diff --git a/facturx/xsd/zugferd/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_15.xsd b/src/facturx/xsd/zugferd/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_15.xsd similarity index 100% rename from facturx/xsd/zugferd/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_15.xsd rename to src/facturx/xsd/zugferd/ZUGFeRD1p0_urn_un_unece_uncefact_data_standard_UnqualifiedDataType_15.xsd diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 From ccbb1d59e91e1f9e32d9ded7b7d1bce3cfb64fe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20BEAU?= Date: Tue, 26 May 2026 16:38:36 +0200 Subject: [PATCH 2/5] pep8 clean up code --- src/facturx/__init__.py | 15 +++ src/facturx/facturx.py | 154 ++++++++++++++------------- src/facturx/scripts/pdfextractxml.py | 2 +- src/facturx/scripts/pdfgen.py | 2 +- src/facturx/scripts/xmlcheck.py | 8 +- 5 files changed, 100 insertions(+), 81 deletions(-) diff --git a/src/facturx/__init__.py b/src/facturx/__init__.py index 7c7d28a..00752dd 100644 --- a/src/facturx/__init__.py +++ b/src/facturx/__init__.py @@ -13,3 +13,18 @@ xml_check_schematron, xml_check_xsd, ) + +__all__ = [ + "generate_from_binary", + "generate_from_file", + "get_facturx_level", + "get_facturx_xml_from_pdf", + "get_flavor", + "get_level", + "get_orderx_type", + "get_orderx_xml_from_pdf", + "get_xml_from_pdf", + "get_xml_namespaces", + "xml_check_schematron", + "xml_check_xsd", +] diff --git a/src/facturx/facturx.py b/src/facturx/facturx.py index 5df3b51..7ffb414 100644 --- a/src/facturx/facturx.py +++ b/src/facturx/facturx.py @@ -46,7 +46,7 @@ ) try: - importlib_resources.files # added in py3.9 + _ = importlib_resources.files # added in py3.9 except AttributeError: import importlib_resources # py3.8 compat: pip install importlib-resources import hashlib @@ -95,20 +95,29 @@ XML_NAMESPACES = { "factur-x": { "qdt": "urn:un:unece:uncefact:data:standard:QualifiedDataType:100", - "ram": "urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100", + "ram": ( + "urn:un:unece:uncefact:data:standard:" + "ReusableAggregateBusinessInformationEntity:100" + ), "rsm": "urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100", "udt": "urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100", "xsi": "http://www.w3.org/2001/XMLSchema-instance", }, "order-x": { "qdt": "urn:un:unece:uncefact:data:standard:QualifiedDataType:128", - "ram": "urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:128", + "ram": ( + "urn:un:unece:uncefact:data:standard:" + "ReusableAggregateBusinessInformationEntity:128" + ), "rsm": "urn:un:unece:uncefact:data:SCRDMCCBDACIOMessageStructure:100", "udt": "urn:un:unece:uncefact:data:standard:UnqualifiedDataType:128", "xsi": "http://www.w3.org/2001/XMLSchema-instance", }, "zugferd": { - "ram": "urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:12", + "ram": ( + "urn:un:unece:uncefact:data:standard:" + "ReusableAggregateBusinessInformationEntity:12" + ), "rsm": "urn:ferd:CrossIndustryDocument:invoice:1p0", "udt": "urn:un:unece:uncefact:data:standard:UnqualifiedDataType:15", "xsi": "http://www.w3.org/2001/XMLSchema-instance", @@ -165,7 +174,7 @@ def xml_check_xsd(xml, flavor="autodetect", level="autodetect"): try: xml_etree = etree.fromstring(xml_bytes) except Exception as e: - raise Exception("The XML syntax is invalid: %s." % str(e)) + raise Exception(f"The XML syntax is invalid: {e}.") from e flavor = get_flavor(xml_etree) if flavor in ("factur-x", "facturx"): if level not in FACTURX_LEVEL2xsd: @@ -173,11 +182,11 @@ def xml_check_xsd(xml, flavor="autodetect", level="autodetect"): try: xml_etree = etree.fromstring(xml_bytes) except Exception as e: - raise Exception("The XML syntax is invalid: %s." % str(e)) + raise Exception(f"The XML syntax is invalid: {e}.") from e level = get_level(xml_etree, flavor) if level not in FACTURX_LEVEL2xsd: - raise ValueError("Wrong level '%s' for Factur-X invoice." % level) - xsd_file = "xsd/%s" % FACTURX_LEVEL2xsd[level] + raise ValueError(f"Wrong level '{level}' for Factur-X invoice.") + xsd_file = f"xsd/{FACTURX_LEVEL2xsd[level]}" elif flavor == "zugferd": xsd_file = "xsd/zugferd/ZUGFeRD1p0.xsd" elif flavor in ("order-x", "orderx"): @@ -186,11 +195,11 @@ def xml_check_xsd(xml, flavor="autodetect", level="autodetect"): try: xml_etree = etree.fromstring(xml_bytes) except Exception as e: - raise Exception("The XML syntax is invalid: %s." % str(e)) + raise Exception(f"The XML syntax is invalid: {e}.") from e level = get_level(xml_etree, flavor) if level not in ORDERX_LEVEL2xsd: - raise ValueError("Wrong level '%s' for Order-X document." % level) - xsd_file = "xsd/%s" % ORDERX_LEVEL2xsd[level] + raise ValueError(f"Wrong level '{level}' for Order-X document.") + xsd_file = f"xsd/{ORDERX_LEVEL2xsd[level]}" xsd_absolute_filepath = importlib_resources.files(__package__).joinpath(xsd_file) logger.debug("Using XSD file %s", xsd_absolute_filepath) @@ -203,11 +212,10 @@ def xml_check_xsd(xml, flavor="autodetect", level="autodetect"): logger.error("The XML file is invalid against the XML Schema Definition") logger.error("XSD Error: %s", e) raise Exception( - "The %s XML file is not valid against the official " - "XML Schema Definition. " - "Here is the error, which may give you an idea on the " - "cause of the problem: %s." % (flavor.capitalize(), str(e)) - ) + f"The {flavor.capitalize()} XML file is not valid against the official " + f"XML Schema Definition. Here is the error, which may give you an idea on " + f"the cause of the problem: {e}." + ) from e end_chrono = datetime.now() logger.info( "%s XML file successfully validated against XSD in %s sec", @@ -269,7 +277,7 @@ def xml_check_schematron(xml, flavor="autodetect", level="autodetect"): try: xml_etree = etree.fromstring(xml_bytes) except Exception as e: - raise Exception(f"The XML syntax is invalid: {str(e)}.") + raise Exception(f"The XML syntax is invalid: {e}.") from e flavor = get_flavor(xml_etree) if flavor in ("factur-x", "facturx"): if level not in FACTURX_LEVEL2xsd: @@ -277,7 +285,7 @@ def xml_check_schematron(xml, flavor="autodetect", level="autodetect"): try: xml_etree = etree.fromstring(xml_bytes) except Exception as e: - raise Exception(f"The XML syntax is invalid: {str(e)}.") + raise Exception(f"The XML syntax is invalid: {e}.") from e level = get_level(xml_etree, flavor) if level not in FACTURX_LEVEL2xsd: raise ValueError(f"Wrong level '{level}' for Factur-X invoice.") @@ -288,10 +296,10 @@ def xml_check_schematron(xml, flavor="autodetect", level="autodetect"): try: xml_etree = etree.fromstring(xml_bytes) except Exception as e: - raise Exception(f"The XML syntax is invalid: {str(e)}.") + raise Exception(f"The XML syntax is invalid: {e}.") from e level = get_level(xml_etree, flavor) if level not in ORDERX_LEVEL2xsd: - raise ValueError(f"xsd/{ORDERX_LEVEL2xsd[level][:-4]}-compiled-saxonc.xsl") + raise ValueError(f"Wrong level '{level}' for Order-X document.") xsd_filename = ORDERX_LEVEL2xsd[level] else: logger.warning("There is no schematron check for flavor %s", flavor) @@ -379,8 +387,10 @@ def get_orderx_xml_from_pdf(pdf_file, check_xsd=True, check_schematron=True): ) -def get_xml_from_pdf(pdf_file, check_xsd=True, check_schematron=True, filenames=[]): +def get_xml_from_pdf(pdf_file, check_xsd=True, check_schematron=True, filenames=None): logger.debug("get_xml_from_pdf with factur-x lib %s", VERSION) + if filenames is None: + filenames = [] if not pdf_file: raise ValueError("Missing pdf_invoice argument") if not isinstance(check_xsd, bool): @@ -395,8 +405,8 @@ def get_xml_from_pdf(pdf_file, check_xsd=True, check_schematron=True, filenames= pdf_file_in = pdf_file else: raise TypeError( - "The first argument of the method get_xml_from_pdf must " - "be either a byte or a file (it is a %s)." % type(pdf_file) + f"The first argument of the method get_xml_from_pdf must be either a byte " + f"or a file (it is a {type(pdf_file)})." ) if not filenames: filenames = ALL_FILENAMES @@ -417,7 +427,8 @@ def get_xml_from_pdf(pdf_file, check_xsd=True, check_schematron=True, filenames= flavor = get_flavor(xml_root) except Exception as e: logger.warning( - "File %s is not a factur-x/order-x/zugferd/xrechnung file. Error: %s", + "File %s is not a factur-x/order-x/zugferd/xrechnung file. " + "Error: %s", filename, e, ) @@ -459,8 +470,7 @@ def get_xml_from_pdf(pdf_file, check_xsd=True, check_schematron=True, filenames= xml_check_schematron(xml_root, flavor=flavor, level=level) except Exception: logger.warning( - "Skipping file %s because it is not valid against the schematron", - filename, + "Skipping %s: not valid against the schematron", filename ) continue xml_bytes = attach_obj.content @@ -644,7 +654,8 @@ def _prepare_pdf_metadata_xml(flavor, level, orderx_type, pdf_metadata): xml_nodes = xml_root.xpath(xpath, namespaces=namespaces) if len(xml_nodes) != 1: raise Exception( - f"XMP generation: wrong xpath {xpath} for {key}. Please report it as a bug." + f"XMP generation: wrong xpath {xpath} for {key}. " + f"Please report it as a bug." ) xml_node = xml_nodes[0] expected_node_text = f"##{key}" @@ -695,7 +706,7 @@ def _filespec_additional_attachments( { NameObject("/Type"): NameObject("/EmbeddedFile"), NameObject("/Params"): params_dict, - NameObject("/Subtype"): NameObject("/%s" % file_mimetype), + NameObject("/Subtype"): NameObject(f"/{file_mimetype}"), } ) file_entry_obj = pdf_writer._add_object(file_entry) @@ -711,7 +722,7 @@ def _filespec_additional_attachments( filespec_dict = DictionaryObject( { NameObject("/AFRelationship"): NameObject( - "/%s" % afrelationship.capitalize() + f"/{afrelationship.capitalize()}" ), NameObject("/Desc"): create_string_object(file_dict.get("description", "")), NameObject("/Type"): NameObject("/Filespec"), @@ -732,23 +743,24 @@ def _facturx_update_metadata_add_attachment( level, orderx_type=None, lang=None, - additional_attachments={}, + additional_attachments=None, afrelationship="data", xmp_compression=True, ): """This method is inspired from the code of the add_attachment() method of the pypdf lib""" + if additional_attachments is None: + additional_attachments = {} # The entry for the file # facturx_xml_str = facturx_xml_str.encode('utf-8') if flavor == "order-x" and orderx_type not in ORDERX_TYPES: raise ValueError( - "Wrong value for orderx_type (%s), must be in %s" - % (orderx_type, ORDERX_TYPES) + f"Wrong value for orderx_type ({orderx_type}), must be in {ORDERX_TYPES}" ) if afrelationship not in XML_AFRelationship: raise ValueError( - "Wrong value for afrelationship (%s). Possible values: %s." - % (afrelationship, XML_AFRelationship) + f"Wrong value for afrelationship ({afrelationship}). " + f"Possible values: {XML_AFRelationship}." ) md5sum_bytes = hashlib.md5(xml_bytes).digest() md5sum_obj = ByteStringObject(md5sum_bytes) @@ -789,7 +801,7 @@ def _facturx_update_metadata_add_attachment( filespec_dict = DictionaryObject( { NameObject("/AFRelationship"): NameObject( - "/%s" % afrelationship.capitalize() + f"/{afrelationship.capitalize()}" ), NameObject("/Desc"): create_string_object(desc), NameObject("/Type"): NameObject("/Filespec"), @@ -924,42 +936,35 @@ def _base_info2pdf_metadata(base_info): doc_type_name = doc_type_map.get(base_info["doc_type"], "Invoice") date_str = datetime.strftime(base_info["date"], "%Y-%m-%d") if base_info["doc_type"] == "231": - title = "%s: Order Response on Order %s from %s" % ( - base_info["seller"], - base_info["number"], - base_info["buyer"], + title = ( + f"{base_info['seller']}: Order Response on Order {base_info['number']} " + f"from {base_info['buyer']}" ) - subject = "Response of %s on %s to order %s from %s" % ( - base_info["seller"], - date_str, - base_info["number"], - base_info["buyer"], + subject = ( + f"Response of {base_info['seller']} on {date_str} to order " + f"{base_info['number']} from {base_info['buyer']}" ) doc_x = "Order-X" author = base_info["seller"] elif base_info["doc_type"] in ("220", "230"): - title = "%s: %s %s" % (base_info["buyer"], doc_type_name, base_info["number"]) - subject = "%s %s issued by %s on %s" % ( - doc_type_name, - base_info["number"], - base_info["buyer"], - date_str, + title = f"{base_info['buyer']}: {doc_type_name} {base_info['number']}" + subject = ( + f"{doc_type_name} {base_info['number']} issued by {base_info['buyer']} " + f"on {date_str}" ) doc_x = "Order-X" author = base_info["buyer"] else: - title = "%s: %s %s" % (base_info["seller"], doc_type_name, base_info["number"]) - subject = "%s %s dated %s issued by %s" % ( - doc_type_name, - base_info["number"], - date_str, - base_info["seller"], + title = f"{base_info['seller']}: {doc_type_name} {base_info['number']}" + subject = ( + f"{doc_type_name} {base_info['number']} dated {date_str} issued by " + f"{base_info['seller']}" ) doc_x = "Factur-X" author = base_info["seller"] pdf_metadata = { "author": author, - "keywords": "%s, %s" % (doc_type_name, doc_x), + "keywords": f"{doc_type_name}, {doc_x}", "title": title, "subject": subject, } @@ -1045,7 +1050,7 @@ def get_level(xml_etree, flavor="autodetect"): if len(doc_id_cut) > 1: level = doc_id_cut.split(":")[-2] if level not in possible_values: - raise ValueError("Invalid Factur-X/Order-X URN: '%s'" % doc_id) + raise ValueError(f"Invalid Factur-X/Order-X URN: '{doc_id}'") logger.info("Level is %s (autodetected)", level) return level @@ -1079,8 +1084,8 @@ def get_orderx_type(xml_etree): code = xpath_res and xpath_res[0].text and xpath_res[0].text.strip() or None if code not in ORDERX_code2type: raise Exception( - "The TypeCode extracted from the XML is %s. " - "This is not a valid Order-X TypeCode." % code + f"The TypeCode extracted from the XML is {code}. " + f"This is not a valid Order-X TypeCode." ) logger.info( "Order-X type is %s code %s (autodetected)", ORDERX_code2type[code], code @@ -1313,40 +1318,38 @@ def generate_from_file( if not xml: raise ValueError("Missing xml argument") if not isinstance(flavor, str): - raise ValueError("flavor argument is a %s, must be a string" % type(flavor)) + raise ValueError(f"flavor argument is a {type(flavor)}, must be a string") if not isinstance(level, str): - raise ValueError("level argument is a %s, must be a string" % type(level)) + raise ValueError(f"level argument is a {type(level)}, must be a string") if not isinstance(orderx_type, (str, type(None))): raise ValueError( - "orderx_type argument is a %s, must be a string or None" % type(orderx_type) + f"orderx_type argument is a {type(orderx_type)}, must be a string or None" ) if not isinstance(check_xsd, bool): - raise ValueError( - "check_xsd argument is a %s, must be a boolean" % type(check_xsd) - ) + raise ValueError(f"check_xsd argument is a {type(check_xsd)}, must be boolean") if not isinstance(check_schematron, bool): raise ValueError( "check_schematron argument is a {type(check_schematron)}, must be a boolean" ) if not isinstance(pdf_metadata, (dict, type(None))): raise ValueError( - "pdf_metadata argument is a %s, must be a dict or None" % type(pdf_metadata) + f"pdf_metadata argument is a {type(pdf_metadata)}, must be a dict or None" ) if not isinstance(lang, (type(None), str)): - raise ValueError("lang argument is a %s, must be a string or None" % type(lang)) + raise ValueError(f"lang argument is a {type(lang)}, must be a string or None") if not isinstance(output_pdf_file, (type(None), str)): raise ValueError( - "output_pdf_file argument is a %s, must be a string or None" - % type(output_pdf_file) + f"output_pdf_file argument is a {type(output_pdf_file)}, " + f"must be a string or None" ) if not isinstance(attachments, (dict, type(None))): raise ValueError( - "attachments argument is a %s, must be a dict or None" % type(attachments) + f"attachments argument is a {type(attachments)}, must be a dict or None" ) if not isinstance(afrelationship, (str, type(None))): raise ValueError( - "afrelationship argument is a %s, must be a string or None" - % type(afrelationship) + f"afrelationship argument is a {type(afrelationship)}, " + f"must be a string or None" ) # Tolerance on arguments - reformatting flavor = flavor.lower() @@ -1395,9 +1398,8 @@ def generate_from_file( # I don't think we expect the lib to close it else: raise TypeError( - "The second argument of the method generate_from_file must be " - "either a string, an etree.Element() object or a file " - "(it is a %s)." % type(xml) + f"The second argument of the method generate_from_file must be either a " + f"string, an etree.Element() object or a file (it is a {type(xml)})." ) if attachments is None: attachments = {} diff --git a/src/facturx/scripts/pdfextractxml.py b/src/facturx/scripts/pdfextractxml.py index 001c240..cd731c4 100755 --- a/src/facturx/scripts/pdfextractxml.py +++ b/src/facturx/scripts/pdfextractxml.py @@ -76,7 +76,7 @@ def main(args=None): if args is None: args = sys.argv[1:] usage = "facturx-pdfextractxml " - epilog = "Author: %s - Version: %s" % (__author__, __version__) + epilog = f"Author: {__author__} - Version: {__version__}" description = "This extracts the XML file from a Factur-X or Order-X PDF file." parser = argparse.ArgumentParser( usage=usage, epilog=epilog, description=description diff --git a/src/facturx/scripts/pdfgen.py b/src/facturx/scripts/pdfgen.py index 6efcba9..2f849fd 100755 --- a/src/facturx/scripts/pdfgen.py +++ b/src/facturx/scripts/pdfgen.py @@ -106,7 +106,7 @@ def main(args=None): "facturx-pdfgen " " " ) - epilog = "Author: %s - Version: %s" % (__author__, __version__) + epilog = f"Author: {__author__} - Version: {__version__}" description = ( "This script generate a Factur-X or Order-X PDF from a " "regular PDF/A document and a Factur-X or Order-X XML file. " diff --git a/src/facturx/scripts/xmlcheck.py b/src/facturx/scripts/xmlcheck.py index 78ce425..c673dc9 100755 --- a/src/facturx/scripts/xmlcheck.py +++ b/src/facturx/scripts/xmlcheck.py @@ -58,7 +58,7 @@ def main(args=None): if args is None: args = sys.argv[1:] usage = "facturx-xmlcheck " - epilog = "Author: %s - Version: %s" % (__author__, __version__) + epilog = f"Author: {__author__} - Version: {__version__}" description = ( "This script checks the Factur-X or Order-XML XML against the XML " "Schema Definition." @@ -79,8 +79,10 @@ def main(args=None): "--flavor", dest="flavor", default="autodetect", - help="Set XML flavor. Possible values: factur-x, zugferd, order-x or autodetect. " - "Default value: autodetect.", + help=( + "Set XML flavor. Possible values: factur-x, zugferd, order-x " + "or autodetect. Default value: autodetect." + ), ) parser.add_argument( "-n", From 94f84925f69f5ceb8db1aaa678959ff972c576da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20BEAU?= Date: Tue, 26 May 2026 17:10:18 +0200 Subject: [PATCH 3/5] fix compatibility con 4.6.5 --- src/facturx/facturx.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/facturx/facturx.py b/src/facturx/facturx.py index 7ffb414..c69809e 100644 --- a/src/facturx/facturx.py +++ b/src/facturx/facturx.py @@ -203,7 +203,8 @@ def xml_check_xsd(xml, flavor="autodetect", level="autodetect"): xsd_absolute_filepath = importlib_resources.files(__package__).joinpath(xsd_file) logger.debug("Using XSD file %s", xsd_absolute_filepath) - official_schema = etree.XMLSchema(file=xsd_absolute_filepath) + # str is added to be compatible with lxml 4.6.5 + official_schema = etree.XMLSchema(file=str(xsd_absolute_filepath)) try: t = etree.parse(BytesIO(xml_bytes)) official_schema.assertValid(t) From a9d1c41cea233162112b945b3bc67a697a36fb09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20BEAU?= Date: Tue, 26 May 2026 17:24:12 +0200 Subject: [PATCH 4/5] WIP start add test --- tests/test_extraction.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 tests/test_extraction.py diff --git a/tests/test_extraction.py b/tests/test_extraction.py new file mode 100644 index 0000000..52152e6 --- /dev/null +++ b/tests/test_extraction.py @@ -0,0 +1,18 @@ +# Copyright 2026 Akretion (https://www.akretion.com). +# @author Sébastien BEAU +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import unittest + +from facturx import get_xml_from_pdf + + +class TestAPI(unittest.TestCase): + def test_extraction(): + with open("../fixtures/invoice_EN16931.pdf", "rb") as pdf_file: + xml_bytes = get_xml_from_pdf( + pdf_file, check_xsd=False, check_schematron=False + ) + assert xml_bytes is not None + assert isinstance(xml_bytes, bytes) + assert len(xml_bytes) > 0 From 776bfa5281af69350184cd934ce37fc8489cb669 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20BEAU?= Date: Tue, 26 May 2026 17:41:55 +0200 Subject: [PATCH 5/5] Start adding test --- README.rst | 20 ++++++++++++++++++++ pyproject.toml | 8 ++++++++ tests/fixtures/pdf/invoice_EN16931.pdf | Bin 0 -> 302582 bytes tests/test_extraction.py | 15 +++++++-------- 4 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 tests/fixtures/pdf/invoice_EN16931.pdf diff --git a/README.rst b/README.rst index 196e3a9..3febf87 100644 --- a/README.rst +++ b/README.rst @@ -36,6 +36,26 @@ The PDF file *regular_pdf_file* will be updated to Factur-X/Order-X. If you want To have more examples, look at the docstrings in the source code or look at the source code of the command line tools located in the *bin* subdirectory. +Development +============= + +Use hatch +------------- + +Install the env with all lib + +``` +hatch env create +``` + +Execute the test +------------------- + +``` +hatch run test:pytest +``` + + Command line tools ================== diff --git a/pyproject.toml b/pyproject.toml index c145406..f24d956 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,6 +20,9 @@ readme = "README.rst" keywords = ["e-invoice", "ZUGFeRD", "Factur-X", "Order-X", "e-procurement"] license = {file = "LICENSE.txt"} dependencies = [ + "pypdf>=5.3.0", + "lxml", + "saxonche", ] requires-python = ">=3.9" dynamic = ["version"] @@ -53,6 +56,11 @@ exclude = [ [tool.hatch.build.targets.wheel] packages = ["src/facturx"] +[tool.hatch.envs.test] +features = [ + "test" +] + [tool.ruff] target-version = "py39" fix = true diff --git a/tests/fixtures/pdf/invoice_EN16931.pdf b/tests/fixtures/pdf/invoice_EN16931.pdf new file mode 100644 index 0000000000000000000000000000000000000000..10a80bc05b9acb43eabf0f153f42dbb03d2b7cee GIT binary patch literal 302582 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
    7Pn4a-o;5F8*hx3`V&70_ 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

    L7X2!J9R@$GYc}*gQecE=I#$8&K}sRm1f0 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 ) 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�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 UKTh00PHr$a3LTxastn410c2$#J^%m! literal 0 HcmV?d00001 diff --git a/tests/test_extraction.py b/tests/test_extraction.py index 52152e6..7fd0f50 100644 --- a/tests/test_extraction.py +++ b/tests/test_extraction.py @@ -2,17 +2,16 @@ # @author Sébastien BEAU # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +import os import unittest from facturx import get_xml_from_pdf +current_dir = os.path.dirname(os.path.abspath(__file__)) + class TestAPI(unittest.TestCase): - def test_extraction(): - with open("../fixtures/invoice_EN16931.pdf", "rb") as pdf_file: - xml_bytes = get_xml_from_pdf( - pdf_file, check_xsd=False, check_schematron=False - ) - assert xml_bytes is not None - assert isinstance(xml_bytes, bytes) - assert len(xml_bytes) > 0 + def test_extraction(self): + path_file = os.path.join(current_dir, "fixtures/pdf/invoice_EN16931.pdf") + with open(path_file, "rb") as pdf_file: + get_xml_from_pdf(pdf_file, check_xsd=True, check_schematron=True)

    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%0AN)!NYsJACx{{ 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