Browse Source

Eiru bank payments references

SEBAS 11 months ago
commit
fba8a7f54d
37 changed files with 4633 additions and 0 deletions
  1. 1 0
      .gitignore
  2. 8 0
      README.md
  3. 2 0
      __init__.py
  4. 20 0
      __openerp__.py
  5. 7 0
      models/__init__.py
  6. 575 0
      models/bank_payments.py
  7. 26 0
      models/bank_payments_line.py
  8. 163 0
      models/bank_payments_type.py
  9. 199 0
      models/bank_payments_utility.py
  10. 52 0
      models/res_bank.py
  11. 30 0
      models/res_bank_cheque_type.py
  12. 6 0
      security/ir.model.access.csv
  13. BIN
      static/description/icon.png
  14. 233 0
      static/src/css/style.css
  15. 282 0
      static/src/js/bank_payments_charge.js
  16. 393 0
      static/src/js/bank_payments_customer_returned.js
  17. 417 0
      static/src/js/bank_payments_reject.js
  18. 580 0
      static/src/js/bank_payments_renegotiate.js
  19. 80 0
      static/src/js/bank_payments_state_change.js
  20. 407 0
      static/src/js/bank_payments_supplier_returned.js
  21. 314 0
      static/src/js/bank_payments_type_config.js
  22. 11 0
      static/src/xml/bank_payments_charge.xml
  23. 11 0
      static/src/xml/bank_payments_customer_returned.xml
  24. 11 0
      static/src/xml/bank_payments_rejected.xml
  25. 11 0
      static/src/xml/bank_payments_renegotiate.xml
  26. 11 0
      static/src/xml/bank_payments_supplier_returned.xml
  27. 10 0
      static/src/xml/bank_payments_type_config.xml
  28. 75 0
      static/src/xml/modal/modal_bank_payments_charge.xml
  29. 79 0
      static/src/xml/modal/modal_bank_payments_reject.xml
  30. 167 0
      static/src/xml/modal/modal_bank_payments_renegotiate.xml
  31. 78 0
      static/src/xml/modal/modal_bank_payments_returned.xml
  32. 86 0
      static/src/xml/modal/modal_bank_payments_type_config.xml
  33. 16 0
      views/templates.xml
  34. 44 0
      views/view_res_bank.xml
  35. 54 0
      views/view_res_bank_cheque_type.xml
  36. 113 0
      views/view_res_bank_line.xml
  37. 61 0
      views/view_res_bank_types.xml

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+*.pyc

+ 8 - 0
README.md

