Browse Source

Utilidades banco

sebastian 5 years ago
commit
d21476dff1
54 changed files with 7259 additions and 0 deletions
  1. 1 0
      .gitignore
  2. 2 0
      __init__.py
  3. 26 0
      __openerp__.py
  4. 9 0
      models/__init__.py
  5. 28 0
      models/account_bank_statement.py
  6. 21 0
      models/account_bank_statement_cashbox.py
  7. 82 0
      models/account_bank_statement_config.py
  8. 27 0
      models/account_bank_statement_type.py
  9. 888 0
      models/account_bank_statement_utility.py
  10. 34 0
      models/cash_box_transfer.py
  11. 301 0
      models/cashbox_statement_cancel.py
  12. 313 0
      models/cashbox_statement_confirm.py
  13. 9 0
      security/ir.model.access.csv
  14. BIN
      static/description/icon.png
  15. 596 0
      static/src/css/style.css
  16. 335 0
      static/src/js/eiru_statement_cancel.js
  17. 382 0
      static/src/js/eiru_statement_cashbox_deleted.js
  18. 258 0
      static/src/js/eiru_statement_cashbox_input.js
  19. 307 0
      static/src/js/eiru_statement_cashbox_output.js
  20. 432 0
      static/src/js/eiru_statement_confirm.js
  21. 337 0
      static/src/js/eiru_statement_confirm_print.js
  22. 40 0
      static/src/js/eiru_statement_init.js
  23. 123 0
      static/src/js/eiru_statement_open.js
  24. 353 0
      static/src/js/eiru_statement_transfer.js
  25. 300 0
      static/src/js/eiru_statement_transfer_deleted.js
  26. 264 0
      static/src/js/eiru_statement_unlink.js
  27. 122 0
      static/src/js/import_statement.js
  28. 303 0
      static/src/js/modal_statement_line_unlink.js
  29. 8 0
      static/src/xml/eiru_statement_cancel.xml
  30. 8 0
      static/src/xml/eiru_statement_cashbox_deleted.xml
  31. 8 0
      static/src/xml/eiru_statement_cashbox_input.xml
  32. 8 0
      static/src/xml/eiru_statement_cashbox_output.xml
  33. 8 0
      static/src/xml/eiru_statement_confirm.xml
  34. 8 0
      static/src/xml/eiru_statement_confirm_print.xml
  35. 8 0
      static/src/xml/eiru_statement_open.xml
  36. 8 0
      static/src/xml/eiru_statement_transfer.xml
  37. 8 0
      static/src/xml/eiru_statement_transfer_deleted.xml
  38. 8 0
      static/src/xml/eiru_statement_unlink.xml
  39. 8 0
      static/src/xml/import_statement.xml
  40. 120 0
      static/src/xml/modal/modal_statement_cancel.xml
  41. 55 0
      static/src/xml/modal/modal_statement_cashbox.xml
  42. 172 0
      static/src/xml/modal/modal_statement_cashbox_deleted.xml
  43. 26 0
      static/src/xml/modal/modal_statement_confirm-print.xml
  44. 125 0
      static/src/xml/modal/modal_statement_confirm.xml
  45. 62 0
      static/src/xml/modal/modal_statement_line_unlink.xml
  46. 80 0
      static/src/xml/modal/modal_statement_transfer.xml
  47. 116 0
      static/src/xml/modal/modal_statement_transfer_deleted.xml
  48. 65 0
      static/src/xml/modal/modal_statement_unlink.xml
  49. 8 0
      static/src/xml/modal_statement_line_unlink.xml
  50. 65 0
      views/account_bank_statement_type.xml
  51. 211 0
      views/account_bank_statemente_config.xml
  52. 75 0
      views/eiru_statement_utility.xml
  53. 64 0
      views/import_statement.xml
  54. 34 0
      views/template.xml

+ 1 - 0
.gitignore

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

+ 2 - 0
__init__.py

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

+ 26 - 0
__openerp__.py

@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+{
+    'name': 'Eiru Account Bank Statement Utility',
+    'author':  'Adrielso Kunert',
+    'version': '0.1',
+    'category': 'account',
+    'description': "Modulo para mejorar el manejo de caja .",
+    'depends': [
+        'account',
+        'eiru_assets',
+        'currency_utility',
+    ],
+    'data': [
+        'views/template.xml',
+        'security/ir.model.access.csv',
+        'views/account_bank_statement_type.xml',
+        'views/eiru_statement_utility.xml',
+        'views/import_statement.xml',
+        'views/account_bank_statemente_config.xml',
+    ],
+    'qweb': [
+        'static/src/xml/*.xml',
+        'static/src/xml/modal/*.xml',
+    ],
+    'installable': True,
+}

+ 9 - 0
models/__init__.py

@@ -0,0 +1,9 @@
+# -*- coding: utf-8 -*-
+import account_bank_statement_config
+import account_bank_statement_type
+import account_bank_statement_utility
+import account_bank_statement_cashbox
+import account_bank_statement
+import cash_box_transfer
+import cashbox_statement_confirm
+import cashbox_statement_cancel

+ 28 - 0
models/account_bank_statement.py

@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+from openerp import models, fields, tools, api
+
+class AccountBankStatement(models.Model):
+    _inherit = 'account.bank.statement'
+
+    @api.model
+    def _default_type_statement(self):
+        typeStatement =  self.env['account.bank.statement.type'].search([('is_default', '=', True)],limit=1)
+        return typeStatement.id if (typeStatement) else ''
+
+    type_statement = fields.Many2one('account.bank.statement.type', string='Tipo de Caja', ondelete='restrict')
+
+    _defaults = {
+        'type_statement': _default_type_statement,
+    }
+
+    @api.model
+    def update_statement_type_defualt(self):
+        type =  self.env['account.bank.statement.type'].search([('is_default', '=', True)],limit=1)
+        statement = self.env['account.bank.statement'].search([('type_statement', '=', False)])
+        if (not statement):
+            return False
+
+        for statementUpdate in statement:
+            statementUpdate.write({
+                'type_statement': type.id
+            })

+ 21 - 0
models/account_bank_statement_cashbox.py

@@ -0,0 +1,21 @@
+from openerp import models, fields, tools, api
+
+class casbox_input(models.Model):
+    _inherit = 'cash.box.in'
+
+    date = fields.Date()
+    message_deleted = fields.Text('Message Deleted')
+    active = fields.Boolean('Active', default=True)
+    line_id = fields.Many2one('account.bank.statement.line', 'Bank statement line')
+    statement_id = fields.Many2one('account.bank.statement', 'Bank statement')
+
+
+class casbox_output(models.Model):
+    _inherit = 'cash.box.out'
+
+    date = fields.Date()
+    ref =fields.Char('ref')
+    message_deleted = fields.Text('Message Deleted')
+    active = fields.Boolean('Active', default=True)
+    line_id = fields.Many2one('account.bank.statement.line', 'Bank statement line')
+    statement_id = fields.Many2one('account.bank.statement', 'Bank statement')

+ 82 - 0
models/account_bank_statement_config.py

@@ -0,0 +1,82 @@
+# -*- coding: utf-8 -*-
+from openerp import models, fields, tools, api
+
+class accountBankStatementConfig(models.Model):
+    _name = "account.bank.statement.config"
+
+    name = fields.Char('Name', required=True, default="Configuración Cajas")
+    active = fields.Boolean('Active', default=True)
+
+    ## Forma de Importar Pagso en caja Ventas/compras/RRHH
+    import_statement_payments = fields.Selection([('automatic_import', 'Automático'),('manual_import','Manual')],'Importar pagos en caja',default='automatic_import',help='Tipo de importar los pago en caja', required=True)
+    import_statement_payslip = fields.Selection([('automatic_import', 'Automático'),('manual_import','Manual')],'Importar pagos de RRHH en caja',default='automatic_import',help='Tipo de importar los pago en caja', required=True)
+
+    ## TRANSFERENCIA
+    transfer_user_ids = fields.Many2many('res.users', 'statement_config_transfer_user', 'account_bank_statement_config_id','res_users_id', string='statement_transfer_user')
+    transfer_statement_ids = fields.Many2many('account.bank.statement.type', 'statement_config_transfer_statement', 'account_bank_statement_config_id', 'account_bank_statement_type_id', string="statement_config_transfer_statement")
+    transfer_negative_amount = fields.Boolean('transfer_negative_amount', default=False, help="Permitir transferencia sin saldo en caja")
+    delete_transfer_user_ids = fields.Many2many('res.users', 'statement_config_deleted_transfer_user', 'account_bank_statement_config_id','res_users_id', string='statement_delete_transfer_user')
+
+    ## Poner Dinero
+    input_cash_box_user_id = fields.Many2many('res.users', 'statement_config_input_user', 'account_bank_statement_config_id', 'res_users_id', string='statement_input_user')
+    input_cash_box_statement_ids = fields.Many2many('account.bank.statement.type', 'statement_config_input_statement', 'account_bank_statement_config_id', 'account_bank_statement_type_id', string="statement_config_input_statement")
+    delete_input_user_ids = fields.Many2many('res.users', 'statement_config_deleted_input_user', 'account_bank_statement_config_id','res_users_id', string='statement_delete_input_user')
+
+    ## Sacar Dinero
+    output_cash_box_user_id = fields.Many2many('res.users', 'statement_config_output_user', 'account_bank_statement_config_id', 'res_users_id', string='statement_output_user')
+    output_cash_box_statement_ids = fields.Many2many('account.bank.statement.type', 'statement_config_output_statement', 'account_bank_statement_config_id', 'account_bank_statement_type_id', string="statement_config_output_statement")
+    output_negative_amount = fields.Boolean('output_negative_amount', default=False, help="Permitir sacar dinero sin saldo en caja")
+    delete_output_user_ids = fields.Many2many('res.users', 'statement_config_deleted_output_user', 'account_bank_statement_config_id','res_users_id', string='statement_delete_output_user')
+
+    ## Abrir Cajas
+    statement_open_config = fields.Boolean('statement_open_config', default=False, help="Permitir abrir mas de una caja(por usuario, por diario, por tipo de caja)")
+
+    ## statement confirm
+    statement_confirm_user = fields.Many2many('res.users', 'statement_config_confirm_user', 'account_bank_statement_config_id', 'res_users_id', string='Usuario permitido para cerrar Caja ')
+    statement_confirm_transfer_user = fields.Many2many('res.users', 'statement_config_confirm_transfer_user', 'account_bank_statement_config_id', 'res_users_id', string='Usuario permitido para realizar transferencia')
+    statement_confirm_balance = fields.Many2many('res.users', 'statement_config_confirm_balance', 'account_bank_statement_config_id', 'res_users_id', string='Usuario permitido para ajuste de cierre')
+    statement_confirm_negative_amount = fields.Many2many('res.users', 'statement_confirm_negative_amount', 'account_bank_statement_config_id', 'res_users_id', string='Usuario permitido para cerrar caja sin saldo ')
+    ## statement Cancel
+    statement_cancel_user = fields.Many2many('res.users', 'statement_config_cancel_user', 'account_bank_statement_config_id', 'res_users_id', string='Usuarios permitidos para cancelar Cajas')
+    ## Statement Unlink
+    statement_unlink_user = fields.Many2many('res.users', 'statement_config_unlink_user', 'account_bank_statement_config_id', 'res_users_id', string='Usuarios permitidos para Eliminar Cajas')
+
+    '''
+    ### Configuración de caja. ###
+
+    ## Forma de Importar Pagso en caja Ventas/compras/RRHH. ##
+        :fields import_statement_payments   : Forma que se importaran los pagos de ventas/compra/devoluciones en caja.
+        :fields import_statement_payslip    : Forma que se importaran los pagos de nomina y adelanto en caja.
+
+    ## TRANSFERENCIA. ##
+        :fields transfer_user_ids           : Usuario permitido a realizar transferencia.
+        :fields transfer_statement_ids      : Cajas permitidas para realizar transferencia.
+        :fields transfer_negative_amount    : Usuario que puedan borrar las transferencia.
+        :fields delete_transfer_user_ids    : Permitir Transferencia cuando la caja no tenga saldo.
+
+    ## Poner Dinero. ##
+        :fields input_cash_box_user_id          : Usuarios permitido para colocar dinero en la caja.
+        :fields input_cash_box_statement_ids    : Tipo de caja que se permita colocar dinero.
+        :fields delete_input_user_ids           : Usuario que puedan eliminar  la entrada de dinero.
+
+    ## Sacar Dinero. ##
+        :fields output_cash_box_user_id         : Usuarios permitido para sacar dinero en la caja.
+        :fields output_cash_box_statement_ids   : Tipo de caja que se permita sacar dinero.
+        :fields output_negative_amount          : Permitir sacar dinero si saldo en caja.
+        :fields delete_output_user_ids          : Usuario que puedan eliminar  las salida de dinero.
+
+    ## Abrir Cajas. ##
+        :fields statement_open_config   : Permitir abrir mas de una  caja por usuario.
+
+    ## statement confirm(Cerrar Caja). ##
+        :fields statement_confirm_user              : Usuario permitido a cerrar caja.
+        :fields statement_confirm_transfer_user     : Usuario permitido a realizar transferencia.
+        :fields statement_confirm_balance           : Usuario permitido a realizar Ajuste de caja.
+        :fields statement_confirm_negative_amount   : Permitir cerrar las caja con saldo negativo.
+
+    ## statement Cancel (Cancelar caja). ##
+        :fields statement_cancel_user       : Usuario permitido a cancelar caja.
+
+    ## statement Unlink (Eliminar caja). ##
+        :fields statement_unlink_user       : Usuarios permitidos a eliminar cajas.
+    '''

+ 27 - 0
models/account_bank_statement_type.py

@@ -0,0 +1,27 @@
+# -*- coding: utf-8 -*-
+from openerp import models, fields, tools, api
+
+class accountBankStatementType(models.Model):
+    _name = "account.bank.statement.type"
+
+    name = fields.Char('Name', required=True)
+    active = fields.Boolean('Active', default=True)
+    code = fields.Char('Code', size=32, required=True, select=True)
+    comment = fields.Text('Description')
+    is_default = fields.Boolean('default')
+
+
+    @api.model
+    def createDefaultState(self):
+        typeStatement = [
+                {'name': 'Caja Chica', 'active': True, 'code': 'CHICA', 'comment': 'La caja chica es la caja que manipularan los cajeros durante un periodo de tiempo definido.', 'is_default': True},
+                {'name':'Caja General', 'active':True, 'code': 'GENERAL', 'comment': 'La caja generar sera manipulado por el gerente, y centralizara todo los movimiento de las caja chicas.','is_default': False}
+        ]
+
+        for typeSt in typeStatement:
+            statementType = self.env['account.bank.statement.type'].search([('code', '=', typeSt['code'])])
+
+            types = {'name': typeSt['name'], 'active': typeSt['active'], 'code': typeSt['code'], 'comment': typeSt['comment'], 'is_default': typeSt['is_default']}
+
+            if (not statementType):
+                statementType.create(types)

+ 888 - 0
models/account_bank_statement_utility.py

@@ -0,0 +1,888 @@
+# -*- coding: utf-8 -*-
+from openerp import models, fields, tools, api
+from datetime import datetime
+from pytz import timezone
+
+DATE_FORMAT = '%Y-%m-%d'
+
+class AccountBankStatementUtility(models.Model):
+    _inherit = 'account.bank.statement'
+
+    '''
+        get_account_bank_statement_utility
+    '''
+    @api.model
+    def get_account_bank_statement_utility(self, id):
+        '''
+            Get Account Bank Statement
+            :param : id: id account bank statement,
+            :return : Object Account bank statement + Amount(account Bank statement line)
+        '''
+        decimal_precision = self.env['decimal.precision'].precision_get('Account')
+        bankStatement = self.env['account.bank.statement'].browse(id)
+
+        if (not bankStatement):
+            return False
+
+        accountStatement = []
+        amount = 0.0
+
+        for line in bankStatement.line_ids:
+            amount += line.amount
+
+        if (bankStatement.balance_start > 0):
+            amount += bankStatement.balance_start
+
+        accountStatement.append({
+            'id': bankStatement.id,
+            'name': bankStatement.name,
+            'date': bankStatement.date,
+            'journalId': bankStatement.journal_id.id,
+            'periodId': bankStatement.period_id.id,
+            'userId': bankStatement.user_id.id,
+            'userName': bankStatement.user_id.name,
+            'typeStatement': bankStatement.type_statement.id,
+            'typeStatementName': bankStatement.type_statement.name,
+            'state': bankStatement.state,
+            'amount': round(amount,decimal_precision),
+            'currencystatement': {
+                'id': bankStatement.currency.id,
+                'symbol': bankStatement.currency.symbol,
+                'rate': bankStatement.currency.rate,
+                'thousandsSeparator': bankStatement.currency.thousands_separator,
+                'decimalSeparator': bankStatement.currency.decimal_separator,
+                'decimalPlaces': bankStatement.currency.decimal_places,
+                'position': bankStatement.currency.position,
+            },
+        })
+
+        return accountStatement
+
+    @api.model
+    def get_account_journal_utility(self,id):
+        bankStatement = self.env['account.bank.statement'].browse(id)
+        if (not bankStatement):
+            return False
+
+        domain = [('active', '=', True), ('type', 'in', ['bank', 'cash']), ('id', 'in', [bankStatement.journal_id.id])];
+
+        accountJournal = self.env['account.journal'].search(domain)
+        journalUtility = []
+        for journal in accountJournal:
+
+            domainStatment = [('id','!=',bankStatement.id),('journal_id','in',[journal.id])]
+            # domainStatment = [('id','!=',bankStatement.id) ,('journal_id','in',[journal.id]),('date','=',bankStatement.date),('period_id','=',bankStatement.period_id.id)]
+
+            if (journal.type == 'cash'):
+                domainStatment.append(('state','=', 'open'))
+
+            if (journal.type == 'bank'):
+                domainStatment.append(('state','!=','confirm'))
+
+            statementJournal = []
+
+            statement = self.env['account.bank.statement'].search(domainStatment)
+
+            for statementOpen in statement:
+                statementJournal.append({
+                        'id': statementOpen.id,
+                        'journalId': statementOpen.journal_id.id,
+                        'date': statementOpen.date,
+                        'typeStatementId': statementOpen.type_statement.id,
+                        'typeStatementName': statementOpen.type_statement.name,
+                        'userId': statementOpen.user_id.id,
+                        'userName': statementOpen.user_id.name,
+                        'name': statementOpen.name,
+                        'state': statementOpen.state,
+                        'statementname': statementOpen.name+" / "+statementOpen.user_id.name
+                })
+
+            journalUtility.append({
+                'id': journal.id,
+                'name': journal.name,
+                'code': journal.code,
+                'type': journal.type,
+                'currencyId': journal.currency.id,
+                'statementJournal': statementJournal
+            })
+
+        return journalUtility
+
+    '''
+        Get User Login
+    '''
+    @api.model
+    def eiru_transfers_get_user(self):
+        return  [{
+            'id': user.id,
+            'name': user.name
+        } for user in self.env.user]
+
+    @api.model
+    def eiru_transfers_get_chas_box_transfer(self, id):
+        return [{
+            'id': transfer.id,
+            'name': transfer.name,
+            'amount': transfer.amount,
+            'ref': transfer.ref,
+            'date': transfer.date,
+            'outputStatement': {
+                'id': transfer.output_statement.id,
+                'name': transfer.output_statement.name,
+                'typeJournal': transfer.output_statement.journal_id.type,
+                'state': transfer.output_statement.state,
+                'date': transfer.output_statement.date,
+                'userId': transfer.output_statement.user_id.id,
+                'currency': {
+                    'symbol': transfer.output_statement.currency.symbol,
+                    'thousandsSeparator': transfer.output_statement.currency.thousands_separator,
+                    'decimalSeparator': transfer.output_statement.currency.decimal_separator,
+                    'decimalPlaces': transfer.output_statement.currency.decimal_places,
+                }
+            },
+            'inputStatement': {
+                'id': transfer.input_statement.id,
+                'name': transfer.input_statement.name,
+                'state': transfer.input_statement.state,
+                'typeJournal': transfer.input_statement.journal_id.type,
+                'date': transfer.input_statement.date,
+                'userId': transfer.input_statement.user_id.id,
+                'currency': {
+                    'symbol': transfer.input_statement.currency.symbol,
+                    'thousandsSeparator': transfer.input_statement.currency.thousands_separator,
+                    'decimalSeparator': transfer.input_statement.currency.decimal_separator,
+                    'decimalPlaces': transfer.input_statement.currency.decimal_places,
+                }
+            },
+            'outputLine': {
+                'id': transfer.output_line.id,
+                'statementID': transfer.output_line.statement_id.id,
+            },
+            'inputLine': {
+                'id': transfer.input_line.id,
+                'statementID': transfer.input_line.statement_id.id,
+            }
+        } for transfer in self.env['cash.box.transfer'].search(['|', ('output_statement.id','=',id), ('input_statement.id','=',id)])]
+
+    '''
+              _____                     __
+             |_   _| __ __ _ _ __  ___ / _| ___ _ __ ___
+               | || '__/ _` | '_ \/ __| |_ / _ \ '__/ __|
+               | || | | (_| | | | \__ \  _|  __/ |  \__ \
+               |_||_|  \__,_|_| |_|___/_|  \___|_|  |___/
+    '''
+    '''
+        Get Account Bank Statement
+    '''
+    def _get_statement_transfer(self,id):
+        return self.env['account.bank.statement'].browse(id)
+
+    '''
+        Get Account Journal
+    '''
+    def _get_journal_transfer(self, id):
+        return self.env['account.journal'].browse(id)
+
+    '''
+        Create Line statement.
+    '''
+    def _create_statement_line_transfer(self, statement, name, amount, ref):
+        statementLine = {
+            'statement_id': statement.id,
+            'name': name,
+            'amount': amount ,
+            'ref': ref,
+            'account_id': statement.journal_id.internal_account_id.id,
+            'journal_id': statement.journal_id.id,
+            'is_deleted': True
+        }
+
+        line = self.env['account.bank.statement.line'].create(statementLine)
+        return line
+
+
+    '''
+        Create cash box transfer
+    '''
+    def _create_cash_box_transfer(self, ref, amount, lineInput, lineOutput):
+        cash = {
+            'name': "TRANSFERENCIA %s a %s" %((lineOutput.statement_id.name),(lineInput.statement_id.name)),
+            'amount': amount,
+            'ref': ref,
+            'input_line': lineInput.id,
+            'output_line': lineOutput.id,
+            'input_statement': lineInput.statement_id.id,
+            'output_statement': lineOutput.statement_id.id,
+            'date': lineOutput.date
+        }
+        return self.env['cash.box.transfer'].create(cash)
+
+    '''
+        Create Line statement Transfer
+    '''
+    @api.model
+    def statement_complet_transfers(self, values):
+        statementOrigin = self._get_statement_transfer(values['statementOriginId'])
+        if (not statementOrigin):
+            return False
+
+        statementDestiny = self._get_statement_transfer(values['statementDestinyId'])
+        if (not statementDestiny):
+            return False
+
+        accountJournal = self._get_journal_transfer(values['journalID'])
+        if (not accountJournal):
+            return False
+
+        # output
+        name = "TRANSFERENCIA/"+str(statementDestiny.name)
+        statementOutput = self._create_statement_line_transfer(statementOrigin, name,(-values['amountTransfer']), values['refTransfer'])
+        if (not statementOutput):
+            return False
+
+        # input
+        name = "TRANSFERENCIA/"+str(statementOrigin.name)
+        statementInput = self._create_statement_line_transfer(statementDestiny, name, abs(values['amountTransfer']), values['refTransfer'])
+        if (not statementInput):
+            return False
+
+        cash_box_transfer = self._create_cash_box_transfer(values['refTransfer'], abs(values['amountTransfer']), statementInput, statementOutput)
+        if (not cash_box_transfer):
+            return False
+
+        return True
+
+    '''
+          _   _       _ _       _      _____                     __
+         | | | |_ __ | (_)_ __ | | __ |_   _| __ __ _ _ __  ___ / _| ___ _ __
+         | | | | '_ \| | | '_ \| |/ /   | || '__/ _` | '_ \/ __| |_ / _ \ '__|
+         | |_| | | | | | | | | |   <    | || | | (_| | | | \__ \  _|  __/ |
+          \___/|_| |_|_|_|_| |_|_|\_\   |_||_|  \__,_|_| |_|___/_|  \___|_|
+    '''
+    '''
+        Get Cash Box Transfer
+    '''
+    def _get_cash_box_transfer(self, id):
+        return self.env['cash.box.transfer'].browse(id)
+
+    '''
+        Get timezone
+    '''
+    def get_timezone(self):
+        tz_name = self._context.get('tz') or self.env.user.tz
+        return timezone(tz_name)
+
+    '''
+        Get server date
+    '''
+    def get_server_datetime(self):
+        return datetime.now(self.get_timezone()).strftime(DATE_FORMAT)
+
+    '''
+        Get Statement Line
+    '''
+    def _get_statement_Line(self, id):
+        return self.env['account.bank.statement.line'].browse(id)
+
+    '''
+        writer Line Statement
+    '''
+    def _write_statement_line_transfer(self, line):
+        return line.write({
+            'is_deleted': False
+        })
+
+    '''
+        Unlink Line Statement
+    '''
+    def _unlink_statement_line_transfer(self, line):
+        return line.unlink()
+
+    '''
+        Write cash box transfer
+    '''
+    def _write_cash_box_transfer(self, casbox, message, user):
+        return casbox.write({
+            'message_deleted': message,
+            'active': False,
+            'write_uid': user.id
+        })
+
+    '''
+        unlink Initial
+    '''
+    @api.model
+    def unlink_transfer(self, values):
+        ### user
+        user = self.env.user
+        ### date server
+        date_server = self.get_server_datetime()
+        ### account Statement
+        statement = self._get_statement_transfer(values['statementId'])
+        if (not statement):
+            return {
+                'state' : False,
+                'message': "No se pudo completar la operación."
+            }
+
+        ### Transferencia
+        cashBoxTransfer =  self._get_cash_box_transfer(values['transferId'])
+        if (not cashBoxTransfer):
+            return {
+                'state' : False,
+                'message': "No se pudo completar la operación."
+            }
+
+        ### Line output
+        lineOutput = self._get_statement_Line(cashBoxTransfer.output_line.id)
+        if (not lineOutput):
+            return {
+                'state' : False,
+                'message': "No se pudo completar la operación."
+            }
+
+        if (lineOutput.statement_id.state == 'confirm'):
+            return {
+                'state' : False,
+                'message': "No se pudo completar la operación, por que la caja de origen ya fue cerrada"
+            }
+
+        ### Line Input
+        lineInput = self._get_statement_Line(cashBoxTransfer.input_line.id)
+        if (not lineInput):
+            return {
+                'state' : False,
+                'message': "No se pudo completar la operación."
+            }
+
+        if (lineInput.statement_id.state == 'confirm'):
+            return {
+                'state' : False,
+                'message': "No se pudo completar la operación por que la caja destino ya fue cerrada"
+            }
+
+        ## updtae
+        writeOutput = self._write_statement_line_transfer(lineOutput)
+        ## unlink
+        unlinkOutpu = self._unlink_statement_line_transfer(lineOutput)
+        if (not unlinkOutpu):
+            return {
+                'state' : False,
+                'message': "No se pudo completar la operación, error al eliminar la transferencia"
+            }
+        ## Update
+        writeInput = self._write_statement_line_transfer(lineInput)
+        ## Unlink
+        unlinkInput = self._unlink_statement_line_transfer(lineInput)
+        if (not unlinkInput):
+            return {
+                'state' : False,
+                'message': "No se pudo completar la operación, error al eliminar la transferencia"
+            }
+
+        message = values['comment']+" \nEliminado por la caja "+str(statement.name)+" y por Usuario "+str(user.name)+" en "+str(date_server)
+
+        writeTransfer = self._write_cash_box_transfer(cashBoxTransfer, message, user)
+        if (not writeTransfer):
+            return {
+                'state' : False,
+                'message': "No se pudo completar la operación"
+            }
+
+        return { 'state': True,
+                'message': 'Operación realizada con éxito'
+        }
+
+    '''
+       ____          ____               ___                  ___        _
+      / ___|__ _ ___| __ )  _____  __  |_ _|_ __            / _ \ _   _| |_
+     | |   / _` / __|  _ \ / _ \ \/ /   | || '_ \   _____  | | | | | | | __|
+     | |__| (_| \__ \ |_) | (_) >  <    | || | | | |_____| | |_| | |_| | |_
+      \____\__,_|___/____/ \___/_/\_\  |___|_| |_|          \___/ \__,_|\__|
+
+    '''
+    '''
+        GET CashBox In
+    '''
+    @api.model
+    def eiru_get_cash_box_in(self, id):
+        return [{
+            'id': box_in.id,
+            'name': box_in.name,
+            'amount': box_in.amount,
+            'ref': box_in.ref,
+            'date': box_in.date,
+            'type': 'in',
+            'statement': {
+                'id': box_in.statement_id.id,
+                'name': box_in.statement_id.name,
+                'state': box_in.statement_id.state,
+                'typeJournal': box_in.statement_id.journal_id.type,
+                'date': box_in.statement_id.date,
+                'userId': box_in.statement_id.user_id.id,
+                'currency': {
+                    'symbol': box_in.statement_id.currency.symbol,
+                    'thousandsSeparator': box_in.statement_id.currency.thousands_separator,
+                    'decimalSeparator': box_in.statement_id.currency.decimal_separator,
+                    'decimalPlaces': box_in.statement_id.currency.decimal_places,
+                    }
+            },
+            'statementLine': {
+                'id': box_in.line_id.id
+            }
+        } for box_in in self.env['cash.box.in'].search([('statement_id.id', '=', id)])]
+
+    '''
+        GET CashBox out
+    '''
+    @api.model
+    def eiru_get_cash_box_out(self, id):
+        return [{
+            'id': box_out.id,
+            'name': box_out.name,
+            'amount': box_out.amount,
+            'ref': box_out.ref,
+            'date': box_out.date,
+            'type': 'out',
+            'statement': {
+                'id': box_out.statement_id.id,
+                'name': box_out.statement_id.name,
+                'state': box_out.statement_id.state,
+                'typeJournal': box_out.statement_id.journal_id.type,
+                'date': box_out.statement_id.date,
+                'userId': box_out.statement_id.user_id.id,
+                'currency': {
+                    'symbol': box_out.statement_id.currency.symbol,
+                    'thousandsSeparator': box_out.statement_id.currency.thousands_separator,
+                    'decimalSeparator': box_out.statement_id.currency.decimal_separator,
+                    'decimalPlaces': box_out.statement_id.currency.decimal_places,
+                    }
+            },
+            'statementLine': {
+                'id': box_out.line_id.id
+            }
+        } for box_out in self.env['cash.box.out'].search([('statement_id.id', '=', id)])]
+
+    '''
+        Create Statement Line
+    '''
+    def _create_statement_line_input_outup(self, statement,ref,amount,type,name):
+        statementLine = {
+            'statement_id': statement.id,
+            'name': name,
+            'amount': type in ('input') and amount or -amount,
+            'ref': ref,
+            'account_id': statement.journal_id.internal_account_id.id,
+            'journal_id': statement.journal_id.id,
+            'is_deleted': True
+        }
+
+        line = self.env['account.bank.statement.line'].create(statementLine)
+        return line
+
+    '''
+        Create cashBox input
+    '''
+    def create_cash_box_in_out(self, line, amount, ref, name, type):
+        cash = {
+            'name': "%s %s" %((name),(line.statement_id.name)),
+            'amount': amount,
+            'ref': ref,
+            'date': line.date,
+            'line_id': line.id,
+            'statement_id': line.statement_id.id,
+        }
+        if (type =='input'):
+            return self.env['cash.box.in'].create(cash)
+        else:
+            return self.env['cash.box.out'].create(cash)
+
+    '''
+        Create casbox input/output
+    '''
+    @api.model
+    def create_cash_box_input_output(self, values):
+        statement = self._get_statement_transfer(values['statementId'])
+        if (not statement):
+            return False
+
+        name = values['type'] in ('input') and 'Entrada de Dinero' or 'Salida de Dinero'
+
+        lineStatement = self._create_statement_line_input_outup(statement, values['ref'], values['amount'], values['type'], name)
+        if (not lineStatement):
+            return False
+
+        casBox = self.create_cash_box_in_out(lineStatement, values['amount'], values['ref'], name, values['type'])
+
+        if (not casBox):
+            return False
+
+        return {
+            'state': True
+        }
+
+    '''
+          _   _       _ _       _                    _     _                 _          __          _
+         | | | |_ __ | (_)_ __ | | __   ___ __ _ ___| |__ | |__   _____  __ (_)_ __    / /__  _   _| |_
+         | | | | '_ \| | | '_ \| |/ /  / __/ _` / __| '_ \| '_ \ / _ \ \/ / | | '_ \  / / _ \| | | | __|
+         | |_| | | | | | | | | |   <  | (_| (_| \__ \ | | | |_) | (_) >  <  | | | | |/ / (_) | |_| | |_
+          \___/|_| |_|_|_|_| |_|_|\_\  \___\__,_|___/_| |_|_.__/ \___/_/\_\ |_|_| |_/_/ \___/ \__,_|\__|
+    '''
+    '''
+        get Cash box in - out
+    '''
+    def _get_cash_box_in_out(self, id, type):
+        if (type == 'in'):
+            return self.env['cash.box.in'].browse(id)
+        if (type == 'out'):
+            return self.env['cash.box.out'].browse(id)
+
+    '''
+        Unlink cash box in/out
+    '''
+    @api.model
+    def unlink_cashbox_in_out(self, values):
+        ### user
+        user = self.env.user
+        ### date server
+        date_server = self.get_server_datetime()
+        ### account Statement
+        statement = self._get_statement_transfer(values['statementId'])
+        if (not statement):
+            return {
+                'state' : False,
+                'message': "No se pudo completar la operación."
+            }
+
+        ### cas box
+        cashBox =  self._get_cash_box_in_out(values['cashboxID'], values['type'])
+        if (not cashBox):
+            return {
+                'state' : False,
+                'message': "No se pudo completar la operación."
+            }
+
+        ### Line statement
+        lineStatement = self._get_statement_Line(cashBox.line_id.id)
+        if (not lineStatement):
+            return {
+                'state' : False,
+                'message': "No se pudo completar la operación."
+            }
+
+        ## updtae line
+        writelinet = self._write_statement_line_transfer(lineStatement)
+        ## unlink line
+        unlinkline = self._unlink_statement_line_transfer(lineStatement)
+        if (not unlinkline):
+            return {
+                'state' : False,
+                'message': "No se pudo completar la operación, error al eliminar la transferencia"
+            }
+
+        message = values['message']+" \nEliminado por la caja "+str(statement.name)+" y por Usuario "+str(user.name)+" en "+str(date_server)
+
+        writeTransfer = self._write_cash_box_transfer(cashBox, message, user)
+        if (not writeTransfer):
+            return {
+                'state' : False,
+                'message': "No se pudo completar la operación"
+            }
+
+        return { 'state': True,
+                'message': 'Operación realizada con éxito'
+        }
+
+    '''
+          ____  _        _                            _      ___
+         / ___|| |_ __ _| |_ ___ _ __ ___   ___ _ __ | |_   / _ \ _ __   ___ _ __
+         \___ \| __/ _` | __/ _ \ '_ ` _ \ / _ \ '_ \| __| | | | | '_ \ / _ \ '_ \
+          ___) | || (_| | ||  __/ | | | | |  __/ | | | |_  | |_| | |_) |  __/ | | |
+         |____/ \__\__,_|\__\___|_| |_| |_|\___|_| |_|\__|  \___/| .__/ \___|_| |_|
+                                                                 |_|
+    '''
+    '''
+        Get Statement Open
+    '''
+    @api.model
+    def get_account_bank_statement_open(self,id):
+        statement = self._get_statement_transfer(id)
+        if (not statement):
+            return False
+
+        return [{
+            'id': open.id,
+            'name': open.name
+        } for open in self.env['account.bank.statement'].search([('journal_id.id', '=',statement.journal_id.id),('type_statement.id', '=', statement.type_statement.id),('user_id.id', '=', statement.user_id.id),('state', '=', 'open')])]
+
+    '''
+        Open cashBox
+    '''
+    @api.model
+    def account_bank_statement_open_cashbox(self, id):
+        statement = self._get_statement_transfer(id)
+        return statement.button_open()
+
+    @api.model
+    def account_bank_statement_open(self, id):
+        statement = self._get_statement_transfer(id)
+        cashBoxConfirm = self._get_cashbox_statement_confirm(statement)
+        for casBox in cashBoxConfirm:
+            name = "SALDO ANTERIOR /"+str(casBox.statement_id.name)
+            lineTransfer = self._create_statement_line_transfer(statement, name, (casBox.amount_next_open), 'Apertura')
+            # lineTransfer = self._create_statement_line_transfer(statement, name, abs(casBox.amount_next_open), 'Apertura')
+            if (not lineTransfer):
+                return {
+                    'state': False,
+                    'message': "Error al registrar el saldo anterior."
+                }
+
+            confirmCasBox = self.env['cashbox.statement.confirm'].browse(casBox.id)
+            values = {
+                        'statement_open': statement.id,
+                        'line_open':  lineTransfer.id,
+                        'state_avaliable': False
+                    }
+
+            confirmCasBox = self._writer_cashbox_statement_confirm(confirmCasBox,values)
+
+        return True
+
+    '''
+        get cashbox.statement.confirm
+    '''
+    def _get_cashbox_statement_confirm(self, statement):
+        return self.env['cashbox.statement.confirm'].search([
+                                                                ('statement_id.type_statement.id', '=', statement.type_statement.id),
+                                                                ('user_statement', '=', statement.user_id.id),
+                                                                ('journal_id', '=', statement.journal_id.id),
+                                                                ('state_avaliable', '=', True),
+                                                                # ('amount_next_open', '>', 0.0),
+                                                                ('statement_id.id', '!=', statement.id)])
+
+    '''
+        writer casbox statement confirm
+    '''
+    def _writer_cashbox_statement_confirm(self, casbox, values):
+        return casbox.write(values)
+
+    '''
+        method Open CashBox
+    '''
+    @api.multi
+    def button_open(self):
+        self.account_bank_statement_open(self.id)
+        return super(AccountBankStatementUtility, self).button_open()
+
+
+    '''
+          _   _       _ _       _      ____  _        _                            _
+         | | | |_ __ | (_)_ __ | | __ / ___|| |_ __ _| |_ ___ _ __ ___   ___ _ __ | |_
+         | | | | '_ \| | | '_ \| |/ / \___ \| __/ _` | __/ _ \ '_ ` _ \ / _ \ '_ \| __|
+         | |_| | | | | | | | | |   <   ___) | || (_| | ||  __/ | | | | |  __/ | | | |_
+          \___/|_| |_|_|_|_| |_|_|\_\ |____/ \__\__,_|\__\___|_| |_| |_|\___|_| |_|\__|
+    '''
+    '''
+        Get Statement
+    '''
+    @api.model
+    def eiru_get_bank_statement_unlink(self, id):
+        return [{
+            'id': statement.id,
+            'name': statement.name,
+            'state': statement.state,
+            'currencystatement': {
+                'id': statement.currency.id,
+                'symbol': statement.currency.symbol,
+                'rate': statement.currency.rate,
+                'thousandsSeparator': statement.currency.thousands_separator,
+                'decimalSeparator': statement.currency.decimal_separator,
+                'decimalPlaces': statement.currency.decimal_places,
+                'position': statement.currency.position,
+            },
+            'lineStatement': [{
+                'id': line.id,
+                'name': line.name,
+                'ref': line.ref,
+                'amount': line.amount,
+                'date': line.date,
+                'casBoxTransfer': [{
+                    'id': transfer.id,
+                    'name': transfer.name,
+                    'amount': transfer.amount,
+                    'ref': transfer.ref,
+                    'date': transfer.date,
+                    'inputStatement': transfer.input_statement.id,
+                    'outputStatement': transfer.output_statement.id,
+                    'inputStatementState': transfer.input_statement.state,
+                    'outputStatementState': transfer.output_statement.state
+                }for transfer in self.env['cash.box.transfer'].search(['|',('input_line.id', '=', line.id), ('output_line.id', '=', line.id)])],
+                'casBoxIn': [{
+                    'id': boxIn.id,
+                    'name': boxIn.name,
+                    'amount': boxIn.amount,
+                    'ref': boxIn.ref,
+                    'date': boxIn.date,
+                    'active': boxIn.active
+                }for boxIn in self.env['cash.box.in'].search([('line_id.id', '=', line.id)])],
+                'casBoxOut': [{
+                    'id': boxOut.id,
+                    'name': boxOut.name,
+                    'amount': boxOut.amount,
+                    'ref': boxOut.ref,
+                    'date': boxOut.date,
+                    'active': boxOut.active
+                }for boxOut in self.env['cash.box.out'].search([('line_id.id', '=', line.id)])]
+            }for line in statement.line_ids]
+        }for statement in self.env['account.bank.statement'].browse(id)]
+
+    '''
+        Unlink Line Statement
+    '''
+    def _eiru_unlink_statement_line(self, line):
+        '''
+            Eliminar las lineas de la caja.
+            <-> Actualizar la linea.
+            <-> Cancelar la linea.
+            <-> Eliminar la linea.
+            <-> Retur True
+        '''
+        ### Update Line
+        writeLine = self._write_statement_line_transfer(line)
+        ### Cancelar Line
+        lineCancel = line.cancel()
+        ### Unlink Line
+        lineUnlink = line.unlink()
+
+        return True
+
+    '''
+        Update CashBox
+    '''
+    def _eiru_write_cashbox(self, cashbox, values):
+        return cashbox.write(values)
+
+    '''
+        Unlink Statement
+    '''
+    @api.model
+    def eiru_unlink_statement(self, id):
+        statement = self._get_statement_transfer(id)
+        if (not statement):
+            return {
+                'state': False,
+                'message': 'Error en obtener el registro de caja.'
+            }
+
+        ## User
+        user = self.env.user
+        ## date
+        date_server = self.get_server_datetime()
+        ### FIlter line ids
+        statementLines= map(lambda x: x.id, statement.line_ids)
+        # Get casbox Transfer
+        cashBoxTransfer = self.env['cash.box.transfer'].search(['|',('input_statement.id', '=', statement.id),('output_statement.id', '=', statement.id)])
+        # Get cashBox Input
+        cashBoxIn = self.env['cash.box.in'].search([('statement_id.id', '=', statement.id)])
+        # Get cashBox Output
+        cashBoxOut = self.env['cash.box.out'].search([('statement_id.id', '=', statement.id)])
+        # confirm
+        cashBoxConfirm = self.env['cashbox.statement.confirm'].search([('statement_id.id', '=', statement.id)])
+        cashBoxConfirmOpen = self.env['cashbox.statement.confirm'].search([('statement_open.id', '=', statement.id)])
+
+
+        ### Transfer
+        stateTransfer = 'open'
+        ref = ''
+        for transfer in cashBoxTransfer:
+            if (transfer.input_statement):
+                if (transfer.input_statement.state == 'confirm'):
+                    stateTransfer = transfer.input_statement.state
+                    ref += str(' / ')+ transfer.output_statement.name if (ref) else transfer.output_statement.name
+
+            if (transfer.output_statement):
+                if (transfer.output_statement.state == 'confirm'):
+                    stateTransfer = transfer.output_statement.state
+                    ref += str(' / ')+ transfer.output_statement.name if (ref) else transfer.output_statement.name
+
+        if (stateTransfer == 'confirm'):
+            return {
+                'state': False,
+                'message': 'Existe caja relacionada que ya están cerrada Ref('+str(ref)+')'
+            }
+
+
+        message_deleted = 'La caja  '+str(statement.name)+', Fue eliminada por '+str(user.name)+' en '+str(date_server)
+
+        messageDeletedCashBoxConfirm = {
+            'active': False,
+            'state_avaliable': False,
+            'message_deleted': message_deleted
+        }
+
+        messageDeletedCashBoxConfirmOpen = {
+            'active': True,
+            'state_avaliable': True,
+            'message_deleted': message_deleted
+        }
+
+        messageDeletedCashBox = {
+            'active': False,
+            'message_deleted': message_deleted
+        }
+
+        for transfer in cashBoxTransfer:
+            lineStatement = transfer.input_line.id in statementLines and transfer.output_line.id or transfer.input_line.id
+
+            bankLine = self.env['account.bank.statement.line'].browse(lineStatement)
+            if (not bankLine):
+                return {
+                    'state': False,
+                    'message': 'Error, No fue posible localizar una de las lineas de la transferencia.'
+                }
+            ### Verificar el estado de la caja
+            if (bankLine.statement_id.state == 'confirm'):
+                return {
+                    'state': False,
+                    'message': 'Error, Una de  las caja ya esta cerrada.'
+                }
+            ### Unlink Line Statement
+            lineUnlink = self._eiru_unlink_statement_line(bankLine)
+
+            accountCasboxTransfer = self.env['cash.box.transfer'].browse(transfer.id)
+            if (not accountCasboxTransfer):
+                return {
+                    'state': False,
+                    'message': 'Error, No fue posible localizar la transferencia.'
+                }
+
+            ### Update CashBox transfer
+            boxTransfer = self._eiru_write_cashbox(accountCasboxTransfer,messageDeletedCashBox)
+
+        if (cashBoxIn):
+            boxIn = self._eiru_write_cashbox(cashBoxIn,messageDeletedCashBox)
+
+        if (cashBoxOut):
+            boxOut = self._eiru_write_cashbox(cashBoxOut,messageDeletedCashBox)
+
+        if (cashBoxConfirm):
+            confirm = self._eiru_write_cashbox(cashBoxConfirm,messageDeletedCashBoxConfirm)
+
+        if (cashBoxConfirmOpen):
+            confirmOpen = self._eiru_write_cashbox(cashBoxConfirmOpen,messageDeletedCashBoxConfirmOpen)
+
+        ### Cancel statement
+        cancelStatement = self.eiru_button_cancel(statement)
+
+        ### Eliminar las lineas
+        for line in statement.line_ids:
+            writeLine = self._write_statement_line_transfer(line)
+            lineUnlink = line.unlink()
+
+        ## Unlink Statement
+        unlinkStatement = statement.unlink()
+
+        return {
+            'state': True,
+            'message': 'Operacion exitosa'
+        }

