Procházet zdrojové kódy

[FIX] Cancelar caja

adrielso před 6 roky
rodič
revize
2761e65e8e

+ 0 - 79
models/account_bank_statement.py

@@ -26,82 +26,3 @@ class AccountBankStatement(models.Model):
             statementUpdate.write({
                 'type_statement': type.id
             })
-
-
-    # @api.multi
-    # def button_cancel(self):
-        # import web_pdb; web_pdb.set_trace()
-
-    # @api.model
-    # def get_statement_point_of_sale(self, id):
-    #     accountStatement = self.env['account.bank.statement'].browse(id)
-    #     decimal_precision = self.env['decimal.precision'].precision_get('Account')
-    #     if (not accountStatement):
-    #         return False
-    #
-    #     statementPointOfSale = self._get_statement_point_of_sale(accountStatement)
-    #     if (not statementPointOfSale):
-    #         return False
-    #
-    #     statementLine = []
-    #
-    #     for line in statementPointOfSale:
-    #         lineStatement = self.env['account.bank.statement.line'].search([('name', '=', line['name'])])
-    #         if (not lineStatement):
-    #             amount = line['amount']
-    #
-    #             statementLine.append([0, False, {
-    #                 'name': line['name'],
-    #                 'ref' : 'Responsable/'+line['userName'],
-    #                 'amount': round(float(amount), decimal_precision),
-    #                 'journal_id': accountStatement.journal_id.id,
-    #                 'account_id': accountStatement.journal_id.internal_account_id.id,
-    #                 'statement_id': accountStatement.id,
-    #                 'date': line['date'],
-    #             }])
-    #
-    #     line = []
-    #
-    #     if (not statementLine):
-    #         return False
-    #
-    #     line = accountStatement.write({'line_ids': statementLine})
-    #     if (not line):
-    #         return False
-    #
-    #     return len(statementLine)
-    #
-    # '''
-    #     Get Account Bank Statement Point of Sale
-    # '''
-    # def _get_statement_point_of_sale(self, statement):
-    #     statementPoint = self.env['account.bank.statement'].search([
-    #                                                                 ('date','=',statement.date),
-    #                                                                 ('journal_id.id', '=',statement.journal_id.id),
-    #                                                                 ('period_id.id', '=', statement.period_id.id),
-    #                                                                 ('type_statement', '=', 'normal'),
-    #                                                                 ('state', '=', 'confirm')], order='id')
-    #     pointSatatement = []
-    #
-    #     for statementP in statementPoint:
-    #         amount = 0.0
-    #         for line in statementP.line_ids:
-    #             amount += line.amount
-    #
-    #         if (statementP.balance_start > 0):
-    #             amount += statementP.balance_start
-    #
-    #         if (amount != 0):
-    #             pointSatatement.append({
-    #                 'name': statementP.name,
-    #                 'date': statementP.date,
-    #                 'journalId': statementP.journal_id.id,
-    #                 'periodId': statementP.period_id.id,
-    #                 'userId': statementP.user_id.id,
-    #                 'userName': statementP.user_id.name,
-    #                 # 'posSessionId': statementP.pos_session_id.id,
-    #                 # 'posSessionName': statementP.pos_session_id.name,
-    #                 'amount': amount
-    #             })
-    #
-    #     return pointSatatement

+ 18 - 157
models/account_bank_statement_utility.py

@@ -164,7 +164,8 @@ class AccountBankStatementUtility(models.Model):
             }
         } for transfer in self.env['cash.box.transfer'].search(['|', ('output_statement.id','=',id), ('input_statement.id','=',id)])]
 
-    '''       _____                     __
+    '''
+              _____                     __
              |_   _| __ __ _ _ __  ___ / _| ___ _ __ ___
                | || '__/ _` | '_ \/ __| |_ / _ \ '__/ __|
                | || | | (_| | | | \__ \  _|  __/ |  \__ \
@@ -614,8 +615,13 @@ class AccountBankStatementUtility(models.Model):
             '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):
@@ -624,7 +630,7 @@ class AccountBankStatementUtility(models.Model):
         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, abs(casBox.amount_next_open), '')
+            lineTransfer = self._create_statement_line_transfer(statement, name, abs(casBox.amount_next_open), 'Apertura')
             if (not lineTransfer):
                 return {
                     'state': False,
@@ -634,7 +640,8 @@ class AccountBankStatementUtility(models.Model):
             confirmCasBox = self.env['cashbox.statement.confirm'].browse(casBox.id)
             values = {
                         'statement_open': statement.id,
-                         'state_avaliable': False
+                        'line_open':  lineTransfer.id,
+                        'state_avaliable': False
                     }
 
             confirmCasBox = self._writer_cashbox_statement_confirm(confirmCasBox,values)
@@ -646,7 +653,12 @@ class AccountBankStatementUtility(models.Model):
         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)])
