|
@@ -0,0 +1,485 @@
|
|
|
+(function() {
|
|
|
+
|
|
|
+ var QWeb = openerp.web.qweb;
|
|
|
+ openerp.widgetInstance = null;
|
|
|
+ openerp.PayslipAdvancement = {};
|
|
|
+
|
|
|
+ openerp.PayslipAdvancement = openerp.Widget.extend({
|
|
|
+ template: 'payslip_add.AdvancementWidget',
|
|
|
+ id: undefined,
|
|
|
+ row_id_select: undefined,
|
|
|
+ row_code_select: undefined,
|
|
|
+ hrPayslip: [],
|
|
|
+ payslipLine: [],
|
|
|
+ salaryRule: [],
|
|
|
+
|
|
|
+ /* init */
|
|
|
+ init: function (parent) {
|
|
|
+ this._super(parent);
|
|
|
+ },
|
|
|
+ /* Start */
|
|
|
+ start: function () {
|
|
|
+ var self = this;
|
|
|
+ var addFaults = this.$el.find('.add-advancement');
|
|
|
+ var editFaults = this.$el.find('.edit-advancement');
|
|
|
+ var refreshFaults = this.$el.find('.refresh-advancement');
|
|
|
+ // create
|
|
|
+ addFaults.click(function() {
|
|
|
+ self.fetchAddAdvancement();
|
|
|
+ });
|
|
|
+ // Edit/ unlink
|
|
|
+ editFaults.click(function() {
|
|
|
+ self.fetchModifyAdvancement();
|
|
|
+ });
|
|
|
+ // Update
|
|
|
+ refreshFaults.click(function() {
|
|
|
+ self.fetchRecomputeSheet();
|
|
|
+ })
|
|
|
+ },
|
|
|
+ /* Actualizar ID */
|
|
|
+ updateId: function(id) {
|
|
|
+ var self = this;
|
|
|
+ self.id = id;
|
|
|
+ },
|
|
|
+ /* Description: Recargar el Widget */
|
|
|
+ reloadLine: function() {
|
|
|
+ openerp.parentInstance.reload();
|
|
|
+ },
|
|
|
+ /* Description: Función para recalcular las faltas */
|
|
|
+ recomputeSheet: function() {
|
|
|
+ var self = this;
|
|
|
+ var defer = $.Deferred();
|
|
|
+ var recomputePayslip = new openerp.web.Model('hr.payslip');
|
|
|
+
|
|
|
+ recomputePayslip.call('recompute_sheet',[ self.id ], {
|
|
|
+ context: new openerp.web.CompoundContext()
|
|
|
+ }).then(function(results) {
|
|
|
+ defer.resolve(results);
|
|
|
+ });
|
|
|
+
|
|
|
+ return defer;
|
|
|
+ },
|
|
|
+ /* Description: Función para remover el modal */
|
|
|
+ removeModal: function() {
|
|
|
+ $('.expired-account-modal').remove();
|
|
|
+ $('.modal-backdrop').remove();
|
|
|
+ },
|
|
|
+ /* Description: destroy objects*/
|
|
|
+ destroyObjects: function(){
|
|
|
+ var self = this;
|
|
|
+
|
|
|
+ self.row_id_select = undefined;
|
|
|
+ self.row_code_select = undefined;
|
|
|
+ self.hrPayslip = [];
|
|
|
+ self.payslipLine = [];
|
|
|
+ self.salaryRule = [];
|
|
|
+ },
|
|
|
+ /* ---------------------------------------------------------------------
|
|
|
+ ** Description : Crear Adealnto/ comision de Funcionario
|
|
|
+ ** -------------------------------------------------------------------*/
|
|
|
+ /* Description: Funcion Inicial Crear Comicion/Adelanto */
|
|
|
+ fetchAddAdvancement: function() {
|
|
|
+ var self = this;
|
|
|
+
|
|
|
+ self.fetchPayslip().then(function(hrPayslip) {
|
|
|
+ return hrPayslip;
|
|
|
+ }).then(function(hrPayslip) {
|
|
|
+ self.hrPayslip = hrPayslip;
|
|
|
+ return self.fetchPayslipLine();
|
|
|
+ }).then(function(payslipLine) {
|
|
|
+ self.payslipLine = payslipLine;
|
|
|
+ return self.fetchSalaryRule();
|
|
|
+ }).then(function(salaryRule) {
|
|
|
+ self.salaryRule = salaryRule;
|
|
|
+ return self.showPayslipAddAdvancement();
|
|
|
+ }).then(function() {
|
|
|
+ return self.recomputeSheet();
|
|
|
+ }).then(function() {
|
|
|
+ return self.reloadLine();
|
|
|
+ }).then(function() {
|
|
|
+ return self.destroyObjects();
|
|
|
+ });
|
|
|
+ },
|
|
|
+ /* Description : Consultar Payslip */
|
|
|
+ fetchPayslip: function() {
|
|
|
+ var self = this;
|
|
|
+ var payslip = new openerp.web.Model('hr.payslip');
|
|
|
+ return payslip.query(['name', 'employee_id', 'number']).filter([['id', '=', self.id]]).all();
|
|
|
+ },
|
|
|
+ /* Description: Consultar payslip Line (hr.payslip.line) */
|
|
|
+ fetchPayslipLine: function() {
|
|
|
+ var self = this;
|
|
|
+ var fields = ['id', 'name', 'code', 'slip_id', 'amount', 'employee_id'];
|
|
|
+ var domain = [['code', '=', 'NET'],['slip_id', '=', self.id]];
|
|
|
+ var payslipLine = new openerp.web.Model('hr.payslip.line');
|
|
|
+ return payslipLine.query(fields).filter(domain).all();
|
|
|
+ },
|
|
|
+ /* Description: Consulta Reglas Salarial (ADL CMS)*/
|
|
|
+ fetchSalaryRule: function() {
|
|
|
+ var salaryRule = new openerp.web.Model('hr.salary.rule');
|
|
|
+ return salaryRule.query(['name','code']).filter([['code','in',['ADL','CMS']]]).all();
|
|
|
+ },
|
|
|
+ /* Description: Modal crear Adealnto/ comision de Funcionario */
|
|
|
+ showPayslipAddAdvancement: function() {
|
|
|
+ var self = this;
|
|
|
+ var payslipLine = self.payslipLine.shift();
|
|
|
+ var hrPayslip = self.hrPayslip.shift();
|
|
|
+ var defer = $.Deferred()
|
|
|
+
|
|
|
+ var employeData = [
|
|
|
+ {
|
|
|
+ 'employe_name': hrPayslip.employee_id[1],
|
|
|
+ 'salari': payslipLine.amount
|
|
|
+ }
|
|
|
+ ];
|
|
|
+
|
|
|
+ var modalAdvancement = QWeb.render('EiruPayslipAddAdvancement',{
|
|
|
+ employeData: employeData,
|
|
|
+ salaryRule: self.salaryRule
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
+ $('.openerp_webclient_container').after(modalAdvancement);
|
|
|
+ $('.expired-account-modal').modal();
|
|
|
+
|
|
|
+ /* Close modal */
|
|
|
+ $('.expired-account-modal').on('hidden.bs.modal', function (e) {
|
|
|
+ defer.resolve(true);
|
|
|
+ self.removeModal(e);
|
|
|
+ });
|
|
|
+
|
|
|
+ var salary_rule = $('.expired-account-modal').find('.salary-rule');
|
|
|
+ var details = $('.expired-account-modal').find('.advancement-details');
|
|
|
+ var ammount_input = $('.expired-account-modal').find('.advancement-amount');
|
|
|
+ var addAdvancement = $('.expired-account-modal').find('.add-advancement');
|
|
|
+
|
|
|
+ addAdvancement.click(function(e){
|
|
|
+ /* Operacion */
|
|
|
+ if (!salary_rule.val()) {
|
|
|
+ openerp.web.notification.do_warn("Atención","Seleccione el tipo de operación.");
|
|
|
+ salary_rule.css('border-color','red');
|
|
|
+ return
|
|
|
+ } else {
|
|
|
+ salary_rule.css('border-color','#ccc');
|
|
|
+ }
|
|
|
+ /* Detalles */
|
|
|
+ if (!details.val()) {
|
|
|
+ openerp.web.notification.do_warn("Atención","Defina una descripción para la operación.");
|
|
|
+ details.css('border-color','red');
|
|
|
+ return
|
|
|
+ } else {
|
|
|
+ details.css('border-color','#ccc');
|
|
|
+ }
|
|
|
+ /* Importe */
|
|
|
+ if (ammount_input.val() <= 0) {
|
|
|
+ openerp.web.notification.do_warn("Atención","El importe de la operación no debe ser meno o igual 0 (cero).");
|
|
|
+ ammount_input.css('border-color','red');
|
|
|
+ return
|
|
|
+ } else {
|
|
|
+ ammount_input.css('border-color','#ccc');
|
|
|
+ }
|
|
|
+
|
|
|
+ var payslip = new openerp.web.Model('hr.payslip');
|
|
|
+ var amount = parseInt(ammount_input.val());
|
|
|
+
|
|
|
+ if (amount > payslipLine.amount && salary_rule.val() === "ADL"){
|
|
|
+ openerp.web.notification.do_warn("Atención","El Importe del Adelanto no puede superar el Sueldo Neto.");
|
|
|
+ ammount_input.focus();
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if (salary_rule.val() === "ADL") {
|
|
|
+ amount = parseInt(ammount_input.val() * -1);
|
|
|
+ } else {
|
|
|
+ amount = parseInt(ammount_input.val());
|
|
|
+ }
|
|
|
+
|
|
|
+ payslip.call('create_payslip_input',
|
|
|
+ [
|
|
|
+ {
|
|
|
+ id: self.id,
|
|
|
+ salary_rule: salary_rule.val(),
|
|
|
+ details: details.val(),
|
|
|
+ ammount_input: amount
|
|
|
+ }
|
|
|
+ ],{
|
|
|
+ context: new openerp.web.CompoundContext()
|
|
|
+ }).then(function(results) {
|
|
|
+ defer.resolve(results)
|
|
|
+ });
|
|
|
+ self.removeModal(e);
|
|
|
+ });
|
|
|
+ /* Camobio en el Importe */
|
|
|
+ ammount_input.change(function() {
|
|
|
+ if (ammount_input.val() > payslipLine.amount && salary_rule.val() === "ADL"){
|
|
|
+ openerp.web.notification.do_warn("Atención","El Importe del adelanto no puede superar el sueldo Neto.");
|
|
|
+ ammount_input.focus();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ return defer;
|
|
|
+ },
|
|
|
+ /* ---------------------------------------------------------------------
|
|
|
+ ** Description: Recalcular Nominas
|
|
|
+ ** -------------------------------------------------------------------*/
|
|
|
+ fetchRecomputeSheet: function() {
|
|
|
+ var self = this;
|
|
|
+ self.$el.find('.refresh-advancement').attr("disabled", true);
|
|
|
+ self.recomputeSheet().then(function(results) {
|
|
|
+ return results;
|
|
|
+ }).then(function() {
|
|
|
+ self.$el.find('.refresh-advancement').removeAttr("disabled");
|
|
|
+ self.reloadLine();
|
|
|
+ });
|
|
|
+ },
|
|
|
+ /* ---------------------------------------------------------------------
|
|
|
+ ** Description: Editar/Remover Faltas
|
|
|
+ ** -------------------------------------------------------------------*/
|
|
|
+ /* Description: Funcion Inicial Modify/Unlink Faltas*/
|
|
|
+ fetchModifyAdvancement: function() {
|
|
|
+ var self = this;
|
|
|
+ self.fetchPayslipInput().then(function(payslipInput) {
|
|
|
+ return payslipInput;
|
|
|
+ }).then(function(payslipInput) {
|
|
|
+ self.payslipInput = payslipInput;
|
|
|
+ return self.fetchSalaryRule();
|
|
|
+ }).then(function(salaryRule) {
|
|
|
+ self.salaryRule = salaryRule;
|
|
|
+ return self.joinInputSalari();
|
|
|
+ }).then(function(inputSalari) {
|
|
|
+ self.inputSalari = inputSalari;
|
|
|
+ return self.fetchPayslipLine();
|
|
|
+ }).then(function(payslipLine) {
|
|
|
+ self.payslipLine =payslipLine;
|
|
|
+ return self.fetchPayslip();
|
|
|
+ }).then(function(hrPayslip) {
|
|
|
+ self.hrPayslip = hrPayslip;
|
|
|
+ return self.showModifyAdvancement();
|
|
|
+ }).then(function() {
|
|
|
+ return self.destroyObjects();
|
|
|
+ });
|
|
|
+ },
|
|
|
+ /* Description: COnsultar Payslip Input (hr.payslip.input)*/
|
|
|
+ fetchPayslipInput: function(){
|
|
|
+ var self = this;
|
|
|
+ var fields =['id','name', 'code', 'amount'];
|
|
|
+ var domain = [['payslip_id', '=', self.id]];
|
|
|
+ var hrPayslipInput = new openerp.web.Model('hr.payslip.input');
|
|
|
+ return hrPayslipInput.query(fields).filter(domain).all();
|
|
|
+ },
|
|
|
+ /* Description: Unir payslip_input con salary_rule*/
|
|
|
+ joinInputSalari: function() {
|
|
|
+ var self = this;
|
|
|
+ var defer =$.Deferred();
|
|
|
+ var inputSalari = [];
|
|
|
+ var rule;
|
|
|
+
|
|
|
+ _.each(self.payslipInput, function(item) {
|
|
|
+ rule = self.getSalaryRule(item.code).shift();
|
|
|
+ if (!rule){
|
|
|
+ rule = {};
|
|
|
+ rule.name= item.code;
|
|
|
+ }
|
|
|
+ var amount = item.amount;
|
|
|
+ if (item.code === 'ADL'){
|
|
|
+ amount = (item.amount * -1);
|
|
|
+ }
|
|
|
+
|
|
|
+ inputSalari.push(
|
|
|
+ {
|
|
|
+ 'id': item.id,
|
|
|
+ 'name': item.name,
|
|
|
+ 'code': item.code,
|
|
|
+ 'amount': amount,
|
|
|
+ 'input_name': rule.name
|
|
|
+ }
|
|
|
+ );
|
|
|
+ });
|
|
|
+ defer.resolve(inputSalari);
|
|
|
+ return defer;
|
|
|
+ },
|
|
|
+ /* Description : Filtar Salary_rule por code*/
|
|
|
+ getSalaryRule: function(code) {
|
|
|
+ var self = this;
|
|
|
+ return _.filter(self.salaryRule, function(filter) {
|
|
|
+ return filter.code === code;
|
|
|
+ });
|
|
|
+ },
|
|
|
+ /* Description: Modal para la Modificacion de Adelanto y faltas*/
|
|
|
+ showModifyAdvancement: function() {
|
|
|
+ var self = this;
|
|
|
+ var defer = $.Deferred();
|
|
|
+ var row_modify;
|
|
|
+ var payslipLine = self.payslipLine.shift();
|
|
|
+ var hrPayslip = self.hrPayslip.shift();
|
|
|
+
|
|
|
+ if (self.inputSalari.length === 0) {
|
|
|
+ openerp.web.notification.do_warn("Atención","No existe registro para modificar");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ var employeData = [{
|
|
|
+ employe_name: hrPayslip.employee_id[1],
|
|
|
+ salari: payslipLine.amount
|
|
|
+ }]
|
|
|
+ var modalModifyAdvancement = QWeb.render('EiruPayslipModifyAdvancement', {
|
|
|
+ inputData: self.inputSalari,
|
|
|
+ employeData: employeData
|
|
|
+ });
|
|
|
+ $('.openerp_webclient_container').after(modalModifyAdvancement);
|
|
|
+ $('.expired-account-modal').modal();
|
|
|
+
|
|
|
+ var descript_input = $('.expired-account-modal').find('.advancement-details-modify');
|
|
|
+ var amount_input = $('.expired-account-modal').find('.advancement-amount-modify');
|
|
|
+ var buttonUpdate = $('.expired-account-modal').find('.modify-advancement');
|
|
|
+ var unlinkAdvancement = $('.expired-account-modal').find('.unlink-advancement');
|
|
|
+ var tableRow = $('.expired-account-modal').find('.table-tbody').find('tr');
|
|
|
+ buttonUpdate.attr("disabled", true);
|
|
|
+ $('.expired-account-modal').on('hidden.bs.modal', function (e) {
|
|
|
+ defer.resolve('salir');
|
|
|
+ self.removeModal(e);
|
|
|
+ });
|
|
|
+ /* Seleccionar fila */
|
|
|
+ tableRow.click(function (e) {
|
|
|
+ row_modify = $(e.target);
|
|
|
+ if (($(e.target).index() === 5) || ($(e.target).index() === 0))
|
|
|
+ return;
|
|
|
+
|
|
|
+ tableRow.removeClass('table-row-select');
|
|
|
+ $(e.target).closest('tr').addClass('table-row-select');
|
|
|
+ /* Cargar Campo Description y importe */
|
|
|
+ descript_input.val(($(e.target).closest('tr').children()[3].textContent).trim());
|
|
|
+ amount_input.val(parseInt($(e.target).closest('tr').children()[4].textContent));
|
|
|
+ // Actualizar el Id de elemento seleccionado
|
|
|
+ self.row_id_select = parseInt($(e.target).closest('tr').children()[0].textContent);
|
|
|
+ self.row_code_select = ($(e.target).closest('tr').children()[1].textContent).trim();
|
|
|
+ // Habilitar botón modificar
|
|
|
+ buttonUpdate.removeAttr("disabled");
|
|
|
+ descript_input.focus();
|
|
|
+ });
|
|
|
+ /* Click botón Modificar */
|
|
|
+ buttonUpdate.click(function() {
|
|
|
+ if (!descript_input.val()) {
|
|
|
+ openerp.web.notification.do_warn("Atención","Definir un motivo de la falta .");
|
|
|
+ descript_input.css('border-color','red');
|
|
|
+ descript_input.focus();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ descript_input.css('border-color','#ccc');
|
|
|
+ if (amount_input.val() <= 0) {
|
|
|
+ openerp.web.notification.do_warn("Atención","Días no trabajado, debe ser mayor que 0.");
|
|
|
+ amount_input.css('border-color','red');
|
|
|
+ amount_input.focus();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (amount_input.val() > payslipLine.amount && self.row_code_select === 'ADL') {
|
|
|
+ openerp.web.notification.do_warn("Atención","El Importe del Adelanto no puede superar el Sueldo Neto.");
|
|
|
+ amount_input.css('border-color','red');
|
|
|
+ amount_input.focus();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ amount_input.css('border-color','#ccc');
|
|
|
+ /* Actualizar Adelanto / comision */
|
|
|
+ self.writePayslipAdvancement(descript_input.val(), amount_input.val()).then(function(results){
|
|
|
+ return results;
|
|
|
+ }).then(function() {
|
|
|
+ return self.recomputeSheet();
|
|
|
+ }).then(function() {
|
|
|
+ return self.reloadLine();
|
|
|
+ }).then(function(reload) {
|
|
|
+ defer.resolve(reload);
|
|
|
+ });
|
|
|
+ row_modify.closest('tr').children()[3].textContent = descript_input.val();
|
|
|
+ row_modify.closest('tr').children()[4].textContent = amount_input.val();
|
|
|
+ descript_input.val("");
|
|
|
+ amount_input.val(0);
|
|
|
+ buttonUpdate.attr("disabled", true);
|
|
|
+ });
|
|
|
+ /* Click boton Unlink/ Eliminar */
|
|
|
+ unlinkAdvancement.click(function(e) {
|
|
|
+ var unlink_row = parseInt($(e.target).closest('td').closest('tr').children()[0].textContent);
|
|
|
+ self.unlinkPayslipAdvancement(unlink_row).then(function(results) {
|
|
|
+ return results;
|
|
|
+ }).then(function() {
|
|
|
+ return self.recomputeSheet();
|
|
|
+ }).then(function() {
|
|
|
+ return self.reloadLine();
|
|
|
+ }).then(function(reload) {
|
|
|
+ defer.resolve(reload);
|
|
|
+ });
|
|
|
+ $(e.target).closest('td').closest('tr').remove();
|
|
|
+ })
|
|
|
+ return defer
|
|
|
+ },
|
|
|
+ /* Description: Funcion para Actualizar Adlanto / comision*/
|
|
|
+ writePayslipAdvancement: function(description, amount_input) {
|
|
|
+ var self = this;
|
|
|
+ var defer = $.Deferred();
|
|
|
+ var payslip = new openerp.web.Model('hr.payslip')
|
|
|
+ var amount = amount_input;
|
|
|
+ if (self.row_code_select === "ADL")
|
|
|
+ amount = (amount_input * -1);
|
|
|
+
|
|
|
+ payslip.call('write_payslip_input', [
|
|
|
+ {
|
|
|
+ 'id': self.id,
|
|
|
+ 'input_id': self.row_id_select,
|
|
|
+ 'descript_input': description,
|
|
|
+ 'amount_input': amount
|
|
|
+ }
|
|
|
+ ], {
|
|
|
+ context : new openerp.web.CompoundContext()
|
|
|
+ }).then(function(results) {
|
|
|
+ defer.resolve(results);
|
|
|
+ });
|
|
|
+
|
|
|
+ return defer;
|
|
|
+ },
|
|
|
+ /* Description: Eliminar Adelanto /comision*/
|
|
|
+ unlinkPayslipAdvancement: function(input_id) {
|
|
|
+ var self = this;
|
|
|
+ var defer = $.Deferred();
|
|
|
+ var payslip = new openerp.web.Model('hr.payslip');
|
|
|
+ payslip.call('unlink_payslip_input',[{
|
|
|
+ 'id': self.id,
|
|
|
+ 'input_id': input_id
|
|
|
+ }], {
|
|
|
+ context: new openerp.web.CompoundContext()
|
|
|
+ }).then(function(results){
|
|
|
+ defer.resolve(results)
|
|
|
+ });
|
|
|
+ return defer;
|
|
|
+ },
|
|
|
+ });
|
|
|
+
|
|
|
+ if (openerp.web && openerp.web.FormView) {
|
|
|
+ openerp.web.FormView.include({
|
|
|
+ load_record: function(record) {
|
|
|
+ this._super.apply(this, arguments);
|
|
|
+
|
|
|
+ if (this.model !== 'hr.payslip')
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (this.$el.find('.oe_form_sheet.oe_form_sheet_width').closest('.modal-content.openerp').length !== 0)
|
|
|
+ return;
|
|
|
+
|
|
|
+ openerp.parentInstance = this;
|
|
|
+
|
|
|
+ if (openerp.widgetInstance) {
|
|
|
+ openerp.widgetInstance.updateId(record.id);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this.$el.find('.payslip-add-advancement').length !== 0 )
|
|
|
+ return;
|
|
|
+
|
|
|
+ openerp.widgetInstance = new openerp.PayslipAdvancement(this);
|
|
|
+
|
|
|
+ var elemento = this.$el.find('.oe_notebook_page');
|
|
|
+ elemento = elemento.find('.payslip-utility-add-advancement');
|
|
|
+
|
|
|
+ openerp.widgetInstance.appendTo(elemento);
|
|
|
+ openerp.widgetInstance.updateId(record.id);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+})();
|