'); // 1. Basic Information $xml->addChild('cbc:UBLVersionID', '2.1'); $xml->addChild('cbc:CustomizationID', 'TRADACO-2.1'); $xml->addChild('cbc:ProfileID', 'reporting:1.0'); $xml->addChild('cbc:ID', $invoice['invoice_number']); $xml->addChild('cbc:IssueDate', $invoice['invoice_date']); $xml->addChild('cbc:InvoiceTypeCode', $invoice['ubl_type_code'] ?? '388')->addAttribute('name', $invoice['invoice_category'] ?? '01'); $xml->addChild('cbc:DocumentCurrencyCode', 'JOD'); $xml->addChild('cbc:TaxCurrencyCode', 'JOD'); // 2. AccountingSupplierParty (The Seller/Company) $supplier = $xml->addChild('cac:AccountingSupplierParty'); $sParty = $supplier->addChild('cac:Party'); $sParty->addChild('cac:PartyIdentification')->addChild('cbc:ID', $company['tax_identification_number'])->addAttribute('schemeID', 'TN'); $sName = $sParty->addChild('cac:PartyName'); $sName->addChild('cbc:Name', $company['name']); $sAddr = $sParty->addChild('cac:PostalAddress'); $sAddr->addChild('cbc:CityName', $company['city'] ?? 'Amman'); $sAddr->addChild('cac:Country')->addChild('cbc:IdentificationCode', 'JO'); $sTaxScheme = $sParty->addChild('cac:PartyTaxScheme'); $sTaxScheme->addChild('cbc:RegistrationName', $company['name']); $sTaxScheme->addChild('cbc:CompanyID', $company['tax_identification_number']); $sTaxScheme->addChild('cac:TaxScheme')->addChild('cbc:ID', 'VAT'); $sLegalEntity = $sParty->addChild('cac:PartyLegalEntity'); $sLegalEntity->addChild('cbc:RegistrationName', $company['name']); $sLegalEntity->addChild('cbc:CompanyID', $company['tax_identification_number']); // 3. AccountingCustomerParty (The Buyer) $customer = $xml->addChild('cac:AccountingCustomerParty'); $cParty = $customer->addChild('cac:Party'); if (!empty($invoice['buyer_tin'])) { $cParty->addChild('cac:PartyIdentification')->addChild('cbc:ID', $invoice['buyer_tin'])->addAttribute('schemeID', 'TN'); } elseif (!empty($invoice['buyer_national_id'])) { $cParty->addChild('cac:PartyIdentification')->addChild('cbc:ID', $invoice['buyer_national_id'])->addAttribute('schemeID', 'NID'); } $cName = $cParty->addChild('cac:PartyName'); $cName->addChild('cbc:Name', $invoice['buyer_name'] ?? 'General Customer'); $cTaxScheme = $cParty->addChild('cac:PartyTaxScheme'); $cTaxScheme->addChild('cac:TaxScheme')->addChild('cbc:ID', 'VAT'); // 4. PaymentMeans $payment = $xml->addChild('cac:PaymentMeans'); $payment->addChild('cbc:PaymentMeansCode', $invoice['payment_method_code'] ?? '10'); // 5. TaxTotal $taxTotal = $xml->addChild('cac:TaxTotal'); $taxTotal->addChild('cbc:TaxAmount', number_format((float)$invoice['tax_amount'], 3, '.', ''))->addAttribute('currencyID', 'JOD'); $taxSubtotal = $taxTotal->addChild('cac:TaxSubtotal'); $taxSubtotal->addChild('cbc:TaxableAmount', number_format((float)$invoice['subtotal'], 3, '.', ''))->addAttribute('currencyID', 'JOD'); $taxSubtotal->addChild('cbc:TaxAmount', number_format((float)$invoice['tax_amount'], 3, '.', ''))->addAttribute('currencyID', 'JOD'); $taxCategory = $taxSubtotal->addChild('cac:TaxCategory'); $taxCategory->addChild('cbc:ID', 'S'); $taxCategory->addChild('cbc:Percent', '16.00'); // Default Jordan VAT $taxCategory->addChild('cac:TaxScheme')->addChild('cbc:ID', 'VAT'); // 6. LegalMonetaryTotal $legalMonetaryTotal = $xml->addChild('cac:LegalMonetaryTotal'); $legalMonetaryTotal->addChild('cbc:LineExtensionAmount', number_format((float)$invoice['subtotal'], 3, '.', ''))->addAttribute('currencyID', 'JOD'); $legalMonetaryTotal->addChild('cbc:TaxExclusiveAmount', number_format((float)$invoice['subtotal'], 3, '.', ''))->addAttribute('currencyID', 'JOD'); $legalMonetaryTotal->addChild('cbc:TaxInclusiveAmount', number_format((float)$invoice['grand_total'], 3, '.', ''))->addAttribute('currencyID', 'JOD'); $legalMonetaryTotal->addChild('cbc:AllowanceTotalAmount', number_format((float)($invoice['discount_total'] ?? 0), 3, '.', ''))->addAttribute('currencyID', 'JOD'); $legalMonetaryTotal->addChild('cbc:PayableAmount', number_format((float)$invoice['grand_total'], 3, '.', ''))->addAttribute('currencyID', 'JOD'); // 7. Invoice Lines foreach ($lines as $line) { $invoiceLine = $xml->addChild('cac:InvoiceLine'); $invoiceLine->addChild('cbc:ID', (string)$line['line_number']); $invoiceLine->addChild('cbc:InvoicedQuantity', number_format((float)$line['quantity'], 3, '.', ''))->addAttribute('unitCode', 'PCE'); $invoiceLine->addChild('cbc:LineExtensionAmount', number_format((float)$line['line_total'], 3, '.', ''))->addAttribute('currencyID', 'JOD'); $item = $invoiceLine->addChild('cac:Item'); $item->addChild('cbc:Description', $line['description']); $itemTaxCategory = $item->addChild('cac:TaxCategory'); $itemTaxCategory->addChild('cbc:ID', 'S'); $itemTaxCategory->addChild('cbc:Percent', '16.00'); $itemTaxCategory->addChild('cac:TaxScheme')->addChild('cbc:ID', 'VAT'); $price = $invoiceLine->addChild('cac:Price'); $price->addChild('cbc:PriceAmount', number_format((float)$line['unit_price'], 3, '.', ''))->addAttribute('currencyID', 'JOD'); } // Return formatted XML $dom = dom_import_simplexml($xml)->ownerDocument; $dom->formatOutput = true; return $dom->saveXML(); } }