Depositando cheques en Uruguay

23 de agosto de 2023 por
Gustavo Orrillo
| Sin comentarios aún
 

El módulo l10n_latam_check es interesante, esta bueno que se encuentre incorporado en el core de Odoo. En un cliente de Uruguay necesitabamos implementar la funcionalidad de cheques, y nos decidimos a utilizarlo debido a que si bien el módulo account_check brinda las mismas funcionalidades, son muchas más de las necesarias (rechazo de cheques, devolución del banco, por ejemplo). En cambio el cliente solo necesitaba cobrar cheques de sus clientes, y luego depositarlos. Es por ello que nos decidimos a utilizar el módulo l10n_latam_check y desarrollar un módulo llamado l10n_uy_check_deposit para implementar el depósito de los mismos.

Como funciona el módulo? Es sencillo, a los cheques que fueron recibidos pero aún no fueron depositados le agrega un botón denominado "Depositar" el cual despliega una ventana de diálogo pidiendo los datos para el depósito


Aquí podemos seleccionar el diario del banco donde vamos a depositar el cheque


Y al clickear confirmar se realizará el asiento de depósito correspondiente (al fin y al cabo el depósito bancario es un asiento contable en el que se debita la cuenta contable del banco). 

Un punto a tener en cuenta es, una vez depositado el cheque no puede cancelar el mismo. Se podría hacer dicha cancelación, pero bueno. Paso a paso.

Notas técnicas

Hay dos cosas para resaltar del código. El primero es como se muestra un wizard al clickearse un botón. Para ello desarrollamos un método que retorna una acción a la que le pasamos como parámetro un objeto creado del wizard, junto con el nombre del modelo:

    def deposit_check(self):
self.ensure_one()
if self.state not in ['posted']:
raise ValidationError(_('Cheque en estado incorrecto'))
vals = {
'payment_id': self.id,
}
wizard_id = self.env['deposit.check.wizard'].create(vals)
return {
'name': _('Deposit Check'),
'res_model': 'deposit.check.wizard',
'view_mode': 'form',
'res_id': wizard_id.id,
'type': 'ir.actions.act_window',
'target': 'new',
}

En este ejemplo, instanciamos un objeto del wizard y seteamos la variable del pago al pago con el que estamos trabajando. Y luego retornamos una acción pasandole como objeto el wizard que acabamos de crear.

El otro punto destacable es la creación del asiento contable. Primero se crea el asiento contable

vals_move = {
'journal_id': self.journal_id.id,
'ref': 'Deposito cheque %s'%(self.payment_id.check_number),
'date': str(date.today()),
'move_type': 'entry',
}
move_id = self.env['account.move'].create(vals_move)

Y luego creamos las líneas de débitos y créditos

vals_debit = {
'move_id': move_id.id,
'account_id': self.journal_id.default_account_id.id,
'name': 'Debito deposito cheque %s'%(self.payment_id.check_number),
'credit': 0,
'debit': abs(self.payment_id.amount_company_currency_signed),
'currency_id': self.payment_id.currency_id.id,
}
if self.payment_id.currency_id.id != self.payment_id.company_id.currency_id.id:
vals_debit['amount_currency'] = abs(self.payment_id.amount_signed)
debit_id = self.env['account.move.line'].with_context(check_move_validity=False)\
​.create(vals_debit)
vals_credit = {
'move_id': move_id.id,
'account_id': self.payment_id.journal_id.default_account_id.id,
'name': 'Credito deposito cheque %s'%(self.payment_id.check_number),
'debit': 0,
'credit': abs(self.payment_id.amount_company_currency_signed),
'currency_id': self.payment_id.currency_id.id,
}
if self.payment_id.currency_id.id != self.payment_id.company_id.currency_id.id:
vals_credit['amount_currency'] = self.payment_id.amount_signed * (-1)
credit_id = self.env['account.move.line'].with_context(check_move_validity=False)\
​.create(vals_credit)

Aquí pueden notar dos detalles. Primero cuando creamos el apunte contable (modelo account.move.line) le indicamos por contexto que no debe verificar la validez del asiento contable (sino daría error). Para ello seteamos el contexto con check_move_validity igual a False.

Por otra parte, indicamos la moneda de origen del cheque. Si el cheque fue en una moneda extranjera, el depósito lo vamos a hacer en moneda extranjera. Y para ello actualizamos la línea con la moneda extranjera y en la columna amount_currency actualizamos el valor en moneda extranjera.

Por último, validamos el asiento contable por medio de action_post

move_id.action_post()
Gustavo Orrillo 23 de agosto de 2023
Compartir
Archivar
Identificarse dejar un comentario