+        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),
+                                                                ('statement_id.id', '!=', statement.id)
+                                                            ])
 
     '''
         writer casbox statement confirm
@@ -660,154 +672,3 @@ class AccountBankStatementUtility(models.Model):
     @api.multi
     def button_open(self):
         return super(AccountBankStatementUtility, self).button_open()
-
-    '''
-           ____          _     ____               ____             __ _
-          / ___|__ _ ___| |__ | __ )  _____  __  / ___|___  _ __  / _(_)_ __ _ __ ___
-         | |   / _` / __| '_ \|  _ \ / _ \ \/ / | |   / _ \| '_ \| |_| | '__| '_ ` _ \
-         | |__| (_| \__ \ | | | |_) | (_) >  <  | |__| (_) | | | |  _| | |  | | | | | |
-          \____\__,_|___/_| |_|____/ \___/_/\_\  \____\___/|_| |_|_| |_|_|  |_| |_| |_|
-    '''
-    '''
-        get Statement 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)])]
-
-    '''
-        Create cashbox Confirm
-    '''
-    def _create_cashbox_statement_confirm(self,values):
-        return self.env['cashbox.statement.confirm'].create(values)
-
-    '''
-        Cerrar Caja
-    '''
-    # @api.multi
-    # def button_confirm_cash(self):
-    #     return super(AccountBankStatementUtility, self).button_confirm_cash()
-
-
-    @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 al obtener la caja."
-            }
-
-        amountStatement = 0.0
-        for line in bankStatement.line_ids:
-            amountStatement += line.amount
-        if (bankStatement.balance_start > 0):
-            amountStatement += bankStatement.balance_start
-
-        ### Difference
-        lineBalance = []
-        if (amountStatement != values['amountReal']):
-            name = "Ajuste de cierre de caja "
-            amount = (values['amountReal'] - amountStatement)
-            lineBalance = self._create_statement_line_transfer(bankStatement, name, amount, 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 ="Reserva para el próximo 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': abs(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) else False,
-            'casbox_transfer_id': cash_box_transfer.id if (cash_box_transfer) else ''
-        }
-
-        statementConfirm = self._create_cashbox_statement_confirm(cashboxConfirm)
-        if (not statementConfirm):
-            return {
-                'state': False,
-                'message': "Error en el cierre de caja ."
-            }
-
-        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."
-        }

+ 117 - 12
models/cashbox_statement_cancel.py

@@ -70,8 +70,25 @@ class eiru_account_statement_cancel(models.Model):
                     'name': casBox.statement_open.name if (casBox.statement_open) else '',
                     'state': casBox.statement_open.state if (casBox.statement_open) else '',
                     'statementUser': str(casBox.statement_open.name) +" / "+str(casBox.statement_open.user_id.name) if (casBox.statement_open) else ''
-                }
-            } for casBox in self.env['cashbox.statement.confirm'].search(['|', ('statement_id.id','=',statement.id), ('statement_open.id','=',statement.id)])],
+                },
+                '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 casBox in self.env['cashbox.statement.confirm'].search(['|', ('statement_id.id','=',statement.id), ('statement_open.id','=',statement.id)])],
         } for statement in self.env['account.bank.statement'].search([('id','=',id)])]
 
 
@@ -88,6 +105,18 @@ class eiru_account_statement_cancel(models.Model):
     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
     '''
@@ -99,14 +128,16 @@ class eiru_account_statement_cancel(models.Model):
         statement = self._eiru_get_account_bank_statement(values['statementId'])
         if (not statement):
             return {
-                'state': False
+                '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
+                'state': False,
+                'messege':"Error en obtener el usuario. ref(res.users) "
             }
 
         # Creatre Line cancel
@@ -137,33 +168,107 @@ class eiru_account_statement_cancel(models.Model):
         statementCancel = self.env['cashbox.statement.cancel'].create(cancel)
         if (not statementCancel):
             return {
-                'state': False
+                'state': False,
+                'messege': 'Error en el registro de cancelación de caja. ref(cashbox.statement.cancel /cashbox.statement.cancel.line).'
+            }
+
+        '''
+            Confirm
+        '''
+        cashBoxConfirm = self._eiru_account_get_cashbox_confirm(statement.id)
+        if (not cashBoxConfirm):
+            return {
+                'state': False,
+                'messege': "Error en obtener el registro de cierre de caja. ref(cashbox.statement.confirm)."
             }
 
-        ## Cancel statement
+        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
+                '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
         open = statement.button_open()
         if (not open):
             return {
-                'state': False
+                'state': False,
+                'messege': 'Error en reabrir la caja  ref('+statement+')'
             }
 
         return {
-            'state': True
+            'state': True,
+            'messege': 'Caja reabierta'
         }
 
+    '''
+        Cancelar Caja
+    '''
     def eiru_button_cancel(self,statement):
-        # return super(eiru_account_statement_cancel, statement).button_cancel()
         return super(eiru_account_statement_cancel, statement.with_context(cancel_from_statement=True)).button_cancel()
 
+
 '''
