diff --git a/tabla_nomina/__init__.py b/tabla_nomina/__init__.py new file mode 100644 index 0000000..511a0ca --- /dev/null +++ b/tabla_nomina/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import controllers +from . import models \ No newline at end of file diff --git a/tabla_nomina/__manifest__.py b/tabla_nomina/__manifest__.py new file mode 100755 index 0000000..8a5057e --- /dev/null +++ b/tabla_nomina/__manifest__.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +{ + 'name': "tabla_nomina", + + 'summary': """ + Short (1 phrase/line) summary of the module's purpose, used as + subtitle on modules listing or apps.openerp.com""", + + 'description': """ + Long description of module's purpose + """, + + 'author': "My Company", + 'website': "http://www.yourcompany.com", + + # Categories can be used to filter modules in modules listing + # Check https://github.com/odoo/odoo/blob/14.0/odoo/addons/base/data/ir_module_category_data.xml + # for the full list + 'category': 'Uncategorized', + 'version': '0.1', + + # any module necessary for this one to work correctly + 'depends': ['base','om_hr_payroll'], + + # always loaded + 'data': [ + 'security/ir.model.access.csv', + 'data/data.xml', + 'views/views.xml', + 'views/templates.xml', + ], + # only loaded in demonstration mode + 'demo': [ + 'demo/demo.xml', + ], +} diff --git a/tabla_nomina/controllers/__init__.py b/tabla_nomina/controllers/__init__.py new file mode 100644 index 0000000..457bae2 --- /dev/null +++ b/tabla_nomina/controllers/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import controllers \ No newline at end of file diff --git a/tabla_nomina/controllers/controllers.py b/tabla_nomina/controllers/controllers.py new file mode 100644 index 0000000..a3edcf5 --- /dev/null +++ b/tabla_nomina/controllers/controllers.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# from odoo import http + + +# class TablaNomina(http.Controller): +# @http.route('/tabla_nomina/tabla_nomina/', auth='public') +# def index(self, **kw): +# return "Hello, world" + +# @http.route('/tabla_nomina/tabla_nomina/objects/', auth='public') +# def list(self, **kw): +# return http.request.render('tabla_nomina.listing', { +# 'root': '/tabla_nomina/tabla_nomina', +# 'objects': http.request.env['tabla_nomina.tabla_nomina'].search([]), +# }) + +# @http.route('/tabla_nomina/tabla_nomina/objects//', auth='public') +# def object(self, obj, **kw): +# return http.request.render('tabla_nomina.object', { +# 'object': obj +# }) diff --git a/tabla_nomina/data/data.xml b/tabla_nomina/data/data.xml new file mode 100755 index 0000000..4b7683a --- /dev/null +++ b/tabla_nomina/data/data.xml @@ -0,0 +1,1711 @@ + + + + 1 + Nómina electrónica + 1 + + + + FechaIngreso + Periodo + true + self.contract_id.date_start + Fecha de Ingreso del trabajador a la empresa (AAAA-MM-DD)* + + + + FechaLiquidacionInicio + Periodo + true + self.date_from + Fecha de inicio de Liquidación de Nómina (AAAA-MM-DD)* + + + + FechaLiquidacionFin + Periodo + true + self.date_to + Fecha fin de Liquidación de Nómina (AAAA-MM-DD)* + + + + FechaGen + Periodo + true + self.date_from + Fecha de emisión del documento (AAAA-MM-DD)* + + + + CodigoTrabajador: + Periodo + false + + Código del Trabajador + + + + Prefijo + Periodo + true + self.prefijo + Prefijo de la Nómina + + + + Consecutivo + Periodo + true + self.consecutivo + Consecutivo manejado por el Empleador + + + + Numero + Periodo + true + self.number + Prefijo y consecutivo manejado por el Empleador + + + + PaisGeneracion + lugargeneracion + true + self.paisgeneracion + Código del país donde se genera el documento (Ver tabla DOC.4.1) Nota: Se tomará el valor “Código alfa-2” de tabla mencionada + + + + DepartamentoEstado + lugargeneracion + true + self.departamentoestado + Código del departamento donde se genera el documento (Vertabla DOC.4.2) + + + + MunicipioCiudad + lugargeneracion + true + self.municipiociudad + Código del municipio o ciudad donde se genera el documento(Ver tabla DOC.4.3) + + + + Idioma + lugargeneracion + true + self.Idioma + Código del país donde se genera el documento (Ver tabla DOC.3.1) + + + + Version + informaciongeneral + true + self.version + Versión base de Schema XML usada para crear este perfil Nota: Que para este caso será “V1.0: Documento Soporte de Pago de Nómina Electrónica” + + + + Ambiente + informaciongeneral + true + self.ambiente + Tipo de Ambiente de Emisión del Documento (Ver tabla DOC.1.1) Nota: Demo o Producción + + + + TipoXML + informaciongeneral + true + self.tipoXML + Tipo de XML del Documento + + + + FechaGen + informaciongeneral + true + self.FechaGen + Fecha de emisión del documento (AAAA-MM-DD) + + + + HoraGen + informaciongeneral + true + self.HoraGen + Hora generacion del documento + + + + PeriodoNomina + informaciongeneral + true + self.PeriodoNomina + Corresponde al Código de Periodo de Nómina (Ver tabla NOM.1.1) + + + + TipoMoneda + informaciongeneral + true + self.TipoMoneda + Tipo de Moneda utilizada en el documento (Ver tabla DOC.3.2) + + + + + Notas + informaciongeneral + true + self.Notas + Notas dentro de la nomina + + + + RazonSocial + Empleador + true + self.RazonSocial + La razon social del empleador + + + + PrimerApellido + Empleador + false + self.PrimerApellido + Primer apellido del empleador + + + + SegundoApellido + Empleador + false + self.SegundoApellido + Segundo apellido del empleador + + + + PrimerNombre + Empleador + false + self.PrimerNombre + Primer apellido del empleador + + + + OtrosNombres + Empleador + false + self.OtrosNombres + Otros nombres del empleador + + + + NIT + Empleador + true + self.NIT + NIT del empleador + + + + DV + Empleador + true + self.DV + Digito de Verificacion del empleador + + + + Pais + Empleador + true + self.PaisEmpleador + Pais del Empleador + + + + MunicipioCiudad + Empleador + true + self.MunicipioCiudadEmpleador + Municipio Ciudad del Empleador + + + + DepartamentoEstado + Empleador + true + self.DepartamentoEstadoEmpleador + Departamento Estado del Empleador + + + + Direccion + Empleador + true + self.DireccionEmpleador + Direccion del Empleador + + + + FechaInicioLabores + Periodo + true + self.contract_id.date_start + Fecha inicio labores del empleador + + + + TipoTrabajador + Trabajador + true + self.contract_id.tipo_trabajador + Tipo Trabajador + + + + SubTipoTrabajador + Trabajador + true + self.contract_id.sub_tipo_trabajador + Sub Tipo trabajador + + + + AltoRiesgoPension + Trabajador + true + self.contract_id.AltoRiegoPension + Alto riesgo pension del trabajador + + + + TipoDocumento + Trabajador + true + self.employee_id.address_home_id.vat_type + Tipo documento del trabajador + + + + NumeroDocumento + Trabajador + true + self.employee_id.address_home_id.vat + Numero documento trabajador + + + + PrimerApellido + Trabajador + true + self.employee_id.address_home_id.last_name + Primer apellido trabajador + + + + SegundoApellido + Trabajador + false + + Segundo apellido trabajador + + + + PrimerNombre + Trabajador + false + self.employee_id.address_home_id.first_name + Primer nombre del trabajador + + + + OtrosNombres + Trabajador + false + self.employee_id.address_home_id.middle_name + OtrosNombres Trabajador + + + + LugarTrabajoPais + Trabajador + false + self.employee_id.address_home_id.country_id.code + Lugar Trabajo Pais + + + + LugarTrabajoMunicipioCiudad + Trabajador + true + self.employee_id.address_home_id.state_id.code + Lugar trabajo codigo DANE municipio ciudad + + + + LugarTrabajoDepartamentoEstado + Trabajador + true + self.employee_id.address_home_id.state_id.code[0:2] + Lugar Trabajo codigo DANE Departamento + + + + LugarTrabajoDireccion + Trabajador + true + self.employee_id.address_home_id.street + Lugar trabajo direccion + + + + SalarioIntegral + Trabajador + true + self.contract_id.SalarioIntegral + Si tiene o no salario Salario Integral + + + + TipoContrato + Trabajador + true + self.contract_id.tipo_contrato + El tipo del contrato del trabajador + + + + Sueldo + Trabajador + true + self.contract_id.wage + Sueldo del trabajador + + + + Forma + Pago + true + 1 + Forma de pago al trabajador + + + + Metodo + Pago + true + self.contract_id.metodo_pago + Metodo de pago al trabajador + + + + Banco + Pago + true + self.employee_id.bank_account_id.bank_id.name + Banco por el cual se hace el pago al trabajador + + + + TipoCuenta + Pago + true + self.contract_id.tipo_cuenta + Tipo cuenta del Banco + + + + NumeroCuenta + Pago + true + self.employee_id.bank_account_id.acc_number + Numero de la cuenta bancaria + + + + FechaPago + Pago + true + self.fecha_pago + Fecha en que se efectuo el pago + + + + Basico + BASIC + Devengado + true + + Sueldo basico del trabajador + + + + DiasTrabajados + true + WORK100 + Devengado + true + + Dias trabajados que tiene el trabajador + + + + + AuxilioTransporte + AuxilioTransporte + Devengado + true + + Auxilio transporte del trabajador + + + + ViaticoManuAlojS + ViaticoManuAlojS + Devengado + false + + Viaticos manutencion alojamientos salarial + + + + ViaticoManuAlojNS + ViaticoManuAlojNS + Devengado + false + + Viaticos manutencion alojamientos NO salarial + + + + CantidadHED + HED + false + false + true + Devengado + HED + false + + Cantidad de horas extras diurnas + + + + PorcentajeHED + HED + false + true + false + Devengado + HED + false + + Porcentaje segun la tabla 25% de horas extras diurnas + + + + PagoHED + HED + false + false + false + Devengado + HED + false + + Pago horas extras diurnas + + + + CantidadHEN + HEN + false + false + true + Devengado + HEN + false + + Cantidad horas extras nocturnas + + + + PorcentajeHEN + HEN + false + true + false + Devengado + HEN + false + + Porcentaje horas extras nocturnas + + + + PagoHEN + HEN + false + false + false + Devengado + HEN + false + + Pago de horas extras nocturnas + + + + CantidadHRN + HRN + false + false + true + Devengado + HRN + false + + Cantidad recargo hora extra nocturna + + + + PorcentajeHRN + HRN + false + true + false + Devengado + HRN + false + + Porcentaje recargo hora extra nocturna + + + + PagoHRN + HRN + false + false + false + Devengado + HRN + false + + Pago recargo hora extra nocturna + + + + CantidadHEDDF + HEDDF + false + false + true + Devengado + HEDDF + false + + Cantidad recargo hora extra diurna festiva + + + + PorcentajeHEDDF + HEDDF + false + true + false + Devengado + HEDDF + false + + Porcentaje recargo hora extra diurna festiva + + + + PagoHEDDF + HEDDF + false + false + false + Devengado + HEDDF + false + + Pago recargo hora extra diurna festiva + + + + CantidadHRDDF + HRDDF + false + false + true + Devengado + HRDDF + false + + Cantidad hora extra recargo diurna dominical festiva + + + + PorcentajeHRDDF + HRDDF + false + true + false + Devengado + HRDDF + false + + Porcentaje recargo hora extra recargo diurna festiva + + + + PagoHRDDF + HRDDF + false + false + false + Devengado + HRDDF + false + + Pago recargo hora extra recargo diurna festiva + + + + CantidadHENDF + HENDF + false + false + true + Devengado + HENDF + false + + Cantidad hora extra nocturna festiva dominical + + + + PorcentajeHENDF + HENDF + false + true + false + Devengado + HENDF + false + + Porcentaje hora extra nocturna festiva dominical + + + + PagoHENDF + HENDF + false + false + false + DevengadoHENDF + HENDF + false + + Pago hora extra nocturna festiva dominical + + + + CantidadHRNDF + HRNDF + false + false + true + Devengado + HRNDF + false + + Cantidad recargo hora extra nocturna festiva dominical + + + + PorcentajeHRNDF + HRNDF + false + true + false + Devengado + HRNDF + false + + Porcentaje recargo hora extra nocturna festiva dominical + + + + PagoHRNDF + HRNDF + false + false + false + Devengado + HRNDF + false + + Pago recargo hora extra nocturna festiva dominical + + + + CantidadVacacionesComunes + VacacionesComunes + true + false + false + Devengado + VacacionesComunes + false + + Cantidad de Dias Vacaciones Comunes + + + + PagoVacacionesComunes + VacacionesComunes + false + false + false + Devengado + VacacionesComunes + false + + Pago Vacaciones Comunes + + + + CantidadPrimas + Primas + true + false + false + Devengado + Primas + false + + Cantidad de Dias primas + + + + PagoPrimas + Primas + false + false + false + Devengado + Primas + false + + Pago de primas + + + + PagoNSPrimas + PrimasNS + false + false + false + Devengado + Primas + false + + Pago NO salarial primas + + + + PorcentajeCesantias + Cesantias + false + true + false + Devengado + Cesantias + false + + Porcentaje de Cesantias + + + + PagoCesantias + Cesantias + false + false + false + Devengado + Cesantias + false + + Pago de Cesantias + + + + PagoInteresesCesantias + InteresesCesantias + false + false + false + Devengado + Cesantias + false + + Pago intereses de Cesantias + + + + CantidadIncapacidad_comun + Incapacidad_comun + true + false + false + Devengado + Incapacidad_comun + false + + Cantidad de dias incapacidad comun + + + + + PagoIncapacidad_comun + Incapacidad_comun + false + false + false + Devengado + Incapacidad_comun + false + + Valor incapacidad comun + + + + CantidadIncapacidad_profesional + Incapacidad_profesional + true + false + false + Devengado + Incapacidad_profesional + false + + Cantidad de dias Incapacidad profesional + + + + + PagoIncapacidad_profesional + Incapacidad_profesional + false + false + false + Devengado + Incapacidad_profesional + false + + Valor de la incapacidad + + + + CantidadIncapacidad_laboral + Incapacidad_laboral + true + false + false + Devengado + Incapacidad_laboral + false + + Cantidad de dias Incapacidad laboral + + + + + PagoIncapacidad_laboral + Incapacidad_laboral + false + false + false + Devengado + Incapacidad_laboral + false + + Valor de incapacidad laboral + + + + CantidadLicenciaMP + LicenciaMP + true + false + false + Devengado + LicenciaMP + false + + Cantidad de dias licencia MP + + + + PagoLicenciaMP + LicenciaMP + false + false + false + Devengado + LicenciaMP + false + + Valor licencia MP + + + + CantidadLicenciaR + LicenciaR + true + false + false + Devengado + LicenciaR + false + + Cantidad de dias licencia REMUNERADA + + + + PagoLicenciaR + LicenciaR + false + false + false + Devengado + LicenciaR + false + + Valor licencia REMUNERADA + + + + CantidadLicenciaNR + LicenciaNR + true + false + false + Devengado + LicenciaNR + false + + Valor licencia NO REMUNERADA + + + + BonificacionS + false + false + false + BonificacionS + Devengado + false + + Bonificacion salarial + + + + BonificacionNS + BonificacionNS + false + false + false + Devengado + false + + Bonificacion NO salarial + + + + AuxilioS + AuxilioS + false + false + false + Devengado + false + + Auxilio Salarial + + + + AuxilioNS + AuxilioNS + false + false + false + Devengado + false + + Auxilio No Salarial + + + + HuelgaLegal + HuelgaLegal + false + false + false + Devengado + false + + Huelga legal Valor + + + + CompensacionO + CompensacionO + false + false + false + Devengado + false + + Compensacion O + + + + CompensacionE + CompensacionE + false + false + false + Devengado + false + + Compensacion E + + + + PagoSBonoEPCTV + PagoSBonoEPCTV + false + false + false + Devengado + BonoEPCTV + false + + Pago Salarial + + + + PagoNS + PagoNSBonoEPCTV + false + false + false + Devengado + BonoEPCTV + false + + Pago no salarial BonoEPCTV + + + + PagoAlimentacionS + PagoAlimentacionS + false + false + false + Devengado + false + + Pago Alimentacion Salarial + + + + PagoAlimentacionNS + PagoAlimentacionNS + false + false + false + Devengado + false + + Pago Alimentacion NO Salarial + + + + Comision + Comision + false + false + false + Devengado + false + + Valor Comision + + + + PagoTercero + PagoTercero + false + false + false + Devengado + false + + Pago a Tercero + + + + Anticipo + Anticipo + false + false + false + Devengado + false + + Anticipo + + + + Dotacion + Dotacion + false + false + false + Devengado + false + + Dotacion Valor + + + + ApoyoSost + ApoyoSost + false + false + false + Devengado + false + + Apoyo Sostenimiento + + + + Teletrabajo + Teletrabajo + false + false + false + Devengado + false + + Teletrabajo Pago + + + + BonifRetiro + BonifRetiro + false + false + false + Devengado + false + + Bonificacion Retirio + + + + Indemnizacion + Indemnizacion + false + false + false + Devengado + false + + Indemnizacion + + + + Reintegro + Reintegro + false + false + false + Devengado + false + + Reintegro + + + + PorcentajeSalud + SL + false + true + false + Deducciones + Salud + true + + Porcentaje deduccion Salud + + + + DeduccionSalud + SL + false + false + false + Deducciones + Salud + true + + Valor deduccion Salud + + + + PorcentajeFondoPension + PE + false + true + false + Deducciones + FondoPension + true + + Porcentaje deduccion fondo de pension + + + + DeduccionFondoPension + PE + false + false + false + Deducciones + FondoPension + true + + Valor deduccion fondo de pension + + + + + + PorcentajeFondoSP + FondoSP + false + true + false + Deducciones + FondoSP + false + + Porcentaje FondoSP + + + + DeduccionFondoSP + FondoSP + false + false + false + Deducciones + Salud + false + + Valor deduccion FondoSP + + + + PorcentajeSubFondoSP + SubFondoSP + false + true + false + Deducciones + FondoSP + false + + Porcentaje deduccion FondoSP sub + + + + DeduccionSubFondoSP + SubFondoSP + false + false + false + Deducciones + FondoPension + false + + Valor deduccion FondoSP sub + + + + + + PorcentajeSindicato + Sindicato + false + true + false + Deducciones + Sindicato + false + + Porcentaje Sindicato + + + + DeduccionSindicato + Sindicato + false + false + false + Deducciones + Sindicato + false + + Valor deduccion Sindicato + + + + SancionPublic + SancionPublic + false + false + false + Deducciones + SancionPublic + false + + Porcentaje deduccion SancionPublic + + + + SancionPriv + SancionPriv + false + false + false + Deducciones + SancionPriv + false + + Valor deduccion SancionPriv + + + + + DescripcionLibranza + Libranza + false + true + false + Deducciones + Libranza + false + + Porcentaje Libranza + + + + DeduccionLibranza + Libranza + false + false + false + Deducciones + Libranza + false + + Valor deduccion Libranza + + + + PagoTercero + PagoTercero + false + false + false + Deducciones + PagoTercero + false + + Porcentaje deduccion PagoTercero + + + + Anticipo + Anticipo + false + false + false + Deducciones + Anticipo + false + + Valor deduccion Anticipo + + + + + OtraDeduccion + OtraDeduccion + false + false + false + Deducciones + OtraDeduccion + false + + OtraDeduccion + + + + PensionVoluntaria + PensionVoluntaria + false + false + false + Deducciones + PensionVoluntaria + false + + Valor deduccion PensionVoluntaria + + + + RetencionFuente + RetencionFuente + false + false + false + Deducciones + RetencionFuente + false + + Porcentaje deduccion RetencionFuente + + + + AFC + AFC + false + false + false + Deducciones + AFC + false + + Valor deduccion AFC + + + + + Cooperativa + Cooperativa + false + false + false + Deducciones + Cooperativa + false + + Cooperativa + + + + EmbargoFiscal + EmbargoFiscal + false + false + false + Deducciones + EmbargoFiscal + false + + Valor deduccion EmbargoFiscal + + + + PlanComplementarios + PlanComplementarios + false + false + false + Deducciones + PlanComplementarios + false + + Porcentaje deduccion PlanComplementarios + + + + Educacion + Educacion + false + false + false + Deducciones + Educacion + false + + Valor deduccion Educacion + + + + + Reintegro + Reintegro + false + false + false + Deducciones + Reintegro + false + + Porcentaje deduccion Reintegro + + + + Deuda + Deuda + false + false + false + Deducciones + Deuda + false + + Valor deduccion Deuda + + + + + id_plataforma + + false + false + false + Deducciones + Reintegro + false + self.id_plataforma + Id de la plataforma facturatech + + + + password + + false + false + false + Deducciones + Deuda + false + self.password + Password de la plataforma facturatech + + + + + DevengadosTotal + GROSS + false + false + false + Devengado + true + + Sumatoria total devengados + + + + DeduccionesTotal + DED + false + false + false + Deducciones + true + + Valor total deducciones + + + + ComprobanteTotal + NET + false + false + false + Deducciones + FondoPension + true + + Valor deduccion fondo de pension + + + + + + diff --git a/tabla_nomina/demo/demo.xml b/tabla_nomina/demo/demo.xml new file mode 100644 index 0000000..ad95fdf --- /dev/null +++ b/tabla_nomina/demo/demo.xml @@ -0,0 +1,30 @@ + + + + + \ No newline at end of file diff --git a/tabla_nomina/models/__init__.py b/tabla_nomina/models/__init__.py new file mode 100644 index 0000000..5305644 --- /dev/null +++ b/tabla_nomina/models/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import models \ No newline at end of file diff --git a/tabla_nomina/models/models.py b/tabla_nomina/models/models.py new file mode 100755 index 0000000..c9239c8 --- /dev/null +++ b/tabla_nomina/models/models.py @@ -0,0 +1,536 @@ +# -*- coding: utf-8 -*- + +from odoo import models, fields, modules, api,_ +import os +import requests +import json +from odoo.exceptions import AccessError, UserError, RedirectWarning, ValidationError, Warning +from datetime import datetime, timedelta +from datetime import time as datetime_time + +class tabla_nomina(models.Model): + _name = 'tabla_nomina.tabla_nomina' + _description = 'tabla_nomina.tabla_nomina' + # _inherit = 'mail.message' + + name = fields.Char('Nombre') + fecha_pago = fields.Date("Fecha de Pago") + xml = fields.Text("XML") + transaccionID = fields.Char("transaccionID") + impreso = fields.Boolean("Impreso") + prefijo = fields.Char("Prefijo") + consecutivo = fields.Char("consecutivo") + paisgeneracion = fields.Char("Pais de generacion") + departamentoestado = fields.Char("Departamento") + municipiociudad = fields.Char("Ciudad") + Idioma = fields.Char("Idioma",default="es") + + version = fields.Char("Version",default="") + ambiente = fields.Selection([ + ('1', 'Produccion'), + ('2', 'Pruebas'), + ], string='Ambiente',default="1") + tipoXML = fields.Char("Tipo XML",default="102") + Algoritmo = fields.Char("Algoritmo",default="CUNE-384") + PeriodoNomina = fields.Selection([ + ('1', 'Semanal'), + ('2', 'Decenal'), + ('3', 'Catorcenal'), + ('4', 'Quincenal'), + ('5', 'Mensual'), + ], string='Periodo Nomina') + TipoMoneda = fields.Char('TipoMoneda', default="COP") + ##EMPLEADOR + RazonSocial = fields.Char('RazonSocial') + PrimerApellido = fields.Char('PrimerApellido') + SegundoApellido = fields.Char('SegundoApellido') + PrimerNombre = fields.Char('PrimerNombre') + OtrosNombres = fields.Char('OtrosNombres') + NIT = fields.Char('NIT') + DV = fields.Char('DV') + PaisEmpleador = fields.Char('Pais') + MunicipioCiudadEmpleador = fields.Char('MunicipioCiudad') + DepartamentoEstadoEmpleador = fields.Char('DepartamentoEstado') + DireccionEmpleador = fields.Char('Direccion') + + tipocontrato = fields.Selection([ + ('1', 'Termino Fijo'), + ('2', 'Termino Indefinido'), + ('3', 'Obra o Labor'), + ('4', 'Aprendizaje'), + ('5', 'Practicas'), + ], string='Tipo de contrato') + + id_plataforma = fields.Char('id_plataforma') + password = fields.Char('password') + + mp_id = fields.One2many('tabla_nomina.line','mp_id', ondelete='cascade') + + +class line_nomina(models.Model): + _name = 'tabla_nomina.line' + _description = 'tabla_nomina.line' + + name = fields.Char('Nombre') + categoria = fields.Char('Categoria') + codigo = fields.Char('Codigo') + dias = fields.Boolean('Son dias?') + horas = fields.Boolean('Son horas?') + porcentaje = fields.Boolean('Es porcentaje?') + subcategoria = fields.Char('Sub Categoria') + obligatorio = fields.Boolean('Obligatorio') + detalle = fields.Char('Detalle') + mensaje = fields.Char('Mensaje') + campo_tecnico = fields.Char('Campo tecnico') + titulo = fields.Char('Titulo') + link = fields.Char('Link') + + mp_id = fields.Many2one('tabla_nomina.tabla_nomina', string='Campos',ondelete='restrict', index=True) + + +class nomina_input_lines(models.Model): + _name = 'hr.salary.rule' + _inherit = 'hr.salary.rule' + + porcentaje = fields.Integer("Porcentaje") + + +class nomina_electronica(models.Model): + _name = 'hr.payslip' + _inherit = 'hr.payslip' + + + fecha_pago = fields.Date("Fecha de Pago") + xml = fields.Text("XML") + transaccionID = fields.Char("transaccionID") + estado = fields.Selection([ + ('No_generada', 'No_generada'), + ('Generada_correctamente', 'Generada_correctamente'), + ('Generada_con_errores', 'Generada_con_errores'), + ], string='Estado',default="No_generada") + prefijo = fields.Char("Prefijo") + consecutivo = fields.Char("consecutivo") + paisgeneracion = fields.Char("Pais de generacion") + departamentoestado = fields.Char("Departamento") + municipiociudad = fields.Char("Ciudad") + Idioma = fields.Char("Idioma",default="es") + + version = fields.Char("Version",default="") + ambiente = fields.Selection([ + ('1', 'Produccion'), + ('2', 'Pruebas'), + ], string='Ambiente',default="1") + tipoXML = fields.Char("Tipo XML",default="102") + Algoritmo = fields.Char("Algoritmo",default="CUNE-384") + PeriodoNomina = fields.Selection([ + ('1', 'Semanal'), + ('2', 'Decenal'), + ('3', 'Catorcenal'), + ('4', 'Quincenal'), + ('5', 'Mensual'), + ], string='Periodo Nomina') + TipoMoneda = fields.Char('TipoMoneda', default="COP") + Notas = fields.Char('Notas') + ##EMPLEADOR + RazonSocial = fields.Char('RazonSocial') + PrimerApellido = fields.Char('PrimerApellido') + SegundoApellido = fields.Char('SegundoApellido') + PrimerNombre = fields.Char('PrimerNombre') + OtrosNombres = fields.Char('OtrosNombres') + NIT = fields.Char('NIT') + DV = fields.Char('DV') + PaisEmpleador = fields.Char('Pais') + MunicipioCiudadEmpleador = fields.Char('MunicipioCiudad') + DepartamentoEstadoEmpleador = fields.Char('DepartamentoEstado') + DireccionEmpleador = fields.Char('Direccion') + + tipocontrato = fields.Selection([ + ('1', 'Termino Fijo'), + ('2', 'Termino Indefinido'), + ('3', 'Obra o Labor'), + ('4', 'Aprendizaje'), + ('5', 'Practicas'), + ], string='Tipo de contrato') + + FechaGen = fields.Char('Fecha Generacion') + HoraGen = fields.Char('Hora Generacion') + id_plataforma = fields.Char('id_plataforma') + password = fields.Char('password') + # PeriodoNomina = fields.Char('Periodo Nomina') + # TipoMoneda = fields.Char('TipoMoneda', default="COP") + + # Notas = fields.Char('Notas') + + @api.onchange('employee_id') + def on_change_employee(self): + for record in self: + valores = self.env['tabla_nomina.tabla_nomina'].search([('name', '=', 'Nómina electrónica')]) + if valores: + self.prefijo = valores.prefijo + self.consecutivo = valores.consecutivo + self.paisgeneracion = valores.paisgeneracion + self.departamentoestado = valores.departamentoestado + self.municipiociudad = valores.municipiociudad + self.Idioma = valores.Idioma + self.ambiente = valores.ambiente + self.tipoXML = valores.tipoXML + self.PeriodoNomina = valores.PeriodoNomina + ##Empleador + self.RazonSocial = valores.RazonSocial + self.PrimerApellido = valores.PrimerApellido + self.SegundoApellido = valores.SegundoApellido + self.PrimerNombre = valores.PrimerNombre + self.OtrosNombres = valores.OtrosNombres + self.NIT = valores.NIT + self.DV = valores.DV + self.PaisEmpleador = valores.PaisEmpleador + self.MunicipioCiudadEmpleador = valores.MunicipioCiudadEmpleador + self.DepartamentoEstadoEmpleador = valores.DepartamentoEstadoEmpleador + self.DireccionEmpleador = valores.DireccionEmpleador + self.id_plataforma = valores.id_plataforma + self.password = valores.password + + + def action_cfdi_generate(self): + urlini = "https://odoo15.navegasoft.com/admonclientes/status/" + headers = {'content-type': 'application/json'} + send = {"id_plataforma":self.id_plataforma,"transaccionID":self.transaccionID,"prefix":self.prefijo,"number":self.consecutivo} + result = requests.post(urlini,headers=headers,data = json.dumps(send)) + + #resultado = json.loads(result.text) + #print(result.text) + if result.status_code == 200: + resultado = json.loads(result.text) + if "documentBase64" in resultado: + final = resultado["documentBase64"] + return self.env['wk.wizard.message'].genrated_message('Documento impreso', 'listos') + else: + if "error" in resultado: + final = resultado["error"] + final_error = json.loads(json.dumps(final)) + data = final_error["data"] + data_final = data['message'] + final_data = json.loads(json.dumps(data_final)) + archivo = final_data['code'] + return self.env['wk.wizard.message'].genrated_message(data_final,"Los datos no estan correctos" ,"https://navegasoft.com") + else: + final = json.loads(json.dumps(resultado)) + final2 = final['result'] + final_data = json.loads(json.dumps(eval(final2))) + #archivo = final_data['code'] + module_path = modules.get_module_path('tabla_nomina') + model = "facturas" + if '\\' in module_path: + src_path = '\\static\\' + src_model_path = "{0}{1}\\".format('\\static', model) + else: + src_path = '/static/' + src_model_path = "{0}{1}/".format('/static/', model) + + # if "model" folder does not exists create it + os.chdir("{0}{1}".format(module_path, src_path)) + if not os.path.exists(model): + os.makedirs(model) + extension = ".pdf" + #file_path = "{0}{1}".format(module_path + src_model_path + str(name), extension) + file_path = "{0}{1}".format(module_path + src_model_path + str(self.number), extension) + if not (os.path.exists(file_path)): + size =1 + if size == 0: + os.remove(file_path) + raise UserError(_('imprimible se esta preparando intenta de nuevo, Factura preparandose.')) + else: + import base64 + image_64_encode = base64.b64decode(final_data['documentBase64']) + i64 = base64.b64encode(image_64_encode) + att_id = self.env['ir.attachment'].create({ + 'name': self.number+extension, + 'type': 'binary', + 'datas': i64, + 'datas_fname': self.number+extension, + 'res_model': 'hr.payslip', + 'res_id': self.id, + }) + if att_id: + self.write({"impreso":True}) + return self.env['wk.wizard.message'].genrated_message("Ve a attachment","Factura impresa" ,"https://navegasoft.com") + else: + raise UserError(_('Ve a attachment, Factura ya impresa.')) + + final = resultado["error"] + final_error = json.loads(json.dumps(final)) + data = final_error["data"] + data_final = data['message'] + + + + else: + raise Warning(result) + + + + + def envio_directo(self): + import time + now2 = datetime.now() + current_time = now2.strftime("%H:%M:%S") + numeracion = self.env['ir.sequence'].sudo().search([('code', '=', 'salary.slip')]) + lon_prefix = len(numeracion.prefix) + long_total = len(self.number) + number = self.number[lon_prefix:long_total] + + self.prefijo = numeracion.prefix + self.consecutivo = number + + self.FechaGen = str(now2.date()) + self.HoraGen = str(current_time) + urlini = "https://odoo15.navegasoft.com/admonclientes/objects/" + valores = self.env['tabla_nomina.tabla_nomina'].search([('name', '=', 'Nómina electrónica')]) + response2={} + valores_lineas = valores.mp_id + send = {} + for linea in valores_lineas: + if linea.codigo: + if linea.dias == True: + for lineacomprobante in self.worked_days_line_ids: + if linea.codigo == lineacomprobante.code: + if lineacomprobante.number_of_days > 0.0: + send[linea.name] = lineacomprobante.number_of_days + elif linea.horas == True: + for lineacomprobante in self.worked_days_line_ids: + if linea.codigo == lineacomprobante.code: + if lineacomprobante.number_of_hours > 0.0: + send[linea.name] = lineacomprobante.number_of_hours + elif linea.porcentaje == True: + reglas = self.env['hr.salary.rule'].search([('code','=',linea.codigo)]) + for regla in reglas: + if regla.porcentaje: + send[linea.name] = regla.porcentaje + else: + for lineacomprobante in self.line_ids: + if linea.codigo == lineacomprobante.code: + if lineacomprobante.amount != 0.00: + send[linea.name] = lineacomprobante.amount + elif linea.campo_tecnico: + #buscar en el comprobante el codigo + try: + if eval(linea.campo_tecnico): + send[linea.name] = eval(linea.campo_tecnico) + except SyntaxError: + return self.env['wk.wizard.message'].genrated_message("El campo tecnico no existe"+linea.campo_tecnico,"Error en el campo"+linea.name,"https://navegasoft.com") + #pass + # if linea.name == "DepartamentoEstado": + # print(linea.name) + # print(linea.campo_tecnico) + # print(eval(linea.campo_tecnico)) + # else: + # send[linea.name] = None + headers = {'content-type': 'application/json'} + result = requests.post(urlini,headers=headers,data = json.dumps(send)) + if result.status_code == 200: + resultado = json.loads(result.text) + if "result" in resultado: + final = resultado["result"] + if "error" in final: + final_error = json.loads(final) + final_text = final_error['error'] + return self.env['wk.wizard.message'].genrated_message("2 "+final_text['mensaje'], final_text['titulo'],final_text['link']) + else: + return self.env['wk.wizard.message'].genrated_message('3 No hemos recibido una respuesta satisfactoria vuelve a enviarlo', 'Reenviar') + else: + if "error" in resultado: + final = resultado["error"] + final_error = json.loads(json.dumps(final)) + data = final_error["data"] + data_final = data['message'] + self.write({"impreso":False,"transactionID":self.transaccionID,"estado":"Generada_correctamente"}) + return self.env['wk.wizard.message'].genrated_message("1 "+data_final,"Los datos no estan correctos" ,"https://navegasoft.com") + else: + raise Warning(result) + return self.env['wk.wizard.message'].genrated_message('Existen problemas de coneccion debes reportarlo con navegasoft', 'Servidor') + + + + +class nomina_hr_contract(models.Model): + _name = 'hr.contract' + _inherit = 'hr.contract' + + tipo_contrato = fields.Selection([ + ('1', 'Término Fijo'), + ('2', 'Término Indefinido'), + ('3', 'Obra o Labor'), + ('4', 'Aprendizaje'), + ('5', 'Practicas'), + ], string='Tipo Contrato') + + tipo_trabajador = fields.Selection([ + ('1', 'Dependiente'), + ('2', 'Servicio domestico'), + ('3', 'Independiente'), + ('4', 'Madre comunitaria'), + ('12', 'Aprendices del Sena en etapa lectiva'), + ('16', 'Independiente agremiado o asociado'), + ('18', 'Funcionarios públicos sin tope máximo de ibc'), + ('19', 'Aprendices del SENA en etapa productiva'), + ('20', 'Estudiantes (régimen especial ley 789 de 2002)'), + ('21', 'Estudiantes de postgrado en salud'), + ('22', 'Profesor de establecimiento particular'), + ('23', 'Estudiantes aportes solo riesgos laborales'), + ('30', 'Dependiente entidades o universidades públicas con régimen especial en salud'), + ('31', 'Cooperados o pre cooperativas de trabajo asociado'), + ('32', 'Cotizante miembro de la carrera diplomática o consular de un país extranjero o funcionario de organismo multilateral'), + ('33', 'Beneficiario del fondo de solidaridad pensional'), + ('34', 'Concejal municipal o distrital o edil de junta administrativa local que percibe honorarios amparado por póliza de salud'), + ('35', 'Concejal municipal o distrital que percibe honorarios no amparado con póliza de salud'), + ('36', 'Concejal municipal o distrital que percibe honorarios no amparado con póliza de salud beneficiario del fondo de solidaridad pensional'), + ('40', 'Beneficiario upc adicional'), + ('41', 'Beneficiario sin ingresos con pago por tercero'), + ('42', 'Cotizante pago solo salud articulo 2 ley 1250 de 2008 (independientes de bajos ingresos)'), + ('43', 'Cotizante voluntario a pensiones con pago por tercero'), + ('44', 'Cotizante dependiente de empleo de emergencia con duración mayor o igual a un mes'), + ('45', 'Cotizante dependiente de empleo de emergencia con duración menor a un mes'), + ('47', 'Trabajador dependiente de entidad beneficiaria del sistema general de participaciones - aportes patronales'), + ('51', 'Trabajador de tiempo parcial'), + ('52', 'Beneficiario del mecanismo de protección al cesante'), + ('53', 'Afiliado participe'), + ('54', 'Pre pensionado de entidad en liquidación.'), + ('55', 'Afiliado participe - dependiente'), + ('56', 'Pre pensionado con aporte voluntario a salud'), + ('57', 'Independiente voluntario al sistema de riesgos laborales'), + ('58', 'Estudiantes de prácticas laborales en el sector público'), + ('59', 'Independiente con contrato de prestación de servicios superior a 1 mes'), + ('61', 'Beneficiario programa de reincorporación'), + ], string='Tipo Trabajador') + sub_tipo_trabajador = fields.Selection([ + ('00', 'No Aplica'), + ('1', 'Dependiente pensionado por vejez activo'), + ('2', 'Independiente pensionado por vejez activo'), + ('3', 'Cotizante no obligado a cotizar a pensión por edad'), + ('4', 'Cotizante con requisitos cumplidos para pensión'), + ('12', 'Cotizante a quien se le ha reconocido indemnización sustitutiva o devolución de saldos'), + ('16', 'Cotizante perteneciente a un régimen de exceptuado de pensiones a entidades autorizadas para recibir aportes exclusivamente de un grupo de sus propios'), + ('18', 'Cotizante pensionado con mesada superior a 25 smlmv'), + ('19', 'Residente en el exterior afiliado voluntario al sistema general de pensiones y/o afiliado'), + ('20', 'Conductores del servicio público de transporte terrestre automotor individual de pasajeros en vehículos taxi decreto 1047 de 2014'), + ('21', 'Conductores servicio taxi no aporte pensión dec. 1047'), + ], string='Subtipo de Trabajador') + AltoRiegoPension = fields.Selection([ + ('NO', 'NO'), + ('SI', 'SI'), + ], string='Alto Riego Pension',default='NO') + SalarioIntegral = fields.Selection([ + ('NO', 'NO'), + ('SI', 'SI'), + ], string='Salario Integral',default='NO') + banco = fields.Char("Banco") + tipo_cuenta = fields.Char("Tipo cuenta") + numero_cuenta = fields.Char("Numero de cuenta") + metodo_pago = fields.Selection([ + ('1', 'Instrumento no definido'), + ('2', 'Crédito ACH'), + ('3', 'Débito ACH'), + ('4', 'Reversión débito de demanda ACH'), + ('5', 'Reversión crédito de demanda ACH'), + ('6', 'Crédito de demanda ACH'), + ('7', 'Débito de demanda ACH'), + ('8', 'Mantener'), + ('9', 'Clearing Nacional o Regional'), + ('10', 'Efectivo'), + ('11', 'Reversión Crédito Ahorro'), + ('12', 'Reversión Débito Ahorro'), + ('13', 'Crédito Ahorro'), + ('14', 'Débito Ahorro'), + ('15', 'Bookentry Crédito'), + ('16', 'Bookentry Débito'), + ('17', 'Concentración de la demanda en efectivo Desembolso Crédito (CCD)'), + ('18', 'Concentración de la demanda en efectivo Desembolso (CCD) débito'), + ('19', 'Crédito Pago negocio corporativo (CTP)'), + ('20', 'Cheque'), + ('21', 'Proyecto bancario'), + ('22', 'Proyecto bancario certificado'), + ('23', 'Cheque bancario'), + ('24', 'Nota cambiaria esperando aceptación'), + ('25', 'Cheque certificado'), + ('26', 'Cheque Local'), + ('27', 'Débito Pago Negocio Corporativo (CTP)'), + ('28', 'Crédito Negocio Intercambio Corporativo (CTX)'), + ('29', 'Débito Negocio Intercambio Corporativo (CTX)'), + ('30', 'Transferencia Crédito'), + ('31', 'Transferencia Débito'), + ('32', 'Concentración Efectivo / Desembolso Crédito plus (CCD+)'), + ('33', 'Concentración Efectivo / Desembolso Débito plus (CCD+)'), + ('34', 'Pago y depósito pre acordado (PPD)'), + ('35', 'Concentración efectivo ahorros / Desembolso Crédito (CCD)'), + ('36', 'Concentración efectivo ahorros / Desembolso Crédito (CCD)'), + ('37', 'Pago Negocio Corporativo Ahorros Crédito (CTP)'), + ('38', 'Pago Negocio Corporativo Ahorros Débito (CTP)'), + ('39', 'Crédito Negocio Intercambio Corporativo (CTX)'), + ('40', 'Débito Negocio Intercambio Corporativo (CTX)'), + ('41', 'Concentración efectivo/Desembolso Crédito plus (CCD+)'), + ('42', 'Consignación bancaria'), + ('43', 'Concentración efectivo / Desembolso Débito plus (CCD+)'), + ('44', 'Nota cambiaria'), + ('45', 'Transferencia Crédito Bancario'), + ('46', 'Transferencia Débito Interbancario'), + ('47', 'Transferencia Débito Bancaria'), + ('48', 'Tarjeta Crédito'), + ('49', 'Tarjeta Débito'), + ('50', 'Postgiro'), + ('51', 'Telex estándar bancario francés'), + ('52', 'Pago comercial urgente'), + ('53', 'Pago Tesorería Urgente'), + ('60', 'Nota promisoria'), + ('61', 'Nota promisoria firmada por el acreedor'), + ('62', 'Nota promisoria firmada por el acreedor, avalada por el banco'), + ('63', 'Nota promisoria firmada por el acreedor, avalada por un tercero'), + ('64', 'Nota promisoria firmada por el banco'), + ('65', 'Nota promisoria firmada por un banco avalada por otro banco'), + ('66', 'Nota promisoria firmada'), + ('67', 'Nota promisoria firmada por un tercero avalada por un banco'), + ('70', 'Retiro de nota por el por el acreedor'), + ('71', 'Bonos'), + ('72', 'Vales'), + ('74', 'Retiro de nota por el por el acreedor sobre un banco'), + ('75', 'Retiro de nota por el acreedor, avalada por otro banco'), + ('76', 'Retiro de nota por el acreedor, sobre un banco avalada por un tercero'), + ('77', 'Retiro de una nota por el acreedor sobre un tercero'), + ('78', 'Retiro de una nota por el acreedor sobre un tercero avalada por un banco'), + ('91', 'Nota bancaria transferible'), + ('92', 'Cheque local trasferible'), + ('93', 'Giro referenciado'), + ('94', 'Giro urgente'), + ('95', 'Giro formato abierto'), + ('96', 'Método de pago solicitado no usado'), + ('97', 'Clearing entre partners'), + ('ZZZ', 'Acuerdo mutuo'), + ], string='Metodo de pago',default='10') + + #raise Warning(final["error"]) + #print() + + + + # for nombre in numeracion: + # print(nombre) + + # print(result.message) + # print(result.messageError) + + # clause_final = [('name', '=', 'primer')] + # valores = self.env['tabla_nomina.tabla_nomina'].search(clause_final) + # fields = self.env['tabla_nomina.tabla_nomina'].fields_get() + # # + # totalDays =100 + # numero =1 + # send = {} + # for k, v in fields.items(): + # numero = numero + 1 + # if numero < 6: + # print("nuevo valor") + # print(k) + # print(valores[k]) + # if valores[k]: + # if not k == "name": + # send[k] = exec(valores[k]) + # print(exec(valores[k])) \ No newline at end of file diff --git a/tabla_nomina/security/ir.model.access.csv b/tabla_nomina/security/ir.model.access.csv new file mode 100755 index 0000000..306fc3d --- /dev/null +++ b/tabla_nomina/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_tabla_nomina_tabla_nomina,tabla_nomina.tabla_nomina,model_tabla_nomina_tabla_nomina,base.group_user,1,1,1,1 +access_tabla_nomina_tabla_nomina_line,tabla_nomina.line,model_tabla_nomina_line,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/tabla_nomina/views/templates.xml b/tabla_nomina/views/templates.xml new file mode 100644 index 0000000..cea6b39 --- /dev/null +++ b/tabla_nomina/views/templates.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/tabla_nomina/views/views.xml b/tabla_nomina/views/views.xml new file mode 100755 index 0000000..06f4e23 --- /dev/null +++ b/tabla_nomina/views/views.xml @@ -0,0 +1,291 @@ + + + + + + Documentos electronicos + tabla_nomina.tabla_nomina + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + Listado documentos + tabla_nomina.tabla_nomina + + + + + + + + + + + + + + Listado Documentos + tabla_nomina.tabla_nomina + tree,form + + + + + + + + + + + + + + + + + + + + + + + + + + nomina_electronica + hr.payslip + + + + +