Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c71d7e6a7c |
@ -2,3 +2,4 @@
|
|||||||
|
|
||||||
from . import controllers
|
from . import controllers
|
||||||
from . import models
|
from . import models
|
||||||
|
from . import wizard
|
||||||
1
tabla_nomina/__manifest__.py
Executable file → Normal file
1
tabla_nomina/__manifest__.py
Executable file → Normal 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
125
tabla_nomina/data/data.xml
Executable file → Normal 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>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
379
tabla_nomina/models/models.py
Executable file → Normal file
379
tabla_nomina/models/models.py
Executable file → Normal 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,18 +546,68 @@ 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/"
|
||||||
@ -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")
|
||||||
@ -541,3 +865,6 @@ class nomina_hr_contract(models.Model):
|
|||||||
# 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
2
tabla_nomina/security/ir.model.access.csv
Executable file → Normal 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
|
||||||
|
13
tabla_nomina/views/views.xml
Executable file → Normal file
13
tabla_nomina/views/views.xml
Executable file → Normal 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>
|
||||||
|
|||||||
7
tabla_nomina/wizard/__init__.py
Normal file
7
tabla_nomina/wizard/__init__.py
Normal 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
|
||||||
60
tabla_nomina/wizard/wizard_message.py
Normal file
60
tabla_nomina/wizard/wizard_message.py
Normal 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,
|
||||||
|
}
|
||||||
|
|
||||||
30
tabla_nomina/wizard/wizard_message.xml
Normal file
30
tabla_nomina/wizard/wizard_message.xml
Normal 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>
|
||||||
Loading…
Reference in New Issue
Block a user