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 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 XMLInvoice_Reader($dm); } else { throw new \Exception("XR55: 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("XR62: file not found $filename", 62); } $dm = new \DOMDocument(); if ($dm->load($filename) != false) { return new XMLInvoice_Reader($dm); } else { throw new \Exception("XR55: not a valid XML", 55); } } /** * @brief retrieve InvoiceLines */ function get_invoiceLine(): array { $result = []; $node = $this->get_node("//cac:InvoiceLine"); // read Invoice if ( $node == null ) { throw new \Exception ("XR143 unknow document",143); } for ($e = 0; $e < $node->length; $e++) { $row = []; $row ['quantity'] = $this->get_node_value("//cbc:InvoicedQuantity", $e); $row ['amount'] = $this->get_node_value("//cbc:LineExtensionAmount", $e); $row ['description'] = $this->get_node_value("//cac:Item/cbc:Description", $e); $row ['name'] = $this->get_node_value("//cac:InvoiceLine/cac:Item/cbc:Name", $e); $row ['unit_price'] = $this->get_node_value("//cac:InvoiceLine/cac:Price/cbc:PriceAmount", $e); $row ['tva_id'] = $this->get_node_value("//cac:InvoiceLine/cac:Item/cac:ClassifiedTaxCategory/cbc:ID", $e); $row ['tva_percent'] = $this->get_node_value("//cac:InvoiceLine/cac:Item/cac:ClassifiedTaxCategory/cbc:Percent", $e); $result[] = $row; return $result; } } /** * @brief return the code of the document * @return string invoice + code */ function get_document_type_code() { return "invoice ".$this->get_node_value('cbc:InvoiceTypeCode'); } /** * @brief before executing xpath->query the namespace must be registered * the NS are different for each type of doc * @param $xml (null or simpleXML) */ 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:Invoice-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)); // /Invoice/cac:TaxTotal[1]/cac:TaxSubtotal[1]/cbc:TaxableAmount[1] $this->registerNS($xml); $row ['taxable_amount'] = $xml->xpath("//cbc:TaxableAmount")[$e] . ""; $row ['tax'] = $xml->xpath("//cbc:TaxAmount")[$e] . ""; $row ['tax_id'] = $xml->xpath("//cac:TaxCategory/cbc:ID")[$e] . ""; $row ['tax_percent'] = $xml->xpath("//cac:TaxCategory/cbc:Percent")[$e] . ""; if (isset($xml->xpath("//cac:InvoiceLine/cac:Item/cbc:Name")[$e])) { $row ['name'] =$xml->xpath("//cac:InvoiceLine/cac:Item/cbc:Name")[$e].""; }else { $row ['name'] =""; } if ( isset ($xml->xpath("//cbc:TaxExemptionReasonCode")[$e])) { $row['vatex']=$xml->xpath("//cbc:TaxExemptionReasonCode")[$e]; }else { $row['vatex']=""; } $result[] = $row; } return $result; } }