Forráskód Böngészése

[ADD] Payments IPSC

adrielso 6 éve
szülő
commit
7c20ca9811

+ 193 - 1
model/eiru_payslip_payments_ipse.py

@@ -74,7 +74,7 @@ class EiruHrPayslipRun(models.Model):
                         }
                     }
                 )
-                slip.company_id.currency_id
+                # slip.company_id.currency_id
         return slipEmployee
 
     ''' GET PAYSLIP RUN'''
@@ -294,3 +294,195 @@ class EiruHrPayslipRun(models.Model):
     '''  Process Reconciliation Payslip  '''
     def _eiru_payslip_process_reconciliation(self, statementLine, moveLine):
         return statementLine.process_reconciliation(moveLine)
+
+
+    '''   ____   _ __   ____  __ _____ _   _ _____ ____    ___ ____  ____   ____
+         |  _ \ / \\ \ / /  \/  | ____| \ | |_   _/ ___|  |_ _|  _ \/ ___| / ___|
+         | |_) / _ \\ V /| |\/| |  _| |  \| | | | \___ \   | || |_) \___ \| |
+         |  __/ ___ \| | | |  | | |___| |\  | | |  ___) |  | ||  __/ ___) | |___
+         |_| /_/   \_\_| |_|  |_|_____|_| \_| |_| |____/  |___|_|   |____/ \____|
+    '''
+    @api.model
+    def eiru_get_payslip_payments_ipsc(self, idRun):
+        _logger.info('GET payslip IPSC')
+        ''' GET Payslip Run '''
+        payslipRun = self.env['hr.payslip.run'].browse(idRun)
+        if (not payslipRun):
+            return False
+
+        ''' Nominas (hr.payslip) '''
+        payslipIds = map(lambda x: x.id, payslipRun.slip_ids)
+        payslip = self.env['hr.payslip'].search([('id', 'in', payslipIds)])
+        if (not payslip):
+            return False
+
+        ''' Reglas salariales (hr.salary.rule) '''
+        salaryRule = self.env['hr.salary.rule'].search([('code', '=', 'IPSC')])
+        if (not salaryRule):
+            return False
+
+        ''' Registros de contribución (hr.contribution.register) '''
+        contribution = self.env['hr.contribution.register'].browse(salaryRule.register_id.id)
+        if (not contribution):
+            return False
+
+        ''' Socio (res.partner) '''
+        partner = self.env['res.partner'].browse(contribution.partner_id.id)
+        if (not partner):
+            return False
+
+        ipsCompany = []
+        slipEmployee = []
+        amountTotal = 0.0
+        for slip in payslip:
+            line = self.env['hr.payslip.line'].search([('slip_id', '=', slip.id), ('code','=', 'IPSC')])
+            if (line):
+                domain = [('move_id', 'in', [slip.move_id.id]),('partner_id', 'in', [partner.id]),('account_id', '=', 167),('reconcile_id', '!=', False)]
+                moveLineReconlide = self.env['account.move.line'].search(domain)
+                if (moveLineReconlide):
+                    continue
+
+                slipEmployee.append({
+                    'slipId': slip.id,
+                    'slipName': slip.name,
+                    'slipEmployeeId': slip.employee_id.id,
+                    'slipEmployee': slip.employee_id.name,
+                    'amount': abs(line.total),
+                    'lineName': line.name,
+                })
+
+                amountTotal += line.total
+
+        if (slipEmployee):
+            ipsCompany.append({
+                'id': payslipRun.id,
+                'name': payslipRun.name,
+                'dateStart': payslipRun.date_start,
+                'dateEnd': payslipRun.date_end,
+                'amount': amountTotal,
+                'amountFormat': amountTotal,
+                'slipLine': slipEmployee,
+                'partnerId': partner.id,
+                'currency': [{
+                    'id': currency.id,
+                    'name': currency.name,
+                    'symbol': currency.symbol,
+                    'localName': currency.local_name,
+                    'rate': currency.rate,
+                    'thousandsSeparator': currency.thousands_separator,
+                    'decimalSeparator': currency.decimal_separator,
+                    'decimalPlaces': currency.decimal_places,
+                    'position': currency.position,
+                } for currency in self.env.user.company_id.currency_id]
+            })
+
+        return ipsCompany
+    @api.model
+    def eiru_payslip_payments_ipsc(self, values):
+        _logger.info('GET payslip IPSC')
+        '''
+            values['runId']
+            values['journalId']
+            values['statementId']
+            values['refPayments']
+            values['amount']
+            values['partnerId']
+        '''
+        ''' Date Server '''
+        dateServer = self.get_date()
+        ''' Get User '''
+        resUserId = self.env.user.id
+        ''' hr.payslip.run '''
+        runPayslip = self.env['hr.payslip.run'].browse(values['runId'])
+        if (not runPayslip):
+            return {
+                'state': False,
+                'message': "No se pudo obtener el procesamiento de nominas."
+            }
+
+        ''' hr.payslip '''
+        payslipIds = map(lambda x: x.id,runPayslip.slip_ids)
+        hrPayslip = self.env['hr.payslip'].search([('id', 'in', payslipIds)])
+        if (not hrPayslip):
+            return {
+                'state': False,
+                'message':  "No es posible obtener las nominas."
+            }
+
+        ''' account.journal '''
+        accountJournal = self.env['account.journal'].browse(values['journalId'])
+        if (not accountJournal):
+            return {
+                'state': False,
+                'message': "No es posible localizar el  método de pago seleccionado."
+            }
+
+        ''' res.partner'''
+        partner = self.env['res.partner'].browse(values['partnerId'])
+        if (not partner):
+            return {
+                'state': False,
+                'message': "No fue posible localizar el socio."
+            }
+
+        moveIds = []
+        amountTotal = 0.0
+        for slip in hrPayslip:
+            line = self.env['hr.payslip.line'].search([('slip_id', '=', slip.id), ('code','=', 'IPSC')])
+            if (line):
+                domain = [('move_id', 'in', [slip.move_id.id]),('partner_id.id', '=', partner.id),('account_id', '=', 167),('reconcile_id', '!=', False)]
+                moveLineReconlide = self.env['account.move.line'].search(domain)
+                if (moveLineReconlide):
+                    continue
+
+                amountTotal += line.total
+                moveIds.append(slip.move_id.id)
+
+        line_move = []
+        for line in self.env['account.move.line'].search([('move_id', 'in', moveIds),('partner_id', '=', partner.id),('account_id.id', '=', 167),('reconcile_id', '=', False)]):
+            line_move.append({
+                'name': "/: %s" % (line.name),
+                'debit': line.credit if line.credit > 0 else 0.0 ,
+                'credit': line.debit if line.debit > 0 else 0.0 ,
+                'counterpart_move_line_id': line.id,
+            })
+
+        if (not line_move):
+            return {
+                'state': False,
+                'message': "No fue posible localizar los  Asientos contables"
+            }
+        ''' Account Bank statement '''
+        bankStatement = self._create_eiru_payslip_bank_statement(accountJournal, values['statementId'], dateServer, resUserId)
+        if (not bankStatement):
+            return {
+                'state': False,
+                'message': "No fue posible crear la caja."
+            }
+
+        ''' Statemen Line '''
+        lineStatementips = {
+            'statement_id': bankStatement.id,
+            'name': "Liquidación I.P.S Patronal Procesamiento(%s - %s)" % (runPayslip.date_start, runPayslip.date_end),
+            'partner_id': partner.id,
+            'amount': (-1 * abs(amountTotal)),
+            'ref': values['refPayments']
+        }
+        statementLine = self._create_eiru_payslip_bank_statement_line(lineStatementips)
+        if (not statementLine):
+            return {
+                'state': False,
+                'message': "No fue posible crear las lineas de la caja."
+            }
+
+        '''  process_reconciliation '''
+        reconcilIPSC = self._eiru_payslip_process_reconciliation(statementLine, line_move)
+        if (not reconcilIPSC):
+            return {
+                'state': False,
+                'message': 'Error, en la reconciliación de adelanto.'
+            }
+
+        return {
+            'state': True
+        }

