From 33cc210ad4b3ac4ba30d37f69c00fa5bcf35bd5c Mon Sep 17 00:00:00 2001 From: "bit4bit@riseup.net" Date: Sat, 23 May 2020 20:18:02 +0000 Subject: [PATCH] facho/fe/form.py (DianResolucion0001Validator): centraliza la validacion de facturas FossilOrigin-Name: fa0f09a8340c2f8b6d6e11ca6d5c1ff430701b31676bb1024e45f66726b157a2 --- facho/fe/__init__.py | 2 +- facho/fe/form.py | 81 ++++++++++++++++++++----------------------- tests/test_fe_form.py | 12 +++++-- 3 files changed, 47 insertions(+), 48 deletions(-) diff --git a/facho/fe/__init__.py b/facho/fe/__init__.py index 7206887..cb73524 100644 --- a/facho/fe/__init__.py +++ b/facho/fe/__init__.py @@ -1,4 +1,4 @@ -from .fe import DianXMLExtensionSigner from .fe import FeXML from .fe import NAMESPACES +from .fe import DianXMLExtensionSigner from .fe import DianZIP diff --git a/facho/fe/form.py b/facho/fe/form.py index d3b04b9..9625f6f 100644 --- a/facho/fe/form.py +++ b/facho/fe/form.py @@ -10,26 +10,8 @@ from datetime import datetime from .data import dian from . import fe -class DataError(Exception): - - def __init__(self, errors): - self._errors = errors - - -class DataValidator: - - # valida y retorna errores [(key, error)..] - def validate(self) -> []: - raise NotImplementedError() - - def try_validate(self): - errors = self.validate() - if errors: - raise DataError(errors) - - @dataclass -class Party(DataValidator): +class Party: name: str ident: str responsability_code: str @@ -42,20 +24,6 @@ class Party(DataValidator): legal_company_ident: str = '' legal_address: str = '' - def validate(self): - errors = [] - try: - dian.TipoResponsabilidad[self.responsability_code] - except KeyError: - errors.append(('responsability_code', 'not found')) - - try: - dian.TipoOrganizacion[self.organization_code] - except KeyError: - errors.append(('organization_code', 'not found')) - - - return errors @dataclass @@ -117,7 +85,7 @@ class LegalMonetaryTotal: payable_amount: float = 0.0 -class Invoice(DataValidator): +class Invoice: def __init__(self): self.invoice_period_start = None self.invoice_period_end = None @@ -128,7 +96,6 @@ class Invoice(DataValidator): self.invoice_customer = None self.invoice_supplier = None self.invoice_lines = [] - self.errors = [] def set_period(self, startdate, enddate): self.invoice_period_start = startdate @@ -149,14 +116,11 @@ class Invoice(DataValidator): def add_invoice_line(self, line: InvoiceLine): self.invoice_lines.append(line) - def validate(self): - errors_customer = [('customer.%s' % (field), err) for field, err in self.invoice_customer.validate()] - errors_supplier = [('supplier.%s' % (field), err) for field, err in self.invoice_customer.validate()] - self.errors = errors_customer + errors_supplier - - def valid(self): - self.validate() - return not self.errors + def validate(self, validator): + validator.validate_customer(self.invoice_customer) + validator.validate_supplier(self.invoice_supplier) + for invline in self.invoice_lines: + validator.validate_invoice_line(self, invline) def _calculate_legal_monetary_total(self): for invline in self.invoice_lines: @@ -173,6 +137,36 @@ class Invoice(DataValidator): for invline in self.invoice_lines: invline.calculate() + +class DianResolucion0001Validator: + + def __init__(self): + self.errors = [] + + def _validate_party(self, party): + try: + dian.TipoResponsabilidad[party.responsability_code] + except KeyError: + self.errors.append(('responsability_code', 'not found')) + + try: + dian.TipoOrganizacion[party.organization_code] + except KeyError: + self.errors.append(('organization_code', 'not found')) + + def validate_customer(self, customer): + self._validate_party(customer) + + def validate_supplier(self, supplier): + self._validate_party(supplier) + + def validate_invoice_line(self, invoice, line): + pass + + def valid(self): + return not self.errors + + class DIANInvoiceXML(fe.FeXML): def __init__(self, invoice, TipoAmbiente = 'Pruebas'): @@ -184,7 +178,6 @@ class DIANInvoiceXML(fe.FeXML): en caso de fallar validacion retorna None""" fexml = self - invoice.try_validate() invoice.calculate() cufe = self._generate_cufe(invoice, TipoAmbiente) diff --git a/tests/test_fe_form.py b/tests/test_fe_form.py index 0fe4db9..b039b55 100644 --- a/tests/test_fe_form.py +++ b/tests/test_fe_form.py @@ -52,7 +52,9 @@ def simple_invoice(): def test_invoicesimple_build(simple_invoice): - assert simple_invoice.valid() == True + invoice_validator = form.DianResolucion0001Validator() + simple_invoice.validate(invoice_validator) + assert invoice_validator.valid() == True xml = form.DIANInvoiceXML(simple_invoice) supplier_name = xml.get_element_text('/fe:Invoice/fe:AccountingSupplierParty/fe:Party/cac:PartyName/cbc:Name') @@ -69,14 +71,18 @@ def test_invoicesimple_build(simple_invoice): def test_invoicesimple_build_with_cufe(simple_invoice): - assert simple_invoice.valid() == True + invoice_validator = form.DianResolucion0001Validator() + simple_invoice.validate(invoice_validator) + assert invoice_validator.valid() == True xml = form.DIANInvoiceXML(simple_invoice) cufe = xml.get_element_text('/fe:Invoice/cbc:UUID') assert cufe != '' def test_invoicesimple_xml_signed(simple_invoice): - assert simple_invoice.valid() == True + invoice_validator = form.DianResolucion0001Validator() + simple_invoice.validate(invoice_validator) + assert invoice_validator.valid() == True xml = form.DIANInvoiceXML(simple_invoice) signer = fe.DianXMLExtensionSigner('./tests/example.p12')