From cb73e7c930f0605b6e85526ae2649ae0757e262d Mon Sep 17 00:00:00 2001 From: "bit4bit@riseup.net" Date: Sun, 31 May 2020 01:19:53 +0000 Subject: [PATCH] se mueven archivos .gc a directorio facho/fe/data/dian/codelist/ FossilOrigin-Name: dbd0c91c222b504d32a8728084a024ccd2b7f5204819a68bf26318d3e38e378c --- README.md | 5 +- facho/fe/data/dian/__init__.py | 62 +------------------ .../dian/{ => codelist}/AlgoritmoCUDE-2.1.gc | 0 .../dian/{ => codelist}/AlgoritmoCUFE-2.1.gc | 0 .../{ => codelist}/CodigoDescuento-2.1.gc | 0 .../data/dian/{ => codelist}/CodigoPostal1.gc | 0 .../CodigoPrecioReferencia-2.1.gc | 0 .../{ => codelist}/ConceptoNotaCredito-2.1.gc | 0 .../{ => codelist}/ConceptoNotaDebito-2.1.gc | 0 .../dian/{ => codelist}/Departamentos-2.1.gc | 0 .../{ => codelist}/EventoDocumento-2.1.gc | 0 .../dian/{ => codelist}/FormasPago-2.1.gc | 0 .../dian/{ => codelist}/LanguageCode-2.1.gc | 0 .../dian/{ => codelist}/MediosPago-2.1.gc | 0 .../data/dian/{ => codelist}/Municipio-2.1.gc | 0 .../fe/data/dian/{ => codelist}/Paises-2.1.gc | 0 .../{ => codelist}/TarifaImpuestoINC-2.1.gc | 0 .../{ => codelist}/TarifaImpuestoIVA-2.1.gc | 0 .../TarifaImpuestoReteFuente-2.1.gc | 0 .../TarifaImpuestoReteIVA-2.1.gc | 0 .../dian/{ => codelist}/TipoAmbiente-2.1.gc | 0 .../{ => codelist}/TipoCodigoProducto-2.1.gc | 0 .../dian/{ => codelist}/TipoDocumento-2.1.gc | 0 .../dian/{ => codelist}/TipoEntrega-2.1.gc | 0 .../dian/{ => codelist}/TipoIdFiscal-2.1.gc | 0 .../dian/{ => codelist}/TipoImpuesto-2.1.gc | 0 .../dian/{ => codelist}/TipoMoneda-2.1.gc | 0 .../dian/{ => codelist}/TipoOperacionF-2.1.gc | 0 .../{ => codelist}/TipoOperacionNC-2.1.gc | 0 .../TipoOperacionND-2.1 - copia.gc | 0 .../{ => codelist}/TipoOrganizacion-2.1.gc | 0 .../{ => codelist}/TipoResponsabilidad-2.1.gc | 0 .../data/dian/{ => codelist}/TiposEventos.gc | 0 .../dian/{ => codelist}/UnidadesMedida-2.1.gc | 0 facho/fe/data/dian/codelist/__init__.py | 61 ++++++++++++++++++ facho/fe/fe.py | 4 +- facho/fe/form.py | 6 +- tests/test_data.py | 10 +-- 38 files changed, 76 insertions(+), 72 deletions(-) rename facho/fe/data/dian/{ => codelist}/AlgoritmoCUDE-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/AlgoritmoCUFE-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/CodigoDescuento-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/CodigoPostal1.gc (100%) rename facho/fe/data/dian/{ => codelist}/CodigoPrecioReferencia-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/ConceptoNotaCredito-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/ConceptoNotaDebito-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/Departamentos-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/EventoDocumento-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/FormasPago-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/LanguageCode-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/MediosPago-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/Municipio-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/Paises-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/TarifaImpuestoINC-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/TarifaImpuestoIVA-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/TarifaImpuestoReteFuente-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/TarifaImpuestoReteIVA-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/TipoAmbiente-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/TipoCodigoProducto-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/TipoDocumento-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/TipoEntrega-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/TipoIdFiscal-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/TipoImpuesto-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/TipoMoneda-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/TipoOperacionF-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/TipoOperacionNC-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/TipoOperacionND-2.1 - copia.gc (100%) rename facho/fe/data/dian/{ => codelist}/TipoOrganizacion-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/TipoResponsabilidad-2.1.gc (100%) rename facho/fe/data/dian/{ => codelist}/TiposEventos.gc (100%) rename facho/fe/data/dian/{ => codelist}/UnidadesMedida-2.1.gc (100%) create mode 100644 facho/fe/data/dian/codelist/__init__.py diff --git a/README.md b/README.md index a806321..fdfe739 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ # facho -libreria facturacion electronica colombia \ No newline at end of file +libreria facturacion electronica colombia + +## COMENTARIOS + * http://facturasyrespuestas.com/2342/error-al-enviar-set-de-pruebas-usando-sendtestsetasync diff --git a/facho/fe/data/dian/__init__.py b/facho/fe/data/dian/__init__.py index da282ce..1824c19 100644 --- a/facho/fe/data/dian/__init__.py +++ b/facho/fe/data/dian/__init__.py @@ -1,61 +1 @@ -import os.path - -from lxml import etree - - -DATA_DIR = os.path.dirname(os.path.abspath(__file__)) - - -class CodeList: - - def __init__(self, filename, primary_column): - self.short_name = '' - self.long_name = '' - self.version = 1 - self.canonical_uri = '' - self.canonical_version_uri = '' - self.location_uri = '' - - self.rows = {} - self._load(filename, primary_column) - - def _load(self, filename, primary_column): - tree = etree.parse(filename) - - #obtener identificadores... - self.short_name = tree.find('./Identification/ShortName').text - self.long_name = tree.find('./Identification/LongName').text - self.version = tree.find('./Identification/Version').text - self.canonical_uri = tree.find('./Identification/CanonicalUri').text - self.canonical_version_uri = tree.find('./Identification/CanonicalVersionUri').text - self.location_uri = tree.find('./Identification/LocationUri').text - - #obtener registros... - for row in tree.findall('./SimpleCodeList/Row'): - new_row = self.xmlrow_to_dict(row) - primary_key = new_row[primary_column] - self.rows[primary_key] = new_row.copy() - - def xmlrow_to_dict(self, xmlrow): - row = {} - - #construir registro... - for value in xmlrow.getchildren(): - row[value.attrib['ColumnRef']] = value.getchildren()[0].text - - return row - - def __getitem__(self, key): - return self.rows[str(key)] - - -# nombres de variables igual a ./Identification/ShortName -# TODO: garantizar unica carga en python - -__all__ = ['TipoOrganizacion', - 'TipoResponsabilidad', - 'TipoAmbiente'] - -TipoOrganizacion = CodeList(os.path.join(DATA_DIR, 'TipoOrganizacion-2.1.gc'), 'name') -TipoResponsabilidad = CodeList(os.path.join(DATA_DIR, 'TipoResponsabilidad-2.1.gc'), 'name') -TipoAmbiente = CodeList(os.path.join(DATA_DIR, 'TipoAmbiente-2.1.gc'), 'name') +from .codelist import CodeList diff --git a/facho/fe/data/dian/AlgoritmoCUDE-2.1.gc b/facho/fe/data/dian/codelist/AlgoritmoCUDE-2.1.gc similarity index 100% rename from facho/fe/data/dian/AlgoritmoCUDE-2.1.gc rename to facho/fe/data/dian/codelist/AlgoritmoCUDE-2.1.gc diff --git a/facho/fe/data/dian/AlgoritmoCUFE-2.1.gc b/facho/fe/data/dian/codelist/AlgoritmoCUFE-2.1.gc similarity index 100% rename from facho/fe/data/dian/AlgoritmoCUFE-2.1.gc rename to facho/fe/data/dian/codelist/AlgoritmoCUFE-2.1.gc diff --git a/facho/fe/data/dian/CodigoDescuento-2.1.gc b/facho/fe/data/dian/codelist/CodigoDescuento-2.1.gc similarity index 100% rename from facho/fe/data/dian/CodigoDescuento-2.1.gc rename to facho/fe/data/dian/codelist/CodigoDescuento-2.1.gc diff --git a/facho/fe/data/dian/CodigoPostal1.gc b/facho/fe/data/dian/codelist/CodigoPostal1.gc similarity index 100% rename from facho/fe/data/dian/CodigoPostal1.gc rename to facho/fe/data/dian/codelist/CodigoPostal1.gc diff --git a/facho/fe/data/dian/CodigoPrecioReferencia-2.1.gc b/facho/fe/data/dian/codelist/CodigoPrecioReferencia-2.1.gc similarity index 100% rename from facho/fe/data/dian/CodigoPrecioReferencia-2.1.gc rename to facho/fe/data/dian/codelist/CodigoPrecioReferencia-2.1.gc diff --git a/facho/fe/data/dian/ConceptoNotaCredito-2.1.gc b/facho/fe/data/dian/codelist/ConceptoNotaCredito-2.1.gc similarity index 100% rename from facho/fe/data/dian/ConceptoNotaCredito-2.1.gc rename to facho/fe/data/dian/codelist/ConceptoNotaCredito-2.1.gc diff --git a/facho/fe/data/dian/ConceptoNotaDebito-2.1.gc b/facho/fe/data/dian/codelist/ConceptoNotaDebito-2.1.gc similarity index 100% rename from facho/fe/data/dian/ConceptoNotaDebito-2.1.gc rename to facho/fe/data/dian/codelist/ConceptoNotaDebito-2.1.gc diff --git a/facho/fe/data/dian/Departamentos-2.1.gc b/facho/fe/data/dian/codelist/Departamentos-2.1.gc similarity index 100% rename from facho/fe/data/dian/Departamentos-2.1.gc rename to facho/fe/data/dian/codelist/Departamentos-2.1.gc diff --git a/facho/fe/data/dian/EventoDocumento-2.1.gc b/facho/fe/data/dian/codelist/EventoDocumento-2.1.gc similarity index 100% rename from facho/fe/data/dian/EventoDocumento-2.1.gc rename to facho/fe/data/dian/codelist/EventoDocumento-2.1.gc diff --git a/facho/fe/data/dian/FormasPago-2.1.gc b/facho/fe/data/dian/codelist/FormasPago-2.1.gc similarity index 100% rename from facho/fe/data/dian/FormasPago-2.1.gc rename to facho/fe/data/dian/codelist/FormasPago-2.1.gc diff --git a/facho/fe/data/dian/LanguageCode-2.1.gc b/facho/fe/data/dian/codelist/LanguageCode-2.1.gc similarity index 100% rename from facho/fe/data/dian/LanguageCode-2.1.gc rename to facho/fe/data/dian/codelist/LanguageCode-2.1.gc diff --git a/facho/fe/data/dian/MediosPago-2.1.gc b/facho/fe/data/dian/codelist/MediosPago-2.1.gc similarity index 100% rename from facho/fe/data/dian/MediosPago-2.1.gc rename to facho/fe/data/dian/codelist/MediosPago-2.1.gc diff --git a/facho/fe/data/dian/Municipio-2.1.gc b/facho/fe/data/dian/codelist/Municipio-2.1.gc similarity index 100% rename from facho/fe/data/dian/Municipio-2.1.gc rename to facho/fe/data/dian/codelist/Municipio-2.1.gc diff --git a/facho/fe/data/dian/Paises-2.1.gc b/facho/fe/data/dian/codelist/Paises-2.1.gc similarity index 100% rename from facho/fe/data/dian/Paises-2.1.gc rename to facho/fe/data/dian/codelist/Paises-2.1.gc diff --git a/facho/fe/data/dian/TarifaImpuestoINC-2.1.gc b/facho/fe/data/dian/codelist/TarifaImpuestoINC-2.1.gc similarity index 100% rename from facho/fe/data/dian/TarifaImpuestoINC-2.1.gc rename to facho/fe/data/dian/codelist/TarifaImpuestoINC-2.1.gc diff --git a/facho/fe/data/dian/TarifaImpuestoIVA-2.1.gc b/facho/fe/data/dian/codelist/TarifaImpuestoIVA-2.1.gc similarity index 100% rename from facho/fe/data/dian/TarifaImpuestoIVA-2.1.gc rename to facho/fe/data/dian/codelist/TarifaImpuestoIVA-2.1.gc diff --git a/facho/fe/data/dian/TarifaImpuestoReteFuente-2.1.gc b/facho/fe/data/dian/codelist/TarifaImpuestoReteFuente-2.1.gc similarity index 100% rename from facho/fe/data/dian/TarifaImpuestoReteFuente-2.1.gc rename to facho/fe/data/dian/codelist/TarifaImpuestoReteFuente-2.1.gc diff --git a/facho/fe/data/dian/TarifaImpuestoReteIVA-2.1.gc b/facho/fe/data/dian/codelist/TarifaImpuestoReteIVA-2.1.gc similarity index 100% rename from facho/fe/data/dian/TarifaImpuestoReteIVA-2.1.gc rename to facho/fe/data/dian/codelist/TarifaImpuestoReteIVA-2.1.gc diff --git a/facho/fe/data/dian/TipoAmbiente-2.1.gc b/facho/fe/data/dian/codelist/TipoAmbiente-2.1.gc similarity index 100% rename from facho/fe/data/dian/TipoAmbiente-2.1.gc rename to facho/fe/data/dian/codelist/TipoAmbiente-2.1.gc diff --git a/facho/fe/data/dian/TipoCodigoProducto-2.1.gc b/facho/fe/data/dian/codelist/TipoCodigoProducto-2.1.gc similarity index 100% rename from facho/fe/data/dian/TipoCodigoProducto-2.1.gc rename to facho/fe/data/dian/codelist/TipoCodigoProducto-2.1.gc diff --git a/facho/fe/data/dian/TipoDocumento-2.1.gc b/facho/fe/data/dian/codelist/TipoDocumento-2.1.gc similarity index 100% rename from facho/fe/data/dian/TipoDocumento-2.1.gc rename to facho/fe/data/dian/codelist/TipoDocumento-2.1.gc diff --git a/facho/fe/data/dian/TipoEntrega-2.1.gc b/facho/fe/data/dian/codelist/TipoEntrega-2.1.gc similarity index 100% rename from facho/fe/data/dian/TipoEntrega-2.1.gc rename to facho/fe/data/dian/codelist/TipoEntrega-2.1.gc diff --git a/facho/fe/data/dian/TipoIdFiscal-2.1.gc b/facho/fe/data/dian/codelist/TipoIdFiscal-2.1.gc similarity index 100% rename from facho/fe/data/dian/TipoIdFiscal-2.1.gc rename to facho/fe/data/dian/codelist/TipoIdFiscal-2.1.gc diff --git a/facho/fe/data/dian/TipoImpuesto-2.1.gc b/facho/fe/data/dian/codelist/TipoImpuesto-2.1.gc similarity index 100% rename from facho/fe/data/dian/TipoImpuesto-2.1.gc rename to facho/fe/data/dian/codelist/TipoImpuesto-2.1.gc diff --git a/facho/fe/data/dian/TipoMoneda-2.1.gc b/facho/fe/data/dian/codelist/TipoMoneda-2.1.gc similarity index 100% rename from facho/fe/data/dian/TipoMoneda-2.1.gc rename to facho/fe/data/dian/codelist/TipoMoneda-2.1.gc diff --git a/facho/fe/data/dian/TipoOperacionF-2.1.gc b/facho/fe/data/dian/codelist/TipoOperacionF-2.1.gc similarity index 100% rename from facho/fe/data/dian/TipoOperacionF-2.1.gc rename to facho/fe/data/dian/codelist/TipoOperacionF-2.1.gc diff --git a/facho/fe/data/dian/TipoOperacionNC-2.1.gc b/facho/fe/data/dian/codelist/TipoOperacionNC-2.1.gc similarity index 100% rename from facho/fe/data/dian/TipoOperacionNC-2.1.gc rename to facho/fe/data/dian/codelist/TipoOperacionNC-2.1.gc diff --git a/facho/fe/data/dian/TipoOperacionND-2.1 - copia.gc b/facho/fe/data/dian/codelist/TipoOperacionND-2.1 - copia.gc similarity index 100% rename from facho/fe/data/dian/TipoOperacionND-2.1 - copia.gc rename to facho/fe/data/dian/codelist/TipoOperacionND-2.1 - copia.gc diff --git a/facho/fe/data/dian/TipoOrganizacion-2.1.gc b/facho/fe/data/dian/codelist/TipoOrganizacion-2.1.gc similarity index 100% rename from facho/fe/data/dian/TipoOrganizacion-2.1.gc rename to facho/fe/data/dian/codelist/TipoOrganizacion-2.1.gc diff --git a/facho/fe/data/dian/TipoResponsabilidad-2.1.gc b/facho/fe/data/dian/codelist/TipoResponsabilidad-2.1.gc similarity index 100% rename from facho/fe/data/dian/TipoResponsabilidad-2.1.gc rename to facho/fe/data/dian/codelist/TipoResponsabilidad-2.1.gc diff --git a/facho/fe/data/dian/TiposEventos.gc b/facho/fe/data/dian/codelist/TiposEventos.gc similarity index 100% rename from facho/fe/data/dian/TiposEventos.gc rename to facho/fe/data/dian/codelist/TiposEventos.gc diff --git a/facho/fe/data/dian/UnidadesMedida-2.1.gc b/facho/fe/data/dian/codelist/UnidadesMedida-2.1.gc similarity index 100% rename from facho/fe/data/dian/UnidadesMedida-2.1.gc rename to facho/fe/data/dian/codelist/UnidadesMedida-2.1.gc diff --git a/facho/fe/data/dian/codelist/__init__.py b/facho/fe/data/dian/codelist/__init__.py new file mode 100644 index 0000000..da282ce --- /dev/null +++ b/facho/fe/data/dian/codelist/__init__.py @@ -0,0 +1,61 @@ +import os.path + +from lxml import etree + + +DATA_DIR = os.path.dirname(os.path.abspath(__file__)) + + +class CodeList: + + def __init__(self, filename, primary_column): + self.short_name = '' + self.long_name = '' + self.version = 1 + self.canonical_uri = '' + self.canonical_version_uri = '' + self.location_uri = '' + + self.rows = {} + self._load(filename, primary_column) + + def _load(self, filename, primary_column): + tree = etree.parse(filename) + + #obtener identificadores... + self.short_name = tree.find('./Identification/ShortName').text + self.long_name = tree.find('./Identification/LongName').text + self.version = tree.find('./Identification/Version').text + self.canonical_uri = tree.find('./Identification/CanonicalUri').text + self.canonical_version_uri = tree.find('./Identification/CanonicalVersionUri').text + self.location_uri = tree.find('./Identification/LocationUri').text + + #obtener registros... + for row in tree.findall('./SimpleCodeList/Row'): + new_row = self.xmlrow_to_dict(row) + primary_key = new_row[primary_column] + self.rows[primary_key] = new_row.copy() + + def xmlrow_to_dict(self, xmlrow): + row = {} + + #construir registro... + for value in xmlrow.getchildren(): + row[value.attrib['ColumnRef']] = value.getchildren()[0].text + + return row + + def __getitem__(self, key): + return self.rows[str(key)] + + +# nombres de variables igual a ./Identification/ShortName +# TODO: garantizar unica carga en python + +__all__ = ['TipoOrganizacion', + 'TipoResponsabilidad', + 'TipoAmbiente'] + +TipoOrganizacion = CodeList(os.path.join(DATA_DIR, 'TipoOrganizacion-2.1.gc'), 'name') +TipoResponsabilidad = CodeList(os.path.join(DATA_DIR, 'TipoResponsabilidad-2.1.gc'), 'name') +TipoAmbiente = CodeList(os.path.join(DATA_DIR, 'TipoAmbiente-2.1.gc'), 'name') diff --git a/facho/fe/fe.py b/facho/fe/fe.py index 28a7ac2..308594d 100644 --- a/facho/fe/fe.py +++ b/facho/fe/fe.py @@ -10,7 +10,7 @@ import zipfile import warnings import hashlib from contextlib import contextmanager -from .data import dian +from .data.dian import codelist NAMESPACES = { 'fe': 'http://www.dian.gov.co/contratos/facturaelectronica/v1', @@ -50,7 +50,7 @@ class DianXMLExtensionCUFE(FachoXMLExtension): self.invoice = invoice def _tipo_ambiente(self): - return int(dian.TipoAmbiente[self.tipo_ambiente]['code']) + return int(codelist.TipoAmbiente[self.tipo_ambiente]['code']) def build(self, fachoxml): cufe = self._generate_cufe(self.invoice, fachoxml) diff --git a/facho/fe/form.py b/facho/fe/form.py index c00001c..4b06b47 100644 --- a/facho/fe/form.py +++ b/facho/fe/form.py @@ -7,7 +7,7 @@ import copy from dataclasses import dataclass from datetime import datetime -from .data import dian +from .data.dian import codelist from . import fe @dataclass @@ -146,12 +146,12 @@ class DianResolucion0001Validator: def _validate_party(self, party): try: - dian.TipoResponsabilidad[party.responsability_code] + codelist.TipoResponsabilidad[party.responsability_code] except KeyError: self.errors.append(('responsability_code', 'not found')) try: - dian.TipoOrganizacion[party.organization_code] + codelist.TipoOrganizacion[party.organization_code] except KeyError: self.errors.append(('organization_code', 'not found')) diff --git a/tests/test_data.py b/tests/test_data.py index 6395528..be0d3f0 100644 --- a/tests/test_data.py +++ b/tests/test_data.py @@ -6,11 +6,11 @@ """Tests for `facho` package.""" import pytest -import facho.fe.data.dian as dian +from facho.fe.data.dian import codelist def test_dian(): - assert dian.TipoResponsabilidad.short_name == 'TipoResponsabilidad' - assert dian.TipoResponsabilidad['Autorretenedor']['name'] == 'Autorretenedor' + assert codelist.TipoResponsabilidad.short_name == 'TipoResponsabilidad' + assert codelist.TipoResponsabilidad['Autorretenedor']['name'] == 'Autorretenedor' - assert dian.TipoOrganizacion.short_name == 'TipoOrganizacion' - assert dian.TipoOrganizacion['Persona Natural']['name'] == 'Persona Natural' + assert codelist.TipoOrganizacion.short_name == 'TipoOrganizacion' + assert codelist.TipoOrganizacion['Persona Natural']['name'] == 'Persona Natural'