+ 10 - 4
static/src/css/style.css

@@ -1,3 +1,13 @@
+.eiru-payslip-payments {
+    width: auto;
+    float: left;
+}
+.payslip-payments-ipsc {
+    float: left;
+}
+.payslip-payments-ipse {
+    float: left;
+}
 .paymnet-payslip-label {
     width: 150px;
     height: 30px;
@@ -52,10 +62,6 @@
     height: 40px;
     font-size: 12pt !important;
 }
-.eiru-payslip-payments {
-    width: auto;
-    float: left;
-}
 .payslip-payment-unity {
     width: auto;
     float: left;

+ 256 - 0
static/src/js/payslip_payments_ipsc.js

@@ -0,0 +1,256 @@
+(function() {
+    openerp.widgetInstancePayslipPaymentsIPSC = null;
+    openerp.parentInstancePayslipPaymentsIPSC = null;
+    var Qweb = openerp.web.qweb;
+    var instance = openerp;
+
+    openerp.PayslipPaymentsIPSC = instance.Widget.extend({
+        template: 'eiru_payslip_payments.IPSC',
+        id: undefined,
+        payslipIpsc: [],
+        init: function(parent) {
+            this._super(parent);
+            this.buttons = parent.$buttons;
+        },
+        start: function() {
+            var self = this;
+            this.$el.click(function(){
+                self.fectchInitial()
+            });
+
+            self.buttons.click(function(e) {
+                /* E (Editar) */
+                if (e.target.accessKey === 'E')
+                    self.$el.css('display','none');
+                /* S (Guarrdar) */
+                if (e.target.accessKey === 'S')
+                    self.$el.css('display','flex');
+                /* D (Cancelar) */
+                if (e.target.accessKey === 'D')
+                    self.$el.css('display','flex');
+            });
+        },
+        updateId: function(id) {
+            var self = this;
+            self.id = id;
+        },
+
+        /* Remover */
+        removeModal: function() {
+            $('.expired-account-modal').remove();
+            $('.modal-backdrop').remove();
+        },
+
+        /* Metodo Inicial */
+        fectchInitial: function() {
+            var self = this;
+            self.fetchPayslipPaymentsIpsc(self.id).then(function(payslipIpsc) {
+                return payslipIpsc;
+            }).then(function(payslipIpsc) {
+                self.payslipIpsc = payslipIpsc;
+                return  self.fetchAccountJournal();
+            }).then(function(accountJournal) {
+                self.accountJournal = accountJournal;
+                if (!self.payslipIpsc.length){
+                    instance.web.notification.do_warn("Atención","No existe registro de I.P.S. Patronal a reconciliar.");
+                    return false;
+                }
+                return self.showPaymentsIpse()
+            });
+        },
+        /* IPSC */
+        fetchPayslipPaymentsIpsc: function(id) {
+            var payslipRun = new openerp.web.Model('hr.payslip.run');
+            return payslipRun.call('eiru_get_payslip_payments_ipsc',[id],{
+                    context: new openerp.web.CompoundContext()
+            });
+        },
+        // Account Journal
+        fetchAccountJournal: function(id) {
+            var payslip = new openerp.web.Model('hr.payslip.run');
+            return payslip.call('eiru_get_payslip_account_journal',{
+                    context: new openerp.web.CompoundContext()
+            });
+        },
+        /* Get Account Journal Select */
+        getAccountJournal: function(){
+            var self = this;
+            var journal = [];
+            _.each(self.accountJournal, function(item) {
+                journal.push({
+                    'id': item.id,
+                    'name': item.name,
+                });
+            });
+
+            if (journal.length) {
+                journal.unshift({
+                    'id': '',
+                    'name': ''
+                });
+            }
+            return journal
+        },
+
+        /* Filter Journal select */
+        filterAccountJournal: function(id){
+            var self = this;
+            return _.filter(self.accountJournal, function(item){
+                return  item.id === id;
+            });
+        },
+
+        /* Modal */
+        showPaymentsIpse: function(payslip, currency, journal) {
+            var self = this;
+            var defer = $.Deferred();
+            var state = true;
+            var payslispRun = self.payslipIpsc[0];
+            var currency = payslispRun.currency;
+            var accountJournal = self.getAccountJournal();
+            var ipsPayments = []
+
+            var header = [];
+            if (payslispRun) {
+                header.push({
+                    'title': "Procesamiento "+ moment(payslispRun.date_start).format('DD/MM/YYYY')+" - "+moment(payslispRun.date_end).format('DD/MM/YYYY')
+                })
+            }
+
+            var modal = Qweb.render('eiruPayslipPayments.IPSCModal',{
+                'header': header,
+                'journal': accountJournal,
+            });
+            $('.openerp_webclient_container').after(modal);
+            $('.expired-account-modal').modal();
+
+            // /* amount */
+            var ipsTotal = $('.expired-account-modal').find('.amount-total');
+            // /* journal && statement */
+            var journalSelected = $('.expired-account-modal').find('.journal-selected');
+            var statementSelected = $('.expired-account-modal').find('.statement-selected');
+            var refPaymsntIps = $('.expired-account-modal').find('.ref-paymsnt-ips');
+            /* button */
+            var buttonAccept  = $('.expired-account-modal').find('.button-accept');
+
+            $('.expired-account-modal').find('.ref-payments-ips-select').text("Nóminas a reconciliar\t"+ payslispRun.slipLine.length);
+            ipsTotal.val(openerp.web.formatCurrency(payslispRun.amount, currency))
+            $('.expired-account-modal').find('.amount-symbol-payslip').text(currency[0].symbol);
+
+            /* Journal Change */
+            journalSelected.change(function(e){
+                $('.expired-account-modal').find('.paymnet-payslip-statement-open').css('display','none');
+                statementSelected.empty();
+                if (!!journalSelected.val()) {
+                    var statementjournal =  self.filterAccountJournal(parseInt(journalSelected.val())).shift();
+                    var statementOpen = statementjournal.statementOpen;
+
+                    if (!!statementOpen.length){
+                        $('.expired-account-modal').find('.paymnet-payslip-statement-open').css('display','flex');
+                        statementSelected.append('<option value=""></option>');
+                       _.each(statementOpen, function(item) {
+                           statementSelected.append('<option value="' + item.id + '">' + item.name+" - "+moment(item.date).format("DD-MM-YYYY")+ '</option>');
+                       });
+                    }
+                }
+            });
+
+            buttonAccept.click(function(e) {
+
+                if (!journalSelected.val()) {
+                    instance.web.notification.do_warn("Atención","Tienes que seleccionar un método de pago para continuar.");
+                    journalSelected.css('border-color','red');
+                    journalSelected.focus();
+                    return false;
+                }
+                journalSelected.css('border-color','#ccc');
+                var statementjournal =  self.filterAccountJournal(parseInt(journalSelected.val())).shift();
+                var statementOpen = statementjournal.statementOpen;
+
+                if (!!statementOpen.length && !statementSelected.val()) {
+                    instance.web.notification.do_warn("Atención","Tienes que seleccionar una caja para continuar.");
+                    statementSelected.css('border-color','red');
+                    statementSelected.focus();
+                    return false;
+
+                }
+                statementSelected.css('border-color','#ccc');
+
+                if (!refPaymsntIps.val().trim()) {
+                    instance.web.notification.do_warn("Atención","Debes ingresar una referencia de pago para continuar.");
+                    refPaymsntIps.css('border-color','red');
+                    refPaymsntIps.focus();
+                    return false;
+                }
+                refPaymsntIps.css('border-color','#ccc');
+
+                var paymenstIps = {
+                    'runId': self.id,
+                    'journalId': parseInt(journalSelected.val()),
+                    'statementId': parseInt(statementSelected.val()),
+                    'refPayments': refPaymsntIps.val().trim(),
+                    'amount': payslispRun.amount,
+                    'partnerId': payslispRun.partnerId
+                }
+                /* Guardar */
+                $('.expired-account-modal').find('.widget-content.widget-loading-payments-ips').css('display','flex');
+                self.paymentsPayslipIpsc(paymenstIps).then(function(paymentsIps){
+                    return paymentsIps;
+                }).then(function(paymentsIps) {
+                    if (!paymentsIps.state) {
+                        instance.web.notification.do_warn("Atención", paymentsIps.message, true);
+                    }
+                    $('.expired-account-modal').find('.widget-content.widget-loading-payments-ips').css('display','none');
+                    self.removeModal(e);
+                    defer.resolve(paymentsIps)
+                });
+            });
+
+            /* Click Cerrar */
+            $('.expired-account-modal').on('hidden.bs.modal', function (e) {
+                defer.resolve(false);
+                self.removeModal(e);
+            });
+
+            return defer;
+        },
+
+        /*Pagar nominas */
+        paymentsPayslipIpsc: function(paymenstIps) {
+            var payslipRun = new  instance.web.Model('hr.payslip.run');
+            return payslipRun.call('eiru_payslip_payments_ipsc', [paymenstIps],{
+                context: new instance.web.CompoundContext()
+            });
+        },
+    });
+
+    if (instance.web && instance.web.FormView) {
+        instance.web.FormView.include({
+            load_record: function(record) {
+                this._super.apply(this, arguments);
+
+                if (this.model !== 'hr.payslip.run')
+                    return;
+
+                openerp.parentInstancePayslipPaymentsIPSC = this;
+
+                if (openerp.widgetInstancePayslipPaymentsIPSC) {
+                    openerp.widgetInstancePayslipPaymentsIPSC.updateId(record.id);
+                    if (this.$el.find('.payslip-payments-ipsc').length !== 0){
+                        return
+                    }
+                }
+
+                if (this.$el.find('.payslip-payments-ipsc').length !== 0 )
+                    return;
+
+                openerp.widgetInstancePayslipPaymentsIPSC = new openerp.PayslipPaymentsIPSC(this);
+
+                var elemento = this.$el.find('.oe_form').find('.eiru-payslip-payments');
+
+                openerp.widgetInstancePayslipPaymentsIPSC.appendTo(elemento);
+                openerp.widgetInstancePayslipPaymentsIPSC.updateId(record.id);
+            },
+        });
+    }
+})();

+ 13 - 12
static/src/js/payslip_payments_ipse.js

@@ -1,10 +1,11 @@
-
-openerp.eiru_payslip_payments = function(instance, local) {
-    local.widgetInstancePayslipPaymentsIPSE = null;
-    local.parentInstancePayslipPaymentsIPSE = null;
+(function() {
+// openerp.eiru_payslip_payments = function(instance, openerp) {
+    openerp.widgetInstancePayslipPaymentsIPSE = null;
+    openerp.parentInstancePayslipPaymentsIPSE = null;
     var Qweb = openerp.web.qweb;
+    var instance = openerp;
 
-    local.PayslipPaymentsIPSE = instance.Widget.extend({
+    openerp.PayslipPaymentsIPSE = instance.Widget.extend({
         template: 'eiru_payslip_payments.IPSE',
         id: undefined,
         payslipIpse: [],
@@ -352,10 +353,10 @@ openerp.eiru_payslip_payments = function(instance, local) {
                 if (this.model !== 'hr.payslip.run')
                     return;
 
-                local.parentInstancePayslipPaymentsIPSE = this;
+                openerp.parentInstancePayslipPaymentsIPSE = this;
 
-                if (local.widgetInstancePayslipPaymentsIPSE) {
-                    local.widgetInstancePayslipPaymentsIPSE.updateId(record.id);
+                if (openerp.widgetInstancePayslipPaymentsIPSE) {
+                    openerp.widgetInstancePayslipPaymentsIPSE.updateId(record.id);
                     if (this.$el.find('.payslip-payments-ipse').length !== 0){
                         return
                     }
@@ -364,14 +365,14 @@ openerp.eiru_payslip_payments = function(instance, local) {
                 if (this.$el.find('.payslip-payments-ipse').length !== 0 )
                     return;
 
-                local.widgetInstancePayslipPaymentsIPSE = new local.PayslipPaymentsIPSE(this);
+                openerp.widgetInstancePayslipPaymentsIPSE = new openerp.PayslipPaymentsIPSE(this);
 
                 var elemento = this.$el.find('.oe_form').find('.eiru-payslip-payments');
 
-                local.widgetInstancePayslipPaymentsIPSE.appendTo(elemento);
-                local.widgetInstancePayslipPaymentsIPSE.updateId(record.id);
+                openerp.widgetInstancePayslipPaymentsIPSE.appendTo(elemento);
+                openerp.widgetInstancePayslipPaymentsIPSE.updateId(record.id);
             },
         });
     }
 
-}
+})();

+ 9 - 0
static/src/xml/eiru_payslip_payments_ipsc.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<templates xml:space="preserve">
+    <t t-name="eiru_payslip_payments.IPSC">
+        <button class="payslip-payments-ipsc oe_button oe_form_button oe_highlight">
+            <div>Pagar IPS Patronal</div>
+        </button>
+  </t>
+</templates>

+ 77 - 0
static/src/xml/modal/payslip_payments_ipsc.xml

@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="eiruPayslipPayments.IPSCModal">
+        <div class="modal in expired-account-modal" tabindex="-1" role="dialog">
+            <div class="modal-dialog modal-lg" role="document">
+                <div class="modal-content openerp">
+                    <div class="widget-content widget-loading-payments-ips">
+                        <i class='fa fa-cog fa-spin fa-3x fa-fw'></i>
+                    </div>
+                    <!-- title  -->
+                    <div class="modal-header">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="Close" aria-hidden="true">×</button>
+                        <h3 class="modal-title header-paymsnt-ips" t-foreach="header" t-as="header">
+                            Liquidación I.P.S Patronal.
+                            <small><t t-esc="header_value.title"/></small>
+                        </h3>
+                    </div>
+                    <!-- Body -->
+                    <div class="modal-body">
+                        <!-- detalles -->
+                        <div class="row ">
+                            <div class="col-xs-6">
+                                <span class="ref-payments-ips-select"></span>
+                            </div>
+                            <div class="col-xs-6">
+                                <label class="paymnet-payslip-label">Total a Pagar</label>
+                                <div class="paymnet-payslip-group">
+                                    <input type="text" class="paymnet-payslip-input input-disabled input-number input-amount amount-total" readonly="readonly" value="0"></input>
+                                      <div class="payments-payslip-symbol">
+                                        <span class="amount-symbol-payslip"></span>
+                                      </div>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="row">
+                            <div class="col-xs-6">
+                                <label class="paymnet-payslip-label">Método de pago: </label>
+                                <div class="paymnet-payslip-group">
+                                    <select class="paymnet-payslip-input journal-selected">
+                                        <t t-foreach="journal" t-as="journal">
+                                            <option t-attf-value="{{ journal_value.id }}" >
+                                                <t t-esc="journal_value.name"/>
+                                            </option>
+                                        </t>
+                                    </select>
+                                </div>
+                            </div>
+                            <div class="col-xs-6 paymnet-payslip-statement-open">
+                                <label class="paymnet-payslip-label">Caja</label>
+                                <div class="paymnet-payslip-group">
+                                    <select class="paymnet-payslip-input statement-selected">
+                                    </select>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="row">
+                            <div class = "col-xs-12">
+                                <label class="paymnet-payslip-label">Referencia de pago: </label>
+                                <div class="paymnet-payslip-group">
+                                    <input type="text" class="paymnet-payslip-input ref-paymsnt-ips"></input>
+                                </div>
+                            </div>
+                        </div>
+
+                    </div>
+                    <!-- Pie de Pagina -->
+                    <div class="modal-footer paymnets-invoice-footer">
+                        <button type="button" class="oe_button oe_form_button oe_highlight payments-payslip-ips-button button-accept">Guardar</button>
+                        <button type="button" class="oe_button oe_form_button oe_link dismmis-modal payments-payslip-ips-button" data-dismiss="modal">Salir</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </t>
+</template>

+ 1 - 0
view/template.xml

@@ -6,6 +6,7 @@
                 <!-- <script type="text/javascript" src="/eiru_payslip_payments/static/src/js/payslip_payments.js"/> -->
                 <script type="text/javascript" src="/eiru_payslip_payments/static/src/js/payslip_payments_unity.js"/>
                 <script type="text/javascript" src="/eiru_payslip_payments/static/src/js/payslip_payments_ipse.js"/>
+                <script type="text/javascript" src="/eiru_payslip_payments/static/src/js/payslip_payments_ipsc.js"/>
             </xpath>
         </template>
     </data>