Compare commits

...

1 Commits
14.0 ... PT0001

Author SHA1 Message Date
cristian cortes
c71d7e6a7c tabla_nomina 2021-12-02 14:28:46 +00:00
9 changed files with 591 additions and 35 deletions

View File

@ -1,4 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from . import controllers from . import controllers
from . import models from . import models
from . import wizard

1
tabla_nomina/__manifest__.py Executable file → Normal file
View File

@ -25,6 +25,7 @@
# always loaded # always loaded
'data': [ 'data': [
'security/ir.model.access.csv', 'security/ir.model.access.csv',
'wizard/wizard_message.xml',
'data/data.xml', 'data/data.xml',
'views/views.xml', 'views/views.xml',
'views/templates.xml', 'views/templates.xml',

125
tabla_nomina/data/data.xml Executable file → Normal file
View File

@ -1,9 +1,25 @@
<?xml version="1.0" ?> <?xml version="1.0" ?>
<odoo> <odoo>
<record id="n0b" model="tabla_nomina.line">
<field name="mp_id" ref="n0a"/>
<field name="name">FechaIngreso</field>
<field name="categoria">Periodo</field>
<field name="obligatorio">true</field>
<field name="campo_tecnico">self.contract_id.date_start</field>
<field name="detalle">Fecha de Ingreso del trabajador a la empresa (AAAA-MM-DD)*</field>
</record>
<record id="seq_refund_salary_slip" model="ir.sequence">
<field name="name">Refund Salary Slip</field>
<field name="code">salary.refund</field>
<field name="prefix">NOA</field>
<field name="padding">3</field>
</record>
<record id="n0a" model="tabla_nomina.tabla_nomina"> <record id="n0a" model="tabla_nomina.tabla_nomina">
<field name="id">1</field> <field name="id">1</field>
<field name="name">Nómina electrónica</field> <field name="name">Nómina electrónica</field>
<field name="ambiente">1</field>
</record> </record>
<record id="n0b" model="tabla_nomina.line"> <record id="n0b" model="tabla_nomina.line">
<field name="mp_id" ref="n0a"/> <field name="mp_id" ref="n0a"/>
@ -1293,6 +1309,33 @@
<field name="campo_tecnico"></field> <field name="campo_tecnico"></field>
<field name="detalle">Reintegro</field> <field name="detalle">Reintegro</field>
</record> </record>
<record id="n128c" model="tabla_nomina.line">
<field name="mp_id" ref="n0a"/>
<field name="name">ConceptoS</field>
<field name="codigo">ConceptoS</field>
<field name="dias">false</field>
<field name="porcentaje">false</field>
<field name="horas">false</field>
<field name="categoria">Devengado</field>
<field name="obligatorio">false</field>
<field name="campo_tecnico"></field>
<field name="detalle">Otros conceptos Salarial</field>
</record>
<record id="n129c" model="tabla_nomina.line">
<field name="mp_id" ref="n0a"/>
<field name="name">ConceptoNS</field>
<field name="codigo">ConceptoNS</field>
<field name="dias">false</field>
<field name="porcentaje">false</field>
<field name="horas">false</field>
<field name="categoria">Devengado</field>
<field name="obligatorio">false</field>
<field name="campo_tecnico"></field>
<field name="detalle">Otros conceptos No salarial</field>
</record>
<record id="n130b" model="tabla_nomina.line"> <record id="n130b" model="tabla_nomina.line">
<field name="mp_id" ref="n0a"/> <field name="mp_id" ref="n0a"/>
<field name="name">PorcentajeSalud</field> <field name="name">PorcentajeSalud</field>
@ -1704,6 +1747,86 @@
<field name="campo_tecnico"></field> <field name="campo_tecnico"></field>
<field name="detalle">Valor deduccion fondo de pension</field> <field name="detalle">Valor deduccion fondo de pension</field>
</record> </record>
<record id="z4" model="tabla_nomina.line">
<field name="mp_id" ref="n0a"/>
<field name="name">credit_note</field>
<field name="codigo"></field>
<field name="dias">false</field>
<field name="porcentaje">false</field>
<field name="horas">false</field>
<field name="categoria">informaciongeneral</field>
<field name="subcategoria"></field>
<field name="obligatorio">false</field>
<field name="campo_tecnico">self.credit_note</field>
<field name="detalle">Indica si es ajuste de nomina o nota credito</field>
</record>
<record id="z5" model="tabla_nomina.line">
<field name="mp_id" ref="n0a"/>
<field name="name">nota_credito</field>
<field name="codigo"></field>
<field name="dias">false</field>
<field name="porcentaje">false</field>
<field name="horas">false</field>
<field name="categoria">informaciongeneral</field>
<field name="subcategoria"></field>
<field name="obligatorio">false</field>
<field name="campo_tecnico">self.nota_credito</field>
<field name="detalle">Indica el tipo de ajuste eliminacion o ajuste</field>
</record>
<record id="z6" model="tabla_nomina.line">
<field name="mp_id" ref="n0a"/>
<field name="name">causa</field>
<field name="codigo"></field>
<field name="dias">false</field>
<field name="porcentaje">false</field>
<field name="horas">false</field>
<field name="categoria">informaciongeneral</field>
<field name="subcategoria"></field>
<field name="obligatorio">false</field>
<field name="campo_tecnico">self.causa</field>
<field name="detalle">causa por el ajuste nomina</field>
</record>
<record id="z7" model="tabla_nomina.line">
<field name="mp_id" ref="n0a"/>
<field name="name">CUNEPred</field>
<field name="codigo"></field>
<field name="dias">false</field>
<field name="porcentaje">false</field>
<field name="horas">false</field>
<field name="categoria">informaciongeneral</field>
<field name="subcategoria"></field>
<field name="obligatorio">false</field>
<field name="campo_tecnico">self.CUNEPred</field>
<field name="detalle">El numero cune predecesor si existe</field>
</record>
<record id="z8" model="tabla_nomina.line">
<field name="mp_id" ref="n0a"/>
<field name="name">NumeroPred</field>
<field name="codigo"></field>
<field name="dias">false</field>
<field name="porcentaje">false</field>
<field name="horas">false</field>
<field name="categoria">informaciongeneral</field>
<field name="subcategoria"></field>
<field name="obligatorio">false</field>
<field name="campo_tecnico">self.NumeroPred</field>
<field name="detalle">Numero predecesor de la nomina a ajustar</field>
</record>
<record id="z9" model="tabla_nomina.line">
<field name="mp_id" ref="n0a"/>
<field name="name">FechaGenPred</field>
<field name="codigo"></field>
<field name="dias">false</field>
<field name="porcentaje">false</field>
<field name="horas">false</field>
<field name="categoria">informaciongeneral</field>
<field name="subcategoria"></field>
<field name="obligatorio">false</field>
<field name="campo_tecnico">self.FechaGenPred</field>
<field name="detalle">Fecha de generacion predecesor nomina</field>
</record>
</odoo> </odoo>

385
tabla_nomina/models/models.py Executable file → Normal file
View File

@ -1,10 +1,14 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from odoo import models, fields, modules, api,_ from odoo import models, fields, modules,tools , api,_
import os import os
import requests import requests
import json import json
from odoo.exceptions import AccessError, UserError, RedirectWarning, ValidationError, Warning from odoo.exceptions import AccessError, UserError, RedirectWarning, ValidationError, Warning
import babel
import time
from dateutil import relativedelta
from datetime import datetime, timedelta from datetime import datetime, timedelta
from datetime import time as datetime_time from datetime import time as datetime_time
@ -99,15 +103,19 @@ class nomina_electronica(models.Model):
_name = 'hr.payslip' _name = 'hr.payslip'
_inherit = 'hr.payslip' _inherit = 'hr.payslip'
nota_credito = fields.Selection([('Eliminar', 'Eliminar'), ('Modificar', 'Modificar')], string='Tipo de nota' ,required=False,default='Eliminar')
CUNEPred = fields.Char("CUNE")
NumeroPred = fields.Char("Numero Anterior")
FechaGenPred = fields.Date("Fecha de Predecesor")
causa = fields.Char("Causa")
fecha_pago = fields.Date("Fecha de Pago") fecha_pago = fields.Date("Fecha de Pago")
xml = fields.Text("XML") xml = fields.Text("XML")
transaccionID = fields.Char("transaccionID") transaccionID = fields.Char("transaccionID")
estado = fields.Selection([ estado = fields.Selection([
('No_generada', 'No_generada'), ('no_generada', 'No_generada'),
('Generada_correctamente', 'Generada_correctamente'), ('Generada_correctamente', 'Generada_correctamente'),
('Generada_con_errores', 'Generada_con_errores'), ('Generada_con_errores', 'Generada_con_errores'),
], string='Estado',default="No_generada") ], string='Estado',default="no_generada")
prefijo = fields.Char("Prefijo") prefijo = fields.Char("Prefijo")
consecutivo = fields.Char("consecutivo") consecutivo = fields.Char("consecutivo")
paisgeneracion = fields.Char("Pais de generacion") paisgeneracion = fields.Char("Pais de generacion")
@ -156,15 +164,271 @@ class nomina_electronica(models.Model):
HoraGen = fields.Char('Hora Generacion') HoraGen = fields.Char('Hora Generacion')
id_plataforma = fields.Char('id_plataforma') id_plataforma = fields.Char('id_plataforma')
password = fields.Char('password') password = fields.Char('password')
cune = fields.Char('CUNE')
# PeriodoNomina = fields.Char('Periodo Nomina') # PeriodoNomina = fields.Char('Periodo Nomina')
# TipoMoneda = fields.Char('TipoMoneda', default="COP") # TipoMoneda = fields.Char('TipoMoneda', default="COP")
# Notas = fields.Char('Notas') # Notas = fields.Char('Notas')
# @api.multi
def compute_refund(self,causa,tipo_nota):
for payslip in self:
numero_pred = payslip.prefijo+payslip.consecutivo
fecha_gen_pred = payslip.FechaGen
CUNEPred = payslip.cune
number = payslip.number or self.env['ir.sequence'].next_by_code('salary.refund')
numbersequence = self.env['ir.sequence'].search([('code', '=', 'salary.refund')])
prefijo = numbersequence.prefix
longitudprefijo = len(prefijo)
longitudsecuencia = len(number)
consecutivo = number[longitudprefijo:longitudsecuencia]
# delete old payslip lines
payslip.line_ids.unlink()
# set the list of contract for which the rules have to be applied
# if we don't give the contract, then the rules to apply should be for all current contracts of the employee
contract_ids = payslip.contract_id.ids or \
self.get_contract(payslip.employee_id, payslip.date_from, payslip.date_to)
lines = [(0, 0, line) for line in self._get_payslip_lines(contract_ids, payslip.id)]
payslip.write({'line_ids': lines, 'number': number,'transaccionID':'',
'estado':'no_generada','nota_credito':tipo_nota,'causa':causa,
'CUNEPred':CUNEPred,'NumeroPred':numero_pred,'FechaGenPred':fecha_gen_pred,
'prefijo':prefijo,'consecutivo':consecutivo})
return True
# @api.multi
def refund_sheet(self):
view_id = self.env.ref('tabla_nomina.form_wizard_message2').id
return {
'name' : "Ajuste de nomina",
'type' : 'ir.actions.act_window',
'res_model': 'wk.wizard.message2',
'view_mode': 'form',
'view_id':view_id,
'target' : 'new',
'res_id' : False,
}
@api.model
def get_worked_day_lines2(self, contracts, date_from, date_to):
"""
@param contract: Browse record of contracts
@return: returns a list of dict containing the input that should be applied for the given contract between date_from and date_to
"""
res = []
# fill only if the contract as a working schedule linked
for contract in contracts.filtered(lambda contract: contract.resource_calendar_id):
day_from = datetime.combine(fields.Date.from_string(date_from), datetime_time.min)
day_to = datetime.combine(fields.Date.from_string(date_to), datetime_time.max)
# compute leave days
leaves = {}
day_leave_intervals = contract.employee_id.iter_leaves(day_from, day_to, calendar=contract.resource_calendar_id)
for day_intervals in day_leave_intervals:
for interval in day_intervals:
holiday = interval[2]['leaves'].holiday_id
current_leave_struct = leaves.setdefault(holiday.holiday_status_id, {
'name': holiday.holiday_status_id.name or _('Global Leaves'),
'sequence': 5,
'code': holiday.holiday_status_id.name or 'GLOBAL',
'number_of_days': 0.0,
'number_of_hours': 0.0,
'contract_id': contract.id,
})
leave_time = (interval[1] - interval[0]).seconds / 3600
current_leave_struct['number_of_hours'] += leave_time
work_hours = contract.employee_id.get_day_work_hours_count(interval[0].date(), calendar=contract.resource_calendar_id)
if work_hours:
current_leave_struct['number_of_days'] += leave_time / work_hours
# compute worked days
work_data = contract.employee_id.with_context(no_tz_convert=True).get_work_days_data(day_from, day_to, calendar=contract.resource_calendar_id)
attendances = {
'name': _("Normal Working Days paid at 100%"),
'sequence': 1,
'code': 'WORK100',
'number_of_days': work_data['days'],
'number_of_hours': work_data['hours'],
'contract_id': contract.id,
}
res.append(attendances)
tipos = ["HED","HEN","HRN","HEDDF","HRDDF","HENDF","HRNDF",
"VacacionesComunes","VacacionesCompensadas","Primas","Cesantias","Incapacidad","LicenciaMP","LicenciaR","LicenciaNR",
"HuelgaLegal","CompensacionO","CompensacionE"]
otros = ['ConceptoS','ConceptoNS',"AuxilioTransporte","ViaticoManuAlojS","ViaticoManuAlojNS","PagoS","PagoNS","PagoAlimentacionS","PagoAlimentacionNS",
"Comision","PagoTercero","Anticipo","Dotacion","ApoyoSost","Teletrabajo","BonifRetiro","Indemnizacion","Reintegro"
,"BonificacionS","BonificacionNS","AuxilioS","AuxilioNS"]
for tipo in tipos:
attendances = {
'name': _(self.descripcion(tipo)),
'sequence': 1,
'code': tipo,
'number_of_days': 0,
'number_of_hours': 0,
'contract_id': contract.id,
}
res.append(attendances)
res.extend(leaves.values())
return res
def descripcion(self,tipo):
if tipo == "HED":
return "Hora extra diurna"
if tipo == "HEN":
return "Hora Extra Nocturna"
if tipo == "HRN":
return "Hora Recargo Nocturno"
if tipo == "HEDDF":
return "Horas Extras Diurnas Dominical y Festivos"
if tipo == "HENDF":
return "Horas Extras Nocturna Dominical y Festivos"
if tipo == "HRNDF":
return "Horas Recargo Diurno Dominical y Festivos"
if tipo == "HRDDF":
return "Recargo Diurno Dominical y Festivos"
if tipo == "VacacionesComunes":
return "Vacaciones Comunes"
if tipo == "VacacionesCompensadas":
return "Vacaciones Compensadas"
if tipo == "Primas":
return "Primas"
if tipo == "Cesantias":
return "Cesantias"
if tipo == "Incapacidad":
return "Incapacidad"
if tipo == "LicenciaMP":
return "Licencia de Maternidad o Paternidad"
if tipo == "LicenciaR":
return "Licencia Remunerada"
if tipo == "LicenciaNR":
return "Licencia NO Remunerada"
if tipo == "HuelgaLegal":
return "Huelga Legal"
# if tipo == "OtroConcepto":
# return "Otros conceptos"
if tipo == "CompensacionO":
return "Compensacion Ordinaria"
if tipo == "CompensacionE":
return "Compensacion Extraordinaria"
@api.model
def get_inputs2(self, contracts, date_from, date_to):
res = []
structure_ids = contracts.get_all_structures()
rule_ids = self.env['hr.payroll.structure'].browse(structure_ids).get_all_rules()
sorted_rule_ids = [id for id, sequence in sorted(rule_ids, key=lambda x:x[1])]
inputs = self.env['hr.salary.rule'].browse(sorted_rule_ids).mapped('input_ids')
otros = ['ConceptoS','ConceptoNS',"ViaticoManuAlojS","ViaticoManuAlojNS","PagoS","PagoNS","PagoAlimentacionS","PagoAlimentacionNS",
"Comision","PagoTercero","Anticipo","Dotacion","ApoyoSost","Teletrabajo","BonifRetiro","Indemnizacion","Reintegro"
,"BonificacionS","BonificacionNS","AuxilioS","AuxilioNS"]
for contract in contracts:
for otro in otros:
input_data = {
'name': self.descripcion2(otro),
'code': otro,
'contract_id': contract.id,
}
res += [input_data]
for input in inputs:
input_data = {
'name': input.name,
'code': input.code,
'contract_id': contract.id,
}
res += [input_data]
return res
def descripcion2(self,tipo):
if tipo == "ConceptoS":
return "Valor de los demás pagos fijos o variables realizados al trabajador (SALARIAL)"
if tipo == "ConceptoNS":
return "Valor de los demás pagos fijos o variables realizados al trabajador (NO SALARIAL)"
if tipo == "ViaticoManuAlojS":
return "Parte de los viáticos pagado al trabajador correspondientes a manutención y/o alojamiento.(SALARIAL)"
if tipo == "ViaticoManuAlojNS":
return "Parte de los viáticos pagado al trabajador correspondientes a manutención y/o alojamiento.(NO SALARIAL)"
if tipo == "PagoS":
return "Valor que el trabajador recibe como contraprestación por el trabajo realizado, por medio de bonos electrónicos, recargas, cheques, vales. es decir, todo pago realizado en un medio diferente a dinero en efectivo o consignación de cuenta bancaria (Salarial)."
if tipo == "PagoNS":
return "Valor que el trabajador recibe como contraprestación por el trabajo realizado, por medio de bonos electrónicos, recargas, cheques, vales. es decir, todo pago realizado en un medio diferente a dinero en efectivo o consignación de cuenta bancaria (NO Salarial)."
if tipo == "PagoAlimentacionS":
return "Valor que el trabajador recibe como concepto no salarial, por medio de bonos electrónicos, recargas, cheques, vales. es decir, todo pago realizado en un medio diferente a dinero en efectivo o consignación de cuenta bancaria (Para Alimentación Salarial)."
if tipo == "PagoAlimentacionNS":
return "Valor que el trabajador recibe como concepto no salarial, por medio de bonos electrónicos, recargas, cheques, vales. es decir, todo pago realizado en un medio diferente a dinero en efectivo o consignación de cuenta bancaria (Para Alimentación NO Salarial)."
if tipo == "Comision":
return "Valor pagado al trabajador usualmente del área comercial, y de forma regular se liquida con un porcentaje sobre el importe de una operación, también se presenta como incentivo por el logro de objetivos."
if tipo == "PagoTercero":
return "Beneficios en cabeza del Trabjador que se pagan a un proveedor o tercero."
if tipo == "Anticipo":
return "Anticipos de Nómina."
if tipo == "Dotacion":
return "De conformidad con lo previsto en el artículo 230 del Código Sustantivo del Trabajo, o la norma que lo modifique, adicione o sustituya, corresponde al valor que el empleador dispone para suministrar la dotación de sus trabajadores."
if tipo == "ApoyoSost":
return "Corresponde al valor no salarial que el patrocinador paga de forma mensual como ayuda o apoyo economía al aprendiz o practicante universitario durante su etapa lectiva y fase practica."
if tipo == "Teletrabajo":
return "Valor que debe ser pagado al trabajador cuyo contrato indica expresamente que puede laborar mediante teletrabajo"
if tipo == "BonifRetiro":
return "Valor establecido por mutuo acuerdo por retiro del Trabajador"
if tipo == "Indemnizacion":
return "Valor de Indemnizacion establecido por ley"
if tipo == "Reintegro":
return "Valor que le regresa la empresa al trabajador por una deducción mal realizada en otro pago de nomina"
if tipo == "BonificacionS":
return "Son valores pagados al trabajador en forma de incentivo o recompensa por la contraprestación directa del servicio."
if tipo == "BonificacionNS":
return "Son valores de incentivos pagados al trabajador de forma ocasional y por mera liberalidad o los pactados entre las partes de forma expresa como pago no salarial."
if tipo == "AuxilioS":
return "Son beneficios, ayudas o apoyos económicos, pagados al trabajador de forma habitual o pactados entre las partes como factor salarial."
if tipo == "AuxilioNS":
return "Son beneficios, ayudas o apoyos económicos, pagados al trabajador de forma ocasional y por mera liberalidad o los pactados entre las partes de forma expresa como pago no salarial."
@api.onchange('employee_id') @api.onchange('employee_id')
def on_change_employee(self): def on_change_employee(self):
# if (not self.employee_id) or (not self.date_from) or (not self.date_to):
# return
# employee = self.employee_id
# date_from = self.date_from
# date_to = self.date_to
# contract_ids = []
# ttyme = datetime.fromtimestamp(time.mktime(time.strptime(date_from, "%Y-%m-%d")))
# locale = self.env.context.get('lang') or 'en_US'
# self.name = _('Salary Slip of %s for %s') % (employee.name, tools.ustr(babel.dates.format_date(date=ttyme, format='MMMM-y', locale=locale)))
# self.company_id = employee.company_id
# if not self.env.context.get('contract') or not self.contract_id:
# contract_ids = self.get_contract(employee, date_from, date_to)
# if not contract_ids:
# return
# self.contract_id = self.env['hr.contract'].browse(contract_ids[0])
# if not self.contract_id.struct_id:
# return
# self.struct_id = self.contract_id.struct_id
# #computation of the salary input
# contracts = self.env['hr.contract'].browse(contract_ids)
# worked_days_line_ids = self.get_worked_day_lines(contracts, date_from, date_to)
# worked_days_lines = self.worked_days_line_ids.browse([])
# for r in worked_days_line_ids:
# worked_days_lines += worked_days_lines.new(r)
# self.worked_days_line_ids = worked_days_lines
# input_line_ids = self.get_inputs(contracts, date_from, date_to)
# input_lines = self.input_line_ids.browse([])
# for r in input_line_ids:
# input_lines += input_lines.new(r)
# self.input_line_ids = input_lines
# return
for record in self: for record in self:
valores = self.env['tabla_nomina.tabla_nomina'].search([('name', '=', 'Nómina electrónica')]) valores = self.env['tabla_nomina.tabla_nomina'].search([('name', '=', 'Nómina electrónica')])
# print("IMPRIMIENDO valores")
# print(valores)
if valores: if valores:
self.prefijo = valores.prefijo self.prefijo = valores.prefijo
self.consecutivo = valores.consecutivo self.consecutivo = valores.consecutivo
@ -189,8 +453,17 @@ class nomina_electronica(models.Model):
self.DireccionEmpleador = valores.DireccionEmpleador self.DireccionEmpleador = valores.DireccionEmpleador
self.id_plataforma = valores.id_plataforma self.id_plataforma = valores.id_plataforma
self.password = valores.password self.password = valores.password
# return
# @api.model
# def create(self, values):
# result = super(nomina_electronica, self).create(values)
# print("IMPRIMIENDO valores despues")
# print(valores)
# return result
# @api.multi
def action_cfdi_generate(self): def action_cfdi_generate(self):
urlini = "https://odoo15.navegasoft.com/admonclientes/status/" urlini = "https://odoo15.navegasoft.com/admonclientes/status/"
headers = {'content-type': 'application/json'} headers = {'content-type': 'application/json'}
@ -273,25 +546,75 @@ class nomina_electronica(models.Model):
raise Warning(result) raise Warning(result)
# @api.multi
def genera_cufe(self):
urlini = "https://odoo15.navegasoft.com/admonclientes/cune/"
headers = {'content-type': 'application/json'}
send = {"id_plataforma":self.id_plataforma,"transaccionID":self.transaccionID,"prefix":self.prefijo,"number":self.consecutivo,"ambiente":self.ambiente}
result = requests.post(urlini,headers=headers,data = json.dumps(send))
#resultado = json.loads(result.text)
#print(result.text)
print(result)
if result.status_code == 200:
resultado = json.loads(result.text)
print("el primer resultado es !!!")
print(resultado)
if "cune" in resultado:
final = resultado["cune"]
return self.env['wk.wizard.message'].genrated_message('CUNE: '+final, '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(final2)) #eval(final2)
print('y el resultado es ...')
print(final_data)
if 'CUNE' in final_data:
self.write({"cune":final_data['CUNE']})
return self.env['wk.wizard.message'].genrated_message("Este es el CUNE "+final_data['CUNE'],"Se guardo dentro de los datos de la nomina" ,"https://navegasoft.com")
else:
return self.env['wk.wizard.message'].genrated_message('Estamos recibiendo un codigo de error Es necesario esperar para volver generar el cune', 'Es necesario esperar para volver a imprimir el documento')
final = resultado["error"]
final_error = json.loads(json.dumps(final))
data = final_error["data"]
data_final = data['message']
else:
raise Warning(result)
# @api.multi
def envio_directo(self): def envio_directo(self):
import time import time
now2 = datetime.now() now2 = datetime.now()
current_time = now2.strftime("%H:%M:%S") current_time = now2.strftime("%H:%M:%S")
numeracion = self.env['ir.sequence'].sudo().search([('code', '=', 'salary.slip')]) if self.credit_note == True:
lon_prefix = len(numeracion.prefix) numeracion = self.env['ir.sequence'].search([('code', '=', 'salary.refund')])
long_total = len(self.number) lon_prefix = len(numeracion.prefix)
number = self.number[lon_prefix:long_total] long_total = len(self.number)
number = self.number[lon_prefix:long_total]
self.prefijo = numeracion.prefix self.prefijo = numeracion.prefix
self.consecutivo = number self.consecutivo = number
else:
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.FechaGen = str(now2.date())
self.HoraGen = str(current_time) self.HoraGen = str(current_time)
urlini = "https://odoo15.navegasoft.com/admonclientes/objects/" urlini = "https://odoo15.navegasoft.com/admonclientes/objects/"
valores = self.env['tabla_nomina.tabla_nomina'].search([('name', '=', 'Nómina electrónica')]) valores = self.env['tabla_nomina.tabla_nomina'].search([('name', '=', 'Nómina electrónica')])
response2={} response2={}
valores_lineas = valores.mp_id valores_lineas = valores.mp_id
send = {} send = {}
for linea in valores_lineas: for linea in valores_lineas:
if linea.codigo: if linea.codigo:
if linea.dias == True: if linea.dias == True:
@ -329,6 +652,7 @@ class nomina_electronica(models.Model):
# else: # else:
# send[linea.name] = None # send[linea.name] = None
# print(send) # print(send)
#send['credit_note']= self.credit_note
headers = {'content-type': 'application/json'} headers = {'content-type': 'application/json'}
result = requests.post(urlini,headers=headers,data = json.dumps(send)) result = requests.post(urlini,headers=headers,data = json.dumps(send))
if result.status_code == 200: if result.status_code == 200:
@ -372,10 +696,10 @@ class nomina_hr_contract(models.Model):
], string='Tipo Contrato') ], string='Tipo Contrato')
tipo_trabajador = fields.Selection([ tipo_trabajador = fields.Selection([
('1', 'Dependiente'), ('01', 'Dependiente'),
('2', 'Servicio domestico'), ('02', 'Servicio domestico'),
('3', 'Independiente'), ('03', 'Independiente'),
('4', 'Madre comunitaria'), ('04', 'Madre comunitaria'),
('12', 'Aprendices del Sena en etapa lectiva'), ('12', 'Aprendices del Sena en etapa lectiva'),
('16', 'Independiente agremiado o asociado'), ('16', 'Independiente agremiado o asociado'),
('18', 'Funcionarios públicos sin tope máximo de ibc'), ('18', 'Funcionarios públicos sin tope máximo de ibc'),
@ -411,10 +735,10 @@ class nomina_hr_contract(models.Model):
], string='Tipo Trabajador') ], string='Tipo Trabajador')
sub_tipo_trabajador = fields.Selection([ sub_tipo_trabajador = fields.Selection([
('00', 'No Aplica'), ('00', 'No Aplica'),
('1', 'Dependiente pensionado por vejez activo'), ('01', 'Dependiente pensionado por vejez activo'),
('2', 'Independiente pensionado por vejez activo'), ('02', 'Independiente pensionado por vejez activo'),
('3', 'Cotizante no obligado a cotizar a pensión por edad'), ('03', 'Cotizante no obligado a cotizar a pensión por edad'),
('4', 'Cotizante con requisitos cumplidos para pensión'), ('04', 'Cotizante con requisitos cumplidos para pensión'),
('12', 'Cotizante a quien se le ha reconocido indemnización sustitutiva o devolución de saldos'), ('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'), ('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'), ('18', 'Cotizante pensionado con mesada superior a 25 smlmv'),
@ -423,13 +747,13 @@ class nomina_hr_contract(models.Model):
('21', 'Conductores servicio taxi no aporte pensión dec. 1047'), ('21', 'Conductores servicio taxi no aporte pensión dec. 1047'),
], string='Subtipo de Trabajador') ], string='Subtipo de Trabajador')
AltoRiegoPension = fields.Selection([ AltoRiegoPension = fields.Selection([
('NO', 'NO'), ('false', 'NO'),
('SI', 'SI'), ('true', 'SI'),
], string='Alto Riego Pension',default='NO') ], string='Alto Riego Pension',default='false')
SalarioIntegral = fields.Selection([ SalarioIntegral = fields.Selection([
('NO', 'NO'), ('false', 'NO'),
('SI', 'SI'), ('true', 'SI'),
], string='Salario Integral',default='NO') ], string='Salario Integral',default='false')
banco = fields.Char("Banco") banco = fields.Char("Banco")
tipo_cuenta = fields.Char("Tipo cuenta") tipo_cuenta = fields.Char("Tipo cuenta")
numero_cuenta = fields.Char("Numero de cuenta") numero_cuenta = fields.Char("Numero de cuenta")
@ -540,4 +864,7 @@ class nomina_hr_contract(models.Model):
# if valores[k]: # if valores[k]:
# if not k == "name": # if not k == "name":
# send[k] = exec(valores[k]) # send[k] = exec(valores[k])
# print(exec(valores[k])) # print(exec(valores[k]))

