Explorar o código

[ADD] Crear, modificar, eliminar Adelanto y comisiones

adrielso %!s(int64=7) %!d(string=hai) anos
pai
achega
d55af0bd78

+ 2 - 1
__openerp__.py

@@ -9,13 +9,14 @@ Mejorar usabilidad en la nómina del empleado (Adelantos/Faltas)
 	""",
     'author': 'Adrielso Kunert',
     'category': 'hr',
-    'depends': ['hr', 'account', 'base', 'hr_payroll'],
+    'depends': ['hr', 'base', 'hr_payroll'],
     'data': [
         'views/templates.xml',
         'views/eiru_payslip_utility.xml',
     ],
     'qweb': [
         'static/src/xml/*.xml',
+        'static/src/xml/modal/*.xml',
     ],
 
     'installable': True,

+ 110 - 34
i18n/es_PY.po

@@ -6,8 +6,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Odoo Server 8.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-10-25 14:59+0000\n"
-"PO-Revision-Date: 2017-10-25 12:01-0300\n"
+"POT-Creation-Date: 2017-10-27 18:30+0000\n"
+"PO-Revision-Date: 2017-10-27 15:32-0300\n"
 "Last-Translator: <>\n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
@@ -19,31 +19,46 @@ msgstr ""
 
 #. module: eiru_payslip_utility
 #. openerp-web
-#: code:addons/eiru_payslip_utility/static/src/xml/modal_payslip_add_faults.xml:32
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_add_advancement.xml:10
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_modify_advancement.xml:10
 #, python-format
-msgid "Adicionar"
-msgstr "Adicionar"
+msgid "Advancement - Commission"
+msgstr "Adelanto - Comisión"
 
 #. module: eiru_payslip_utility
-#. openerp-web
-#: code:addons/eiru_payslip_utility/static/src/xml/modal_payslip_add_faults.xml:39
-#, python-format
-msgid "Cancelar"
-msgstr "Cancelar"
+#: view:hr.payslip:eiru_payslip_utility.view_payslip_utility_add
+msgid "Advancent - Commission"
+msgstr "Adelanto - Comisión"
 
 #. module: eiru_payslip_utility
 #. openerp-web
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_add_faults.xml:32
+#: code:addons/eiru_payslip_utility/static/src/xml/payslip_add_advancement.xml:11
 #: code:addons/eiru_payslip_utility/static/src/xml/payslip_add_faults.xml:11
 #, python-format
 msgid "Crear"
 msgstr "Crear"
 
+#. module: eiru_payslip_utility
+#. openerp-web
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_add_faults.xml:10
+#, python-format
+msgid "Crear falta  de funcionario"
+msgstr "Crear falta  de funcionario"
+
+#. module: eiru_payslip_utility
+#. openerp-web
+#: code:addons/eiru_payslip_utility/static/src/xml/payslip_add_advancement.xml:9
+#, python-format
+msgid "Crear un nuevo adelanto o una comisión"
+msgstr "Crear un nuevo adelanto o una comisión"
+
 #. module: eiru_payslip_utility
 #. openerp-web
 #: code:addons/eiru_payslip_utility/static/src/xml/payslip_add_faults.xml:9
 #, python-format
-msgid "Crear nueva falta de funcionario"
-msgstr "Crear nueva falta de funcionario"
+msgid "Crear una nueva falta del funcionario"
+msgstr "Crear una nueva falta del funcionario"
 
 #. module: eiru_payslip_utility
 #: view:hr.payslip:eiru_payslip_utility.view_payslip_utility_add
@@ -52,15 +67,25 @@ msgstr "Días no trabajados"
 
 #. module: eiru_payslip_utility
 #. openerp-web
-#: code:addons/eiru_payslip_utility/static/src/xml/modal_payslip_add_faults.xml:23
-#: code:addons/eiru_payslip_utility/static/src/xml/modal_payslip_modify_faults.xml:22
-#: code:addons/eiru_payslip_utility/static/src/xml/modal_payslip_modify_faults.xml:44
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_add_advancement.xml:35
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_modify_advancement.xml:31
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_modify_advancement.xml:58
+#, python-format
+msgid "Descripción"
+msgstr "Descripción"
+
+#. module: eiru_payslip_utility
+#. openerp-web
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_add_faults.xml:23
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_modify_faults.xml:22
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_modify_faults.xml:44
 #, python-format
 msgid "Días no trabajado"
 msgstr "Días no trabajado"
 
 #. module: eiru_payslip_utility
 #. openerp-web
+#: code:addons/eiru_payslip_utility/static/src/xml/payslip_add_advancement.xml:15
 #: code:addons/eiru_payslip_utility/static/src/xml/payslip_add_faults.xml:15
 #, python-format
 msgid "Editar/Eliminar"
@@ -68,40 +93,65 @@ msgstr "Editar/Eliminar"
 
 #. module: eiru_payslip_utility
 #. openerp-web
-#: code:addons/eiru_payslip_utility/static/src/xml/modal_payslip_modify_faults.xml:31
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_modify_faults.xml:10
 #, python-format
-msgid "Modificar"
-msgstr "Modificar"
+msgid "Faltas de funcionario"
+msgstr "Faltas de funcionario"
+
+#. module: eiru_payslip_utility
+#. openerp-web
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_add_advancement.xml:20
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_modify_advancement.xml:18
+#, python-format
+msgid "Funcionario"
+msgstr "Funcionario"
 
 #. module: eiru_payslip_utility
 #. openerp-web
-#: code:addons/eiru_payslip_utility/static/src/xml/modal_payslip_modify_faults.xml:10
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_add_advancement.xml:60
 #, python-format
-msgid "Modificar / Eliminar faltas"
-msgstr "Modificar / Eliminar faltas"
+msgid "Guardar"
+msgstr "Guardar"
+
+#. module: eiru_payslip_utility
+#. openerp-web
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_add_advancement.xml:38
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_modify_advancement.xml:34
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_modify_advancement.xml:59
+#, python-format
+msgid "Importe"
+msgstr "Importe"
+
+#. module: eiru_payslip_utility
+#. openerp-web
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_modify_advancement.xml:44
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_modify_faults.xml:31
+#, python-format
+msgid "Modificar"
+msgstr "Modificar"
 
 #. module: eiru_payslip_utility
 #. openerp-web
 #: code:addons/eiru_payslip_utility/static/src/xml/payslip_add_faults.xml:13
 #, python-format
-msgid "Modificar o eliminarfalta de funcionario"
-msgstr "Modificar o eliminarfalta de funcionario"
+msgid "Modificar u eliminar las falta del funcionario"
+msgstr "Modificar u eliminar las falta del funcionario"
 
 #. module: eiru_payslip_utility
 #. openerp-web
-#: code:addons/eiru_payslip_utility/static/src/xml/modal_payslip_add_faults.xml:20
-#: code:addons/eiru_payslip_utility/static/src/xml/modal_payslip_modify_faults.xml:19
-#: code:addons/eiru_payslip_utility/static/src/xml/modal_payslip_modify_faults.xml:43
+#: code:addons/eiru_payslip_utility/static/src/xml/payslip_add_advancement.xml:13
 #, python-format
-msgid "Motivo de la falta"
-msgstr "Motivo de la falta"
+msgid "Modificar u eliminar los adelantos o las comisiones"
+msgstr "Modificar u eliminar los adelantos o las comisiones"
 
 #. module: eiru_payslip_utility
 #. openerp-web
-#: code:addons/eiru_payslip_utility/static/src/xml/modal_payslip_add_faults.xml:10
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_add_faults.xml:20
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_modify_faults.xml:19
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_modify_faults.xml:43
 #, python-format
-msgid "Nueva falta de funcionario"
-msgstr "Nueva falta de funcionario"
+msgid "Motivo de la falta"
+msgstr "Motivo de la falta"
 
 #. module: eiru_payslip_utility
 #: model:ir.model,name:eiru_payslip_utility.model_hr_payslip
@@ -112,12 +162,38 @@ msgstr "Nómina"
 #. openerp-web
 #: code:addons/eiru_payslip_utility/static/src/xml/payslip_add_faults.xml:6
 #, python-format
-msgid "Recalcular las falta del funcionario"
-msgstr "Recalcular las falta del funcionario"
+msgid "Recalcular las faltas del funcionario"
+msgstr "Recalcular las faltas del funcionario"
 
 #. module: eiru_payslip_utility
 #. openerp-web
-#: code:addons/eiru_payslip_utility/static/src/xml/modal_payslip_modify_faults.xml:67
+#: code:addons/eiru_payslip_utility/static/src/xml/payslip_add_advancement.xml:6
+#, python-format
+msgid "Recalcular los adelanto y las comisiones"
+msgstr "Recalcular los adelanto y las comisiones"
+
+#. module: eiru_payslip_utility
+#. openerp-web
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_add_advancement.xml:61
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_add_faults.xml:39
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_modify_advancement.xml:83
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_modify_faults.xml:67
 #, python-format
 msgid "Salir"
 msgstr "Salir"
+
+#. module: eiru_payslip_utility
+#. openerp-web
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_add_advancement.xml:24
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_modify_advancement.xml:22
+#, python-format
+msgid "Sueldo neto"
+msgstr "Sueldo neto"
+
+#. module: eiru_payslip_utility
+#. openerp-web
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_add_advancement.xml:32
+#: code:addons/eiru_payslip_utility/static/src/xml/modal/modal_payslip_modify_advancement.xml:57
+#, python-format
+msgid "Tipo de Operación"
+msgstr "Tipo de Operación"

+ 107 - 18
model/payslip_faults.py

@@ -5,34 +5,82 @@ from openerp.exceptions import except_orm
 
 class HrPayslip(models.Model):
     _inherit = 'hr.payslip'
-
+    #Recalcular las lineas de la nomina
     @api.model
     def recompute_sheet(self, values):
         payslip = self.env['hr.payslip'].browse(values)
+        # Faltas de Funcionario
         payslip_worked = self.env['hr.payslip.worked_days'].search([('payslip_id', '=' ,payslip.id),('code', '=', 'FALTAS')])
-        days = 0
+        # Adelanto
+        payslip_advancement = self.env['hr.payslip.input'].search([('payslip_id', '=' ,payslip.id),('code', '=', 'ADL')])
+        # Comision
+        payslip_commission = self.env['hr.payslip.input'].search([('payslip_id', '=' ,payslip.id),('code', '=', 'CMS')])
+
+        line_worked = None
+        line_advancent = None
+        line_commission = None
+
+        if payslip_worked:
+            days = 0
+            for worked in payslip_worked:
+                days = days + worked.number_of_days
+
+            worked_days = {
+                'name': 'Total Faltas',
+                'code': 'FALTAS',
+                'number_of_days': days,
+                'number_of_hours': 0,
+                'payslip_id': payslip.id,
+                'contract_id': payslip.contract_id.id,
+                'sequence': 15
+            }
 
-        for worked in payslip_worked:
-            days = days + worked.number_of_days
+            line_worked = self.env['hr.payslip.worked_days'].create(worked_days)
 
-        worked_days = {
-            'name': 'Faltas total',
-            'code': 'FALTAS',
-            'number_of_days': days,
-            'number_of_hours': 0,
-            'payslip_id': payslip.id,
-            'contract_id': payslip.contract_id.id,
-            'sequence': 10
-        }
+        if payslip_advancement:
+            amount = 0
+            for advancement in payslip_advancement:
+                amount = amount + advancement.amount
+
+            advancement_line = {
+                'name': "Total Adelantos",
+                'code': 'ADL',
+                'amount': amount,
+                'payslip_id': payslip.id,
+                'contract_id': payslip.contract_id.id,
+                'sequence': 15
+            }
+
+            line_advancent = self.env['hr.payslip.input'].create(advancement_line)
+
+        if payslip_commission:
+            amount = 0
+            for commission in payslip_commission:
+                amount = amount + commission.amount
+
+            commission_line = {
+                'name': "Total Adelantos",
+                'code': 'CMS',
+                'amount': amount,
+                'payslip_id': payslip.id,
+                'contract_id': payslip.contract_id.id,
+                'sequence': 15
+            }
 
-        line = self.env['hr.payslip.worked_days'].create(worked_days)
+            line_commission = self.env['hr.payslip.input'].create(commission_line)
 
         payslip.compute_sheet()
 
-        line.unlink()
+        if line_worked:
+            line_worked.unlink()
+        if line_advancent:
+            line_advancent.unlink()
+        if line_commission:
+            line_commission.unlink()
 
-        return True if payslip else False
 
+        return True if payslip else False
+    # Crear nueva falta
     @api.model
     def join_payslip_faults(self, values):
         payslip = self.env['hr.payslip'].browse(values['id'])
@@ -53,14 +101,14 @@ class HrPayslip(models.Model):
         recompute_sheet = self.recompute_sheet(values['id'])
 
         return True if recompute_sheet else False
-
+    # Eliminar falta
     @api.model
     def unlink_payslip_worked(self, values):
         worked_days = self.env['hr.payslip.worked_days'].search([('payslip_id', '=', values['id']),('id', '=', values['worked_id'])])
         unlink_work = worked_days.unlink()
 
         return True if unlink_work else False
-
+    # Modificar Falta
     @api.model
     def write_payslip_worked(self, values):
         worked_days = self.env['hr.payslip.worked_days'].search([('payslip_id', '=', values['id']),('id', '=', values['worked_id'])])
@@ -73,3 +121,44 @@ class HrPayslip(models.Model):
         worked_days.write(worked_update)
 
         return True if worked_days else False
+
+    # Crear Adelanto/comision
+    @api.model
+    def create_payslip_input(self,values):
+        payslip = self.env['hr.payslip'].browse(values['id'])
+        payslip_input = self.env['hr.payslip.input']
+
+        input_line = {
+            'name': values['details'],
+            'code': values['salary_rule'],
+            'amount': values['ammount_input'],
+            'contract_id': payslip.contract_id.id,
+            'sequence': 10,
+            'payslip_id': payslip.id
+        }
+
+        payslip_input.create(input_line)
+
+        return True if payslip_input else  False
+
+    # Eliminar Adelanto/Comision
+    @api.model
+    def unlink_payslip_input(self,values):
+        payslip_input =self.env['hr.payslip.input'].search([('id', '=', values['input_id']),('payslip_id', '=', values['id'])])
+        payslip_input.unlink()
+
+        return True if payslip_input else False
+
+    # Actualizar Aelanto Comision
+    @api.model
+    def write_payslip_input(self, values):
+        paylip_input = self.env['hr.payslip.input'].search([('payslip_id', '=', values['id']),('id', '=', values['input_id'])])
+
+        input_update = {
+            'name': values['descript_input'],
+            'amount': values['amount_input']
+        }
+
+        paylip_input.write(input_update)
+
+        return True if paylip_input else False

+ 61 - 5
static/src/css/style.css

@@ -5,6 +5,18 @@
     padding-bottom: 8px;
     font-size: 13px;
 }
+.detallis-employee-input {
+    width: calc(100% - 130px);
+    color: #ccc;
+}
+.detallis-employee-separator {
+    margin-top: 10px;
+    margin-bottom: 5px;
+}
+.detallis-employee-input.number {
+    text-align: right;
+    padding-right: 20px;
+}
 .faults-input {
     width: 100%;
 }
@@ -17,8 +29,8 @@
 .oe_stat_button.btn.btn-default.refresh-faults {
     width: 40px !important;
 }
-.fault-dialog {
-    z-index: 1050 !important;
+.oe_stat_button.btn.btn-default.refresh-advancement {
+    width: 40px !important;
 }
 /* table */
 .expired-account-modal .table-row-select {
@@ -63,7 +75,51 @@
 .expired-account-modal .payslip-table table thead tr th:nth-child(4){
     width: 20px;
 }
-/* alinear  tipo numérico */
-.table_number_align {
-    text-align: right !important;
+/*table-advancement*/
+/*id*/
+.expired-account-modal .payslip-table-advancement table tbody tr td:nth-child(1){
+    display: none;
+}
+.expired-account-modal table thead tr th:nth-child(1){
+    display: none;
+}
+/* code */
+.expired-account-modal .payslip-table-advancement table tbody tr td:nth-child(2){
+    display: none;
+}
+.expired-account-modal table thead tr th:nth-child(2){
+    display: none;
+}
+/* Tipo de Operacion  */
+.expired-account-modal .payslip-table-advancement table tbody tr td:nth-child(3){
+    width: 120px ;
+    padding-left: 20px;
+}
+.expired-account-modal .payslip-table-advancement table thead tr th:nth-child(3){
+    width: 120px;
+}
+/* Descriptcion */
+.expired-account-modal .payslip-table-advancement table tbody tr td:nth-child(4){
+    width: 538px ;
+    padding-left: 20px;
+}
+.expired-account-modal .payslip-table-advancement table thead tr th:nth-child(4){
+    width: 538px;
+}
+/* Importe */
+.expired-account-modal .payslip-table-advancement table tbody tr td:nth-child(5){
+    width: 160px ;
+    padding-right: 30px;
+    text-align: right;
+}
+.expired-account-modal .payslip-table-advancement table thead tr th:nth-child(5){
+    width: 160px;
+    text-align: center;
+}
+/* Eliminar */
+.expired-account-modal .payslip-table-advancement table tbody tr td:nth-child(6){
+    width: 20px ;
+}
+.expired-account-modal .payslip-table-advancement table thead tr th:nth-child(6){
+    width: 20px;
 }

+ 485 - 0
static/src/js/payslip_advancement.js

@@ -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);
+            }
+        });
+    }
+})();

+ 67 - 0
static/src/xml/modal/modal_payslip_add_advancement.xml

@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="EiruPayslipAddAdvancement">
+        <div class="modal in expired-account-modal payslip-advancement-add " tabindex="-1" role="dialog">
+            <div class="modal-dialog modal-lg" role="document">
+                <div class="modal-content openerp">
+                    <!-- title  -->
+                    <div class="modal-header">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="Close" aria-hidden="true">×</button>
+                        <h3 class="modal-title">
+                            Advancement - Commission
+                        </h3>
+                    </div>
+                    <!-- Body -->
+                    <div class="modal-body">
+                        <!-- Adicionar Falta-->
+                        <div>
+                            <div class="row" t-foreach="employeData" t-as="employee">
+                                <div class="col-xs-6">
+                                    <label class="detallis-employee-label">Funcionario</label>
+                                    <input class="detallis-employee-input" readonly="readonly" t-attf-value="{{ employee.employe_name }}"></input>
+                                </div>
+                                <div class="col-xs-6">
+                                    <label class="detallis-employee-label">Sueldo neto</label>
+                                    <input class="detallis-employee-input number" readonly="readonly" t-attf-value="{{ employee.salari }}"></input>
+                                </div>
+                            </div>
+                            <hr class="detallis-employee-separator"/>
+
+                            <div class="row">
+                                <div class="col-xs-2">
+                                    <label class="detallis-employee-label">Tipo de Operación</label>
+                                </div>
+                                <div class="col-xs-7">
+                                    <label class="detallis-employee-label">Descripción</label>
+                                </div>
+                                <div class="col-xs-3">
+                                    <label class="detallis-employee-label">Importe</label>
+                                </div>
+                                <div class="col-xs-2">
+                                    <select class="salary-rule faults-input">
+                                        <t t-foreach="salaryRule" t-as="salary">
+                                            <option t-attf-value="{{ salary_value.code }}" >
+                                                <t t-esc="salary_value.name"/>
+                                            </option>
+                                        </t>
+                                    </select>
+                                </div>
+                                <div class="col-xs-7 ">
+                                    <input class="faults-input advancement-details" autofocus="autofocus" ></input>
+                                </div>
+                                <div class="col-xs-3 ">
+                                    <input class="faults-input advancement-amount" type="number" value="0"  min="0"></input>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <!-- Pie de Pagina -->
+                    <div class="modal-footer payslip-footer">
+                        <button type="button" class="oe_button oe_form_button oe_highlight add-advancement">Guardar</button>
+                        <button type="button" class="oe_button oe_form_button oe_link dismmis-modal" data-dismiss="modal">Salir</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </t>
+</template>

+ 3 - 3
static/src/xml/modal_payslip_add_faults.xml → static/src/xml/modal/modal_payslip_add_faults.xml

@@ -8,7 +8,7 @@
                     <div class="modal-header">
                         <button type="button" class="close" data-dismiss="modal" aria-label="Close" aria-hidden="true">×</button>
                         <h3 class="modal-title">
-                            Nueva falta de funcionario
+                            Crear falta  de funcionario
                         </h3>
                     </div>
                     <!-- Body -->
@@ -29,14 +29,14 @@
                                     <input class="faults-input payslip-number-days" type="number" value="0"></input>
                                 </div>
                                 <div class="col-xs-2 payslip-faults">
-                                    <button type="button" class="oe_button oe_form_button oe_highlight add-faults">Adicionar</button>
+                                    <button type="button" class="oe_button oe_form_button oe_highlight add-faults">Crear</button>
                                 </div>
                             </div>
                         </div>
                     </div>
                     <!-- Pie de Pagina -->
                     <div class="modal-footer payslip-footer">
-                        <button type="button" class="oe_button oe_form_button oe_link dismmis-modal" data-dismiss="modal">Cancelar</button>
+                        <button type="button" class="oe_button oe_form_button oe_link dismmis-modal" data-dismiss="modal">Salir</button>
                     </div>
                 </div>
             </div>

+ 89 - 0
static/src/xml/modal/modal_payslip_modify_advancement.xml

@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="EiruPayslipModifyAdvancement">
+        <div class="modal in expired-account-modal" tabindex="-1" role="dialog">
+            <div class="modal-dialog modal-lg" role="document">
+                <div class="modal-content openerp">
+                    <!-- title  -->
+                    <div class="modal-header">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="Close" aria-hidden="true">×</button>
+                        <h3 class="modal-title">
+                            Advancement - Commission
+                        </h3>
+                    </div>
+                    <!-- Body -->
+                    <div class="modal-body">
+                        <div class="row" t-foreach="employeData" t-as="employee">
+                            <div class="col-xs-6">
+                                <label class="detallis-employee-label">Funcionario</label>
+                                <input class="detallis-employee-input" readonly="readonly" t-attf-value="{{ employee.employe_name }}"></input>
+                            </div>
+                            <div class="col-xs-6">
+                                <label class="detallis-employee-label">Sueldo neto</label>
+                                <input class="detallis-employee-input number" readonly="readonly" t-attf-value="{{ employee.salari }}"></input>
+                            </div>
+                        </div>
+                        <hr class="detallis-employee-separator"/>
+
+                        <div>
+                            <div class="row">
+                                <div class="col-xs-8">
+                                    <label class="detallis-employee-label">Descripción</label>
+                                </div>
+                                <div class="col-xs-2">
+                                    <label class="detallis-employee-label">Importe</label>
+                                </div>
+
+                                <div class="col-xs-8 payslip-faults">
+                                    <input class="faults-input advancement-details-modify"></input>
+                                </div>
+                                <div class="col-xs-2 payslip-faults">
+                                    <input class="faults-input advancement-amount-modify" type="number" value="0"></input>
+                                </div>
+                                <div class="col-xs-2 payslip-faults">
+                                    <button type="button" class="oe_button oe_form_button oe_highlight modify-advancement">Modificar</button>
+                                </div>
+                            </div>
+                        </div>
+                        <hr class="detallis-employee-separator"/>
+                        <!-- Table -->
+                        <div class=" oe_view_manager_body payslip-table-advancement">
+                            <div class="modal-head-wrapper-payslip">
+                                <table class="oe_list_content">
+                                    <thead >
+                                        <tr class="oe_list_header_columns"  >
+                                            <th class="oe_list_header_char oe_sortable"></th>
+                                            <th class="oe_list_header_char oe_sortable"></th>
+                                            <th class="oe_list_header_char oe_sortable">Tipo de Operación</th>
+                                            <th class="oe_list_header_char oe_sortable">Descripción</th>
+                                            <th class="oe_list_header_char oe_sortable">Importe</th>
+                                            <th class="oe_list_header_char oe_sortable"></th>
+                                        </tr>
+                                    </thead>
+                                </table>
+                            </div>
+                            <div class="modal-item-payslip">
+                                <table class="oe_list_content">
+                                    <tbody class="table-tbody">
+                                        <tr t-foreach="inputData" t-as="input">
+                                            <td><t t-esc="input_value.id"/></td>
+                                            <td><t t-esc="input_value.code"/></td>
+                                            <td><t t-esc="input_value.input_name"/></td>
+                                            <td><t t-esc="input_value.name"/></td>
+                                            <td><t t-esc="input_value.amount"/></td>
+                                            <td><div class="fa fa-trash unlink-advancement"></div></td>
+                                        </tr>
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+                    <!-- Pie de Pagina -->
+                    <div class="modal-footer payslip-footer">
+                        <button type="button" class="oe_button oe_form_button oe_link dismmis-modal" data-dismiss="modal">Salir</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </t>
+</template>

+ 1 - 1
static/src/xml/modal_payslip_modify_faults.xml → static/src/xml/modal/modal_payslip_modify_faults.xml

@@ -8,7 +8,7 @@
                     <div class="modal-header">
                         <button type="button" class="close" data-dismiss="modal" aria-label="Close" aria-hidden="true">×</button>
                         <h3 class="modal-title">
-                            Modificar / Eliminar faltas
+                            Faltas de funcionario
                         </h3>
                     </div>
                     <!-- Body -->

+ 19 - 0
static/src/xml/payslip_add_advancement.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<templates xml:space="preserve">
+    <t t-name="payslip_add.AdvancementWidget">
+        <div class="payslip-add-advancement">
+            <button class="oe_stat_button btn btn-default refresh-advancement" title="Recalcular los adelanto y las comisiones">
+                <div class="stat_button_icon fa fa-refresh"></div>
+            </button>
+            <button class="oe_stat_button btn btn-default add-advancement" title="Crear un nuevo adelanto o una comisión">
+                <div class="stat_button_icon fa fa-plus-square-o"></div>
+                <div>Crear</div>
+            </button>
+            <button class="oe_stat_button btn btn-default oe_inline edit-advancement" title="Modificar u eliminar los adelantos o las comisiones">
+                <div class="stat_button_icon fa fa-pencil-square-o"></div>
+                <div>Editar/Eliminar</div>
+            </button>
+        </div>
+  </t>
+</templates>

+ 3 - 3
static/src/xml/payslip_add_faults.xml

@@ -3,14 +3,14 @@
 <templates xml:space="preserve">
     <t t-name="payslip_add.FaultsWidget">
         <div class="payslip-add-faults">
-            <button class="oe_stat_button btn btn-default refresh-faults" title="Recalcular las falta del funcionario">
+            <button class="oe_stat_button btn btn-default refresh-faults" title="Recalcular las faltas del funcionario">
                 <div class="stat_button_icon fa fa-refresh"></div>
             </button>
-            <button class="oe_stat_button btn btn-default add-faults" title="Crear nueva falta de funcionario">
+            <button class="oe_stat_button btn btn-default add-faults" title="Crear una nueva falta del funcionario">
                 <div class="stat_button_icon fa fa-plus-square-o"></div>
                 <div>Crear</div>
             </button>
-            <button class="oe_stat_button btn btn-default oe_inline edit-faults" title="Modificar o eliminarfalta de funcionario">
+            <button class="oe_stat_button btn btn-default oe_inline edit-faults" title="Modificar u eliminar las falta del funcionario">
                 <div class="stat_button_icon fa fa-pencil-square-o"></div>
                 <div>Editar/Eliminar</div>
             </button>

+ 9 - 0
views/eiru_payslip_utility.xml

@@ -7,12 +7,21 @@
 			<field name="model">hr.payslip</field>
 			<field name="inherit_id" ref="hr_payroll.view_hr_payslip_form"/>
 			<field name="arch" type="xml">
+				<!-- faults -->
 				<field name="worked_days_line_ids" position="before">
 					<div class="payslip-utility-add-faults" attrs="{'invisible': [('state','!=','done')]}"></div>
 				</field>
 				<xpath expr="//separator[@string='Worked Days']"  position="replace">
 					<separator string="Days not worked"/>
 				</xpath>
+				<!-- Advancement payslip-->
+				<field name="input_line_ids" position="before">
+					<div class="payslip-utility-add-advancement" attrs="{'invisible': [('state','!=','done')]}"></div>
+				</field>
+				<xpath expr="//separator[@string='Other Inputs']"  position="replace">
+					<separator string="Advancent - Commission"/>
+				</xpath>
+
 			</field>
 		</record>
 	</data>

+ 1 - 0
views/templates.xml

@@ -4,6 +4,7 @@
             <xpath expr="." position="inside">
                 <link rel="stylesheet" href="/eiru_payslip_utility/static/src/css/style.css"/>
                 <script type="text/javascript" src="/eiru_payslip_utility/static/src/js/payslip_utility.js"/>
+                <script type="text/javascript" src="/eiru_payslip_utility/static/src/js/payslip_advancement.js"/>
             </xpath>
         </template>
     </data>