From 9562bf8398d7e45835c0d2fab0b19cc91de4ab2c Mon Sep 17 00:00:00 2001 From: Goffin Simon Date: Fri, 6 Mar 2015 13:48:11 +0100 Subject: [PATCH] [FIX] account_payment: supplier invoice on more then one payment oder The field move_line_id only shows account move lines that still have an amount to pay. This was lost during 333e83fc5ba22bcd16cfd3b4f492710c2c4a8d5e. opw: 625946 --- addons/account_payment/account_move_line.py | 42 ++++++++++++++++++- .../account_payment/account_payment_view.xml | 2 +- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/addons/account_payment/account_move_line.py b/addons/account_payment/account_move_line.py index c0d670d72e9..f909ad6c0a0 100644 --- a/addons/account_payment/account_move_line.py +++ b/addons/account_payment/account_move_line.py @@ -19,12 +19,47 @@ # ############################################################################## -from openerp.osv import osv +from openerp.osv import fields, osv from openerp.tools.translate import _ +from operator import itemgetter class account_move_line(osv.osv): _inherit = "account.move.line" + def _amount_residual(self, cr, uid, ids, field_names, args, context=None): + return self._amount_residual(self, cr, uid, ids, field_names, args, context=context) + + def _to_pay_search(self, cr, uid, obj, name, args, context=None): + if not args: + return [] + line_obj = self.pool.get('account.move.line') + query = line_obj._query_get(cr, uid, context={}) + where = ' and '.join(map(lambda x: '''(SELECT + CASE WHEN l.amount_currency < 0 + THEN - l.amount_currency + ELSE l.credit + END - coalesce(sum(pl.amount_currency), 0) + FROM payment_line pl + INNER JOIN payment_order po ON (pl.order_id = po.id) + WHERE move_line_id = l.id + AND po.state != 'cancel' + ) %(operator)s %%s ''' % {'operator': x[1]}, args)) + sql_args = tuple(map(itemgetter(2), args)) + + cr.execute(('''SELECT id + FROM account_move_line l + WHERE account_id IN (select id + FROM account_account + WHERE type=%s AND active) + AND reconcile_id IS null + AND credit > 0 + AND ''' + where + ' and ' + query), ('payable',)+sql_args ) + + res = cr.fetchall() + if not res: + return [('id', '=', '0')] + return [('id', 'in', map(lambda x:x[0], res))] + def line2bank(self, cr, uid, ids, payment_type=None, context=None): """ Try to return for each Ledger Posting line a corresponding bank @@ -57,5 +92,10 @@ class account_move_line(osv.osv): raise osv.except_osv(_('Error!'), _('There is no partner defined on the entry line.')) return line2bank + _columns = { + 'amount_to_pay': fields.function(_amount_residual, + type='float', string='Amount to pay', fnct_search=_to_pay_search), + } + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_payment/account_payment_view.xml b/addons/account_payment/account_payment_view.xml index c186e58d7b2..2d2748ec17d 100644 --- a/addons/account_payment/account_payment_view.xml +++ b/addons/account_payment/account_payment_view.xml @@ -93,7 +93,7 @@ - +