From 44827fe8110ed4b2a99be40822a62326fccb5643 Mon Sep 17 00:00:00 2001 From: "bit4bit@riseup.net" Date: Wed, 4 Nov 2020 00:40:46 +0000 Subject: [PATCH] fache/fe/form: Quantity require UnidadesMedida. FossilOrigin-Name: 675900c1251c0b7319dc8b395ce5d385297209197ce13b0ee5358b4ce619d9a8 --- facho/fe/data/dian/codelist/__init__.py | 2 ++ facho/fe/form/__init__.py | 26 +++++++++++++++++++++++-- facho/fe/form_xml/invoice.py | 4 +++- tests/fixtures.py | 2 +- tests/test_fe_form.py | 8 ++++---- tests/test_form.py | 6 +++--- 6 files changed, 37 insertions(+), 11 deletions(-) diff --git a/facho/fe/data/dian/codelist/__init__.py b/facho/fe/data/dian/codelist/__init__.py index 4c04c7f..63c874c 100644 --- a/facho/fe/data/dian/codelist/__init__.py +++ b/facho/fe/data/dian/codelist/__init__.py @@ -71,6 +71,7 @@ __all__ = ['TipoOrganizacion', 'TipoAmbiente', 'TipoDocumento', 'TipoImpuesto', + 'UnidadesMedida', 'CodigoPrecioReferencia', 'MediosPago', 'RegimenFiscal', @@ -98,3 +99,4 @@ Departamento = CodeList(path_for_codelist('Departamentos-2.1.gc'), 'code', 'name Paises = CodeList(path_for_codelist('Paises-2.1.gc'), 'code', 'name') TipoIdFiscal = CodeList(path_for_codelist('TipoIdFiscal-2.1.gc'), 'code', 'name') CodigoDescuento = CodeList(path_for_codelist('CodigoDescuento-2.1.gc'), 'code', 'name') +UnidadesMedida = CodeList(path_for_codelist('UnidadesMedida-2.1.gc'), 'code', 'name') diff --git a/facho/fe/form/__init__.py b/facho/fe/form/__init__.py index 56e8148..aa9ca61 100644 --- a/facho/fe/form/__init__.py +++ b/facho/fe/form/__init__.py @@ -113,8 +113,30 @@ class Amount: return round(self.amount, DECIMAL_PRECISION) -class Quantity(Amount): - pass +class Quantity: + + def __init__(self, val, code): + if not isinstance(val, int): + raise ValueError('val expected int') + if code not in codelist.UnidadesMedida: + raise ValueError("code [%s] not found" % (code)) + + self.value = val + self.code = code + + def __mul__(self, other): + if isinstance(other, Amount): + return Amount(self.value) * other + return self.value * other + + def __lt__(self, other): + if isinstance(other, Amount): + return Amount(self.value) < other + return self.value < other + + def __str__(self): + return str(self.value) + @dataclass class Item: diff --git a/facho/fe/form_xml/invoice.py b/facho/fe/form_xml/invoice.py index aed6697..f3f185b 100644 --- a/facho/fe/form_xml/invoice.py +++ b/facho/fe/form_xml/invoice.py @@ -523,7 +523,9 @@ class DIANInvoiceXML(fe.FeXML): line.set_element('./cac:Price/cbc:PriceAmount', invoice_line.price.amount, currencyID="COP") #DIAN 1.7.-2020: FBB04 - line.set_element('./cac:Price/cbc:BaseQuantity', invoice_line.price.amount) + line.set_element('./cac:Price/cbc:BaseQuantity', + invoice_line.quantity, + unitCode=invoice_line.quantity.code) def attach_invoice(fexml, invoice): diff --git a/tests/fixtures.py b/tests/fixtures.py index d4d1e2b..34501d7 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -129,7 +129,7 @@ def simple_invoice(): form.CountrySubentity('05', 'Antioquia')) )) inv.add_invoice_line(form.InvoiceLine( - quantity = form.Quantity(1), + quantity = form.Quantity(1, '94'), description = 'producto facho', item = form.StandardItem( 9999), price = form.Price(form.Amount(100.0), '01', ''), diff --git a/tests/test_fe_form.py b/tests/test_fe_form.py index b598ae0..d02f612 100644 --- a/tests/test_fe_form.py +++ b/tests/test_fe_form.py @@ -89,7 +89,7 @@ def test_invoice_totals(simple_invoice_without_lines): simple_invoice.invoice_supplier.ident = '700085371' simple_invoice.invoice_customer.ident = '800199436' simple_invoice.add_invoice_line(form.InvoiceLine( - quantity = form.Quantity(1), + quantity = form.Quantity(1, '94'), description = 'producto', item = form.StandardItem(9999), price = form.Price(form.Amount(1_500_000), '01', ''), @@ -112,7 +112,7 @@ def test_invoice_cufe(simple_invoice_without_lines): simple_invoice.invoice_supplier.ident = form.PartyIdentification('700085371', '5', '31') simple_invoice.invoice_customer.ident = form.PartyIdentification('800199436', '5', '31') simple_invoice.add_invoice_line(form.InvoiceLine( - quantity = form.Quantity(1), + quantity = form.Quantity(1, '94'), description = 'producto', item = form.StandardItem(111), price = form.Price(form.Amount(1_500_000), '01', ''), @@ -177,7 +177,7 @@ def test_credit_note_cude(simple_credit_note_without_lines): simple_invoice.invoice_supplier.ident = form.PartyIdentification('900373076', '5', '31') simple_invoice.invoice_customer.ident = form.PartyIdentification('8355990', '5', '31') simple_invoice.add_invoice_line(form.InvoiceLine( - quantity = form.Quantity(1), + quantity = form.Quantity(1, '94'), description = 'producto', item = form.StandardItem(111), price = form.Price(form.Amount(5_000), '01', ''), @@ -212,7 +212,7 @@ def test_debit_note_cude(simple_debit_note_without_lines): simple_invoice.invoice_supplier.ident = form.PartyIdentification('900197264', '5', '31') simple_invoice.invoice_customer.ident = form.PartyIdentification('10254102', '5', '31') simple_invoice.add_invoice_line(form.InvoiceLine( - quantity = form.Quantity(1), + quantity = form.Quantity(1, '94'), description = 'producto', item = form.StandardItem(111), price = form.Price(form.Amount(30_000), '01', ''), diff --git a/tests/test_form.py b/tests/test_form.py index 9d2d970..93d03c4 100644 --- a/tests/test_form.py +++ b/tests/test_form.py @@ -16,7 +16,7 @@ from facho import fe def test_invoice_legalmonetary(): inv = form.NationalSalesInvoice() inv.add_invoice_line(form.InvoiceLine( - quantity = form.Quantity(1), + quantity = form.Quantity(1, '94'), description = 'producto facho', item = form.StandardItem(9999), price = form.Price( @@ -42,7 +42,7 @@ def test_invoice_legalmonetary(): def test_FAU10(): inv = form.NationalSalesInvoice() inv.add_invoice_line(form.InvoiceLine( - quantity = form.Quantity(1), + quantity = form.Quantity(1, '94'), description = 'producto facho', item = form.StandardItem(9999), price = form.Price( @@ -70,7 +70,7 @@ def test_FAU10(): def test_FAU14(): inv = form.NationalSalesInvoice() inv.add_invoice_line(form.InvoiceLine( - quantity = form.Quantity(1), + quantity = form.Quantity(1, '94'), description = 'producto facho', item = form.StandardItem(9999), price = form.Price(