diff --git a/facho/fe/data/dian/codelist/RegimenFiscal-2.1.custom.gc b/facho/fe/data/dian/codelist/RegimenFiscal-2.1.custom.gc new file mode 100644 index 0000000..d72d94a --- /dev/null +++ b/facho/fe/data/dian/codelist/RegimenFiscal-2.1.custom.gc @@ -0,0 +1,50 @@ + + + + + RegimenFiscal + Regimen Fiscal + 1 + urn:dian:names:especificacion:ubl:listacodigos:gc:RegimenFiscal + urn:dian:names:especificacion:ubl:listacodigos:gc:RegimenFiscal + http://dian.gov.co/ubl/os-ubl-2.0/cl/gc/default/RegimenFiscal.gc + + DIAN (Dirección de Impuestos y Aduanas Nacionales) + 195 + + + + + Code + Codigo Comun + + + + Name + Nombre + + + + CodeKey + + + + + + + 48 + + + responsable del impuesto sobre las ventas –IVA + + + + + 49 + + + No responsable de IVA + + + + diff --git a/facho/fe/data/dian/codelist/__init__.py b/facho/fe/data/dian/codelist/__init__.py index 4855a10..1d13d22 100644 --- a/facho/fe/data/dian/codelist/__init__.py +++ b/facho/fe/data/dian/codelist/__init__.py @@ -49,6 +49,8 @@ class CodeList: def __getitem__(self, key): return self.rows[str(key)] + def __contains__(self, key): + return key in self.rows def by_name(self, name): for k, v in self.rows.items(): @@ -69,7 +71,8 @@ __all__ = ['TipoOrganizacion', 'TipoAmbiente', 'TipoDocumento', 'CodigoPrecioReferencia', - 'MediosPago'] + 'MediosPago', + 'RegimenFiscal'] def path_for_codelist(name): return os.path.join(DATA_DIR, name) @@ -81,3 +84,4 @@ TipoAmbiente = CodeList(path_for_codelist('TipoAmbiente-2.1.gc'), 'code', 'name' TipoDocumento = CodeList(path_for_codelist('TipoDocumento-2.1.gc'), 'code', 'name') CodigoPrecioReferencia = CodeList(path_for_codelist('CodigoPrecioReferencia-2.1.gc'), 'code', 'name') MediosPago = CodeList(path_for_codelist('MediosPago-2.1.gc'), 'code', 'name') +RegimenFiscal = CodeList(path_for_codelist('RegimenFiscal-2.1.custom.gc'), 'code', 'name') diff --git a/facho/fe/form.py b/facho/fe/form.py index d2c312e..9a1d6fc 100644 --- a/facho/fe/form.py +++ b/facho/fe/form.py @@ -50,12 +50,27 @@ class PartyIdentification: def full(self): return "%s%s" % [self.number, self.dv] + +@dataclass +class Responsability: + codes: list + + def __str__(self): + return ';'.join(self.codes) + + def __eq__(self, other): + return str(self) == str(other) + + def __iter__(self): + return iter(self.codes) + @dataclass class Party: name: str ident: str responsability_code: str + responsability_regime_code: str organization_code: str phone: str = '' @@ -231,12 +246,11 @@ class DianResolucion0001Validator: self.errors = [] def _validate_party(self, model, party): - try: - codelist.TipoResponsabilidad[party.responsability_code] - except KeyError: - self.errors.append((model, - 'responsability_code', - 'not found %s' % (party.responsability_code))) + for code in party.responsability_code: + if code not in codelist.TipoResponsabilidad: + self.errors.append((model, + 'responsability_code', + 'not found %s' % (code))) try: codelist.TipoOrganizacion[party.organization_code] @@ -309,7 +323,10 @@ class DIANInvoiceXML(fe.FeXML): **supplier_company_id_attrs) fexml.set_element('/fe:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:TaxLevelCode', - invoice.invoice_supplier.responsability_code) + #DIAN 1.7.-2020: FAJ26 + invoice.invoice_supplier.responsability_code, + #DIAN 1.7.-2020: FAJ27 + listName=invoice.invoice_supplier.responsability_regime_code) fexml.placeholder_for('/fe:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cac:TaxScheme') fexml.set_element('/fe:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PartyLegalEntity/cbc:RegistrationName',