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