+ 34 - 0
models/cash_box_transfer.py

@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+from openerp import models, fields, tools, api
+import openerp.addons.decimal_precision as dp
+from openerp.osv import osv
+from openerp.tools.translate import _
+
+class cash_box_transfer(models.Model):
+    _name = "cash.box.transfer"
+
+    name = fields.Char('name', required=True)
+    amount = fields.Float('Amount', digits_compute=dp.get_precision('Account'), required=True)
+    ref = fields.Char('Ref')
+    date = fields.Date()
+    message_deleted = fields.Text('Message Deleted')
+    active = fields.Boolean('Active', default=True)
+    ##### statement line
+    input_line = fields.Many2one('account.bank.statement.line', 'Bank statement line Input')
+    output_line = fields.Many2one('account.bank.statement.line', 'Bank statement line Output')
+    ##### statement
+    input_statement = fields.Many2one('account.bank.statement', 'Bank statement input')
+    output_statement = fields.Many2one('account.bank.statement', 'Bank statement Output')
+
+
+class account_bank_statement_line_deleted(models.Model):
+    _inherit = 'account.bank.statement.line'
+
+    is_deleted = fields.Boolean('is deleted', default=False)
+
+    @api.multi
+    def unlink(self):
+        if (self.is_deleted):
+            raise osv.except_osv(('Atencion!'), ('No puedes eliminar el ítem de la caja.'))
+        return super(account_bank_statement_line_deleted, self).unlink()
+    

+ 301 - 0
models/cashbox_statement_cancel.py

@@ -0,0 +1,301 @@
+# -*- coding: utf-8 -*-
+from openerp import models, fields, tools, api
+from datetime import datetime
+from pytz import timezone
+import openerp.addons.decimal_precision as dp
+
+DATE_FORMAT = '%Y-%m-%d'
+
+class eiru_account_statement_cancel(models.Model):
+    _inherit = 'account.bank.statement'
+
+    @api.model
+    def eiru_get_bank_statement_cancel(self, id):
+        return [{
+            'id': statement.id,
+            'name': statement.name,
+            'state': statement.state,
+            'date': statement.date,
+            'currencystatement': {
+                'id': statement.currency.id,
+                'symbol': statement.currency.symbol,
+                'rate': statement.currency.rate,
+                'thousandsSeparator': statement.currency.thousands_separator,
+                'decimalSeparator': statement.currency.decimal_separator,
+                'decimalPlaces': statement.currency.decimal_places,
+                'position': statement.currency.position,
+            },
+            'user': {
+                'id': statement.user_id.id,
+                'name': statement.user_id.name
+            },
+            'statementTransfer': [{
+                'id': transfer.id,
+                'name': transfer.name,
+                'amount': transfer.amount,
+                'ref': transfer.ref,
+                'date': transfer.date,
+                'outputStatement':{
+                    'id': transfer.output_statement.id,
+                    'name': transfer.output_statement.name,
+                    'state': transfer.output_statement.state,
+                    'statementUser': "%s/%s" % ((transfer.output_statement.name), (transfer.output_statement.user_id.name))
+                },
+                'inputStatement':{
+                    'id': transfer.input_statement.id,
+                    'name': transfer.input_statement.name,
+                    'state': transfer.input_statement.state,
+                    'statementUser': "%s/%s" % ((transfer.input_statement.name), (transfer.input_statement.user_id.name))
+                },
+                'outputLineId': transfer.output_line.id,
+                'inputLineId': transfer.input_line.id,
+                'type': 'in' if (transfer.input_statement.id == statement.id) else 'out'
+            } for transfer in self.env['cash.box.transfer'].search(['|', ('output_statement.id','=',statement.id), ('input_statement.id','=',statement.id)])],
+            'statementConfirm': [{
+                'id': casBox.id,
+                'name': casBox.name,
+                'amountStatement': casBox.amount_statement,
+                'amountReal': casBox.amount_real,
+                'amountDifference': casBox.amount_difference,
+                'amountNextOpen': casBox.amount_next_open,
+                'type': 'open' if (casBox.statement_open.id == statement.id) else 'confirm',
+                'statementConfirm':{
+                    'id': casBox.statement_id.id if (casBox.statement_id) else '',
+                    'name': casBox.statement_id.name if (casBox.statement_id) else '',
+                    'state': casBox.statement_id.state if (casBox.statement_id) else '',
+                    'statementUser': "%s/%s" % ((casBox.statement_id.name), (casBox.statement_id.user_id.name)) if (casBox.statement_id) else ''
+                },
+                'statementOpen':{
+                    'id': casBox.statement_open.id if (casBox.statement_open) else '',
+                    'name': casBox.statement_open.name if (casBox.statement_open) else '',
+                    'state': casBox.statement_open.state if (casBox.statement_open) else '',
+                    'statementUser': "%s/%s" % ((casBox.statement_open.name), (casBox.statement_open.user_id.name)) if (casBox.statement_open) else ''
+                },
+                'lineDifference': [{
+                    'id':  lineDifference.id,
+                    'date': lineDifference.date,
+                    'name': lineDifference.name ,
+                    'amount': lineDifference.amount,
+                    'state': lineDifference.statement_id.state,
+                    'type': 'balance'
+                } for lineDifference in self.env['account.bank.statement.line'].browse(casBox.line_difference.id)],
+                'lineNextOpen': [{
+                    'id': lineNextOpen.id,
+                    'date': lineNextOpen.date,
+                    'name': lineNextOpen.name ,
+                    'amount': lineNextOpen.amount,
+                    'state': casBox.statement_open.state if (casBox.statement_open) else '',
+                    'type': 'reserve'
+                } for lineNextOpen in self.env['account.bank.statement.line'].browse(casBox.line_next_open.id)]
+            } for casBox in self.env['cashbox.statement.confirm'].search([('statement_id.id','=',statement.id)])],
+        } for statement in self.env['account.bank.statement'].search([('id','=',id)])]
+
+
+    '''
+          ____ _____  _  _____ _____ __  __ _____ _   _ _____    ____    _    _   _  ____ _____ _
+         / ___|_   _|/ \|_   _| ____|  \/  | ____| \ | |_   _|  / ___|  / \  | \ | |/ ___| ____| |
+         \___ \ | | / _ \ | | |  _| | |\/| |  _| |  \| | | |   | |     / _ \ |  \| | |   |  _| | |
+          ___) || |/ ___ \| | | |___| |  | | |___| |\  | | |   | |___ / ___ \| |\  | |___| |___| |___
+         |____/ |_/_/   \_\_| |_____|_|  |_|_____|_| \_| |_|    \____/_/   \_\_| \_|\____|_____|_____|
+    '''
+    '''
+        Get Statement
+    '''
+    def _eiru_get_account_bank_statement(self, id):
+        return self.env['account.bank.statement'].browse(id)
+
+    '''
+        Get Statement Line
+    '''
+    def _eiru_get_account_bank_statement_line(self, id):
+        return self.env['account.bank.statement.line'].browse(id)
+
+    '''
+        Get CashBox statement Confirm
+    '''
+    def _eiru_account_get_cashbox_confirm(self, statementId):
+        return self.env['cashbox.statement.confirm'].search([('statement_id', '=', statementId)])
+
+    '''
+        statement Cancel
+    '''
+    @api.model
+    def eiru_statement_cancel(self, values):
+        ### date server
+        dateServer = self.get_server_datetime()
+        ###  Statement
+        statement = self._eiru_get_account_bank_statement(values['statementId'])
+        if (not statement):
+            return {
+                'state': False,
+                'messege': "Error en obtener el registro de caja ref(account.bank.statement)."
+            }
+
+        ### user
+        users = self.env.user
+        if (not users):
+            return {
+                'state': False,
+                'messege':"Error en obtener el usuario. ref(res.users) "
+            }
+
+        # Creatre Line cancel
+        line_ids = []
+        for line in statement.line_ids:
+            line_ids.append([0, False, {
+                'statement_line': line.id,
+                'date': line.date,
+                'name': line.name,
+                'ref': line.ref,
+                'partner_id': line.partner_id.id,
+                'amount': line.amount,
+                'currency_id': line.currency_id.id
+            }])
+
+        # create cancel
+        cancel = {
+            'name': "Cancelación de caja "+str(statement.name),
+            'ref': values['messege'],
+            'date': dateServer,
+            'message': values['messege'],
+            'statement_id': statement.id,
+            'journal_id': statement.journal_id.id,
+            'user_statement': statement.user_id.id,
+            'user_cancel': users.id,
+            'line_ids': line_ids
+        }
+        statementCancel = self.env['cashbox.statement.cancel'].create(cancel)
+        if (not statementCancel):
+            return {
+                'state': False,
+                'messege': 'Error en el registro de cancelación de caja. ref(cashbox.statement.cancel /cashbox.statement.cancel.line).'
+            }
+
+        '''
+            Confirm
+        '''
+        statementOpen = []
+        stateOpen   = []
+        lineDifference = []
+        lineNextOpen = []
+        lineOpen = []
+
+        cashBoxConfirm = self._eiru_account_get_cashbox_confirm(statement.id)
+        if (cashBoxConfirm):
+            statementOpen = self._eiru_get_account_bank_statement(cashBoxConfirm.statement_open.id)
+            if (statementOpen and statementOpen.state =='confirm'):
+                return {
+                    'state': False,
+                    'messege': "No se puede reabrir esta caja porque  tiene relación a una caja que ya esta cerrada."
+                }
+
+            stateOpen = statementOpen.state
+            # Line Diferencia
+            lineDifference = self._eiru_get_account_bank_statement_line(cashBoxConfirm.line_difference.id)
+            # line Next Open
+            lineNextOpen = self._eiru_get_account_bank_statement_line(cashBoxConfirm.line_next_open.id)
+            # Line Open
+            lineOpen = self._eiru_get_account_bank_statement_line(cashBoxConfirm.line_open.id)
+
+        '''
+            Cancel statement
+        '''
+        cancel = self.eiru_button_cancel(statement)
+        if (not cancel):
+            return {
+                'state': False,
+                'messege': "Error al cancelar la caja"
+            }
+
+        if (lineDifference):
+            self._write_statement_line_transfer(lineDifference)
+            self._unlink_statement_line_transfer(lineDifference)
+
+        if (lineNextOpen):
+            self._write_statement_line_transfer(lineNextOpen)
+            self._unlink_statement_line_transfer(lineNextOpen)
+
+
+        if (lineOpen):
+            statementOpenCancel = self.eiru_button_cancel(statementOpen)
+            if (not statementOpenCancel):
+                return {
+                    'state': False,
+                    'messege': "Error al cancelar la caja"
+                }
+
+            self._write_statement_line_transfer(lineOpen)
+            self._unlink_statement_line_transfer(lineOpen)
+
+            if (stateOpen == 'open'):
+                statementOpen.button_open()
+
+        '''
+            Update Confirm
+        '''
+        confirm = {
+            'state_avaliable': True,
+            'statement_open': '',
+            'amount_real': 0.0,
+            'amount_difference': 0.0,
+            'amount_next_open': 0.0
+
+        }
+        confirmCasBox = self._writer_cashbox_statement_confirm(cashBoxConfirm,confirm)
+        if (not confirmCasBox):
+            return {
+                'state': False,
+                'messege': 'Error en actualizar cierre de caja ref(cashbox.statement.confirm)'
+            }
+
+        open = statement.button_open()
+        if (not open):
+            return {
+                'state': False,
+                'messege': 'Error en reabrir la caja  ref('+statement+')'
+            }
+
+        return {
+            'state': True,
+            'messege': 'Caja reabierta'
+        }
+
+    '''
+        Cancelar Caja
+    '''
+    def eiru_button_cancel(self,statement):
+        return super(eiru_account_statement_cancel, statement.with_context(cancel_from_statement=True)).button_cancel()
+
+
+'''
+    Histórico de Cajas Canceladas.
+'''
+class cashbox_statement_cancel(models.Model):
+    _name = "cashbox.statement.cancel"
+
+    ### fields Basic
+    name = fields.Char('name')
+    ref = fields.Char('Ref')
+    date = fields.Date()
+    message = fields.Text('Message Cancel')
+    active = fields.Boolean('Active', default=True)
+    message_deleted = fields.Text('Message Deleted')
+    ### statement, journal, users
+    statement_id = fields.Many2one('account.bank.statement', 'Bank Statement Cancel')
+    journal_id = fields.Many2one('account.journal', 'Journal')
+    user_statement = fields.Many2one('res.users', 'User Statement')
+    user_cancel = fields.Many2one('res.users', 'Usaer Cancel')
+    line_ids    = fields.One2many('cashbox.statement.cancel.line', 'cancel_id', 'Cancel Lines')
+
+class cashbox_statement_cancel_line(models.Model):
+    _name = "cashbox.statement.cancel.line"
+
+    ### cashbox.statement.cancel
+    cancel_id = fields.Many2one('cashbox.statement.cancel', 'Statement Cancel')
+    statement_line = fields.Many2one('account.bank.statement.line', 'statement Line')
+    date = fields.Date()
+    name = fields.Char('name')
+    ref = fields.Char('Ref')
+    partner_id = fields.Many2one('res.partner', 'partner')
+    amount = fields.Float('Amount Line', digits_compute=dp.get_precision('Account'))
+    currency_id = fields.Many2one('res.currency', string="Currency", help="Moneda de la operación")

+ 313 - 0
models/cashbox_statement_confirm.py

@@ -0,0 +1,313 @@
+# -*- coding: utf-8 -*-
+from openerp import models, fields, tools, api
+import openerp.addons.decimal_precision as dp
+
+class cashbox_statement_confirm(models.Model):
+    _name = "cashbox.statement.confirm"
+    # _inherit = "cashbox.statement.confirm"
+
+    name = fields.Char('name', required=True)
+    ref = fields.Char('Ref')
+    date = fields.Date()
+    active = fields.Boolean('Active', default=True)
+    message_confirm = fields.Text('Message Confirm')
+    message_deleted = fields.Text('Message Deleted')
+    ### Statement confirm - open
+    statement_id = fields.Many2one('account.bank.statement', 'Bank Statement Confirm')
+    statement_open = fields.Many2one('account.bank.statement', 'Bank Statement Open')
+    ## User statement - User Confirm
+    user_statement = fields.Many2one('res.users', 'Res user')
+    user_confirm = fields.Many2one('res.users', 'Res user')
+    ## Journal
+    journal_id = fields.Many2one('account.journal', 'Journal')
+    ## Line
+    line_difference = fields.Many2one('account.bank.statement.line', 'Bank statement line difference')
+    line_next_open = fields.Many2one('account.bank.statement.line', 'Bank statement line next open statement')
+    line_open = fields.Many2one('account.bank.statement.line', 'Bank statement line open')
+    ### Amount
+    amount_statement = fields.Float('Amount Statement', digits_compute=dp.get_precision('Account'), required=True)
+    amount_real = fields.Float('Amount Real', digits_compute=dp.get_precision('Account'), required=True)
+    amount_difference = fields.Float('Amount Difference', digits_compute=dp.get_precision('Account'), required=True)
+    amount_next_open =  fields.Float('Amount Next open statement', digits_compute=dp.get_precision('Account'), required=True)
+    ## estado del regsitro
+    state_avaliable = fields.Boolean('Avaliable', default=True, help="True : disponible, False : Utilizado")
+    # casbox_transfer_id =fields.Many2one('cash.box.transfer', 'cashBox transfer')
+    cashbox_transfer_ids =fields.One2many('cash.box.transfer', 'cashbox_confirm_id', string="transfer id")
+
+
+
+    '''
+        @fields statement_id        = Id de la caja que se esta cerrando.
+        @fields user_statement      = Id del propietario de la caja.
+        @fields journal_id          = Id del diario de la caja.
+        @fields line_difference     = Id de la linea de la caja donde se registro la diferencia del cierre.
+        @fields line_next_open      = Id de la linea donde se registro el monto de próxima apertura de caja.
+        @fields amount_statement    = Monto en la caja del sistema.
+        @fields amount_real         = Monto real del cierre de la caja.
+        @fields amount_difference   = Monto de la diferencia del cierre.
+        @fields amount_next_open    = Monto de la próxima apertura de caja.
+        @fields user_confirm        = Usuario que cerro la caja
+        @fields statement_open      = Id de la caja que utilize el saldo disponible para proxima apertura
+        @fields state_avaliable     = 'True': disponible, 'False': Utilizado
+        @fields cashbox_transfer_ids= id transferencia
+    '''
+
+    '''
+          ____       _       _      ____             __ _
+         |  _ \ _ __(_)_ __ | |_   / ___|___  _ __  / _(_)_ __ _ __ ___
+         | |_) | '__| | '_ \| __| | |   / _ \| '_ \| |_| | '__| '_ ` _ \
+         |  __/| |  | | | | | |_  | |__| (_) | | | |  _| | |  | | | | | |
+         |_|   |_|  |_|_| |_|\__|  \____\___/|_| |_|_| |_|_|  |_| |_| |_| v 1.0
+    '''
+    @api.model
+    def get_cashbox_statement_confirm(self, statementId):
+        return[{
+            'id': casBox.id,
+            'name': casBox.name,
+            'statement': {
+                'id': casBox.statement_id.id,
+                'name': casBox.statement_id.name,
+                'dateOpen': casBox.statement_id.date,
+                'dateConfirm': casBox.statement_id.closing_date,
+                'typeStatementID': casBox.statement_id.type_statement.id,
+                'typeStatementName': casBox.statement_id.type_statement.name,
+                'userId': casBox.statement_id.user_id.id,
+                'userName': casBox.statement_id.user_id.name,
+                'currencystatement': {
+                    'id': casBox.statement_id.currency.id,
+                    'name': casBox.statement_id.currency.name,
+                    'symbol': casBox.statement_id.currency.symbol,
+                    'rate': casBox.statement_id.currency.rate,
+                    'thousandsSeparator': casBox.statement_id.currency.thousands_separator,
+                    'decimalSeparator': casBox.statement_id.currency.decimal_separator,
+                    'decimalPlaces': casBox.statement_id.currency.decimal_places,
+                    'position': casBox.statement_id.currency.position,
+                },
+            },
+            'userStatementName': casBox.user_statement.name,
+            'userStatementLogin': casBox.user_statement.login,
+            'userConfirmName': casBox.user_confirm.name,
+            'userConfirmLogin': casBox.user_confirm.login,
+            'amountStatement': casBox.amount_statement,
+            'amountReal': casBox.amount_real,
+            'amountDifference': casBox.amount_difference,
+            'amountNextOpen': casBox.amount_next_open,
+            'transferCasBox': [{
+                'id': confirm.id,
+                'name': confirm.name,
+                'amount': confirm.amount
+            } for confirm in self.env['cash.box.transfer'].search([('cashbox_confirm_id.id', '=', casBox.id)])],
+        } for casBox in self.env['cashbox.statement.confirm'].search([('statement_id.id', '=', statementId), ('active', '=', True)])]
+
+
+'''
+    Transfer
+'''
+class cash_box_transfer(models.Model):
+    _inherit = "cash.box.transfer"
+
+    cashbox_confirm_id = fields.Many2one('cashbox.statement.confirm', string='cashBox Confirm', ondelete='cascade', index=True)
+
+'''
+    Output
+'''
+class cash_box_output(models.Model):
+    _inherit = "cash.box.out"
+
+    cashbox_confirm_id = fields.Many2one('cashbox.statement.confirm', string='cashBox Confirm', ondelete='cascade', index=True)
+
+'''
+    cashbox.statement.confirm
+'''
+class cashboxStatementConfirm(models.Model):
+    _inherit = "cashbox.statement.confirm"
+
+    cashbox_output_ids =fields.One2many('cash.box.out', 'cashbox_confirm_id', string="transfer id")
+
+
+
+'''    ____          _     _                  ____             __ _
+      / ___|__ _ ___| |__ | |__   _____  __  / ___|___  _ __  / _(_)_ __ _ __ ___
+     | |   / _` / __| '_ \| '_ \ / _ \ \/ / | |   / _ \| '_ \| |_| | '__| '_ ` _ \
+     | |__| (_| \__ \ | | | |_) | (_) >  <  | |__| (_) | | | |  _| | |  | | | | | |
+      \____\__,_|___/_| |_|_.__/ \___/_/\_\  \____\___/|_| |_|_| |_|_|  |_| |_| |_| v 2.0
+'''
+class AccountBankStatementConfirm(models.Model):
+    _inherit = 'account.bank.statement'
+
+    '''
+        GET CASHBOX GENERAL.
+    '''
+    @api.model
+    def get_account_bank_statement_general(self, id):
+        bankStatement = self._get_statement_transfer(id)
+        return [{
+            'id': statement.id,
+            'journalId': statement.journal_id.id,
+            'date': statement.date,
+            'typeStatementId': statement.type_statement.id,
+            'typeStatementName': statement.type_statement.name,
+            'userId': statement.user_id.id,
+            'userName': statement.user_id.name,
+            'name': statement.name,
+            'state': statement.state,
+            'statementname': statement.name+" / "+statement.user_id.name
+        } for statement in self.env['account.bank.statement'].search([('state', '=', 'open'), ('id', '!=', bankStatement.id), ('type_statement.code', '=', 'GENERAL'), ('journal_id.id', '=', bankStatement.journal_id.id)])]
+
+
+    '''
+        Confirm Statement
+    '''
+    @api.model
+    def account_bank_statement_confirm(self, values):
+        ## Date Server
+        date_server = self.get_server_datetime()
+        ## User
+        user = self.env.user
+        ## Statement
+        bankStatement = self._get_statement_transfer(values['statementId'])
+        if (not bankStatement):
+            return {
+                'state': False,
+                'message': "Error en obtener la caja base."
+            }
+
+        casboxConfirm = self._get_casbox_confirm(bankStatement.id)
+
+        amountStatement = 0.0
+        for line in bankStatement.line_ids:
+            amountStatement += line.amount
+        if (bankStatement.balance_start > 0):
+            amountStatement += bankStatement.balance_start
+
+        amountReal = 0  if (values['amountReal'] < 0) else values['amountReal']
+
+        ## Diference
+        lineBalance = []
+        if (amountStatement != amountReal):
+            name = "Ajuste de cierre de caja "
+            lineBalance = self._create_statement_line_confirm(bankStatement, name, (amountReal - amountStatement),values['refBalance'])
+
+        ## TRANSFERENCIA
+        cash_box_transfer = []
+        if (values['transfer']):
+            statementTransfer = self._get_statement_transfer(values['statementTransfer'])
+            if (not statementTransfer):
+                return {
+                    'state': False,
+                    'message': "Error al obtener la caja general."
+                }
+
+            name = "TRANSFERENCIA/"+str(statementTransfer.name)
+            lineTransfer = self._create_statement_line_transfer(bankStatement, name, (-values['amountTransfer']), values['refTransfer'])
+            if (not lineTransfer):
+                return {
+                    'state': False,
+                    'message': "Error al registrar la transferencia."
+                }
+
+            name = "TRANSFERENCIA/"+str(bankStatement.name)
+            lineGeneralTransfer = self._create_statement_line_transfer(statementTransfer, name, (values['amountTransfer']), values['refTransfer'])
+            if (not lineGeneralTransfer):
+                return {
+                    'state': False,
+                    'message': "Error al registrar la transferencia."
+                }
+
+            cash_box_transfer = self._create_cash_box_transfer(values['refTransfer'], abs(values['amountTransfer']), lineGeneralTransfer, lineTransfer)
+            if (not cash_box_transfer):
+                return {
+                    'state': False,
+                    'message': "Error al registrar la transferencia."
+                }
+
+        amountNextOpen = 0.0
+        for line in bankStatement.line_ids:
+            amountNextOpen += line.amount
+        if (bankStatement.balance_start > 0):
+            amountNextOpen += bankStatement.balance_start
+
+        lineNextOpen = []
+        if (amountNextOpen > 0):
+            name ="Saldo para próxima apertura de caja."
+            ref = "Cierre"
+            lineNextOpen = self._create_statement_line_transfer(bankStatement, name, -amountNextOpen, ref)
+
+        ## chasbox Confirm
+        cashboxConfirm = {
+            'name': "CIERRE DE CAJA /"+str(bankStatement.name),
+            'date': date_server,
+            'ref': values['refBalance'],
+            'statement_id': bankStatement.id,
+            'user_statement': bankStatement.user_id.id,
+            'user_confirm': user.id,
+            'journal_id' : bankStatement.journal_id.id,
+            'amount_statement': amountStatement,
+            'amount_real': values['amountReal'],
+            'line_difference': lineBalance.id if (lineBalance) else '',
+            'amount_difference': lineBalance.amount if (lineBalance) else 0.0,
+            'line_next_open': lineNextOpen.id if(lineNextOpen) else '',
+            'amount_next_open': abs(lineNextOpen.amount) if(lineNextOpen) else 0.0,
+            'state_avaliable': True if(lineNextOpen and abs(lineNextOpen.amount) > 0) else False,
+        }
+
+        statementConfirm = self._create_cashbox_statement_confirm(cashboxConfirm, bankStatement)
+        if (not statementConfirm):
+            return {
+                'state': False,
+                'message': "Error en el cierre de caja ."
+            }
+
+        if (cash_box_transfer):
+            cash_box_transfer.write({'cashbox_confirm_id': statementConfirm.id })
+
+
+        confirm = bankStatement.button_confirm_cash()
+        if (not confirm):
+            return {
+                'state': False,
+                'message': "Error en el cierre de caja ."
+            }
+
+        return {
+            'state': True,
+                'message': "Operación realizada con suceso."
+        }
+
+
+    '''
+        Get Cashbox statement Confirm
+    '''
+    def _get_casbox_confirm(self,statementId):
+        return self.env['cashbox.statement.confirm'].search([('statement_id.id', '=', statementId)])
+
+    '''
+        Create Line statement.
+    '''
+    def _create_statement_line_confirm(self, statement, name, amount, ref):
+        statementLine = {
+            'statement_id': statement.id,
+            'name': name,
+            'amount': amount,
+            'ref': ref,
+            'account_id': statement.journal_id.internal_account_id.id,
+            'journal_id': statement.journal_id.id,
+            'is_deleted': True
+        }
+
+        return self.env['account.bank.statement.line'].create(statementLine)
+
+
+    '''
+        Create cashbox Confirm
+    '''
+    def _create_cashbox_statement_confirm(self,values, statement):
+        casbox = self.env['cashbox.statement.confirm'].search([('statement_id.id', '=', statement.id)])
+        if (not casbox):
+            confirm = self.env['cashbox.statement.confirm'].create(values)
+        else:
+            confirm = casbox.write(values)
+            if (confirm):
+                confirm = self.env['cashbox.statement.confirm'].search([('statement_id.id', '=', statement.id)])
+
+        return confirm

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

