diff --git a/facho/fe/nomina/__init__.py b/facho/fe/nomina/__init__.py index 0617d2e..a4bccbb 100644 --- a/facho/fe/nomina/__init__.py +++ b/facho/fe/nomina/__init__.py @@ -14,6 +14,13 @@ from ..data.dian import codelist from .devengado import * from .deduccion import * +from .trabajador import * +from .empleador import * +from .pago import * + +from .pais import Pais +from .departamento import Departamento +from .municipio import Municipio from .amount import Amount from .exception import * @@ -96,184 +103,7 @@ class InformacionGeneral: CUNE = cune_hash ) -class Pais(form.Country): - pass -class Departamento(form.CountrySubentity): - pass - -class Municipio(form.City): - pass - -@dataclass -class Empleador: - nit: str - dv: str - pais: Pais - departamento: Departamento - municipio: Municipio - direccion: str - - def apply(self, fragment): - fragment.set_attributes('./Empleador', - # NIE033 - NIT = self.nit, - # NIE034 - DV = self.dv, - # NIE035 - Pais = self.pais.code, - # NIE036 - DepartamentoEstado = self.departamento.code, - # NIE037 - MunicipioCiudad = self.municipio.code, - # 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', - # 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 - ) - - - -@dataclass -class FormaPago: - code: str - name: str = '' - - def __post_init__(self): - if self.code not in codelist.FormasPago: - raise ValueError("code [%s] not found" % (self.code)) - self.name = codelist.FormasPago[self.code]['name'] - -@dataclass -class MetodoPago: - code: str - name: str = '' - - def __post_init__(self): - if self.code not in codelist.MediosPago: - raise ValueError("code [%s] not found" % (self.code)) - self.name = codelist.MediosPago[self.code]['name'] - -@dataclass -class Pago: - forma: FormaPago - metodo: MetodoPago - - def apply(self, fragment): - fragment.set_attributes('./Pago', - # NIE064 - Forma = self.forma.code, - # NIE065 - Metodo = self.metodo.code) - class DIANNominaXML: def __init__(self, tag_document): self.tag_document = tag_document diff --git a/facho/fe/nomina/departamento.py b/facho/fe/nomina/departamento.py new file mode 100644 index 0000000..a7b9f09 --- /dev/null +++ b/facho/fe/nomina/departamento.py @@ -0,0 +1,4 @@ +from .. import form + +class Departamento(form.CountrySubentity): + pass diff --git a/facho/fe/nomina/empleador/__init__.py b/facho/fe/nomina/empleador/__init__.py new file mode 100644 index 0000000..0b69261 --- /dev/null +++ b/facho/fe/nomina/empleador/__init__.py @@ -0,0 +1,32 @@ +from dataclasses import dataclass + +from ..pais import Pais +from ..departamento import Departamento +from ..municipio import Municipio + +@dataclass +class Empleador: + nit: str + dv: str + pais: Pais + departamento: Departamento + municipio: Municipio + direccion: str + + def apply(self, fragment): + fragment.set_attributes('./Empleador', + # NIE033 + NIT = self.nit, + # NIE034 + DV = self.dv, + # NIE035 + Pais = self.pais.code, + # NIE036 + DepartamentoEstado = self.departamento.code, + # NIE037 + MunicipioCiudad = self.municipio.code, + # NIE038 + Direccion = self.direccion + ) + + diff --git a/facho/fe/nomina/exception.py b/facho/fe/nomina/exception.py new file mode 100644 index 0000000..0e2c9ed --- /dev/null +++ b/facho/fe/nomina/exception.py @@ -0,0 +1,2 @@ +class DIANNominaIndividualError(Exception): + pass diff --git a/facho/fe/nomina/municipio.py b/facho/fe/nomina/municipio.py new file mode 100644 index 0000000..b70e05c --- /dev/null +++ b/facho/fe/nomina/municipio.py @@ -0,0 +1,5 @@ +from .. import form + +class Municipio(form.City): + pass + diff --git a/facho/fe/nomina/pago/__init__.py b/facho/fe/nomina/pago/__init__.py new file mode 100644 index 0000000..ca6cf5a --- /dev/null +++ b/facho/fe/nomina/pago/__init__.py @@ -0,0 +1,16 @@ +from dataclasses import dataclass + +from .forma_pago import FormaPago +from .metodo_pago import MetodoPago + +@dataclass +class Pago: + forma: FormaPago + metodo: MetodoPago + + def apply(self, fragment): + fragment.set_attributes('./Pago', + # NIE064 + Forma = self.forma.code, + # NIE065 + Metodo = self.metodo.code) diff --git a/facho/fe/nomina/pago/forma_pago.py b/facho/fe/nomina/pago/forma_pago.py new file mode 100644 index 0000000..5b612db --- /dev/null +++ b/facho/fe/nomina/pago/forma_pago.py @@ -0,0 +1,13 @@ +from dataclasses import dataclass + +from facho.fe.data.dian import codelist + +@dataclass +class FormaPago: + code: str + name: str = '' + + def __post_init__(self): + if self.code not in codelist.FormasPago: + raise ValueError("code [%s] not found" % (self.code)) + self.name = codelist.FormasPago[self.code]['name'] diff --git a/facho/fe/nomina/pago/metodo_pago.py b/facho/fe/nomina/pago/metodo_pago.py new file mode 100644 index 0000000..b25a938 --- /dev/null +++ b/facho/fe/nomina/pago/metodo_pago.py @@ -0,0 +1,14 @@ +from dataclasses import dataclass + +from facho.fe.data.dian import codelist + +@dataclass +class MetodoPago: + code: str + name: str = '' + + def __post_init__(self): + if self.code not in codelist.MediosPago: + raise ValueError("code [%s] not found" % (self.code)) + self.name = codelist.MediosPago[self.code]['name'] + diff --git a/facho/fe/nomina/pais.py b/facho/fe/nomina/pais.py new file mode 100644 index 0000000..a42a612 --- /dev/null +++ b/facho/fe/nomina/pais.py @@ -0,0 +1,4 @@ +from .. import form + +class Pais(form.Country): + pass diff --git a/facho/fe/nomina/trabajador/__init__.py b/facho/fe/nomina/trabajador/__init__.py new file mode 100644 index 0000000..5d6a046 --- /dev/null +++ b/facho/fe/nomina/trabajador/__init__.py @@ -0,0 +1,73 @@ +from dataclasses import dataclass + +from ..amount import Amount + +from .tipo_contrato import * +from .tipo_documento import * +from .lugar_trabajo import * +from .tipo_trabajador import * +from .sub_tipo_trabajador import * + + + +@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', + # 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 + ) diff --git a/facho/fe/nomina/trabajador/lugar_trabajo.py b/facho/fe/nomina/trabajador/lugar_trabajo.py new file mode 100644 index 0000000..58396d7 --- /dev/null +++ b/facho/fe/nomina/trabajador/lugar_trabajo.py @@ -0,0 +1,13 @@ +from dataclasses import dataclass + +from . import * +from ..pais import Pais +from ..departamento import Departamento +from ..municipio import Municipio + +@dataclass +class LugarTrabajo: + pais: Pais + departamento: Departamento + municipio: Municipio + direccion: str diff --git a/facho/fe/nomina/trabajador/sub_tipo_trabajador.py b/facho/fe/nomina/trabajador/sub_tipo_trabajador.py new file mode 100644 index 0000000..bdde174 --- /dev/null +++ b/facho/fe/nomina/trabajador/sub_tipo_trabajador.py @@ -0,0 +1,13 @@ +from dataclasses import dataclass + +from facho.fe.data.dian import codelist + +@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'] diff --git a/facho/fe/nomina/trabajador/tipo_contrato.py b/facho/fe/nomina/trabajador/tipo_contrato.py new file mode 100644 index 0000000..cc73d56 --- /dev/null +++ b/facho/fe/nomina/trabajador/tipo_contrato.py @@ -0,0 +1,15 @@ +from dataclasses import dataclass + +from facho.fe.data.dian import codelist + +@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'] + + diff --git a/facho/fe/nomina/trabajador/tipo_documento.py b/facho/fe/nomina/trabajador/tipo_documento.py new file mode 100644 index 0000000..6818e23 --- /dev/null +++ b/facho/fe/nomina/trabajador/tipo_documento.py @@ -0,0 +1,13 @@ +from dataclasses import dataclass + +from facho.fe.data.dian import codelist + +@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'] diff --git a/facho/fe/nomina/trabajador/tipo_trabajador.py b/facho/fe/nomina/trabajador/tipo_trabajador.py new file mode 100644 index 0000000..3bdb533 --- /dev/null +++ b/facho/fe/nomina/trabajador/tipo_trabajador.py @@ -0,0 +1,13 @@ +from dataclasses import dataclass + +from facho.fe.data.dian import codelist + +@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']