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(