@@ -0,0 +1,9 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_bank_statement_config,account.bank.statement.config,model_account_bank_statement_config,account.group_account_user,1,1,1,1
+access_bank_statement_type,account.bank.statement.type,model_account_bank_statement_type,account.group_account_user,1,1,1,1
+access_cash_box_transfer,cash.box.transfer,model_cash_box_transfer,account.group_account_user,1,1,1,1
+access_cash_box_in,cash.box.in,model_cash_box_in,account.group_account_user,1,1,1,1
+access_cash_box_out,cash.box.out,model_cash_box_out,account.group_account_user,1,1,1,1
+access_cashbox_statement_confirm,cashbox.statement.confirm,model_cashbox_statement_confirm,account.group_account_user,1,1,1,1
+access_cashbox_statement_cancel,cashbox.statement.cancel,model_cashbox_statement_cancel,account.group_account_user,1,1,1,1
+access_cashbox_statement_cancel_line,cashbox.statement.cancel.line,model_cashbox_statement_cancel_line,account.group_account_user,1,1,1,1

BIN
static/description/icon.png


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

@@ -0,0 +1,596 @@
+@media (min-width: 768px) {
+    .expired-account-modal .modal-lg {
+            width: 900px !important;
+    }
+}
+.import-statement {
+    width: auto;
+    float: left;
+}
+.eiru-statement-utility-open {
+    width: auto;
+    float: left;
+}
+.eiru-statement-utility {
+    width: auto;
+    float: left;
+}
+.eiru-statement-unlink {
+    width: auto;
+    float: left;
+}
+.eiru-statement-utility-cancel {
+    width: auto;
+    float: left;
+}
+.eiru-statement-print{
+    width: auto;
+    float: left;
+}
+.eiru-statement-button {
+    float: left;
+    margin-right: 0px;
+}
+.from-title-h3 {
+    font-size: 9pt !important;
+    margin-top: 0px;
+    margin-bottom: 10px;
+    padding-left: 12px;
+    color: #ccc;
+}
+.from-title-hr {
+    margin-bottom: 15px !important;
+    margin-top: 10px !important;
+    /* border: 0px; */
+}
+.transfer-check {
+    padding-left:  90px;
+}
+.statement-radio-label{
+    font-size: 17px;
+}
+.statement-input-labe {
+    width: 150px;
+    height: 35px;
+    font-size: 17px;
+    padding-top: 5px;
+    padding-left: 5px;
+}
+.statement-input-group {
+    width: calc(100% - 150px);
+    height: 35px;
+    padding-left: 5px;
+    padding-right: 5px;
+    float: right;
+}
+.statement-input-number {
+    width: calc(100% - 30px);
+    height: 35px;
+    float: left;
+    font-size: 14pt;
+    text-align: right;
+}
+.input-all{
+    width: 100%;
+}
+.input-letters{
+    width: 100%;
+    text-align: left;
+}
+.statement-input-symbol {
+    width: 30px;
+    height: 35px;
+    float: right;
+    text-align: center;
+    font-size: 17pt;
+    border: 1px solid #ccc;
+    background: #e3e3e3;
+}
+/*Modal ( Pie de Pagina / Button)*/
+.statement-utility-footer {
+    padding-top: 10px;
+    padding-bottom: 10px;
+}
+.statement-utility-button {
+    font-size: 12pt !important;
+    width: 130px;
+    height: 35px;
+}
+
+
+/*table transferencia */
+.transfer-deleted-table{
+    margin-top: 0px !important;
+}
+.expired-account-modal .table-row-select {
+     background: #d4e2f3  !important;
+}
+.expired-account-modal  .modal-head-wrapper-statement-transfer {
+    width: 100%;
+}
+.expired-account-modal .modal-item-statement-transfer {
+    width: 100%;
+    height: 110px;
+    overflow-y: auto;
+}
+.expired-account-modal .transfer-deleted-table table tbody tr {
+    height: 35px;
+}
+.expired-account-modal .transfer-deleted-table table thead tr {
+    height: 40px !important;
+}
+/*id*/
+.expired-account-modal .transfer-deleted-table table tbody tr td:nth-child(1){
+    display: none;
+}
+.expired-account-modal .transfer-deleted-table table thead tr th:nth-child(1){
+    display: none;
+}
+/* Date */
+.expired-account-modal .transfer-deleted-table table tbody tr td:nth-child(2){
+    width: 110px ;
+    font-size: 12pt;
+    text-align: left;
+    padding-left: 10px;
+    padding-top: 8px;
+}
+.expired-account-modal .transfer-deleted-table table thead tr th:nth-child(2){
+    width: 110px;
+    padding-right: 10px;
+    text-align: left;
+    font-size: 14pt;
+    font-weight: bold;
+}
+/* statement origin */
+.expired-account-modal .transfer-deleted-table table tbody tr td:nth-child(3){
+    width: 284px ;
+    padding-right: 10px;
+    text-align: left;
+    font-size: 12pt;
+    padding-top: 8px;
+}
+.expired-account-modal .transfer-deleted-table table thead tr th:nth-child(3){
+    width: 284px;
+    padding-right: 10px;
+    text-align: left;
+    font-size: 14pt;
+    font-weight: bold;
+}
+/* statement distine */
+.expired-account-modal .transfer-deleted-table table tbody tr td:nth-child(4){
+    width: 284px ;
+    padding-right: 10px;
+    text-align: left;
+    font-size: 12pt;
+    padding-top: 8px;
+}
+.expired-account-modal .transfer-deleted-table table thead tr th:nth-child(4){
+    width: 284px;
+    padding-right: 10px;
+    text-align: left;
+    font-size: 14pt;
+    font-weight: bold;
+}
+/* date-Maturity */
+.expired-account-modal .transfer-deleted-table table tbody tr td:nth-child(5){
+    width: 160px ;
+    padding-right: 10px;
+    text-align: right;
+    font-size: 12pt;
+    padding-top: 8px;
+}
+.expired-account-modal .transfer-deleted-table table thead tr th:nth-child(5){
+    width: 160px;
+    padding-right: 10px;
+    text-align: center;
+    font-size: 14pt;
+    font-weight: bold;
+}
+
+.is_output{
+    display: none;
+}
+.cash-box-radio-group {
+    height: 55px;
+    text-align: center;
+    padding-top: 8px;
+    border-left: 2px solid #ffffff;
+    border-right: 2px solid #ffffff;
+}
+.cash-box-radio-label{
+    font-size: 12pt;
+}
+.boby-cash-input {
+    display: none;
+}
+.boby-cash-output {
+    display: none;
+}
+.is-selectd-cashbox {
+    display: none;
+}
+/*table cashBos input output*/
+.casbox-deleted-table {
+    margin-top: 0px !important;
+}
+.expired-account-modal .table-row-select {
+     background: #d4e2f3  !important;
+}
+.expired-account-modal  .modal-head-wrapper-statement-casbox {
+    width: 100%;
+}
+.expired-account-modal .modal-item-statement-casbox {
+    width: 100%;
+    height: 110px;
+    overflow-y: auto;
+}
+.expired-account-modal .casbox-deleted-table table tbody tr {
+    height: 35px;
+}
+.expired-account-modal .casbox-deleted-table table thead tr {
+    height: 40px !important;
+}
+/*id*/
+.expired-account-modal .casbox-deleted-table table tbody tr td:nth-child(1){
+    display: none;
+}
+.expired-account-modal .casbox-deleted-table table thead tr th:nth-child(1){
+    display: none;
+}
+/* Date */
+.expired-account-modal .casbox-deleted-table table tbody tr td:nth-child(2){
+    width: 150px ;
+    font-size: 12pt;
+    text-align: left;
+    padding-left: 10px;
+    padding-top: 8px;
+}
+.expired-account-modal .casbox-deleted-table table thead tr th:nth-child(2){
+    width: 150px;
+    padding-right: 10px;
+    text-align: left;
+    font-size: 14pt;
+    font-weight: bold;
+}
+/* statement */
+.expired-account-modal .casbox-deleted-table table tbody tr td:nth-child(3){
+    width: 488px ;
+    padding-right: 10px;
+    text-align: left;
+    font-size: 12pt;
+    padding-top: 8px;
+}
+.expired-account-modal .casbox-deleted-table table thead tr th:nth-child(3){
+    width: 488px;
+    padding-right: 10px;
+    text-align: left;
+    font-size: 14pt;
+    font-weight: bold;
+}
+/* Amout */
+.expired-account-modal .casbox-deleted-table table tbody tr td:nth-child(4){
+    width: 200px ;
+    padding-right: 10px;
+    text-align: right;
+    font-size: 12pt;
+    padding-top: 8px;
+}
+.expired-account-modal .casbox-deleted-table table thead tr th:nth-child(4){
+    width: 200px;
+    padding-right: 10px;
+    text-align: center;
+    font-size: 14pt;
+    font-weight: bold;
+}
+.messege-is-cash-input{
+    font-size: 10pt;
+}
+.messege-is-cash-output{
+    font-size: 10pt;
+}
+.warning-message {
+    display: none;
+}
+.message-error {
+    color: red;
+    font-size: 17pt;
+    text-align: center;
+    font-weight: bold;
+}
+/* confirm cashbox*/
+.is-transfer-confirm{
+    display: none;
+}
+.is-not-transfer {
+    display: none;
+    color: red;
+    padding-left: 20px;
+    font-size: 14px;
+}
+.is-not-balance {
+    display: none;
+    color: red;
+    padding-left: 20px;
+    font-size: 14px;
+}
+.from-confirm-hr{
+    margin-bottom: 5px !important;
+    margin-top: 5px !important;
+}
+.confirm-title {
+    font-size: 13pt !important;
+    margin-top: 15px;
+    margin-bottom: 5px;
+    padding-left: 12px;
+    color: #ccc;
+}
+.button-print-group {
+    text-align: center;
+}
+.button-print-confirm {
+    height: 50px;
+    width: 120px;
+    font-size: 20px !important;
+}
+
+/*table Statement Cancel ransferencia */
+.cancel-transfer-table{
+    margin-top: 0px !important;
+    margin-bottom: 0px !important;
+}
+.expired-account-modal .modal-head-wrapper-statement-cancel-transfer {
+    width: 100%;
+}
+.expired-account-modal .modal-item-statement-cancel-transfer {
+    width: 100%;
+    height: 106px;
+    overflow-y: auto;
+}
+.expired-account-modal .cancel-transfer-table table tbody tr {
+    height: 35px;
+}
+.expired-account-modal .cancel-transfer-table table thead tr {
+    height: 40px !important;
+}
+/*id*/
+.expired-account-modal .cancel-transfer-table table tbody tr td:nth-child(1){
+    display: none;
+}
+.expired-account-modal .cancel-transfer-table table thead tr th:nth-child(1){
+    display: none;
+}
+/* Date */
+.expired-account-modal .cancel-transfer-table table tbody tr td:nth-child(2){
+    width: 110px ;
+    font-size: 12pt;
+    text-align: left;
+    padding-left: 10px;
+    padding-top: 8px;
+}
+.expired-account-modal .cancel-transfer-table table thead tr th:nth-child(2){
+    width: 110px;
+    padding-right: 10px;
+    text-align: left;
+    font-size: 14pt;
+    font-weight: bold;
+}
+/* statement  */
+.expired-account-modal .cancel-transfer-table table tbody tr td:nth-child(3){
+    width: 453px ;
+    padding-right: 10px;
+    text-align: left;
+    font-size: 12pt;
+    padding-top: 8px;
+}
+.expired-account-modal .cancel-transfer-table table thead tr th:nth-child(3){
+    width: 453px;
+    padding-right: 10px;
+    text-align: left;
+    font-size: 14pt;
+    font-weight: bold;
+}
+/* amount */
+.expired-account-modal .cancel-transfer-table table tbody tr td:nth-child(4){
+    width: 160px ;
+    padding-right: 20px;
+    text-align: right;
+    font-size: 12pt;
+    padding-top: 8px;
+}
+.expired-account-modal .cancel-transfer-table table thead tr th:nth-child(4){
+    width: 160px;
+    padding-right: 20px;
+    text-align: right;
+    font-size: 14pt;
+    font-weight: bold;
+}
+/* State */
+.expired-account-modal .cancel-transfer-table table tbody tr td:nth-child(5){
+    width: 100px ;
+    text-align: center;
+    font-size: 12pt;
+    padding-top: 8px;
+}
+.expired-account-modal .cancel-transfer-table table thead tr th:nth-child(5){
+    width: 114px;
+    text-align: center;
+    font-size: 14pt;
+    font-weight: bold;
+}
+.cancel-transfer-messege {
+    display: none;
+    margin-top: 5px;
+    margin-left: 20px;
+    /* font-weight: bold; */
+    color: red;
+}
+.cancel-confirm-messege {
+    display: none;
+    margin-top: 5px;
+    margin-left: 20px;
+    /* font-weight: bold; */
+    color: red;
+}
+
+/*table Statement Cancel Confirm */
+.cancel-confirm-table {
+    margin-top: 0px !important;
+    margin-bottom: 0px !important;
+}
+.expired-account-modal .modal-head-wrapper-statement-cancel-confirm {
+    width: 100%;
+}
+.expired-account-modal .modal-item-statement-cancel-confirm {
+    width: 100%;
+    height: 74px;
+    overflow-y: auto;
+}
+.expired-account-modal .cancel-confirm-table table tbody tr {
+    height: 35px;
+}
+.expired-account-modal .cancel-confirm-table table thead tr {
+    height: 40px !important;
+}
+/*id*/
+.expired-account-modal .cancel-confirm-table table tbody tr td:nth-child(1){
+    display: none;
+}
+.expired-account-modal .cancel-confirm-table table thead tr th:nth-child(1){
+    display: none;
+}
+/* Date */
+.expired-account-modal .cancel-confirm-table table tbody tr td:nth-child(2){
+    width: 120px ;
+    font-size: 12pt;
+    text-align: left;
+    padding-left: 10px;
+    padding-top: 8px;
+}
+.expired-account-modal .cancel-confirm-table table thead tr th:nth-child(2){
+    width: 120px;
+    padding-right: 10px;
+    text-align: left;
+    font-size: 14pt;
+    font-weight: bold;
+}
+/* Referencia */
+.expired-account-modal .cancel-confirm-table table tbody tr td:nth-child(3){
+    width: 500px ;
+    padding-right: 10px;
+    text-align: left;
+    font-size: 12pt;
+    padding-top: 8px;
+}
+.expired-account-modal .cancel-confirm-table table thead tr th:nth-child(3){
+    width: 500px;
+    padding-right: 10px;
+    text-align: left;
+    font-size: 14pt;
+    font-weight: bold;
+}
+
+/* amount */
+.expired-account-modal .cancel-confirm-table table tbody tr td:nth-child(4){
+    width: 200px;
+    padding-right: 20px;
+    text-align: right;
+    font-size: 12pt;
+    padding-top: 8px;
+}
+.expired-account-modal .cancel-confirm-table table thead tr th:nth-child(4){
+    width: 217px;
+    padding-right: 20px;
+    text-align: center;
+    font-size: 14pt;
+    font-weight: bold;
+}
+
+
+.line-unlink-messege {
+    display: none;
+    margin-top: 5px;
+    margin-left: 20px;
+    color: red;
+}
+
+.unlink-statement-table {
+    margin-top: 0px !important;
+    margin-bottom: 0px !important;
+}
+.expired-account-modal .modal-head-wrapper-statement-unlink {
+    width: 100%;
+}
+.expired-account-modal .modal-item-statement-unlink {
+    width: 100%;
+    height: 212px;
+    overflow-y: auto;
+}
+.expired-account-modal .unlink-statement-table table tbody tr {
+    height: 35px;
+}
+.expired-account-modal .unlink-statement-table table thead tr {
+    height: 40px !important;
+}
+/*id*/
+.expired-account-modal .unlink-statement-table table tbody tr td:nth-child(1){
+    display: none;
+}
+.expired-account-modal .unlink-statement-table table thead tr th:nth-child(1){
+    display: none;
+}
+/* Date */
+.expired-account-modal .unlink-statement-table table tbody tr td:nth-child(2){
+    width: 120px ;
+    font-size: 12pt;
+    text-align: left;
+    padding-left: 10px;
+    padding-top: 8px;
+}
+.expired-account-modal .unlink-statement-table table thead tr th:nth-child(2){
+    width: 120px;
+    padding-right: 10px;
+    text-align: left;
+    font-size: 14pt;
+    font-weight: bold;
+}
+/* Referencia */
+.expired-account-modal .unlink-statement-table table tbody tr td:nth-child(3){
+    width: 500px ;
+    padding-right: 10px;
+    text-align: left;
+    font-size: 12pt;
+    padding-top: 8px;
+}
+.expired-account-modal .unlink-statement-table table thead tr th:nth-child(3){
+    width: 500px;
+    padding-right: 10px;
+    text-align: left;
+    font-size: 14pt;
+    font-weight: bold;
+}
+/* amount */
+.expired-account-modal .unlink-statement-table table tbody tr td:nth-child(4){
+    width: 200px;
+    padding-right: 20px;
+    text-align: right;
+    font-size: 12pt;
+    padding-top: 8px;
+}
+.expired-account-modal .unlink-statement-table table thead tr th:nth-child(4){
+    width: 217px;
+    padding-right: 20px;
+    text-align: center;
+    font-size: 14pt;
+    font-weight: bold;
+}
+.widget-content.widget-loading-unlink-statement {
+    position: absolute;
+    width: 100%;
+    height: 100%;
+    color : #000;
+    display: none;
+    z-index: 1100;
+    background: #8080806b;
+    align-items: center;
+    justify-content: center;
+}

+ 335 - 0
static/src/js/eiru_statement_cancel.js

