diff --git a/facho/facho.py b/facho/facho.py index 5f1cfb9..e4dd42d 100644 --- a/facho/facho.py +++ b/facho/facho.py @@ -213,7 +213,8 @@ class FachoXML: elem = self.get_element(xpath) for k, v in attrs.items(): self.builder.set_attribute(elem, k, v) - + return self + def get_element(self, xpath): xpath = self.fragment_prefix + self._normalize_xpath(xpath) return self.builder.xpath(self.root, xpath) diff --git a/facho/fe/form.py b/facho/fe/form.py index 2a1d4da..bb4d5a1 100644 --- a/facho/fe/form.py +++ b/facho/fe/form.py @@ -78,6 +78,12 @@ class TaxTotal: self.tax_amount += subtax.tax_amount self.taxable_amount += subtax.taxable_amount +@dataclass +class Price: + amount: float + type_code: str + type: str + @dataclass class InvoiceLine: @@ -85,12 +91,12 @@ class InvoiceLine: quantity: int description: str item: Item - price_amount: float + price: Price tax: TaxTotal @property def total_amount(self): - return self.quantity * self.price_amount + return self.quantity * self.price.amount @property def total_tax_inclusive_amount(self): @@ -293,6 +299,12 @@ class DIANInvoiceXML(fe.FeXML): line.set_element('/cac:InvoiceLine/cbc:InvoicedQuantity', invoice_line.quantity, unitCode = 'NAR') line.set_element('/cac:InvoiceLine/cbc:LineExtensionAmount', invoice_line.total_amount, currencyID="COP") line.set_element('/cac:InvoiceLine/cac:TaxTotal/cbc:TaxAmount', invoice_line.tax_amount, currencyID='COP') + + condition_price = line.fragment('/cac:InvoiceLine/cac:PricingReference/cac:AlternativeConditionPrice') + condition_price.set_element('/cac:AlternativeConditionPrice/cbc:PriceAmount', invoice_line.price.amount, currencyID='COP') + condition_price.set_element('/cac:AlternativeConditionPrice/cbc:PriceTypeCode', invoice_line.price.type_code) + condition_price.set_element('/cac:AlternativeConditionPrice/cbc:PriceType', invoice_line.price.type) + for subtotal in invoice_line.tax.subtotals: line.set_element('/cac:InvoiceLine/cac:TaxTotal/cac:TaxSubtotal/cbc:TaxableAmount', subtotal.taxable_amount, currencyID='COP') line.set_element('/cac:InvoiceLine/cac:TaxTotal/cac:TaxSubtotal/cbc:TaxAmount', subtotal.tax_amount, currencyID='COP') @@ -302,7 +314,7 @@ class DIANInvoiceXML(fe.FeXML): line.set_element('/cac:InvoiceLine/cac:Item/cbc:Description', invoice_line.item.description) # TODO line.set_element('/cac:InvoiceLine/cac:Item/cac:StandardItemIdentification/cbc:ID', invoice_line.item.id) - line.set_element('/cac:InvoiceLine/cac:Price/cbc:PriceAmount', invoice_line.price_amount, currencyID="COP") + line.set_element('/cac:InvoiceLine/cac:Price/cbc:PriceAmount', invoice_line.price.amount, currencyID="COP") def attach_invoice(fexml, invoice): """adiciona etiquetas a FEXML y retorna FEXML diff --git a/tests/test_fe_form.py b/tests/test_fe_form.py index 56fb27f..7fcd299 100644 --- a/tests/test_fe_form.py +++ b/tests/test_fe_form.py @@ -58,7 +58,7 @@ def simple_invoice(): quantity = 1, description = 'producto facho', item = form.StandardItem('test', 9999), - price_amount = 100.0, + price = form.Price(100.0, '', ''), tax = form.TaxTotal( tax_amount = 0.0, taxable_amount = 0.0, @@ -154,7 +154,7 @@ def test_invoice_totals(simple_invoice_without_lines): quantity = 1, description = 'producto', item = form.StandardItem('test', 9999), - price_amount = 1_500_000, + price = form.Price(1_500_000, '', ''), tax = form.TaxTotal( subtotals = [ form.TaxSubTotal( @@ -177,7 +177,7 @@ def test_invoice_cufe(simple_invoice_without_lines): quantity = 1, description = 'producto', item = form.StandardItem('test', 111), - price_amount = 1_500_000, + price = form.Price(1_500_000, '', ''), tax = form.TaxTotal( subtotals = [ form.TaxSubTotal(