@@ -0,0 +1,8 @@
+# Eiru bank payments references
+
+Modulo para registrar todas los operación bancaria realizada en la empresa,  ya sea por métodos de pagos o cobros.
+
+## Instalación del módulo
+
+* Clone el proyecto en la raíz de su carpeta de custom addons  [eiru_bank_payments_references](http://192.168.88.100:3000/adrielso/eiru_bank_payments_references.git).
+* Actualice su lista de módulos y luego instale.

+ 2 - 0
__init__.py

@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+import models

+ 20 - 0
__openerp__.py

@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+{
+    'name': 'Eiru bank payments references',
+    'author': 'Adrielso Kunert Bueno',
+    'category': 'Account',
+    'version': '0.1.1',
+    'depends': ['base', 'account'],
+    'data': [
+        'views/templates.xml',
+        'security/ir.model.access.csv',
+        'views/view_res_bank.xml',
+        'views/view_res_bank_line.xml',
+        'views/view_res_bank_types.xml',
+        'views/view_res_bank_cheque_type.xml',
+    ],
+    'qweb': [
+        'static/src/xml/*.xml',
+        'static/src/xml/modal/*.xml',
+    ],
+}

+ 7 - 0
models/__init__.py

@@ -0,0 +1,7 @@
+# -*- coding: utf-8 -*-
+import res_bank
+import bank_payments
+import bank_payments_line
+import res_bank_cheque_type
+import bank_payments_type
+import bank_payments_utility

+ 575 - 0
models/bank_payments.py

@@ -0,0 +1,575 @@
+# -*- coding: utf-8 -*-
+from openerp import models, fields, tools, api
+import openerp.addons.decimal_precision as dp
+from datetime import datetime
+
+class ResBankPayments(models.Model):
+    _name = 'res.bank.payments'
+
+    name = fields.Char(compute='_compute_name')
+    date = fields.Date('Date', help="Fecha de operación")
+    date_maturity = fields.Date('Due date',help="Fecha de vencimiento")
+    number = fields.Char('Number', help="Numero de la transacción")
+    number_cta = fields.Char('Number CTA.', help="Numero de cuenta")
+    number_cta_origin = fields.Char('Number CTA. Origin', help="Numero de cuenta origen")
+    comment = fields.Text('Comment', help="Información adicional")
+    name_holder = fields.Char('Nombre del titular', help="Nombre del titular")
+    ## amoutn (total- receipt- paymnet)
+    amount_total = fields.Float('amount Total',digits_compute=dp.get_precision('Account'), help="Valor de la transacción")
+    amount_receipt = fields.Float(string="Residual receipt", digits_compute=dp.get_precision('Account'), store=True, compute="_compute_amount_residual_receipt" ,help="Monto disponible a cobra")
+    amount_payment = fields.Float(string="Residual payment", digits_compute=dp.get_precision('Account'), store=True, compute="_compute_amount_residual_payment" ,help="Monto disponible a pagar")
+    ## ??
+    change_payment_method = fields.Boolean()
+    ## state
+    state = fields.Selection([('available', 'Disponible'), ('cashed', 'Cobrado'),('deposit','Deposito'), ('negotiated', 'Negociado'), ('renegotiated', 'Renegociado'), ('rejected', 'Rechazado')],'Estado del pago', default="available", help="Estado del pago")
+    ### Bank
+    bank_id = fields.Many2one('res.bank', string='Bank', ondelete='restrict', index=True, required=True, help="Banco")
+    ## Currency
+    currency_id = fields.Many2one('res.currency', string="Currency", help="Moneda de la operación")
+    ## partner (customer - supplier)
+    customer_id = fields.Many2one('res.partner', string="customer", help="Nombre del Cliente")
+    supplier_id = fields.Many2one('res.partner', string="supplier", help="Nombre del Proveedor")
+
+    def _compute_name(self):
+        self.name = "Trans. Bank / "+str(self.id)
+
+    @api.one
+    @api.depends('amount_total','payments_line.amount')
+    def _compute_amount_residual_receipt(self):
+        amount = 0.0
+        for line in self.payments_line:
+            if (line.type_operation == 'receipt'):
+                amount += line.amount
+
+        if (self.bank_payments_type_id.code == 'TJ'):
+            amount = self.amount_total
+
+        self.amount_receipt = (self.amount_total - amount)
+
+    @api.one
+    @api.depends('amount_total','payments_line.amount')
+    def _compute_amount_residual_payment(self):
+        amount = 0.0
+        for line in self.payments_line:
+            if (line.type_operation == 'payment'):
+                amount += line.amount
+
+        if (self.bank_payments_type_id.code == 'TJ'):
+                amount = self.amount_total
+
+        self.amount_payment = (self.amount_total - amount)
+
+
+    '''
+        Actualizar el monto pagado y monto Recibido
+    '''
+    def update_bank_payments_amount(self, ids):
+        '''
+            Actualizar los monto Disponible a Pagar/Cobrar
+            :param ids : id de operacion bancarias ('res.bank.payments')
+            :return : True si actualizo, False si no
+        '''
+        amountReceipt = 0
+        amountPayments = 0
+        bankPaymnets = self.env['res.bank.payments'].browse(ids)
+        if (not bankPaymnets):
+            return False
+
+        bankPaymentsLine = self.env['res.bank.payments.line'].search([('bank_payments_id', '=', bankPaymnets.id)])
+        for line in bankPaymentsLine:
+            if (line.type_operation == 'receipt'):
+                amountReceipt += line.amount
+
+            if (line.type_operation == 'payment'):
+                amountPayments += line.amount
+
+        bank = {
+            'amount_receipt': (bankPaymnets.amount_total - amountReceipt) if (bankPaymnets.amount_total - amountReceipt) >= 0 else 0,
+            'amount_payment': (bankPaymnets.amount_total - amountPayments) if (bankPaymnets.amount_total - amountPayments) >= 0 else 0
+        }
+        bankPaymnetsUpdate = bankPaymnets.write(bank)
+
+        return bankPaymnetsUpdate
+
+        # return True if (bankPaymnets) else False
+
+    '''
+        status update
+    '''
+    @api.model
+    def update_state_bank_payments(self, ids):
+        '''
+            Actualiza automáticamente el estado de operación bancarias(res.bank.payments).
+            :param ids : id de la operación bancarias(res.bank.payments)
+            :return : True si actualizo correctamente, False si no actualizo
+        '''
+        state = None
+        updateBankPayments = None
+        amountPayments = 0
+        amountCashed = 0
+        amountReject = 0
+        ## Update Amount
+        updateAmount = self.update_bank_payments_amount(ids)
+        ## res.bank.payments
+        bankPayments =  self.env['res.bank.payments'].browse(ids)
+        if (not bankPayments):
+            return
+        ## res.bank.payments.line
+        bankPaymentsLine = self.env['res.bank.payments.line'].search([('bank_payments_id', '=', bankPayments.id),('type_operation','in', ['payment','cashed', 'renegotiated'])])
+        for line in bankPaymentsLine:
+            if (line.type_operation == 'payment'):
+                amountPayments += line.amount
+
+            if (line.type_operation == 'cashed'):
+                amountCashed +=line.amount
+
+            if (line.type_operation == 'renegotiated'):
+                amountReject +=line.amount
+
+        if (bankPayments.amount_total <= amountPayments and bankPayments.state == 'available'):
+            state= 'negotiated'
+            if (bankPayments.change_payment_method):
+                bank = {
+                    'change_payment_method': False
+                }
+                bakPaymentsUpdate = self.bank_payments_update(bankPayments.id,bank)
+
+        if (bankPayments.amount_total > amountPayments and bankPayments.state == 'negotiated'):
+            state= 'available'
+
+        if (bankPayments.amount_total <= amountCashed and bankPayments.state == 'available'):
+            state= 'cashed'
+
+        if (bankPayments.amount_total > amountCashed and bankPayments.state == 'cashed' and bankPayments.bank_payments_type_id.code != 'TJ'):
+            state= 'available'
+
+        if (bankPayments.amount_total <= amountReject and bankPayments.state == 'rejected'):
+            state= 'renegotiated'
+
+        if (bankPayments.amount_total > amountReject and bankPayments.state == 'renegotiated'):
+            state= 'rejected'
+
+        if (state):
+            updateBankPayments = bankPayments.write({'state': state})
+        return True if (updateBankPayments) else False
+
+
+    '''
+        Reject Bank type Cheque
+    '''
+    @api.model
+    def bank_payments_reject(self, values):
+        dateServer = datetime.now().strftime('%Y-%m-%d')
+        bankPayments = self.env['res.bank.payments'].browse(values['id'])
+        if (not bankPayments):
+            return
+
+        banktype = self.env['res.bank.payments.type'].search([('id', '=', bankPayments.bank_payments_type_id.id)])
+        if (banktype.code != 'CH'):
+            return
+
+        ## Rechazar
+        if (values['waitPayments']):
+            state = "rejected"
+            reference = dateServer+" Rechazado ref/ "+values['details']
+            bank = {
+                'state': state,
+                'comment': bankPayments.comment+" \n("+reference+")" if (bankPayments.comment) else "("+reference+")"
+            }
+            bakPaymentsUpdate = self.bank_payments_update(values['id'],bank)
+            return True if (bakPaymentsUpdate) else False
+
+        ## Pagar con otro metodo de pago
+        if (values['otherPayments']):
+            amountPaymentsTotal = 0.00
+            ## account.journal
+            accountJournal = self.env['account.journal'].search([('active', '=', True), ('type', 'in', ['bank', 'cash']),('code', '=', values['selectJournal'])])
+            if (not accountJournal):
+                return False
+
+            operation = 'retention'
+            typeOperation = 'payment'
+
+            ## Create Bank statement
+            bankStatement = self.create_bank_statement(dateServer, accountJournal.id, values['amountPayments'], operation, bankPayments.id)
+
+            ## Create Bank statement Line
+            refPayments = 'Balance/Retención de cheque/'
+            statementLine = self.create_bank_statement_line(bankStatement.id, values['amountPayments'], bankPayments.id, refPayments, 'Retención de cheque', typeOperation)
+
+            ##  Create Payments Line
+            paymnetsLine = self.create_bank_paymnets_line(values['amountPayments'], bankPayments.id, bankStatement.id, statementLine.id, dateServer, accountJournal.id, typeOperation)
+
+            amount = -1 * values['amountPayments']
+
+            ## Create Bank statement
+            bankStatement = self.create_bank_statement(dateServer, accountJournal.id, amount, operation, bankPayments.id)
+
+            ## Create Bank statement Line
+            refPayments = 'Balance/Pago a proveedor/'
+            statementLine = self.create_bank_statement_line(bankStatement.id, amount, bankPayments.id, refPayments, 'Pago a proveedor', typeOperation)
+
+            ##  Create Payments Line
+            paymnetsLine = self.create_bank_paymnets_line(amount, bankPayments.id, bankStatement.id, statementLine.id, dateServer, accountJournal.id, typeOperation)
+
+            ## Update  res.bank.payments
+            state = "available"
+            reference = dateServer+" Rechazado ref/ "+values['details']
+            bank = {
+                'state': state,
+                'comment': bankPayments.comment+" \n("+reference+")" if (bankPayments.comment) else "("+reference+")",
+                'change_payment_method': True
+            }
+            bakPaymentsUpdate = self.bank_payments_update(values['id'],bank)
+            return True if (bakPaymentsUpdate) else False
+
+        return False
+
+    '''
+        Generar balance en los registro de caja
+    '''
+    @api.model
+    def balance_bank_payments(self, values):
+        amountReceipt = 0
+        dateServer = datetime.now().strftime('%Y-%m-%d')
+
+        ## res.bank.payments
+        bankPayments = self.env['res.bank.payments'].browse(values['id'])
+        if (not bankPayments):
+            return False
+        ## res.bank.payments.line
+        bankPaymentsLine = self.env['res.bank.payments.line'].search([('bank_payments_id', '=', bankPayments.id),('type_operation','=', values['typeOperation'])])
+
+        for line in bankPaymentsLine:
+            amountReceipt += line.amount
+
+        ## account.journal
+        accountJournal = self.env['account.journal'].search([('active', '=', True), ('type', 'in', ['bank', 'cash']),('code', '=', values['selectJournal'])])
+        if (not accountJournal):
+            return False
+        ## Create Bank statement
+        bankStatement = self.create_bank_statement(dateServer, accountJournal.id, values['amountReceipt'], values['typeOperation'], bankPayments.id)
+        ## Create Bank statement Line
+        statementLine = self.create_bank_statement_line(bankStatement.id, values['amountReceipt'], bankPayments.id, values['refPayments'], values['details'], values['typeOperation'])
+        ##  Create Payments Line
+        paymnetsLine = self.create_bank_paymnets_line(values['amountReceipt'], bankPayments.id, bankStatement.id, statementLine.id, dateServer, accountJournal.id, values['typeOperation'])
+
+        amount = -1 * values['amountReceipt']
+
+        ## Create Bank statement
+        bankStatement = self.create_bank_statement(dateServer, accountJournal.id, amount, values['typeOperation'], bankPayments.id)
+        ## Create Bank statement Line negativo
+        statementLine = self.create_bank_statement_line(bankStatement.id, amount, bankPayments.id, values['refPayments'], values['details'], values['typeOperation'])
+        ## create bank Payments Line
+        paymnetsLine = self.create_bank_paymnets_line(values['amountReceipt'], bankPayments.id, bankStatement.id, statementLine.id, dateServer, accountJournal.id, values['typeOperation'])
+
+        return True if (paymnetsLine) else False
+
+    '''
+        Crear – actualizar Registro de caja
+    '''
+    def create_bank_statement(self, dateServer, journalId, amount, typeOperation, paymentsID):
+        '''
+            Crear/actualizar Registro de Caja (account.bank.statement).
+            :param dateServer :  Fecha actual del servidor.
+            :param journalId : id de metodo de pago (account.journal).
+            :param amount : Valor total de la operación.
+            :param typeOperation: tipo de la operacion si es ['receipt', 'payment', 'cashed', 'renegotiated']
+            :return : bankStatement (Objeto creado o actualizado).
+        '''
+        journalBalance = []
+        ## Vuelto a clientes
+        if (typeOperation == 'receipt' and amount > 0):
+            paymentsLine = self.env['res.bank.payments.line'].search([('bank_payments_id', '=', paymentsID),('type_operation','=', typeOperation)])
+            if paymentsLine:
+                if len(paymentsLine) != 1:
+                    paymentsLine = paymentsLine[len(paymentsLine) -1]
+
+                idJournal = paymentsLine.statement_id.journal_id.id
+                journalBalance = self.env['account.journal'].search([('active', '=', True), ('type', 'in', ['bank', 'cash']),('id', '=', idJournal)])
+
+        ### Negociacion de cheque con proveedor
+        if (typeOperation == 'retention' and amount > 0):
+            paymentsLine = self.env['res.bank.payments.line'].search([('bank_payments_id', '=', paymentsID),('type_operation','=', 'payment')])
+            if paymentsLine:
+                if len(paymentsLine) != 1:
+                    paymentsLine = paymentsLine[len(paymentsLine) -1]
+
+                idJournal = paymentsLine.statement_id.journal_id.id
+                journalBalance = self.env['account.journal'].search([('active', '=', True), ('type', 'in', ['bank']),('id', '=', idJournal)])
+
+        ## Recibir Vuelto de proveedor
+        if (typeOperation == 'payment' and amount < 0):
+            paymentsLine = self.env['res.bank.payments.line'].search([('bank_payments_id', '=', paymentsID),('type_operation','=', typeOperation)])
+            if paymentsLine:
+                if len(paymentsLine) != 1:
+                    paymentsLine = paymentsLine[len(paymentsLine) -1]
+
+                idJournal = paymentsLine.statement_id.journal_id.id
+                journalBalance = self.env['account.journal'].search([('active', '=', True), ('type', 'in', ['bank', 'cash']),('id', '=', idJournal)])
+
+        ## Efectifi
+        if (typeOperation == 'cashed' and amount < 0):
+            paymentsLine = self.env['res.bank.payments.line'].search([('bank_payments_id', '=', paymentsID),('type_operation','in', ['receipt','payment'])])
+            if paymentsLine:
+                if len(paymentsLine) != 1:
+                    paymentsLine = paymentsLine[len(paymentsLine) -1]
+
+                idJournal = paymentsLine.statement_id.journal_id.id
+                journalBalance = self.env['account.journal'].search([('active', '=', True), ('type', '=', 'bank'),('id', '=', idJournal)])
+                if (not journalBalance):
+                    journalBalance = self.env['account.journal'].search([('active', '=', True), ('type', 'in', ['bank'])])
+                    if journalBalance:
+                        if len(journalBalance) != 1:
+                            journalBalance = journalBalance[len(journalBalance) -1]
+            else:
+                journalBalance = self.env['account.journal'].search([('active', '=', True), ('type', 'in', ['bank'])])
+                if journalBalance:
+                    if len(journalBalance) != 1:
+                        journalBalance = journalBalance[len(journalBalance) -1]
+
+        ## Renegociado
+        if (typeOperation == 'renegotiated' and amount < 0):
+            paymentsLine = self.env['res.bank.payments.line'].search([('bank_payments_id', '=', paymentsID),('type_operation','in', ['receipt','payment'])])
+            if paymentsLine:
+                if len(paymentsLine) != 1:
+                    paymentsLine = paymentsLine[len(paymentsLine) -1]
+
+                idJournal = paymentsLine.statement_id.journal_id.id
+                journalBalance = self.env['account.journal'].search([('active', '=', True), ('type', 'in', ['bank', 'cash']),('id', '=', idJournal)])
+            else:
+                journalBalance = self.env['account.journal'].search([('active', '=', True), ('type', 'in', ['bank'])])
+                if journalBalance:
+                    if len(journalBalance) != 1:
+                        journalBalance = journalBalance[len(journalBalance) -1]
+
+        if (journalBalance):
+            journalId =  journalBalance.id
+
+        ## Consultar Journal
+        accountJournal = self.env['account.journal'].browse(journalId)
+        ## Periodo
+        accountPeriod = self.env['account.period'].search([('date_start', '<=', dateServer),('date_stop', '>=', dateServer)])
+        ##Consultar bankStatemente
+        bankStatement = self.env['account.bank.statement'].search([('journal_id', 'in', [accountJournal.id]), ('date', '=', dateServer)])
+
+
+        bank = {
+            'journal_id': accountJournal.id,
+            'period_id': accountPeriod.id,
+            'date': dateServer,
+            'user_id': self.env.user.id,
+            'state': 'open' if accountJournal.type == 'cash' else 'draft',
+        }
+        newBankStatement = bankStatement
+
+        if bankStatement:
+            if len(bankStatement) != 1:
+                newBankStatement = bankStatement[len(bankStatement) -1]
+            newBankStatement.write(bank)
+        else:
+            newBankStatement = self.env['account.bank.statement'].create(bank)
+
+        return newBankStatement
+
+    '''
+        Crear movimiento de registro de caja
+    '''
+    def create_bank_statement_line(self, statementId, ammount, bankpaymentsID, refPayments, details, typeOperation):
+        '''
+            Crear Linea del registro de caja (account.bank.statement.line).
+            :param statementId : id de Registro de caja(account.bank.statement).
+            :param bankpaymentsID : id de operación  bancarias (res.bank.payments).
+            :param ammount : Monto para registra en la linea  del registro de caja.
+            :param refPayments : Breve referencia  nombre de la operación.
+            :param details : Descripción del  movimiento.
+            :return : line (objeto creado de 'account.bank.statement.line').
+        '''
+        ## account.bank.statement
+        bankStatement = self.env['account.bank.statement'].browse(statementId)
+        ## res.bank.payments
+        bankPayments = self.env['res.bank.payments'].browse(bankpaymentsID)
+        statementLine = {
+            'statement_id': bankStatement.id,
+            'name': refPayments+"ref/"+str(bankPayments.name),
+            'partner_id': bankPayments.customer_id.id if (typeOperation != 'payment') else bankPayments.supplier_id.id,
+            'amount': ammount ,
+            'ref': details,
+            'account_id': bankStatement.journal_id.internal_account_id.id,
+            'journal_id': bankStatement.journal_id.id
+        }
+
+        line = self.env['account.bank.statement.line'].create(statementLine)
+
+        return line
+
+    '''
+        Crear movimiento de operación bancarias
+    '''
+    def create_bank_paymnets_line(self, amount, bankPaymentsId, bankStatementId, statementLineId, dateServer, accountJournalId, typeOperation):
+        '''
+            Crear lineas de operación bancarias (res.bank.payments.line)
+            :param bankPaymentsId : id de operación bancaria (res.bank.payments)
+            :param bankStatementId : id de registro de caja (account.bank.statement)
+            :param statementLineId : id de linea del registro de caja (account.bank.statement.line)
+            :param accountJournalId : id del método de pago (account.journal)
+            :param amount : Monto de la operación
+            :param dateServer : fecha de la operación
+            :param typeOperation : tipo de operación (Recibo, Pago, Balance, Cobrado, Renegociado)
+            :return : paymnets_line (objeto creado de la operación)
+
+        '''
+        ## res.bank.payments
+        bankPayments = self.env['res.bank.payments'].browse(bankPaymentsId)
+        ## account.bank.statement
+        bankStatement = self.env['account.bank.statement'].browse(bankStatementId)
+        ## account.bank.statement.line
+        bankStatementLine = self.env['account.bank.statement.line'].browse(statementLineId)
+        ## account.journal
+        accountJournal = self.env['account.journal'].browse(accountJournalId)
+        # res.company
+        resCompany = self.env['res.company'].search([('id', '=', 1)])
+
+        ammountTotal = 0.0
+        ammountCurrency = 0.0
+        if (accountJournal.currency):
+            if (accountJournal.currency.id != bankPayments.currency_id.id):
+                ammountTotal = amount * (bankPayments.currency_id.rate / accountJournal.currency.rate)
+                ammountCurrency = amount
+            else:
+                ammountTotal = amount
+        else:
+            if (resCompany.currency_id.id != bankPayments.currency_id.id):
+                ammountTotal = amount * (bankPayments.currency_id.rate / resCompany.currency_id.rate)
+                ammountCurrency = amount
+            else:
+                ammountTotal = amount
+
+        operation = typeOperation
+        ## receipt
+        if (typeOperation == 'receipt' and bankStatementLine.amount < 0):
+            operation = 'balance'
+
+        ## paymnet
+        if (typeOperation == 'payment' and bankStatementLine.amount > 0):
+            operation = 'balance'
+
+        # cashed
+        if (typeOperation == 'cashed' and bankStatementLine.amount < 0):
+            operation = 'balance'
+
+        # renegotiated
+        if (typeOperation == 'renegotiated' and bankStatementLine.amount > 0):
+            operation = 'balance'
+
+
+        bankLine = {
+            'amount': ammountTotal,
+            'amount_currency': ammountCurrency,
+            'currency_id': accountJournal.currency.id if accountJournal.currency else bankPayments.currency_id.id,
+            'date': dateServer,
+            'bank_payments_id': bankPayments.id,
+            'statement_line_id': bankStatementLine.id,
+            'statement_id': bankStatement.id,
+            'type_operation': operation
+        }
+        paymnets_line = []
+        paymnets_line = self.env['res.bank.payments.line'].create(bankLine)
+
+        return paymnets_line
+
+    '''
+        Renegotiate
+    '''
+    @api.model
+    def bank_payments_renegotiate(self, values):
+        dateServer = datetime.now().strftime('%Y-%m-%d')
+        reference = ''
+        state = ""
+        # Verificar res.bank.payments
+        bankPayments = self.env['res.bank.payments'].browse(values['id'])
+        if (not bankPayments):
+            return False
+
+        # Verificar account.journal
+        accountJournal = self.env['account.journal'].search([('active', '=', True), ('type', 'in', ['bank', 'cash']),('code', '=', values['selectInput'])])
+        if (not accountJournal):
+            return False
+
+        if (values['checkRadio']):
+            reference =dateServer+" Renegociacion ref/ "+values['detailsRenegotiate']
+            bank = {
+                'state': 'available',
+                'comment': bankPayments.comment+" \n("+reference+")" if (bankPayments.comment) else "("+reference+")"
+            }
+            bakPaymentsUpdate = self.bank_payments_update(values['id'],bank)
+
+            return True if(bakPaymentsUpdate) else False
+
+        if (values['otherRadio']):
+            ## Create Bank statement
+            bankStatement = self.create_bank_statement(dateServer, accountJournal.id, values['amountPayments'], values['typeOperation'], bankPayments.id)
+            ## Create Bank statement Line
+            statementLine = self.create_bank_statement_line(bankStatement.id, values['amountPayments'], bankPayments.id, values['refPayments'], values['details'], values['typeOperation'])
+            ##  Create Payments Line
+            paymnetsLine = self.create_bank_paymnets_line(values['amountPayments'], bankPayments.id, bankStatement.id, statementLine.id, dateServer, accountJournal.id, values['typeOperation'])
+
+            amount = -1 * values['amountPayments']
+            ## Create Bank statement
+            bankStatement = self.create_bank_statement(dateServer, accountJournal.id, amount, values['typeOperation'], bankPayments.id)
+            ## Create Bank statement Line negativo
+            statementLine = self.create_bank_statement_line(bankStatement.id, amount, bankPayments.id, values['refPayments'], values['details'], values['typeOperation'])
+            ## create bank Payments Line
+            paymnetsLine = self.create_bank_paymnets_line(values['amountPayments'], bankPayments.id, bankStatement.id, statementLine.id, dateServer, accountJournal.id, values['typeOperation'])
+
+            # Update State And Coment
+            reference =dateServer+" Renegociacion ref/ "+values['detailsRenegotiate']
+            state = "rejected"
+
+            bank = {
+                'state': 'renegotiated',
+                'comment': bankPayments.comment+" \n("+reference+")" if (bankPayments.comment) else "("+reference+")"
+            }
+            bakPaymentsUpdate = self.bank_payments_update(values['id'],bank)
+
+            return True if(bakPaymentsUpdate) else False
+
+        if (values['CheckCashingRadio']):
+            ## Actualizar  Datos del cheque
+            reference = dateServer+" Renegociacion ref/ "+values['detailsRenegotiate']
+
+            bank = {
+                'number': values['number'],
+                'amount_total': values['amountTotal'],
+                'date_maturity': values['dateMaturity'],
+                'number_cta': values['numberCta'],
+                'name_holder': values['nameHolder'],
+                'state': 'available',
+                'comment': bankPayments.comment+" \n("+reference+")" if (bankPayments.comment) else "("+reference+")"
+            }
+
+            bakPaymentsUpdate = self.bank_payments_update(values['id'],bank)
+
+            return True if(bakPaymentsUpdate) else False
+
+        return False
+
+    '''
+        Actualizar res.bank.payments
+    '''
+    def bank_payments_update(self, id, bank):
+        '''
+            Actualizar  información de  operación bancaria.
+            :param id : id de operación bancarias('res.bank.payments').
+            :param bank : Campos a actualizar.
+            :return : True si actualizo , false  no actualizo
+        '''
+        bankPayments = self.env['res.bank.payments'].browse(id)
+        if (not bankPayments):
+            return False
+
+        if (not bank):
+            return False
+        bankPayments.write(bank)
+
+        return True if (bankPayments) else False

+ 26 - 0
models/bank_payments_line.py

@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+from openerp import models, fields, tools, api
+import openerp.addons.decimal_precision as dp
+
+class ResBankPaymentsLine(models.Model):
+    _name = 'res.bank.payments.line'
+
+    amount = fields.Float('amount', digits_compute=dp.get_precision('Account'), required=True, help="Monto del pago")
+    amount_currency = fields.Float('amount currency', digits_compute=dp.get_precision('Account'), required=True, help="importe moneda")
+    currency_id = fields.Many2one('res.currency', string="Currency", help="Moneda de la operación")
+    date = fields.Date()
+    bank_payments_id = fields.Many2one('res.bank.payments', string='Bank Payments', ondelete='restrict', index=True, required=True)
+    statement_line_id = fields.Many2one('account.bank.statement.line', string='Cash Transactions', ondelete='cascade', index=True)
+    statement_id = fields.Many2one('account.bank.statement', string='statement', ondelete='cascade', index=True)
+    name= fields.Char(compute='compute_name_line')
+    type_operation = fields.Selection([('receipt', 'Recibo'), ('payment','Pago'), ('balance','Balance'), ('cashed', 'Cobrado'), ('renegotiated','Renegociado')], 'Tipo de operación',
+                                        help='Tipo de operación  Recibo(Pagos de Clientes)  Pago(Pagos de compras, gastos, hhrr)')
+
+    def compute_name_line(self):
+        self.name = "Payments/Line/ "+str(self.id)
+
+
+class res_bank_payments(models.Model):
+    _inherit = 'res.bank.payments'
+
+    payments_line = fields.One2many('res.bank.payments.line', 'bank_payments_id', string='Payments Lines', help="Lineas de pagos")

+ 163 - 0
models/bank_payments_type.py

@@ -0,0 +1,163 @@
+# -*- coding: utf-8 -*-
+from openerp import models, fields, tools, api
+import openerp
+import simplejson
+
+class ResBankPaymentsType(models.Model):
+    _name = 'res.bank.payments.type'
+
+    name = fields.Char('Name', help="Description of the type of operation.", required=True)
+    is_receipt = fields.Boolean()
+    is_payment = fields.Boolean()
+    code = fields.Char('code', size=64, help="Codigo identificador del tipo de la operación bancaria( Cheques => CH, Tarjetas => TJ, Vale => VL )", required=True)
+    default_state = fields.Selection([('available', 'Disponible'), ('cashed', 'Cobrado'),('deposit','Deposito'), ('negotiated', 'Negociado'), ('renegotiated', 'Renegociado'), ('rejected', 'Rechazado')],'Estado del pago por defecto', default="available", help="Indica un estado para la operación bancaria por defecto", required=True)
+    ## Example {}
+    fields_allowed = fields.Text('Fields Allowed', help="Campos permitido por el tipo de pagos", default={})
+    ## Account Journal
+    journal_ids = fields.Many2many('account.journal', 'account_journal_allowed_payments_type', 'res_bank_payments_type_id', 'account_journal_id', string='Método de pago')
+    allow_duplicate_operation = fields.Boolean(default=True, help="Permitir duplicar la operación Bancaria")
+
+    @api.model
+    def _create_type_payments(self):
+        typePayments = [{
+                            'name': 'Cheques',
+                            'is_receipt': True,
+                            'is_payment': True,
+                            'code': 'CH',
+                            'default_state': 'available',
+                            'allow_duplicate_operation': False
+                        },
+                        {
+                            'name': 'Tarjetas',
+                            'is_receipt': True,
+                            'is_payment': True,
+                            'code': 'TJ',
+                            'default_state': 'cashed',
+                            'allow_duplicate_operation': True
+                        },
+                        {
+                            'name': 'Vale',
+                            'is_receipt': True,
+                            'is_payment': False,
+                            'code': 'VL',
+                            'default_state': 'available',
+                            'allow_duplicate_operation': True
+                        },
+                        {
+                            'name': 'Depósitos bancario',
+                            'is_receipt': True,
+                            'is_payment': True,
+                            'code': 'DB',
+                            'default_state': 'deposit',
+                            'allow_duplicate_operation': True
+                        }]
+        for payment in typePayments:
+            paymentsType = self.env['res.bank.payments.type'].search([('name', '=', payment['name'])])
+            fieldsRequired =  self._get_fields_payments_required()
+            types = {
+                        'name': payment['name'],
+                        'is_receipt': payment['is_receipt'],
+                        'is_payment': payment['is_payment'],
+                        'code': payment['code'],
+                        'default_state': payment['default_state'],
+                        'fields_allowed': fieldsRequired,
+                        'allow_duplicate_operation': payment['allow_duplicate_operation']
+                    }
+            if (not paymentsType):
+                 paymentsType.create(types)
+
+
+    def _get_fields_payments_required(self):
+        fields = self.env['res.bank.payments'].fields_get()
+        fields_sequence = sorted(fields.iteritems(), key=lambda field: openerp.tools.ustr(field[1].get('string', '')))
+        fieldsRequired = []
+        fields_allowed = ['name_holder', 'number', 'number_cta', 'number_cta_origin', 'amount_total', 'bank_id', 'cheque_type_id', 'date_maturity']
+
+        for  name, field in  fields_sequence:
+            if((field['required']) and (name in fields_allowed)):
+                try:
+                    relation = field['relation']
+                except Exception as e:
+                    relation = None
+
+                fieldsRequired.append({
+                        "label": field['help'],
+                        "labelFields": field['help'],
+                        "name": name,
+                        "selected": True,
+                        "string": {
+                            "type": 'model' if(relation) else 'normal',
+                            "typeField": field['type'],
+                            "model": relation if (relation) else '',
+                            "format": "",
+                            "required": field['required'],
+                            "readonly": field['readonly'],
+                            "searchType": "selection" if(relation) else 'none'
+                        }
+                    })
+
+        if (not fieldsRequired):
+            fieldsRequired = {}
+
+        return simplejson.dumps(fieldsRequired)
+
+    '''
+        Create
+    '''
+    @api.model
+    def create(self, vals):
+        fieldsRequired = self._get_fields_payments_required()
+        createConfig = super(ResBankPaymentsType, self).create(vals)
+
+        createConfig.write({'fields_allowed': fieldsRequired})
+        return createConfig
+
+    '''
+        Get Fields Bank payments
+    '''
+    @api.model
+    def get_bank_payments_fields(self):
+        fields = self.env['res.bank.payments'].fields_get()
+        fields_sequence = sorted(fields.iteritems(), key=lambda field: openerp.tools.ustr(field[1].get('string', '')))
+        fields_allowed = ['name_holder', 'number', 'number_cta', 'number_cta_origin', 'amount_total', 'bank_id', 'cheque_type_id', 'date_maturity']
+        fieldPayments = []
+        for  name, field in  fields_sequence:
+            if (name in fields_allowed):
+                fieldPayments.append({
+                    'name': name,
+                    'state': False,
+                    'field': field
+                })
+        return fieldPayments
+
+    '''
+        Save Fields Allowed
+    '''
+    @api.model
+    def save_fields_allowed(self, values):
+        paymentsType = self.env['res.bank.payments.type'].browse(values['id'])
+
+        if (not paymentsType):
+            return False
+
+        paymentsType.write({'fields_allowed': values['fieldsAllowed']})
+        return True if (paymentsType) else False
+
+    '''
+        Get fields Allowed type payment
+    '''
+    def get_bank_payments_type(self, journalId=None):
+        fields = []
+        if (journalId):
+            for line in self.env['res.bank.payments.type'].search([('journal_ids', 'in', journalId)]):
+                fields.append(simplejson.loads(line.fields_allowed))
+
+        return fields if (not fields) else fields[0]
+
+'''
+    res.bank.payments
+'''
+class res_bank_payments(models.Model):
+    _inherit = 'res.bank.payments'
+
+    bank_payments_type_id = fields.Many2one('res.bank.payments.type', string='Bank Type', ondelete='restrict', index=True, required=True, help="Tipo de pago")

+ 199 - 0
models/bank_payments_utility.py

@@ -0,0 +1,199 @@
+# -*- coding: utf-8 -*-
+from openerp import models, fields, tools, api
+import openerp.addons.decimal_precision as dp
+from datetime import datetime
+
+class ResBankPaymentsUtility(models.Model):
+    _inherit = 'res.bank.payments'
+
+    '''
+        [Cambio de Diario la operación bancarias].
+        Efectivizar/Depositar.
+    '''
+    @api.model
+    def get_bank_payments_account_journal(self):
+        journalUtility = []
+        for journal in self.env['account.journal'].search([('active', '=', True), ('type', 'in', ['bank', 'cash'])]):
+            statementJournal = []
+            for statementOpen in self.env['account.bank.statement'].search([('journal_id','in',[journal.id]),('state','!=','confirm')]):
+                if (statementOpen.journal_id.type == 'cash' and statementOpen.state =='draft'):
+                    continue
+
+                statementJournal.append({
+                        'id': statementOpen.id,
+                        'name': statementOpen.name,
+                        'date': statementOpen.date,
+                        'state': statementOpen.state,
+                        'statementName': statementOpen.name+" / "+statementOpen.user_id.name,
+                        'typeStatement':{
+                            'id': statementOpen.type_statement.id,
+                            'name':statementOpen.type_statement.name,
+                        },
+                        'user':{
+                            'id': statementOpen.user_id.id,
+                            'name': statementOpen.user_id.name,
+                        },
+                })
+
+            journalUtility.append({
+                'id': journal.id,
+                'name': journal.name,
+                'code': journal.code,
+                'type': journal.type,
+                'currencyID': journal.currency.id if (journal.currency) else journal.company_id.currency_id.id,
+                'statementJournal': statementJournal
+            })
+        return journalUtility
+
+
+    @api.model
+    def get_bank_payments_charge(self, id):
+        decimal_precision = self.env['decimal.precision'].precision_get('Account')
+        bankPaymnets = []
+
+        for bank in self.env['res.bank.payments'].search([('id', '=', id)]):
+            amountReceipt = 0
+            amountPayment = 0
+            amountBalance = 0
+            amountCashed = 0
+            amountRenegotiated = 0
+
+            currency = None
+            currencyBank = []
+
+            for line in self.env['res.bank.payments.line'].search([('bank_payments_id.id', '=', bank.id)]):
+                if (line.type_operation == 'receipt'):
+                    amountReceipt += line.amount
+
+                if (line.type_operation == 'payment'):
+                    amountPayment += line.amount
+
+                if (line.type_operation == 'balance'):
+                    amountBalance += line.amount
+
+                if (line.type_operation =='cashed'):
+                    amountCashed += line.amount
+
+                if (line.type_operation =='renegotiated'):
+                    amountRenegotiated += line.amount
+
+            if (bank.currency_id):
+                currency = bank.currency_id.id
+            else:
+                currency = self.env.user.company_id.currency_id.id
+
+            currencyBank =self.env['res.currency'].browse(currency)
+
+            bankPaymnets.append({
+                'id': bank.id,
+                'state': bank.state,
+                'amountTotal': bank.amount_total,
+                'amountReceipt': amountReceipt,
+                'amountPayment': amountPayment,
+                'amountBalance': amountBalance,
+                'amountCashed': amountCashed,
+                'amountRenegotiated': amountRenegotiated,
+                'changePaymentMethod': bank.change_payment_method,
+                'currencyId': currencyBank.id,
+                'chequeType': [{
+                    'id': chequeType.id,
+                    'name': chequeType.name,
+                    'code': chequeType.code,
+                    'isCash': chequeType.is_cash,
+                    'isBank': chequeType.is_bank
+                }for chequeType in self.env['res.bank.cheque.type'].search([('id', '=', bank.cheque_type_id.id)])],
+                'bankPaymentsType': [{
+                    'name': pyamentsType.name,
+                    'isReceipt': pyamentsType.is_receipt,
+                    'isPayment': pyamentsType.is_payment,
+                    'code': pyamentsType.code,
+                }for pyamentsType in self.env['res.bank.payments.type'].search([('id', '=', bank.bank_payments_type_id.id)])],
+                'currencyAmount': [{
+                    'id': currency.id,
+                    'symbol': currency.symbol,
+                    'rateSilent': currency.rate_silent,
+                    'rate': currency.rate,
+                    'thousandsSeparator': currency.thousands_separator,
+                    'decimalSeparator': currency.decimal_separator,
+                    'decimalPlaces': currency.decimal_places,
+                    'position': currency.position,
+                    'accuracy': currency.accuracy,
+                    'rounding': currency.rounding,
+                    'amountCurrency': round((bank.amount_total * (currency.rate / currencyBank.rate)), decimal_precision)
+                } for currency in self.env['res.currency'].search([('active', '=', True)])]
+            })
+        return bankPaymnets
+
+
+    '''
+          _____  __           _   _       _
+         | ____|/ _| ___  ___| |_(_)_   _(_)______ _ _ __
+         |  _| | |_ / _ \/ __| __| \ \ / / |_  / _` | '__|
+         | |___|  _|  __/ (__| |_| |\ V /| |/ / (_| | |
+         |_____|_|  \___|\___|\__|_| \_/ |_/___\__,_|_|
+    '''
+    @api.model
+    def balance_bank_payments_charge(self, values):
+        dateServer = datetime.now().strftime('%Y-%m-%d')
+        resUser = self.env.user.id
+
+        ## res.bank.payments
+        bankPayments = self.env['res.bank.payments'].browse(values['id'])
+        if (not bankPayments):
+            return False
+
+        # account.journal
+        accountJournal = self.env['account.journal'].search([('active', '=', True), ('type', 'in', ['bank', 'cash']),('id', '=', values['selectJournal'])])
+        if (not accountJournal):
+            return False
+
+        journalBankLine = bankPayments.payments_line[len(bankPayments.payments_line) -1]
+        if (journalBankLine):
+            journalBank = journalBankLine.statement_id.journal_id
+            StatamenteBank = journalBankLine.statement_id.id
+
+        amount =  bankPayments.amount_total
+        ## Create Bank statement
+        bankStatement = self.eiru_bank_create_bank_statement(dateServer,resUser, accountJournal, values['statementId'])
+        # Create Bank statement Line
+        statementLine = self.create_bank_statement_line(bankStatement.id, abs(amount), bankPayments.id, 'Balance/cobro', values['details'], 'cashed')
+        #  Create Payments Line
+        paymnetsLine = self.create_bank_paymnets_line(abs(amount), bankPayments.id, bankStatement.id, statementLine.id, dateServer, accountJournal.id, 'cashed')
+
+        amount = -amount
+
+        # StatamenteBank
+        bankStatement = self.eiru_bank_create_bank_statement(dateServer,resUser, journalBank, StatamenteBank)
+        # Create Bank statement Line
+        statementLine = self.create_bank_statement_line(bankStatement.id, amount, bankPayments.id, 'Balance/cobro', values['details'], 'cashed')
+        #  Create Payments Line
+        paymnetsLine = self.create_bank_paymnets_line(amount, bankPayments.id, bankStatement.id, statementLine.id, dateServer, journalBank.id, 'cashed')
+
+        return True if (paymnetsLine) else False
+
+    '''
+        Create/write bank_statement.
+    '''
+    def eiru_bank_create_bank_statement(self, dateServer, userId, journal, statementId):
+        accountPeriod = self.env['account.period'].search([('date_start', '<=', dateServer),('date_stop', '>=', dateServer)])
+        domain = [('journal_id', '=', journal.id),('state', '!=', 'confirm')]
+        if (statementId):
+            domain.append(('id', '=', statementId))
+        else:
+            domain.append(('date', '=', dateServer))
+
+        bankStatement = self.env['account.bank.statement'].search(domain)
+
+        if (not bankStatement):
+            bank = {
+                'journal_id': journal.id,
+                'period_id': accountPeriod.id,
+                'date': dateServer,
+                'user_id': userId,
+            }
+            bankStatement = self.env['account.bank.statement'].create(bank)
+
+        if (bankStatement.state != 'open'):
+            bankStatement.button_open()
+
+        return bankStatement

+ 52 - 0
models/res_bank.py

@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+from openerp import models, fields, tools, api
+
+class resBank(models.Model):
+    _inherit = 'res.bank'
+
+    ruc = fields.Char('R.U.C.')
+
+    @api.model
+    def CreateUpdateListBanks(self):
+        bancosPy = [
+                        {'name': 'CITIBANK N.A. SUC. PARAGUAY', 'ruc': '80001906-7', 'phone': '595216202000', 'fax': '595216202222'},
+                        {'name': 'BANCO DO BRASIL S.A.', 'ruc': '80001625-4', 'phone': '+59521490121/6', 'fax': '+59521448761'},
+                        {'name': 'BANCO DE LA NACION ARGENTINA', 'ruc': '80002301-3', 'phone': '+59521444361', 'fax': '+59521444365'},
+                        {'name': 'BANCO ITAU PARAGUAY S.A.', 'ruc': '80002201-7', 'phone': '+595214171000', 'fax': '+595212173707'},
+                        {'name': 'SUDAMERIS BANK SAECA', 'ruc': '80034461-8', 'phone': '+595214166000', 'fax': '+595214166234'},
+                        {'name': 'BBVA (BANCO BILBAO VIZCAYA ARGENTARIA PARAGUAY S.A)', 'ruc': '80022955-0', 'phone': '+595214176000', 'fax': '+59521448103'},
+                        {'name': 'BANCO GNB PARAGUAY SOCIEDAD ANONIMA', 'ruc': '80044227-0', 'phone': '+595216183000', 'fax': ''},
+                        {'name': 'BANCO REGIONAL S.A.E.C.A.', 'ruc': '80020981-8', 'phone': '+595071204740', 'fax': '+595071204745'},
+                        {'name': 'BANCO AMAMBAY S.A.', 'ruc': '80009515-4', 'phone': '+595216187000', 'fax': '+59521608813'},
+                        {'name': 'BANCO CONTINENTAL S.A.E.C.A.', 'ruc': '80019270-2', 'phone': '+595214192000', 'fax': '+595214192450'},
+                        {'name': 'VISION BANCO S.A.E.C.A.', 'ruc': '80009310-0', 'phone': '+595214143000', 'fax': '+595214153190'},
+                        {'name': 'BANCO ITAPUA S.A.E.C.A.', 'ruc': '80002227-0', 'phone': '+595071203461', 'fax': '+595071204572'},
+                        {'name': 'BANCO FAMILIAR S.A.E.C.A.', 'ruc': '80022570-8', 'phone': '+595214142000', 'fax': '+595214142476'},
+                        {'name': 'BANCO ATLAS S.A.', 'ruc': '80024928-3', 'phone': '+595216169000', 'fax': '+59521614600'},
+                        {'name': 'BANCOP S.A.', 'ruc': '80000441-8', 'phone': '+595213255000', 'fax': ''},
+                        {'name': 'INTERFISA BANCO S.A.E.C.A.', 'ruc': '80016889-5', 'phone': '+595214159000', 'fax': ''},
+                        {'name': 'BANCO NACIONAL DE FOMENTO', 'ruc': '80000856-1', 'phone': '', 'fax': ''},
+                        {'name': 'FINANCIERA EL COMERCIO S.A.E.C.A.', 'ruc': '80026157-7', 'phone': '', 'fax': ''},
+                        {'name': 'FINANCIERA PARAGUAYO – JAPONESA S.A.E.C.A.', 'ruc': '80026277-8', 'phone': '', 'fax': ''},
+                        {'name': 'SOLAR DE AHORRO Y FINANZAS S.A.E.C.A. ', 'ruc': 'xxxx', 'phone': '', 'fax': ''},
+                        {'name': 'FINEXPAR S.A.E.C.A. ', 'ruc': '80086018-7', 'phone': '', 'fax': ''},
+                        {'name': 'CRISOL Y ENCARNACIÓN FINANCIERA S.A.E.C.A. – CEFISA ', 'ruc': 'xxxx', 'phone': '', 'fax': ''},
+                        {'name': 'FINLATINA S.A. DE FINANZAS', 'ruc': '80008036-0', 'phone': '', 'fax': ''},
+                        {'name': 'FINANCIERA RIO S.A.E.C.A.', 'ruc': '80059206-9', 'phone': '', 'fax': ''},
+                        {'name': 'TU FINANCIERA S.A.E.C.A.', 'ruc': '80064698-3', 'phone': '', 'fax': ''},
+                        {'name': 'FIC S.A. DE FINANZAS', 'ruc': 'xxxx', 'phone': '', 'fax': ''},
+                        {'name': 'ITAIPU BINACIONAL', 'ruc': 'xxxx', 'phone': '+595615998989', 'fax': ''},
+                        {'name': 'TABACALERA DEL ESTE S.A.', 'ruc': 'xxxx', 'phone': '+59563122446', 'fax': '+59563122116'}
+                    ]
+
+        for bancos in bancosPy:
+            bank = self.env['res.bank'].search([('name', '=', bancos['name'])])
+            banco = {
+                'name': bancos['name'],
+                'ruc': bancos['ruc'],
+                'phone': bancos['phone'],
+                'fax': bancos['fax']
+            }
+
+            if (not bank):
+                bank.create(banco)

+ 30 - 0
models/res_bank_cheque_type.py

@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+from openerp import models, fields, tools, api
+
+class resBankChequeType(models.Model):
+    _name = 'res.bank.cheque.type'
+
+    name = fields.Char('Name', help="Descripción tipo de cheque", required=True)
+    code = fields.Char('code', size=64, required=True)
+    is_cash = fields.Boolean()
+    is_bank = fields.Boolean()
+
+    @api.model
+    def _create_cheque_type(self):
+        typeCheck = [
+            {'name': 'Cruzado', 'code': 'CRUZADO', 'is_cash': False, 'is_bank': True},
+            {'name': 'Vista', 'code': 'VISTA', 'is_cash': True, 'is_bank': True},
+            {'name': 'Diferido', 'code': 'DIFERIDO', 'is_cash': True, 'is_bank': True}
+        ]
+        for check in typeCheck:
+            checksType = self.env['res.bank.cheque.type'].search([('name', '=', check['name'])])
+            types = {'name': check['name'], 'code': check['code'], 'is_cash': check['is_cash'],'is_bank': check['is_bank']}
+
+            if (not checksType):
+                checksType.create(types)
+
+
+class res_bank_payments(models.Model):
+    _inherit = 'res.bank.payments'
+
+    cheque_type_id = fields.Many2one('res.bank.cheque.type', string='Tipo de cheque', ondelete='restrict', index=True, help='Tipo de cheque')

+ 6 - 0
security/ir.model.access.csv

@@ -0,0 +1,6 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_res_bank_from,res.bank,model_res_bank,account.group_account_user,1,1,1,1
+access_res_bank_payments_type_from,res.bank.payments.type,model_res_bank_payments_type,account.group_account_user,1,1,1,1
+access_res_bank_payments_from,res.bank.payments,model_res_bank_payments,account.group_account_user,1,1,1,1
+access_res_bank_payments_line_from,res.bank.payments.line,model_res_bank_payments_line,account.group_account_user,1,1,1,1
+access_res_bank_cheque_type_from,res.bank.cheque.type,model_res_bank_cheque_type,account.group_account_user,1,1,1,1

BIN
static/description/icon.png


+ 233 - 0
static/src/css/style.css

@@ -0,0 +1,233 @@
+.customer-returned {
+    width: auto;
+    float: left;
+}
+.supplier-returned {
+    width: auto;
+    float: left;
+}
+.paymnet-charge {
+    width: auto;
+    float: left;
+}
+.paymnet-reject {
+    width: auto;
+    float: left;
+}
+.paymnet-renegotiate {
+    width: auto;
+    float: left;
+}
+.bank-payments-hr {
+    border: 0px;
+}
+.from-title-h3 {
+    font-size: 9pt !important;
+    margin-top: 0px;
+    margin-bottom: 10px;
+    padding-left: 12px;
+    color: #ccc;
+}
+.from-title-hr {
+    margin-bottom: 10px;
+    margin-top: 5px
+}
+.bank-payments-notification{
+    font-size: 12px;
+    color: red;
+}
+.bank-payments-radio-label{
+    font-size: 12pt;
+}
+.bank-payments-label {
+    width: 100px;
+    height: 35px;
+    font-size: 17px;
+    padding-top: 5px;
+    padding-left: 5px;
+}
+.label-charge {
+    width: 150px;
+}
+.position-right {
+    width: 50%;
+    float: right;
+    text-align: right;
+}
+.label-selected {
+    width: 150px;
+}
+.details-charge-label {
+    width: 200px;
+}
+.label-renegotiate {
+    width: 150px;
+}
+.bank-payments-group {
+    width: calc(100% - 100px);
+    height: 35px;
+    padding-left: 5px;
+    padding-right: 5px;
+    float: right;
+}
+.input-charge {
+    width: calc(100% - 150px);
+}
+.input-selected {
+    width: calc(100% - 150px);
+}
+
+.details-charge {
+    width: calc(100% - 200px);
+}
+.input-renegotiate {
+    width: calc(100% - 150px);
+}
+.bank-payments-input {
+    width: calc(100% - 30px);
+    height: 35px;
+    float: left;
+    font-size: 14pt;
+    text-align: right;
+}
+.details-charge-input{
+    text-align: left;
+}
+.select-input {
+    width: 100%;
+}
+.input-text {
+    width: 100%;
+}
+.input-date{
+    width: 150px
+}
+.input-group-append-symbol {
+    width: 30px;
+    height: 35px !important;
+    float: right;
+    text-align: center;
+    font-size: 17pt;
+    border: 1px solid #ccc;
+    background: #e3e3e3;
+}
+.bank-payments-button {
+    font-size: 12pt !important;
+    width: 130px;
+    height: 35px;
+}
+.details-paymnets-renegotiate {
+    display: none;
+}
+.details-paymnets-renegotiate-otres {
+    display: none;
+}
+.details-paymnets-renegotiate-check-cashing {
+    display: none;
+}
+.wait-payments-select{
+    display: none;
+}
+.other-payments-select{
+    display: none;
+}
+.expired-account-modal .table-row-selected {
+     background: #d4e2f3  !important;
+}
+
+.is-open-cashbox{
+    display: none;
+}
+/**
+    [TABLE]
+*/
+.expired-account-modal .modal-head-wrapper-payments-type-config {
+    width: 100%;
+}
+.expired-account-modal .modal-item-paymnets-type-config {
+    width: 100%;
+    height: 321px;
+    overflow-y: auto;
+}
+.expired-account-modal .payments-type-config-table table tbody tr{
+    height: 40px
+}
+/* name */
+.expired-account-modal .payments-type-config-table table tbody tr td:nth-child(1){
+    display: none;
+}
+.expired-account-modal .payments-type-config-table table thead tr th:nth-child(1){
+    display: none;
+}
+/* Select */
+.expired-account-modal .payments-type-config-table table tbody tr td:nth-child(2){
+    width: 50px ;
+    text-align: center;
+    padding-top: 10px;
+}
+.expired-account-modal .payments-type-config-table table thead tr th:nth-child(2){
+    width: 50px;
+}
+
+/* Label */
+.expired-account-modal .payments-type-config-table table tbody tr td:nth-child(3){
+    width: 288px;
+    font-size: 10pt;
+    padding-left: 10px;
+    padding-top: 10px;
+}
+.expired-account-modal .payments-type-config-table table thead tr th:nth-child(3){
+    width: 288px;
+    font-size: 12pt;
+    padding-left: 10px;
+    font-weight: bold;
+}
+/* No Edtable */
+.expired-account-modal .payments-type-config-table table tbody tr td:nth-child(4){
+    width: 100px ;
+    text-align: center;
+    padding-top: 10px;
+}
+.expired-account-modal .payments-type-config-table table thead tr th:nth-child(4){
+    width: 100px;
+    font-size: 12pt;
+    padding-left: 10px;
+    font-weight: bold;
+}
+/* Required */
+.expired-account-modal .payments-type-config-table table tbody tr td:nth-child(5){
+    width: 100px ;
+    text-align: center;
+    padding-top: 10px;
+}
+.expired-account-modal .payments-type-config-table table thead tr th:nth-child(5){
+    width: 100px;
+    font-size: 12pt;
+    padding-left: 10px;
+    font-weight: bold;
+}
+/* Formato */
+.expired-account-modal .payments-type-config-table table tbody tr td:nth-child(6){
+    width: 150px;
+    font-size: 10pt;
+    padding-left: 10px;
+    padding-top: 10px;
+}
+.expired-account-modal .payments-type-config-table table thead tr th:nth-child(6){
+    width: 150px;
+    font-size: 12pt;
+    padding-left: 10px;
+    font-weight: bold;
+}
+/* Type Search */
+.expired-account-modal .payments-type-config-table table tbody tr td:nth-child(7){
+    font-size: 10pt;
+    padding-left: 10px;
+    padding-top: 10px;
+}
+.expired-account-modal .payments-type-config-table table thead tr th:nth-child(7){
+    width: 150px;
+    font-size: 12pt;
+    padding-left: 10px;
+    font-weight: bold;
+}

+ 282 - 0
static/src/js/bank_payments_charge.js

@@ -0,0 +1,282 @@
+(function() {
+
+    openerp.widgetInstanceCharge = null;
+    openerp.parentInstanceCharge = {};
+    var QWeb = openerp.web.qweb;
+    var instanceWeb = openerp.web;
+    openerp.BankPaymentsCharge = openerp.Widget.extend({
+        template: 'bank_payments.Charge',
+        id: undefined,
+        buttons: undefined,
+        bankPayments: [],
+        accountJournal: [],
+        typeOperation: 'cashed',
+        refPayments: 'Balance/cobro/',
+
+        /* init */
+        init: function(parent) {
+            this._super(parent);
+            this.buttons = parent.$buttons;
+        },
+        /* start */
+        start: function () {
+            var self = this;
+            this.$el.find('.bank-payments-charge').click(function(){
+                self.fetchInitial();
+            });
+            self.buttons.click(function(e) {
+                /* C (Crear) */
+                if (e.target.accessKey === 'C')
+                    self.$el.css('display','none');
+                /* 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');
+            });
+        },
+        /* Check state*/
+        checkState: function(id, state) {
+            var self = this;
+            self.id = id;
+            this.$el.find('.bank-payments-charge').css('display','flex');
+            if (state !== 'available'){
+                this.$el.find('.bank-payments-charge').css('display','none');
+            }
+        },
+        /* reloadPage */
+        reloadPage: function() {
+             openerp.parentInstanceCharge.reload();
+        },
+        /* Description: Función para remover el modal */
+        removeModal: function() {
+            $('.expired-account-modal').remove();
+            $('.modal-backdrop').remove();
+        },
+        /* Método inicial  */
+        fetchInitial: function() {
+            var self = this;
+            self.fetchBankPayments(self.id).then(function(bankPayments) {
+                return bankPayments;
+            }).then(function(bankPayments) {
+                self.bankPayments = bankPayments;
+                return self.fetchBankPaymentsJournal();
+            }).then(function(accountJournal){
+                self.accountJournal = accountJournal;
+                return self.showModalReturned();
+        });
+        },
+        fetchBankPaymentsJournal: function(id) {
+            var bankStatement = new instanceWeb.Model('res.bank.payments');
+            return bankStatement.call('get_bank_payments_account_journal',{
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /* bank payments */
+        fetchBankPayments: function(id) {
+            var bankPayments = new instanceWeb.Model('res.bank.payments');
+            return bankPayments.call('get_bank_payments_charge',[id],{
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        // /* Generar Cobro */
+        balanceBankPaymentsCustomers: function(bankCharge) {
+            var bankPayments = new instanceWeb.Model('res.bank.payments');
+            return bankPayments.call('balance_bank_payments_charge',[bankCharge], {
+                    context: new openerp.web.CompoundContext()
+            });
+        },
+        /* Get Ammoutn CUrrency */
+        getAmountCurrency: function(currencyId) {
+            var self = this;
+            var bankPayments =  self.bankPayments[0];
+            return _.filter(bankPayments.currencyAmount, function(item) {
+                return item.id === currencyId;
+            });
+        },
+        /* get Journal select */
+        getJournalSelected: function(id){
+            var self = this
+            return _.filter(self.accountJournal, function(item) {
+                return item.id === id;
+            });
+        },
+        /* get statement journal */
+        getStatementeJournal: function(statement,id) {
+            return _.filter(statement, function(item) {
+                return  item.id === id;
+            });
+        },
+        /* Modal */
+        showModalReturned: function() {
+            var self = this;
+            var defer =$.Deferred();
+            var results = true;
+            var bankPayments =  self.bankPayments[0];
+            var journal = self.accountJournal;
+
+            if (!!journal){
+                journal.unshift({
+                    'id':'',
+                    'name':''
+                });
+            }
+
+            var amountCUrrency = self.getAmountCurrency(bankPayments.currencyId).shift();
+            if (!amountCUrrency)
+                return false;
+
+            var modal = QWeb.render('bank_payments.ModalCharge' ,{
+                journal: journal,
+            });
+
+            $('.openerp_webclient_container').after(modal);
+            $('.expired-account-modal').modal();
+
+            /* Cerrar */
+            $('.expired-account-modal').on('hidden.bs.modal', function (e) {
+                results = false;
+                defer.resolve(results);
+                self.removeModal(e);
+            });
+
+            /* Total Ammount  */
+            var amountTotal = $('.expired-account-modal').find('.amount-total');
+            var symbolAmountTotal = $('.expired-account-modal').find('.symbol-amount-total');
+            var selectJournal = $('.expired-account-modal').find('.select-journal');
+            var selectStatement = $('.expired-account-modal').find('.select-statement');
+            var detailsChargeInput = $('.expired-account-modal').find('.details-charge-input');
+            /* Aceptar */
+            var buttonSave = $('.expired-account-modal').find('.button-save');
+
+            /* */
+            amountTotal.val(accounting.formatNumber(amountCUrrency.amountCurrency,amountCUrrency.decimalPlaces,amountCUrrency.thousandsSeparator,amountCUrrency.decimalSeparator))
+            symbolAmountTotal.text(amountCUrrency.symbol);
+
+            /* change Journal */
+            selectJournal.change(function(e) {
+                journalSelect = self.getJournalSelected(parseInt(selectJournal.val())).shift();
+                amountCUrrency = self.getAmountCurrency(bankPayments.currencyId).shift();
+
+                $('.expired-account-modal').find('.is-open-cashbox').css('display', 'none');
+                selectStatement.empty();
+
+                if (journalSelect){
+                    amountCUrrency = self.getAmountCurrency(journalSelect.currencyID).shift();
+                    if (journalSelect.statementJournal.length) {
+                        $('.expired-account-modal').find('.is-open-cashbox').css('display', 'flex');
+                        var cashboxOpen = '<option value=""></option>';
+                        _.each(journalSelect.statementJournal, function(item) {
+                            cashboxOpen += '<option value="'+item.id+'">'+item.statementName+'</option>';
+                        });
+                        selectStatement.append(cashboxOpen);
+                    }
+                }
+                amountTotal.val(accounting.formatNumber(amountCUrrency.amountCurrency,amountCUrrency.decimalPlaces,amountCUrrency.thousandsSeparator,amountCUrrency.decimalSeparator))
+                symbolAmountTotal.text(amountCUrrency.symbol);
+            });
+
+            buttonSave.click(function(e){
+                // amountTotal
+
+                journal = self.getJournalSelected(parseInt(selectJournal.val())).shift();
+                if (!journal) {
+                    instanceWeb.notification.do_warn("Atencion", "Tienes que seleccionar un método de pago para continuar.");
+                    selectJournal.css('border-color','red');
+                    selectJournal.focus();
+                    return false;
+                }
+                selectJournal.css('border-color','#ccc');
+                var statement = self.getStatementeJournal(journal.statementJournal, parseInt(selectStatement.val()));
+
+                if (!!journal.statementJournal.length && !statement.length) {
+                    instanceWeb.notification.do_warn("Atencion", "Tienes que seleccionar una caja para continuar.");
+                    selectStatement.css('border-color','red');
+                    selectStatement.focus();
+                    return;
+                }
+                selectStatement.css('border-color','#ccc');
+
+
+                if (!detailsChargeInput.val().trim()) {
+                    instanceWeb.notification.do_warn("Atencion", "Debes seleccionar un método de pago para continuar.");
+                    detailsChargeInput.css('border-color','red');
+                    detailsChargeInput.focus();
+                    return;
+                }
+                detailsChargeInput.css('border-color','#ccc');
+
+                var chequeType = bankPayments.chequeType;
+                if (chequeType.length) {
+                    if (!chequeType[0].isCash && journal.type ==="cash") {
+                        instanceWeb.notification.do_warn("Atencion", "El tipo de cheque no permite operación de tipo efectivo.");
+                        selectJournal.css('border-color','red');
+                        selectJournal.focus();
+                        return false;
+                    }
+                    if (!chequeType[0].isBank && journal.type ==="bank") {
+                        instanceWeb.notification.do_warn("Atencion", "El tipo de cheque no permite operación de tipo banco.");
+                        selectJournal.css('border-color','red');
+                        selectJournal.focus();
+                        return false;
+                    }
+                    selectJournal.css('border-color','#ccc');
+                }
+
+                bankCharge = {
+                    'id' :self.id,
+                    'selectJournal': journal.id,
+                    'statementId': !!statement.length ?statement[0].id :'',
+                    'details': detailsChargeInput.val().trim(),
+                }
+
+                self.balanceBankPaymentsCustomers(bankCharge).then(function(resultsBanalnce) {
+                    return resultsBanalnce;
+                }).then(function(resultsBanalnce) {
+                    self.reloadPage()
+                    if (!resultsBanalnce)
+                        results = false;
+                });
+
+                defer.resolve(results);
+               self.removeModal(e);
+            })
+
+            return defer;
+        },
+
+    });
+
+    if (openerp.web && openerp.web.FormView) {
+        openerp.web.FormView.include({
+            load_record: function(record) {
+                this._super.apply(this, arguments);
+
+                if (this.model !== 'res.bank.payments')
+                    return;
+
+                openerp.parentInstanceCharge = this;
+
+                if (openerp.widgetInstanceCharge) {
+                    openerp.widgetInstanceCharge.checkState(record.id, record.state);
+                    if (this.$el.find('.paymnet-charge').length !== 0)
+                        return;
+                }
+
+                if (this.$el.find('.paymnet-charge').length !== 0)
+                    return;
+
+                openerp.widgetInstanceCharge = new openerp.BankPaymentsCharge(this);
+
+                var element =this.$el.find('.oe_form').find('.bank-paymnets-bank');
+
+                openerp.widgetInstanceCharge.appendTo(element[0]);
+                openerp.widgetInstanceCharge.checkState(record.id, record.state);
+            }
+        });
+    }
+})();

+ 393 - 0
static/src/js/bank_payments_customer_returned.js

@@ -0,0 +1,393 @@
+(function() {
+
+    openerp.widgetInstanceCustomerReturned = null;
+    openerp.parentInstanceCustomerReturned = {};
+    var QWeb = openerp.web.qweb;
+
+    openerp.BankPaymentsCustomerReturned = openerp.Widget.extend({
+        template: 'bank_payments.CustomerReturnedWidget',
+        id: undefined,
+        state: undefined,
+        buttons: undefined,
+        bankPayments: [],
+        bankPaymentsLine: [],
+        accountJournal: [],
+        resCompany: [],
+        resCurrency: [],
+        currencySelect: [],
+        bankPaymentsReceipt: [],
+        typeOperation: 'receipt',
+        refPayments: 'Balance/devuelto a cliente/',
+        messageError: '',
+
+        /* init */
+        init: function(parent) {
+            this._super(parent);
+            this.buttons = parent.$buttons;
+        },
+        /* start */
+        start: function () {
+            var self = this;
+
+            this.$el.find('.bank-payments-customer').click(function() {
+                self.fetchInitial();
+            });
+            self.buttons.click(function(e) {
+                /* C (Crear) */
+                if (e.target.accessKey === 'C')
+                    self.$el.css('display','none');
+                /* 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');
+            });
+        },
+        /* Check state*/
+        checkState: function(id, state) {
+            var self = this;
+            self.id = id;
+            self.state = state
+
+            this.$el.find('.bank-payments-customer').css('display','flex');
+            if (state !== 'available') {
+                this.$el.find('.bank-payments-customer').css('display','none');
+            }
+        },
+        /* reloadPage */
+        reloadPage: function() {
+             openerp.parentInstanceCustomerReturned.reload();
+        },
+        /* Description: Función para remover el modal */
+        removeModal: function() {
+            $('.expired-account-modal').remove();
+            $('.modal-backdrop').remove();
+        },
+        /* Método inicial  */
+        fetchInitial: function() {
+            var self = this;
+            self.fetchBankPayments(self.id).then(function(bankPayments) {
+                return bankPayments;
+            }).then(function(bankPayments) {
+                self.bankPayments = bankPayments;
+                return self.fetchBankPaymentsLine(self.id);
+            }).then(function(bankPaymentsLine) {
+                self.bankPaymentsLine = bankPaymentsLine;
+                return self.fetchACcountJournal();
+            }).then(function(accountJournal) {
+                self.accountJournal = accountJournal;
+                return self.fetchResCompany();
+            }).then(function(resCompany) {
+                self.resCompany = resCompany;
+                return self.fetchResCurrency();
+            }).then(function(resCurrency) {
+                self.resCurrency = resCurrency;
+                return self.generateReturned()
+            }).then(function(bankPaymentsReceipt) {
+                self.bankPaymentsReceipt = bankPaymentsReceipt;
+                if (!self.bankPaymentsReceipt.length) {
+                    openerp.web.notification.do_warn("Atencion", self.messageError );
+                    return false;
+                }
+                return self.showModalReturned();
+            })
+        },
+        /* bank payments */
+        fetchBankPayments: function(id) {
+            var bankPaymnets = new openerp.web.Model('res.bank.payments');
+            var fields = ['id', 'state', 'payments_line', 'amount_receipt', 'amount_payment', 'amount_total','currency_id', 'customer_id'];
+            var domain = [['id', '=', id]];
+            return bankPaymnets.query(fields).filter(domain).all();
+        },
+        /* Bank Paymnets line*/
+        fetchBankPaymentsLine: function(bankPaymnetId) {
+            var paymentLine = new openerp.web.Model('res.bank.payments.line');
+            var fields = ['id', 'amount','type_operation', 'bank_payments_id'];
+            var domain = [['bank_payments_id', '=', bankPaymnetId],['type_operation','=','receipt']];
+            return paymentLine.query(fields).filter(domain).all();
+        },
+        /*Account Journal  */
+        fetchACcountJournal: function() {
+            var fields = ['id', 'name', 'code', 'type', 'currency', 'default_debit_account_id', 'default_credit_account_id'];
+            var domain = [['active', '=', true], ['type', 'in', ['bank', 'cash']]];
+            var journalSalario = new openerp.web.Model('account.journal');
+            return journalSalario.query(fields).filter(domain).all();
+        },
+        /* Consultar Compania */
+        fetchResCompany: function() {
+            var fields = ['id','name', 'currency_id'];
+            var domain = [['id', '=', 1]];
+            var resCompanyIds = new openerp.web.Model('res.company');
+            return resCompanyIds.query(fields).filter(domain).all();
+        },
+        /* Consultar Moneda Activas */
+        fetchResCurrency : function() {
+            var fields = ['id','name', 'symbol', 'rate_silent', 'base', 'decimal_separator', 'decimal_places', 'thousands_separator', 'symbol_position', 'rate'];
+            var domain = [['active','=', true]];
+            var resCurrecy = new openerp.web.Model('res.currency');
+            return resCurrecy.query(fields).filter(domain).all();
+        },
+        /* Generar Vuelto  */
+        generateReturned: function() {
+            var self = this;
+            var bankPayments = self.bankPayments[0];
+            var  amountReceipt = 0;
+            var  bankPaymentsReceipt = [];
+            self.messageError= "No tienes nada que devolver.";
+
+            if(!bankPayments.customer_id) {
+                self.messageError= "Tienes que indicar de quien recibiste el documento.";
+                return false ;
+            }
+
+            if (bankPayments.state != "available")
+                return false;
+
+            self.currencySelect = self.getCurrency(bankPayments.currency_id[0]).shift();
+            if (!self.currencySelect){
+                self.messageError= "Tienes que seleccionar la moneda de la operación.";
+                return false ;
+            }
+
+            _.each(self.bankPaymentsLine, function(item) {
+                amountReceipt += item.amount;
+            });
+
+            if (bankPayments.amount_total - amountReceipt <= 0)
+                return false;
+
+            bankPaymentsReceipt.push({
+                'amountReceipt': bankPayments.amount_total - amountReceipt,
+                'amountFormat': accounting.formatNumber((bankPayments.amount_total - amountReceipt), self.currencySelect.decimal_places, self.currencySelect.thousands_separator, self.currencySelect.decimal_separator),
+                'currencySymbol': self.currencySelect.symbol,
+                'date': moment().format('DD/MM/YYYY'),
+                'rate': self.currencySelect.rate
+            });
+
+            return bankPaymentsReceipt;
+        },
+        /* Recalcule Receipt*/
+        recalculateReceipt: function(currencySelect, bankPaymentsReceipt){
+            var self = this;
+            var changeCurrency = [];
+            var amountReceipt = 0;
+            if (!currencySelect || !bankPaymentsReceipt)
+                return;
+
+            amountReceipt = (bankPaymentsReceipt.amountReceipt * (currencySelect.rate / bankPaymentsReceipt.rate));
+
+            changeCurrency.push({
+                'amountReceipt': amountReceipt,
+                'amountFormat': accounting.formatNumber((amountReceipt), currencySelect.decimal_places, currencySelect.thousands_separator, currencySelect.decimal_separator),
+                'currencySymbol': currencySelect.symbol,
+                'date': moment().format('DD/MM/YYYY'),
+                'rate': currencySelect.rate
+            });
+            self.bankPaymentsReceipt = changeCurrency;
+            return changeCurrency;
+        },
+        /* Get Currency*/
+        getCurrency: function(id){
+            var self = this;
+            return _.filter(self.resCurrency, function(item) {
+                return item.id === id;
+            });
+        },
+        /* Get Journal*/
+        getJournal: function(code){
+            var self = this;
+            return _.filter(self.accountJournal, function(item) {
+                return item.code === code;
+            });
+        },
+        /* Select Journal Change */
+        getSelectedJournal: function(code, company) {
+            var self = this;
+            var journal = self.getJournal(code).shift();
+            var company = self.resCompany;
+
+            if (!journal)
+                return [];
+
+            if (!journal.currency) {
+                self.currencySelect = self.getCurrency(company[0].currency_id[0]);
+            }else {
+                self.currencySelect = self.getCurrency(journal.currency[0]);
+            }
+
+            return !!self.currencySelect ? self.currencySelect : [];
+        },
+        /* Generar Balance */
+        balanceBankPaymentsCustomers: function(selectJournal,amountReceipt) {
+            var self = this;
+            var defer = $.Deferred();
+            var bankPayments = new openerp.web.Model('res.bank.payments');
+
+            bankPayments.call('balance_bank_payments',[
+                {
+                    id: self.id,
+                    amountReceipt: amountReceipt,
+                    selectJournal: selectJournal,
+                    typeOperation: self.typeOperation,
+                    refPayments: self.refPayments,
+                    details: 'Vuelto'
+                }
+            ], {
+                    context: new openerp.web.CompoundContext()
+            }).then(function(results){
+                    defer.resolve(results);
+            });
+
+            return defer;
+        },
+        /* Receipt */
+        showModalReturned: function() {
+            var self = this;
+            var defer =$.Deferred();
+            var results = true;
+            var currencyJournal = [];
+            var newAmountReceipt = [];
+
+            var modal = QWeb.render('bank_payments.ModalReturnedWidget' ,{
+                journal: self.accountJournal,
+                bankPaymentsReceipt: self.bankPaymentsReceipt,
+            });
+
+            $('.openerp_webclient_container').after(modal);
+            $('.expired-account-modal').modal();
+            /* Cerrar */
+            $('.expired-account-modal').on('hidden.bs.modal', function (e) {
+                results = false;
+                defer.resolve(results);
+                self.removeModal(e);
+            });
+            /* Receipt */
+            var inputAmountReceiptTotal = $('.expired-account-modal').find('.amount-receipt-total');
+            var symbolAmountReceiptTotal = $('.expired-account-modal').find('.symbol-receipt-total');
+            /* Monto*/
+            var inputAmountReceipt = $('.expired-account-modal').find('.amount-receipt');
+            var symbolAmountReceipt = $('.expired-account-modal').find('.symbol-receipt');
+            /* Jouanl */
+            var selectJournal = $('.expired-account-modal').find('.select-input');
+            /* Aceptar */
+            var addReceipt = $('.expired-account-modal').find('.add-receipt');
+
+            /* Recalcular el vuelto según el diario seleccionado */
+            currencyJournal = self.getSelectedJournal(selectJournal.val()).shift();
+
+            newAmountReceipt = self.recalculateReceipt(currencyJournal, self.bankPaymentsReceipt[0]);
+
+            if (!!newAmountReceipt.length) {
+                inputAmountReceipt.val(newAmountReceipt[0].amountFormat);
+                symbolAmountReceipt.text(newAmountReceipt[0].currencySymbol);
+                inputAmountReceiptTotal.val(newAmountReceipt[0].amountFormat);
+                symbolAmountReceiptTotal.text(newAmountReceipt[0].currencySymbol);
+            }
+            /* change Journal */
+            selectJournal.change(function(e) {
+                /* Recalcular el vuelto según el diario seleccionado */
+                currencyJournal = self.getSelectedJournal(selectJournal.val()).shift();
+                newAmountReceipt = self.recalculateReceipt(currencyJournal, self.bankPaymentsReceipt[0]);
+                if (!!newAmountReceipt.length) {
+                    inputAmountReceipt.val(newAmountReceipt[0].amountFormat);
+                    symbolAmountReceipt.text(newAmountReceipt[0].currencySymbol);
+                    inputAmountReceiptTotal.val(newAmountReceipt[0].amountFormat);
+                    symbolAmountReceiptTotal.text(newAmountReceipt[0].currencySymbol);
+                }
+            });
+            /*Monto */
+            inputAmountReceipt.keyup(function(e) {
+                currencyJournal = self.getSelectedJournal(selectJournal.val()).shift();
+                var amount_add = (accounting.unformat(inputAmountReceipt.val(),currencyJournal.decimal_separator));
+                inputAmountReceipt.val(accounting.formatNumber(amount_add, 0, currencyJournal.thousands_separator, currencyJournal.decimal_separator));
+                inputAmountReceipt.css('border-color','#ccc');
+
+                if (e.keyCode === 13)
+                    addReceipt.focus();
+            });
+            /* Monto */
+            inputAmountReceipt.focusout(function(e) {
+                currencyJournal = self.getSelectedJournal(selectJournal.val()).shift();
+                var amountTotal = (accounting.unformat(inputAmountReceiptTotal.val(),currencyJournal.decimal_separator));
+                var amountAdd = (accounting.unformat(inputAmountReceipt.val(),currencyJournal.decimal_separator));
+                if (amountTotal <  amountAdd) {
+                    openerp.web.notification.do_warn("Atencion", "El valor ingresado supera el monto a devolver.");
+                    inputAmountReceipt.css('border-color','red');
+                    inputAmountReceipt.focus();
+                }
+                inputAmountReceipt.val(accounting.formatNumber(amountAdd, currencyJournal.decimal_places, currencyJournal.thousands_separator, currencyJournal.decimal_separator));
+            });
+
+            /* Aceptar */
+            addReceipt.click(function(e) {
+                var amountTotal = (accounting.unformat(inputAmountReceiptTotal.val(),currencyJournal.decimal_separator));
+                var amountReceipt = (accounting.unformat(inputAmountReceipt.val(),currencyJournal.decimal_separator));
+                if (!selectJournal.val()) {
+                    openerp.web.notification.do_warn("Atencion", "Debes seleccionar un método de pago para continuar.");
+                    selectJournal.css('border-color','red');
+                    return;
+                }
+                selectJournal.css('border-color','#ccc');
+                if (amountReceipt <= 0) {
+                    openerp.web.notification.do_warn("Atencion", "El monto ingresado no ser 0");
+                    inputAmountReceipt.css('border-color','red');
+                    return;
+                }
+
+                if (amountTotal < amountReceipt) {
+                    openerp.web.notification.do_warn("Atencion", "El valor ingresado supera el monto a devolver.");
+                    inputAmountReceipt.css('border-color','red');
+                    return;
+                }
+                inputAmountReceipt.css('border-color','#ccc');
+                if ((self.bankPaymentsReceipt[0].amountReceipt - amountReceipt > 0.00) && (self.bankPaymentsReceipt[0].amountReceipt - amountReceipt < 0.11)) {
+                    amountReceipt = self.bankPaymentsReceipt[0].amountReceipt;
+                }
+
+                self.balanceBankPaymentsCustomers(selectJournal.val(), amountReceipt).then(function(resultsBanalnce) {
+                    return resultsBanalnce;
+                }).then(function(resultsBanalnce) {
+                    self.reloadPage();
+                    if (!resultsBanalnce)
+                        results = false;
+                });
+
+                defer.resolve(results);
+                self.removeModal(e);
+            });
+            return defer;
+        },
+    });
+
+    if (openerp.web && openerp.web.FormView) {
+        openerp.web.FormView.include({
+            load_record: function(record) {
+                this._super.apply(this, arguments);
+
+                if (this.model !== 'res.bank.payments')
+                    return;
+
+                openerp.parentInstanceCustomerReturned = this;
+                if (openerp.widgetInstanceCustomerReturned) {
+                    openerp.widgetInstanceCustomerReturned.checkState(record.id, record.state);
+                    if (this.$el.find('.customer-returned').length !== 0 )
+                        return
+                }
+
+                if (this.$el.find('.customer-returned').length !== 0 )
+                    return;
+
+                openerp.widgetInstanceCustomerReturned = new openerp.BankPaymentsCustomerReturned(this);
+
+                var element =this.$el.find('.oe_form').find('.bank-paymnets-bank');
+
+                openerp.widgetInstanceCustomerReturned.appendTo(element[0]);
+                openerp.widgetInstanceCustomerReturned.checkState(record.id, record.state);
+            }
+        });
+    }
+})();

+ 417 - 0
static/src/js/bank_payments_reject.js

@@ -0,0 +1,417 @@
+(function() {
+
+    openerp.widgetInstanceReject = null;
+    openerp.parentInstanceReject = {};
+    var QWeb = openerp.web.qweb;
+
+    openerp.BankPaymentsReject = openerp.Widget.extend({
+        template: 'bank_payments.Reject',
+        id: undefined,
+        buttons: undefined,
+        bankPayments: [],
+        bankPaymentsLine: [],
+        bankPaymentsType: [],
+        accountJournal: [],
+        currencySelect: [],
+        resCompany: [],
+        resCurrency: [],
+        /* init */
+        init: function(parent) {
+            this._super(parent);
+            this.buttons = parent.$buttons;
+        },
+        /* start */
+        start: function () {
+            var self = this;
+            this.$el.find('.bank-payments-reject').click(function() {
+                self.fetchInitial();
+            });
+            self.buttons.click(function(e) {
+                /* C (Crear) */
+                if (e.target.accessKey === 'C')
+                    self.$el.css('display','none');
+                /* 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');
+            });
+        },
+        /* Check state*/
+        checkState: function(id, state) {
+            var self = this;
+            self.id = id;
+            this.$el.find('.bank-payments-reject').css('display','flex');
+            if ((state !== 'available') && (state !== 'negotiated')) {
+                this.$el.find('.bank-payments-reject').css('display','none');
+            }
+        },
+        /* reloadPage */
+        reloadPage: function() {
+             openerp.parentInstanceReject.reload();
+        },
+        /* Description: Función para remover el modal */
+        removeModal: function() {
+            $('.expired-account-modal').remove();
+            $('.modal-backdrop').remove();
+        },
+        /* Método inicial  */
+        fetchInitial: function() {
+            var self = this;
+            self.fetchBankPayments(self.id).then(function(bankPayments) {
+                return bankPayments;
+            }).then(function(bankPayments) {
+                self.bankPayments = bankPayments;
+                return self.fetchBankPaymentsLine(self.id);
+            }).then(function(bankPaymentsLine){
+                self.bankPaymentsLine = bankPaymentsLine;
+                return self.fetchACcountJournal();
+            }).then(function(accountJournal){
+                self.accountJournal = accountJournal;
+                return self.fetchResCompany();
+            }).then(function(resCompany){
+                self.resCompany = resCompany;
+                return self.fetchResCurrency();
+            }).then(function(resCurrency){
+                self.resCurrency = resCurrency;
+                return self.fetchBankPaYmentsType(self.bankPayments[0].bank_payments_type_id[0]);
+            }).then(function(bankPaymentsType) {
+                self.bankPaymentsType = bankPaymentsType;
+                if (!!self.bankPaymentsType.length && self.bankPaymentsType[0].code !== 'CH') {
+                    openerp.web.notification.do_warn("Atencion", "Solo se puede rechazar cheques" );
+                    return false;
+                }
+                    return self.showModalReject();
+            })
+        },
+        /* bank payments */
+        fetchBankPayments: function(id) {
+            var bankPaymnets = new openerp.web.Model('res.bank.payments');
+            var fields = ['id', 'state', 'payments_line', 'amount_receipt', 'amount_payment', 'amount_total','currency_id','bank_payments_type_id', 'change_payment_method'];
+            var domain = [['id', '=', id]];
+            return bankPaymnets.query(fields).filter(domain).all();
+        },
+        /* Bank Paymnets line */
+        fetchBankPaymentsLine: function(bankPaymnetId) {
+            var paymentLine = new openerp.web.Model('res.bank.payments.line');
+            var fields = ['id', 'amount','type_operation', 'bank_payments_id'];
+            var domain = [['bank_payments_id', '=', bankPaymnetId],['type_operation', '=', 'payment']];
+            return paymentLine.query(fields).filter(domain).all();
+        },
+        /* bnak Payments Type*/
+        fetchBankPaYmentsType: function(typeId){
+            var self = this;
+            var fields = ['id', 'name', 'code'];
+            var domain = [['id', '=', typeId]];
+            var bankPaymentsType = new openerp.web.Model('res.bank.payments.type');
+            return bankPaymentsType.query(fields).filter(domain).all();
+        },
+        /*Account Journal  */
+        fetchACcountJournal: function() {
+            var fields = ['id', 'name', 'code', 'type', 'currency', 'default_debit_account_id', 'default_credit_account_id'];
+            var domain = [['active', '=', true], ['type', 'in', ['bank', 'cash']]];
+            var journalSalario = new openerp.web.Model('account.journal');
+            return journalSalario.query(fields).filter(domain).all();
+        },
+        /* Consultar Compania */
+        fetchResCompany: function() {
+            var fields = ['id','name', 'currency_id'];
+            var domain = [['id', '=', 1]];
+            var resCompanyIds = new openerp.web.Model('res.company');
+            return resCompanyIds.query(fields).filter(domain).all();
+        },
+        /* Consultar Moneda Activas */
+        fetchResCurrency : function() {
+            var fields = ['id','name', 'symbol', 'rate_silent', 'base', 'decimal_separator', 'decimal_places', 'thousands_separator', 'symbol_position', 'rate'];
+            var domain = [['active','=', true]];
+            var resCurrecy = new openerp.web.Model('res.currency');
+            return resCurrecy.query(fields).filter(domain).all();
+        },
+        /* Select Journal Change */
+        getSelectedJournal: function(code){
+            var self = this;
+            var journal = self.getJournal(code).shift();
+            var company = self.resCompany;
+
+            if (!journal)
+                return [];
+
+            if (!journal.currency) {
+                self.currencySelect = self.getCurrency(company[0].currency_id[0]);
+            }else {
+                self.currencySelect = self.getCurrency(journal.currency[0]);
+            }
+            return !!self.currencySelect ? self.currencySelect : [];
+        },
+        /* Get Currency*/
+        getCurrency: function(id) {
+            var self = this;
+            return _.filter(self.resCurrency, function(item) {
+                return item.id === id;
+            });
+        },
+        /* Get Journal*/
+        getJournal: function(code) {
+            var self = this;
+            return _.filter(self.accountJournal, function(item) {
+                return item.code === code;
+            });
+        },
+
+        // /* Recalcule Receipt*/
+        recalculatePaymnets: function(currencySelect) {
+            var self = this;
+            var changeCurrency = [];
+            var  paymnetTotal = 0;
+            var paymentsTotalCurrency = 0
+            var currencyPayments = self.getCurrency(self.bankPayments[0].currency_id[0]).shift();
+            if (!currencySelect || !self.bankPaymentsLine.length)
+                return;
+
+            _.each(self.bankPaymentsLine, function(item){
+                if (item.type_operation === 'payment')
+                    paymnetTotal += item.amount;
+
+            });
+
+            paymentsTotalCurrency = (paymnetTotal * (currencySelect.rate / currencyPayments.rate));
+
+            changeCurrency.push({
+                'amountPayments': paymentsTotalCurrency,
+                'amountPaymentsFormat': accounting.formatNumber(paymentsTotalCurrency, currencySelect.decimal_places, currencySelect.thousands_separator, currencySelect.decimal_separator),
+                'currencySymbol': currencySelect.symbol,
+                'rate': currencySelect.rate
+            });
+
+            self.bankPaymentsTotal = changeCurrency;
+            return !!changeCurrency ?changeCurrency : [];
+        },
+        /* Modal */
+        showModalReject: function() {
+            var self = this;
+            var defer =$.Deferred();
+            var results = true;
+            var rejectPayments = [];
+            var currencyJournal = [];
+            var amountPaymnets = [];
+            var modal = QWeb.render('bank_payments.ModalRejectWidget',{
+                journal: self.accountJournal
+            });
+            $('.openerp_webclient_container').after(modal);
+            $('.expired-account-modal').modal();
+            /* Cerrar */
+            $('.expired-account-modal').on('hidden.bs.modal', function (e) {
+                results = false;
+                defer.resolve(results);
+                self.removeModal(e);
+            });
+            /* Details */
+            var waitPayments = $('.expired-account-modal').find('.wait-payments');
+            var otherPayments = $('.expired-account-modal').find('.other-payments');
+            var amountPayments = $('.expired-account-modal').find('.amount-payments');
+            var symbolAmountPayments = $('.expired-account-modal').find('.symbol-amount-payments');
+            var selectJournal = $('.expired-account-modal').find('.select-journal');
+            var detailsReject = $('.expired-account-modal').find('.details-reject-input');
+
+            /* Aceptar */
+            var addReceipt = $('.expired-account-modal').find('.add-reject-total');
+            var waitPaymentsChecked = null;
+            var otherPaymentsChecked = null;
+
+            if (self.bankPayments[0].change_payment_method || !self.bankPaymentsLine.length ){
+                $('.expired-account-modal').find('.is-payments').css('display','none');
+                $('.expired-account-modal').find('.wait-payments-select').css('display','flex');
+                waitPaymentsChecked= []
+                waitPaymentsChecked.checked = true;
+            }
+            /* Recalcular el vuelto según el diario seleccionado */
+            currencyJournal = self.getSelectedJournal(selectJournal.val()).shift();
+            amountPaymnets = self.recalculatePaymnets(currencyJournal);
+            if (!!amountPaymnets && !!amountPaymnets.length) {
+                amountPayments.val(amountPaymnets[0].amountPaymentsFormat);
+                symbolAmountPayments.text(amountPaymnets[0].currencySymbol)
+            }
+            /* change Journal */
+            selectJournal.change(function(e) {
+                /* Recalcular el vuelto según el diario seleccionado */
+                currencyJournal = self.getSelectedJournal(selectJournal.val()).shift();
+                amountPaymnets = self.recalculatePaymnets(currencyJournal);
+                if (!!amountPaymnets.length) {
+                    amountPayments.val(amountPaymnets[0].amountPaymentsFormat);
+                    symbolAmountPayments.text(amountPaymnets[0].currencySymbol)
+                }
+            });
+            /* esperar pagos */
+            waitPayments.click(function(e){
+                waitPaymentsChecked = e.target;
+                $('.expired-account-modal').find('.other-payments-select').css('display','none');
+                if (this.checked) {
+                    if (otherPaymentsChecked)
+                        otherPaymentsChecked.checked = false;
+
+                    $('.expired-account-modal').find('.wait-payments-select').css('display','flex');
+                } else {
+                    $('.expired-account-modal').find('.wait-payments-select').css('display','none');
+
+                }
+            });
+            /* Otro metodo de pagos */
+            otherPayments.click(function(e){
+                otherPaymentsChecked = e.target;
+                $('.expired-account-modal').find('.wait-payments-select').css('display','none');
+                if (this.checked){
+                    if (waitPaymentsChecked)
+                        waitPaymentsChecked.checked = false;
+
+                    $('.expired-account-modal').find('.other-payments-select').css('display','flex');
+                    $('.expired-account-modal').find('.wait-payments-select').css('display','flex');
+                } else {
+                    $('.expired-account-modal').find('.other-payments-select').css('display','none');
+                    $('.expired-account-modal').find('.wait-payments-select').css('display','none');
+                }
+            });
+
+            // amountPayments
+            /*Monto */
+            amountPayments.keyup(function(e) {
+                currencyJournal = self.getSelectedJournal(selectJournal.val()).shift();
+                var amount_add = (accounting.unformat(amountPayments.val(),currencyJournal.decimal_separator));
+                amountPayments.val(accounting.formatNumber(amount_add, 0, currencyJournal.thousands_separator, currencyJournal.decimal_separator));
+                amountPayments.css('border-color','#ccc');
+
+                if (e.keyCode === 13)
+                    addReceipt.focus();
+            });
+            /* Monto */
+            amountPayments.focusout(function(e) {
+                currencyJournal = self.getSelectedJournal(selectJournal.val()).shift();
+                var amountTotal =  (self.bankPayments[0].amount_total - self.bankPayments[0].amount_payment)
+                var amountAdd = (accounting.unformat(amountPayments.val(),currencyJournal.decimal_separator));
+
+                if (amountTotal <  amountAdd) {
+                    openerp.web.notification.do_warn("Atencion", "El valor ingresado supera el monto a devolver.");
+                    amountPayments.css('border-color','red');
+                    amountPayments.focus();
+                }
+
+                amountPayments.val(accounting.formatNumber(amountAdd, currencyJournal.decimal_places, currencyJournal.thousands_separator, currencyJournal.decimal_separator));
+            });
+
+
+            /* Aceptar */
+            addReceipt.click(function(e) {
+                var amount = (accounting.unformat(amountPayments.val(),currencyJournal.decimal_separator));
+                rejectPayments = [];
+
+                /* Esperar pago */
+                if (!!waitPaymentsChecked && !!waitPaymentsChecked.checked) {
+                    if (!detailsReject.val()) {
+                        openerp.web.notification.do_warn("Atencion", "Debes de ingresar el motivo del rechazo del cheque.");
+                        detailsReject.css('border-color','red');
+                        return;
+                    }
+                    detailsReject.css('border-color','#ccc');
+                }
+
+                /* Pagar el provvedor con otrometodo de pago */
+                if (!!otherPaymentsChecked && !!otherPaymentsChecked.checked) {
+                    /* Verificar si no fue selecioado el methodo de  pagos*/
+                    if (!selectJournal.val()) {
+                        openerp.web.notification.do_warn("Atencion", "Tienes que seleccionar el método de pago.");
+                        selectJournal.css('border-color','red');
+                        return;
+                    }
+                    selectJournal.css('border-color','#ccc');
+
+                    if (amount < 0) {
+                        openerp.web.notification.do_warn("Atencion", "Debes ingresar un monto a pagar.");
+                        amountPayments.css('border-color','red');
+                        return;
+                    }
+                    amountPayments.css('border-color','#ccc');
+
+                    if ((self.bankPaymentsTotal[0].amountPayments - amount > 0.00) && (self.bankPaymentsTotal[0].amountPayments - amount < 0.11)) {
+                        amount = self.bankPaymentsTotal[0].amountPayments;
+                    }
+
+                    /* descripción */
+                    if (!detailsReject.val()) {
+                        openerp.web.notification.do_warn("Atencion", "Debes de ingresar el motivo del rechazo del cheque.");
+                        detailsReject.css('border-color','red');
+                        return;
+                    }
+                    detailsReject.css('border-color','#ccc');
+                }
+
+                rejectPayments = {
+                        'id': self.id,
+                        'details': detailsReject.val(),
+                        'amountPayments': amount,
+                        'selectJournal':selectJournal.val(),
+                        'waitPayments': !!waitPaymentsChecked ? waitPaymentsChecked.checked : false,
+                        'otherPayments': !!otherPaymentsChecked ? otherPaymentsChecked.checked : false
+                }
+
+                self.bankPaymentsReject(rejectPayments).then(function(resultsReject) {
+                    return resultsReject;
+                }).then(function(resultsReject) {
+                    self.reloadPage();
+                    if (!resultsReject)
+                        results = false;
+                });
+
+                defer.resolve(results);
+                self.removeModal(e);
+            });
+
+            return defer;
+        },
+        /* Generar Cobro */
+        bankPaymentsReject: function(rejectPayments) {
+            var self = this;
+            var defer = $.Deferred();
+            var bankPayments = new openerp.web.Model('res.bank.payments');
+            bankPayments.call('bank_payments_reject',[rejectPayments], {
+                    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 !== 'res.bank.payments')
+                    return;
+
+                openerp.parentInstanceReject = this;
+
+                if (openerp.widgetInstanceReject) {
+                    openerp.widgetInstanceReject.checkState(record.id, record.state);
+                    if (this.$el.find('.paymnet-reject').length !== 0)
+                        return;
+                }
+
+                if (this.$el.find('.paymnet-reject').length !== 0 )
+                    return;
+
+                openerp.widgetInstanceReject = new openerp.BankPaymentsReject(this);
+
+                var element =this.$el.find('.oe_form').find('.bank-paymnets-bank');
+
+                openerp.widgetInstanceReject.appendTo(element[0]);
+                openerp.widgetInstanceReject.checkState(record.id, record.state);
+            }
+        });
+    }
+})();

+ 580 - 0
static/src/js/bank_payments_renegotiate.js

@@ -0,0 +1,580 @@
+(function() {
+
+    openerp.widgetInstanceRenegotiate = null;
+    openerp.parentInstanceRenegotiate = {};
+    var QWeb = openerp.web.qweb;
+
+    openerp.BankPaymentsRenegotiate = openerp.Widget.extend({
+        template: 'bank_payments.Renegotiate',
+        id: undefined,
+        buttons: undefined,
+        bankPayments: [],
+        bankPaymentsLine: [],
+        accountJournal: [],
+        resCompany: [],
+        resCurrency: [],
+        currencySelect: [],
+        bankPaymentsTotal: [],
+        typeOperation: 'renegotiated',
+        refPayments: 'Balance/cheque renegociado/',
+        /* init */
+        init: function(parent) {
+            this._super(parent);
+            this.buttons = parent.$buttons;
+        },
+        /* start */
+        start: function () {
+            var self = this;
+            this.$el.find('.bank-payments-renegotiate').click(function() {
+                self.fetchInitial();
+            });
+            self.buttons.click(function(e) {
+                /* C (Crear) */
+                if (e.target.accessKey === 'C')
+                    self.$el.css('display','none');
+                /* 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');
+            });
+        },
+        /* Check state*/
+        checkState: function(id, state) {
+            var self = this;
+            self.id = id;
+            this.$el.find('.bank-payments-renegotiate').css('display','flex');
+            if ((state !== 'rejected')) {
+                this.$el.find('.bank-payments-renegotiate').css('display','none');
+            }
+        },
+        /* reloadPage */
+        reloadPage: function() {
+             openerp.parentInstanceRenegotiate.reload();
+        },
+        /* Description: Función para remover el modal */
+        removeModal: function() {
+            $('.expired-account-modal').remove();
+            $('.modal-backdrop').remove();
+        },
+        /* Método inicial  */
+        fetchInitial: function() {
+            var self = this;
+            self.fetchBankPayments(self.id).then(function(bankPayments) {
+                return bankPayments;
+            }).then(function(bankPayments) {
+                self.bankPayments = bankPayments;
+                return self.fetchBankPaymentsLine(self.id);
+            }).then(function(bankPaymentsLine) {
+                self.bankPaymentsLine = bankPaymentsLine;
+                return  self.fetchACcountJournal();
+            }).then(function(accountJournal) {
+                self.accountJournal = accountJournal;
+                return self.fetchResCompany();
+            }).then(function(resCompany) {
+                self.resCompany = resCompany ;
+                return self.fetchResCurrency()
+            }).then(function(resCurrency) {
+                self.resCurrency = resCurrency;
+                return self.generateBankPaymentsTotal();
+            }).then(function(bankPaymentsTotal) {
+                self.bankPaymentsTotal = bankPaymentsTotal;
+                return self.showModalReject();
+            });
+        },
+        /* bank payments */
+        fetchBankPayments: function(id) {
+            var bankPaymnets = new openerp.web.Model('res.bank.payments');
+            var fields = ['id', 'state', 'payments_line', 'amount_receipt', 'amount_payment', 'amount_total','currency_id','bank_payments_type_id','name_holder', 'number_cta', 'number', 'date_maturity'];
+            var domain = [['id', '=', id]];
+            return bankPaymnets.query(fields).filter(domain).all();
+        },
+        /* Bank Paymnets line*/
+        fetchBankPaymentsLine: function(bankPaymnetId) {
+            var paymentLine = new openerp.web.Model('res.bank.payments.line');
+            var fields = ['id', 'amount','type_operation', 'bank_payments_id'];
+            var domain = [['bank_payments_id', '=', bankPaymnetId],['type_operation', 'in', ['payment', 'receipt']]];
+            return paymentLine.query(fields).filter(domain).all();
+        },
+        /*Account Journal  */
+        fetchACcountJournal: function() {
+            var fields = ['id', 'name', 'code', 'type', 'currency', 'default_debit_account_id', 'default_credit_account_id'];
+            var domain = [['active', '=', true], ['type', 'in', ['bank', 'cash']], ['currency', '=', false]];
+            var journalSalario = new openerp.web.Model('account.journal');
+            return journalSalario.query(fields).filter(domain).all();
+        },
+        /* Consultar Compania */
+        fetchResCompany: function() {
+            var fields = ['id','name', 'currency_id'];
+            var domain = [['id', '=', 1]];
+            var resCompanyIds = new openerp.web.Model('res.company');
+            return resCompanyIds.query(fields).filter(domain).all();
+        },
+        /* Consultar Moneda Activas */
+        fetchResCurrency : function() {
+            var fields = ['id','name', 'symbol', 'rate_silent', 'base', 'decimal_separator', 'decimal_places', 'thousands_separator', 'symbol_position', 'rate'];
+            var domain = [['active','=', true]];
+            var resCurrecy = new openerp.web.Model('res.currency');
+            return resCurrecy.query(fields).filter(domain).all();
+        },
+        generateBankPaymentsTotal: function(){
+            var self = this;
+            var  renegotiateTotal = 0;
+            var  paymnetTotal = 0;
+            var  receiptTotal = 0;
+            var  bankPaymentsTotal = [];
+            var bankPayments = self.bankPayments[0];
+
+            self.currencySelect = self.getCurrency(bankPayments.currency_id[0]).shift();
+            _.each(self.bankPaymentsLine, function(line) {
+                /*receipt*/
+                if (line.type_operation === 'receipt')
+                    receiptTotal += line.amount;
+                /*Payments*/
+                if (line.type_operation === 'payment')
+                    paymnetTotal += line.amount;
+                /* Renegotiate*/
+                if (line.type_operation === 'renegotiated')
+                    renegotiateTotal += line.amount;
+            });
+
+            bankPaymentsTotal.push({
+                'amountReceipt': bankPayments.amount_total - renegotiateTotal,
+                'amountReceiptFormat': accounting.formatNumber((bankPayments.amount_total - renegotiateTotal), self.currencySelect.decimal_places, self.currencySelect.thousands_separator, self.currencySelect.decimal_separator),
+                'paymnetTotal': paymnetTotal,
+                'paymnetTotalFormat': accounting.formatNumber((paymnetTotal), self.currencySelect.decimal_places, self.currencySelect.thousands_separator, self.currencySelect.decimal_separator),
+                'receiptTotal': receiptTotal,
+                'receiptTotalFormat': accounting.formatNumber((receiptTotal), self.currencySelect.decimal_places, self.currencySelect.thousands_separator, self.currencySelect.decimal_separator),
+                'currencySymbol': self.currencySelect.symbol,
+                'date': moment().format('DD/MM/YYYY'),
+                'rate': self.currencySelect.rate
+            });
+
+            return bankPaymentsTotal;
+        },
+        /* Get Currency*/
+        getCurrency: function(id) {
+            var self = this;
+            return _.filter(self.resCurrency, function(item) {
+                return item.id === id;
+            });
+        },
+        /* Get Journal*/
+        getJournal: function(code) {
+            var self = this;
+            return _.filter(self.accountJournal, function(item) {
+                return item.code === code;
+            });
+        },
+        /* Select Journal Change */
+        getSelectedJournal: function(code, company){
+            var self = this;
+            var journal = self.getJournal(code).shift();
+            var company = self.resCompany;
+
+            if (!journal)
+                return [];
+
+            if (!journal.currency) {
+                self.currencySelect = self.getCurrency(company[0].currency_id[0]);
+            }else {
+                self.currencySelect = self.getCurrency(journal.currency[0]);
+            }
+
+            return !!self.currencySelect ? self.currencySelect : [];
+        },
+        /* Recalcule Receipt*/
+        recalculateReceipt: function(currencySelect, bankPaymentsReceipt) {
+            var self = this;
+            var changeCurrency = [];
+            var  renegotiateTotal = 0;
+            var  paymnetTotal = 0;
+            var  receiptTotal = 0;
+            if (!currencySelect || !bankPaymentsReceipt)
+                return;
+
+            renegotiateTotal = (bankPaymentsReceipt.amountReceipt * (currencySelect.rate / bankPaymentsReceipt.rate));
+            paymnetTotal = (bankPaymentsReceipt.paymnetTotal * (currencySelect.rate / bankPaymentsReceipt.rate));
+            receiptTotal = (bankPaymentsReceipt.receiptTotal * (currencySelect.rate / bankPaymentsReceipt.rate));
+
+            changeCurrency.push({
+                'amountReceipt': renegotiateTotal,
+                'amountReceiptFormat': accounting.formatNumber((renegotiateTotal), currencySelect.decimal_places, currencySelect.thousands_separator, currencySelect.decimal_separator),
+                'paymnetTotal': paymnetTotal,
+                'paymnetTotalFormat': accounting.formatNumber((paymnetTotal), currencySelect.decimal_places, currencySelect.thousands_separator, currencySelect.decimal_separator),
+                'receiptTotal': receiptTotal,
+                'receiptTotalFormat': accounting.formatNumber((receiptTotal), currencySelect.decimal_places, currencySelect.thousands_separator, currencySelect.decimal_separator),
+                'currencySymbol': currencySelect.symbol,
+                'date': moment().format('DD/MM/YYYY'),
+                'rate': currencySelect.rate
+            });
+
+            self.bankPaymentsTotal = changeCurrency;
+            return changeCurrency;
+        },
+        // /* Modal */
+        showModalReject: function() {
+            var self = this;
+            var defer =$.Deferred();
+            var results = true;
+            var currencyJournal = [];
+            var newAmountReceipt = [];
+            var bankPayments = self.bankPayments[0];
+            var currencyBankPayments = self.getCurrency(bankPayments.currency_id[0]).shift();
+
+            // self.separatePaymentLine(self.bankPaymentsLine);
+
+            var modal = QWeb.render('bank_payments.ModalRenegotiateWidget',{
+                journal: self.accountJournal,
+                bankPaymentsTotal: self.bankPaymentsTotal
+            });
+
+            $('.openerp_webclient_container').after(modal);
+            $('.expired-account-modal').modal();
+            /* Cerrar */
+            $('.expired-account-modal').on('hidden.bs.modal', function (e) {
+                results = false;
+                defer.resolve(results);
+                self.removeModal(e);
+            });
+            /** amount_total */
+            var amountTotal = $('.expired-account-modal').find('.amount-total');
+            var symbolAmountTotal = $('.expired-account-modal').find('.symbol-amount-total');
+            /*  receipt */
+            var receiptTotal = $('.expired-account-modal').find('.receipt-total');
+            var symbolReceiptTotal = $('.expired-account-modal').find('.symbol-receipt-total');
+            /*  payments */
+            var paymentTotal = $('.expired-account-modal').find('.payment-total');
+            var symbolPaymentTotal = $('.expired-account-modal').find('.symbol-payment-total');
+            /*  radio */
+            var checkRadio = $('.expired-account-modal').find('.check-radio');
+            var otherRadio = $('.expired-account-modal').find('.other-radio');
+            var checkCashingRadio = $('.expired-account-modal').find('.check-cashing-radio');
+            /* renegociación */
+            var detailsRenegotiate = $('.expired-account-modal').find('.details-renegotiate');
+            var selectInput = $('.expired-account-modal').find('.select-input');
+
+            var amountPayments = $('.expired-account-modal').find('.amount-payments');
+            var symbolAmountPayments = $('.expired-account-modal').find('.symbol-amount-payments');
+            /* Cambio de cheque */
+            var checkNameHolder = $('.expired-account-modal').find('.check-name-holder')
+            var checkNumberCta = $('.expired-account-modal').find('.check-number-cta')
+            var checkNumber = $('.expired-account-modal').find('.check-number')
+            var checkDateMaturity = $('.expired-account-modal').find('.check-date-maturity')
+            var checkAmountTotal = $('.expired-account-modal').find('.check-amount-total')
+            var checkAmountTotalSymbol = $('.expired-account-modal').find('.check-amount-total-symbol')
+
+            var buttonAccept = $('.expired-account-modal').find('.button-accept');
+
+            var clickcheck = null;
+            var clicOther = null;
+            var clickCheckCashing = null;
+            /* select check*/
+            checkRadio.click(function(e) {
+                clickcheck = e.target;
+                $('.expired-account-modal').find('.details-paymnets-renegotiate-otres').css('display','none');
+                $('.expired-account-modal').find('.details-paymnets-renegotiate-check-cashing').css('display','none');
+                if (this.checked) {
+                    $('.expired-account-modal').find('.details-paymnets-renegotiate').css('display','flex');
+                    if (clicOther)
+                        clicOther.checked= false;
+                    if (clickCheckCashing)
+                        clickCheckCashing.checked= false;
+
+                    newAmountReceipt = self.generateBankPaymentsTotal();
+                    if (!!newAmountReceipt.length) {
+                        amountTotal.val(newAmountReceipt[0].amountReceiptFormat);
+                        symbolAmountTotal.text(newAmountReceipt[0].currencySymbol);
+                        receiptTotal.val(newAmountReceipt[0].receiptTotalFormat);
+                        symbolReceiptTotal.text(newAmountReceipt[0].currencySymbol);
+                        paymentTotal.val(newAmountReceipt[0].paymnetTotalFormat);
+                        symbolPaymentTotal.text(newAmountReceipt[0].currencySymbol);
+                        amountPayments.val(newAmountReceipt[0].amountReceiptFormat);
+                        symbolAmountPayments.text(newAmountReceipt[0].currencySymbol);
+                    }
+                } else {
+                    $('.expired-account-modal').find('.details-paymnets-renegotiate').css('display','none');
+                }
+                /* Limpiar */
+                detailsRenegotiate.val("");
+                // amountPayments.val('0');
+                detailsRenegotiate.css('border-color','#ccc');
+                detailsRenegotiate.css('border-color','#ccc');
+                selectInput.css('border-color','#ccc');
+            });
+            /* Select other*/
+            otherRadio.click(function(e) {
+                clicOther =e.target;
+                $('.expired-account-modal').find('.details-paymnets-renegotiate-check-cashing').css('display','none');
+                if (this.checked){
+                    $('.expired-account-modal').find('.details-paymnets-renegotiate').css('display','flex');
+                    $('.expired-account-modal').find('.details-paymnets-renegotiate-otres').css('display','flex');
+                    if (clickcheck)
+                        clickcheck.checked= false;
+                    if (clickCheckCashing)
+                        clickCheckCashing.checked= false;
+
+                } else {
+                    $('.expired-account-modal').find('.details-paymnets-renegotiate').css('display','none');
+                    $('.expired-account-modal').find('.details-paymnets-renegotiate-otres').css('display','none');
+
+                    newAmountReceipt = self.generateBankPaymentsTotal();
+                    if (!!newAmountReceipt.length) {
+                        amountTotal.val(newAmountReceipt[0].amountReceiptFormat);
+                        symbolAmountTotal.text(newAmountReceipt[0].currencySymbol);
+                        receiptTotal.val(newAmountReceipt[0].receiptTotalFormat);
+                        symbolReceiptTotal.text(newAmountReceipt[0].currencySymbol);
+                        paymentTotal.val(newAmountReceipt[0].paymnetTotalFormat);
+                        symbolPaymentTotal.text(newAmountReceipt[0].currencySymbol);
+                        amountPayments.val(newAmountReceipt[0].amountReceiptFormat);
+                        symbolAmountPayments.text(newAmountReceipt[0].currencySymbol);
+                    }
+                }
+                detailsRenegotiate.val("");
+
+                detailsRenegotiate.css('border-color','#ccc');
+                detailsRenegotiate.css('border-color','#ccc');
+                selectInput.css('border-color','#ccc');
+            });
+            /*Cambio de chqeques */
+            checkCashingRadio.click(function(e){
+                clickCheckCashing = e.target;
+                $('.expired-account-modal').find('.details-paymnets-renegotiate-otres').css('display','none');
+                if (this.checked) {
+                    $('.expired-account-modal').find('.details-paymnets-renegotiate-check-cashing').css('display','flex');
+                    $('.expired-account-modal').find('.details-paymnets-renegotiate').css('display','flex');
+                    /* Reintegrar Cheque*/
+                    if (clickcheck)
+                        clickcheck.checked= false;
+                    /* Otro método de pago  */
+                    if (clicOther)
+                        clicOther.checked= false;
+
+                    if (bankPayments) {
+                        checkNameHolder.val(bankPayments.name_holder);
+                        checkNumberCta.val(bankPayments.number_cta);
+                        checkNumber.val(bankPayments.number);
+                        checkDateMaturity.val(bankPayments.date_maturity);
+                        checkAmountTotal.val(accounting.formatNumber(bankPayments.amount_total, currencyBankPayments.decimal_places, currencyBankPayments.thousands_separator, currencyBankPayments.decimal_separator));
+                        checkAmountTotalSymbol.text(currencyBankPayments.symbol);
+                    }
+
+                } else {
+                    $('.expired-account-modal').find('.details-paymnets-renegotiate-check-cashing').css('display','none');
+                    $('.expired-account-modal').find('.details-paymnets-renegotiate').css('display','none');
+                    $('.expired-account-modal').find('.details-paymnets-renegotiate-otres').css('display','none');
+                }
+
+            });
+            /* Recalcular el vuelto según el diario seleccionado */
+            currencyJournal = self.getSelectedJournal(selectInput.val()).shift();
+            newAmountReceipt = self.recalculateReceipt(currencyJournal, self.bankPaymentsTotal[0]);
+
+            if (!!newAmountReceipt.length) {
+                amountTotal.val(newAmountReceipt[0].amountReceiptFormat);
+                symbolAmountTotal.text(newAmountReceipt[0].currencySymbol);
+                receiptTotal.val(newAmountReceipt[0].receiptTotalFormat);
+                symbolReceiptTotal.text(newAmountReceipt[0].currencySymbol);
+                paymentTotal.val(newAmountReceipt[0].paymnetTotalFormat);
+                symbolPaymentTotal.text(newAmountReceipt[0].currencySymbol);
+                amountPayments.val(newAmountReceipt[0].amountReceiptFormat);
+                symbolAmountPayments.text(newAmountReceipt[0].currencySymbol);
+            }
+            /* change Journal */
+            selectInput.change(function(e) {
+                /* Recalcular el vuelto según el diario seleccionado */
+                currencyJournal = self.getSelectedJournal(selectInput.val()).shift();
+                newAmountReceipt = self.recalculateReceipt(currencyJournal, self.bankPaymentsTotal[0]);
+                if (!!newAmountReceipt.length) {
+                    amountTotal.val(newAmountReceipt[0].amountReceiptFormat);
+                    symbolAmountTotal.text(newAmountReceipt[0].currencySymbol);
+                    receiptTotal.val(newAmountReceipt[0].receiptTotalFormat);
+                    symbolReceiptTotal.text(newAmountReceipt[0].currencySymbol);
+                    paymentTotal.val(newAmountReceipt[0].paymnetTotalFormat);
+                    symbolPaymentTotal.text(newAmountReceipt[0].currencySymbol);
+                    amountPayments.val(newAmountReceipt[0].amountReceiptFormat);
+                    symbolAmountPayments.text(newAmountReceipt[0].currencySymbol);
+                }
+            });
+            /* Click button */
+            buttonAccept.click(function(e) {
+                currencyJournal = self.getSelectedJournal(selectInput.val()).shift();
+                var renegotiateReceipt = (accounting.unformat(amountTotal.val(),currencyJournal.decimal_separator));
+                var paymnetsAmount = (accounting.unformat(amountPayments.val(),currencyJournal.decimal_separator));
+                var newAmountTotal = (accounting.unformat(checkAmountTotal.val(),currencyBankPayments.decimal_separator));
+                var renegotiate = [];
+                /* Verificar si no fue seleccionado ninguna forma de renegociacion*/
+                if  ((!clickcheck || !clickcheck.checked) && (!clicOther || !clicOther.checked) && (!clickCheckCashing || !clickCheckCashing.checked)) {
+                    openerp.web.notification.do_warn("Atencion", "Tiene que seleccionar la forma de renegociacion.");
+                    return;
+                }
+                /* Verificar si fue seleccionado Reintegrar Cheque */
+                if (!!clickcheck && !!clickcheck.checked) {
+                    /* Verificar si no fue ingresado una descripción*/
+                    if (!detailsRenegotiate.val()) {
+                        openerp.web.notification.do_warn("Atencion", "Tienes que ingresar una descripción  para la reintegración del cheque.");
+                        detailsRenegotiate.css('border-color','red');
+                        return;
+                    }
+                    detailsRenegotiate.css('border-color','#ccc');
+                }
+                /* Verificar si fue seleccionado Otro método de pago */
+                if (!!clicOther && !!clicOther.checked) {
+                    /* Verificar si no fue ingresado una descripción*/
+                    if (!detailsRenegotiate.val()) {
+                        openerp.web.notification.do_warn("Atencion", "Tienes que ingresar una descripción  para la reintegración del cheque.");
+                        detailsRenegotiate.css('border-color','red');
+                        return;
+                    }
+                    detailsRenegotiate.css('border-color','#ccc');
+
+                    /* Verificar si no fue selecioado el methodo de  pagos*/
+                    if (!selectInput.val()) {
+                        openerp.web.notification.do_warn("Atencion", "Tienes que seleccionar el método de pago.");
+                        selectInput.css('border-color','red');
+                        return;
+                    }
+                    selectInput.css('border-color','#ccc');
+
+                    /* Verificar sin no fue ingresado el montoa a pagar */
+                    if (!amountPayments.val()) {
+                        openerp.web.notification.do_warn("Atencion", "Tienes que ingresa el monto a pagar.");
+                        detailsRenegotiate.css('border-color','red');
+                        return;
+                    }
+                    amountPayments.css('border-color','#ccc');
+                }
+                /* Verificar si fue seleconado Cambio de cheque */
+                if (!!clickCheckCashing && !!clickCheckCashing.checked) {
+                    if (!checkNameHolder.val()) {
+                        openerp.web.notification.do_warn("Atencion", "Debes ingresar el nombre del titular del cheque.");
+                        checkNameHolder.css('border-color','red');
+                        return;
+                    }
+                    checkNameHolder.css('border-color','#ccc');
+
+                    if (!checkNumberCta.val()) {
+                        openerp.web.notification.do_warn("Atencion", "El numero de cuenta es obligatorio.");
+                        checkNumberCta.css('border-color','red');
+                        return;
+                    }
+                    checkNumberCta.css('border-color','#ccc');
+
+                    if (!checkNumber.val()) {
+                        openerp.web.notification.do_warn("Atencion", "El numero de cheques es obligatorio.");
+                        checkNumber.css('border-color','red');
+                        return;
+                    }
+                    checkNumber.css('border-color','#ccc');
+
+                    if (!checkDateMaturity.val()) {
+                        openerp.web.notification.do_warn("Atencion", "Debes ingresar la fecha de vencimiento del cheque.");
+                        checkDateMaturity.css('border-color','red');
+                        return;
+                    }
+                    checkDateMaturity.css('border-color','#ccc');
+
+                    if (newAmountTotal <= 0) {
+                        openerp.web.notification.do_warn("Atencion", "El monto del cheque no puede ser 0.");
+                        checkAmountTotal.css('border-color','red');
+                        return;
+                    }
+                    if (newAmountTotal <  bankPayments.amount_total) {
+                        var bankTotal = accounting.formatNumber(bankPayments.amount_total, currencyBankPayments.decimal_places, currencyBankPayments.thousands_separator, currencyBankPayments.decimal_separator);
+                        openerp.web.notification.do_warn("Atencion", "El nuevo valor del cheque debes de ser mayor o igual al valor anterior  ("+bankTotal+" "+currencyBankPayments.symbol+").");
+                        checkAmountTotal.css('border-color','red');
+                        return;
+                    }
+                    checkAmountTotal.css('border-color','#ccc');
+
+                    /* Verificar si no fue ingresado una descripción*/
+                    if (!detailsRenegotiate.val()) {
+                        openerp.web.notification.do_warn("Atencion", "Tienes que ingresar una descripción  para la reintegración del cheque.");
+                        detailsRenegotiate.css('border-color','red');
+                        return;
+                    }
+                    detailsRenegotiate.css('border-color','#ccc');
+                }
+
+                renegotiate = {
+                    'checkRadio': !!clickcheck ? clickcheck.checked : false,
+                    'otherRadio': !!clicOther ? clicOther.checked : false,
+                    'CheckCashingRadio': !!clickCheckCashing ? clickCheckCashing.checked : false,
+                    'detailsRenegotiate': detailsRenegotiate.val() ,
+                    'selectInput': selectInput.val(),
+                    'amountPayments': paymnetsAmount,
+                    'id': self.id,
+                    'typeOperation': self.typeOperation,
+                    'refPayments': self.refPayments,
+                    'details' : 'Renegociación',
+                    'number': !!checkNumber.val() ? checkNumber.val() :bankPayments.number,
+                    'amountTotal': newAmountTotal > 0 ? newAmountTotal : bankPayments.amount_total,
+                    'dateMaturity': !!checkDateMaturity.val() ? checkDateMaturity.val() :bankPayments.date_maturity,
+                    'numberCta': !!checkNumberCta.val() ?checkNumberCta.val() :bankPayments.number_cta,
+                    'nameHolder': !!checkNameHolder.val() ?checkNameHolder.val() :bankPayments.name_holder
+                };
+
+                self.bankPaymentsRenegotiate(renegotiate).then(function(resultsRenegotiate) {
+                    return resultsRenegotiate;
+                }).then(function(resultsRenegotiate) {
+                    self.reloadPage();
+                    if (!resultsRenegotiate)
+                        results = false;
+
+                });
+
+                defer.resolve(results);
+                self.removeModal(e);
+            });
+
+            return defer;
+        },
+        /* */
+        //
+        bankPaymentsRenegotiate: function(renegotiate){
+            var self = this;
+            var defer = $.Deferred();
+            var bankPayments = new openerp.web.Model('res.bank.payments');
+            bankPayments.call('bank_payments_renegotiate',[renegotiate], {
+                    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 !== 'res.bank.payments')
+                    return;
+
+                openerp.parentInstanceRenegotiate = this;
+
+                if (openerp.widgetInstanceRenegotiate) {
+                    openerp.widgetInstanceRenegotiate.checkState(record.id, record.state);
+                    if (this.$el.find('.paymnet-renegotiate').length !== 0)
+                        return
+                }
+
+                if (this.$el.find('.paymnet-renegotiate').length !== 0)
+                    return;
+
+                openerp.widgetInstanceRenegotiate = new openerp.BankPaymentsRenegotiate(this);
+
+                var element =this.$el.find('.oe_form').find('.bank-paymnets-bank');
+
+                openerp.widgetInstanceRenegotiate.appendTo(element[0]);
+                openerp.widgetInstanceRenegotiate.checkState(record.id, record.state);
+            }
+        });
+    }
+})();

+ 80 - 0
static/src/js/bank_payments_state_change.js

@@ -0,0 +1,80 @@
+(function() {
+
+    openerp.widgetInstanceStatusChange = null;
+    openerp.parentInstanceStatusChange = {};
+
+    openerp.BankPaymentsStatusChange = openerp.Widget.extend({
+        id: undefined,
+        bankPayments: [],
+
+        init: function(parent) {
+            this._super(parent);
+        },
+        /* Check state*/
+        checkState: function(id) {
+            var self = this;
+            self.id = id;
+            if (id)
+                self.fectchInitial();
+        },
+        /* Método inicial  */
+        fectchInitial: function() {
+            var self = this;
+            self.fectchBankPayments(self.id).then(function(bankPayments) {
+                return bankPayments;
+            }).then(function(bankPayments) {
+                self.bankPayments = bankPayments;
+                return self.bankPaymentsState();
+            }).then(function(update){
+                if (update)
+                    return self.reloadPage();
+            });
+        },
+
+        fectchBankPayments: function(id) {
+            var bankPaymnets = new openerp.web.Model('res.bank.payments');
+            var fields = ['id', 'state', 'payments_line', 'amount_receipt', 'amount_payment', 'amount_total'];
+            var domain = [['id', '=', id]];
+            return bankPaymnets.query(fields).filter(domain).all();
+        },
+        /*Actualizar State*/
+        bankPaymentsState: function() {
+            var self = this;
+            var bankPayments = self.bankPayments[0];
+
+            var invoiceUpdate = new openerp.web.Model('res.bank.payments');
+            return invoiceUpdate.call('update_state_bank_payments',[bankPayments.id], {
+                context: new openerp.web.CompoundContext()
+            });
+        },
+        /**
+         * [reloadPage]
+         */
+        reloadPage: function() {
+             openerp.parentInstanceStatusChange.reload();
+        },
+    });
+
+    if (openerp.web && openerp.web.FormView) {
+        openerp.web.FormView.include({
+            load_record: function(record) {
+                this._super.apply(this, arguments);
+
+                if (this.model !== 'res.bank.payments')
+                    return;
+
+                openerp.parentInstanceStatusChange = this;
+                
+                if (openerp.widgetInstanceStatusChange) {
+                    openerp.widgetInstanceStatusChange.checkState(record.id);
+                    return ;
+                }
+
+                openerp.widgetInstanceStatusChange = new openerp.BankPaymentsStatusChange(this);
+                openerp.widgetInstanceStatusChange.checkState(record.id);
+
+            }
+        });
+    }
+
+})();

+ 407 - 0
static/src/js/bank_payments_supplier_returned.js

@@ -0,0 +1,407 @@
+(function() {
+
+    openerp.widgetInstanceSupplierReturned = null;
+    openerp.parentInstanceSupplierReturned = {};
+    var QWeb = openerp.web.qweb;
+
+    openerp.BankPaymentsSupplierReturned = openerp.Widget.extend({
+        template: 'bank_payments.SupplierReturnedWidget',
+        id: undefined,
+        buttons: undefined,
+        bankPayments: [],
+        bankPaymentsLine: [],
+        accountJournal: [],
+        resCompany: [],
+        resCurrency: [],
+        currencySelect: [],
+        bankPaymentsReceipt: [],
+        // typeOperation: 'payment',
+        typeOperation: 'receipt',
+        refPayments: 'Balance/recibido de proveedor/',
+        messageError: '',
+        /* init */
+        init: function(parent) {
+            this._super(parent);
+            this.buttons = parent.$buttons;
+        },
+        /* start */
+        start: function () {
+            var self = this;
+            this.$el.find('.bank-payments-supplier').click(function() {
+                self.fetchInitial();
+            });
+            self.buttons.click(function(e) {
+                /* C (Crear) */
+                if (e.target.accessKey === 'C')
+                    self.$el.css('display','none');
+                /* 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');
+            });
+        },
+        /* Check state*/
+        checkState: function(id, state) {
+            var self = this;
+            self.id = id;
+            this.$el.find('.bank-payments-supplier').css('display','flex');
+            if (state !== 'available'){
+                this.$el.find('.bank-payments-supplier').css('display','none');
+            }
+        },
+        /* reloadPage */
+        reloadPage: function() {
+             openerp.parentInstanceSupplierReturned.reload();
+        },
+        /* Description: Función para remover el modal */
+        removeModal: function() {
+            $('.expired-account-modal').remove();
+            $('.modal-backdrop').remove();
+        },
+        /* Método inicial  */
+        fetchInitial: function() {
+            var self = this;
+            var status = true;
+            self.fetchBankPayments(self.id).then(function(bankPayments) {
+                return bankPayments;
+            }).then(function(bankPayments) {
+                self.bankPayments = bankPayments;
+                return self.fetchBankPaymentsLine(self.id, self.typeOperation);
+            }).then(function(bankPaymentsLine) {
+                self.bankPaymentsLine = bankPaymentsLine;
+                if (!self.bankPaymentsLine.length){
+                    openerp.web.notification.do_warn("Atencion", "El cheque no cuenta con ningún pagos a proveedores" );
+                    status = false;
+                }
+                return self.fetchACcountJournal();
+            }).then(function(accountJournal) {
+                self.accountJournal = accountJournal;
+                return self.fetchResCompany();
+            }).then(function(resCompany) {
+                self.resCompany = resCompany;
+                return self.fetchResCurrency();
+            }).then(function(resCurrency) {
+                self.resCurrency = resCurrency;
+                return self.generateReturned();
+            }).then(function(bankPaymentsReceipt) {
+                self.bankPaymentsReceipt = bankPaymentsReceipt;
+                if (!self.bankPaymentsReceipt.length) {
+                    openerp.web.notification.do_warn("Atencion", self.messageError);
+                    status = false;
+                }
+                return self.fetchBankPaymentsLine(self.id, 'receipt');
+            }).then(function(lineReceipt) {
+                if (!!lineReceipt.length) {
+                    var amount = 0;
+                    _.each(lineReceipt, function(item) {
+                        amount += item.amount;
+                    });
+                    if (self.bankPaymentsReceipt[0].amountReceipt > amount) {
+                        openerp.web.notification.do_warn("Atencion", "EL cheque aun tiene  moto a devolver" );
+                        status = false;
+                    }
+                }
+                if (status)
+                    return self.showModalReturned();
+            });
+        },
+        /* bank payments */
+        fetchBankPayments: function(id) {
+            var bankPaymnets = new openerp.web.Model('res.bank.payments');
+            var fields = ['id', 'state', 'payments_line', 'amount_receipt', 'amount_payment', 'amount_total','currency_id'];
+            var domain = [['id', '=', id]];
+            return bankPaymnets.query(fields).filter(domain).all();
+        },
+        /* Bank Paymnets line*/
+        fetchBankPaymentsLine: function(bankPaymnetId, typeOperation) {
+            var paymentLine = new openerp.web.Model('res.bank.payments.line');
+            var fields = ['id', 'amount','type_operation', 'bank_payments_id'];
+            var domain = [['bank_payments_id', '=', bankPaymnetId],['type_operation','=', typeOperation]];
+            return paymentLine.query(fields).filter(domain).all();
+        },
+        /*Account Journal  */
+        fetchACcountJournal: function() {
+            var fields = ['id', 'name', 'code', 'type', 'currency', 'default_debit_account_id', 'default_credit_account_id'];
+            var domain = [['active', '=', true], ['type', 'in', ['bank', 'cash']]];
+            var journalSalario = new openerp.web.Model('account.journal');
+            return journalSalario.query(fields).filter(domain).all();
+        },
+        /* Consultar Compania */
+        fetchResCompany: function() {
+            var fields = ['id','name', 'currency_id'];
+            var domain = [['id', '=', 1]];
+            var resCompanyIds = new openerp.web.Model('res.company');
+            return resCompanyIds.query(fields).filter(domain).all();
+        },
+        /* Consultar Moneda Activas */
+        fetchResCurrency : function() {
+            var fields = ['id','name', 'symbol', 'rate_silent', 'base', 'decimal_separator', 'decimal_places', 'thousands_separator', 'symbol_position', 'rate'];
+            var domain = [['active','=', true]];
+            var resCurrecy = new openerp.web.Model('res.currency');
+            return resCurrecy.query(fields).filter(domain).all();
+        },
+        /* Generar Vuelto  */
+        generateReturned: function() {
+            var self = this;
+            var bankPayments = self.bankPayments.shift();
+            var  amountReceipt = 0;
+            var  bankPaymentsReceipt = [];
+            self.messageError= "No tienes nada que devolver.";
+
+            if(!bankPayments.customer_id) {
+                self.messageError= "Tienes que indicar de quien recibiste el documento.";
+                return false ;
+            }
+
+            if (bankPayments.state != "available")
+                return false;
+
+            self.currencySelect = self.getCurrency(bankPayments.currency_id[0]).shift();
+            if (!self.currencySelect){
+                self.messageError= "Tienes que seleccionar la moneda de la operación.";
+                return false ;
+            }
+            _.each(self.bankPaymentsLine, function(item){
+                amountReceipt += item.amount;
+            });
+
+            if (bankPayments.amount_total - amountReceipt <= 0)
+                return false;
+
+            bankPaymentsReceipt.push({
+                'amountReceipt': bankPayments.amount_total - amountReceipt,
+                'amountFormat': accounting.formatNumber((bankPayments.amount_total - amountReceipt), self.currencySelect.decimal_places, self.currencySelect.thousands_separator, self.currencySelect.decimal_separator),
+                'currencySymbol': self.currencySelect.symbol,
+                'date': moment().format('DD/MM/YYYY'),
+                'rate': self.currencySelect.rate
+            });
+
+            return bankPaymentsReceipt;
+        },
+        /* Recalcule Receipt*/
+        recalculateReceipt: function(currencySelect, bankPaymentsReceipt){
+            var self = this;
+            var changeCurrency = [];
+            var amountReceipt = 0;
+            if (!currencySelect || !bankPaymentsReceipt)
+                return;
+
+            amountReceipt = (bankPaymentsReceipt.amountReceipt * (currencySelect.rate / bankPaymentsReceipt.rate));
+
+            changeCurrency.push({
+                'amountReceipt': amountReceipt,
+                'amountFormat': accounting.formatNumber((amountReceipt), currencySelect.decimal_places, currencySelect.thousands_separator, currencySelect.decimal_separator),
+                'currencySymbol': currencySelect.symbol,
+                'date': moment().format('DD/MM/YYYY'),
+                'rate': currencySelect.rate
+            });
+            self.bankPaymentsReceipt = changeCurrency;
+            return changeCurrency;
+        },
+        /* Get Currency*/
+        getCurrency: function(id) {
+            var self = this;
+            return _.filter(self.resCurrency, function(item) {
+                return item.id === id;
+            });
+        },
+        /* Get Journal*/
+        getJournal: function(code) {
+            var self = this;
+            return _.filter(self.accountJournal, function(item) {
+                return item.code === code;
+            });
+        },
+        /* Select Journal Change */
+        getSelectedJournal: function(code, company) {
+            var self = this;
+            var journal = self.getJournal(code).shift();
+            var company = self.resCompany;
+
+            if (!journal)
+                return [];
+
+            if (!journal.currency) {
+                self.currencySelect = self.getCurrency(company[0].currency_id[0]);
+            }else {
+                self.currencySelect = self.getCurrency(journal.currency[0]);
+            }
+
+            return !!self.currencySelect ? self.currencySelect : [];
+        },
+        /* Generar Balance */
+        balanceBankPaymentsCustomers: function(selectJournal,amountReceipt) {
+            var self = this;
+            var defer = $.Deferred();
+            var bankPayments = new openerp.web.Model('res.bank.payments');
+
+            bankPayments.call('balance_bank_payments',[
+                {
+                    id: self.id,
+                    amountReceipt: amountReceipt,
+                    selectJournal: selectJournal,
+                    typeOperation: self.typeOperation,
+                    refPayments: self.refPayments,
+                    details: 'Vuelto'
+                }
+            ], {
+                    context: new openerp.web.CompoundContext()
+            }).then(function(results){
+                    defer.resolve(results);
+            });
+
+            return defer;
+        },
+        /* Receipt */
+        showModalReturned: function() {
+            var self = this;
+            var defer =$.Deferred();
+            var results = true;
+            var currencyJournal = [];
+            var newAmountReceipt = [];
+
+            var modal = QWeb.render('bank_payments.ModalReturnedWidget' ,{
+                journal: self.accountJournal,
+                bankPaymentsReceipt: self.bankPaymentsReceipt,
+            });
+
+            $('.openerp_webclient_container').after(modal);
+            $('.expired-account-modal').modal();
+            /* Cerrar */
+            $('.expired-account-modal').on('hidden.bs.modal', function (e) {
+                results = false;
+                defer.resolve(results);
+                self.removeModal(e);
+            });
+            /* Receipt */
+            var inputAmountReceiptTotal = $('.expired-account-modal').find('.amount-receipt-total');
+            var symbolAmountReceiptTotal = $('.expired-account-modal').find('.symbol-receipt-total');
+            /* Monto*/
+            var inputAmountReceipt = $('.expired-account-modal').find('.amount-receipt');
+            var symbolAmountReceipt = $('.expired-account-modal').find('.symbol-receipt');
+            /* Jouanl */
+            var selectJournal = $('.expired-account-modal').find('.select-input');
+            /* Aceptar */
+            var addReceipt = $('.expired-account-modal').find('.add-receipt');
+
+            /* Recalcular el vuelto según el diario seleccionado */
+            currencyJournal = self.getSelectedJournal(selectJournal.val()).shift();
+
+            newAmountReceipt = self.recalculateReceipt(currencyJournal, self.bankPaymentsReceipt.shift());
+
+            if (!!newAmountReceipt.length) {
+                inputAmountReceipt.val(newAmountReceipt[0].amountFormat);
+                symbolAmountReceipt.text(newAmountReceipt[0].currencySymbol);
+                inputAmountReceiptTotal.val(newAmountReceipt[0].amountFormat);
+                symbolAmountReceiptTotal.text(newAmountReceipt[0].currencySymbol);
+            }
+            /* change Journal */
+            selectJournal.change(function(e) {
+                /* Recalcular el vuelto según el diario seleccionado */
+                currencyJournal = self.getSelectedJournal(selectJournal.val()).shift();
+                newAmountReceipt = self.recalculateReceipt(currencyJournal, self.bankPaymentsReceipt.shift());
+                if (!!newAmountReceipt.length) {
+                    inputAmountReceipt.val(newAmountReceipt[0].amountFormat);
+                    symbolAmountReceipt.text(newAmountReceipt[0].currencySymbol);
+                    inputAmountReceiptTotal.val(newAmountReceipt[0].amountFormat);
+                    symbolAmountReceiptTotal.text(newAmountReceipt[0].currencySymbol);
+                }
+            });
+            /*Monto */
+            inputAmountReceipt.keyup(function(e) {
+                currencyJournal = self.getSelectedJournal(selectJournal.val()).shift();
+                var amount_add = (accounting.unformat(inputAmountReceipt.val(),currencyJournal.decimal_separator));
+                inputAmountReceipt.val(accounting.formatNumber(amount_add, 0, currencyJournal.thousands_separator, currencyJournal.decimal_separator));
+                inputAmountReceipt.css('border-color','#ccc');
+
+                if (e.keyCode === 13)
+                    addReceipt.focus();
+            });
+            /* Monto */
+            inputAmountReceipt.focusout(function(e) {
+                currencyJournal = self.getSelectedJournal(selectJournal.val()).shift();
+                var amountTotal = (accounting.unformat(inputAmountReceiptTotal.val(),currencyJournal.decimal_separator));
+                var amountAdd = (accounting.unformat(inputAmountReceipt.val(),currencyJournal.decimal_separator));
+                if (amountTotal <  amountAdd) {
+                    openerp.web.notification.do_warn("Atencion", "El valor ingresado supera el monto a devolver.");
+                    inputAmountReceipt.css('border-color','red');
+                    inputAmountReceipt.focus();
+                }
+                inputAmountReceipt.val(accounting.formatNumber(amountAdd, currencyJournal.decimal_places, currencyJournal.thousands_separator, currencyJournal.decimal_separator));
+            });
+
+            /* Aceptar */
+            addReceipt.click(function(e) {
+                var amountTotal = (accounting.unformat(inputAmountReceiptTotal.val(),currencyJournal.decimal_separator));
+                var amountReceipt = (accounting.unformat(inputAmountReceipt.val(),currencyJournal.decimal_separator));
+                if (!selectJournal.val()) {
+                    openerp.web.notification.do_warn("Atencion", "Debes seleccionar un método de pago para continuar.");
+                    selectJournal.css('border-color','red');
+                    return;
+                }
+                selectJournal.css('border-color','#ccc');
+                if (amountReceipt <= 0) {
+                    openerp.web.notification.do_warn("Atencion", "El monto ingresado no ser 0");
+                    inputAmountReceipt.css('border-color','red');
+                    return;
+                }
+
+                if (amountTotal < amountReceipt) {
+                    openerp.web.notification.do_warn("Atencion", "El valor ingresado supera el monto a devolver.");
+                    inputAmountReceipt.css('border-color','red');
+                    return ;
+                }
+                inputAmountReceipt.css('border-color','#ccc');
+                if ((self.bankPaymentsReceipt[0].amountReceipt - amountReceipt > 0.00) && (self.bankPaymentsReceipt[0].amountReceipt - amountReceipt < 0.11)) {
+                    amountReceipt = self.bankPaymentsReceipt[0].amountReceipt;
+                }
+
+                self.balanceBankPaymentsCustomers(selectJournal.val(), amountReceipt).then(function(resultsBanalnce) {
+                    return resultsBanalnce;
+                }).then(function(resultsBanalnce) {
+                    self.reloadPage();
+                    if (!resultsBanalnce)
+                        results = false;
+                });
+
+                defer.resolve(results);
+                self.removeModal(e);
+            });
+            return defer;
+        },
+    });
+
+    if (openerp.web && openerp.web.FormView) {
+        openerp.web.FormView.include({
+            load_record: function(record) {
+                this._super.apply(this, arguments);
+
+                if (this.model !== 'res.bank.payments')
+                    return;
+
+                openerp.parentInstanceSupplierReturned = this;
+
+                if (openerp.widgetInstanceSupplierReturned) {
+                    openerp.widgetInstanceSupplierReturned.checkState(record.id, record.state);
+                    if (this.$el.find('.supplier-returned').length !== 0 )
+                        return
+                }
+
+                if (this.$el.find('.supplier-returned').length !== 0 )
+                    return;
+
+                openerp.widgetInstanceSupplierReturned = new openerp.BankPaymentsSupplierReturned(this);
+
+                var element =this.$el.find('.oe_form').find('.bank-paymnets-bank');
+
+                openerp.widgetInstanceSupplierReturned.appendTo(element[0]);
+                openerp.widgetInstanceSupplierReturned.checkState(record.id, record.state);
+            }
+        });
+    }
+})();

+ 314 - 0
static/src/js/bank_payments_type_config.js

@@ -0,0 +1,314 @@
+(function() {
+
+    openerp.widgetInstanceTypeConfig = null;
+    openerp.parentInstanceTypeConfig = {};
+    var QWeb = openerp.web.qweb;
+    var typeFields = [
+        {
+            'type' : 'normal',
+            'format': null,
+            'fieldsType': 'char'
+        },{
+            'type' : 'normal',
+            'format': null,
+            'fieldsType': 'email'
+        },{
+            'type' : 'normal',
+            'format': null,
+            'fieldsType': 'text'
+        },{
+            'type' : 'normal',
+            'format': "DD/MM/YYY",
+            'fieldsType': 'date'
+        },{
+            'type' : 'normal',
+            'format': "$ ###,###,###",
+            'fieldsType': 'float'
+        },{
+            'type' : 'model',
+            'format': null,
+            'fieldsType': 'many2one'
+        },{
+            'type' : 'model',
+            'format': null,
+            'fieldsType': 'many2many'
+        },{
+            'type' : 'model',
+            'format': null,
+            'fieldsType': 'one2many'
+        }
+    ];
+    var searchType =[
+        {
+            'code':'none',
+            'name': 'No Buscar'
+        },
+        {
+            'code':'selection',
+            'name': 'Seleccionar'
+        },
+        // {
+        //     'code':'dialog',
+        //     'name': 'Dialogo'
+        // },
+        {
+            'code':'autocomplete',
+            'name': 'Auto completar'
+        }
+    ];
+
+    openerp.BankPaymentsTypeConfig = openerp.Widget.extend({
+        template: 'bank_payments.ConfigFieldsAllowed',
+        id: undefined,
+        buttons: undefined,
+        bankPayments: [],
+        fieldsPayments: [],
+        fieldsSelect: [],
+
+
+        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) {
+                /* C (Crear) */
+                if (e.target.accessKey === 'C')
+                    self.$el.css('display','none');
+                /* 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');
+            });
+        },
+        /* Check state*/
+        checkState: function(id) {
+            var self = this;
+            self.id = id;
+        },
+        /* Description: Función para remover el modal */
+        removeModal: function() {
+            $('.expired-account-modal').remove();
+            $('.modal-backdrop').remove();
+        },
+        /* Método inicial  */
+        fectchInitial: function() {
+            var self = this;
+            self.fectchBankPaymentsType(self.id).then(function(bankPayments) {
+                return bankPayments;
+            }).then(function(bankPayments) {
+                self.bankPayments = bankPayments;
+                return self.bankPaymentsFields(self.id);
+            }).then(function(fields) {
+                self.fieldsPayments = fields;
+                return self.joinFieldsPayments();
+            }).then(function(fieldsSelect) {
+                self.fieldsSelect = fieldsSelect;
+                return self.showModalConfig();
+            });
+        },
+        /*  get bank paymnets type */
+        fectchBankPaymentsType: function(id) {
+            var bankPaymnetsType = new openerp.web.Model('res.bank.payments.type');
+            var fields = ['name', 'is_receipt', 'is_payment', 'code', 'default_state','fields_allowed'];
+            var domain = [['id', '=', id]];
+            return bankPaymnetsType.query(fields).filter(domain).all();
+        },
+        /* get fields Bank Paymnets */
+        bankPaymentsFields: function(id) {
+            var self = this;
+            var invoiceUpdate = new openerp.web.Model('res.bank.payments.type');
+            return invoiceUpdate.call('get_bank_payments_fields',{
+                context: new openerp.web.CompoundContext()
+            });
+        },
+        /* Check Campos selecionado */
+        joinFieldsPayments: function() {
+            var self = this;
+            var fieldsAllowed = JSON.parse(self.bankPayments[0].fields_allowed);
+            var fieldsSelect = [];
+            var fields = [];
+            _.each(self.fieldsPayments, function(item){
+                var isSelected = _.filter(fieldsAllowed, function(filter){
+                    return filter.name === item.name;
+                });
+
+                var getTypeField = _.filter(typeFields, function(field){
+                    return field.fieldsType.trim() === item.field.type.trim();
+                });
+
+                fields.push({
+                    'label': !!isSelected.length ?isSelected[0].label :item.field.help.trim(),
+                    'labelFields': item.field.help.trim(),
+                    'name': item.name.trim(),
+                    'selected': !!isSelected.length ?isSelected[0].selected :item.state,
+                    'string': {
+                        'type': !!getTypeField.length? getTypeField[0].type  : '',
+                        'typeField': item.field.type,
+                        'model': !!getTypeField.length && getTypeField[0].type === 'model'? item.field.relation : '',
+                        'format': !!isSelected.length ? isSelected[0].string.format : !!getTypeField.length ?getTypeField[0].format : '',
+                        'required': !!item.field.required ?item.field.required : !!isSelected.length ?isSelected[0].string.required :item.field.required,
+                        'requiredFields': item.field.required,
+                        'readonly': !!isSelected.length ? isSelected[0].string.readonly : item.field.readonly,
+                        'searchType': !!isSelected.length ? isSelected[0].string.searchType: 'none'
+                    }
+                });
+            });
+            return fields;
+        },
+        /* filter */
+        filterFieldsRow: function(fieldsSelect,name){
+            return _.filter(fieldsSelect, function(item){
+                return item.name === name;
+            });
+        },
+
+        /* bank_payments.ModalConfigFieldsAllowed */
+        showModalConfig: function() {
+            var self = this;
+            var defer = $.Deferred();
+            var results = true;
+
+            var modal = QWeb.render('bank_payments.ModalConfigFieldsAllowed',{
+                'search': searchType,
+                'fieldsSelect': self.fieldsSelect
+            });
+            $('.openerp_webclient_container').after(modal);
+            $('.expired-account-modal').modal();
+
+            var tableRow = $('.expired-account-modal').find('.table-tbody').find('tr');
+            var saveButton = $('.expired-account-modal').find('.add-payments-config-type');
+
+            _.each(tableRow, function(tr) {
+                var name = ($(tr).children()[0].textContent).trim();
+                var searchType = $($(tr).children()[6]).find('.selected-search-type');
+                var selectd = ($($(tr).children()[1]).find('.selected-payments-type-config'))[0].checked;
+                var fields = self.filterFieldsRow(self.fieldsSelect,name).shift();
+                if (fields)
+                    searchType.val(fields.string.searchType);
+                    if (fields.string.requiredFields) {
+                        ($($(tr).children()[1]).find('.selected-payments-type-config'))[0].checked = true;
+                        ($($(tr).children()[1]).find('.selected-payments-type-config')).attr("disabled", true);
+                        ($($(tr).children()[4]).find('.select-payments-required')).attr("disabled", true);
+                        selectd = true;
+                    }
+                if (selectd)
+                    $(tr).addClass('table-row-selected');
+
+            });
+
+            tableRow.click(function(e){
+                var selected = ($($(e.target).closest('tr').children()[1]).find('.selected-payments-type-config'))[0].checked
+                if (selected) {
+                    $(e.target).closest('tr').addClass('table-row-selected');
+                }else{
+                    $(e.target).closest('tr').removeClass('table-row-selected');
+                }
+            });
+
+            saveButton.click(function(e) {
+                var fields = []
+
+                _.each(tableRow, function(tr){
+                    var selected = ($($(tr).children()[1]).find('.selected-payments-type-config'))[0].checked;
+                    if (selected) {
+                        var name = ($(tr).children()[0].textContent).trim();
+                        var label = $($(tr).children()[2]).find('.input-label-fields').val();
+                        var selectedReadOnly = ($($(tr).children()[3]).find('.select-payments-readonly'))[0].checked;
+                        var selectedRequired = ($($(tr).children()[4]).find('.select-payments-required'))[0].checked;
+                        var format = $($(tr).children()[5]).find('.input-format-fields').val();
+                        var searchType = $($(tr).children()[6]).find('.selected-search-type').val();
+                        var fieldAllowed = self.filterFieldsRow(self.fieldsSelect,name).shift();
+
+                        fields.push({
+                            'label': !!label ?label :fieldAllowed.label,
+                            'labelFields':fieldAllowed.labelFields,
+                            'name': fieldAllowed.name,
+                            'selected': selected,
+                            'string':{
+                                'type': fieldAllowed.string.type,
+                                'typeField': fieldAllowed.string.typeField,
+                                'model': fieldAllowed.string.model,
+                                'format': format,
+                                'required': selectedRequired,
+                                'readonly': selectedReadOnly,
+                                'searchType': searchType
+                            }
+                        });
+                    }
+                });
+
+                self.saveFieldsAllowed(JSON.stringify(fields), self.id).then(function(resultsPaymentsType) {
+                    return resultsPaymentsType;
+                }).then(function(resultsPaymentsType) {
+                    self.reloadPage();
+                    $('.expired-account-modal').find('.widget-content.widget-loading-payments').css('display','none');
+                    self.removeModal(e);
+                    if (!resultsPaymentsType)
+                        results = false;
+                });
+
+                defer.resolve(results);
+            });
+            /* Cerrar */
+            $('.expired-account-modal').on('hidden.bs.modal', function (e) {
+                results = false;
+                defer.resolve(results);
+                self.removeModal(e);
+            });
+            return defer;
+        },
+        /* Save fieldsAllowed*/
+        saveFieldsAllowed: function(fields, id) {
+            var paymentType = new openerp.web.Model('res.bank.payments.type');
+            return paymentType.call('save_fields_allowed',[{
+                'fieldsAllowed': fields,
+                'id': id
+            }], {
+                context: new openerp.web.CompoundContext()
+            });
+        },
+        /* Reload */
+        reloadPage: function() {
+             openerp.parentInstanceTypeConfig.reload();
+        },
+    });
+
+    if (openerp.web && openerp.web.FormView) {
+        openerp.web.FormView.include({
+            load_record: function(record) {
+                this._super.apply(this, arguments);
+                if (this.model !== 'res.bank.payments.type')
+                    return;
+
+                openerp.parentInstanceTypeConfig = this;
+                if (openerp.widgetInstanceTypeConfig) {
+                    openerp.widgetInstanceTypeConfig.checkState(record.id);
+                    if (this.$el.find('.fields-allowed-config').length !== 0)
+                            return;
+                }
+
+                if (this.$el.find('.fields-allowed-config').length !== 0 )
+                    return;
+
+                openerp.widgetInstanceTypeConfig = new openerp.BankPaymentsTypeConfig(this);
+                var element = this.$el.find('.oe_form').find('.fields-allowed');
+                openerp.widgetInstanceTypeConfig.appendTo(element[0]);
+                openerp.widgetInstanceTypeConfig.checkState(record.id);
+
+            }
+        });
+    }
+
+})();

+ 11 - 0
static/src/xml/bank_payments_charge.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<templates xml:space="preserve">
+    <t t-name="bank_payments.Charge">
+        <div class="paymnet-charge">
+            <button class="bank-payments-charge oe_button oe_form_button oe_highlight">
+                <div>Efectivizar</div>
+            </button>
+        </div>
+  </t>
+</templates>

+ 11 - 0
static/src/xml/bank_payments_customer_returned.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<templates xml:space="preserve">
+    <t t-name="bank_payments.CustomerReturnedWidget">
+        <div class="customer-returned">
+            <button class="bank-payments-customer oe_button oe_form_button oe_highlight">
+                <div>Generar Vuelto</div>
+            </button>
+        </div>
+  </t>
+</templates>

+ 11 - 0
static/src/xml/bank_payments_rejected.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<templates xml:space="preserve">
+    <t t-name="bank_payments.Reject">
+        <div class="paymnet-reject">
+            <button class="bank-payments-reject oe_button oe_form_button oe_highlight">
+                <div>Rechazar</div>
+            </button>
+        </div>
+  </t>
+</templates>

+ 11 - 0
static/src/xml/bank_payments_renegotiate.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<templates xml:space="preserve">
+    <t t-name="bank_payments.Renegotiate">
+        <div class="paymnet-renegotiate">
+            <button class="bank-payments-renegotiate oe_button oe_form_button oe_highlight">
+                <div>Renegociar</div>
+            </button>
+        </div>
+  </t>
+</templates>

+ 11 - 0
static/src/xml/bank_payments_supplier_returned.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<templates xml:space="preserve">
+    <t t-name="bank_payments.SupplierReturnedWidget">
+        <div class="supplier-returned">
+            <button class="bank-payments-supplier oe_button oe_form_button oe_highlight">
+                <div>Recibir Vuelto</div>
+            </button>
+        </div>
+  </t>
+</templates>

+ 10 - 0
static/src/xml/bank_payments_type_config.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<templates xml:space="preserve">
+    <t t-name="bank_payments.ConfigFieldsAllowed">
+        <button class="fields-allowed-config oe_stat_button btn btn-default oe_inline">
+            <div class="stat_button_icon fa fa-cog fa-fw"></div>
+            <div>Configurar</div>
+        </button>
+  </t>
+</templates>

+ 75 - 0
static/src/xml/modal/modal_bank_payments_charge.xml

@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="bank_payments.ModalCharge">
+        <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">
+                            Cobro de cheque
+                        </h3>
+                    </div>
+                    <!-- Body -->
+                    <div class="modal-body">
+                        <div>
+                            <div class="row">
+                                <!-- Monto a Pagar  -->
+                                <div class="col-xs-6">
+                                    <label class="bank-payments-label label-charge">Monto</label>
+                                    <div class="bank-payments-group input-charge">
+                                      <input type="text" class="form-control bank-payments-input amount-total" readonly="readonly"></input>
+                                      <div class="input-group-append-symbol">
+                                        <span class="input-group-text symbol-amount-total"></span>
+                                      </div>
+                                    </div>
+                                </div>
+                                <!-- journal -->
+                                <div class="col-xs-6">
+                                    <label class="bank-payments-label label-charge">Método de pago: </label>
+                                    <div class="bank-payments-group input-charge">
+                                        <select class="bank-payments-input select-journal">
+                                            <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>
+
+                            <div class="row">
+                                <!-- Caja  -->
+                                <div class="col-xs-6 is-open-cashbox">
+                                    <label class="bank-payments-label label-charge">Caja Disponible:</label>
+                                    <div class="bank-payments-group input-charge">
+                                        <select class="bank-payments-input select-statement">
+                                        </select>
+                                    </div>
+                                </div>
+                            </div>
+
+                            <div class="row">
+                                <div class="col-xs-12">
+                                    <label class="bank-payments-label label-charge ">Detalles del cobro</label>
+                                    <div class="bank-payments-group input-charge">
+                                        <input type="text" class="form-control bank-payments-input-text details-charge-input"></input>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="bank-payments-notification"></div>
+                        </div>
+
+                    </div>
+                    <!-- Pie de Pagina -->
+                    <div class="modal-footer payslip-footer">
+                        <button type="button" class="oe_button oe_form_button oe_highlight bank-payments-button button-save">Guardar</button>
+                        <button type="button" class="oe_button oe_form_button oe_link dismmis-modal bank-payments-button" data-dismiss="modal">Salir</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </t>
+</template>

+ 79 - 0
static/src/xml/modal/modal_bank_payments_reject.xml

@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="bank_payments.ModalRejectWidget">
+        <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">
+                            Rechazo de cheque
+                        </h3>
+                    </div>
+                    <!-- Body -->
+                    <div class="modal-body">
+                        <div>
+                            <!-- Forma de renegociación -->
+                            <div class="row is-payments">
+                                <h3 class="from-title-h3">Forma de renegociación</h3>
+                            </div>
+                            <div class="row is-payments">
+                                <div class="col-xs-6">
+                                    <input type='checkbox' class="wait-payments"></input>
+                                    <label class="bank-payments-radio-label">Esperar pago</label>
+                                </div>
+                                <div class="col-xs-6">
+                                    <input type="checkbox" class="other-payments"></input>
+                                    <label class="bank-payments-radio-label">Otro método de pago</label>
+                                </div>
+                            </div>
+                            <hr class="bank-payments-hr is-payments"/>
+                            <div class="row wait-payments-select">
+                                <h3 class="from-title-h3">Detalles de la renegociación</h3>
+                            </div>
+                            <div class="row other-payments-select">
+                                <div class="col-xs-6">
+                                    <label class="bank-payments-label label-selected">Método de pago: </label>
+                                    <div class="bank-payments-group input-selected">
+                                        <select class="bank-payments-input select-journal">
+                                            <t t-foreach="journal" t-as="journal">
+                                                <option t-attf-value="{{ journal_value.code }}" >
+                                                    <t t-esc="journal_value.name"/>
+                                                </option>
+                                            </t>
+                                        </select>
+                                    </div>
+                                </div>
+                                <div class="col-xs-6">
+                                    <label class="bank-payments-label">Monto</label>
+                                    <div class="bank-payments-group">
+                                      <input type="text" class="form-control bank-payments-input amount-payments" readonly="readonly"></input>
+                                      <div class="input-group-append-symbol">
+                                        <span class="input-group-text symbol-receipt symbol-amount-payments"></span>
+                                      </div>
+                                    </div>
+                                </div>
+                            </div>
+
+
+                            <div class="row wait-payments-select">
+                                <div class="col-xs-12">
+                                    <label class="bank-payments-label details-charge-label">Motivo del Rechazo</label>
+                                    <div class="bank-payments-group details-charge">
+                                        <input type="text" class="form-control bank-payments-input-text details-reject-input"></input>
+                                    </div>
+                                </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-reject-total bank-payments-button">Guardar</button>
+                        <button type="button" class="oe_button oe_form_button oe_link dismmis-modal bank-payments-button" data-dismiss="modal">Salir</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </t>
+</template>

+ 167 - 0
static/src/xml/modal/modal_bank_payments_renegotiate.xml

@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="bank_payments.ModalRenegotiateWidget">
+        <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">
+                            Renegociar cheque
+                        </h3>
+                    </div>
+                    <!-- Body -->
+                    <div class="modal-body">
+                        <div>
+                            <!-- Detalles del Cheque -->
+                            <div class="row">
+                                <h3 class="from-title-h3">Detalles del Cheque</h3>
+                            </div>
+                            <div t-foreach="bankPaymentsTotal" t-as="bankPayments" >
+                                <div class="row">
+                                    <div class="col-xs-6">
+                                        <label class="bank-payments-label label-renegotiate">Monto del Cheque</label>
+                                        <div class="bank-payments-group input-renegotiate">
+                                            <input type="text" class="form-control bank-payments-input amount-total" readonly="readonly" t-attf-value="{{ bankPayments.amountReceiptFormat }}"></input>
+                                            <div class="input-group-append-symbol">
+                                                <span class="input-group-text symbol-amount-total">
+                                                    <t t-esc="bankPayments.currencySymbol"/>
+                                                </span>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="row">
+                                    <div class="col-xs-6">
+                                        <label class="bank-payments-label label-renegotiate">Monto recibido</label>
+                                        <div class="bank-payments-group input-renegotiate">
+                                            <input type="text" class="form-control bank-payments-input receipt-total" readonly="readonly" t-attf-value="{{ bankPayments.receiptTotalFormat }}"></input>
+                                            <div class="input-group-append-symbol">
+                                                <span class="input-group-text symbol-receipt-total">
+                                                    <t t-esc="bankPayments.currencySymbol"/>
+                                                </span>
+                                            </div>
+                                        </div>
+                                    </div>
+                                    <div class="col-xs-6">
+                                        <label class="bank-payments-label label-renegotiate">Monto pagado </label>
+                                        <div class="bank-payments-group input-renegotiate">
+                                            <input type="text" class="form-control bank-payments-input payment-total" readonly="readonly" t-attf-value="{{ bankPayments.paymnetTotalFormat }}"></input>
+                                            <div class="input-group-append-symbol">
+                                                <span class="input-group-text symbol-payment-total">
+                                                    <t t-esc="bankPayments.currencySymbol"/>
+                                                </span>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <!-- Forma de renegociación -->
+                            <hr class="bank-payments-hr"/>
+                            <div class="row">
+                                <h3 class="from-title-h3">Forma de renegociación</h3>
+                            </div>
+                            <div class="row">
+                                <div class="col-xs-4">
+                                    <input type='checkbox' class="check-radio" name="check-radio"></input>
+                                    <label class="bank-payments-radio-label">Reintegrar Cheque</label>
+                                </div>
+                                <div class="col-xs-4">
+                                    <input type="checkbox" class="other-radio" name="other-radio"></input>
+                                    <label class="bank-payments-radio-label">Otro método de pago</label>
+                                </div>
+                                <div class="col-xs-4">
+                                    <input type="checkbox" class="check-cashing-radio" name="check-cashing-radio"></input>
+                                    <label class="bank-payments-radio-label">Cambio de cheque</label>
+                                </div>
+                            </div>
+                            <!-- renegociación -->
+                            <hr class="bank-payments-hr"/>
+                            <div class="row details-paymnets-renegotiate">
+                                <h3 class="from-title-h3">Detalles de la renegociación</h3>
+                            </div>
+                            <div class="row details-paymnets-renegotiate-otres">
+                                <div class="col-xs-6">
+                                    <label class="bank-payments-label label-selected">Método de pago: </label>
+                                    <div class="bank-payments-group input-selected">
+                                        <select class="bank-payments-input select-input">
+                                            <t t-foreach="journal" t-as="journal">
+                                                <option t-attf-value="{{ journal_value.code }}" >
+                                                    <t t-esc="journal_value.name"/>
+                                                </option>
+                                            </t>
+                                        </select>
+                                    </div>
+                                </div>
+                                <div class="col-xs-6">
+                                    <label class="bank-payments-label">Monto</label>
+                                    <div class="bank-payments-group">
+                                      <input type="text" class="form-control bank-payments-input amount-payments"></input>
+                                      <div class="input-group-append-symbol">
+                                        <span class="input-group-text symbol-receipt symbol-amount-payments"></span>
+                                      </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <!-- Cambio de cheque -->
+                            <div class="row details-paymnets-renegotiate-check-cashing">
+                                <div class="col-xs-12">
+                                    <label class="bank-payments-label label-renegotiate">Titular</label>
+                                    <div class="bank-payments-group input-renegotiate">
+                                        <input type="text" class="form-control check-name-holder"></input>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="row details-paymnets-renegotiate-check-cashing">
+                                <div class="col-xs-6">
+                                    <label class="bank-payments-label label-selected">Nº Cuenta: </label>
+                                    <div class="bank-payments-group input-selected">
+                                        <input type="text" class="form-control check-number-cta"></input>
+                                    </div>
+                                </div>
+                                <div class="col-xs-6">
+                                    <label class="bank-payments-label">Nº cheque:</label>
+                                    <div class="bank-payments-group input-renegotiate">
+                                      <input type="text" class="form-control check-number"></input>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="row details-paymnets-renegotiate-check-cashing">
+                                <div class="col-xs-6">
+                                    <label class="bank-payments-label label-selected">Vencimiento: </label>
+                                    <div class="bank-payments-group input-renegotiate">
+                                        <input type="date" class="form-control input-date check-date-maturity"></input>
+                                    </div>
+                                </div>
+                                <div class="col-xs-6">
+                                    <label class="bank-payments-label label-renegotiate">Monto</label>
+                                    <div class="bank-payments-group input-renegotiate">
+                                        <input type="text" class="form-control bank-payments-input check-amount-total" readonly='readonly'></input>
+                                        <div class="input-group-append-symbol">
+                                            <span class="input-group-text check-amount-total-symbol"></span>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <!-- Description -->
+                            <div class="row details-paymnets-renegotiate">
+                                <div class="col-xs-12">
+                                    <label class="bank-payments-label label-renegotiate">Descripción</label>
+                                    <div class="bank-payments-group input-renegotiate">
+                                        <input type="text" class="form-control bank-payments-input-text details-renegotiate"></input>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <!-- Pie de Pagina -->
+                    <div class="modal-footer payslip-footer">
+                        <button type="button" class="oe_button oe_form_button oe_highlight button-accept bank-payments-button">Guardar</button>
+                        <button type="button" class="oe_button oe_form_button oe_link dismmis-modal bank-payments-button" data-dismiss="modal">Salir</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </t>
+</template>

+ 78 - 0
static/src/xml/modal/modal_bank_payments_returned.xml

@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="bank_payments.ModalReturnedWidget">
+        <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">
+                            Detalles del vuelto
+                        </h3>
+                    </div>
+                    <!-- Body -->
+                    <div class="modal-body">
+                        <div>
+                            <div class="row" t-foreach="bankPaymentsReceipt" t-as="receipt">
+                            <!-- <div class="row" > -->
+                                <div class="col-xs-6">
+                                    <label class="bank-payments-label">A devolver</label>
+                                    <!-- Vuelto  -->
+                                    <div class="bank-payments-group">
+                                        <input type="text" class="form-control bank-payments-input amount-receipt-total" readonly="readonly" t-attf-value="{{ receipt.amountFormat }}"></input>
+                                        <div class="input-group-append-symbol">
+                                            <span class="input-group-text symbol-receipt-total">
+                                                <t t-esc="receipt.currencySymbol"/>
+                                            </span>
+                                        </div>
+                                    </div>
+                                </div>
+                                <!-- Fecha  -->
+                                <div class="col-xs-6">
+                                    <label class="bank-payments-label position-right">
+                                        <t t-esc="receipt.date"/>
+                                    </label>
+                                </div>
+                            </div>
+
+                            <hr class="bank-payments-hr"/>
+
+                            <div class="row">
+                                <div class="col-xs-6">
+                                    <label class="bank-payments-label label-selected">Método de pago: </label>
+                                    <div class="bank-payments-group input-selected">
+                                        <select class="bank-payments-input select-input">
+                                            <t t-foreach="journal" t-as="journal">
+                                                <option t-attf-value="{{ journal_value.code }}" >
+                                                    <t t-esc="journal_value.name"/>
+                                                </option>
+                                            </t>
+                                        </select>
+                                    </div>
+                                </div>
+                                <!-- Monto a Pagar  -->
+                                <div class="col-xs-6">
+                                    <label class="bank-payments-label">Monto</label>
+                                    <div class="bank-payments-group">
+                                      <input type="text" class="form-control bank-payments-input amount-receipt"></input>
+                                      <div class="input-group-append-symbol">
+                                        <span class="input-group-text symbol-receipt"></span>
+                                      </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <hr class="bank-payments-hr"/>
+                            <div class="bank-payments-notification"></div>
+                        </div>
+                    </div>
+                    <!-- Pie de Pagina -->
+                    <div class="modal-footer payslip-footer">
+                        <button type="button" class="oe_button oe_form_button oe_highlight add-receipt bank-payments-button" >Guardar</button>
+                        <button type="button" class="oe_button oe_form_button oe_link dismmis-modal bank-payments-button" data-dismiss="modal">Salir</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </t>
+</template>

+ 86 - 0
static/src/xml/modal/modal_bank_payments_type_config.xml

@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+
+    <t t-name="searchTypeOptions">
+        <t t-foreach="search" t-as="search">
+            <option t-attf-value="{{ search_value.code }}" >
+                <t t-esc="search_value.name"/>
+            </option>
+        </t>
+    </t>
+
+    <t t-name="bank_payments.ModalConfigFieldsAllowed">
+        <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">
+                            Configuraciones
+                        </h3>
+                    </div>
+                    <!-- Body -->
+                    <div class="modal-body">
+                        <div class=" oe_view_manager_body payments-type-config-table">
+                            <div class="modal-head-wrapper-payments-type-config">
+                                <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">Campos</th>
+                                            <th class="oe_list_header_char oe_sortable">No editable</th>
+                                            <th class="oe_list_header_char oe_sortable">Obligatorio</th>
+                                            <th class="oe_list_header_char oe_sortable">Formato</th>
+                                            <th class="oe_list_header_char oe_sortable">Tipo de búsqueda</th>
+                                        </tr>
+                                    </thead>
+                                </table>
+                            </div>
+                            <div class="modal-item-paymnets-type-config">
+                                <table class="oe_list_content">
+                                    <tbody class="table-tbody">
+                                        <tr t-foreach="fieldsSelect" t-as="line">
+                                            <td>
+                                                <t t-esc="line_value.name"/>
+                                            </td>
+                                            <td>
+                                                <input type="checkbox" class="selected-payments-type-config" t-if="line_value.selected == true" checked='checked'></input>
+                                                <input type="checkbox" class="selected-payments-type-config" t-if="line_value.selected != true" ></input>
+                                            </td>
+                                            <td>
+                                                <input type="text" class="input-label-fields" t-attf-value="{{ line_value.label }}"></input>
+                                            </td>
+                                            <td>
+                                                <input type="checkbox" class="select-payments-readonly" t-if="line_value.string.readonly == true" checked='checked'></input>
+                                                <input type="checkbox" class="select-payments-readonly" t-if="line_value.string.readonly != true" ></input>
+                                            </td>
+                                            <td>
+                                                <input type="checkbox" class="select-payments-required" t-if="line_value.string.required == true" checked='checked'></input>
+                                                <input type="checkbox" class="select-payments-required" t-if="line_value.string.required != true" ></input>
+                                            </td>
+                                            <td>
+                                                <input type="text" class="input-format-fields" t-attf-value="{{line_value.string.format}}"></input>
+                                            </td>
+                                            <td>
+                                                <select class="selected-search-type">
+                                                    <t t-call="searchTypeOptions"/>
+                                                </select>
+                                            </td>
+                                        </tr>
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+                    <!-- Pie de Pagina -->
+                    <div class="modal-footer">
+                        <button type="button" class="oe_button oe_form_button oe_highlight bank-payments-button add-payments-config-type" >Guardar</button>
+                        <button type="button" class="oe_button oe_form_button oe_link bank-payments-button dismmis-modal" data-dismiss="modal">Salir</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </t>
+</template>

+ 16 - 0
views/templates.xml

@@ -0,0 +1,16 @@
+<openerp>
+    <data>
+        <template id="eiru_bank_payments_references.eiru_assets" name="eiru_bank_payments_references_eiru_assets" inherit_id="eiru_assets.assets">
+            <xpath expr="." position="inside">
+                <link rel="stylesheet" href="/eiru_bank_payments_references/static/src/css/style.css"/>
+                <script type="text/javascript" src="/eiru_bank_payments_references/static/src/js/bank_payments_state_change.js"/>
+                <script type="text/javascript" src="/eiru_bank_payments_references/static/src/js/bank_payments_customer_returned.js"/>
+                <script type="text/javascript" src="/eiru_bank_payments_references/static/src/js/bank_payments_supplier_returned.js"/>
+                <script type="text/javascript" src="/eiru_bank_payments_references/static/src/js/bank_payments_charge.js"/>
+                <script type="text/javascript" src="/eiru_bank_payments_references/static/src/js/bank_payments_reject.js"/>
+                <script type="text/javascript" src="/eiru_bank_payments_references/static/src/js/bank_payments_renegotiate.js"/>
+                <script type="text/javascript" src="/eiru_bank_payments_references/static/src/js/bank_payments_type_config.js"/>
+            </xpath>
+        </template>
+    </data>
+</openerp>

+ 44 - 0
views/view_res_bank.xml

@@ -0,0 +1,44 @@
+<?xml version="1.0"?>
+<openerp>
+    <data>
+
+        <function model="res.bank" name="CreateUpdateListBanks"/>
+
+        <record id="eiru_bank_payments_references_res_bank" model="ir.ui.view">
+            <field name="name">eiru.bank.payments.references.res.bank</field>
+            <field name="model">res.bank</field>
+            <field name="inherit_id" ref="base.view_res_bank_form"/>
+            <field name="arch" type="xml">
+                <field name="phone" position="before">
+                    <field name="ruc"/>
+                </field>
+            </field>
+        </record>
+
+        <record id="eiru_bank_payments_references_res_bank_tree" model="ir.ui.view">
+            <field name="name">eiru.bank.payments.references.res.bank</field>
+            <field name="model">res.bank</field>
+            <field name="inherit_id" ref="base.view_res_bank_tree"/>
+            <field name="arch" type="xml">
+                <field name="name" position="after">
+                    <field name="ruc"/>
+                    <field name="phone"/>
+                    <field name="fax"/>
+                </field>
+                <field name="bic" position='replace' />
+                <field name="country" position='replace' />
+            </field>
+        </record>
+
+        <record id="eiru_bank_payments_tree" model="ir.actions.act_window">
+            <field name="name">Bancos</field>
+            <field name="res_model">res.bank</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">tree,form</field>
+            <field name="target">current</field>
+        </record>
+
+        <menuitem id="eiru_res_bank_payments" name="Bancos" parent="account.menu_finance_bank_and_cash" action="eiru_bank_payments_tree" sequence="2"/>
+
+    </data>
+</openerp>

+ 54 - 0
views/view_res_bank_cheque_type.xml

@@ -0,0 +1,54 @@
+<?xml version="1.0"?>
+<openerp>
+    <data>
+        <!-- function -->
+        <function model="res.bank.cheque.type" name="_create_cheque_type"/>
+        <!-- form -->
+        <record id="eiru_bank_references_res_bank_cheque_type" model="ir.ui.view">
+            <field name="name">eiru.bank.references.res.bank.cheque.type</field>
+            <field name="model">res.bank.cheque.type</field>
+            <field name="arch" type="xml">
+                <form string="Tipo de Cheque ">
+                    <group string="Tipo de operación bancaria" col="2">
+                        <group string="Detalles">
+                            <field name="name" string="Descripción"/>
+                            <field name="code" string="Código"/>
+                        </group>
+                        <group string="Operación permitidas">
+                            <field name="is_cash" string="Efectivizár"/>
+                            <field name="is_bank" string="Deposito/Negociación"/>
+                        </group>
+                    </group>
+                </form>
+            </field>
+        </record>
+        <!-- tree -->
+        <record id="eiru_bank_references_res_bank_cheque_type_tree" model="ir.ui.view">
+            <field name="name">eiru.bank.references.res.bank.cheque.type.tree</field>
+            <field name="model">res.bank.cheque.type</field>
+            <field name="arch" type="xml">
+                <tree>
+                    <field name="name" string="Descripción"/>
+                    <field name="code" string="Código"/>
+                    <field name="is_cash" string="Efectivizár"/>
+                    <field name="is_bank" string="Deposito/Negociación"/>
+                </tree>
+            </field>
+        </record>
+
+        <record id="eiru_bank_cheque_type_tree" model="ir.actions.act_window">
+            <field name="name">Tipo de Cheque</field>
+            <field name="res_model">res.bank.cheque.type</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">tree,form</field>
+            <field name="target">current</field>
+        </record>
+
+        <menuitem
+            id="eiru_res_bank_cheque_type"
+            name="Tipo de cheque"
+            parent="account.menu_finance_bank_and_cash"
+            action="eiru_bank_cheque_type_tree"
+            sequence="4"/>
+    </data>
+</openerp>

+ 113 - 0
views/view_res_bank_line.xml

@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+    <data>
+        <!-- from -->
+        <record id="eiru_bank_payments_references_res_bank_line" model="ir.ui.view">
+            <field name="name">eiru.bank.payments.references.res.bank.line</field>
+            <field name="model">res.bank.payments</field>
+            <field name="arch" type="xml">
+                <form string="Operaciones bancarias">
+                    <header>
+                        <div class='bank-paymnets-bank'></div>
+                        <field name="state" widget="statusbar"/>
+                    </header>
+                    <sheet string="Operaciones bancarias">
+                        <h1>
+                            <field name='name'/>
+                        </h1>
+                        <group col="2" >
+                            <group>
+                                <field name="bank_id" string="Banco"/>
+                                <field name="bank_payments_type_id" string="Tipo de pago"/>
+                                <field name="date" string="Fecha de operación"/>
+                                <field name="currency_id" string="Moneda"/>
+                                <field name="customer_id" string="Recibido de"/>
+                            </group>
+                            <group>
+                                <field name="number_cta" string="Nº Cuenta"/>
+                                <field name="number_cta_origin" string="Nº Cuenta Origen"/>
+                                <field name="name_holder" string="Nombre del titular"/>
+                                <field name="number" string="Nº cheque/boleta"/>
+                                <field name="cheque_type_id" string="Tipo de Cheque"/>
+                                <field name="date_maturity" string="Vencimiento"/>
+                                <field name="supplier_id" string="Emitido a"/>
+                            </group>
+                        </group>
+                        <group col="2">
+                            <group>
+                                <field name="amount_total" string="Valor Total"/>
+                            </group>
+                            <group>
+                                <field name="amount_receipt" string="Disponible a Cobrar"/>
+                                <field name="amount_payment" string="Disponible a Pagar"/>
+                            </group>
+                        </group>
+
+                        <notebook>
+                            <page string="Transactions">
+                                <field name="payments_line">
+                                    <tree string="Paymntes lines" edit='false' delete='false' create='false'>
+                                        <field name="date" string="Fecha"/>
+                                        <field name="statement_id" string="Registros de caja"/>
+                                        <field name="statement_line_id" string="Transacciones de Caja"/>
+                                        <field name="type_operation" string="Tipo de operación"/>
+                                        <field name="amount" string="Monto del pago"/>
+                                        <field name="amount_currency" string="Importe Moneda"/>
+                                        <field name="currency_id" string="Moneda"/>
+                                    </tree>
+                                </field>
+                            </page>
+                        </notebook>
+                        <group>
+                            <field name="comment" string="Información adicional"/>
+                        </group>
+                    </sheet>
+                </form>
+            </field>
+        </record>
+        <!-- List -->
+        <record id="eiru_bank_payments_references_res_bank_line_list" model="ir.ui.view">
+			<field name="name">Listado de operaciónes bancarias</field>
+			<field name="model">res.bank.payments</field>
+			<field name="arch" type="xml">
+				<tree>
+					<field name="bank_id" string="Banco"/>
+					<field name="bank_payments_type_id" string="Tipo de pago"/>
+                    <field name="number_cta" string="Nº Cuenta"/>
+                    <field name="name_holder" string="Nombre del titular"/>
+					<field name="number" string="Nº cheque/boleta"/>
+					<field name="date_maturity" string="Vencimiento"/>
+                    <field name="amount_total" string="Monto"/>
+                    <field name="currency_id" string="Currency"/>
+					<field name="state" string="Estado"/>
+				</tree>
+			</field>
+		</record>
+        <!--  Search -->
+        <record id="eiru_bank_payments_references_res_bank_line_search" model="ir.ui.view">
+            <field name="name">res_bank_line_search</field>
+            <field name="model">res.bank.payments</field>
+            <field name="arch" type="xml">
+                <search>
+                    <group string="Agrupar por">
+                        <filter string="Banco" context="{'group_by':'bank_id'}"/>
+                        <filter string="Tipo de pago" context="{'group_by':'bank_payments_type_id'}"/>
+                        <filter string="Moneda" context="{'group_by': 'currency_id'}"/>
+                        <filter string="Vencimiento" name="date_maturity" context="{'group_by':'date_maturity'}"/>
+                        <filter string="Estado" context="{'group_by':'state'}"/>
+                    </group>
+                </search>
+            </field>
+        </record>
+
+        <record id="eiru_bank_payments_line_tree" model="ir.actions.act_window">
+            <field name="name">Operación bancaria</field>
+            <field name="res_model">res.bank.payments</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">tree,form</field>
+            <field name="target">current</field>
+        </record>
+
+        <menuitem id="eiru_res_bank_payments_line" name="Operaciones bancarias" parent="account.menu_finance_bank_and_cash" action="eiru_bank_payments_line_tree" sequence="5" />
+    </data>
+</openerp>

+ 61 - 0
views/view_res_bank_types.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0"?>
+<openerp>
+    <data>
+
+        <function model="res.bank.payments.type" name="_create_type_payments"/>
+
+        <record id="eiru_bank_payments_references_res_bank_type" model="ir.ui.view">
+            <field name="name">eiru.bank.payments.references.res.bank.type</field>
+            <field name="model">res.bank.payments.type</field>
+            <field name="arch" type="xml">
+                <form string="Tipo de operación bancaria ">
+                    <group string="Tipo de operación bancaria" col="2">
+                        <group string="Detalles">
+                            <field name="name" string="Descripción"/>
+                            <field name="code" string="Código"/>
+                            <field name="default_state" string="Estado por defecto"/>
+                            <field name="journal_ids" widget="many2many_tags" options="{'no_create': True}" domain="[('type', '=', 'bank')]" string="Método de pago"/>
+                        </group>
+                        <group string="Operaciones permitidas">
+                            <field name="is_receipt" string="Cobros"/>
+                            <field name="is_payment" string="Pagos"/>
+                        </group>
+                    </group>
+                    <group col="2">
+                        <group string="Campos permitido por el tipo de pagos">
+                            <div class='fields-allowed'></div>
+                        </group>
+                        <group string="Permitir duplicar la operación Bancaria">
+                            <field name="allow_duplicate_operation" nolabel="1"/>
+                        </group>
+                    </group>
+                </form>
+            </field>
+        </record>
+        <!-- tree -->
+        <record id="eiru_bank_payments_references_res_bank_type_tree" model="ir.ui.view">
+            <field name="name">eiru.bank.payments.references.res.bank.type.tree</field>
+            <field name="model">res.bank.payments.type</field>
+            <field name="arch" type="xml">
+                <tree>
+                    <field name="name" string="Descripción"/>
+                    <field name="code" string="Código"/>
+                    <field name="default_state" string="Estado por defecto"/>
+                    <field name="is_receipt" string="Cobros"/>
+                    <field name="is_payment" string="Pagos"/>
+                </tree>
+            </field>
+        </record>
+
+        <record id="eiru_bank_payments_type_tree" model="ir.actions.act_window">
+            <field name="name">Tipo de operación</field>
+            <field name="res_model">res.bank.payments.type</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">tree,form</field>
+            <field name="target">current</field>
+        </record>
+
+        <menuitem id="eiru_res_bank_payments_type" name="Tipo de operación" parent="account.menu_finance_bank_and_cash" action="eiru_bank_payments_type_tree" sequence="3"/>
+
+    </data>
+</openerp>