2
tabla_nomina/security/ir.model.access.csv Executable file → Normal file
View File

@ -1,3 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink 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,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 access_wizard_message2,Access Message Wizard2,model_wk_wizard_message2,,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_tabla_nomina_tabla_nomina tabla_nomina.tabla_nomina model_tabla_nomina_tabla_nomina base.group_user 1 1 1 1
3 access_tabla_nomina_tabla_nomina_line access_wizard_message2 tabla_nomina.line Access Message Wizard2 model_tabla_nomina_line model_wk_wizard_message2 base.group_user 1 1 1 1

13
tabla_nomina/views/views.xml Executable file → Normal file
View File

@ -157,10 +157,18 @@
<!-- states="draft,open" --> <!-- states="draft,open" -->
<button name="envio_directo" type="object" string="Generar Documento electrónico" groups="account.group_account_invoice" attrs="{'invisible':['|',('estado','in',('generada_correctamente')),('state','in',('draft'))]}"/> <button name="envio_directo" type="object" string="Generar Documento electrónico" groups="account.group_account_invoice" attrs="{'invisible':['|',('estado','in',('generada_correctamente')),('state','in',('draft'))]}"/>
<button name="action_cfdi_generate" type="object" string="Imprimir" groups="account.group_account_invoice" attrs="{'invisible':['|',('estado','in',('No_generada','generada_con_errores')),('state','in',('draft'))]}"/> <button name="action_cfdi_generate" type="object" string="Imprimir" groups="account.group_account_invoice" attrs="{'invisible':['|',('estado','in',('No_generada','generada_con_errores')),('state','in',('draft'))]}"/>
<button name="genera_cufe" type="object" string="Generar CUFE" groups="account.group_account_invoice" attrs="{'invisible':['|',('estado','in',('generada_correctamente')),('state','in',('draft'))]}"/>
</xpath> </xpath>
<xpath expr="//field[@name='number']" position="after"> <xpath expr="//field[@name='number']" position="after">
<!-- states="draft,open" attrs="{'invisible':['|',('estado_factura','in',('factura_correcta')),('state','in',('draft','open'))]}" --> <!-- states="draft,open" attrs="{'invisible':['|',('estado_factura','in',('factura_correcta')),('state','in',('draft','open'))]}" -->
<field name="fecha_pago" /> <field name="fecha_pago" />
<field name="nota_credito" attrs="{'invisible':[('credit_note','=',False)]}"/>
<field name="causa" attrs="{'invisible':[('credit_note','=',False)]}"/>
<field name="CUNEPred" attrs="{'invisible':[('credit_note','=',False)]}"/>
<field name="NumeroPred" attrs="{'invisible':[('credit_note','=',False)]}"/>
<field name="FechaGenPred" attrs="{'invisible':[('credit_note','=',False)]}"/>
</xpath> </xpath>
<!-- <xpath expr="//field[@name='input_line_ids']" position="replace"> <!-- <xpath expr="//field[@name='input_line_ids']" position="replace">
<field name="input_line_ids" colspan="5" nolabel="1"> <field name="input_line_ids" colspan="5" nolabel="1">
@ -257,8 +265,7 @@
<field name="inherit_id" ref="hr_contract.hr_contract_view_form"/> <field name="inherit_id" ref="hr_contract.hr_contract_view_form"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//field[@name='resource_calendar_id']" position="after"> <xpath expr="//field[@name='resource_calendar_id']" position="after">
<group> <field name="tipo_contrato"/>
<field name="tipo_contrato"/>
<field name="tipo_trabajador"/> <field name="tipo_trabajador"/>
<field name="sub_tipo_trabajador"/> <field name="sub_tipo_trabajador"/>
<field name="AltoRiegoPension"/> <field name="AltoRiegoPension"/>
@ -266,7 +273,7 @@
<!-- <field name="banco"/> --> <!-- <field name="banco"/> -->
<field name="tipo_cuenta"/> <field name="tipo_cuenta"/>
<!-- <field name="numero_cuenta"/> --> <!-- <field name="numero_cuenta"/> -->
</group>
</xpath> </xpath>
</field> </field>
</record> </record>

