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("//ns3:CreditNoteLine"); for ($e = 0; $e < $node->length; $e++) { $row = []; $xml = simplexml_import_dom($node->item($e)); $row ['quantity'] = $this->get_node_value("//cbc:CreditedQuantity", $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:CreditNoteLine/cac:Item/cbc:Name", $e); $row ['unit_price'] = $this->get_node_value("//cac:CreditNoteLine/cac:Price/cbc:PriceAmount", $e); $row ['tva_id'] = $this->get_node_value("//cac:CreditNoteLine/cac:Item/cac:ClassifiedTaxCategory/cbc:ID", $e); $row ['tva_percent'] = $this->get_node_value("//cac:CreditNoteLine/cac:Item/cac:ClassifiedTaxCategory/cbc:Percent", $e); $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)); \Noalyss\Dbg::echo_var(0, htmlspecialchars($xml->asXML())); // /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] . ""; $row ['name'] =$xml->xpath("//cac:CreditNoteLine/cac:Item/cbc:Name")[$e].""; /** * @TODODNY * Implémenter les allowances */ $result[] = $row; } return $result; } }