Como fraccionar pagos

31 de julio de 2023 por
Gustavo Orrillo
| Sin comentarios aún
 

En paises como Argentina (a veces) se necesita fraccionar los pagos. Por qué ? Es sencillo, muchas veces nos pagan con un cheque... y necesitamos hacer que un monto determinado de un cheque pague la factura X y otro monto determinado pague la factura Y. A veces los clientes lo piden así e insisten que el mundo se les viene abajo si no lo hacen. Odoo naturalmente no lo soporta (porque es algo muy argentino, esta práctica va contra el sentido comun del resto del planeta) y por esto tuvimos que hacer el módulo payment_split.

Más alla de describir el funcionamiento del módulo, queremos ilustrar la importancia de entender la contabilidad en Odoo, y las puertas que ello abre. Lo que hace el módulo payment_split es en cada pago (el modelo account.payment, no confundir con un recibo ya que un recibo cuenta con múltiples pagos) agregar un botón llamado "Fraccionar pago".


Cuando se clickea el botón "Fraccionar pago", se muestra una ventana de diálogo que permite fraccionar el pago en múltiples pagos. 


Este fraccionamiento permite crear múltiples pagos (con los montos arbitrarios) para que luego sean conciliados con las facturas. Este módulo es para la versión 14 de Odoo, es posible que necesite ser cambiado para posteriores versiones. Pero los principios contables para particionar pagos siguen siendo los mismos.

Generando planes de pago para las facturas

Utilizando los principios indicados por este post (y utilizando las cuentas corrientes apropiadas) es posible agregar un botón a la factura e invocar un wizard que permita agregar un plan de pagos para la factura. Al confirmarse la información ingresada en el wizard, se deberá crear un asiento contable con el monto de la cuenta cobrable de la factura acreditando la factura (y conciliandola ya que estamos). Y acreditando con la fecha indicada, el monto de cada una de las facturas. Así de sencillo.

Anexo técnico


Si revisamos el código lo primero que vemos en el modelo de cheques (account.check, ahora lo mismo podríamos hacerlo en el modelo de pagos, account.payment) un botón que llama un wizard. Para ello al clickearse el botón se necesita retornar una acción, para ello se debe hacer lo siguiente:

wizard_id = self.env['payment.split.wizard'].create({'payment_id': self.id})
return {
'name': _('Fraccionar pago'),
'res_model': 'payment.split.wizard',
'res_id': wizard_id.id,
'view_mode': 'form',
'type': 'ir.actions.act_window',
'target': 'new',
}

Primero se crea un objeto del wizard (que es un modelo transitorio), y luego se retorna un diccionario con la información de la acción. Esta es la técnica que permite crear la ventana del wizard, que es donde ocurre toda la acción (técnica aplicada cuando uno clickea por ejemplo, los smart-buttons que relacionan las transacciones). 

Como se particiona un pago? Primero veamos como es el asiento contable de un cheque de $100 (el cual queremos fraccionar en dos pagos de $50);



Para fraccionar el pago, lo que se debe hacer es crear otro asiento en el que haya una línea que concilie la línea cobrable/pagable del asiento del cheque (la cuenta es Valores a depositar); y tantas líneas cobrables/pagables que se van a usar para conciliar la factura (en este ejemplo tendremos dos líneas)


Esto ocurre en el botón de confirmación del wizard. En las siguientes líneas se puede ver como se crea un asiento contable con los apuntes como fueron detallados anteriormente;


vals_move = {
'journal_id': self.journal_id.id,
'type': 'entry',
'ref': 'SPLIT ' + str(self.payment_id.display_name),
}
move_id = self.env['account.move'].with_context(check_move_validity=False).create(vals_move)
vals_debit = {
'split_payment_id': self.payment_id.id,
'move_id': move_id.id,
'debit': total_amount,
'partner_id': self.payment_id.partner_id.id,
'account_id': payment_move_line[0].account_id.id,
'name': 'Particion pago DR %s'%(self.payment_id.display_name),
}
debit_id = self.env['account.move.line'].with_context(check_move_validity=False).create(vals_debit)
for line_amount in self.line_ids:
vals_credit = {
'split_payment_id': self.payment_id.id,
'move_id': move_id.id,
'credit': line_amount.amount,
'partner_id': self.payment_id.partner_id.id,
'account_id': payment_move_line[0].account_id.id,
'name': 'Particion pago CR %s'%(self.payment_id.display_name),
}
credit_id = self.env['account.move.line'].with_context(check_move_validity=False).create(vals_credit)
move_id.post()

Como mencioné párrafos atrás, solo funciona en Odoo 14, ya que el campo type en el modelo account.move fue reemplazado por el campo move_type. También tomen nota del contexto check_move_validity seteado a False, así podemos crear asientos no balanceados.

El último paso es conciliar el apunte contable del cheque con el apunte contable del asiento que acabamos de crear. Para ello tenemos que hacer varias cosas; primero determinar el apunte contable conciliable del cheque. Eso se hace encontrando la cuenta contable conciliable (cobrable / pagable) del cheque y agregandola a un recordset vacío del modelo account.move.line;

payment_move_line = self.env['account.move.line']
for move_line in self.payment_id.move_line_ids:
if move_line.account_id.reconcile:
payment_move_line += move_line

Luego se debe conciliar dicha línea con el apunte contable (del asiento creado) que debita el total del monto del cheque (en el ejemplo el apunte contable 3)

payment_move_line += debit_id
payment_move_line.reconcile() 

Esto permitirá en las facturas del cliente observar los apuntes del pago fraccionado (disponibles para conciliar la factura). El mismo método se lo puede utilizar tambien para transferencias bancarias o pagos en efectivo, pero es común que ocurra con cheques. 




Gustavo Orrillo 31 de julio de 2023
Compartir
Categorías
Archivar
Identificarse dejar un comentario