@@ -0,0 +1,335 @@
+(function() {
+    openerp.widgetInstanceStatementCancel = null;
+    openerp.parentInstanceStatementCancel = {};
+    var QWeb = openerp.web.qweb;
+    var instanceWeb = openerp.web;
+    // Abrir caja
+    openerp.EiruStatementCancel = openerp.Widget.extend({
+        template: 'EiruStatementUtility.Cancel',
+        id: undefined,
+        buttons: undefined,
+        bankStatement: [],
+        resUser: [],
+        statementConfig: [],
+        /* init */
+        init: function(parent) {
+            this._super(parent);
+            this.buttons = parent.$buttons;
+        },
+        /* start */
+        start: function () {
+            var self = this
+            this.$el.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');
+            });
+        },
+        /* Actualizar Id de la visat actual  */
+        updateId: function(id) {
+            var self = this;
+            self.id = id;
+        },
+        /* Reload Page*/
+        reloadPage: function() {
+             openerp.parentInstanceStatementCancel.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.fetchBankStatement(self.id).then(function(bankStatement) {
+                return bankStatement;
+            }).then(function(bankStatement) {
+                self.bankStatement = bankStatement;
+                return self.fetchGetUserLogin();
+            }).then(function(resUser){
+                self.resUser = resUser;
+                return self.fetchStatementConfigTransfer();
+            }).then(function(statementConfig){
+                self.statementConfig = statementConfig;
+                /* Verificar el usuario */
+                if (!self.resUser.length){
+                    instanceWeb.notification.do_warn("Atencion", "No estas autorizado a realizar esta operación.");
+                    return  false;
+                }
+                /* Verificar si existe configuracion */
+                if (!self.statementConfig.length){
+                    instanceWeb.notification.do_warn("Atencion", "No estas autorizado a realizar esta operación, no existe configuración de caja.");
+                    return  false;
+                }
+                /* Verificar si el usuario tiene autorización para cerrar la caja */
+                if (!(_.contains(self.statementConfig[0].statement_cancel_user, self.resUser[0].id))){
+                    instanceWeb.notification.do_warn("Atencion", "El usuario no tiene autorización para cancelar la caja.");
+                    return false;
+                }
+
+                return self.showModal();
+            });
+        },
+        /* Account bank Statement */
+        fetchBankStatement: function(id) {
+            var bankStatement = new instanceWeb.Model('account.bank.statement');
+            return bankStatement.call('eiru_get_bank_statement_cancel',[parseInt(id)], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /*Get User*/
+        fetchGetUserLogin: function(){
+            var bankStatementUser = new instanceWeb.Model('account.bank.statement');
+            return bankStatementUser.call('eiru_transfers_get_user', {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /* statement Config */
+        fetchStatementConfigTransfer: function() {
+            var fields = ['id','name','statement_cancel_user'];
+            var domain = [['active', '=', true]];
+            var statementConfig = new openerp.web.Model('account.bank.statement.config');
+            return statementConfig.query(fields).filter(domain).all();
+        },
+        /* get Transferencia */
+        getTransfer: function(){
+            var self = this;
+            var statement = self.bankStatement[0];
+            var transfer = [];
+            var currency = statement.currencystatement;
+
+            if(!currency)
+                return transfer;
+
+            _.each(statement.statementTransfer, function(item) {
+
+                transfer.push({
+                    'id': item.id,
+                    'date': moment(item.date).format("DD-MM-YYYY"),
+                    'amount': accounting.formatNumber(item.amount, currency.decimalPlaces, currency.thousandsSeparator, currency.decimalSeparator),
+                    'statementUser': item.type === 'out' ? item.inputStatement.statementUser :item.outputStatement.statementUser,
+                    'statement': item.type === 'out' ? item.inputStatement.name :item.outputStatement.name,
+                    'statementState': item.type === 'out' ? item.inputStatement.state : item.outputStatement.state,
+                    'type': item.type === 'in' ?'Entrada' :'Salida',
+                    'typeStatement':  item.type
+                });
+            });
+            return transfer;
+        },
+        getStatementState: function(statement, state){
+            return _.filter(statement,function(item){
+                return item.statementState === state;
+            });
+        },
+
+        getStateTransfer: function(statement, id) {
+            return _.filter(statement, function(item){
+                return item.id === id;
+            });
+        },
+
+        /*Line Balance*/
+        filterConfirmLine: function() {
+            var self = this;
+            var lineConfirm = [];
+            var statement = self.bankStatement[0];
+            var currency = statement.currencystatement;
+            if (!currency)
+                return confirm;
+            if (!statement.statementConfirm.length)
+                return lineConfirm;
+            /* Reserve */
+            _.each(statement.statementConfirm[0].lineNextOpen, function(line){
+                lineConfirm.push({
+                    'id':line.id,
+                    'date': moment(line.date).format("DD-MM-YYYY"),
+                    'name': line.name,
+                    'amount': accounting.formatNumber(line.amount, currency.decimalPlaces, currency.thousandsSeparator, currency.decimalSeparator),
+                    'state': line.state,
+                    'type': line.type,
+                    'StatementOpenId': statement.statementConfirm[0].statementOpen.id,
+                    'statementOpenName': statement.statementConfirm[0].statementOpen.name
+                });
+            });
+
+            /* Balance */
+            _.each(statement.statementConfirm[0].lineDifference, function(line){
+                lineConfirm.push({
+                    'id':line.id,
+                    'date': moment(line.date).format("DD-MM-YYYY"),
+                    'name': line.name,
+                    'amount':  accounting.formatNumber(line.amount, currency.decimalPlaces, currency.thousandsSeparator, currency.decimalSeparator),
+                    'state': line.state,
+                    'type': line.type,
+                    'StatementOpenId':'',
+                    'statementOpenName': ''
+                });
+            });
+
+            return lineConfirm;
+        },
+        getConfirmState: function(confirm, state, type) {
+            return _.filter(confirm,function(item){
+                return item.state === state && item.type === type;
+            });
+        },
+        /*Modal  */
+        showModal: function() {
+            var self = this;
+            var defer =$.Deferred();
+            var results = true;
+            var transfer = self.getTransfer();
+            // var confirm = self.getStatementConfirm();
+            var line = self.filterConfirmLine();
+            var modal = QWeb.render('ModalStatementUtility.Cancel',{
+                'transfer': transfer,
+                'confirm': line
+            });
+
+            $('.openerp_webclient_container').after(modal);
+            $('.expired-account-modal').modal();
+
+            /* Transferencia */
+            var cancelTransferMessege = $('.expired-account-modal').find('.cancel-transfer-messege');
+            var tableTransfer = $('.expired-account-modal').find('.table-tbody-transfer').find('tr');
+            /* Confirm */
+            var cancelConfirmMessege = $('.expired-account-modal').find('.cancel-confirm-messege');
+            var tableConfirm = $('.expired-account-modal').find('.table-tbody-confirm').find('tr');
+            /* Motivo */
+            var messegeCancel = $('.expired-account-modal').find('.messege-cancel');
+            /* button */
+            var buttonSave = $('.expired-account-modal').find('.button-save');
+
+            if (!transfer.length)
+                $('.expired-account-modal').find('.cancel-transfer').css('display','none');
+
+            if (!line.length)
+                $('.expired-account-modal').find('.cancel-confirm').css('display','none');
+
+
+            _.each(tableTransfer, function(tr) {
+                var idTransfer  = (($(tr).children()[0]).textContent).trim();
+                var stateTransfer = self.getStateTransfer(transfer, parseInt(idTransfer));
+                if (!stateTransfer.length)
+                    return false;
+                if (stateTransfer[0].statementState === 'confirm'){
+                    $(tr).css('color','red')
+                }
+            });
+            /* Caja Cerrada */
+            stateStatement = self.getStatementState(transfer, 'confirm');
+            cancelTransferMessege.css('display','none');
+            cancelTransferMessege.text("");
+            if (stateStatement.length)
+                cancelTransferMessege.css('display','flex');
+                cancelTransferMessege.text("Existe "+stateStatement.length+" caja cerrada ");
+
+
+            cancelConfirmMessege.css('display','none')
+            cancelConfirmMessege.text("")
+            buttonSave.removeAttr("disabled");
+            _.each(tableConfirm, function(tr){
+                var idConfirm  = (($(tr).children()[0]).textContent).trim();
+                var stateConfirm = self.getStateTransfer(line, parseInt(idConfirm));
+                if (!stateConfirm.length)
+                    return false;
+                if ((stateConfirm[0].state === 'confirm') && (stateConfirm[0].type === 'reserve')){
+                    cancelConfirmMessege.css('display','flex')
+                    cancelConfirmMessege.text("La caja "+stateConfirm[0].statementOpenName +" que esta utilizando el saldo de cierre, ya esta cerrada.")
+                    $(tr).css('color','red')
+                    buttonSave.attr("disabled", true);
+                }
+            })
+
+            /*Click buttonSave*/
+            buttonSave.click(function(e) {
+                if (!(messegeCancel.val().trim())){
+                    instanceWeb.notification.do_warn("Atencion", "Debes ingresar el motivo para continuar.");
+                    messegeCancel.css('border-color','red');
+                    messegeCancel.focus();
+                    return  false;
+                }
+                messegeCancel.css('border-color','#ccc');
+
+                var lineConfirm = self.getConfirmState(line, 'confirm', 'reserve');
+
+                cancel = {
+                    'statementId': self.id,
+                    'messege': messegeCancel.val()
+                };
+
+                self.cancelStatement(cancel).then(function(resultsCancel) {
+                    return resultsCancel;
+                }).then(function(resultsCancel) {
+                    if (!resultsCancel.state)
+                        instanceWeb.notification.do_warn("Atencion", resultsCancel.messege);
+
+                    self.reloadPage();
+                    self.removeModal(e);
+
+                    if (!resultsCancel)
+                        results = false;
+                });
+
+                defer.resolve(results);
+            });
+
+            /* Click Cerrar */
+            $('.expired-account-modal').on('hidden.bs.modal', function(e) {
+                results = false;
+                defer.resolve(results);
+                self.removeModal(e);
+            });
+
+            return defer;
+        },
+
+        cancelStatement:function(values){
+            var bankStatementUser = new instanceWeb.Model('account.bank.statement');
+            return bankStatementUser.call('eiru_statement_cancel',[values], {
+                context: new instanceWeb.CompoundContext()
+            });
+        }
+    });
+
+    if (openerp.web && openerp.web.FormView) {
+        openerp.web.FormView.include({
+            load_record: function(record) {
+                this._super.apply(this, arguments);
+
+                if (this.model !== 'account.bank.statement')
+                    return;
+
+                openerp.parentInstanceStatementCancel = this;
+
+                if (openerp.widgetInstanceStatementCancel) {
+                    openerp.widgetInstanceStatementCancel.updateId(record.id);
+                    if (this.$el.find('.button-statement-cancel').length !== 0 )
+                        return ;
+                }
+
+                if (this.$el.find('.button-statement-cancel').length !== 0 )
+                    return;
+
+                openerp.widgetInstanceStatementCancel = new openerp.EiruStatementCancel(this);
+                var element =this.$el.find('.oe_form').find('.eiru-statement-utility-cancel');
+
+                openerp.widgetInstanceStatementCancel.appendTo(element[0]);
+                openerp.widgetInstanceStatementCancel.updateId(record.id);
+            }
+        });
+    }
+})();

+ 382 - 0
static/src/js/eiru_statement_cashbox_deleted.js

@@ -0,0 +1,382 @@
+(function() {
+
+    openerp.widgetInstanceStatementCashBoxDeleted = null;
+    openerp.parentInstanceStatementCashBoxDeleted = {};
+    var QWeb = openerp.web.qweb;
+    var instanceWeb = openerp.web;
+
+    openerp.EiruStatementCashBoxDeleted = openerp.Widget.extend({
+        template: 'EiruStatementUtility.CasBoxDeleted',
+        id: undefined,
+        buttons: undefined,
+        bankStatement: [],
+        cashBoxInput: [],
+        cashBoxOutput: [],
+        statementConfig: [],
+        resUser: [],
+        /* init */
+        init: function(parent) {
+            this._super(parent);
+            this.buttons = parent.$buttons;
+        },
+        /* start */
+        start: function () {
+            var self = this;
+            this.$el.click(function() {
+                // self.showModal()
+                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');
+            });
+        },
+        /* Actualizar Id de la visat actual  */
+        updateId: function(id) {
+            var self = this;
+            self.id = id;
+        },
+        /* Reload Page*/
+        reloadPage: function() {
+             openerp.parentInstanceStatementCashBoxDeleted.reload();
+        },
+        /* Description: Función para remover el modal */
+        removeModal: function() {
+            $('.expired-account-modal').remove();
+            $('.modal-backdrop').remove();
+        },
+        /*Get User*/
+        fetchGetUserLogin: function(){
+            var bankStatementUser = new instanceWeb.Model('account.bank.statement');
+            return bankStatementUser.call('eiru_transfers_get_user', {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /* statement Config */
+        fetchStatementConfigTransfer: function() {
+            var fields = ['id', 'name', 'delete_input_user_ids', 'delete_output_user_ids'];
+            var domain = [['active', '=', true]];
+            var statementConfig = new openerp.web.Model('account.bank.statement.config');
+            return statementConfig.query(fields).filter(domain).all();
+        },
+        /* Método inicial */
+        fetchInitial: function() {
+            var self = this;
+            self.fetchBankStatement(self.id).then(function(bankStatement) {
+                return bankStatement;
+            }).then(function(bankStatement) {
+                self.bankStatement = bankStatement;
+                return self.fetchCashBoxInput(self.id);
+            }).then(function(cashBoxInput) {
+                self.cashBoxInput = cashBoxInput;
+                return self.fetchCashBoxOutput(self.id);
+            }).then(function(cashBoxOutput) {
+                self.cashBoxOutput = cashBoxOutput;
+                return self.fetchStatementConfigTransfer();
+            }).then(function(statementConfig) {
+                self.statementConfig = statementConfig;
+                return self.fetchGetUserLogin();
+            }).then(function(resUser) {
+                self.resUser = resUser;
+                if (!self.statementConfig.length) {
+                    instanceWeb.notification.do_warn("Atencion", "No estas autorizado a realizar esta operación, no existe configuración de caja.");
+                    return  false;
+                }
+                if (!self.resUser.length) {
+                    instanceWeb.notification.do_warn("Atencion", "No estas autorizado a realizar esta operación");
+                    return  false;
+                }
+                if (!self.bankStatement.length) {
+                    instanceWeb.notification.do_warn("Atencion", "No estas autorizado a realizar esta operación.");
+                    return  false;
+                }
+
+                return self.showModal();
+            });
+        },
+        /* Account bank Statement */
+        fetchBankStatement: function(id) {
+            var bankStatement = new instanceWeb.Model('account.bank.statement');
+            return bankStatement.call('get_account_bank_statement_utility',[id], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /* cash_box_Input*/
+        fetchCashBoxInput: function(id) {
+            var cashBoxInput = new instanceWeb.Model('account.bank.statement');
+            return cashBoxInput.call('eiru_get_cash_box_in',[id], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /* cash_box_output*/
+        fetchCashBoxOutput: function(id) {
+            var cashBoxOutput = new instanceWeb.Model('account.bank.statement');
+            return cashBoxOutput.call('eiru_get_cash_box_out',[id], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /*filter line transfer selected*/
+        filterRowSelected: function(id, type){
+            var self = this;
+            if (type === 'input') {
+                return _.filter(self.cashBoxInput, function(item){
+                    return item.id === id;
+                });
+            }
+            if (type === 'output') {
+                return _.filter(self.cashBoxOutput, function(item){
+                    return item.id === id;
+                });
+            }
+        },
+        /*Modal  Transfer */
+        showModal: function() {
+            var self = this;
+            var defer =$.Deferred();
+            var results = true;
+            var rowSelected = [];
+            var statementBank = self.bankStatement[0]
+            var modal = QWeb.render('ModalStatementUtility.CasBoxDeleted',{
+                'boxInput': self.cashBoxInput,
+                'boxOutput': self.cashBoxOutput
+            });
+
+            $('.openerp_webclient_container').after(modal);
+            $('.expired-account-modal').modal();
+
+            /*Table*/
+            var tableInput = $('.expired-account-modal').find('.tbody-input').find('tr');
+            var tableOutput = $('.expired-account-modal').find('.tbody-output').find('tr');
+            /* selectr type cash*/
+            var cashInput = $('.expired-account-modal').find('.cash-input');
+            $('.expired-account-modal').find('.messege-is-cash-input').text("Tienes "+self.cashBoxInput.length+" registro de entrada de dinero");
+            if (!self.cashBoxInput.length) {
+                cashInput.attr("disabled", true);
+                $('.expired-account-modal').find('.messege-is-cash-input').text("No existe registros.");
+            }
+            var cashOutput = $('.expired-account-modal').find('.cash-output');
+            $('.expired-account-modal').find('.messege-is-cash-output').text("Tienes "+self.cashBoxOutput.length+" registro de extracción de dinero");
+            if (!self.cashBoxOutput.length) {
+                cashOutput.attr("disabled", true);
+                $('.expired-account-modal').find('.messege-is-cash-output').text("No existe registros.");
+            }
+
+            var cashInputSelected = null;
+            var cashOutputSelected = null;
+            /* */
+            var casboxRef = $('.expired-account-modal').find('.casbox-ref');
+            var casboxAmount = $('.expired-account-modal').find('.casbox-amount');
+            var casboxAmountSymbol = $('.expired-account-modal').find('.casbox-amount-symbol');
+            casboxAmountSymbol.text(statementBank.currencystatement.symbol);
+            var casboxRefDeleted = $('.expired-account-modal').find('.casbox-ref-deleted');
+            /* Button*/
+            var buttonDeleted = $('.expired-account-modal').find('.button-deleted');
+            buttonDeleted.attr("disabled", true);
+
+            /* Entrada */
+            cashInput.click(function(e) {
+                $('.expired-account-modal').find('.is-cash-input').css('background','#ffffff');
+                $('.expired-account-modal').find('.boby-cash-input').css('display','none');
+                $('.expired-account-modal').find('.is-cash-output').css('background','#ffffff');
+                $('.expired-account-modal').find('.boby-cash-output').css('display','none');
+                $('.expired-account-modal').find('.is-selectd-cashbox').css('display','none');
+                $('.expired-account-modal').find('.warning-message').css('display','none');
+                $('.expired-account-modal').find('.message-error').text("");
+                cashInputSelected = e.target;
+                casboxRef.val('');
+                casboxAmount.val('0');
+                casboxRefDeleted.val('');
+                buttonDeleted.attr("disabled", true);
+                rowSelected = [];
+                tableInput.removeClass('table-row-select');
+                tableOutput.removeClass('table-row-select');
+
+                if (this.checked) {
+                    if (cashOutputSelected)
+                        cashOutputSelected.checked = false
+
+                    if (!(_.contains(self.statementConfig[0].delete_input_user_ids, self.resUser[0].id))){
+                        $('.expired-account-modal').find('.warning-message').css('display','flex');
+                        $('.expired-account-modal').find('.message-error').text("No tienes autorización para eliminar las entradas de dinero..");
+                        return false;
+                    }
+                    $('.expired-account-modal').find('.is-cash-input').css('background','#d4e2f3');
+                    $('.expired-account-modal').find('.boby-cash-input').css('display','flex');
+                    $('.expired-account-modal').find('.is-selectd-cashbox').css('display','flex');
+                }
+            });
+            /* Salida */
+            cashOutput.click(function(e){
+                cashOutputSelected = e.target;
+                $('.expired-account-modal').find('.is-cash-output').css('background','#ffffff');
+                $('.expired-account-modal').find('.boby-cash-output').css('display','none');
+                $('.expired-account-modal').find('.is-cash-input').css('background','#ffffff');
+                $('.expired-account-modal').find('.boby-cash-input').css('display','none');
+                $('.expired-account-modal').find('.is-selectd-cashbox').css('display','none');
+                $('.expired-account-modal').find('.warning-message').css('display','none');
+                $('.expired-account-modal').find('.message-error').text("");
+                casboxRef.val('');
+                casboxAmount.val('0');
+                casboxRefDeleted.val('');
+                buttonDeleted.attr("disabled", true);
+                rowSelected = [];
+                tableInput.removeClass('table-row-select');
+                tableOutput.removeClass('table-row-select');
+
+                if (this.checked) {
+                    if (cashInputSelected)
+                        cashInputSelected.checked = false
+
+                    if (!(_.contains(self.statementConfig[0].delete_output_user_ids, self.resUser[0].id))){
+                        $('.expired-account-modal').find('.warning-message').css('display','flex');
+                        $('.expired-account-modal').find('.message-error').text("No tienes autorización para eliminar las salidas de dinero.");
+                        return false;
+                    }
+                    $('.expired-account-modal').find('.is-cash-output').css('background','#d4e2f3');
+                    $('.expired-account-modal').find('.boby-cash-output').css('display','flex');
+                    $('.expired-account-modal').find('.is-selectd-cashbox').css('display','flex');
+                }
+            });
+            /* table input */
+            tableInput.click(function(e){
+                /* clear */
+                casboxRef.val('');
+                casboxAmount.val('0');
+                casboxRefDeleted.val('');
+                buttonDeleted.attr("disabled", true);
+
+                tableInput.removeClass('table-row-select');
+                tableOutput.removeClass('table-row-select');
+                $(e.target).closest('tr').addClass('table-row-select');
+
+                var idRow = parseInt(($(e.target).closest('tr').children()[0].textContent).trim());
+                rowSelected = self.filterRowSelected(idRow, 'input').shift();
+
+                if (!!rowSelected) {
+                    casboxRef.val(rowSelected.ref);
+                    casboxAmount.val(instanceWeb.formatCurrency(rowSelected.amount, rowSelected.statement.currency));
+                    buttonDeleted.removeAttr("disabled");
+                }
+            });
+            /* table output*/
+            tableOutput.click(function(e){
+                /* clear */
+                casboxRef.val('');
+                casboxAmount.val('0');
+                casboxRefDeleted.val('');
+                buttonDeleted.attr("disabled", true);
+
+                tableInput.removeClass('table-row-select');
+                tableOutput.removeClass('table-row-select');
+                $(e.target).closest('tr').addClass('table-row-select');
+
+                var idRow = parseInt(($(e.target).closest('tr').children()[0].textContent).trim());
+                rowSelected = self.filterRowSelected(idRow, 'output').shift();
+
+                if (!!rowSelected) {
+                    casboxRef.val(rowSelected.ref);
+                    casboxAmount.val(instanceWeb.formatCurrency(rowSelected.amount, rowSelected.statement.currency));
+                    buttonDeleted.removeAttr("disabled");
+                }
+            });
+
+            casboxRefDeleted.keyup(function(e){
+                if (e.keyCode === 13) {
+                    buttonDeleted.focus();
+                }
+            });
+            casboxRefDeleted.focusout(function(e){
+                if (!casboxRefDeleted.val()) {
+                    instanceWeb.notification.do_warn("Atencion", "Debes de ingresar un motivo para continuar.");
+                    casboxRefDeleted.focus();
+                    return false;
+                }
+            });
+            /* button click */
+            buttonDeleted.click(function(e) {
+                if (!rowSelected){
+                    instanceWeb.notification.do_warn("Atencion", "Debes de seleccionar un ítem para continuar");
+                    return false;
+                }
+                if (!casboxRefDeleted.val()) {
+                    instanceWeb.notification.do_warn("Atencion", "Debes de ingresar un motivo para continuar.");
+                    buttonDeleted.css('border-color','red');
+                    buttonDeleted.focus();
+                    return  false;
+                }
+                buttonDeleted.css('border-color','#ccc');
+
+                var cashbox = {
+                    'cashboxID': rowSelected.id,
+                    'statementId': self.id,
+                    'type': rowSelected.type,
+                    'message': casboxRefDeleted.val()
+                }
+
+                self.unlinkCashBox(cashbox).then(function(cashboxUnlink){
+                    return cashboxUnlink;
+                }).then(function(cashboxUnlink){
+                    self.reloadPage();
+                    self.removeModal(e);
+                    if (!cashboxUnlink)
+                        results = false;
+                })
+                defer.resolve(results);
+            });
+
+            /* Click Cerrar */
+            $('.expired-account-modal').on('hidden.bs.modal', function(e) {
+                results = false;
+                defer.resolve(results);
+                self.removeModal(e);
+            });
+
+            return defer;
+        },
+        /* Unlink Cash Box */
+        unlinkCashBox: function(values){
+            var bankStatementTransfer = new instanceWeb.Model('account.bank.statement');
+            return bankStatementTransfer.call('unlink_cashbox_in_out',[values], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+    });
+
+    if (openerp.web && openerp.web.FormView) {
+        openerp.web.FormView.include({
+            load_record: function(record) {
+                this._super.apply(this, arguments);
+
+                if (this.model !== 'account.bank.statement')
+                    return;
+
+                openerp.parentInstanceStatementCashBoxDeleted = this;
+
+                if (openerp.widgetInstanceStatementCashBoxDeleted) {
+                    openerp.widgetInstanceStatementCashBoxDeleted.updateId(record.id);
+                    if (this.$el.find('.button-statement-cashbox-deleted').length !== 0 )
+                        return ;
+                }
+
+                if (this.$el.find('.button-statement-cashbox-deleted').length !== 0 )
+                    return;
+
+                openerp.widgetInstanceStatementCashBoxDeleted = new openerp.EiruStatementCashBoxDeleted(this);
+                var element =this.$el.find('.oe_form').find('.eiru-statement-utility');
+
+                openerp.widgetInstanceStatementCashBoxDeleted.appendTo(element[0]);
+                openerp.widgetInstanceStatementCashBoxDeleted.updateId(record.id);
+            }
+        });
+    }
+})();

+ 258 - 0
static/src/js/eiru_statement_cashbox_input.js

@@ -0,0 +1,258 @@
+(function() {
+
+    openerp.widgetInstanceStatementCashBoxInput = null;
+    openerp.parentInstanceStatementCashBoxInput = {};
+    var QWeb = openerp.web.qweb;
+    var instanceWeb = openerp.web;
+
+    openerp.EiruStatementCashBoxInput = openerp.Widget.extend({
+        template: 'EiruStatementUtility.CashBoxInput',
+        id: undefined,
+        buttons: undefined,
+        bankStatement: [],
+        statementConfig: [],
+        resUser: [],
+        /* init */
+        init: function(parent) {
+            this._super(parent);
+            this.buttons = parent.$buttons;
+        },
+        /* start */
+        start: function () {
+            var self = this;
+            this.$el.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');
+            });
+        },
+        /* Actualizar Id de la visat actual  */
+        updateId: function(id) {
+            var self = this;
+            self.id = id;
+        },
+        /* Reload Page*/
+        reloadPage: function() {
+             openerp.parentInstanceStatementCashBoxInput.reload();
+        },
+        /* Description: Función para remover el modal */
+        removeModal: function() {
+            $('.expired-account-modal').remove();
+            $('.modal-backdrop').remove();
+        },
+        /*Get User*/
+        fetchGetUserLogin: function() {
+            var bankStatementUser = new instanceWeb.Model('account.bank.statement');
+            return bankStatementUser.call('eiru_transfers_get_user', {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /* statement Config */
+        fetchStatementConfigTransfer: function() {
+            var fields = ['id','name','input_cash_box_user_id','input_cash_box_statement_ids'];
+            var domain = [['active', '=', true]];
+            var statementConfig = new openerp.web.Model('account.bank.statement.config');
+            return statementConfig.query(fields).filter(domain).all();
+        },
+        /* Método inicial */
+        fetchInitial: function() {
+            var self = this;
+            self.fetchBankStatement(self.id).then(function(bankStatement) {
+                return bankStatement;
+            }).then(function(bankStatement) {
+                self.bankStatement = bankStatement;
+                return self.fetchStatementConfigTransfer();
+            }).then(function(statementConfig) {
+                self.statementConfig = statementConfig;
+                return self.fetchGetUserLogin();
+            }).then(function(resUser) {
+                self.resUser = resUser;
+
+                if (!self.statementConfig.length) {
+                    instanceWeb.notification.do_warn("Atencion", "No estas autorizado a realizar esta operación, no existe configuración de caja.");
+                    return  false;
+                }
+                if (!self.resUser.length) {
+                    instanceWeb.notification.do_warn("Atencion", "No estas autorizado a realizar esta operación.");
+                    return  false;
+                }
+                if (!!self.bankStatement.length) {
+                    var statementConfig = self.statementConfig[0];
+                    var resUser = self.resUser[0];
+                    var statementUser = self.bankStatement[0];
+                    /*  Verificar si el tipo caja tiene permiso para la transferencia */
+                    if (!(_.contains(statementConfig.input_cash_box_statement_ids, statementUser.typeStatement))) {
+                        instanceWeb.notification.do_warn("Atencion", "El tipo de caja no tiene autorización para poner dinero.");
+                        return  false;
+                    }
+                    /* Verificar si el usuario tiene permiso para la transferencia*/
+                    if (!(_.contains(statementConfig.input_cash_box_user_id, resUser.id))) {
+                        instanceWeb.notification.do_warn("Atencion", "El usuario no tiene autorización para poner dinero.");
+                        return false;
+                    }
+                }
+                return self.showModalCashBox();
+            });
+        },
+        /* Account bank Statement */
+        fetchBankStatement: function(id) {
+            var bankStatement = new instanceWeb.Model('account.bank.statement');
+            return bankStatement.call('get_account_bank_statement_utility',[id], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        // /*Modal  Transfer */
+        showModalCashBox: function() {
+            var self = this;
+            var defer =$.Deferred();
+            var results = true;
+            var bankStatement = self.bankStatement[0];
+            var statement = [];
+            var currency ;
+            if (!!bankStatement) {
+                currency = bankStatement.currencystatement;
+                statement = [{
+                    'amount': accounting.formatNumber(bankStatement.amount, currency.decimalPlaces, currency.thousandsSeparator, currency.decimalSeparator),
+                    'symbol': bankStatement.currencystatement.symbol
+                }];
+            }
+            var header = [{
+                    'title': 'Poner dinero en caja '
+            }];
+            var modal = QWeb.render('ModalStatementUtility.CashBox',{
+                'header':header,
+                'statement': statement
+            });
+            $('.openerp_webclient_container').after(modal);
+            $('.expired-account-modal').modal();
+
+            var refCashBox = $('.expired-account-modal').find('.ref-cash-box');
+            var amountCashBox = $('.expired-account-modal').find('.amount-cash-box');
+            /* button */
+            var buttonCashBox = $('.expired-account-modal').find('.button-cash-box');
+
+            /*Monto del chque */
+            amountCashBox.keyup(function(e) {
+                if (e.key === currency.decimalSeparator && currency.decimalPlaces > 0)
+                    return false ;
+
+                var amount = instanceWeb.unFormatCurrency(amountCashBox.val());
+                amount = instanceWeb.formatCurrency(amount,currency)
+                amountCashBox.val(amount);
+
+                amountCashBox.css('border-color','#ccc');
+                if (e.keyCode === 13)
+                    buttonCashBox.focus();
+            });
+
+            /*Monto del cheque */
+            amountCashBox.focusout(function(e) {
+
+                var amount_add = instanceWeb.unFormatCurrency(amountCashBox.val());
+                if (amount_add <=  0.00) {
+                    instanceWeb.notification.do_warn("Atencion", "Monto incorrecto");
+                    amountCashBox.css('border-color','red');
+                    amountCashBox.focus();
+                    return false;
+                }
+            });
+            /*Click buttonSave*/
+            buttonCashBox.click(function(e) {
+                var amount = instanceWeb.unFormatCurrency(amountCashBox.val());
+                /* Ref transfer */
+                if (!refCashBox.val()) {
+                    instanceWeb.notification.do_warn("Atencion", "Debes de ingresar un motivo.");
+                    refCashBox.css('border-color','red');
+                    refCashBox.focus();
+                    return false;
+                }
+                refCashBox.css('border-color','#ccc');
+
+                /* ammount transfer*/
+                if (amount <= 0.00) {
+                    instanceWeb.notification.do_warn("Atencion", "El valor debe ser mayor a cero.");
+                    amountCashBox.css('border-color','red');
+                    amountCashBox.focus();
+                    return false;
+                }
+                amountCashBox.css('border-color','#ccc');
+
+                var input ={
+                    'statementId': self.id,
+                    'ref': !!refCashBox.val() ? refCashBox.val() :'',
+                    'amount': amount,
+                    'type': 'input'
+                }
+
+                /* Save Payments */
+                self.StatementCreateCashBox(input).then(function(resultsInput) {
+                    return resultsInput;
+                }).then(function(resultsInput) {
+                    self.reloadPage();
+                    self.removeModal(e);
+                    if (!resultsInput)
+                        results = false;
+                });
+
+                defer.resolve(results);
+
+            });
+
+            /* Click Cerrar */
+            $('.expired-account-modal').on('hidden.bs.modal', function(e) {
+                results = false;
+                defer.resolve(results);
+                self.removeModal(e);
+            });
+
+            return defer;
+        },
+        /*Create CashBox Input */
+        StatementCreateCashBox: function(values) {
+            var bankStatement = new instanceWeb.Model('account.bank.statement');
+            return bankStatement.call('create_cash_box_input_output',[values], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+    });
+
+    if (openerp.web && openerp.web.FormView) {
+        openerp.web.FormView.include({
+            load_record: function(record) {
+                this._super.apply(this, arguments);
+
+                if (this.model !== 'account.bank.statement')
+                    return;
+
+                openerp.parentInstanceStatementCashBoxInput = this;
+
+                if (openerp.widgetInstanceStatementCashBoxInput) {
+                    openerp.widgetInstanceStatementCashBoxInput.updateId(record.id);
+                    if (this.$el.find('.button-statement-Cashbox-Input').length !== 0 )
+                        return ;
+                }
+
+                if (this.$el.find('.button-statement-Cashbox-Input').length !== 0 )
+                    return;
+
+                openerp.widgetInstanceStatementCashBoxInput = new openerp.EiruStatementCashBoxInput(this);
+                var element =this.$el.find('.oe_form').find('.eiru-statement-utility');
+
+                openerp.widgetInstanceStatementCashBoxInput.appendTo(element[0]);
+                openerp.widgetInstanceStatementCashBoxInput.updateId(record.id);
+            }
+        });
+    }
+})();

+ 307 - 0
static/src/js/eiru_statement_cashbox_output.js

@@ -0,0 +1,307 @@
+(function() {
+
+    openerp.widgetInstanceStatementCashBoxOutput = null;
+    openerp.parentInstanceStatementCashBoxOutput = {};
+    var QWeb = openerp.web.qweb;
+    var instanceWeb = openerp.web;
+
+    openerp.EiruStatementCashBoxOutput = openerp.Widget.extend({
+        template: 'EiruStatementUtility.CashBoxOutput',
+        id: undefined,
+        buttons: undefined,
+        bankStatement: [],
+        statementConfig: [],
+        resUser: [],
+        /* init */
+        init: function(parent) {
+            this._super(parent);
+            this.buttons = parent.$buttons;
+        },
+        /* start */
+        start: function () {
+            var self = this
+            this.$el.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');
+            });
+        },
+        /* Actualizar Id de la visat actual  */
+        updateId: function(id) {
+            var self = this;
+            self.id = id;
+        },
+        /* Reload Page*/
+        reloadPage: function() {
+             openerp.parentInstanceStatementCashBoxOutput.reload();
+        },
+        /* Description: Función para remover el modal */
+        removeModal: function() {
+            $('.expired-account-modal').remove();
+            $('.modal-backdrop').remove();
+        },
+        /*Get User*/
+        fetchGetUserLogin: function(){
+            var bankStatementUser = new instanceWeb.Model('account.bank.statement');
+            return bankStatementUser.call('eiru_transfers_get_user', {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /* statement Config */
+        fetchStatementConfigTransfer: function() {
+            var fields = ['id','name','output_cash_box_user_id','output_cash_box_statement_ids','output_negative_amount'];
+            var domain = [['active', '=', true]];
+            var statementConfig = new openerp.web.Model('account.bank.statement.config');
+            return statementConfig.query(fields).filter(domain).all();
+        },
+        /* Método inicial */
+        fetchInitial: function() {
+            var self = this;
+            self.fetchBankStatement(self.id).then(function(bankStatement) {
+                return bankStatement;
+            }).then(function(bankStatement) {
+                self.bankStatement = bankStatement;
+                return self.fetchStatementConfigTransfer();
+            }).then(function(statementConfig) {
+                self.statementConfig = statementConfig;
+                return self.fetchGetUserLogin();
+            }).then(function(resUser) {
+                self.resUser = resUser;
+
+                if (!self.statementConfig.length) {
+                    instanceWeb.notification.do_warn("Atencion", "No estas autorizado a realizar esta operación, no existe configuración de caja.");
+                    return  false;
+                }
+                if (!self.resUser.length) {
+                    instanceWeb.notification.do_warn("Atencion", "No estas autorizado a realizar esta operación.");
+                    return  false;
+                }
+                if (!!self.bankStatement.length) {
+                    var statementConfig = self.statementConfig[0];
+                    var resUser = self.resUser[0];
+                    var statementUser = self.bankStatement[0];
+                    /*  Verificar si el tipo caja tiene permiso para la transferencia */
+                    if (!(_.contains(statementConfig.output_cash_box_statement_ids, statementUser.typeStatement))) {
+                        instanceWeb.notification.do_warn("Atencion", "El tipo de caja no tiene autorización para realizar extracción de dinero.");
+                        return  false;
+                    }
+                    /* Verificar si el usuario tiene permiso para la transferencia*/
+                    if (!(_.contains(statementConfig.output_cash_box_user_id, resUser.id))) {
+                        instanceWeb.notification.do_warn("Atencion", "El usuario no tiene autorización para realizar extracción de dinero.");
+                        return false;
+                    }
+                    if (statementUser.amount <= 0) {
+                        if (!statementConfig) {
+                            instanceWeb.notification.do_warn("Atencion", "Caja sin saldo.");
+                            return false;
+                        }
+                        if (!statementConfig.output_negative_amount) {
+                            instanceWeb.notification.do_warn("Atencion", "Caja sin saldo.");
+                            return false;
+                        }
+                    }
+                }
+                return self.showModalCashBox();
+            });
+        },
+        /* Account bank Statement */
+        fetchBankStatement: function(id) {
+            var bankStatement = new instanceWeb.Model('account.bank.statement');
+            return bankStatement.call('get_account_bank_statement_utility',[id], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        // /*Modal  Transfer */
+        showModalCashBox: function() {
+            var self = this;
+            var defer =$.Deferred();
+            var results = true;
+            var bankStatement = self.bankStatement[0];
+            var statement = [];
+            var currency ;
+            if (!!bankStatement) {
+                currency = bankStatement.currencystatement;
+                statement = [{
+                    'amount': instanceWeb.formatCurrency(bankStatement.amount, currency),
+                    'symbol': bankStatement.currencystatement.symbol
+                }];
+            }
+            var header = [{
+                    'title': 'Sacar dinero de caja '
+            }];
+            var modal = QWeb.render('ModalStatementUtility.CashBox',{
+                'header':header,
+                'statement': statement
+            });
+            $('.openerp_webclient_container').after(modal);
+            $('.expired-account-modal').modal();
+
+            $('.expired-account-modal').find('.is_output').css('display','flex');
+            var refCashBox = $('.expired-account-modal').find('.ref-cash-box');
+            var amountCashBox = $('.expired-account-modal').find('.amount-cash-box');
+            var amountTotalCash = $('.expired-account-modal').find('.amount-total-cash');
+            /* button */
+            var buttonCashBox = $('.expired-account-modal').find('.button-cash-box');
+            refCashBox.keyup(function(e) {
+                if (e.keyCode === 13)
+                    amountCashBox.focus();
+            });
+            /*Monto del chque */
+            amountCashBox.keyup(function(e) {
+                if (e.key === currency.decimalSeparator && currency.decimalPlaces > 0)
+                    return false ;
+
+                var amount_add = Math.abs(instanceWeb.unFormatCurrency(amountCashBox.val()));
+                amountCashBox.val(instanceWeb.formatCurrency(amount_add, currency));
+
+                amountCashBox.css('border-color','#ccc');
+                if (e.keyCode === 13)
+                    buttonCashBox.focus();
+            });
+            /*Monto del cheque */
+            amountCashBox.focusout(function(e) {
+                var amount_add = instanceWeb.unFormatCurrency(amountCashBox.val());
+                var amountTotal = instanceWeb.unFormatCurrency(amountTotalCash.val());
+
+                if (amount_add <=  0) {
+                    instanceWeb.notification.do_warn("Atencion", "El monto no puede ser 0.");
+                    amountCashBox.css('border-color','red');
+                    amountCashBox.focus();
+                    return false;
+                }
+                if (!self.statementConfig.length) {
+                    if (amount_add > amountTotal) {
+                        instanceWeb.notification.do_warn("Atencion", "El valor que quieres retirar supera el saldo disponible en la caja");
+                        amountCashBox.css('border-color','red');
+                        amountCashBox.focus();
+                        return false;
+                    }
+                }
+                if (!self.statementConfig[0].output_negative_amount) {
+                    if (amount_add > amountTotal) {
+                        instanceWeb.notification.do_warn("Atencion", "El valor que quieres retirar supera el saldo disponible en la caja");
+                        amountCashBox.css('border-color','red');
+                        amountCashBox.focus();
+                        return false;
+                    }
+                }
+                amountCashBox.css('border-color','#ccc');
+            });
+            /*Click buttonSave*/
+            buttonCashBox.click(function(e) {
+                var amount = instanceWeb.unFormatCurrency(amountCashBox.val());
+                var amountTotal = instanceWeb.unFormatCurrency(amountTotalCash.val());
+
+                /* Ref transfer */
+                if (!refCashBox.val()) {
+                    instanceWeb.notification.do_warn("Atencion", "Debes de ingresar un motivo.");
+                    refCashBox.css('border-color','red');
+                    refCashBox.focus();
+                    return false;
+                }
+                refCashBox.css('border-color','#ccc');
+
+                /* ammount transfer*/
+                if (amount <= 0) {
+                    instanceWeb.notification.do_warn("Atencion", "El valor debe ser mayor a cero.");
+                    amountCashBox.css('border-color','red');
+                    amountCashBox.focus();
+                    return false;
+                }
+                if (!self.statementConfig.length) {
+                    if (amount > amountTotal) {
+                        instanceWeb.notification.do_warn("Atencion", "El valor que quieres retirar supera el saldo disponible en la caja");
+                        amountCashBox.css('border-color','red');
+                        amountCashBox.focus();
+                        return false;
+                    }
+                }
+                if (!self.statementConfig[0].output_negative_amount) {
+                    if (amount > amountTotal) {
+                        instanceWeb.notification.do_warn("Atencion", "El valor que quieres retirar supera el saldo disponible en la caja");
+                        amountCashBox.css('border-color','red');
+                        amountCashBox.focus();
+                        return false;
+                    }
+                }
+                amountCashBox.css('border-color','#ccc');
+
+                var input = {
+                    'statementId': self.id,
+                    'ref': !!refCashBox.val() ? refCashBox.val() :'',
+                    'amount': amount,
+                    'type': 'output'
+                }
+
+                /* Save Payments */
+                self.StatementCreateCashBox(input).then(function(resultsInput) {
+                    return resultsInput;
+                }).then(function(resultsInput) {
+                    self.reloadPage();
+                    self.removeModal(e);
+                    if (!resultsInput)
+                        results = false;
+                });
+
+                defer.resolve(results);
+
+            });
+
+            /* Click Cerrar */
+            $('.expired-account-modal').on('hidden.bs.modal', function(e) {
+                results = false;
+                defer.resolve(results);
+                self.removeModal(e);
+            });
+
+            return defer;
+        },
+        /*Create CashBox Input */
+        StatementCreateCashBox: function(values) {
+            var bankStatement = new instanceWeb.Model('account.bank.statement');
+            return bankStatement.call('create_cash_box_input_output',[values], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+    });
+
+    if (openerp.web && openerp.web.FormView) {
+        openerp.web.FormView.include({
+            load_record: function(record) {
+                this._super.apply(this, arguments);
+
+                if (this.model !== 'account.bank.statement')
+                    return;
+
+                openerp.parentInstanceStatementCashBoxOutput = this;
+
+                if (openerp.widgetInstanceStatementCashBoxOutput) {
+                    openerp.widgetInstanceStatementCashBoxOutput.updateId(record.id);
+                    if (this.$el.find('.button-statement-casbox-output').length !== 0 )
+                        return ;
+                }
+
+                if (this.$el.find('.button-statement-casbox-output').length !== 0 )
+                    return;
+
+                openerp.widgetInstanceStatementCashBoxOutput = new openerp.EiruStatementCashBoxOutput(this);
+                var element =this.$el.find('.oe_form').find('.eiru-statement-utility');
+
+                openerp.widgetInstanceStatementCashBoxOutput.appendTo(element[0]);
+                openerp.widgetInstanceStatementCashBoxOutput.updateId(record.id);
+            }
+        });
+    }
+})();

+ 432 - 0
static/src/js/eiru_statement_confirm.js

@@ -0,0 +1,432 @@
+(function() {
+    openerp.widgetInstanceStatementConfirm = null;
+    openerp.parentInstanceStatementConfirm = {};
+    var QWeb = openerp.web.qweb;
+    var instanceWeb = openerp.web;
+    // Abrir caja
+    openerp.EiruStatementConfirm = openerp.Widget.extend({
+        template: 'EiruStatementUtility.Confirm',
+        id: undefined,
+        buttons: undefined,
+        bankStatement: [],
+        statementGeneral: [],
+        resUser: [],
+        statementConfig: [],
+        /* init */
+        init: function(parent) {
+            this._super(parent);
+            this.buttons = parent.$buttons;
+        },
+        /* start */
+        start: function () {
+            var self = this
+            this.$el.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');
+            });
+        },
+        /* Actualizar Id de la visat actual  */
+        updateId: function(id) {
+            var self = this;
+            self.id = id;
+        },
+        /* Reload Page*/
+        reloadPage: function() {
+             openerp.parentInstanceStatementConfirm.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.fetchBankStatement(self.id).then(function(bankStatement) {
+                return bankStatement;
+            }).then(function(bankStatement) {
+                self.bankStatement = bankStatement;
+                return self.fetchBankStatementGeneral(self.id);
+            }).then(function(statementGeneral) {
+                self.statementGeneral = statementGeneral;
+                return self.fetchGetUserLogin();
+            }).then(function(resUser){
+                self.resUser = resUser;
+                return self.fetchStatementConfigTransfer();
+            }).then(function(statementConfig){
+                self.statementConfig = statementConfig;
+                /* Verificar el usuario */
+                if (!self.resUser.length){
+                    instanceWeb.notification.do_warn("Atencion", "No estas autorizado a realizar esta operación.");
+                    return  false;
+                }
+                /* Verificar si existe configuracion */
+                if (!self.statementConfig.length){
+                    instanceWeb.notification.do_warn("Atencion", "No estas autorizado a realizar esta operación, no existe configuración de caja.");
+                    return  false;
+                }
+                /* Verificar si el usuario tiene autorización para cerrar la caja */
+                if (!(_.contains(self.statementConfig[0].statement_confirm_user, self.resUser[0].id))){
+                    instanceWeb.notification.do_warn("Atencion", "El usuario no tiene autorización para cerrar la caja.");
+                    return false;
+                }
+                return self.showModal();
+            });
+        },
+        /* Account bank Statement */
+        fetchBankStatement: function(id) {
+            var bankStatement = new instanceWeb.Model('account.bank.statement');
+            return bankStatement.call('get_account_bank_statement_utility',[id], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /* Get statement General */
+        fetchBankStatementGeneral: function(id) {
+            var bankStatementGeneral = new instanceWeb.Model('account.bank.statement');
+            return bankStatementGeneral.call('get_account_bank_statement_general',[id], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /* Confirm Statement */
+        confirm_statement: function(values) {
+            var bankStatementTransfer = new instanceWeb.Model('account.bank.statement');
+            return bankStatementTransfer.call('account_bank_statement_confirm',[values], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /*Get User*/
+        fetchGetUserLogin: function(){
+            var bankStatementUser = new instanceWeb.Model('account.bank.statement');
+            return bankStatementUser.call('eiru_transfers_get_user', {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /* statement Config */
+        fetchStatementConfigTransfer: function() {
+            var fields = ['id','name','statement_confirm_user','statement_confirm_transfer_user','statement_confirm_balance','statement_confirm_negative_amount'];
+            var domain = [['active', '=', true]];
+            var statementConfig = new openerp.web.Model('account.bank.statement.config');
+            return statementConfig.query(fields).filter(domain).all();
+        },
+        /*Modal  */
+        showModal: function() {
+            var self = this;
+            var defer =$.Deferred();
+            var results = true;
+            var statementGeneral =  self.statementGeneral;
+            var selectedTrnasfer = false;
+
+            if(!!statementGeneral.length){
+                statementGeneral.unshift({
+                    'id':' ',
+                    'statementname':' '
+                });
+            }
+
+            var modal = QWeb.render('ModalStatementUtility.Confirm',{
+                'statement': statementGeneral
+            });
+            $('.openerp_webclient_container').after(modal);
+            $('.expired-account-modal').modal();
+
+            /* Balance */
+            var amountSymbol = $('.expired-account-modal').find('.statement-amount-symbol');
+            var amountCashbox = $('.expired-account-modal').find('.amount-cashbox');
+            var amountReal = $('.expired-account-modal').find('.amount-real');
+            var amountDiffer = $('.expired-account-modal').find('.amount-difference');
+            var refBalance = $('.expired-account-modal').find('.ref-balance');
+            /*transfer*/
+            var transferCasbox = $('.expired-account-modal').find('.confirm-transfer-casbox');
+            var cashboxTransfer = $('.expired-account-modal').find('.cashbox-transfer');
+            var amountTransfer = $('.expired-account-modal').find('.amount-transfer');
+            var refTransfer = $('.expired-account-modal').find('.ref-transfer');
+            /* Open cashBox*/
+            var amountOpen = $('.expired-account-modal').find('.amount-cashbox-open');
+            var buttonSave = $('.expired-account-modal').find('.button-save');
+
+            var currency = self.bankStatement[0].currencystatement;
+            var transferSelected = null;
+
+            amountSymbol.text(currency.symbol);
+            amountCashbox.val(instanceWeb.formatCurrency(self.bankStatement[0].amount, currency));
+            amountReal.val(instanceWeb.formatCurrency(self.bankStatement[0].amount, currency));
+            amountOpen.val(instanceWeb.formatCurrency(self.bankStatement[0].amount, currency));
+            amountDiffer.val(0);
+            amountTransfer.val('0');
+
+            refBalance.val('Balance de cierre correcto.');
+
+            $('.expired-account-modal').find('.is-not-transfer').css('display','none');
+            $('.expired-account-modal').find('.is-not-transfer').text('');
+            transferCasbox.removeAttr("disabled");
+            if (!statementGeneral.length) {
+                $('.expired-account-modal').find('.is-not-transfer').css('display','inline-block');
+                $('.expired-account-modal').find('.is-not-transfer').text("No tienes ninguna caja general abierta");
+                transferCasbox.attr("disabled", true);
+            }
+
+            $('.expired-account-modal').find('.is-not-balance').css('display','none');
+            $('.expired-account-modal').find('.is-not-balance').text("");
+            amountReal.removeAttr("disabled");
+            refBalance.removeAttr("disabled");
+
+            // Ajsuste de saldo
+            if (!(_.contains(self.statementConfig[0].statement_confirm_balance, self.resUser[0].id))) {
+                $('.expired-account-modal').find('.is-not-balance').css('display','inline-block');
+                $('.expired-account-modal').find('.is-not-balance').text("El usuario no tiene autorización para realizar ajuste de cierre.");
+                amountReal.attr("disabled", true);
+                refBalance.attr("disabled", true);
+            }
+
+            // Transferencia
+            if (!(_.contains(self.statementConfig[0].statement_confirm_transfer_user, self.resUser[0].id))){
+                $('.expired-account-modal').find('.is-not-transfer').css('display','inline-block');
+                $('.expired-account-modal').find('.is-not-transfer').text("El usuario no tiene autorización para realizar transferencia.");
+                transferCasbox.attr("disabled", true);
+            }
+
+            /* Amount Real .keyup*/
+            amountReal.keyup(function(e) {
+                if (e.key === currency.decimalSeparator && currency.decimalPlaces > 0)
+                    return false ;
+
+                var cashBoxAmount = instanceWeb.unFormatCurrency(amountCashbox.val());
+                var realAmount = instanceWeb.unFormatCurrency(amountReal.val());
+                var differenceAmount = (realAmount - cashBoxAmount);
+
+                amountReal.val(instanceWeb.formatCurrency(realAmount, currency));
+                amountDiffer.val(instanceWeb.formatCurrency(differenceAmount, currency));
+                amountOpen.val(instanceWeb.formatCurrency(realAmount, currency));
+                amountReal.css('border-color','#ccc');
+
+                amountDiffer.css('color','#555');
+                if (differenceAmount < 0)
+                    amountDiffer.css('color','red');
+
+                if (e.keyCode === 13)
+                    refBalance.focus();
+
+            });
+
+            amountReal.focusout(function(e) {
+                var realAmount = instanceWeb.unFormatCurrency(amountReal.val());
+                var cashBoxAmount = instanceWeb.unFormatCurrency(amountCashbox.val());
+
+                if ((realAmount <= 0) && !(_.contains(self.statementConfig[0].statement_confirm_negative_amount, self.resUser[0].id))) {
+                    instanceWeb.notification.do_warn("Atencion", "El valor de cierre debes de ser mayo que 0.");
+                    amountReal.css('border-color','red');
+                    amountReal.focus();
+                    return false;
+                }
+                if (realAmount !== cashBoxAmount)
+                    refBalance.val('')
+
+                var differenceAmount = (realAmount - cashBoxAmount);
+                amountDiffer.css('color','#555');
+                if (differenceAmount < 0 )
+                    amountDiffer.css('color','red');
+            });
+            /**
+            * [Transferencia]
+            */
+            transferCasbox.click(function(e){
+                var realAmount = instanceWeb.unFormatCurrency(amountReal.val());
+                amountOpen.val(instanceWeb.formatCurrency(realAmount,currency));
+                amountTransfer.val('0');
+
+                transferSelected = e.target;
+                selectedTrnasfer = false
+                cashboxTransfer.val('');
+                refTransfer.val("");
+                $('.expired-account-modal').find('.is-transfer-confirm').css('display','none');
+
+                if (this.checked) {
+                    $('.expired-account-modal').find('.is-transfer-confirm').css('display','flex');
+                    selectedTrnasfer = true;
+                    amountTransfer.val(instanceWeb.formatCurrency(realAmount,currency));
+                    amountOpen.val('0');
+                }
+            })
+
+            cashboxTransfer.change(function(e) {
+                var realAmount = instanceWeb.unFormatCurrency(amountReal.val());
+            })
+            /* amount transfer Keyup */
+            amountTransfer.keyup(function(e){
+                if (e.key === currency.decimalSeparator && currency.decimalPlaces > 0)
+                    return false ;
+
+                var realAmount = instanceWeb.unFormatCurrency(amountReal.val());
+                var transferAmount = instanceWeb.unFormatCurrency(amountTransfer.val());
+                var amount = (realAmount - transferAmount);
+
+                amountTransfer.val(instanceWeb.formatCurrency(transferAmount,currency));
+                amountOpen.val(instanceWeb.formatCurrency(amount,currency));
+
+                if (e.keyCode === 13)
+                    buttonSave.focus();
+            });
+            /* amount transfer focus */
+            amountTransfer.focusout(function(e) {
+                var realAmount = instanceWeb.unFormatCurrency(amountReal.val());
+                var transferAmount = instanceWeb.unFormatCurrency(amountTransfer.val());
+
+                if (transferAmount <= 0) {
+                    instanceWeb.notification.do_warn("Atencion", "El monto a transferir no puede ser 0");
+                    amountTransfer.css('border-color','red');
+                    amountTransfer.focus();
+                    return false;
+                }
+
+                if (transferAmount > realAmount){
+                    instanceWeb.notification.do_warn("Atencion", "El monto a transferir no puede superar el monto de cierre.");
+                    amountTransfer.css('border-color','red');
+                    amountTransfer.focus();
+                    return false;
+                }
+                amountTransfer.css('border-color','#ccc');
+
+                var amount = (realAmount - transferAmount);
+
+                // amountTransfer.val(instanceWeb.formatCurrency(transferAmount,currency));
+                amountOpen.val(instanceWeb.formatCurrency(amount,currency));
+            });
+
+            /*Click buttonSave*/
+            buttonSave.click(function(e) {
+                var cashBoxAmount = instanceWeb.unFormatCurrency(amountCashbox.val());
+                var realAmount = instanceWeb.unFormatCurrency(amountReal.val());
+                var transferAmount = instanceWeb.unFormatCurrency(amountTransfer.val());
+                var amount_negative =  _.contains(self.statementConfig[0].statement_confirm_negative_amount, self.resUser[0].id)
+
+                // amountReal
+                if ((realAmount <= 0) && (!amount_negative)) {
+                    instanceWeb.notification.do_warn("Atencion", "El valor de cierre debes de ser mayo que 0.");
+                    amountReal.css('border-color','red');
+                    amountReal.focus();
+                    return false;
+                }
+                amountReal.css('border-color','#ccc');
+
+                // refBalance
+                if ((!refBalance.val()) && (cashBoxAmount !== realAmount)) {
+                    instanceWeb.notification.do_warn("Atencion", "Debes de ingresar una observación para el ajuste de saldo de cierre.");
+                    refBalance.css('border-color','red');
+                    refBalance.focus();
+                    return false;
+                }
+                refBalance.css('border-color','#ccc');
+
+                if (!!selectedTrnasfer){
+                    /* cashboxTransfer */
+                    if (!cashboxTransfer.val()) {
+                        instanceWeb.notification.do_warn("Atencion", "Debes seleccionar una caja general.");
+                        cashboxTransfer.css('border-color','red');
+                        cashboxTransfer.focus();
+                        return false;
+                    }
+                    cashboxTransfer.css('border-color','#ccc');
+
+                    // amountTransfer
+                    if (transferAmount <= 0) {
+                        instanceWeb.notification.do_warn("Atencion", "El monto a transferir debe ser mayor a 0.");
+                        amountTransfer.css('border-color','red');
+                        amountTransfer.focus();
+                        return false;
+                    }
+                    if (transferAmount > realAmount){
+                        instanceWeb.notification.do_warn("Atencion", "El monto a transferir no puede superar el monto de cierre.");
+                        amountTransfer.css('border-color','red');
+                        amountTransfer.focus();
+                        return false;
+                    }
+                    amountTransfer.css('border-color','#ccc');
+
+                    /* refTransfer */
+                    if (!refTransfer.val()) {
+                        instanceWeb.notification.do_warn("Atencion", "Debes ingresar el motivo de la transferencia.");
+                        refTransfer.css('border-color','red');
+                        refTransfer.focus();
+                        return false;
+                    }
+                    refTransfer.css('border-color','#ccc');
+                }
+
+                cashBoxConfirm = {
+                    'statementId': self.id,
+                    'amountReal': realAmount,
+                    'refBalance': refBalance.val().trim(),
+                    'transfer': selectedTrnasfer,
+                    'statementTransfer': !!selectedTrnasfer ? parseInt(cashboxTransfer.val()) : '',
+                    'amountTransfer': !!selectedTrnasfer ? transferAmount : 0,
+                    'refTransfer': !!selectedTrnasfer ? refTransfer.val() : '',
+                }
+
+                /* Confirm Statement */
+                self.confirm_statement(cashBoxConfirm).then(function(resultsConfirm) {
+                    return resultsConfirm;
+                }).then(function(resultsConfirm) {
+                    self.reloadPage();
+                    self.removeModal(e);
+                    if (!resultsConfirm)
+                        results = false;
+                });
+
+                defer.resolve(results);
+
+            });
+
+            /* Click Cerrar */
+            $('.expired-account-modal').on('hidden.bs.modal', function(e) {
+                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 !== 'account.bank.statement')
+                    return;
+
+                openerp.parentInstanceStatementConfirm = this;
+
+                if (openerp.widgetInstanceStatementConfirm) {
+                    openerp.widgetInstanceStatementConfirm.updateId(record.id);
+                    if (this.$el.find('.button-statement-confirm').length !== 0 )
+                        return ;
+                }
+
+                if (this.$el.find('.button-statement-confirm').length !== 0 )
+                    return;
+
+                openerp.widgetInstanceStatementConfirm = new openerp.EiruStatementConfirm(this);
+                var element =this.$el.find('.oe_form').find('.eiru-statement-utility');
+
+                openerp.widgetInstanceStatementConfirm.appendTo(element[0]);
+                openerp.widgetInstanceStatementConfirm.updateId(record.id);
+            }
+        });
+    }
+})();

+ 337 - 0
static/src/js/eiru_statement_confirm_print.js

@@ -0,0 +1,337 @@
+(function() {
+
+    openerp.widgetInstanceStatementConfirmPrint = null;
+    openerp.parentInstanceStatementConfirmPrint = {};
+    var QWeb = openerp.web.qweb;
+    var instanceWeb = openerp.web;
+
+    openerp.EiruStatementConfirmPrint = openerp.Widget.extend({
+        template: 'EiruStatementUtility.ConfirmPrint',
+        id: undefined,
+        buttons: undefined,
+        statementConfirm: [],
+        /* init */
+        init: function(parent) {
+            this._super(parent);
+            this.buttons = parent.$buttons;
+        },
+        /* start */
+        start: function () {
+            var self = this
+            this.$el.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');
+            });
+        },
+        /* Actualizar Id de la visat actual  */
+        updateId: function(id) {
+            var self = this;
+            self.id = id;
+            self.$el.css('display','flex');
+            if(!id)
+                self.$el.css('display','none');
+        },
+        /* Reload Page*/
+        reloadPage: function() {
+             openerp.parentInstanceStatementConfirmPrint.reload();
+        },
+        removeModal: function() {
+            $('.expired-account-modal').remove();
+            $('.modal-backdrop').remove();
+        },
+        /* Método inicial */
+        fetchInitial: function() {
+            var self = this;
+            self.fetchCashboxStatementConfirm(self.id).then(function(statementConfirm) {
+                return statementConfirm;
+            }).then(function(statementConfirm) {
+                self.statementConfirm = statementConfirm;
+                if (!self.statementConfirm.length){
+                    instanceWeb.notification.do_warn("Atencion", "No existe resume de cierre de caja.");
+                    return  false;
+                }
+
+                return  self.printSelectedType();
+            });
+        },
+        /* Account bank Statement  Open*/
+        fetchCashboxStatementConfirm: function(id) {
+            var statementConfirm = new instanceWeb.Model('cashbox.statement.confirm');
+            return statementConfirm.call('get_cashbox_statement_confirm',[id], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /*print select type */
+        printSelectedType: function(){
+            var self = this;
+            var modal = QWeb.render('ModalStatementUtility.ConfirmPrint');
+            $('.openerp_webclient_container').after(modal);
+            $('.expired-account-modal').modal();
+
+            var printTicket =  $('.expired-account-modal').find('.print-ticket');
+            var printNormal =  $('.expired-account-modal').find('.print-normal');
+
+            /* print Ticket */
+            printTicket.click(function(e){
+                self.drawPdfConfirmStatementTicket();
+                self.removeModal(e);
+            });
+
+            /*print Normal */
+            printNormal.click(function(e){
+                self.drawPdfConfirmStatementNormal();
+                self.removeModal(e);
+            });
+
+            $('.openerp_webclient_container').after(modal);
+            $('.expired-account-modal').modal();
+            $('.expired-account-modal').on('hidden.bs.modal', function(e) {
+                self.removeModal(e);
+            });
+        },
+        /* pdf normal */
+        drawPdfConfirmStatementNormal: function() {
+            var self = this;
+            var pdfDoc = new jsPDF();
+            var statementConfirm = self.statementConfirm[0];
+
+            if (!statementConfirm) {
+                return false
+            }
+
+            var currency = statementConfirm.statement.currencystatement;
+            var y = 0;
+            var space = 7;
+            y = 15;
+            pdfDoc.setFontSize('15');
+            pdfDoc.setFontStyle('bold');
+            pdfDoc.text(105,y, pdfDoc.splitTextToSize(statementConfirm.statement.name, 180) , null, null, 'center');
+
+            y += space;
+            pdfDoc.setFontSize('12');
+            pdfDoc.setFontStyle('normal');
+            pdfDoc.text(105,y, pdfDoc.splitTextToSize(statementConfirm.statement.typeStatementName, 180) , null, null, 'center');
+
+            y += space;
+            pdfDoc.setFontStyle('bold');
+            pdfDoc.text(70,y, 'Fecha de apertura:');
+            pdfDoc.setFontStyle('normal');
+            pdfDoc.text(110,y, moment(statementConfirm.statement.dateOpen).format('DD-MM-YYYY'));
+
+            y += space;
+            pdfDoc.text(70,y, 'Fecha de cierre:');
+            pdfDoc.setFontStyle('normal');
+            pdfDoc.text(110, y, moment(statementConfirm.statement.dateConfirm).format('DD-MM-YYYY'));
+
+            y += space;
+            pdfDoc.setFontSize('12');
+            pdfDoc.setFontStyle('bold');
+            pdfDoc.text(70,y, 'Moneda:');
+            pdfDoc.setFontStyle('normal');
+            pdfDoc.text(110, y, currency.name);
+
+            var transferAmount = 0;
+            _.each(statementConfirm.transferCasBox, function(item){
+                transferAmount += item.amount
+            });
+            /* Table */
+            var getColumns = [
+                {
+                    'title': 'Operación ',
+                    'dataKey': 'ref'
+                },
+                {
+                    'title': 'Monto',
+                    'dataKey': 'amount'
+                }
+            ]
+            rowsPdf = [
+                {
+                    'ref': 'Saldo teórico de cierre',
+                    'amount': accounting.formatNumber(statementConfirm.amountStatement, currency.decimalPlaces, currency.thousandsSeparator, currency.decimalSeparator)
+                },
+                {
+                    'ref': 'Saldo real de cierre',
+                    'amount': accounting.formatNumber(statementConfirm.amountReal, currency.decimalPlaces, currency.thousandsSeparator, currency.decimalSeparator)
+                },
+                {
+                    'ref': 'Diferencia de cierre',
+                    'amount': accounting.formatNumber(statementConfirm.amountDifference, currency.decimalPlaces, currency.thousandsSeparator, currency.decimalSeparator)
+                },
+                {
+                    'ref': 'Transferencia a caja general ',
+                    'amount': accounting.formatNumber(transferAmount, currency.decimalPlaces, currency.thousandsSeparator, currency.decimalSeparator)
+                },
+                {
+                    'ref': 'Reserva para la próxima apertura',
+                    'amount': accounting.formatNumber(statementConfirm.amountNextOpen, currency.decimalPlaces, currency.thousandsSeparator, currency.decimalSeparator)
+                }
+
+            ]
+
+            pdfDoc.autoTable(getColumns, rowsPdf, {
+                theme: 'grid',
+                startY: 50,
+                columnStyles: {
+                    amount : {halign:'right' },
+                },
+                margin: { top: 5, horizontal: 20},
+            });
+
+            /* FOOTER */
+            y += 100;
+            pdfDoc.setFontSize('12');
+            pdfDoc.setFontStyle('normal');
+            pdfDoc.text(50,y,  pdfDoc.splitTextToSize('.......................................................', 180) , null, null, 'center');
+            pdfDoc.text(150,y, pdfDoc.splitTextToSize('.......................................................', 180) , null, null, 'center');
+            y +=5;
+            pdfDoc.setFontStyle('bold');
+            pdfDoc.text(50,y, pdfDoc.splitTextToSize(statementConfirm.userStatementName, 180) , null, null, 'center');
+            pdfDoc.text(150,y, pdfDoc.splitTextToSize(statementConfirm.userConfirmName, 180) , null, null, 'center');
+            y +=5;
+            pdfDoc.setFontSize('9');
+            pdfDoc.setFontStyle('normal');
+            pdfDoc.text(50,y, pdfDoc.splitTextToSize('Responsable de la caja ', 180) , null, null, 'center');
+            pdfDoc.text(150,y, pdfDoc.splitTextToSize('Responsable del cierre ', 180) , null, null, 'center');
+            /* Guardar */
+            pdfDoc.save('RESUME DE CAJA '+statementConfirm.name.toUpperCase()+'.pdf');
+            return true;
+        },
+        /* pdf ticket */
+        drawPdfConfirmStatementTicket: function () {
+            var self = this;
+            var pdfDoc = new jsPDF({
+                      orientation: 'p',
+                      unit: 'mm',
+                      format: [70, 297]
+                    })
+
+            var statementConfirm = self.statementConfirm[0];
+
+            if (!statementConfirm)
+                return false
+
+            var currency = statementConfirm.statement.currencystatement;
+            var transferAmount = 0;
+            _.each(statementConfirm.transferCasBox, function(item){
+                transferAmount += item.amount
+            });
+            rowsPdf = [
+                {
+                    'ref': 'Saldo teórico de cierre',
+                    'amount': accounting.formatNumber(statementConfirm.amountStatement, currency.decimalPlaces, currency.thousandsSeparator, currency.decimalSeparator)
+                },
+                {
+                    'ref': 'Saldo real de cierre',
+                    'amount': accounting.formatNumber(statementConfirm.amountReal, currency.decimalPlaces, currency.thousandsSeparator, currency.decimalSeparator)
+                },
+                {
+                    'ref': 'Diferencia de cierre',
+                    'amount': accounting.formatNumber(statementConfirm.amountDifference, currency.decimalPlaces, currency.thousandsSeparator, currency.decimalSeparator)
+                },
+                {
+                    'ref': 'Transferencia a caja general ',
+                    'amount': accounting.formatNumber(transferAmount, currency.decimalPlaces, currency.thousandsSeparator, currency.decimalSeparator)
+                },
+                {
+                    'ref': 'Reserva para la próxima apertura',
+                    'amount': accounting.formatNumber(statementConfirm.amountNextOpen, currency.decimalPlaces, currency.thousandsSeparator, currency.decimalSeparator)
+                }
+            ]
+
+            var y = 0;
+            var space = 7;
+            y = 4;
+            pdfDoc.setFontSize('14');
+            pdfDoc.setFontStyle('bold');
+            pdfDoc.text(30,y, pdfDoc.splitTextToSize(statementConfirm.statement.name, 70) , null, null, 'center');
+            y += space;
+            pdfDoc.setFontSize('12');
+            pdfDoc.setFontStyle('normal');
+            pdfDoc.text(30,y, pdfDoc.splitTextToSize(statementConfirm.statement.typeStatementName, 180) , null, null, 'center');
+            pdfDoc.setFontSize('9');
+            y += space;
+            pdfDoc.text(4,y, 'Fecha de apertura:');
+            pdfDoc.setFontStyle('normal');
+            pdfDoc.text(38,y, moment(statementConfirm.statement.dateOpen).format('DD-MM-YYYY'));
+            y += space;
+            pdfDoc.text(4,y, 'Fecha de cierre:');
+            pdfDoc.setFontStyle('normal');
+            pdfDoc.text(38, y, moment(statementConfirm.statement.dateConfirm).format('DD-MM-YYYY'));
+            y += space;
+            pdfDoc.text(4,y, 'Moneda:');
+            pdfDoc.setFontStyle('normal');
+            pdfDoc.text(38, y, currency.name);
+            y += space;
+            pdfDoc.text(2, y, "==============================");
+            _.each(rowsPdf, function(item){
+                y += 5;
+                pdfDoc.text(3, y, item.ref);
+                y += 5;
+                var x = (40 - item.amount.length)
+                pdfDoc.text(x, y, item.amount);
+            });
+            y += 5;
+            pdfDoc.text(2, y, "==============================");
+            /* FOOTER */
+            y += 20;
+            pdfDoc.text(30,y,  pdfDoc.splitTextToSize('.........................................', 70) , null, null, 'center');
+            y+= 5;
+            pdfDoc.text(30,y, pdfDoc.splitTextToSize(statementConfirm.userStatementName, 70) , null, null, 'center');
+            y+= 5;
+            pdfDoc.text(30,y, pdfDoc.splitTextToSize('Responsable de la caja ', 70) , null, null, 'center');
+
+            y+= 20;
+            pdfDoc.text(30,y,  pdfDoc.splitTextToSize('.........................................', 70) , null, null, 'center');
+            y+= 5;
+            pdfDoc.text(30,y, pdfDoc.splitTextToSize(statementConfirm.userConfirmName, 180) , null, null, 'center');
+            y+= 5;
+            pdfDoc.text(30,y, pdfDoc.splitTextToSize('Responsable del cierre ', 180) , null, null, 'center');
+            // /* Guardar */
+            pdfDoc.save('RESUME DE CAJA '+statementConfirm.name.toUpperCase()+'.pdf');
+            return true;
+        },
+
+    });
+
+    if (openerp.web && openerp.web.FormView) {
+        openerp.web.FormView.include({
+            load_record: function(record) {
+                this._super.apply(this, arguments);
+
+                if (this.model !== 'account.bank.statement')
+                    return;
+
+                openerp.parentInstanceStatementConfirmPrint = this;
+
+                if (openerp.widgetInstanceStatementConfirmPrint) {
+                    openerp.widgetInstanceStatementConfirmPrint.updateId(record.id);
+                    if (this.$el.find('.button-statement-confirm-print').length !== 0 )
+                        return ;
+                }
+
+                if (this.$el.find('.button-statement-confirm-print').length !== 0 )
+                    return;
+
+                openerp.widgetInstanceStatementConfirmPrint = new openerp.EiruStatementConfirmPrint(this);
+                var element =this.$el.find('.oe_form').find('.eiru-statement-print');
+
+                openerp.widgetInstanceStatementConfirmPrint.appendTo(element[0]);
+                openerp.widgetInstanceStatementConfirmPrint.updateId(record.id);
+            }
+        });
+    }
+})();

+ 40 - 0
static/src/js/eiru_statement_init.js

@@ -0,0 +1,40 @@
+(function() {
+    openerp.widgetInstanceStatementInit = null;
+    openerp.parentInstanceStatementInit = {};
+    var QWeb = openerp.web.qweb;
+    var instanceWeb = openerp.web;
+    // Abrir caja
+    openerp.EiruStatementInit = openerp.Widget.extend({
+        id: undefined,
+        sidebar: undefined,
+        /* init */
+        init: function(parent) {
+            this._super(parent);
+            this.sidebar = parent.$sidebar;
+        },
+        /* Actualizar Id de la visat actual  */
+        updateId: function() {
+            var self = this;
+            this.sidebar.css('display', 'none')
+        },
+    });
+
+    if (openerp.web && openerp.web.FormView) {
+        openerp.web.FormView.include({
+            load_record: function(record) {
+                this._super.apply(this, arguments);
+
+                if (this.model !== 'account.bank.statement')
+                    return;
+
+                openerp.parentInstanceStatementInit = this;
+                if (openerp.widgetInstanceStatementInit) {
+                    openerp.widgetInstanceStatementInit.updateId();
+                    return ;
+                }
+                openerp.widgetInstanceStatementInit = new openerp.EiruStatementInit(this);
+                openerp.widgetInstanceStatementInit.updateId();
+            }
+        });
+    }
+})();

+ 123 - 0
static/src/js/eiru_statement_open.js

@@ -0,0 +1,123 @@
+(function() {
+    openerp.widgetInstanceStatementOpen = null;
+    openerp.parentInstanceStatementOpen = {};
+    var QWeb = openerp.web.qweb;
+    var instanceWeb = openerp.web;
+    // Abrir caja
+    openerp.EiruStatementOpen = openerp.Widget.extend({
+        template: 'EiruStatementUtility.Open',
+        id: undefined,
+        buttons: undefined,
+        bankStatement: [],
+        statementConfig: [],
+        /* init */
+        init: function(parent) {
+            this._super(parent);
+            this.buttons = parent.$buttons;
+        },
+        /* start */
+        start: function () {
+            var self = this
+            this.$el.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');
+            });
+        },
+        /* Actualizar Id de la visat actual  */
+        updateId: function(id) {
+            var self = this;
+            self.id = id;
+            self.$el.css('display','flex');
+            if(!id)
+                self.$el.css('display','none');
+        },
+        /* Reload Page*/
+        reloadPage: function() {
+             openerp.parentInstanceStatementOpen.reload();
+        },
+        /* Método inicial */
+        fetchInitial: function() {
+            var self = this;
+            self.fetchBankStatement(self.id).then(function(bankStatement) {
+                return bankStatement;
+            }).then(function(bankStatement) {
+                self.bankStatement = bankStatement;
+                return self.fetchStatementConfig();
+            }).then(function(statementConfig) {
+                self.statementConfig = statementConfig;
+                
+                if (!!self.statementConfig.length && !!self.bankStatement.length) {
+                    if(!self.statementConfig[0].statement_open_config) {
+                        instanceWeb.notification.do_warn("Atencion", "Ya existe caja abierta.");
+                        return  false;
+                    }
+                }
+                return self.statementOpenCashbox(self.id);
+            }).then(function() {
+                self.reloadPage();
+            });
+        },
+        /* Account bank Statement  Open*/
+        fetchBankStatement: function(id) {
+            var bankStatement = new instanceWeb.Model('account.bank.statement');
+            return bankStatement.call('get_account_bank_statement_open',[id], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /* statement Config */
+        fetchStatementConfig: function() {
+            var fields = ['id','name','statement_open_config'];
+            var domain = [['active', '=', true]];
+            var statementConfig = new openerp.web.Model('account.bank.statement.config');
+            return statementConfig.query(fields).filter(domain).all();
+        },
+        /* Open cashBox */
+        statementOpenCashbox: function(id) {
+            var bankStatement = new instanceWeb.Model('account.bank.statement');
+            return bankStatement.call('account_bank_statement_open_cashbox',[id], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+    });
+
+    if (openerp.web && openerp.web.FormView) {
+        openerp.web.FormView.include({
+            load_record: function(record) {
+                this._super.apply(this, arguments);
+
+                if (this.model !== 'account.bank.statement')
+                    return;
+
+                openerp.parentInstanceStatementOpen = this;
+
+                if (openerp.widgetInstanceStatementOpen) {
+                    openerp.widgetInstanceStatementOpen.updateId(record.id);
+                    if (this.$el.find('.button-statement-open').length !== 0 )
+                        return ;
+                }
+
+                if (this.$el.find('.button-statement-open').length !== 0 )
+                    return;
+
+                openerp.widgetInstanceStatementOpen = new openerp.EiruStatementOpen(this);
+                var element =this.$el.find('.oe_form').find('.eiru-statement-utility-open');
+
+                openerp.widgetInstanceStatementOpen.appendTo(element[0]);
+                openerp.widgetInstanceStatementOpen.updateId(record.id);
+            }
+        });
+    }
+})();

+ 353 - 0
static/src/js/eiru_statement_transfer.js

@@ -0,0 +1,353 @@
+(function() {
+
+    openerp.widgetInstanceStatementTransfer = null;
+    openerp.parentInstanceStatementTransfer = {};
+    var QWeb = openerp.web.qweb;
+    var instanceWeb = openerp.web;
+
+    openerp.EiruStatementTransfer = openerp.Widget.extend({
+        template: 'EiruStatementUtility.Transfer',
+        id: undefined,
+        buttons: undefined,
+        bankStatement: [],
+        accountJournal :[],
+        statementOpen: [],
+        /** config */
+        statementConfig: [],
+        resUser: [],
+        statementUser: [],
+        /* init */
+        init: function(parent) {
+            this._super(parent);
+            this.buttons = parent.$buttons;
+        },
+        /* start */
+        start: function () {
+            var self = this
+            this.$el.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');
+            });
+        },
+        /* Actualizar Id de la visat actual  */
+        updateId: function(id) {
+            var self = this;
+            self.id = id;
+        },
+        /* Reload Page*/
+        reloadPage: function() {
+             openerp.parentInstanceStatementTransfer.reload();
+        },
+        /* Description: Función para remover el modal */
+        removeModal: function() {
+            $('.expired-account-modal').remove();
+            $('.modal-backdrop').remove();
+        },
+        /*Get User*/
+        fetchGetUserLogin: function(){
+            var bankStatementUser = new instanceWeb.Model('account.bank.statement');
+            return bankStatementUser.call('eiru_transfers_get_user', {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /* statement Config */
+        fetchStatementConfigTransfer: function() {
+            var fields = ['id','name','transfer_user_ids','transfer_statement_ids','transfer_negative_amount'];
+            var domain = [['active', '=', true]];
+            var statementConfig = new openerp.web.Model('account.bank.statement.config');
+            return statementConfig.query(fields).filter(domain).all();
+        },
+        /* Método inicial */
+        fetchInitial: function() {
+            var self = this;
+            self.fetchBankStatement(self.id).then(function(bankStatement) {
+                return bankStatement;
+            }).then(function(bankStatement) {
+                self.bankStatement = bankStatement;
+                return self.fetchStatementConfigTransfer();
+            }).then(function(statementConfig){
+                self.statementConfig = statementConfig;
+                return self.fetchGetUserLogin();
+            }).then(function(resUser) {
+                self.resUser = resUser;
+                if (!self.statementConfig.length){
+                    instanceWeb.notification.do_warn("Atencion", "No estas autorizado a realizar transferencia, no existe configuración de caja.");
+                    return  false;
+                }
+                if (!self.resUser.length) {
+                    instanceWeb.notification.do_warn("Atencion", "No estas autorizado a realizar transferencia.");
+                    return  false;
+                }
+                // if (!!self.statementConfig.length && !!self.resUser.length && !!self.bankStatement.length) {
+                if (!!self.bankStatement.length) {
+                    var statementConfig = self.statementConfig[0];
+                    var resUser = self.resUser[0];
+                    var statementUser = self.bankStatement[0];
+                    /*  Verificar si el tipo caja tiene permiso para la transferencia */
+                    if (!(_.contains(statementConfig.transfer_statement_ids, statementUser.typeStatement))) {
+                        instanceWeb.notification.do_warn("Atencion", "El tipo de caja no tiene autorización para realizar transferencia.");
+                        return  false;
+                    }
+                    /* Verificar si el usuario tiene permiso para la transferencia*/
+                    if (!(_.contains(statementConfig.transfer_user_ids, resUser.id))) {
+                        instanceWeb.notification.do_warn("Atencion", "El usuario no tiene autorización para realizar transferencia.");
+                        return false;
+                    }
+                }
+
+                if (self.bankStatement[0].amount <= 0) {
+                    if (!self.statementConfig.length){
+                        instanceWeb.notification.do_warn("Atencion", "Caja sin saldo.");
+                        return false;
+                    }
+                    if (!self.statementConfig[0].transfer_negative_amount){
+                        instanceWeb.notification.do_warn("Atencion", "Caja sin saldo.");
+                        return false;
+                    }
+                }
+                self.fetchAccountJournal(self.id).then(function(accountJournal) {
+                    return accountJournal;
+                }).then(function(accountJournal) {
+                    self.accountJournal = accountJournal;
+                    if (!accountJournal[0].statementJournal.length){
+                        instanceWeb.notification.do_warn("Atencion", "No tienes otra caja abierta para realizar la transferencia.");
+                        return false;
+                    }
+
+                    return self.showModalTransfer();
+                });
+            });
+        },
+        /* Account bank Statement */
+        fetchBankStatement: function(id) {
+            var bankStatement = new instanceWeb.Model('account.bank.statement');
+            return bankStatement.call('get_account_bank_statement_utility',[id], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /* Account Journal*/
+        fetchAccountJournal: function(id) {
+            var accountJournal = new instanceWeb.Model('account.bank.statement');
+            return accountJournal.call('get_account_journal_utility',[id], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /* Get statement Journal */
+        getStatementJournal(id) {
+            var self = this;
+            var journal = _.filter(self.accountJournal, function(item) {
+                return  item.id === id ;
+            });
+            return _.flatten(_.map(journal, function(map) {
+                return map.statementJournal;
+            }));
+        },
+        /* Save Statement transfer */
+        statementCompletTransfers: function(values) {
+            var bankStatementTransfer = new instanceWeb.Model('account.bank.statement');
+            return bankStatementTransfer.call('statement_complet_transfers',[values], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /*Modal  Transfer */
+        showModalTransfer: function() {
+            var self = this;
+            var defer =$.Deferred();
+            var results = true;
+            var accountJournal =  self.accountJournal;
+
+            accountJournal.unshift({'name': '', 'id': ''});
+
+            var modal = QWeb.render('ModalStatementUtility.Transfer',{
+                'journal': accountJournal
+            });
+
+            $('.openerp_webclient_container').after(modal);
+            $('.expired-account-modal').modal();
+
+
+            var statementAmount = $('.expired-account-modal').find('.statement-amount');
+            var statementAmountSymbol = $('.expired-account-modal').find('.statement-amount-symbol');
+            var selectedJournal = $('.expired-account-modal').find('.selected-Journal');
+            var statementOpen = $('.expired-account-modal').find('.statement-open-selected');
+            var amountTransfer = $('.expired-account-modal').find('.amount-transfer');
+            var amountTransferSymbol = $('.expired-account-modal').find('.amount-transfer-symbol');
+            var refTransfer = $('.expired-account-modal').find('.ref-transfer');
+            /* Button */
+            var buttonSave = $('.expired-account-modal').find('.button-save');
+            var currency = self.bankStatement[0].currencystatement;
+
+            /* Monto */
+            statementAmount.val(instanceWeb.formatCurrency(self.bankStatement[0].amount,currency));
+            /* Symbol */
+            statementAmountSymbol.text(currency.symbol);
+            amountTransferSymbol.text(currency.symbol);
+            /*select Journal */
+            selectedJournal.focus();
+            selectedJournal.change(function(e) {
+            statementOpen.empty();
+
+                var statementJournal = self.getStatementJournal(parseInt(selectedJournal.val()));
+                if (!!statementJournal.length)
+                    statementOpen.append('<option value=""></option>');
+
+                _.each(statementJournal, function(item) {
+                    statementOpen.append('<option value="' + item.id + '">' + item.statementname + '</option>');
+                });
+            });
+            /* amountTransfer.keyup */
+            amountTransfer.keyup(function(e) {
+                if (e.key === currency.decimalSeparator && currency.decimalPlaces > 0)
+                    return false ;
+
+                var amount = instanceWeb.unFormatCurrency(amountTransfer.val());
+                amount = instanceWeb.formatCurrency(amount,currency)
+                amountTransfer.val(amount);
+
+                amountTransfer.css('border-color','#ccc');
+
+                if (e.keyCode === 13)
+                    refTransfer.focus();
+            });
+            /* amountTransfer.focusout*/
+            amountTransfer.focusout(function(e) {
+                var amountAvailable = instanceWeb.unFormatCurrency(statementAmount.val());
+                var amount = Math.abs(instanceWeb.unFormatCurrency(amountTransfer.val()));
+
+                if (amountAvailable < amount && !self.statementConfig[0].transfer_negative_amount) {
+                    instanceWeb.notification.do_warn("Atencion", "El valor a transferir supera el saldo disponible de la caja.");
+                    amountTransfer.css('border-color','red');
+                    amountTransfer.focus();
+                    return false;
+                }
+                amountTransfer.css('border-color','#ccc');
+                amountTransfer.val(instanceWeb.formatCurrency(amount,currency))
+            });
+            /* Click buttonSave */
+            buttonSave.click(function(e){
+                var amountAvailable = instanceWeb.unFormatCurrency(statementAmount.val());
+                var amount = instanceWeb.unFormatCurrency(amountTransfer.val());
+
+                /* Journal */
+                if (!selectedJournal.val()) {
+                    instanceWeb.notification.do_warn("Atencion", "Debes seleccionar un tipo de pago para continuar.");
+                    selectedJournal.css('border-color','red');
+                    selectedJournal.focus();
+                    return false;
+                }
+                selectedJournal.css('border-color','#ccc');
+                /* Statement Open */
+                if (!statementOpen.val()) {
+                    instanceWeb.notification.do_warn("Atencion", "Debes seleccionar la caja donde vas a transferir.");
+                    statementOpen.css('border-color','red');
+                    statementOpen.focus();
+                    return false;
+                }
+                statementOpen.css('border-color','#ccc');
+
+                /* ammount transfer*/
+                if (amount <= 0.00) {
+                    instanceWeb.notification.do_warn("Atencion", "El valor a transferir debe ser mayor a cero.");
+                    amountTransfer.css('border-color','red');
+                    amountTransfer.focus();
+                    return false;
+                }
+
+                if (amountAvailable < amount) {
+                    if (!self.statementConfig.length){
+                        instanceWeb.notification.do_warn("Atencion", "El valor a transferir supera el saldo disponible de la caja .");
+                        amountTransfer.css('border-color','red');
+                        amountTransfer.focus();
+                        return false;
+                    }
+                    if (!self.statementConfig[0].transfer_negative_amount){
+                        instanceWeb.notification.do_warn("Atencion", "El valor a transferir supera el saldo disponible de la caja .");
+                        amountTransfer.css('border-color','red');
+                        amountTransfer.focus();
+                        return false;
+                    }
+                }
+                amountTransfer.css('border-color','#ccc');
+                /* Ref transfer */
+                if (!refTransfer.val()) {
+                    instanceWeb.notification.do_warn("Atencion", "Debes de ingresar un motivo para la transferencia.");
+                    refTransfer.css('border-color','red');
+                    refTransfer.focus();
+                    return false;
+                }
+                refTransfer.css('border-color','#ccc');
+
+                statementTransfer = {
+                    'statementOriginId': self.bankStatement[0].id,
+                    'statementDestinyId': parseInt(statementOpen.val()),
+                    'amountTransfer': amount,
+                    'refTransfer': refTransfer.val().trim(),
+                    'journalID': parseInt(selectedJournal.val())
+                }
+
+                /* Save Payments */
+                self.statementCompletTransfers(statementTransfer).then(function(resultsTransfer) {
+                    return resultsTransfer;
+                }).then(function(resultsTransfer) {
+                    self.reloadPage();
+                    self.removeModal(e);
+                    if (!resultsTransfer)
+                        results = false;
+                });
+
+                defer.resolve(results);
+
+            });
+
+            /* Click Cerrar */
+            $('.expired-account-modal').on('hidden.bs.modal', function(e) {
+                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 !== 'account.bank.statement')
+                    return;
+
+                openerp.parentInstanceStatementTransfer = this;
+
+                if (openerp.widgetInstanceStatementTransfer) {
+                    openerp.widgetInstanceStatementTransfer.updateId(record.id);
+                    if (this.$el.find('.button-statement-transfer').length !== 0 )
+                        return ;
+                }
+
+                if (this.$el.find('.button-statement-transfer').length !== 0 )
+                    return;
+
+                openerp.widgetInstanceStatementTransfer = new openerp.EiruStatementTransfer(this);
+                var element =this.$el.find('.oe_form').find('.eiru-statement-utility');
+
+                openerp.widgetInstanceStatementTransfer.appendTo(element[0]);
+                openerp.widgetInstanceStatementTransfer.updateId(record.id);
+            }
+        });
+    }
+})();

+ 300 - 0
static/src/js/eiru_statement_transfer_deleted.js

@@ -0,0 +1,300 @@
+(function() {
+
+    openerp.widgetInstanceStatementTransferDeleted = null;
+    openerp.parentInstanceStatementTransferDeleted = {};
+    var QWeb = openerp.web.qweb;
+    var instanceWeb = openerp.web;
+
+    openerp.EiruStatementTransferDeleted = openerp.Widget.extend({
+        template: 'EiruStatementUtility.TransferDeleted',
+        id: undefined,
+        buttons: undefined,
+        bankStatement: [],
+        resUser: [],
+        statementConfig: [],
+        cashBoxTransfer: [],
+        /* init */
+        init: function(parent) {
+            this._super(parent);
+            this.buttons = parent.$buttons;
+        },
+        /* start */
+        start: function () {
+            var self = this
+            this.$el.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');
+            });
+        },
+        /* Actualizar Id de la visat actual  */
+        updateId: function(id) {
+            var self = this;
+            self.id = id;
+        },
+        /* Reload Page*/
+        reloadPage: function() {
+             openerp.parentInstanceStatementTransferDeleted.reload();
+        },
+        /* Description: Función para remover el modal */
+        removeModal: function() {
+            $('.expired-account-modal').remove();
+            $('.modal-backdrop').remove();
+        },
+        /*Get User*/
+        fetchGetUserLogin: function(){
+            var bankStatementUser = new instanceWeb.Model('account.bank.statement');
+            return bankStatementUser.call('eiru_transfers_get_user', {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /* statement Config */
+        fetchStatementConfigTransfer: function() {
+            var fields = ['id', 'name', 'delete_transfer_user_ids'];
+            var domain = [['active', '=', true]];
+            var statementConfig = new openerp.web.Model('account.bank.statement.config');
+            return statementConfig.query(fields).filter(domain).all();
+        },
+        /* Método inicial */
+        fetchInitial: function() {
+            var self = this;
+            self.fetchBankStatement(self.id).then(function(bankStatement) {
+                return bankStatement;
+            }).then(function(bankStatement) {
+                self.bankStatement = bankStatement;
+                return self.fetchStatementConfigTransfer();
+            }).then(function(statementConfig){
+                self.statementConfig = statementConfig;
+                return self.fetchGetUserLogin();
+            }).then(function(resUser) {
+                self.resUser = resUser;
+                if (!self.statementConfig.length){
+                    instanceWeb.notification.do_warn("Atencion", "No estas autorizado a realizar esta operación, no existe configuración de caja.");
+                    return  false;
+                }
+                if (!self.resUser.length){
+                    instanceWeb.notification.do_warn("Atencion", "No estas autorizado a realizar esta operación.");
+                    return  false;
+                }
+                if (!self.bankStatement.length) {
+                    instanceWeb.notification.do_warn("Atencion", "No estas autorizado a realizar esta operación.");
+                    return  false;
+                }
+
+                if (!(_.contains(self.statementConfig[0].delete_transfer_user_ids, self.resUser[0].id))){
+                    instanceWeb.notification.do_warn("Atencion", "El usuario no tiene autorización para eliminar las transferencia.");
+                    return false;
+                }
+                self.fetchCashBoxTransfer(self.id).then(function(cashBoxTransfer){
+                    return cashBoxTransfer;
+                }).then(function(cashBoxTransfer){
+                    self.cashBoxTransfer = cashBoxTransfer;
+                    if (!self.cashBoxTransfer.length) {
+                        instanceWeb.notification.do_warn("Atencion", "La caja no tiene ninguna transferencia.");
+                        return false;
+                    }
+                    return self.showModalTransfer();
+                })
+            });
+        },
+        /* Account bank Statement */
+        fetchBankStatement: function(id) {
+            var bankStatement = new instanceWeb.Model('account.bank.statement');
+            return bankStatement.call('get_account_bank_statement_utility',[id], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /* cash_box_transfer*/
+        fetchCashBoxTransfer: function(id) {
+            var cashBoxTransfer = new instanceWeb.Model('account.bank.statement');
+            return cashBoxTransfer.call('eiru_transfers_get_chas_box_transfer',[id], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /*filter line transfer selected*/
+        filterRowTransfer: function(id){
+            var self = this;
+            return _.filter(self.cashBoxTransfer, function(item){
+                return item.id === id;
+            });
+        },
+        /*Modal  Transfer */
+        showModalTransfer: function() {
+            var self = this;
+            var defer =$.Deferred();
+            var results = true;
+            var rowSelected = [];
+
+            var modal = QWeb.render('ModalStatementUtility.TransferDeleted',{
+                cashBoxTransfer: self.cashBoxTransfer
+            });
+
+            $('.openerp_webclient_container').after(modal);
+            $('.expired-account-modal').modal();
+
+            var statementOutput = $('.expired-account-modal').find('.statement-output');
+            var statementInput = $('.expired-account-modal').find('.statement-input');
+            var transferRef = $('.expired-account-modal').find('.transfer-ref');
+            var transferAmount = $('.expired-account-modal').find('.transfer-amount');
+            var transferAmountSymbol = $('.expired-account-modal').find('.transfer-amount-symbol');
+            var refTransferDeleted = $('.expired-account-modal').find('.ref-transfer-deleted');
+            /* Table */
+            var tableRow = $('.expired-account-modal').find('.table-tbody').find('tr');
+            var buttonDeleted = $('.expired-account-modal').find('.button-deleted')
+
+            buttonDeleted.attr("disabled", true);
+            refTransferDeleted.attr("disabled", true);
+
+            /* Seleccionar  fila */
+            tableRow.click(function (e) {
+                row_export = $(e.target);
+
+                buttonDeleted.attr("disabled", true);
+                refTransferDeleted.attr("disabled", true);
+                tableRow.removeClass('table-row-select');
+                $(e.target).closest('tr').addClass('table-row-select');
+
+                var idRow = parseInt(($(e.target).closest('tr').children()[0].textContent).trim())
+                rowSelected = self.filterRowTransfer(idRow).shift();
+
+                statementOutput.val('')
+                statementInput.val('')
+                transferRef.val('')
+                transferAmount.val(0)
+                transferAmountSymbol.text("")
+                refTransferDeleted.val('')
+
+                if (!rowSelected){
+                    tableRow.removeClass('table-row-select');
+                    return false;
+                }
+
+                if ( rowSelected.outputStatement.typeJournal === 'cash' ) {
+                    if (rowSelected.outputStatement.state !== 'open') {
+                        instanceWeb.notification.do_warn("Atencion", "No podes continuar con esa operación, la caja origen no esta abierta");
+                        tableRow.removeClass('table-row-select');
+                        return false;
+                    }
+                    if (rowSelected.inputStatement.state !== 'open')  {
+                        instanceWeb.notification.do_warn("Atencion", "No podes continuar con esa operación, la caja destino no esta abierta");
+                        tableRow.removeClass('table-row-select');
+                        return false;
+                    }
+                }
+
+                if ( rowSelected.outputStatement.typeJournal === 'bank' ){
+                    if (rowSelected.outputStatement.state === 'confirm'){
+                        instanceWeb.notification.do_warn("Atencion", "No podes continuar con esa operación, la caja origen no esta abierta");
+                        tableRow.removeClass('table-row-select');
+                        return false;
+                    }
+                    if (rowSelected.inputStatement.state === 'confirm') {
+                        instanceWeb.notification.do_warn("Atencion", "No podes continuar con esa operación, la caja destino no esta abierta");
+                        tableRow.removeClass('table-row-select');
+                        return false;
+                    }
+                }
+
+                statementOutput.val(rowSelected.outputStatement.name)
+                statementInput.val(rowSelected.inputStatement.name)
+                transferRef.val(rowSelected.ref)
+                transferAmount.val(accounting.formatNumber(rowSelected.amount, rowSelected.outputStatement.currency.decimalPlaces, rowSelected.outputStatement.currency.thousandsSeparator,rowSelected.outputStatement.currency.decimalSeparator))
+                transferAmountSymbol.text(rowSelected.outputStatement.currency.symbol)
+                refTransferDeleted.val('')
+                buttonDeleted.removeAttr("disabled");
+                refTransferDeleted.removeAttr("disabled");
+                refTransferDeleted.focus();
+            });
+
+            buttonDeleted.click(function(e) {
+                if (!refTransferDeleted.val()) {
+                    instanceWeb.notification.do_warn("Atencion", "Debes ingresar un motivo para continuar.");
+                    refTransferDeleted.css('border-color','red');
+                    refTransferDeleted.focus();
+                    return false;
+                }
+                refTransferDeleted.css('border-color','#ccc');
+
+                if (!rowSelected){
+                    instanceWeb.notification.do_warn("Atencion", "Debes seleccionar una transferencia para continuar.");
+                    tableRow.focus()
+                    return false;
+                }
+
+                var unlinkTransfer ={
+                    'statementId': self.id,
+                    'transferId': rowSelected.id,
+                    'comment': !!refTransferDeleted.val() ? refTransferDeleted.val() : ''
+                }
+
+                self.unlinkTransfer(unlinkTransfer).then(function(transfer){
+                    return transfer;
+                }).then(function(transfer){
+                    self.reloadPage();
+                    self.removeModal(e);
+                    if (!transfer)
+                        results = false;
+                })
+
+                defer.resolve(results);
+            });
+
+            /* Click Cerrar */
+            $('.expired-account-modal').on('hidden.bs.modal', function(e) {
+                results = false;
+                defer.resolve(results);
+                self.removeModal(e);
+            });
+
+            return defer;
+        },
+        /* Unlink transfer */
+        unlinkTransfer: function(values){
+            var bankStatementTransfer = new instanceWeb.Model('account.bank.statement');
+            return bankStatementTransfer.call('unlink_transfer',[values], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+    });
+
+    if (openerp.web && openerp.web.FormView) {
+        openerp.web.FormView.include({
+            load_record: function(record) {
+                this._super.apply(this, arguments);
+
+                if (this.model !== 'account.bank.statement')
+                    return;
+
+                openerp.parentInstanceStatementTransferDeleted = this;
+
+                if (openerp.widgetInstanceStatementTransferDeleted) {
+                    openerp.widgetInstanceStatementTransferDeleted.updateId(record.id);
+                    if (this.$el.find('.button-statement-transfer-deleted').length !== 0 )
+                        return ;
+                }
+
+
+                if (this.$el.find('.button-statement-transfer-deleted').length !== 0 )
+                    return;
+
+                openerp.widgetInstanceStatementTransferDeleted = new openerp.EiruStatementTransferDeleted(this);
+                var element =this.$el.find('.oe_form').find('.eiru-statement-utility');
+
+                openerp.widgetInstanceStatementTransferDeleted.appendTo(element[0]);
+                openerp.widgetInstanceStatementTransferDeleted.updateId(record.id);
+            }
+        });
+    }
+})();

+ 264 - 0
static/src/js/eiru_statement_unlink.js

@@ -0,0 +1,264 @@
+(function() {
+    openerp.widgetInstanceStatementUnlink = null;
+    openerp.parentInstanceStatementUnlink = {};
+    var QWeb = openerp.web.qweb;
+    var instanceWeb = openerp.web;
+    // Abrir caja
+    openerp.EiruStatementUnlink = openerp.Widget.extend({
+        template: 'EiruStatementUtility.Unlink',
+        id: undefined,
+        buttons: undefined,
+        bankStatement: [],
+        resUser: [],
+        statementConfig: [],
+        /* init */
+        init: function(parent) {
+            this._super(parent);
+            this.buttons = parent.$buttons;
+        },
+        /* start */
+        start: function () {
+            var self = this
+            this.$el.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');
+            });
+        },
+        /* Actualizar Id de la visat actual  */
+        updateId: function(id) {
+            var self = this;
+            self.id = id;
+            if(!id)
+                self.$el.css('display','none');
+        },
+        /* Reload Page*/
+        reloadPage: function() {
+             openerp.parentInstanceStatementUnlink.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.fetchBankStatementUnlink(self.id).then(function(bankStatement) {
+                return bankStatement;
+            }).then(function(bankStatement) {
+                self.bankStatement = bankStatement;
+                return self.fetchGetUserLogin();
+            }).then(function(resUser){
+                self.resUser = resUser;
+                return self.fetchStatementConfigTransfer();
+            }).then(function(statementConfig){
+                self.statementConfig = statementConfig;
+                /* Verificar el usuario */
+                if (!self.resUser.length){
+                    instanceWeb.notification.do_warn("Atencion", "No estas autorizado a realizar esta operación.");
+                    return  false;
+                }
+                /* Verificar si existe configuracion */
+                if (!self.statementConfig.length){
+                    instanceWeb.notification.do_warn("Atencion", "No estas autorizado a realizar esta operación, no existe configuración de caja.");
+                    return  false;
+                }
+                /* Verificar si el usuario tiene autorización para cerrar la caja */
+                if (!(_.contains(self.statementConfig[0].statement_unlink_user, self.resUser[0].id))){
+                    instanceWeb.notification.do_warn("Atencion", "El usuario no tiene autorización para eliminar caja.");
+                    return false;
+                }
+                return self.showModal();
+            });
+        },
+        /* Get Account bank Statement */
+        fetchBankStatementUnlink: function(id) {
+            var bankStatement = new instanceWeb.Model('account.bank.statement');
+            return bankStatement.call('eiru_get_bank_statement_unlink',[parseInt(id)], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /*Get User*/
+        fetchGetUserLogin: function(){
+            var bankStatementUser = new instanceWeb.Model('account.bank.statement');
+            return bankStatementUser.call('eiru_transfers_get_user', {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /* statement Config */
+        fetchStatementConfigTransfer: function() {
+            var fields = ['id','name','statement_unlink_user'];
+            var domain = [['active', '=', true]];
+            var statementConfig = new openerp.web.Model('account.bank.statement.config');
+            return statementConfig.query(fields).filter(domain).all();
+        },
+        /* Get state  Object*/
+        getStatementState: function(statement, state){
+            return _.filter(statement,function(item){
+                return item.state === state;
+            });
+        },
+        /* Filter Object Id*/
+        getStateTransfer: function(statement, id) {
+            return _.filter(statement, function(item){
+                return item.id === id;
+            });
+        },
+        /* filter line statement */
+        filterStatementLine: function() {
+            var self= this;
+            var statement = self.bankStatement[0];
+            var currency = statement.currencystatement;
+            var lineStatement = [];
+
+            _.each(statement.lineStatement, function(line){
+                var state = statement.state
+
+                if (!!line.casBoxTransfer.length){
+                    if (line.casBoxTransfer[0].inputStatementState !== statement.state)
+                        state = line.casBoxTransfer[0].inputStatementState
+
+                    if (line.casBoxTransfer[0].outputStatementState !== statement.state)
+                        state = line.casBoxTransfer[0].outputStatementState
+                }
+
+                lineStatement.push({
+                    'id': line.id,
+                    'date': moment(line.date).format("DD-MM-YYYY"),
+                    'name': line.name,
+                    'amount': accounting.formatNumber(line.amount, currency.decimalPlaces, currency.thousandsSeparator, currency.decimalSeparator),
+                    'state': state
+                });
+            });
+            return lineStatement;
+        },
+        // /*Modal  */
+        showModal: function() {
+            var self = this;
+            var defer =$.Deferred();
+            var results = true;
+            var lineStatement = self.filterStatementLine();
+
+            var modal = QWeb.render('ModalStatementUtility.Unlink',{
+                'statementLine': lineStatement
+            });
+
+            $('.openerp_webclient_container').after(modal);
+            $('.expired-account-modal').modal();
+
+            /* Transferencia */
+            var lineMessege = $('.expired-account-modal').find('.line-unlink-messege');
+            var table = $('.expired-account-modal').find('.table-tbody').find('tr');
+            var buttonSave = $('.expired-account-modal').find('.button-save');
+
+            _.each(table, function(tr) {
+                var idLine  = (($(tr).children()[0]).textContent).trim();
+                var stateStatement = self.getStateTransfer(lineStatement, parseInt(idLine));
+                if (!stateStatement.length)
+                    return false;
+
+                if (stateStatement[0].state === 'confirm'){
+                    $(tr).css('color','red')
+                }
+            });
+
+            /* Caja Cerrada */
+            stateStatement = self.getStatementState(lineStatement, 'confirm');
+            lineMessege.css('display','none');
+            lineMessege.text("");
+            if (stateStatement.length)
+                lineMessege.css('display','flex');
+                lineMessege.text("Existe "+stateStatement.length+" caja relacionada que ya están cerrada.");
+
+            /* Verificar si existe movimientos */
+            if (!lineStatement.length) {
+                $('.expired-account-modal').find('.statement-line').css('display', 'none');
+                lineMessege.css('display','flex');
+                lineMessege.text("No existe movimiento en la caja seleccionada.");
+            }
+
+            /*Click buttonSave*/
+            buttonSave.click(function(e) {
+                stateStatement = self.getStatementState(lineStatement, 'confirm');
+                if (stateStatement.length) {
+                    instanceWeb.notification.do_warn("Atencion", "No se puede eliminar la caja, porque tiene relación con cajas cerradas.");
+                    return false;
+                }
+
+                $('.expired-account-modal').find('.widget-content.widget-loading-unlink-statement').css('display','flex');
+                self.unlinkStatement(self.id).then(function(resultsUnlink) {
+                    return resultsUnlink;
+                }).then(function(resultsUnlink) {
+                    $('.expired-account-modal').find('.widget-content.widget-loading-unlink-statement').css('display','none');
+                    if (!resultsUnlink.state)
+                        instanceWeb.notification.do_warn("Atencion", resultsUnlink.message,true);
+
+                    self.reloadPage();
+                    self.removeModal(e);
+
+                    if (!resultsUnlink)
+                        results = false;
+                });
+
+                defer.resolve(results);
+            });
+
+            /* Click Cerrar */
+            $('.expired-account-modal').on('hidden.bs.modal', function(e) {
+                results = false;
+                defer.resolve(results);
+                self.removeModal(e);
+            });
+
+            return defer;
+        },
+
+        unlinkStatement: function(id){
+            var bankStatementUser = new instanceWeb.Model('account.bank.statement');
+            return bankStatementUser.call('eiru_unlink_statement',[id], {
+                context: new instanceWeb.CompoundContext()
+            });
+        }
+    });
+
+    if (openerp.web && openerp.web.FormView) {
+        openerp.web.FormView.include({
+            load_record: function(record) {
+                this._super.apply(this, arguments);
+
+                if (this.model !== 'account.bank.statement')
+                    return;
+
+                openerp.parentInstanceStatementUnlink = this;
+
+                if (openerp.widgetInstanceStatementUnlink) {
+                    openerp.widgetInstanceStatementUnlink.updateId(record.id);
+                    if (this.$el.find('.button-statement-unlink').length !== 0 )
+                        return ;
+                }
+
+                if (this.$el.find('.button-statement-unlink').length !== 0 )
+                    return;
+
+                openerp.widgetInstanceStatementUnlink = new openerp.EiruStatementUnlink(this);
+                var element =this.$el.find('.oe_form').find('.eiru-statement-unlink');
+
+                openerp.widgetInstanceStatementUnlink.appendTo(element[0]);
+                openerp.widgetInstanceStatementUnlink.updateId(record.id);
+            }
+        });
+    }
+})();

+ 122 - 0
static/src/js/import_statement.js

@@ -0,0 +1,122 @@
+(function() {
+    openerp.widgetInstanceStatementImport = null;
+    openerp.parentInstanceStatementImport = {};
+
+    var QWeb = openerp.web.qweb;
+    var instanceWeb = openerp.web;
+
+    openerp.EiruStatementImport = openerp.Widget.extend({
+        template: 'EiruImport.Statement',
+        id: undefined,
+        buttons: undefined,
+        bankStatement: [],
+        /* Init */
+        init: function (parent) {
+            this._super(parent);
+            this.buttons = parent.$buttons;
+        },
+        /* Actualizar id del Objeto */
+        updateId: function(id, type) {
+            var self = this;
+            self.id = id;
+            this.$el.css('display','flex');
+            if (type === 'normal'){
+                this.$el.css('display','none');
+            }
+        },
+        /* start */
+        start: function() {
+            var self = this;
+            this.$el.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');
+            });
+       },
+        /* Iniciar */
+       fetchInitial: function() {
+            var self = this;
+            self.$el.attr("disabled", true);
+            self.fetchBankStatement(self.id).then(function(bankStatement) {
+                return bankStatement;
+            }).then(function(bankStatement) {
+                self.bankStatement = bankStatement;
+                if (!!self.bankStatement.length && self.bankStatement[0].type_statement === 'normal'){
+                    instanceWeb.notification.do_notify("Atención","Esta opción solo esta disponible para la caja general.");
+                    return false;
+                }
+                return self.fetchStatementPointOfSale(self.id).then(function(statementPoinOfSale){
+                    return statementPoinOfSale;
+                }).then(function(statementPoinOfSale){
+                    self.statementPoinOfSale = statementPoinOfSale;
+                    if (!!statementPoinOfSale) {
+                        instanceWeb.notification.do_notify("Atención"," "+statementPoinOfSale+" caja/s fueron importada .");
+                        return
+                    }
+                    instanceWeb.notification.do_notify("Atención","Nada que hacer.");
+               });
+            }).then(function() {
+                self.$el.removeAttr("disabled");
+                return self.reloadPage();
+            });
+        },
+        /* Reload Page*/
+        reloadPage: function() {
+            openerp.parentInstanceStatementTransfer.reload();
+        },
+        /* Registro de Caja */
+        fetchBankStatement: function(id) {
+            var fields = ['id', 'journal_id', 'pos_session_id', 'date'];
+            var domain = [['id', '=', id]];
+            var statement = new instanceWeb.Model('account.bank.statement');
+            return statement.query(fields).filter(domain).all();
+        },
+        /* Get Statement Point of Sale*/
+        fetchStatementPointOfSale: function(id) {
+            var invoiceMoveLine = new instanceWeb.Model('account.bank.statement');
+            return invoiceMoveLine.call('get_statement_point_of_sale',[id], {
+                context: new instanceWeb.CompoundContext()
+            });
+        }
+    });
+
+    if (openerp.web && openerp.web.FormView) {
+        openerp.web.FormView.include({
+            load_record: function(record) {
+                this._super.apply(this, arguments);
+
+                if (this.model !== 'account.bank.statement')
+                    return;
+
+                openerp.parentInstanceStatementImport = this;
+
+                if (openerp.widgetInstanceStatementImport) {
+                    openerp.widgetInstanceStatementImport.updateId(record.id);
+                    if (this.$el.find('.button-import-statement').length !== 0 )
+                        return ;
+                }
+
+                if (this.$el.find('.button-import-statement').length !== 0 )
+                    return;
+
+                openerp.widgetInstanceStatementImport = new openerp.EiruStatementImport(this);
+                var element =this.$el.find('.oe_form').find('.import-statement');
+
+                openerp.widgetInstanceStatementImport.appendTo(element[0]);
+                openerp.widgetInstanceStatementImport.updateId(record.id);
+            }
+        });
+    }
+})();

+ 303 - 0
static/src/js/modal_statement_line_unlink.js

@@ -0,0 +1,303 @@
+(function() {
+
+    openerp.widgetInstanceStatementLineUnlink = null;
+    openerp.parentInstanceStatementLineUnlink = {};
+    var QWeb = openerp.web.qweb;
+    var instanceWeb = openerp.web;
+
+    openerp.EiruStatementLineUnlink = openerp.Widget.extend({
+        template: 'EiruStatementUtility.LineUnlink',
+        id: undefined,
+        buttons: undefined,
+        // sidebar: undefined,
+        bankStatement: [],
+        resUser: [],
+        statementConfig: [],
+        cashBoxTransfer: [],
+        /* init */
+        init: function(parent) {
+            this._super(parent);
+            this.buttons = parent.$buttons;
+            // this.sidebar = parent.$sidebar;
+        },
+        /* start */
+        start: function () {
+            // this.sidebar.css('display','none')
+            var self = this
+            this.$el.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');
+            });
+        },
+        /* Actualizar Id de la visat actual  */
+        updateId: function(id) {
+            var self = this;
+            self.id = id;
+        },
+        /* Reload Page*/
+        reloadPage: function() {
+             openerp.parentInstanceStatementLineUnlink.reload();
+        },
+        /* Description: Función para remover el modal */
+        removeModal: function() {
+            $('.expired-account-modal').remove();
+            $('.modal-backdrop').remove();
+        },
+        /*Get User*/
+        fetchGetUserLogin: function(){
+            var bankStatementUser = new instanceWeb.Model('account.bank.statement');
+            return bankStatementUser.call('eiru_transfers_get_user', {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /* statement Config */
+        fetchStatementConfigTransfer: function() {
+            var fields = ['id', 'name', 'delete_transfer_user_ids'];
+            var domain = [['active', '=', true]];
+            var statementConfig = new openerp.web.Model('account.bank.statement.config');
+            return statementConfig.query(fields).filter(domain).all();
+        },
+        /* Método inicial */
+        fetchInitial: function() {
+            var self = this;
+            self.fetchBankStatement(self.id).then(function(bankStatement) {
+                return bankStatement;
+            }).then(function(bankStatement) {
+                self.bankStatement = bankStatement;
+                return self.fetchStatementConfigTransfer();
+            }).then(function(statementConfig){
+                self.statementConfig = statementConfig;
+                return self.fetchGetUserLogin();
+            }).then(function(resUser) {
+                self.resUser = resUser;
+                if (!self.statementConfig.length){
+                    instanceWeb.notification.do_warn("Atencion", "No estas autorizado a realizar esta operación, no existe configuración de caja.");
+                    return  false;
+                }
+                if (!self.resUser.length){
+                    instanceWeb.notification.do_warn("Atencion", "No estas autorizado a realizar esta operación.");
+                    return  false;
+                }
+                if (!self.bankStatement.length) {
+                    instanceWeb.notification.do_warn("Atencion", "No estas autorizado a realizar esta operación.");
+                    return  false;
+                }
+
+                if (!(_.contains(self.statementConfig[0].delete_transfer_user_ids, self.resUser[0].id))){
+                    instanceWeb.notification.do_warn("Atencion", "El usuario no tiene autorización para eliminar las transferencia.");
+                    return false;
+                }
+                self.fetchCashBoxTransfer(self.id).then(function(cashBoxTransfer){
+                    return cashBoxTransfer;
+                }).then(function(cashBoxTransfer){
+                    self.cashBoxTransfer = cashBoxTransfer;
+                    if (!self.cashBoxTransfer.length) {
+                        instanceWeb.notification.do_warn("Atencion", "La caja no tiene ninguna transferencia.");
+                        return false;
+                    }
+                    return self.showModalTransfer();
+                })
+            });
+        },
+        /* Account bank Statement */
+        fetchBankStatement: function(id) {
+            var bankStatement = new instanceWeb.Model('account.bank.statement');
+            return bankStatement.call('get_account_bank_statement_utility',[id], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /* cash_box_transfer*/
+        fetchCashBoxTransfer: function(id) {
+            var cashBoxTransfer = new instanceWeb.Model('account.bank.statement');
+            return cashBoxTransfer.call('eiru_transfers_get_chas_box_transfer',[id], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+        /*filter line transfer selected*/
+        filterRowTransfer: function(id){
+            var self = this;
+            return _.filter(self.cashBoxTransfer, function(item){
+                return item.id === id;
+            });
+        },
+        /*Modal  Transfer */
+        showModalTransfer: function() {
+            var self = this;
+            var defer =$.Deferred();
+            var results = true;
+            var rowSelected = [];
+
+            var modal = QWeb.render('ModalStatementUtility.TransferDeleted',{
+                cashBoxTransfer: self.cashBoxTransfer
+            });
+
+            $('.openerp_webclient_container').after(modal);
+            $('.expired-account-modal').modal();
+
+            var statementOutput = $('.expired-account-modal').find('.statement-output');
+            var statementInput = $('.expired-account-modal').find('.statement-input');
+            var transferRef = $('.expired-account-modal').find('.transfer-ref');
+            var transferAmount = $('.expired-account-modal').find('.transfer-amount');
+            var transferAmountSymbol = $('.expired-account-modal').find('.transfer-amount-symbol');
+            var refTransferDeleted = $('.expired-account-modal').find('.ref-transfer-deleted');
+            /* Table */
+            var tableRow = $('.expired-account-modal').find('.table-tbody').find('tr');
+            var buttonDeleted = $('.expired-account-modal').find('.button-deleted')
+
+            buttonDeleted.attr("disabled", true);
+            refTransferDeleted.attr("disabled", true);
+
+            /* Seleccionar  fila */
+            tableRow.click(function (e) {
+                row_export = $(e.target);
+
+                buttonDeleted.attr("disabled", true);
+                refTransferDeleted.attr("disabled", true);
+                tableRow.removeClass('table-row-select');
+                $(e.target).closest('tr').addClass('table-row-select');
+
+                var idRow = parseInt(($(e.target).closest('tr').children()[0].textContent).trim())
+                rowSelected = self.filterRowTransfer(idRow).shift();
+
+                statementOutput.val('')
+                statementInput.val('')
+                transferRef.val('')
+                transferAmount.val(0)
+                transferAmountSymbol.text("")
+                refTransferDeleted.val('')
+
+                if (!rowSelected){
+                    tableRow.removeClass('table-row-select');
+                    return false;
+                }
+
+                if ( rowSelected.outputStatement.typeJournal === 'cash' ) {
+                    if (rowSelected.outputStatement.state !== 'open') {
+                        instanceWeb.notification.do_warn("Atencion", "No podes continuar con esa operación, la caja origen no esta abierta");
+                        tableRow.removeClass('table-row-select');
+                        return false;
+                    }
+                    if (rowSelected.inputStatement.state !== 'open')  {
+                        instanceWeb.notification.do_warn("Atencion", "No podes continuar con esa operación, la caja destino no esta abierta");
+                        tableRow.removeClass('table-row-select');
+                        return false;
+                    }
+                }
+
+                if ( rowSelected.outputStatement.typeJournal === 'bank' ){
+                    if (rowSelected.outputStatement.state === 'confirm'){
+                        instanceWeb.notification.do_warn("Atencion", "No podes continuar con esa operación, la caja origen no esta abierta");
+                        tableRow.removeClass('table-row-select');
+                        return false;
+                    }
+                    if (rowSelected.inputStatement.state === 'confirm') {
+                        instanceWeb.notification.do_warn("Atencion", "No podes continuar con esa operación, la caja destino no esta abierta");
+                        tableRow.removeClass('table-row-select');
+                        return false;
+                    }
+                }
+
+                statementOutput.val(rowSelected.outputStatement.name)
+                statementInput.val(rowSelected.inputStatement.name)
+                transferRef.val(rowSelected.ref)
+                transferAmount.val(accounting.formatNumber(rowSelected.amount, rowSelected.outputStatement.currency.decimalPlaces, rowSelected.outputStatement.currency.thousandsSeparator,rowSelected.outputStatement.currency.decimalSeparator))
+                transferAmountSymbol.text(rowSelected.outputStatement.currency.symbol)
+                refTransferDeleted.val('')
+                buttonDeleted.removeAttr("disabled");
+                refTransferDeleted.removeAttr("disabled");
+                refTransferDeleted.focus();
+            });
+
+            buttonDeleted.click(function(e) {
+                if (!refTransferDeleted.val()) {
+                    instanceWeb.notification.do_warn("Atencion", "Debes ingresar un motivo para continuar.");
+                    refTransferDeleted.css('border-color','red');
+                    refTransferDeleted.focus();
+                    return false;
+                }
+                refTransferDeleted.css('border-color','#ccc');
+
+                if (!rowSelected){
+                    instanceWeb.notification.do_warn("Atencion", "Debes seleccionar una transferencia para continuar.");
+                    tableRow.focus()
+                    return false;
+                }
+
+                var unlinkTransfer ={
+                    'statementId': self.id,
+                    'transferId': rowSelected.id,
+                    'comment': !!refTransferDeleted.val() ? refTransferDeleted.val() : ''
+                }
+
+                self.unlinkTransfer(unlinkTransfer).then(function(transfer){
+                    return transfer;
+                }).then(function(transfer){
+                    self.reloadPage();
+                    self.removeModal(e);
+                    if (!transfer)
+                        results = false;
+                })
+
+                defer.resolve(results);
+            });
+
+            /* Click Cerrar */
+            $('.expired-account-modal').on('hidden.bs.modal', function(e) {
+                results = false;
+                defer.resolve(results);
+                self.removeModal(e);
+            });
+
+            return defer;
+        },
+        /* Unlink transfer */
+        unlinkTransfer: function(values){
+            var bankStatementTransfer = new instanceWeb.Model('account.bank.statement');
+            return bankStatementTransfer.call('unlink_transfer',[values], {
+                context: new instanceWeb.CompoundContext()
+            });
+        },
+    });
+
+    if (openerp.web && openerp.web.FormView) {
+        openerp.web.FormView.include({
+            load_record: function(record) {
+                this._super.apply(this, arguments);
+
+                if (this.model !== 'account.bank.statement')
+                    return;
+
+                openerp.parentInstanceStatementLineUnlink = this;
+
+                if (openerp.widgetInstanceStatementLineUnlink) {
+                    openerp.widgetInstanceStatementLineUnlink.updateId(record.id);
+                    if (this.$el.find('.button-statement-line-unlink').length !== 0 )
+                        return ;
+                }
+
+
+                if (this.$el.find('.button-statement-line-unlink').length !== 0 )
+                    return;
+
+                openerp.widgetInstanceStatementLineUnlink = new openerp.EiruStatementLineUnlink(this);
+                var element =this.$el.find('.oe_form').find('.eiru-statement-utility');
+
+                openerp.widgetInstanceStatementLineUnlink.appendTo(element[0]);
+                openerp.widgetInstanceStatementLineUnlink.updateId(record.id);
+            }
+        });
+    }
+})();

+ 8 - 0
static/src/xml/eiru_statement_cancel.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates xml:space="preserve">
+    <t t-name="EiruStatementUtility.Cancel">
+        <button class="button-statement-cancel eiru-statement-button oe_button oe_form_button oe_highlight">
+            <span>Cancelar caja</span>
+        </button>
+  </t>
+</templates>

+ 8 - 0
static/src/xml/eiru_statement_cashbox_deleted.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates xml:space="preserve">
+    <t t-name="EiruStatementUtility.CasBoxDeleted">
+        <button class="button-statement-cashbox-deleted eiru-statement-button oe_button oe_form_button oe_highlight">
+            <span>Eliminar E/S</span>
+        </button>
+  </t>
+</templates>

+ 8 - 0
static/src/xml/eiru_statement_cashbox_input.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates xml:space="preserve">
+    <t t-name="EiruStatementUtility.CashBoxInput">
+        <button class="button-statement-Cashbox-Input eiru-statement-button oe_button oe_form_button oe_highlight">
+            <span>Poner dinero</span>
+        </button>
+  </t>
+</templates>

+ 8 - 0
static/src/xml/eiru_statement_cashbox_output.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates xml:space="preserve">
+    <t t-name="EiruStatementUtility.CashBoxOutput">
+        <button class="button-statement-casbox-output eiru-statement-button oe_button oe_form_button oe_highlight">
+            <span>Sacar dinero</span>
+        </button>
+  </t>
+</templates>

+ 8 - 0
static/src/xml/eiru_statement_confirm.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates xml:space="preserve">
+    <t t-name="EiruStatementUtility.Confirm">
+        <button class="button-statement-confirm eiru-statement-button oe_button oe_form_button oe_highlight">
+            <span>Cerrar caja</span>
+        </button>
+  </t>
+</templates>

+ 8 - 0
static/src/xml/eiru_statement_confirm_print.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates xml:space="preserve">
+    <t t-name="EiruStatementUtility.ConfirmPrint">
+        <button class="button-statement-confirm-print eiru-statement-button oe_button oe_form_button oe_highlight">
+            <span>Resumen de cierre</span>
+        </button>
+  </t>
+</templates>

+ 8 - 0
static/src/xml/eiru_statement_open.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates xml:space="preserve">
+    <t t-name="EiruStatementUtility.Open">
+        <button class="button-statement-open eiru-statement-button oe_button oe_form_button oe_highlight">
+            <span>Abrir caja</span>
+        </button>
+  </t>
+</templates>

+ 8 - 0
static/src/xml/eiru_statement_transfer.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates xml:space="preserve">
+    <t t-name="EiruStatementUtility.Transfer">
+        <button class="button-statement-transfer eiru-statement-button oe_button oe_form_button oe_highlight">
+            <span>Transferir</span>
+        </button>
+  </t>
+</templates>

+ 8 - 0
static/src/xml/eiru_statement_transfer_deleted.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates xml:space="preserve">
+    <t t-name="EiruStatementUtility.TransferDeleted">
+        <button class="button-statement-transfer-deleted eiru-statement-button oe_button oe_form_button oe_highlight">
+            <span>Eliminar Transf.</span>
+        </button>
+  </t>
+</templates>

+ 8 - 0
static/src/xml/eiru_statement_unlink.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates xml:space="preserve">
+    <t t-name="EiruStatementUtility.Unlink">
+        <button class="button-statement-unlink eiru-statement-button oe_button oe_form_button oe_highlight">
+            <span>Eliminar Caja</span>
+        </button>
+  </t>
+</templates>

+ 8 - 0
static/src/xml/import_statement.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates xml:space="preserve">
+    <t t-name="EiruImport.Statement">
+        <button class="button-import-statement oe_button oe_form_button oe_highlight">
+            <span>Importar Caja</span>
+        </button>
+  </t>
+</templates>

+ 120 - 0
static/src/xml/modal/modal_statement_cancel.xml

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="ModalStatementUtility.Cancel">
+        <div class="modal in expired-account-modal" tabindex="-1" role="dialog">
+            <div class="modal-dialog modal-lg" role="document">
+                <div class="modal-content openerp">
+                    <div class="modal-header paymnets-invoice-header">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="Close" aria-hidden="true">×</button>
+                        <h3 class="modal-title">Cancelar caja</h3>
+                    </div>
+                    <!-- Body -->
+                    <div class="modal-body">
+
+                        <div class="row cancel-transfer">
+                            <label class="confirm-title" style="padding-left: 30px">Transferencia realizadas</label>
+                        </div>
+                        <!-- table -->
+                        <div class="oe_view_manager_body cancel-transfer-table cancel-transfer">
+                            <div class="modal-head-wrapper-statement-cancel-transfer">
+                                <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">Fecha</th>
+                                            <th class="oe_list_header_char oe_sortable">Caja </th>
+                                            <th class="oe_list_header_char oe_sortable">Valor</th>
+                                            <th class="oe_list_header_char oe_sortable">Operación</th>
+                                        </tr>
+                                    </thead>
+                                </table>
+                            </div>
+                            <div class="modal-item-statement-cancel-transfer">
+                                <table class="oe_list_content">
+                                    <tbody class="table-tbody-transfer">
+                                        <tr t-foreach="transfer" t-as="line">
+                                            <td>
+                                                <t t-esc="line_value.id"/>
+                                            </td>
+                                            <td>
+                                                <t t-esc="line_value.date"/>
+                                            </td>
+                                            <td>
+                                                <t t-esc="line_value.statementUser"/>
+                                            </td>
+                                            <td>
+                                                <t t-esc="line_value.amount"/>
+                                            </td>
+                                            <td>
+                                                <t t-esc="line_value.type"/>
+                                            </td>
+                                        </tr>
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                        <div class="cancel-transfer-messege"></div>
+
+
+                        <div class="row cancel-confirm">
+                            <label class="confirm-title" style="padding-left: 30px">Cierre de cajas.</label>
+                        </div>
+                        <!-- table -->
+                        <div class=" oe_view_manager_body cancel-confirm-table cancel-confirm">
+                            <div class="modal-head-wrapper-statement-cancel-confirm">
+                                <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">Fecha</th>
+                                            <th class="oe_list_header_char oe_sortable">Referencia</th>
+                                            <th class="oe_list_header_char oe_sortable">Valor</th>
+                                        </tr>
+                                    </thead>
+                                </table>
+                            </div>
+                            <div class="modal-item-statement-cancel-confirm">
+                                <table class="oe_list_content">
+                                    <tbody class="table-tbody-confirm">
+                                        <tr t-foreach="confirm" t-as="line">
+                                            <td>
+                                                <t t-esc="line_value.id"/>
+                                            </td>
+                                            <td>
+                                                <t t-esc="line_value.date"/>
+                                            </td>
+                                            <td>
+                                                <t t-esc="line_value.name"/>
+                                            </td>
+                                            <td>
+                                                <t t-esc="line_value.amount"/>
+                                            </td>
+                                        </tr>
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                        <div class="cancel-confirm-messege"></div>
+
+
+                        <!-- Motivo  -->
+                        <br/>
+                        <div class="row">
+                            <div class="col-xs-12">
+                                <label class="statement-input-labe">Motivo</label>
+                                <div class="statement-input-group">
+                                    <input type="text" class="form-control statement-input-number input-letters messege-cancel"></input>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <!-- footer -->
+                    <div class="modal-footer statement-utility-footer">
+                        <button type="button" class="oe_button oe_form_button oe_highlight statement-utility-button button-save">Guardar</button>
+                        <button type="button" class="oe_button oe_form_button oe_link dismmis-modal statement-utility-button" data-dismiss="modal">Salir</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </t>
+</template>

+ 55 - 0
static/src/xml/modal/modal_statement_cashbox.xml

@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="ModalStatementUtility.CashBox">
+        <div class="modal in expired-account-modal" tabindex="-1" role="dialog">
+            <div class="modal-dialog modal-lg" role="document">
+                <div class="modal-content openerp">
+                    <div class="modal-header paymnets-invoice-header">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="Close" aria-hidden="true">×</button>
+                        <h3 class="modal-title" t-foreach="header" t-as="header">
+                            <t t-esc="header_value.title"/>
+                        </h3>
+                    </div>
+                    <!-- Body -->
+                    <div class="modal-body">
+
+                        <div class="row">
+                            <div class="col-xs-12">
+                                <label class="statement-input-labe">Motivo</label>
+                                <div class="statement-input-group">
+                                    <input type="text" class="form-control statement-input-number input-letters ref-cash-box"></input>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="row" t-foreach="statement" t-as="statement">
+                            <div class="col-xs-6 is_output" >
+                                <label class="statement-input-labe">Disponible en caja</label>
+                                <div class="statement-input-group">
+                                    <input type="text" class="form-control statement-input-number amount-total-cash" readonly="readonly" t-attf-value="{{ statement_value.amount }}"></input>
+                                    <div class="statement-input-symbol">
+                                        <span class="input-group-text"><t t-esc="statement_value.symbol"/></span>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-xs-6">
+                                <label class="statement-input-labe">Monto</label>
+                                <div class="statement-input-group">
+                                    <input type="text" class="form-control statement-input-number amount-cash-box" value="0"></input>
+                                    <div class="statement-input-symbol">
+                                        <span class="input-group-text"><t t-esc="statement_value.symbol"/></span>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <!-- Pie de Pagina -->
+                    <div class="modal-footer statement-utility-footer">
+                        <button type="button" class="oe_button oe_form_button oe_highlight statement-utility-button button-cash-box">Guardar</button>
+                        <button type="button" class="oe_button oe_form_button oe_link dismmis-modal statement-utility-button" data-dismiss="modal">Salir</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </t>
+</template>

+ 172 - 0
static/src/xml/modal/modal_statement_cashbox_deleted.xml

@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="ModalStatementUtility.CasBoxDeleted">
+        <div class="modal in expired-account-modal" tabindex="-1" role="dialog">
+            <div class="modal-dialog modal-lg" role="document">
+                <div class="modal-content openerp">
+                    <div class="modal-header paymnets-invoice-header">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="Close" aria-hidden="true">×</button>
+                        <h3 class="modal-title">Eliminar entrada/salida de dinero</h3>
+
+                    </div>
+                    <!-- Body -->
+                    <div class="modal-body">
+                        <div class="row">
+                            <div class="col-xs-6 cash-box-radio-group is-cash-input">
+                                <input type="checkbox" class="cash-input"></input>
+                                <label class="cash-box-radio-label">Entrada</label>
+                                <div class="messege-is-cash-input"></div>
+                            </div>
+                            <div class="col-xs-6 cash-box-radio-group is-cash-output">
+                                <input type="checkbox" class="cash-output"></input>
+                                <label class="cash-box-radio-label">Salida</label>
+                                <div class="messege-is-cash-output"></div>
+                            </div>
+                        </div>
+
+                        <hr class="from-title-hr warning-message"/>
+                        <!-- message -->
+                        <div class="row warning-message">
+                            <div class="col-xs-12">
+                                <div class="message-error"></div>
+                            </div>
+                        </div>
+
+                        <hr class="from-title-hr is-selectd-cashbox"/>
+                        <!-- ENTRADA -->
+                        <div class="boby-cash-input">
+                            <div class=" oe_view_manager_body casbox-deleted-table">
+                                <div class="modal-head-wrapper-statement-casbox">
+                                    <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">Fecha</th>
+                                                <th class="oe_list_header_char oe_sortable">Caja</th>
+                                                <th class="oe_list_header_char oe_sortable">Valor</th>
+                                            </tr>
+                                        </thead>
+                                    </table>
+                                </div>
+                                <div class="modal-item-statement-casbox">
+                                    <table class="oe_list_content">
+                                        <tbody class="table-tbody tbody-input">
+                                            <tr t-foreach="boxInput" t-as="input">
+                                                <td>
+                                                    <t t-esc="input_value.id"/>
+                                                </td>
+                                                <td>
+                                                    <t t-set="date" t-value="input_value.date"/>
+                                                    <t t-js="ctx">
+                                                        ctx.date = moment(ctx.date).format("DD-MM-YYYY");
+                                                    </t>
+                                                    <t t-esc="date"/>
+                                                </td>
+                                                <td>
+                                                    <t t-esc="input_value.statement.name"/>
+                                                </td>
+                                                <td>
+                                                    <t t-set="monto" t-value="input_value.amount"/>
+                                                    <t t-set="decimalSeparator" t-value="input_value.statement.currency.decimalSeparator"/>
+                                                    <t t-set="thousandsSeparator" t-value="input_value.statement.currency.thousandsSeparator"/>
+                                                    <t t-set="decimalPlaces" t-value="input_value.statement.currency.decimalPlaces"/>
+                                                    <t t-set="symbol" t-value="input_value.statement.currency.symbol"/>
+                                                    <t t-js="ctx">
+                                                        ctx.monto = accounting.formatMoney(ctx.monto, ctx.symbol,ctx.decimalPlaces,ctx.thousandsSeparator,ctx.decimalSeparator);
+                                                    </t>
+                                                    <t t-esc="monto"/>
+                                                </td>
+                                            </tr>
+                                        </tbody>
+                                    </table>
+                                </div>
+                            </div>
+                        </div>
+                        <!-- SALIDA -->
+                        <div class="boby-cash-output">
+                            <div class=" oe_view_manager_body casbox-deleted-table">
+                                <div class="modal-head-wrapper-statement-casbox">
+                                    <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">Fecha</th>
+                                                <th class="oe_list_header_char oe_sortable">Caja</th>
+                                                <th class="oe_list_header_char oe_sortable">Valor</th>
+                                            </tr>
+                                        </thead>
+                                    </table>
+                                </div>
+                                <div class="modal-item-statement-casbox">
+                                    <table class="oe_list_content">
+                                        <tbody class="table-tbody tbody-output">
+                                            <tr t-foreach="boxOutput" t-as="output">
+                                                <td>
+                                                    <t t-esc="output_value.id"/>
+                                                </td>
+                                                <td>
+                                                    <t t-set="date" t-value="output_value.date"/>
+                                                    <t t-js="ctx">
+                                                        ctx.date = moment(ctx.date).format("DD-MM-YYYY");
+                                                    </t>
+                                                    <t t-esc="date"/>
+                                                </td>
+                                                <td>
+                                                    <t t-esc="output_value.statement.name"/>
+                                                </td>
+                                                <td>
+                                                    <t t-set="monto" t-value="output_value.amount"/>
+                                                    <t t-set="decimalSeparator" t-value="output_value.statement.currency.decimalSeparator"/>
+                                                    <t t-set="thousandsSeparator" t-value="output_value.statement.currency.thousandsSeparator"/>
+                                                    <t t-set="decimalPlaces" t-value="output_value.statement.currency.decimalPlaces"/>
+                                                    <t t-set="symbol" t-value="output_value.statement.currency.symbol"/>
+                                                    <t t-js="ctx">
+                                                        ctx.monto = accounting.formatMoney(ctx.monto, ctx.symbol,ctx.decimalPlaces,ctx.thousandsSeparator,ctx.decimalSeparator);
+                                                    </t>
+                                                    <t t-esc="monto"/>
+                                                </td>
+                                            </tr>
+                                        </tbody>
+                                    </table>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="row is-selectd-cashbox">
+                            <div class="col-xs-6">
+                                <label class="statement-input-labe">Referencia</label>
+                                <div class="statement-input-group">
+                                    <input type="text" class="form-control statement-input-number input-letters casbox-ref" readonly="readonly"></input>
+                                </div>
+                            </div>
+                            <div class="col-xs-6">
+                                <label class="statement-input-labe">Monto</label>
+                                <div class="statement-input-group">
+                                    <input type="text" class="form-control statement-input-number casbox-amount" readonly="readonly" value="0"></input>
+                                    <div class="statement-input-symbol casbox-amount-symbol">
+                                        <span class="input-group-text"></span>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="row is-selectd-cashbox">
+                            <div class="col-xs-12">
+                                <label class="statement-input-labe">Motivo</label>
+                                <div class="statement-input-group">
+                                    <input type="text" class="form-control statement-input-number input-letters casbox-ref-deleted"></input>
+                                </div>
+                            </div>
+                        </div>
+
+                    </div>
+                    <!-- Pie de Pagina -->
+                    <div class="modal-footer statement-utility-footer">
+                        <button type="button" class="oe_button oe_form_button oe_highlight statement-utility-button button-deleted">Guardar</button>
+                        <button type="button" class="oe_button oe_form_button oe_link dismmis-modal statement-utility-button" data-dismiss="modal">Salir</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </t>
+</template>

+ 26 - 0
static/src/xml/modal/modal_statement_confirm-print.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="ModalStatementUtility.ConfirmPrint">
+        <div class="modal in expired-account-modal" tabindex="-1" role="dialog">
+            <div class="modal-dialog modal-sm" role="document">
+                <div class="modal-content openerp">
+                    <div class="modal-header paymnets-invoice-header">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="Close" aria-hidden="true">×</button>
+                        <h3 class="modal-title">Resumen de cierre</h3>
+                    </div>
+                    <!-- Body -->
+                    <div class="modal-body">
+                        <div class="row">
+                            <div class="col-xs-6 button-print-group">
+                                <button type="button" class="oe_button oe_form_button oe_highlight button-print-confirm print-ticket">Ticket</button>
+                            </div>
+                            <div class="col-xs-6 button-print-group">
+                                <button type="button" class="oe_button oe_form_button oe_highlight button-print-confirm print-normal">Normal</button>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </t>
+</template>

+ 125 - 0
static/src/xml/modal/modal_statement_confirm.xml

@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="ModalStatementUtility.Confirm">
+        <div class="modal in expired-account-modal" tabindex="-1" role="dialog">
+            <div class="modal-dialog modal-lg" role="document">
+                <div class="modal-content openerp">
+                    <div class="modal-header paymnets-invoice-header">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="Close" aria-hidden="true">×</button>
+                        <h3 class="modal-title">Cerrar caja</h3>
+                    </div>
+                    <!-- Body -->
+                    <div class="modal-body">
+                        <!-- Saldo -->
+                        <div class="row">
+                            <label class="confirm-title">Ajuste de Saldo</label>
+                            <label class="is-not-balance"></label>
+                        </div>
+                        <!-- Monto  -->
+                        <div class="row">
+                            <div class="col-xs-6">
+                                <label class="statement-input-labe">Monto en caja</label>
+                                <div class="statement-input-group">
+                                    <input type="text" class="form-control statement-input-number amount-cashbox" readonly="readonly" value="0"></input>
+                                    <div class="statement-input-symbol statement-amount-symbol">
+                                        <span class="input-group-text"></span>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-xs-6">
+                                <label class="statement-input-labe">Monto de Cierre</label>
+                                <div class="statement-input-group">
+                                    <input type="text" class="form-control statement-input-number amount-real" value="0"></input>
+                                    <div class="statement-input-symbol statement-amount-symbol">
+                                        <span class="input-group-text"></span>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="row">
+                            <div class="col-xs-6">
+                                <label class="statement-input-labe">Diferencia</label>
+                                <div class="statement-input-group">
+                                    <input type="text" class="form-control statement-input-number amount-difference" readonly="readonly" value="0"></input>
+                                    <div class="statement-input-symbol statement-amount-symbol">
+                                        <span class="input-group-text"></span>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="row">
+                            <div class="col-xs-12 ">
+                                <label class="statement-input-labe">Observación</label>
+                                <div class="statement-input-group">
+                                    <input type="text" class="form-control statement-input-number input-letters ref-balance"></input>
+                                </div>
+                            </div>
+                        </div>
+
+                        <hr class="from-confirm-hr"/>
+                        <!-- transferencia -->
+                        <div class="row">
+                            <label class="confirm-title">Transferir a la caja general</label>
+                            <input type="checkbox" class="confirm-transfer-casbox"></input>
+                            <label class="is-not-transfer"></label>
+                        </div>
+                        <div class="row is-transfer-confirm" >
+                            <div class="col-xs-6">
+                                <label class="statement-input-labe">Caja General</label>
+                                <div class="statement-input-group">
+                                    <select class="statement-input-number cashbox-transfer">
+                                        <t t-foreach="statement" t-as="statement">
+                                            <option t-attf-value="{{ statement_value.id }}" >
+                                                <t t-esc="statement_value.statementname"/>
+                                            </option>
+                                        </t>
+                                    </select>
+                                </div>
+                            </div>
+                            <div class="col-xs-6">
+                                <label class="statement-input-labe">Monto a transferir</label>
+                                <div class="statement-input-group">
+                                    <input type="text" class="form-control statement-input-number amount-transfer" value="0"></input>
+                                    <div class="statement-input-symbol statement-amount-symbol">
+                                        <span class="input-group-text"></span>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="row is-transfer-confirm">
+                            <div class="col-xs-12">
+                                <label class="statement-input-labe">Motivo</label>
+                                <div class="statement-input-group">
+                                    <input type="text" class="form-control statement-input-number input-letters ref-transfer"></input>
+                                </div>
+                            </div>
+                        </div>
+
+                        <hr class="from-confirm-hr"/>
+                        <!-- Saldo para abrir proxima caja  -->
+                        <div class="row">
+                            <label class="confirm-title">Saldo de caja</label>
+                        </div>
+                        <div class="row">
+                            <div class="col-xs-6">
+                                <label class="statement-input-labe">Saldo de caja</label>
+                                <div class="statement-input-group">
+                                    <input type="text" class="form-control statement-input-number amount-cashbox-open" readonly="readonly" value="0"></input>
+                                    <div class="statement-input-symbol statement-amount-symbol">
+                                        <span class="input-group-text"></span>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+
+                    </div>
+                    <!-- footer -->
+                    <div class="modal-footer statement-utility-footer">
+                        <button type="button" class="oe_button oe_form_button oe_highlight statement-utility-button button-save">Guardar</button>
+                        <button type="button" class="oe_button oe_form_button oe_link dismmis-modal statement-utility-button" data-dismiss="modal">Salir</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </t>
+</template>

+ 62 - 0
static/src/xml/modal/modal_statement_line_unlink.xml

@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="ModalStatementUtility.LineUnlink">
+        <div class="modal in expired-account-modal" tabindex="-1" role="dialog">
+            <div class="modal-dialog modal-lg" role="document">
+                <div class="modal-content openerp">
+                    <div class="modal-header paymnets-invoice-header">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="Close" aria-hidden="true">×</button>
+                        <h3 class="modal-title">Eliminar movimiento de caja</h3>
+                    </div>
+                    <!-- Body -->
+                    <div class="modal-body">
+                        <!-- <div class="row statement-line">
+                            <label class="confirm-title" style="padding-left: 30px"> Movimientos </label>
+                        </div> -->
+                        <!-- table -->
+                        <!-- <div class=" oe_view_manager_body unlink-statement-table statement-line">
+                            <div class="modal-head-wrapper-statement-unlink">
+                                <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">Fecha</th>
+                                            <th class="oe_list_header_char oe_sortable">Referencia</th>
+                                            <th class="oe_list_header_char oe_sortable">Valor</th>
+                                        </tr>
+                                    </thead>
+                                </table>
+                            </div>
+                            <div class="modal-item-statement-unlink">
+                                <table class="oe_list_content">
+                                    <tbody class="table-tbody">
+                                        <tr t-foreach="statementLine" t-as="line">
+                                            <td>
+                                                <t t-esc="line_value.id"/>
+                                            </td>
+                                            <td>
+                                                <t t-esc="line_value.date"/>
+                                            </td>
+                                            <td>
+                                                <t t-esc="line_value.name"/>
+                                            </td>
+                                            <td>
+                                                <t t-esc="line_value.amount"/>
+                                            </td>
+                                        </tr>
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div> -->
+                        <!-- <div class="line-unlink-messege"></div> -->
+                    </div>
+                    <!-- footer -->
+                    <div class="modal-footer statement-utility-footer">
+                        <button type="button" class="oe_button oe_form_button oe_highlight statement-utility-button button-save">Aceptar</button>
+                        <button type="button" class="oe_button oe_form_button oe_link dismmis-modal statement-utility-button" data-dismiss="modal">Salir</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </t>
+</template>

+ 80 - 0
static/src/xml/modal/modal_statement_transfer.xml

@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="ModalStatementUtility.Transfer">
+        <div class="modal in expired-account-modal" tabindex="-1" role="dialog">
+            <div class="modal-dialog modal-lg" role="document">
+                <div class="modal-content openerp">
+                    <div class="modal-header paymnets-invoice-header">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="Close" aria-hidden="true">×</button>
+                        <h3 class="modal-title">Transferencia de valores</h3>
+                    </div>
+                    <!-- Body -->
+                    <div class="modal-body">
+
+                        <div class="row">
+                            <h3 class="from-title-h3">Transferencia de caja</h3>
+                        </div>
+
+                        <div class="row ">
+                            <div class="col-xs-6">
+                                <label class="statement-input-labe">Monto en caja</label>
+                                <div class="statement-input-group">
+                                    <input type="text" class="form-control statement-input-number statement-amount" readonly="readonly" value="0"></input>
+                                    <div class="statement-input-symbol statement-amount-symbol">
+                                        <span class="input-group-text"></span>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-xs-6">
+                                <label class="statement-input-labe">Método de pago: </label>
+                                <div class="statement-input-group">
+                                    <select class="statement-input-number selected-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 ">
+                            <div class="col-xs-6">
+                                <label class="statement-input-labe">Caja a Transferir: </label>
+                                <div class="statement-input-group">
+                                    <select class="statement-input-number statement-open-selected">
+                                    </select>
+                                </div>
+                            </div>
+                            <div class="col-xs-6">
+                                <label class="statement-input-labe">Monto a transferir</label>
+                                <div class="statement-input-group">
+                                    <input type="text" class="form-control statement-input-number amount-transfer" value="0"></input>
+                                    <div class="statement-input-symbol amount-transfer-symbol">
+                                        <span class="input-group-text"></span>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="row">
+                            <div class="col-xs-12">
+                                <label class="statement-input-labe">Motivo</label>
+                                <div class="statement-input-group">
+                                    <input type="text" class="form-control statement-input-number input-letters ref-transfer"></input>
+                                </div>
+                            </div>
+                        </div>
+
+                    </div>
+                    <!-- Pie de Pagina -->
+                    <div class="modal-footer statement-utility-footer">
+                        <button type="button" class="oe_button oe_form_button oe_highlight statement-utility-button button-save">Guardar</button>
+                        <button type="button" class="oe_button oe_form_button oe_link dismmis-modal statement-utility-button" data-dismiss="modal">Salir</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </t>
+</template>

+ 116 - 0
static/src/xml/modal/modal_statement_transfer_deleted.xml

@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="ModalStatementUtility.TransferDeleted">
+        <div class="modal in expired-account-modal" tabindex="-1" role="dialog">
+            <div class="modal-dialog modal-lg" role="document">
+                <div class="modal-content openerp">
+                    <div class="modal-header paymnets-invoice-header">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="Close" aria-hidden="true">×</button>
+                        <h3 class="modal-title">Eliminar Transferencia</h3>
+                    </div>
+                    <!-- Body -->
+                    <div class="modal-body">
+                        <!-- table -->
+                        <div class=" oe_view_manager_body transfer-deleted-table">
+                            <div class="modal-head-wrapper-statement-transfer">
+                                <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">Fecha</th>
+                                            <th class="oe_list_header_char oe_sortable">Caja Origen</th>
+                                            <th class="oe_list_header_char oe_sortable">Caja Destino</th>
+                                            <th class="oe_list_header_char oe_sortable">Valor</th>
+                                        </tr>
+                                    </thead>
+                                </table>
+                            </div>
+                            <div class="modal-item-statement-transfer">
+                                <table class="oe_list_content">
+                                    <tbody class="table-tbody">
+                                        <tr t-foreach="cashBoxTransfer" t-as="line">
+                                            <td>
+                                                <t t-esc="line_value.id"/>
+                                            </td>
+                                            <td>
+                                                <t t-set="date" t-value="line_value.date"/>
+                                                <t t-js="ctx">
+                                                    ctx.date = moment(ctx.date).format("DD-MM-YYYY");
+                                                </t>
+                                                <t t-esc="date"/>
+                                            </td>
+                                            <td>
+                                                <t t-esc="line_value.outputStatement.name"/>
+                                            </td>
+                                            <td>
+                                                <t t-esc="line_value.inputStatement.name"/>
+                                            </td>
+                                            <td>
+                                                <t t-set="monto" t-value="line_value.amount"/>
+                                                <t t-set="decimalSeparator" t-value="line_value.outputStatement.currency.decimalSeparator"/>
+                                                <t t-set="thousandsSeparator" t-value="line_value.outputStatement.currency.thousandsSeparator"/>
+                                                <t t-set="decimalPlaces" t-value="line_value.outputStatement.currency.decimalPlaces"/>
+                                                <t t-set="symbol" t-value="line_value.outputStatement.currency.symbol"/>
+                                                <t t-js="ctx">
+                                                    ctx.monto = accounting.formatMoney(ctx.monto, ctx.symbol,ctx.decimalPlaces,ctx.thousandsSeparator,ctx.decimalSeparator);
+                                                </t>
+                                                <t t-esc="monto"/>
+                                            </td>
+                                        </tr>
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                        <div class="row">
+                            <div class="col-xs-6">
+                                <label class="statement-input-labe">Caja Origen</label>
+                                <div class="statement-input-group">
+                                    <input type="text" class="form-control statement-input-number input-letters statement-output" readonly="readonly"></input>
+                                </div>
+                            </div>
+                            <div class="col-xs-6">
+                                <label class="statement-input-labe">Caja Destino</label>
+                                <div class="statement-input-group">
+                                    <input type="text" class="form-control statement-input-number input-letters statement-input" readonly="readonly"></input>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="row">
+                            <div class="col-xs-6">
+                                <label class="statement-input-labe">Referencia</label>
+                                <div class="statement-input-group">
+                                    <input type="text" class="form-control statement-input-number input-letters transfer-ref" readonly="readonly"></input>
+                                </div>
+                            </div>
+                            <div class="col-xs-6">
+                                <label class="statement-input-labe">Monto</label>
+                                <div class="statement-input-group">
+                                    <input type="text" class="form-control statement-input-number transfer-amount" readonly="readonly" value="0"></input>
+                                    <div class="statement-input-symbol transfer-amount-symbol">
+                                        <span class="input-group-text"></span>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+
+                        <div class="row">
+                            <div class="col-xs-12">
+                                <label class="statement-input-labe">Motivo</label>
+                                <div class="statement-input-group">
+                                    <input type="text" class="form-control statement-input-number input-letters ref-transfer-deleted"></input>
+                                </div>
+                            </div>
+                        </div>
+
+                    </div>
+                    <!-- Pie de Pagina -->
+                    <div class="modal-footer statement-utility-footer">
+                        <button type="button" class="oe_button oe_form_button oe_highlight statement-utility-button button-deleted">Guardar</button>
+                        <button type="button" class="oe_button oe_form_button oe_link dismmis-modal statement-utility-button" data-dismiss="modal">Salir</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </t>
+</template>

+ 65 - 0
static/src/xml/modal/modal_statement_unlink.xml

@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="ModalStatementUtility.Unlink">
+        <div class="modal in expired-account-modal" tabindex="-1" role="dialog">
+            <div class="modal-dialog modal-lg" role="document">
+                <div class="modal-content openerp">
+                    <div class="widget-content widget-loading-unlink-statement">
+                        <i class='fa fa-cog fa-spin fa-3x fa-fw'></i>
+                    </div>
+                    <div class="modal-header paymnets-invoice-header">
+                        <button type="button" class="close" data-dismiss="modal" aria-label="Close" aria-hidden="true">×</button>
+                        <h3 class="modal-title">Eliminar caja</h3>
+                    </div>
+                    <!-- Body -->
+                    <div class="modal-body">
+                        <div class="row statement-line">
+                            <label class="confirm-title" style="padding-left: 30px"> Movimiento </label>
+                        </div>
+                        <!-- table -->
+                        <div class=" oe_view_manager_body unlink-statement-table statement-line">
+                            <div class="modal-head-wrapper-statement-unlink">
+                                <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">Fecha</th>
+                                            <th class="oe_list_header_char oe_sortable">Referencia</th>
+                                            <th class="oe_list_header_char oe_sortable">Valor</th>
+                                        </tr>
+                                    </thead>
+                                </table>
+                            </div>
+                            <div class="modal-item-statement-unlink">
+                                <table class="oe_list_content">
+                                    <tbody class="table-tbody">
+                                        <tr t-foreach="statementLine" t-as="line">
+                                            <td>
+                                                <t t-esc="line_value.id"/>
+                                            </td>
+                                            <td>
+                                                <t t-esc="line_value.date"/>
+                                            </td>
+                                            <td>
+                                                <t t-esc="line_value.name"/>
+                                            </td>
+                                            <td>
+                                                <t t-esc="line_value.amount"/>
+                                            </td>
+                                        </tr>
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                        <div class="line-unlink-messege"></div>
+                    </div>
+                    <!-- footer -->
+                    <div class="modal-footer statement-utility-footer">
+                        <button type="button" class="oe_button oe_form_button oe_highlight statement-utility-button button-save">Aceptar</button>
+                        <button type="button" class="oe_button oe_form_button oe_link dismmis-modal statement-utility-button" data-dismiss="modal">Salir</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </t>
+</template>

+ 8 - 0
static/src/xml/modal_statement_line_unlink.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templates xml:space="preserve">
+    <t t-name="EiruStatementUtility.LineUnlink">
+        <button class="button-statement-line-unlink eiru-statement-button oe_button oe_form_button oe_highlight">
+            <span>Eliminar Movimientos</span>
+        </button>
+  </t>
+</templates>

+ 65 - 0
views/account_bank_statement_type.xml

@@ -0,0 +1,65 @@
+<?xml version="1.0"?>
+<openerp>
+    <data>
+
+        <function model="account.bank.statement.type" name="createDefaultState"/>
+
+        <record id="eiru_account_bank_statement_type_form" model="ir.ui.view">
+            <field name="name">eiru.account.bank.statement.type.form</field>
+            <field name="model">account.bank.statement.type</field>
+            <field name="arch" type="xml">
+                <form string="Tipo de Caja ">
+                    <group>
+                        <div class="oe_title">
+                            <label for="name" class="oe_edit_only"/>
+                            <h1>
+                                <field name="name" required="1"/>
+                            </h1>
+                        </div>
+                    </group>
+                    <group col="2">
+                        <group style="margin: 0px">
+                            <field name="code" string="Código"/>
+                        </group>
+                        <group style="margin: 0px">
+                            <field name="active" string="Activo"/>
+                        </group>
+                    </group>
+                    <group string="Descripción" >
+                            <field name="comment"/>
+                    </group>
+                </form>
+            </field>
+        </record>
+
+        <!-- tree -->
+        <record id="eiru_account_bank_statement_type_tree" model="ir.ui.view">
+            <field name="name">eiru.account.bank.statement.type.tree</field>
+            <field name="model">account.bank.statement.type</field>
+            <field name="arch" type="xml">
+                <tree>
+                    <field name="name"/>
+                    <field name="code"/>
+                    <field name="active"/>
+                    <field name="comment"/>
+                </tree>
+            </field>
+        </record>
+
+        <record id="eiru_account_bank_statement_type" model="ir.actions.act_window">
+            <field name="name">Tipo de Caja </field>
+            <field name="res_model">account.bank.statement.type</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">tree,form</field>
+            <field name="target">current</field>
+        </record>
+
+        <menuitem
+            id="eiru_account_bank_statement_type_menu"
+            name="Tipo de Cajas"
+            parent="account.menu_finance_bank_and_cash"
+            action="eiru_account_bank_statement_type"
+            sequence="14"/>
+
+    </data>
+</openerp>

+ 211 - 0
views/account_bank_statemente_config.xml

@@ -0,0 +1,211 @@
+<?xml version="1.0"?>
+<openerp>
+    <data>
+        <record id="eiru_account_bank_statement_config_form" model="ir.ui.view">
+            <field name="name">eiru.account.bank.statement.config.form</field>
+            <field name="model">account.bank.statement.config</field>
+            <field name="arch" type="xml">
+                <form string="Configuración de Caja">
+                    <group>
+                        <div class="oe_title">
+                            <label for="name" class="oe_edit_only"/>
+                            <h1>
+                                <field name="name" required="1"/>
+                            </h1>
+                        </div>
+                    </group>
+                    <group col="2">
+                        <group>
+                            <field name="active" string="Activo"/>
+                        </group>
+                    </group>
+
+                    <notebook>
+                        <!-- Pagos && RRHH -->
+                        <page string="Forma de sincronizar los pago en caja.">
+                            <notebook>
+                                <!-- Pagos de venta/compras/devoluciones -->
+                                <page string="Pagos de ventas/compras/gastos/devoluciones.">
+                                    <separator string="Define como sera la sincronización de los pago con las cajas." style="font-size: 12pt"/>
+                                    <group style="margin: 0px" string="Forma de sincronizar los pagos.">
+                                        <label for="import_statement_payments" string="Tipo de sincronización" style="width: 200px"></label>
+                                        <field name="import_statement_payments"  style="width: 200px" nolabel="1" />
+                                    </group>
+                                </page>
+
+                                <!-- Pagos de nominas adelanto -->
+                                <page string="Pago de nominas y adelantos.">
+                                    <separator string="Define como sera la sincronización de los pago con las cajas." style="font-size: 12pt"/>
+                                    <group style="margin: 0px" string="Forma de sincronizar los pagos.">
+                                        <label for="import_statement_payslip" string="Tipo de sincronización" style="width: 200px"></label>
+                                        <field name="import_statement_payslip"  style="width: 200px" nolabel="1"/>
+                                    </group>
+                                </page>
+                            </notebook>
+                        </page>
+                        <!-- Transacciones de caja (transferencia, Poner/sacar dienro) -->
+                        <page string="Transacciones de caja">
+                            <notebook>
+                                <!-- TRANSFERENCIA -->
+                                <page string="Transferencias de cajas">
+                                    <separator string="Permite a los usuarios a realizar transferencia de valores para otras cajas." style="font-size: 12pt"/>
+                                    <group col="2">
+                                        <group style="margin: 0px" string="Cajas permitidas">
+                                            <label for="transfer_statement_ids" string="Tipos de caja permitidas" style="width: 200px"></label>
+                                            <field name="transfer_statement_ids" widget="many2many_checkboxes" nolabel="1"/>
+                                        </group>
+                                        <group style="margin: 0px" string="Usuarios permitidos">
+                                            <label for="transfer_user_ids" string="Usuarios permitidos" style="width: 200px"></label>
+                                            <field name="transfer_user_ids" class="oe_inline"  widget="many2many_tags" options="{'no_create': True}" nolabel="1"/>
+                                        </group>
+                                    </group>
+                                    <group col='2'>
+                                        <group string="Transferencia sin saldo en caja">
+                                            <label for="transfer_negative_amount" string="Permitir transferencia sin saldo" style="width: 200px"></label>
+                                            <field name="transfer_negative_amount" class="oe_inline" nolabel="1"/>
+                                        </group>
+                                        <group string="Eliminar transferencia">
+                                            <label for="delete_transfer_user_ids" string="Usuarios permitidos" style="width: 200px"></label>
+                                            <field name="delete_transfer_user_ids" class="oe_inline"  widget="many2many_tags" options="{'no_create': True}" nolabel="1"/>
+                                        </group>
+                                    </group>
+                                </page>
+                                <!-- Poner Dinero -->
+                                <page string="Poner dinero">
+                                    <separator string="Permite a los usuario ingresar dinero en las cajas." style="font-size: 12pt"/>
+                                    <group col="2">
+                                        <group style="margin: 0px" string="Cajas permitidas">
+                                            <label for="input_cash_box_statement_ids" string="Tipos de caja permitidas" style="width: 200px"></label>
+                                            <field name="input_cash_box_statement_ids" widget="many2many_checkboxes"  nolabel="1"/>
+                                        </group>
+                                        <group style="margin: 0px"  string="Usuarios permitidos">
+                                            <label for="input_cash_box_user_id" string="Usuarios permitidos" style="width: 200px"></label>
+                                            <field name="input_cash_box_user_id" widget="many2many_tags" options="{'no_create': True}" nolabel="1"/>
+                                        </group>
+                                    </group>
+                                    <group col="2">
+                                        <group string="Eliminar las entradas de dinero">
+                                            <label for="delete_input_user_ids" string="Usuarios permitidos" style="width: 200px"></label>
+                                            <field name="delete_input_user_ids" class="oe_inline"  widget="many2many_tags" options="{'no_create': True}" nolabel="1"/>
+                                        </group>
+                                    </group>
+                                </page>
+                                <!-- Sacar Dinero -->
+                                <page string="Sacar dinero">
+                                    <separator string="Permite a los usuario extraer dinero de las cajas." style="font-size: 12pt"/>
+                                    <group col="2">
+                                        <group style="margin: 0px" string="Cajas permitidas">
+                                            <label for="output_cash_box_statement_ids" string="Tipos de caja permitidas" style="width: 200px"></label>
+                                            <field name="output_cash_box_statement_ids" widget="many2many_checkboxes" nolabel="1"/>
+                                        </group>
+                                        <group style="margin: 0px" string="Usuarios permitidos">
+                                            <label for="output_cash_box_user_id" string="Usuarios permitidos" style="width: 200px"></label>
+                                            <field name="output_cash_box_user_id" widget="many2many_tags" options="{'no_create': True}" nolabel="1"/>
+                                        </group>
+                                    </group>
+                                    <group col="2">
+                                        <group string="Sacar dinero sin saldo en caja">
+                                            <label for="output_negative_amount" string="Permitir sacar dinero" style="width: 200px"></label>
+                                            <field name="output_negative_amount" class="oe_inline" nolabel="1"/>
+                                        </group>
+                                        <group string="Eliminar las extracción de dinero">
+                                            <label for="delete_output_user_ids" string="Usuarios permitidos" style="width: 200px"></label>
+                                            <field name="delete_output_user_ids" class="oe_inline"  widget="many2many_tags" options="{'no_create': True}" nolabel="1"/>
+                                        </group>
+                                    </group>
+                                </page>
+                            </notebook>
+                        </page>
+
+                        <!-- Caja (Abir, cerrar, Cancelar cajas) -->
+                        <page string='Caja'>
+                            <notebook>
+                                <!-- Abrir a caja  -->
+                                <page string="Apertura de caja ">
+                                    <separator string="Permite configurar si el usuario podrá o no tener mas de una caja abierta." style="font-size: 12pt"/>
+                                    <group string="Apertura de caja">
+                                        <label for="statement_open_config" string="Permitir abrir mas de una caja" style="width: 200px"></label>
+                                        <field name="statement_open_config"  style="width: 200px" nolabel="1" />
+                                    </group>
+                                </page>
+                                <!-- Cerrar caja  -->
+                                <page string="Cierre de caja">
+                                    <separator string="Permite configurar si el usuario  podrá hacer el cierre de caja, la transferencia a caja General o el ajuste de saldo." style="font-size: 12pt"/>
+                                    <group col="2">
+                                        <group  string="Cerrar caja">
+                                            <label for="statement_confirm_user" string="Usuarios permitidos" style="width: 200px"></label>
+                                            <field name="statement_confirm_user" class="oe_inline"  widget="many2many_tags" options="{'no_create': True}" nolabel="1"/>
+                                        </group>
+                                        <group string="Ajuste de saldo de cierre">
+                                            <label for="statement_confirm_balance" string="Usuarios permitidos" style="width: 200px"></label>
+                                            <field name="statement_confirm_balance" class="oe_inline"  widget="many2many_tags" options="{'no_create': True}" nolabel="1"/>
+                                        </group>
+                                    </group>
+                                    <group col="2">
+                                        <group  string ="Transferencia a caja general">
+                                            <label for="statement_confirm_transfer_user" string="Usuarios permitidos" style="width: 200px"></label>
+                                            <field name="statement_confirm_transfer_user" class="oe_inline"  widget="many2many_tags" options="{'no_create': True}" nolabel="1"/>
+                                        </group>
+                                        <group string="Permitir cerrar caja sin saldo">
+                                            <label for="statement_confirm_negative_amount" string="Usuarios permitidos" style="width: 200px"></label>
+                                            <field name="statement_confirm_negative_amount" class="oe_inline"  widget="many2many_tags" options="{'no_create': True}" nolabel="1"/>
+                                        </group>
+                                    </group>
+                                </page>
+                                <!-- Cancelar Caja  -->
+                                <page string="Cancelar Caja">
+                                    <separator string="Permite configurar si el usuario podrá cancelar la caja." style="font-size: 12pt"/>
+                                    <group col="2">
+                                        <group string="Permitir cancelar caja.">
+                                            <label for="statement_cancel_user" string="Usuarios permitidos" style="width: 200px"></label>
+                                            <field name="statement_cancel_user" class="oe_inline"  widget="many2many_tags" options="{'no_create': True}" nolabel="1"/>
+                                        </group>
+
+                                    </group>
+                                </page>
+                                <page string="Eliminar Caja">
+                                    <separator string="Permite configurar si el usuario podrá eliminar las cajas." style="font-size: 12pt"/>
+                                    <group col="2">
+                                        <group string="Permitir eliminar cajas.">
+                                            <label for="statement_unlink_user" string="Usuarios permitidos" style="width: 200px"></label>
+                                            <field name="statement_unlink_user" class="oe_inline"  widget="many2many_tags" options="{'no_create': True}" nolabel="1"/>
+                                        </group>
+
+                                    </group>
+                                </page>
+                            </notebook>
+                        </page>
+
+                    </notebook>
+                </form>
+            </field>
+        </record>
+
+        <!-- tree -->
+        <record id="eiru_account_bank_statement_config_tree" model="ir.ui.view">
+            <field name="name">eiru.account.bank.statement.config.tree</field>
+            <field name="model">account.bank.statement.config</field>
+            <field name="arch" type="xml">
+                <tree>
+                    <field name="name"/>
+                </tree>
+            </field>
+        </record>
+
+        <record id="eiru_bank_statement_config" model="ir.actions.act_window">
+            <field name="name">Configuración de Caja</field>
+            <field name="res_model">account.bank.statement.config</field>
+            <field name="view_type">form</field>
+            <field name="view_mode">tree,form</field>
+            <field name="target">current</field>
+        </record>
+
+        <menuitem
+            id="eiru_account_bank_statement_config"
+            name="Configuración de Caja"
+            parent="account.menu_finance_bank_and_cash"
+            action="eiru_bank_statement_config"
+            sequence="15"/>
+
+    </data>
+</openerp>

+ 75 - 0
views/eiru_statement_utility.xml

@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+	<data>
+		<!-- Registros de caja -->
+        <record id="eiru_statement_utility_cash" model="ir.ui.view">
+            <field name="name">eiru.statement.utility.cash</field>
+            <field name="model">account.bank.statement</field>
+            <field name="inherit_id" ref="account.view_bank_statement_form2"/>
+            <field name="arch" type="xml">
+				<field name='state' position="before">
+					<div class="eiru-statement-utility" attrs="{'invisible': [('state','!=','open')]}"></div>
+				</field>
+				<field name='state' position="before">
+					<div class="eiru-statement-unlink" attrs="{'invisible': [('state','==','confirm')]}"></div>
+				</field>
+				<!-- open -->
+				<xpath expr="//button[@name='button_open']" position="replace">
+					<div class="eiru-statement-utility-open" states="draft"> </div>
+				</xpath>
+				<!-- confirm -->
+				<xpath expr="//button[@name='button_confirm_cash']" position="replace"></xpath>
+				<!-- Cancel  -->
+				<xpath expr="//button[@name='button_cancel']" position="replace">
+					<div class="eiru-statement-utility-cancel" attrs="{'invisible': [('state','!=','confirm')]}"></div>
+				</xpath>
+				<!-- print -->
+				<field name='state' position="before">
+					<div class="eiru-statement-print" attrs="{'invisible': [('state','!=','confirm')]}"></div>
+				</field>
+
+            </field>
+        </record>
+
+		<!-- button_draft  -->
+		<record id="eiru_statement_utility_cash_cancel" model="ir.ui.view">
+            <field name="name">eiru.statement.utility.cash.cancel</field>
+            <field name="model">account.bank.statement</field>
+            <field name="inherit_id" ref="account_cancel.bank_statement_draft_form_inherit2"/>
+            <field name="arch" type="xml">
+				<xpath expr="//button[@name='button_draft']" position="replace"></xpath>
+            </field>
+        </record>
+
+		<!-- Extractos bancarios -->
+		<record id="eiru_statement_utility_bank" model="ir.ui.view">
+            <field name="name">eiru.statement.utility.bank</field>
+            <field name="model">account.bank.statement</field>
+            <field name="inherit_id" ref="account.view_bank_statement_form"/>
+			<field name="arch" type="xml">
+				<!-- Utility cashbox -->
+				<field name='state' position="before">
+					<div class="eiru-statement-utility" attrs="{'invisible': [('state','!=','open')]}"></div>
+				</field>
+				<!--  Eliminar -->
+				<field name='state' position="before">
+					<div class="eiru-statement-unlink" attrs="{'invisible': [('state','==','confirm')]}"></div>
+				</field>
+				<!-- Cancel cashbox -->
+				<xpath expr="//button[@name='button_cancel']" position="replace">
+					<div class="eiru-statement-utility-cancel" attrs="{'invisible': [('state','!=','confirm')]}"></div>
+				</xpath>
+				<!-- Open cashbox -->
+				<xpath expr="//button[@name='button_confirm_bank']" position="replace">
+					<div class="eiru-statement-utility-open" states="draft"> </div>
+				</xpath>
+				<!-- Resume -->
+				<field name='state' position="before">
+					<div class="eiru-statement-print" attrs="{'invisible': [('state','!=','confirm')]}"></div>
+				</field>
+
+				<xpath expr="//button[@name='button_draft']" position="replace"></xpath>
+            </field>
+        </record>
+	</data>
+</openerp>

+ 64 - 0
views/import_statement.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+	<data>
+		<function model="account.bank.statement" name="update_statement_type_defualt"/>
+
+		<!-- Registros de caja -->
+        <record id="eiru_import_statement_cash" model="ir.ui.view">
+            <field name="name">eiru.import.statement.cash</field>
+            <field name="model">account.bank.statement</field>
+            <field name="inherit_id" ref="account.view_bank_statement_form2"/>
+            <field name="arch" type="xml">
+				<field name='state' position="before">
+					<div class="import-statement" attrs="{'invisible': [('state','!=','open')]}"></div>
+				</field>
+				<field name="journal_id" position='after'>
+					<field name="type_statement"/>
+				</field>
+            </field>
+        </record>
+
+		<!-- Extractos bancarios -->
+		<record id="eiru_import_statement_bank" model="ir.ui.view">
+            <field name="name">eiru.import.statement.bank</field>
+            <field name="model">account.bank.statement</field>
+            <field name="inherit_id" ref="account.view_bank_statement_form"/>
+            <field name="arch" type="xml">
+				<field name='state' position="before">
+					<div class="import-statement" attrs="{'invisible': [('state','!=','draft')]}"></div>
+				</field>
+				<field name="journal_id" position='after'>
+					<field name="type_statement"/>
+				</field>
+            </field>
+        </record>
+
+		<!-- Agrupación por tipo de caja  cash-->
+		<record id="eiru_import_statement_search" model="ir.ui.view">
+			<field name="name">eiru.import.statement.search</field>
+			<field name="model">account.bank.statement</field>
+			<field name="inherit_id" ref="account.view_account_bank_statement_filter"/>
+			<field name="arch" type="xml">
+				<search>
+					 <group expand="0" string="Group By">
+						<filter string="Tipo de Caja" context="{'group_by':'type_statement'}"/>
+					</group>
+				</search>
+			</field>
+		</record>
+
+		<!-- Agrupación por tipo de caja Bank -->
+		<record id="eiru_import_statement_search_bank" model="ir.ui.view">
+			<field name="name">eiru.import.statement.search.bank</field>
+			<field name="model">account.bank.statement</field>
+			<field name="inherit_id" ref="account.view_bank_statement_search"/>
+			<field name="arch" type="xml">
+				<search>
+					 <group expand="0" string="Group By">
+						<filter string="Tipo de Caja" context="{'group_by':'type_statement'}"/>
+					</group>
+				</search>
+			</field>
+		</record>
+	</data>
+</openerp>

+ 34 - 0
views/template.xml

@@ -0,0 +1,34 @@
+<openerp>
+    <data>
+        <template id="eiru_account_bank_statement_utility.eiru_assets" name="eiru_account_bank_statement_utility_assets" inherit_id="eiru_assets.assets">
+            <xpath expr="." position="inside">
+                <link rel="stylesheet" href="/eiru_account_bank_statement_utility/static/src/css/style.css"/>
+                <!-- Initial  -->
+                <script type="text/javascript" src="/eiru_account_bank_statement_utility/static/src/js/eiru_statement_init.js"/>
+                <!-- transferencia -->
+                <script type="text/javascript" src="/eiru_account_bank_statement_utility/static/src/js/eiru_statement_transfer.js"/>
+                <script type="text/javascript" src="/eiru_account_bank_statement_utility/static/src/js/eiru_statement_transfer_deleted.js"/>
+                <!-- Poner dinero  -->
+                <script type="text/javascript" src="/eiru_account_bank_statement_utility/static/src/js/eiru_statement_cashbox_input.js"/>
+                <!-- Sacar dinero  -->
+                <script type="text/javascript" src="/eiru_account_bank_statement_utility/static/src/js/eiru_statement_cashbox_output.js"/>
+                <!-- unlink -->
+                <script type="text/javascript" src="/eiru_account_bank_statement_utility/static/src/js/eiru_statement_cashbox_deleted.js"/>
+                <!-- Abrir caja -->
+                <script type="text/javascript" src="/eiru_account_bank_statement_utility/static/src/js/eiru_statement_open.js"/>
+                <!-- Cerrar caja  -->
+                <script type="text/javascript" src="/eiru_account_bank_statement_utility/static/src/js/eiru_statement_confirm.js"/>
+                <!-- print confirm -->
+                <script type="text/javascript" src="/eiru_account_bank_statement_utility/static/src/js/eiru_statement_confirm_print.js"/>
+                <!-- cancel statement -->
+                <script type="text/javascript" src="/eiru_account_bank_statement_utility/static/src/js/eiru_statement_cancel.js"/>
+                <!-- Suprimir Caja  -->
+                <script type="text/javascript" src="/eiru_account_bank_statement_utility/static/src/js/eiru_statement_unlink.js"/>
+                <!-- Eliminar lineas de la caja  -->
+                <!-- <script type="text/javascript" src="/eiru_account_bank_statement_utility/static/src/js/modal_statement_line_unlink.js"/> -->
+                <!-- Importar Cajas -->
+                <!-- <script type="text/javascript" src="/eiru_account_bank_statement_utility/static/src/js/import_statement.js"/> -->
+            </xpath>
+        </template>
+    </data>
+</openerp>