toXml method

String toXml()

Generates the XML representation of the invoice.

This method creates an XML document structured with all the required elements for the invoice, including information such as the invoice ID, customer details, items, tax information, and supplier details. It also adds additional document references, and handles the inclusion of tax totals and monetary totals.

Returns the XML string representing the invoice.

Implementation

String toXml() {
  final builder = XmlBuilder();
  builder.processing('xml', 'version="1.0" encoding="UTF-8"');
  builder.element('Invoice', namespaces: {
    "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2": "",
    "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2":
        "cac",
    "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2":
        "cbc",
    "urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2":
        "ext"
  }, nest: () {
    builder.element('cbc:ProfileID', nest: 'reporting:1.0');
    builder.element('cbc:ID', nest: id);
    builder.element('cbc:UUID', nest: uuid);
    builder.element('cbc:IssueDate',
        nest: issueDate.toIso8601String().split('T')[0]);
    builder.element('cbc:IssueTime',
        nest: issueTime.toIso8601String().split('T')[1].split('.')[0]);

    // Invoice Type Code
    invoiceTypeCode != null
        ? invoiceTypeCode?.toXml(builder)
        : InvoiceTypeCode.simplifiedTaxInvoice().toXml(builder);

    builder.element('cbc:DocumentCurrencyCode', nest: currency);
    builder.element('cbc:TaxCurrencyCode', nest: currency);

    // Additional Document Reference for ICV
    builder.element('cac:AdditionalDocumentReference', nest: () {
      builder.element('cbc:ID', nest: 'ICV');
      builder.element('cbc:UUID', nest: icv);
    });

    // Additional Document Reference for PIH
    builder.element('cac:AdditionalDocumentReference', nest: () {
      builder.element('cbc:ID', nest: 'PIH');
      builder.element('cac:Attachment', nest: () {
        builder.element('cbc:EmbeddedDocumentBinaryObject',
            attributes: {'mimeCode': 'text/plain'},
            nest: pih.isEmpty ? getPIHForFirstInvoice() : pih);
      });
    });

    // Supplier and Customer parties
    builder.element('cac:AccountingSupplierParty',
        nest: () => supplier?.toXml(builder));
    if (customer != null) {
      builder.element('cac:AccountingCustomerParty',
          nest: () => customer?.toXml(builder));
    }

    // Tax total and Legal Monetary total
    builder.element('cac:TaxTotal', nest: () {
      builder.element('cbc:TaxAmount',
          attributes: {'currencyID': tax.currency}, nest: tax.amount);
    });
    builder.element('cac:TaxTotal', nest: () => tax.toXml(builder));
    builder.element('cac:LegalMonetaryTotal',
        nest: () => monetaryTotal.toXml(builder));

    // Invoice Lines
    for (int id = 0; id < lines.length; id++) {
      InvoiceLine line = lines[id];
      builder.element('cac:InvoiceLine', nest: () => line.toXml(builder, id));
    }
  });

  return builder.buildDocument().toXmlString(pretty: true);
}