Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4b3532746b |
@ -1,4 +1,5 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
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
|
||||
'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
125
tabla_nomina/data/data.xml
Executable file → Normal 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>
|
||||
|
||||
|
||||
|
||||
385
tabla_nomina/models/models.py
Executable file → Normal file
385
tabla_nomina/models/models.py
Executable file → Normal 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,25 +546,75 @@ 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/"
|
||||
valores = self.env['tabla_nomina.tabla_nomina'].search([('name', '=', 'Nómina electrónica')])
|
||||
response2={}
|
||||
valores_lineas = valores.mp_id
|
||||
send = {}
|
||||
send = {}
|
||||
for linea in valores_lineas:
|
||||
if linea.codigo:
|
||||
if linea.dias == True:
|
||||
@ -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")
|
||||
@ -540,4 +864,7 @@ class nomina_hr_contract(models.Model):
|
||||
# if valores[k]:
|
||||
# if not k == "name":
|
||||
# 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
|
||||
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" -->
|
||||
<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>
|
||||
|
||||
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