-    Registro de caja cancel.
+    Histórico de Cajas Canceladas.
 '''
 class cashbox_statement_cancel(models.Model):
     _name = "cashbox.statement.cancel"

+ 214 - 7
models/cashbox_statement_confirm.py

@@ -4,6 +4,7 @@ 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')
@@ -21,6 +22,7 @@ class cashbox_statement_confirm(models.Model):
     ## 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)
@@ -28,7 +30,8 @@ class cashbox_statement_confirm(models.Model):
     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')
+    # 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.
@@ -43,9 +46,16 @@ class cashbox_statement_confirm(models.Model):
         @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 casbox_transfer_id  = id transferencia
+        @fields cashbox_transfer_ids= id transferencia
     '''
 
+    '''
+          ____       _       _      ____             __ _
+         |  _ \ _ __(_)_ __ | |_   / ___|___  _ __  / _(_)_ __ _ __ ___
+         | |_) | '__| | '_ \| __| | |   / _ \| '_ \| |_| | '__| '_ ` _ \
+         |  __/| |  | | | | | |_  | |__| (_) | | | |  _| | |  | | | | | |
+         |_|   |_|  |_|_| |_|\__|  \____\___/|_| |_|_| |_|_|  |_| |_| |_| v 1.0
+    '''
     @api.model
     def get_cashbox_statement_confirm(self, statementId):
         return[{
@@ -79,9 +89,206 @@ class cashbox_statement_confirm(models.Model):
             'amountReal': casBox.amount_real,
             'amountDifference': casBox.amount_difference if (casBox.amount_real >= casBox.amount_statement) else (-casBox.amount_difference),
             'amountNextOpen': casBox.amount_next_open,
-            'transferCasBox': {
-                'id': casBox.casbox_transfer_id.id if(casBox.casbox_transfer_id) else '',
-                'name': casBox.casbox_transfer_id.name if(casBox.casbox_transfer_id) else '',
-                'amount': casBox.casbox_transfer_id.amount if(casBox.casbox_transfer_id) else 0
-            },
+            '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)
+
+
+'''    ____          _     _                  ____             __ _
+      / ___|__ _ ___| |__ | |__   _____  __  / ___|___  _ __  / _(_)_ __ _ __ ___
+     | |   / _` / __| '_ \| '_ \ / _ \ \/ / | |   / _ \| '_ \| |_| | '__| '_ ` _ \
+     | |__| (_| \__ \ | | | |_) | (_) >  <  | |__| (_) | | | |  _| | |  | | | | | |
+      \____\__,_|___/_| |_|_.__/ \___/_/\_\  \____\___/|_| |_|_| |_|_|  |_| |_| |_| 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': abs(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) 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

+ 43 - 50
static/src/css/style.css

@@ -314,9 +314,9 @@
     margin-top: 5px !important;
 }
 .confirm-title {
-    font-size: 11pt !important;
-    margin-top: 0px;
-    margin-bottom: 10px;
+    font-size: 13pt !important;
+    margin-top: 15px;
+    margin-bottom: 5px;
     padding-left: 12px;
     color: #ccc;
 }
@@ -336,7 +336,6 @@
 }
 .expired-account-modal .modal-head-wrapper-statement-cancel-transfer {
     width: 100%;
-    background: red !important;
 }
 .expired-account-modal .modal-item-statement-cancel-transfer {
     width: 100%;
@@ -418,92 +417,86 @@
     display: none;
     margin-top: 5px;
     margin-left: 20px;
-    font-weight: bold;
+    /* 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-transfer-table{
+.cancel-confirm-table {
     margin-top: 0px !important;
+    margin-bottom: 0px !important;
 }
-.expired-account-modal .modal-head-wrapper-statement-cancel-transfer {
+.expired-account-modal .modal-head-wrapper-statement-cancel-confirm {
     width: 100%;
-    background: red !important;
 }
-.expired-account-modal .modal-item-statement-cancel-transfer {
+.expired-account-modal .modal-item-statement-cancel-confirm {
     width: 100%;
-    height: 106px;
+    height: 74px;
     overflow-y: auto;
-} */
-/* .expired-account-modal .cancel-transfer-table table tbody tr {
+}
+.expired-account-modal .cancel-confirm-table table tbody tr {
     height: 35px;
 }
-.expired-account-modal .cancel-transfer-table table thead tr {
+.expired-account-modal .cancel-confirm-table table thead tr {
     height: 40px !important;
-} */
+}
 /*id*/
-/* .expired-account-modal .cancel-transfer-table table tbody tr td:nth-child(1){
+.expired-account-modal .cancel-confirm-table table tbody tr td:nth-child(1){
     display: none;
 }
-.expired-account-modal .cancel-transfer-table table thead tr th:nth-child(1){
+.expired-account-modal .cancel-confirm-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 ;
+.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-transfer-table table thead tr th:nth-child(2){
-    width: 110px;
+}
+.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;
-} */
-/* statement  */
-/* .expired-account-modal .cancel-transfer-table table tbody tr td:nth-child(3){
-    width: 453px ;
+}
+/* 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-transfer-table table thead tr th:nth-child(3){
-    width: 453px;
+}
+.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-transfer-table table tbody tr td:nth-child(4){
-    width: 160px ;
+.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-transfer-table table thead tr th:nth-child(4){
-    width: 160px;
+}
+.expired-account-modal .cancel-confirm-table table thead tr th:nth-child(4){
+    width: 217px;
     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;
-} */
+}

+ 66 - 21
static/src/js/eiru_statement_cancel.js

@@ -134,34 +134,56 @@
                 return item.statementState === state;
             });
         },
+
         getStateTransfer: function(statement, id) {
             return _.filter(statement, function(item){
                 return item.id === id;
             });
         },
-        /* Get Statement Confirm*/
-        getStatementConfirm: function(){
+
+        /*Line Balance*/
+        filterConfirmLine: function() {
             var self = this;
+            var lineConfirm = [];
             var statement = self.bankStatement[0];
-            var confirm = [];
             var currency = statement.currencystatement;
             if (!currency)
                 return confirm;
 
-            _.each(statement.statementConfirm, function(item) {
-                if ((item.type === 'confirm') && (!item.statementOpen.statementUser))
-                    return false;
+            /* 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
+                });
+            });
 
-                confirm.push({
-                    'id': item.id,
-                    'date': moment(item.date).format("DD-MM-YYYY"),
-                    'amountNextOpen': accounting.formatNumber(item.amountNextOpen, currency.decimalPlaces, currency.thousandsSeparator, currency.decimalSeparator),
-                    'statement': item.type === 'open' ?item.statementConfirm.name :item.statementOpen.name,
-                    'statementUser': item.type === 'open' ?item.statementConfirm.statementUser :item.statementOpen.statementUser,
-                    'messege': 'Saldo de Apertura',
+            /* 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 confirm;
+            });
+
+            return lineConfirm;
+        },
+        getConfirmState: function(confirm, state, type) {
+            return _.filter(confirm,function(item){
+                return item.state === state && item.type === type;
+            });
         },
         /*Modal  */
         showModal: function() {
@@ -169,11 +191,11 @@
             var defer =$.Deferred();
             var results = true;
             var transfer = self.getTransfer();
-            var confirm = self.getStatementConfirm();
-
+            // var confirm = self.getStatementConfirm();
+            var line = self.filterConfirmLine();
             var modal = QWeb.render('ModalStatementUtility.Cancel',{
                 'transfer': transfer,
-                'confirm': confirm
+                'confirm': line
             });
 
             $('.openerp_webclient_container').after(modal);
@@ -182,8 +204,9 @@
             /* Transferencia */
             var cancelTransferMessege = $('.expired-account-modal').find('.cancel-transfer-messege');
             var tableTransfer = $('.expired-account-modal').find('.table-tbody-transfer').find('tr');
-            /* confirm */
+            /* 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 */
@@ -192,7 +215,7 @@
             if (!transfer.length)
                 $('.expired-account-modal').find('.cancel-transfer').css('display','none');
 
-            if (!confirm.length)
+            if (!line.length)
                 $('.expired-account-modal').find('.cancel-confirm').css('display','none');
 
 
@@ -214,6 +237,22 @@
                 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())){
@@ -224,16 +263,22 @@
                 }
                 messegeCancel.css('border-color','#ccc');
 
+                var lineConfirm = self.getConfirmState(line, 'confirm', 'reserve');
+
                 cancel = {
                     'statementId': self.id,
-                    'messege':messegeCancel.val()
+                    '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;
                 });

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

@@ -309,12 +309,6 @@
                 var transferAmount = accounting.unformat(amountTransfer.val(),currency.decimalSeparator);
                 var amount_negative =  _.contains(self.statementConfig[0].statement_confirm_negative_amount, self.resUser[0].id)
 
-                // if (!amount_negative) {
-                //     instanceWeb.notification.do_warn("Atencion", "El usuario no tiene autorización para cerrar la caja sin saldo.");
-                //     amountReal.css('border-color','red');
-                //     amountReal.focus();
-                //     return false;
-                // }
                 // amountReal
                 if ((realAmount <= 0) && (!amount_negative)) {
                     instanceWeb.notification.do_warn("Atencion", "El valor de cierre debes de ser mayo que 0.");

+ 10 - 2
static/src/js/eiru_statement_confirm_print.js

@@ -143,6 +143,10 @@
             pdfDoc.setFontStyle('normal');
             pdfDoc.text(110, y, currency.name);
 
+            var transferAmount = 0;
+            _.each(statementConfirm.transferCasBox, function(item){
+                transferAmount += item.amount
+            });
             /* Table */
             var getColumns = [
                 {
@@ -169,7 +173,7 @@
                 },
                 {
                     'ref': 'Transferencia a caja general ',
-                    'amount': accounting.formatNumber(statementConfirm.transferCasBox.amount, currency.decimalPlaces, currency.thousandsSeparator, currency.decimalSeparator)
+                    'amount': accounting.formatNumber(transferAmount, currency.decimalPlaces, currency.thousandsSeparator, currency.decimalSeparator)
                 },
                 {
                     'ref': 'Reserva para la próxima apertura',
@@ -221,6 +225,10 @@
                 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',
@@ -236,7 +244,7 @@
                 },
                 {
                     'ref': 'Transferencia a caja general ',
-                    'amount': accounting.formatNumber(statementConfirm.transferCasBox.amount, currency.decimalPlaces, currency.thousandsSeparator, currency.decimalSeparator)
+                    'amount': accounting.formatNumber(transferAmount, currency.decimalPlaces, currency.thousandsSeparator, currency.decimalSeparator)
                 },
                 {
                     'ref': 'Reserva para la próxima apertura',

+ 10 - 16
static/src/xml/modal/modal_statement_cancel.xml

@@ -41,11 +41,6 @@
                                             </td>
                                             <td>
                                                 <t t-esc="line_value.statementUser"/>
-                                                <!-- <t t-set="state" t-value="line_value.statementState"/>
-                                                <t t-js="ctx">
-                                                    ctx.state = ctx.state === "open" ?"Abierta": "Cerrada";
-                                                </t>
-                                                <t t-esc="'('+state+')'"/> -->
                                             </td>
                                             <td>
                                                 <t t-esc="line_value.amount"/>
@@ -65,23 +60,22 @@
                             <label class="confirm-title" style="padding-left: 30px">Cierre de cajas.</label>
                         </div>
                         <!-- table -->
-                        <div class=" oe_view_manager_body transfer-deleted-table  cancel-confirm">
-                            <div class="modal-head-wrapper-statement-transfer">
+                        <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">Caja</th>
-                                            <th class="oe_list_header_char oe_sortable">valor</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-transfer">
+                            <div class="modal-item-statement-cancel-confirm">
                                 <table class="oe_list_content">
-                                    <tbody class="table-tbody">
+                                    <tbody class="table-tbody-confirm">
                                         <tr t-foreach="confirm" t-as="line">
                                             <td>
                                                 <t t-esc="line_value.id"/>
@@ -90,21 +84,21 @@
                                                 <t t-esc="line_value.date"/>
                                             </td>
                                             <td>
-                                                <t t-esc="line_value.statementUser"/>
-                                            </td>
-                                            <td>
-                                                <t t-esc="line_value.amountNextOpen"/>
+                                                <t t-esc="line_value.name"/>
                                             </td>
                                             <td>
-                                                <t t-esc="line_value.messege"/>
+                                                <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>