diff --git a/account_statement_base_completion/data.xml b/account_statement_base_completion/data.xml index e00ea323..59a75228 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) + 45 + get_from_ref_and_supplier_invoice + + - diff --git a/account_statement_base_completion/statement.py b/account_statement_base_completion/statement.py index a475cda7..a0f2df18 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="supplier", + 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 diff --git a/account_statement_ext/statement.py b/account_statement_ext/statement.py index e5277782..9d34a2a4 100644 --- a/account_statement_ext/statement.py +++ b/account_statement_ext/statement.py @@ -499,14 +499,14 @@ class AccountBankSatementLine(Model): res = {} obj_partner = self.pool.get('res.partner') obj_stat = self.pool.get('account.bank.statement') - receiv_account = pay_account = account_id = False + line_type = receiv_account = pay_account = account_id = False # If profile has a receivable_account_id, we return it in any case if profile_id: profile = self.pool.get("account.statement.profile").browse( cr, uid, profile_id, context=context) if profile.receivable_account_id: - res['account_id'] = profile.receivable_account_id.id - res['type'] = 'general' + account_id = profile.receivable_account_id.id + line_type = 'general' return res # If partner -> take from him if partner_id: @@ -521,18 +521,16 @@ class AccountBankSatementLine(Model): # based on line_type first, then amount, otherwise take receivable one. if line_type is not False: if line_type == 'supplier': - res['account_id'] = pay_account - else: - res['account_id'] = receiv_account + account_id = pay_account elif amount is not False: if amount >= 0: - res['account_id'] = receiv_account - res['type'] = 'customer' + account_id = receiv_account + line_type = 'customer' else: - res['account_id'] = pay_account - res['type'] = 'supplier' - if not account_id: - res['account_id'] = receiv_account + account_id = pay_account + line_type = 'supplier' + res['account_id'] = account_id if account_id else receiv_account + res['type'] = line_type return res def onchange_partner_id(self, cr, uid, ids, partner_id, profile_id=None, context=None):