From eeae7b34d55eb7a2d0c5126044da435ff47b4e89 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 1 Mar 2013 13:16:16 +0100 Subject: [PATCH] [ADD] completion rule to look on supplier_invoice_number --- account_statement_base_completion/data.xml | 9 ++- .../statement.py | 79 ++++++++++++++----- 2 files changed, 66 insertions(+), 22 deletions(-) diff --git a/account_statement_base_completion/data.xml b/account_statement_base_completion/data.xml index e00ea323..7b144d6b 100644 --- a/account_statement_base_completion/data.xml +++ b/account_statement_base_completion/data.xml @@ -7,7 +7,7 @@ 60 get_from_label_and_partner_field - + Match from line label (based on partner name) 70 @@ -26,7 +26,12 @@ get_from_ref_and_invoice + + Match from line reference (based on Invoice Supplier number) + 40 + get_from_ref_and_invoice + + - diff --git a/account_statement_base_completion/statement.py b/account_statement_base_completion/statement.py index a475cda7..91577b7c 100644 --- a/account_statement_base_completion/statement.py +++ b/account_statement_base_completion/statement.py @@ -107,6 +107,7 @@ class AccountStatementCompletionRule(Model): """ return [ ('get_from_ref_and_invoice', 'From line reference (based on invoice number)'), + ('get_from_ref_and_supplier_invoice', 'From line reference (based on supplier invoice number)'), ('get_from_ref_and_so', 'From line reference (based on SO number)'), ('get_from_label_and_partner_field', 'From line label (based on partner field)'), ('get_from_label_and_partner_name', 'From line label (based on partner name)'), @@ -122,9 +123,9 @@ class AccountStatementCompletionRule(Model): 'function_to_call': fields.selection(_get_functions, 'Method'), } - def get_from_ref_and_invoice(self, cr, uid, line_id, context=None): + def get_from_ref_and_supplier_invoice(self, cr, uid, line_id, context=None): """ - Match the partner based on the invoice number and the reference of the statement + Match the partner based on the invoice supplier invoice number and the reference of the statement line. Then, call the generic get_values_for_line method to complete other values. If more than one partner matched, raise the ErrorTooManyPartner error. @@ -137,32 +138,70 @@ class AccountStatementCompletionRule(Model): ...} """ + st_obj = self.pool['account.bank.statement.line'] + st_line = st_obj.browse(cr, uid, line_id, context=context) + res = {} + inv_obj = self.pool.get('account.invoice') + if st_line: + inv_id = inv_obj.search(cr, + uid, + [('supplier_invoice_number', '=', st_line.ref), + ('type', 'in', ('in_invoice', 'in_refund'))], + context=context) + if inv_id: + if len(inv_id) == 1: + inv = inv_obj.browse(cr, uid, inv_id[0], context=context) + res['partner_id'] = inv.partner_id.id + else: + raise ErrorTooManyPartner(_('Line named "%s" (Ref:%s) was matched by more ' + 'than one partner.') % (st_line.name, st_line.ref)) + st_vals = st_obj.get_values_for_line(cr, + uid, + profile_id=st_line.statement_id.profile_id.id, + partner_id=res.get('partner_id', False), + line_type=st_line.type, + amount=st_line.amount, + context=context) + res.update(st_vals) + return res + + def get_from_ref_and_invoice(self, cr, uid, line_id, context=None): + """ + Match the partner based on the invoice number and the reference of the statement + line. Then, call the generic get_values_for_line method to complete other values. + If more than one partner matched, raise the ErrorTooManyPartner error. + + :param int/long line_id: id of the concerned account.bank.statement.line + :return: + A dict of value that can be passed directly to the write method of + the statement line or {} + {'partner_id': value, + 'account_id' : value, + ...} + """ st_obj = self.pool.get('account.bank.statement.line') st_line = st_obj.browse(cr, uid, line_id, context=context) res = {} if st_line: inv_obj = self.pool.get('account.invoice') - inv_id = inv_obj.search( - cr, - uid, - [('number', '=', st_line.ref)], - context=context) + inv_id = inv_obj.search(cr, + uid, + [('number', '=', st_line.ref)], + context=context) if inv_id: - if inv_id and len(inv_id) == 1: + if len(inv_id) == 1: inv = inv_obj.browse(cr, uid, inv_id[0], context=context) res['partner_id'] = inv.partner_id.id - elif inv_id and len(inv_id) > 1: - raise ErrorTooManyPartner( - _('Line named "%s" (Ref:%s) was matched by more ' - 'than one partner.') % (st_line.name, st_line.ref)) - st_vals = st_obj.get_values_for_line( - cr, - uid, - profile_id=st_line.statement_id.profile_id.id, - partner_id=res.get('partner_id', False), - line_type=st_line.type, - amount=st_line.amount, - context=context) + else: + raise ErrorTooManyPartner(_('Line named "%s" (Ref:%s) was matched by more ' + 'than one partner.') % (st_line.name, st_line.ref)) + st_vals = st_obj.get_values_for_line(cr, + uid, + profile_id=st_line.statement_id.profile_id.id, + partner_id=res.get('partner_id', False), + line_type=st_line.type, + amount=st_line.amount, + context=context) res.update(st_vals) return res