diff --git a/facho/fe/data/dian/codelist/SubTipoTrabajador-2.1.gc b/facho/fe/data/dian/codelist/SubTipoTrabajador-2.1.gc new file mode 100644 index 0000000..abf635a --- /dev/null +++ b/facho/fe/data/dian/codelist/SubTipoTrabajador-2.1.gc @@ -0,0 +1,44 @@ + + + + + SubTipoTrabajador + Sub tipos de trabajador + 1 + + + + Code + + + + Nombre + + + + CodeKey + + + + + + + 00 + + + No Aplica + + + + + 01 + + + Dependiente pensionado por vejez activo + + + + diff --git a/facho/fe/data/dian/codelist/TipoContrato-2.1.gc b/facho/fe/data/dian/codelist/TipoContrato-2.1.gc new file mode 100644 index 0000000..7af0bf0 --- /dev/null +++ b/facho/fe/data/dian/codelist/TipoContrato-2.1.gc @@ -0,0 +1,36 @@ + + + + + TipoContrato + Tipos de contratos + 1 + + + + Code + + + + Nombre + + + + CodeKey + + + + + + + 1 + + + Termino Fijo + + + + diff --git a/facho/fe/data/dian/codelist/TipoTrabajador-2.1.gc b/facho/fe/data/dian/codelist/TipoTrabajador-2.1.gc new file mode 100644 index 0000000..b07bd9c --- /dev/null +++ b/facho/fe/data/dian/codelist/TipoTrabajador-2.1.gc @@ -0,0 +1,36 @@ + + + + + TipoTrabajador + Tipos de trabajadores + 1 + + + + Code + + + + Nombre + + + + CodeKey + + + + + + + 01 + + + Dependiente + + + + diff --git a/facho/fe/data/dian/codelist/__init__.py b/facho/fe/data/dian/codelist/__init__.py index a474393..c997c08 100644 --- a/facho/fe/data/dian/codelist/__init__.py +++ b/facho/fe/data/dian/codelist/__init__.py @@ -12,9 +12,6 @@ class CodeList: self.short_name = '' self.long_name = '' self.version = 1 - self.canonical_uri = '' - self.canonical_version_uri = '' - self.location_uri = '' self.name_column = name_column self.rows = {} @@ -27,9 +24,6 @@ class CodeList: 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'): @@ -101,3 +95,6 @@ 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') +TipoTrabajador = CodeList(path_for_codelist('TipoTrabajador-2.1.gc'), 'code', 'name') +SubTipoTrabajador = CodeList(path_for_codelist('SubTipoTrabajador-2.1.gc'), 'code', 'name') +TipoContrato = CodeList(path_for_codelist('TipoContrato-2.1.gc'), 'code', 'name') diff --git a/facho/fe/nomina/__init__.py b/facho/fe/nomina/__init__.py index 8b952ee..d5d9ab3 100644 --- a/facho/fe/nomina/__init__.py +++ b/facho/fe/nomina/__init__.py @@ -10,6 +10,7 @@ import hashlib from .. import fe from .. import form +from ..data.dian import codelist from .devengado import * from .deduccion import * @@ -128,14 +129,116 @@ class Empleador: # NIE038 Direccion = self.direccion ) - + + +@dataclass +class TipoTrabajador: + code: str + name: str = '' + + def __post_init__(self): + if self.code not in codelist.TipoTrabajador: + raise ValueError("code [%s] not found" % (self.code)) + self.name = codelist.TipoTrabajador[self.code]['name'] + +@dataclass +class SubTipoTrabajador: + code: str + name: str = '' + + def __post_init__(self): + if self.code not in codelist.SubTipoTrabajador: + raise ValueError("code [%s] not found" % (self.code)) + self.name = codelist.SubTipoTrabajador[self.code]['name'] + +@dataclass +class TipoDocumento: + code: str + name: str = '' + + def __post_init__(self): + if self.code not in codelist.TipoIdFiscal: + raise ValueError("code [%s] not found" % (self.code)) + self.name = codelist.TipoIdFiscal[self.code]['name'] + +@dataclass +class TipoContrato: + code: str + name: str = '' + + def __post_init__(self): + if self.code not in codelist.TipoContrato: + raise ValueError("code [%s] not found" % (self.code)) + self.name = codelist.TipoContrato[self.code]['name'] + +@dataclass +class LugarTrabajo: + pais: Pais + departamento: Departamento + municipio: Municipio + direccion: str + @dataclass class Trabajador: + tipo_contrato: TipoContrato + tipo_documento: TipoDocumento numero_documento: str + primer_apellido: str + segundo_apellido: str + primer_nombre: str + + lugar_trabajo: LugarTrabajo + alto_riesgo: bool + salario_integral: bool + sueldo: Amount + + tipo: TipoTrabajador + + codigo_trabajador: str = None + otros_nombres: str = None + sub_tipo: SubTipoTrabajador = SubTipoTrabajador(code='00') + def apply(self, fragment): fragment.set_attributes('./Trabajador', - NumeroDocumento = self.numero_documento) + # NIE041 + TipoTrabajador = self.tipo.code, + # NIE042 + SubTipoTrabajador = self.sub_tipo.code, + # NIE043 + AltoRiesgoPension = str(self.alto_riesgo).lower(), + # NIE044 + TipoDocumento = self.tipo_documento.code, + # NIE045 + NumeroDocumento = self.numero_documento, + # NIE046 + PrimerApellido = self.primer_apellido, + # NIE047 + SegundoApellido = self.segundo_apellido, + # NIE048 + PrimerNombre = self.primer_nombre, + # NIE049 + OtrosNombres = self.otros_nombres, + # NIE050 + LugarTrabajoPais = self.lugar_trabajo.pais.code, + + # NIE051 + LugarTrabajoDepartamentoEstadoEstado = self.lugar_trabajo.departamento.code, + + # NIE052 + LugarTrabajoMunicipioCiudad = self.lugar_trabajo.municipio.code, + + # NIE053 + LugarTrabajoDireccion = self.lugar_trabajo.direccion, + # NIE056 + SalarioIntegral = str(self.salario_integral).lower(), + # NIE061 + TipoContrato = self.tipo_contrato.code, + # NIE062 + Sueldo = str(self.sueldo), + # NIE063 + CodigoTrabajador = self.codigo_trabajador + ) class DIANNominaXML: def __init__(self, tag_document): diff --git a/tests/test_nomina.py b/tests/test_nomina.py index 3d2f0d1..df5ff92 100644 --- a/tests/test_nomina.py +++ b/tests/test_nomina.py @@ -139,7 +139,28 @@ def test_nomina_cune(): )) nomina.asignar_trabajador(fe.nomina.Trabajador( - numero_documento = '800199436' + tipo_contrato = fe.nomina.TipoContrato( + code = '1' + ), + alto_riesgo = False, + tipo_documento = fe.nomina.TipoDocumento( + code = '11' + ), + primer_apellido = 'gnu', + segundo_apellido = 'emacs', + primer_nombre = 'facho', + lugar_trabajo = fe.nomina.LugarTrabajo( + pais = fe.nomina.Pais(code='CO'), + departamento = fe.nomina.Departamento(code='05'), + municipio = fe.nomina.Municipio(code='05001'), + direccion = 'calle facho' + ), + numero_documento = '800199436', + tipo = fe.nomina.TipoTrabajador( + code = '01' + ), + salario_integral = True, + sueldo = fe.nomina.Amount(1_500_000) )) nomina.adicionar_devengado(fe.nomina.DevengadoBasico(