string 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2' 'ns2' => string 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2' 'cac' => string 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2' 'ns4' => string 'urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2' ) * */ class XMLCreditNote_Reader extends XML_Reader { public function __construct(\DOMDocument $domDocument) { parent::__construct($domDocument); } /** * @brief Build an XMLInvoice_Reader object from an XML string * @param $string (string) XML * @return \Noalyss\XMLDocument\XMLInvoice_Reader * @throws \Exception if xml not valid */ static function build_from_string($string) { $dm = new \DOMDocument(); if ($dm->loadXML($string) != false) { return new XMLCreditNote_Reader($dm); } else { throw new \Exception("XC55: not a valid XML", 55); } } /** * @brief Build an XMLInvoice_Reader object from an XML file * @param $filename (string) file and path to the file * @return \Noalyss\XMLDocument\XMLInvoice_Reader * @throws \Exception if xml not valid */ static function build_from_file($filename) { if (!file_exists($filename)) { throw new \Exception("XC62: file not found $filename", 62); } $dm = new \DOMDocument(); if ($dm->load($filename) != false) { return new XMLCreditNote_Reader($dm); } else { throw new \Exception("XC55: not a valid XML", 55); } } /** * @brief retrieve InvoiceLines @code 2 -3 -1500 123 Description 2 item name 2 21382183120983 NO 09348023 S 25.0 VAT 500 @endcode */ function get_invoiceLine(): array { $result = []; $node = $this->get_node("//cac:CreditNoteLine"); if ($node == null ) { throw new \Exception ("XC140 invalide document",140); } for ($e = 0; $e < $node->length; $e++) { $row = []; $row ['quantity'] = $node->item($e)->getElementsByTagName("CreditedQuantity")->item(0)->textContent; $row ['code_quantity'] = $node->item($e)->getElementsByTagName("CreditedQuantity")->item(0)->getAttribute('unitCode'); $row ['amount'] = $node->item($e)->getElementsByTagName("LineExtensionAmount")->item(0)->textContent; $row ['description'] = $node->item($e)->getElementsByTagName("Description")->item(0)?->textContent; $row ['name'] = $node->item($e)->getElementsByTagName("Name")->item(0)->textContent; $row ['unit_price'] = $node->item($e)->getElementsByTagName("PriceAmount")->item(0)->textContent; $row ['tva_id'] = $node->item($e)->getElementsByTagName("ID")->item(0)->textContent; $row ['tva_percent'] = $node->item($e)->getElementsByTagName("Percent")->item(0)?->textContent; $result[] = $row; } return $result; } /** * @brief return the code of the document * @return string credit_node + code */ function get_document_type_code() { return "credit note ".$this->get_node_value('cbc:CreditNoteTypeCode'); } /** * @brief before executing xpath->query the namespace must be registered * the NS are different for each type of doc */ public function get_namespace() { $a_namespace=array( "cac"=> 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2' ,"cbc"=> 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2' ,"ns4"=>'urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2' ,"ns2"=>'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2' ); return $a_namespace; } /** * @brief get the Taxes info from XML * @return array */ function get_taxes(): array { $result = []; $node = $this->get_node("//cac:TaxTotal/cac:TaxSubtotal"); for ($e = 0; $e < $node->length; $e++) { $row = []; $xml = simplexml_import_dom($node->item($e)); $this->registerNS($xml); $row ['taxable_amount'] = $xml->xpath("cbc:TaxableAmount")[0] . ""; $row ['tax'] = $xml->xpath("cbc:TaxAmount")[0] . ""; $row['tax_currency']=$xml->xpath("cbc:TaxAmount")[0]->attributes()['currencyID'].""; $row ['tax_id'] = $xml->xpath("cac:TaxCategory/cbc:ID")[0]. ""; $row ['tax_percent'] =0; $r=$xml->xpath("//cac:TaxCategory/cbc:Percent"); if ( isset($r[$e]) ) { $row ['tax_percent'] = $xml->xpath("cac:TaxCategory/cbc:Percent")[0] . ""; } $row ['name'] =""; if ( $xml->xpath("cac:TaxCategory/cbc:Name") != null) { $row['name']=$xml->xpath("cac:TaxCategory/cbc:Name")[0].''; } $row['vatex']=""; if ( $xml->xpath("cac:TaxCategory/cbc:TaxExemptionReason") != null) { $row['vatex']=$xml->xpath("cac:TaxCategory/cbc:TaxExemptionReason")[0].''; } if ( $xml->xpath("cac:TaxCategory/cbc:TaxExemptionReason") != null) { $row['vatex'].=$xml->xpath("cac:TaxCategory/cbc:TaxExemptionReason")[0].''; } $result[] = $row; } return $result; } }