Conciliando pagos de clientes con sus facturas en forma automática

25 de enero de 2024 por
Gustavo Orrillo
| Sin comentarios aún
 

Los pagos en Odoo se deben procesar en dos pasos. Primero se ingresa el pago, luego se lo concilia con las facturas o saldos de cuenta corriente pendientes. No es muy terrible, pero no es del todo práctico. Es por ello que muchos usuarios lo ven como una calamidad y piden que cuando ingresen un pago, se concilie con los saldos pendientes del cliente/proveedor. 

Es por eso que desarrollamos el módulo account-payment-reconcile, el cual agiliza dicho proceso. Este módulo agrega en los pagos un tab llamado "Facturas" en el cual cuando se selecciona el cliente (este módulo solo funciona para pagos de clientes) se agregan las facturas  (o saldos de cuenta corriente) pendientes de pago.


Cuando el usuario clickea Confirmar, el pago se concilia con la primer factura con saldo pendiente. Concilia una o más facturas, dependiendo del monto del pago.


Este módulo puede extenderse para dar soporte a pagos de proveedores (no es muy dificil) y para fraccionar el pago (ingresando en cada factura pendiente el monto a conciliar). Pero bueno, son temas para un futuro cercano

Notas técnicas

Dos puntos a notar aca. El primero, al cambiar el cliente llamamos un método que agrega las facturas (o saldos) pendientes de pago. Para ello busca en los apuntes contables aquellos apuntes con monto residual, que pertenezcan al cliente del pago y cuya cuenta contable sea la cuenta cobrable del cliente

 domain = [
('move_id.partner_id.id','=',self.partner_id.id),
('move_id.state','=','posted'),
('account_id','=',self.partner_id.property_account_receivable_id.id),
('move_id.move_type','in',['out_invoice','entry']),
('account_id.reconcile','=',True),
('amount_residual','!=',0),
]
 if self.payment_type == 'inbound':
domain.append(('debit','>',0))
amls = self.env['account.move.line'].search(domain)

Dichos apuntes los agrega a un modelo llamado account.payment.reconcile que contiene las lineas a conciliar con el pago.

Luego, se extiende el método action_post del pago (es el método que confirma la operación) y se concilia el pago con los apuntes no conciliados del cliente. Esto lo hace primero seleccionando el apunte contable de la cuenta cobrable del pago, y concilia dicho apunte con los apuntes no conciliados (es por esta clase de cosas que uno necesita conocer como funciona el método reconcile)

    def action_post(self):
res = super(AccountPayment, self).action_post()
for rec in self:
if rec.reconcile_ids:
aml_obj = self.env['account.move.line']
payment_line = None
for line in rec.move_id.line_ids:
if line.account_id.id == rec.partner_id.property_account_receivable_id.id:
payment_line = line
if payment_line:
aml_obj += payment_line
amount_uyu = 0
for reconcile_id in rec.reconcile_ids:
aml_obj += reconcile_id.move_line_id
amount_uyu = reconcile_id.amount_residual
aml_obj.reconcile()
return res​

Espero que el módulo les sea de utilidad...

Gustavo Orrillo 25 de enero de 2024
Compartir
Archivar
Identificarse dejar un comentario