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

@ -2,3 +2,4 @@
from . import controllers
from . import models
from . import wizard

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

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

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

@ -1,9 +1,25 @@
<?xml version="1.0" ?>
<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">
<field name="id">1</field>
<field name="name">Nómina electrónica</field>
<field name="ambiente">1</field>
</record>
<record id="n0b" model="tabla_nomina.line">
<field name="mp_id" ref="n0a"/>
@ -1293,6 +1309,33 @@
<field name="campo_tecnico"></field>
<field name="detalle">Reintegro</field>
</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">
<field name="mp_id" ref="n0a"/>
<field name="name">PorcentajeSalud</field>
@ -1704,6 +1747,86 @@
<field name="campo_tecnico"></field>
<field name="detalle">Valor deduccion fondo de pension</field>
</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>

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

@ -1,10 +1,14 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, modules, api,_
from odoo import models, fields, modules,tools , api,_
import os
import requests
import json
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 time as datetime_time
@ -99,15 +103,19 @@ class nomina_electronica(models.Model):
_name = '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")
xml = fields.Text("XML")
transaccionID = fields.Char("transaccionID")
estado = fields.Selection([
('No_generada', 'No_generada'),
('no_generada', 'No_generada'),
('Generada_correctamente', 'Generada_correctamente'),
('Generada_con_errores', 'Generada_con_errores'),
], string='Estado',default="No_generada")
], string='Estado',default="no_generada")
prefijo = fields.Char("Prefijo")
consecutivo = fields.Char("consecutivo")
paisgeneracion = fields.Char("Pais de generacion")
@ -156,15 +164,271 @@ class nomina_electronica(models.Model):
HoraGen = fields.Char('Hora Generacion')
id_plataforma = fields.Char('id_plataforma')
password = fields.Char('password')
cune = fields.Char('CUNE')
# PeriodoNomina = fields.Char('Periodo Nomina')
# TipoMoneda = fields.Char('TipoMoneda', default="COP")
# 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')
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:
valores = self.env['tabla_nomina.tabla_nomina'].search([('name', '=', 'Nómina electrónica')])
# print("IMPRIMIENDO valores")
# print(valores)
if valores:
self.prefijo = valores.prefijo
self.consecutivo = valores.consecutivo
@ -189,8 +453,17 @@ class nomina_electronica(models.Model):
self.DireccionEmpleador = valores.DireccionEmpleador
self.id_plataforma = valores.id_plataforma
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):
urlini = "https://odoo15.navegasoft.com/admonclientes/status/"
headers = {'content-type': 'application/json'}
@ -273,18 +546,68 @@ class nomina_electronica(models.Model):
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):
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
if self.credit_note == True:
numeracion = self.env['ir.sequence'].search([('code', '=', 'salary.refund')])
lon_prefix = len(numeracion.prefix)
long_total = len(self.number)
number = self.number[lon_prefix:long_total]
self.prefijo = numeracion.prefix
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.HoraGen = str(current_time)
urlini = "https://odoo15.navegasoft.com/admonclientes/objects/"
@ -329,6 +652,7 @@ class nomina_electronica(models.Model):
# else:
# send[linea.name] = None
# print(send)
#send['credit_note']= self.credit_note
headers = {'content-type': 'application/json'}
result = requests.post(urlini,headers=headers,data = json.dumps(send))
if result.status_code == 200:
@ -372,10 +696,10 @@ class nomina_hr_contract(models.Model):
], string='Tipo Contrato')
tipo_trabajador = fields.Selection([
('1', 'Dependiente'),
('2', 'Servicio domestico'),
('3', 'Independiente'),
('4', 'Madre comunitaria'),
('01', 'Dependiente'),
('02', 'Servicio domestico'),
('03', 'Independiente'),
('04', 'Madre comunitaria'),
('12', 'Aprendices del Sena en etapa lectiva'),
('16', 'Independiente agremiado o asociado'),
('18', 'Funcionarios públicos sin tope máximo de ibc'),
@ -411,10 +735,10 @@ class nomina_hr_contract(models.Model):
], 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'),
('01', 'Dependiente pensionado por vejez activo'),
('02', 'Independiente pensionado por vejez activo'),
('03', 'Cotizante no obligado a cotizar a pensión por edad'),
('04', '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'),
@ -423,13 +747,13 @@ class nomina_hr_contract(models.Model):
('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')
('false', 'NO'),
('true', 'SI'),
], string='Alto Riego Pension',default='false')
SalarioIntegral = fields.Selection([
('NO', 'NO'),
('SI', 'SI'),
], string='Salario Integral',default='NO')
('false', 'NO'),
('true', 'SI'),
], string='Salario Integral',default='false')
banco = fields.Char("Banco")
tipo_cuenta = fields.Char("Tipo cuenta")
numero_cuenta = fields.Char("Numero de cuenta")
@ -541,3 +865,6 @@ class nomina_hr_contract(models.Model):
# if not k == "name":
# send[k] = 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
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" -->
<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="genera_cufe" type="object" string="Generar CUFE" groups="account.group_account_invoice" attrs="{'invisible':['|',('estado','in',('generada_correctamente')),('state','in',('draft'))]}"/>
</xpath>
<xpath expr="//field[@name='number']" position="after">
<!-- states="draft,open" attrs="{'invisible':['|',('estado_factura','in',('factura_correcta')),('state','in',('draft','open'))]}" -->
<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 expr="//field[@name='input_line_ids']" position="replace">
<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="arch" type="xml">
<xpath expr="//field[@name='resource_calendar_id']" position="after">
<group>
<field name="tipo_contrato"/>
<field name="tipo_contrato"/>
<field name="tipo_trabajador"/>
<field name="sub_tipo_trabajador"/>
<field name="AltoRiegoPension"/>
@ -266,7 +273,7 @@
<!-- <field name="banco"/> -->
<field name="tipo_cuenta"/>
<!-- <field name="numero_cuenta"/> -->
</group>
</xpath>
</field>
</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>