View File

@ -0,0 +1,7 @@
# -*- coding: utf-8 -*-
##############################################################################
# Copyright (c) 2015-Present Webkul Software Pvt. Ltd. (<https://webkul.com/>)
# See LICENSE file for full copyright and licensing details.
# License URL : <https://store.webkul.com/license.html/>
##############################################################################
from . import wizard_message

View File

@ -0,0 +1,60 @@
# -*- coding: utf-8 -*-
##############################################################################
# Copyright (c) 2015-Present Webkul Software Pvt. Ltd. (<https://webkul.com/>)
# See LICENSE file for full copyright and licensing details.
# License URL : <https://store.webkul.com/license.html/>
##############################################################################
from odoo import api, fields, models, _
from odoo.exceptions import Warning
class WkWizardMessage(models.TransientModel):
_name = "wk.wizard.message2"
_description = "Message Wizard2"
#@api.multi
def button_generar_nota(self):
ids_actual = self.env.context.get('active_ids', [])
print(ids_actual)
Payslip = self.env['hr.payslip'].browse(ids_actual[0])
for payslip in Payslip:
copied_payslip = payslip.copy({'credit_note': True, 'name': _('Refund: ') + payslip.name})
copied_payslip.compute_refund(self.text,self.tipo)
# copied_payslip.action_payslip_done()
formview_ref = self.env.ref('hr_payroll.view_hr_payslip_form', False)
treeview_ref = self.env.ref('hr_payroll.view_hr_payslip_tree', False)
return {
'name': ("Refund Payslip"),
'view_mode': 'tree, form',
'view_id': False,
'view_type': 'form',
'res_model': 'hr.payslip',
'type': 'ir.actions.act_window',
'target': 'current',
'domain': "[('id', 'in', %s)]" % copied_payslip.ids,
'views': [(treeview_ref and treeview_ref.id or False, 'tree'), (formview_ref and formview_ref.id or False, 'form')],
'context': {}
}
return #self._export(report_type)
text = fields.Text(string='Causa')
tipo = fields.Selection([('Eliminar', 'Eliminar'),
('Modificar', 'Modificar')],
string='Tipo de nota',
required=True,
default='Eliminar')
@api.model
def genrated_message(self,message,name='Message/Summary'):
res = self.create({'text': message})
return {
'name' : name,
'type' : 'ir.actions.act_window',
'res_model': 'wk.wizard.message2',
'view_mode': 'form',
'target' : 'new',
'res_id' : res.id,
}

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (c) 2015-Present Webkul Software Pvt. Ltd. (<https://webkul.com/>) -->
<!-- See LICENSE file for full copyright and licensing details. -->
<!-- "License URL : <https://store.webkul.com/license.html/>" -->
<odoo>
<data>
<record id="form_wizard_message2" model="ir.ui.view">
<field name="name">Message wizard2</field>
<field name="model">wk.wizard.message2</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Message">
<separator string="Ajuste nomina" colspan="6" />
<group>
<field name="text" />
<field name="tipo" />
</group>
<newline/>
<separator colspan="6"/>
<footer>
<button name="button_generar_nota" string="Generar Nota" type="object" />
<!-- <button name="save" string="Save" invisible="1"/> -->
<button special="cancel" class="oe_highlight" string="Close"/>
</footer>
</form>
</field>
</record>
</data>
</odoo>