From 3755a56588603499b958c788bfbe0e4dcfe1f233 Mon Sep 17 00:00:00 2001 From: sparkyx Date: Mon, 13 Oct 2025 18:29:52 +0200 Subject: [PATCH] E-INVOICE : use VAT to identify company, since it between belgian company for the moment, VAT_CODE Mandatory --- include/XMLDocument/error_message.class.php | 5 ++- include/XMLDocument/facturx.class.php | 4 +-- include/XMLDocument/invoiceubl21.class.php | 24 ++++++------- include/XMLDocument/xmlinvoice.class.php | 35 ++++++++++++------- .../XMLDocument/xmlinvoice_reader.class.php | 11 ++++++ 5 files changed, 47 insertions(+), 32 deletions(-) diff --git a/include/XMLDocument/error_message.class.php b/include/XMLDocument/error_message.class.php index 702969c0e..365425c97 100644 --- a/include/XMLDocument/error_message.class.php +++ b/include/XMLDocument/error_message.class.php @@ -1,5 +1,4 @@ normalement c'est BE0999999999 - 'MY_COUNTRY_CODE' country code (normally BE) - 'MY_NAME' short company name - 'MY_STREET' address @@ -97,7 +96,7 @@ class Error_Message , 'city' => _("Ville") , 'country'=>_("Code pays") , 'customer_id' => _("Numéro de TVA") - , 'endpoint_id' => _('Identifiant PEPPOL') + , 'endpoint_id' => _('Identifiant PEPPOL') // here 9925:BE.... ); diff --git a/include/XMLDocument/facturx.class.php b/include/XMLDocument/facturx.class.php index 0ebcda196..b4fe7c9ee 100644 --- a/include/XMLDocument/facturx.class.php +++ b/include/XMLDocument/facturx.class.php @@ -82,10 +82,8 @@ class FacturX extends XMLInvoice } /** * @brief check that mandatory info are saved in the DB for customer - * @param $customer_id (int) card of the customer FICHE.F_ID - * @param $a_error (array) array of errors, empty if nothing found */ - function check_customer_data($customer_id){ + function check_customer_data(){ $a_error=array(); $a_needed=[ATTR_DEF_NAME=>'name' ,ATTR_DEF_ADRESS=>'street' diff --git a/include/XMLDocument/invoiceubl21.class.php b/include/XMLDocument/invoiceubl21.class.php index d1eae1ab5..09b161361 100644 --- a/include/XMLDocument/invoiceubl21.class.php +++ b/include/XMLDocument/invoiceubl21.class.php @@ -48,7 +48,6 @@ class InvoiceUBL21 extends XMLInvoice { , 'COMPANY_LEGAL_REGISTRATION' , 'COMPANY_BANK_IBAN' , 'COMPANY_BANK_BIC' - , 'COMPANY_UBL_ID' , 'MY_COUNTRY_CODE' , 'MY_NAME' , 'MY_STREET' @@ -67,7 +66,7 @@ class InvoiceUBL21 extends XMLInvoice { function display_error() { $a_error=$this->verify(); - include NOALYSS_TEMPLATE."/invoiceUBL21-display_error.php"; + include NOALYSS_TEMPLATE."/xmlinvoice-display_error.php"; } @@ -88,18 +87,15 @@ class InvoiceUBL21 extends XMLInvoice { } /** * @brief check that mandatory info are saved in the DB for customer - * @param $customer_id (int) card of the customer FICHE.F_ID - * @param $a_error (array) array of errors, empty if nothing found - * @todo : country code au lieu de country !! */ - function check_customer_data($customer_id){ + function check_customer_data(){ $a_error=array(); $a_needed=[ATTR_DEF_NAME=>'name' ,ATTR_DEF_ADRESS=>'street' ,ATTR_DEF_POSTCODE=>'postalzone' ,ATTR_DEF_CITY=>'city' ,ATTR_DEF_COUNTRY_CODE=>'country' - ,ATTR_DEF_NUMTVA=>'customer_id' + ,ATTR_DEF_NUMTVA=>'customer_vat_id' ,ATTR_DEF_PEPPOLID=>'endpoint_id' ]; @@ -155,7 +151,7 @@ class InvoiceUBL21 extends XMLInvoice { $tax=$this->createElement('cac:PartyTaxScheme'); - $tax->appendChild($this->createElement('cbc:CompanyID',$this->data["customer"]['customer_id'])); + $tax->appendChild($this->createElement('cbc:CompanyID',$this->data["customer"]['customer_vat_id'])); $tax_scheme=$this->createElement('cac:TaxScheme'); $tax_scheme->appendChild($this->createElement('cbc:ID',"VAT")); @@ -164,8 +160,8 @@ class InvoiceUBL21 extends XMLInvoice { $ple=$this->createElement('cac:PartyLegalEntity'); ///@todo customer = name doit être fiche $ple->appendChild($this->createElement("cbc:RegistrationName", $this->data['customer']['name']??"ERROR")); - ///@todo customer_id = numéro de TVA doit être dans fiche - $ple->appendChild($this->createElement("cbc:CompanyID", $this->data['customer']['customer_id']??"ERROR")); + ///@todo customer_vat_id = numéro de TVA doit être dans fiche + $ple->appendChild($this->createElement("cbc:CompanyID", $this->data['customer']['customer_vat_id']??"ERROR")); // assemble supplier $customer_party->appendChild($tax); @@ -214,7 +210,7 @@ class InvoiceUBL21 extends XMLInvoice { $supplier=$this->createElement('cac:AccountingSupplierParty'); $supplier_party=$supplier->appendChild($this->createElement('cac:Party')); - $supplier_party->appendChild($this->createElement('cbc:EndpointID',$company['COMPANY_UBL_ID']))->setAttribute('schemeID', 9925); + $supplier_party->appendChild($this->createElement('cbc:EndpointID',$this->data["supplier"]['supplier_vat_id']))->setAttribute('schemeID', 9925); $party_name=$this->createElement('cac:PartyName'); $party_name->appendChild($this->createElement('cbc:Name', $this->data['supplier']['name'])); $supplier_party->appendChild($party_name); @@ -229,14 +225,14 @@ class InvoiceUBL21 extends XMLInvoice { // Tax Schem $tax=$this->createElement('cac:PartyTaxScheme'); - $tax->appendChild($this->createElement('cbc:CompanyID',$this->data["supplier"]['supplier_id'])); + $tax->appendChild($this->createElement('cbc:CompanyID',$this->data["supplier"]['supplier_vat_id'])); $tax_scheme=$this->createElement('cac:TaxScheme'); $tax_scheme->appendChild($this->createElement('cbc:ID',"VAT")); $tax->appendChild($tax_scheme); // LegalEntity $ple=$this->createElement('cac:PartyLegalEntity'); $ple->appendChild($this->createElement("cbc:RegistrationName", $company['COMPANY_LEGAL_REGISTRATION']??"ERROR")); - $ple->appendChild($this->createElement("cbc:CompanyID", $this->data['supplier']['supplier_id']??"ERROR")); + $ple->appendChild($this->createElement("cbc:CompanyID", $this->data['supplier']['supplier_vat_id']??"ERROR")); $ple->appendChild($this->createElement("cbc:CompanyLegalForm", $company['COMPANY_LEGAL_ENTITY']??"ERROR")); $contact=$this->createElement('cac:Contact'); $contact->appendChild($this->createElement("cbc:Name",$company['INVOICE_CONTACT_NAME']??"ERROR")); @@ -300,7 +296,7 @@ class InvoiceUBL21 extends XMLInvoice { * @TODO DNY * Pas toujours S !? */ - //$taxCategory->appendChild($this->createElement("cbc:ID",$subTotal[$i]['vat_code'])); + $taxCategory->appendChild($this->createElement("cbc:ID",$subTotal[$i]['vat_code'])); $taxCategory->appendChild($this->createElement("cbc:Percent",sprintf("%.2f",$subTotal[$i]['percent']))); $taxScheme=$this->createElement("cac:TaxScheme"); $taxScheme->appendChild($this->createElement("cbc:ID", "VAT")); diff --git a/include/XMLDocument/xmlinvoice.class.php b/include/XMLDocument/xmlinvoice.class.php index 777236675..78d663d08 100644 --- a/include/XMLDocument/xmlinvoice.class.php +++ b/include/XMLDocument/xmlinvoice.class.php @@ -41,7 +41,7 @@ namespace Noalyss\XMLDocument; [postalzone] => 1080 [city] => Molenbeek Saint Jean [country] => BE - [supplier_id] => BE012345678 + [supplier_vat_id] => BE012345678 [registration_name] => My Company sprl ) @@ -52,7 +52,7 @@ namespace Noalyss\XMLDocument; [postalzone] => [city] => [country] => - [customer_id] => + [customer_vat_id] => numéro TVA [registration_name] => This asbl ) @@ -330,9 +330,8 @@ abstract class XMLInvoice extends \DOMDocument abstract function check_company_data() ; /** * @brief check that mandatory info are saved in the DB for customer - * @param $customer_id (int) card of the customer FICHE.F_ID */ - abstract function check_customer_data($customer_id) ; + abstract function check_customer_data() ; /** * @brief create the invoice in the right format, with PDF if any * @param $operation_id (int) JRN.JR_ID @@ -395,7 +394,7 @@ abstract class XMLInvoice extends \DOMDocument /** * @brief check that all the data are correct - * @returns null : no errors, string separated with comma of error code + * @returns empty arry : no errors, array with error code * @see get_message_error */ public function verify() @@ -408,7 +407,7 @@ abstract class XMLInvoice extends \DOMDocument // verify that all needed data in PARAMETER are valid $a_error['company'] = $this->check_company_data(); - $a_error['customer'] = $this->check_customer_data($this->data['customer']['card_id']); + $a_error['customer'] = $this->check_customer_data(); return $a_error; } @@ -422,9 +421,15 @@ abstract class XMLInvoice extends \DOMDocument * - ,postalzone * - ,city * - ,country - * - ,customer_id => VAT Number + * - ,customer_vat_id => VAT Number * - , registration_name, * - card_id + * - endpoint_id + * @note : + * endpoint_id: + normally it this the VAT number (BE included) and scheme 9925 + or the scheme 00208 VAT number without BE (enterprise number) + */ function fill_customer($card_id):array { @@ -440,10 +445,11 @@ abstract class XMLInvoice extends \DOMDocument $result['country']=$customer->get_attribute(ATTR_DEF_COUNTRY_CODE,0); // official ID , like VAT - $result['customer_id']=str_replace([" ",".","-","/"],"" ,$customer->get_attribute(ATTR_DEF_NUMTVA,0)); + $result['customer_vat_id']=str_replace([" ",".","-","/"],"" ,$customer->get_attribute(ATTR_DEF_NUMTVA,0)); // official name of the company $result['registration_name']=$customer->get_attribute(ATTR_DEF_NAME,0); - $result['endpoint_id']=$customer->get_attribute(ATTR_DEF_PEPPOLID,0); + // $result['endpoint_id']=$customer->get_attribute(ATTR_DEF_PEPPOLID,0); + $result['endpoint_id']= $result['customer_vat_id']; return $result; } /** @@ -455,7 +461,7 @@ abstract class XMLInvoice extends \DOMDocument * - ,postalzone * - ,city * - ,country - * - supplier_id => VAT Number + * - supplier_vat_id => VAT Number avec BE ! * - registration_name, * */ @@ -471,13 +477,18 @@ abstract class XMLInvoice extends \DOMDocument // official name of the company $result['registration_name']=$a_parameter['MY_NAME']; // official ID , like VAT - $result['supplier_id']=str_replace([" ",".","-","/"],"" ,$a_parameter['MY_TVA']); + $result['supplier_vat_id']=str_replace([" ",".","-","/"],"" ,$a_parameter['MY_TVA']); + /** + * @TODO vérifier qu'il contient bien BE + */ + $result['COUNTRY_CODE']=$a_parameter['COUNTRY_CODE']??""; $result['COMPANY_LEGAL_REGISTRATION']=$a_parameter['COMPANY_LEGAL_REGISTRATION']??""; $result['COMPANY_LEGAL_ENTITY']=$a_parameter['COMPANY_LEGAL_ENTITY']??""; $result['INVOICE_CONTACT_NAME']=$a_parameter['INVOICE_CONTACT_NAME']??""; $result['INVOICE_EMAIL_COMPANY']=$a_parameter['INVOICE_EMAIL_COMPANY']??""; - $result['COMPANY_UBL_ID']=$a_parameter['COMPANY_UBL_ID']??""; + //$result['COMPANY_UBL_ID']=$a_parameter['COMPANY_UBL_ID']??""; + $result['COMPANY_UBL_ID']="9925:".$result['supplier_vat_id']; return $result; } /** diff --git a/include/XMLDocument/xmlinvoice_reader.class.php b/include/XMLDocument/xmlinvoice_reader.class.php index decc2fa03..8df950906 100644 --- a/include/XMLDocument/xmlinvoice_reader.class.php +++ b/include/XMLDocument/xmlinvoice_reader.class.php @@ -34,6 +34,17 @@ namespace Noalyss\XMLDocument; * Exception code : * - 55 : XML Invalid * - 62 : filename don't exist + * Namespace standard (from XSD) + * + * Array +( + [xml] => http://www.w3.org/XML/1998/namespace + [cbc] => urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2 + [cac] => urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2 + [xmlns] => urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 +) + + * */ class XMLInvoice_Reader {