[FIX] account: reconcile models: inject selected partner and write-off details in the values sent to the widget
Before that, write-off rules with partner mapping did not work properly, as the partner they selected got lost when passing the values to the widget, which later made a second rpc call to fetch the write-off details. Now, we pass all the values directly, including the selected partner. This way, we remove the need for a second rpc call when processing the results for the reconcile models, and the partner is handled properly. X-original-commit: d74db80d11e603719eefa5799ac1f8ac2afa2540
This commit is contained in:
@@ -273,12 +273,15 @@ class AccountReconcileModel(models.Model):
|
||||
new_aml_dicts = []
|
||||
for tax_res in res['taxes']:
|
||||
tax = self.env['account.tax'].browse(tax_res['id'])
|
||||
balance = tax_res['amount']
|
||||
|
||||
new_aml_dicts.append({
|
||||
'account_id': tax_res['account_id'] or base_line_dict['account_id'],
|
||||
'name': tax_res['name'],
|
||||
'partner_id': base_line_dict.get('partner_id'),
|
||||
'balance': tax_res['amount'],
|
||||
'balance': balance,
|
||||
'debit': balance > 0 and balance or 0,
|
||||
'credit': balance < 0 and -balance or 0,
|
||||
'analytic_account_id': tax.analytic and base_line_dict['analytic_account_id'],
|
||||
'analytic_tag_ids': tax.analytic and base_line_dict['analytic_tag_ids'],
|
||||
'tax_exigible': tax_res['tax_exigibility'],
|
||||
@@ -290,7 +293,13 @@ class AccountReconcileModel(models.Model):
|
||||
})
|
||||
|
||||
# Handle price included taxes.
|
||||
base_line_dict['balance'] = tax_res['base']
|
||||
base_balance = tax_res['base']
|
||||
base_line_dict.update({
|
||||
'balance': base_balance,
|
||||
'debit': base_balance > 0 and base_balance or 0,
|
||||
'credit': base_balance < 0 and -base_balance or 0,
|
||||
})
|
||||
|
||||
base_line_dict['tax_tag_ids'] = [(6, 0, res['base_tags'])]
|
||||
return new_aml_dicts
|
||||
|
||||
@@ -327,6 +336,8 @@ class AccountReconcileModel(models.Model):
|
||||
writeoff_line = {
|
||||
'name': line.label or st_line.payment_ref,
|
||||
'balance': balance,
|
||||
'debit': balance > 0 and balance or 0,
|
||||
'credit': balance < 0 and -balance or 0,
|
||||
'account_id': line.account_id.id,
|
||||
'currency_id': False,
|
||||
'analytic_account_id': line.analytic_account_id.id,
|
||||
@@ -461,6 +472,9 @@ class AccountReconcileModel(models.Model):
|
||||
model_rslt, new_reconciled_aml_ids, new_treated_aml_ids = rec_model._get_rule_result(st_line, candidates, aml_ids_to_exclude, reconciled_amls_ids, partner)
|
||||
|
||||
if model_rslt:
|
||||
# We inject the selected partner (possibly coming from the rec model)
|
||||
model_rslt['partner']= partner
|
||||
|
||||
results[st_line.id] = model_rslt
|
||||
reconciled_amls_ids |= new_reconciled_aml_ids
|
||||
aml_ids_to_exclude |= new_treated_aml_ids
|
||||
@@ -888,15 +902,16 @@ class AccountReconcileModel(models.Model):
|
||||
return candidates_by_priority
|
||||
|
||||
def _get_writeoff_suggestion_rule_result(self, st_line, partner):
|
||||
# Create write-off lines.
|
||||
lines_vals_list = self._prepare_reconciliation(st_line, partner=partner)
|
||||
|
||||
rslt = {
|
||||
'model': self,
|
||||
'status': 'write_off',
|
||||
'aml_ids': [],
|
||||
'write_off_vals': lines_vals_list,
|
||||
}
|
||||
|
||||
# Create write-off lines.
|
||||
lines_vals_list = self._prepare_reconciliation(st_line, partner=partner)
|
||||
|
||||
# Process auto-reconciliation.
|
||||
if lines_vals_list and self.auto_reconcile:
|
||||
if not st_line.partner_id and partner:
|
||||
|
||||
@@ -186,20 +186,23 @@ class TestReconciliationMatchingRules(AccountTestInvoicingCommon):
|
||||
statements = self.bank_st + self.cash_st
|
||||
statement_lines = statements.mapped('line_ids').sorted()
|
||||
matching_values = rules._apply_rules(statement_lines, None)
|
||||
|
||||
for st_line_id, values in matching_values.items():
|
||||
values.pop('reconciled_lines', None)
|
||||
values.pop('write_off_vals', None)
|
||||
self.assertDictEqual(values, expected_values[st_line_id])
|
||||
|
||||
def test_matching_fields(self):
|
||||
# Check without restriction.
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_1.id: {'aml_ids': [self.invoice_line_1.id], 'model': self.rule_1},
|
||||
self.bank_line_1.id: {'aml_ids': [self.invoice_line_1.id], 'model': self.rule_1, 'partner': self.bank_line_1.partner_id},
|
||||
self.bank_line_2.id: {'aml_ids': [
|
||||
self.invoice_line_2.id,
|
||||
self.invoice_line_3.id,
|
||||
self.invoice_line_1.id,
|
||||
], 'model': self.rule_1},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1},
|
||||
], 'model': self.rule_1,
|
||||
'partner': self.bank_line_2.partner_id},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1, 'partner': self.cash_line_1.partner_id},
|
||||
})
|
||||
|
||||
def test_matching_fields_match_text_location(self):
|
||||
@@ -207,45 +210,45 @@ class TestReconciliationMatchingRules(AccountTestInvoicingCommon):
|
||||
self.rule_1.match_text_location_reference = False
|
||||
self.rule_1.match_text_location_note = False
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_3.id: {'aml_ids': [self.invoice_line_5.id], 'model': self.rule_1},
|
||||
self.bank_line_4.id: {'aml_ids': [self.invoice_line_7.id], 'model': self.rule_1},
|
||||
self.bank_line_5.id: {'aml_ids': [self.invoice_line_6.id], 'model': self.rule_1},
|
||||
self.bank_line_3.id: {'aml_ids': [self.invoice_line_5.id], 'model': self.rule_1, 'partner': self.bank_line_3.partner_id},
|
||||
self.bank_line_4.id: {'aml_ids': [self.invoice_line_7.id], 'model': self.rule_1, 'partner': self.bank_line_4.partner_id},
|
||||
self.bank_line_5.id: {'aml_ids': [self.invoice_line_6.id], 'model': self.rule_1, 'partner': self.bank_line_5.partner_id},
|
||||
}, statements=self.bank_st_2)
|
||||
|
||||
self.rule_1.match_text_location_label = True
|
||||
self.rule_1.match_text_location_reference = False
|
||||
self.rule_1.match_text_location_note = True
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_3.id: {'aml_ids': [self.invoice_line_6.id], 'model': self.rule_1},
|
||||
self.bank_line_4.id: {'aml_ids': [self.invoice_line_7.id], 'model': self.rule_1},
|
||||
self.bank_line_5.id: {'aml_ids': [self.invoice_line_5.id], 'model': self.rule_1},
|
||||
self.bank_line_3.id: {'aml_ids': [self.invoice_line_6.id], 'model': self.rule_1, 'partner': self.bank_line_3.partner_id},
|
||||
self.bank_line_4.id: {'aml_ids': [self.invoice_line_7.id], 'model': self.rule_1, 'partner': self.bank_line_4.partner_id},
|
||||
self.bank_line_5.id: {'aml_ids': [self.invoice_line_5.id], 'model': self.rule_1, 'partner': self.bank_line_5.partner_id},
|
||||
}, statements=self.bank_st_2)
|
||||
|
||||
self.rule_1.match_text_location_label = True
|
||||
self.rule_1.match_text_location_reference = True
|
||||
self.rule_1.match_text_location_note = False
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_3.id: {'aml_ids': [self.invoice_line_5.id], 'model': self.rule_1},
|
||||
self.bank_line_4.id: {'aml_ids': [self.invoice_line_7.id], 'model': self.rule_1},
|
||||
self.bank_line_5.id: {'aml_ids': [self.invoice_line_7.id], 'model': self.rule_1},
|
||||
self.bank_line_3.id: {'aml_ids': [self.invoice_line_5.id], 'model': self.rule_1, 'partner': self.bank_line_3.partner_id},
|
||||
self.bank_line_4.id: {'aml_ids': [self.invoice_line_7.id], 'model': self.rule_1, 'partner': self.bank_line_4.partner_id},
|
||||
self.bank_line_5.id: {'aml_ids': [self.invoice_line_7.id], 'model': self.rule_1, 'partner': self.bank_line_5.partner_id},
|
||||
}, statements=self.bank_st_2)
|
||||
|
||||
self.rule_1.match_text_location_label = True
|
||||
self.rule_1.match_text_location_reference = True
|
||||
self.rule_1.match_text_location_note = True
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_3.id: {'aml_ids': [self.invoice_line_6.id], 'model': self.rule_1},
|
||||
self.bank_line_4.id: {'aml_ids': [self.invoice_line_7.id], 'model': self.rule_1},
|
||||
self.bank_line_5.id: {'aml_ids': [self.invoice_line_7.id], 'model': self.rule_1},
|
||||
self.bank_line_3.id: {'aml_ids': [self.invoice_line_6.id], 'model': self.rule_1, 'partner': self.bank_line_3.partner_id},
|
||||
self.bank_line_4.id: {'aml_ids': [self.invoice_line_7.id], 'model': self.rule_1, 'partner': self.bank_line_4.partner_id},
|
||||
self.bank_line_5.id: {'aml_ids': [self.invoice_line_7.id], 'model': self.rule_1, 'partner': self.bank_line_5.partner_id},
|
||||
}, statements=self.bank_st_2)
|
||||
|
||||
self.rule_1.match_text_location_label = False
|
||||
self.rule_1.match_text_location_reference = False
|
||||
self.rule_1.match_text_location_note = False
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_3.id: {'aml_ids': [self.invoice_line_5.id], 'model': self.rule_1},
|
||||
self.bank_line_4.id: {'aml_ids': [self.invoice_line_5.id], 'model': self.rule_1},
|
||||
self.bank_line_5.id: {'aml_ids': [self.invoice_line_6.id], 'model': self.rule_1},
|
||||
self.bank_line_3.id: {'aml_ids': [self.invoice_line_5.id], 'model': self.rule_1, 'partner': self.bank_line_3.partner_id},
|
||||
self.bank_line_4.id: {'aml_ids': [self.invoice_line_5.id], 'model': self.rule_1, 'partner': self.bank_line_4.partner_id},
|
||||
self.bank_line_5.id: {'aml_ids': [self.invoice_line_6.id], 'model': self.rule_1, 'partner': self.bank_line_5.partner_id},
|
||||
}, statements=self.bank_st_2)
|
||||
|
||||
def test_matching_fields_match_journal_ids(self):
|
||||
@@ -253,26 +256,26 @@ class TestReconciliationMatchingRules(AccountTestInvoicingCommon):
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_1.id: {'aml_ids': []},
|
||||
self.bank_line_2.id: {'aml_ids': []},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1, 'partner': self.cash_line_1.partner_id},
|
||||
})
|
||||
self.rule_1.match_journal_ids |= self.bank_st.journal_id + self.cash_st.journal_id
|
||||
|
||||
def test_matching_fields_match_nature(self):
|
||||
self.rule_1.match_nature = 'amount_received'
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_1.id: {'aml_ids': [self.invoice_line_1.id], 'model': self.rule_1},
|
||||
self.bank_line_1.id: {'aml_ids': [self.invoice_line_1.id], 'model': self.rule_1, 'partner': self.bank_line_1.partner_id},
|
||||
self.bank_line_2.id: {'aml_ids': [
|
||||
self.invoice_line_2.id,
|
||||
self.invoice_line_3.id,
|
||||
self.invoice_line_1.id,
|
||||
], 'model': self.rule_1},
|
||||
], 'model': self.rule_1, 'partner': self.bank_line_2.partner_id},
|
||||
self.cash_line_1.id: {'aml_ids': []},
|
||||
})
|
||||
self.rule_1.match_nature = 'amount_paid'
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_1.id: {'aml_ids': []},
|
||||
self.bank_line_2.id: {'aml_ids': []},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1, 'partner': self.cash_line_1.partner_id},
|
||||
})
|
||||
self.rule_1.match_nature = 'both'
|
||||
|
||||
@@ -280,7 +283,7 @@ class TestReconciliationMatchingRules(AccountTestInvoicingCommon):
|
||||
self.rule_1.match_amount = 'lower'
|
||||
self.rule_1.match_amount_max = 150
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_1.id: {'aml_ids': [self.invoice_line_1.id], 'model': self.rule_1},
|
||||
self.bank_line_1.id: {'aml_ids': [self.invoice_line_1.id], 'model': self.rule_1, 'partner': self.bank_line_1.partner_id},
|
||||
self.bank_line_2.id: {'aml_ids': []},
|
||||
self.cash_line_1.id: {'aml_ids': []},
|
||||
})
|
||||
@@ -292,8 +295,8 @@ class TestReconciliationMatchingRules(AccountTestInvoicingCommon):
|
||||
self.invoice_line_1.id,
|
||||
self.invoice_line_2.id,
|
||||
self.invoice_line_3.id,
|
||||
], 'model': self.rule_1},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1},
|
||||
], 'model': self.rule_1, 'partner': self.bank_line_2.partner_id},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1, 'partner': self.cash_line_1.partner_id},
|
||||
})
|
||||
self.rule_1.match_amount = 'between'
|
||||
self.rule_1.match_amount_min = 200
|
||||
@@ -304,7 +307,7 @@ class TestReconciliationMatchingRules(AccountTestInvoicingCommon):
|
||||
self.invoice_line_1.id,
|
||||
self.invoice_line_2.id,
|
||||
self.invoice_line_3.id,
|
||||
], 'model': self.rule_1},
|
||||
], 'model': self.rule_1, 'partner': self.bank_line_2.partner_id},
|
||||
self.cash_line_1.id: {'aml_ids': []},
|
||||
})
|
||||
self.rule_1.match_amount = False
|
||||
@@ -315,14 +318,14 @@ class TestReconciliationMatchingRules(AccountTestInvoicingCommon):
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_1.id: {'aml_ids': []},
|
||||
self.bank_line_2.id: {'aml_ids': []},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1, 'partner': self.cash_line_1.partner_id},
|
||||
})
|
||||
self.rule_1.match_label = 'not_contains'
|
||||
self.rule_1.match_label_param = 'xxxxx'
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_1.id: {'aml_ids': [self.invoice_line_1.id], 'model': self.rule_1},
|
||||
self.bank_line_1.id: {'aml_ids': [self.invoice_line_1.id], 'model': self.rule_1, 'partner': self.bank_line_1.partner_id},
|
||||
self.bank_line_2.id: {'aml_ids': []},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1, 'partner': self.cash_line_1.partner_id},
|
||||
})
|
||||
self.rule_1.match_label = 'match_regex'
|
||||
self.rule_1.match_label_param = 'xxxxx|yyyyy'
|
||||
@@ -332,8 +335,8 @@ class TestReconciliationMatchingRules(AccountTestInvoicingCommon):
|
||||
self.invoice_line_1.id,
|
||||
self.invoice_line_2.id,
|
||||
self.invoice_line_3.id,
|
||||
], 'model': self.rule_1},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1},
|
||||
], 'model': self.rule_1, 'partner': self.bank_line_2.partner_id},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1, 'partner': self.cash_line_1.partner_id},
|
||||
})
|
||||
self.rule_1.match_label = False
|
||||
|
||||
@@ -342,13 +345,13 @@ class TestReconciliationMatchingRules(AccountTestInvoicingCommon):
|
||||
self.rule_1.match_total_amount_param = 90.0
|
||||
self.bank_line_1.amount += 5
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_1.id: {'aml_ids': [self.invoice_line_1.id], 'model': self.rule_1, 'status': 'write_off'},
|
||||
self.bank_line_1.id: {'aml_ids': [self.invoice_line_1.id], 'model': self.rule_1, 'status': 'write_off', 'partner': self.bank_line_1.partner_id},
|
||||
self.bank_line_2.id: {'aml_ids': [
|
||||
self.invoice_line_2.id,
|
||||
self.invoice_line_3.id,
|
||||
self.invoice_line_1.id,
|
||||
], 'model': self.rule_1},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1},
|
||||
], 'model': self.rule_1, 'partner': self.bank_line_2.partner_id},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1, 'partner': self.cash_line_1.partner_id},
|
||||
})
|
||||
self.rule_1.match_total_amount_param = 100.0
|
||||
self.bank_line_1.amount -= 5
|
||||
@@ -357,13 +360,13 @@ class TestReconciliationMatchingRules(AccountTestInvoicingCommon):
|
||||
self.rule_1.match_total_amount_param = 90.0
|
||||
self.bank_line_1.amount -= 5
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_1.id: {'aml_ids': [self.invoice_line_1.id], 'model': self.rule_1, 'status': 'write_off'},
|
||||
self.bank_line_1.id: {'aml_ids': [self.invoice_line_1.id], 'model': self.rule_1, 'status': 'write_off', 'partner': self.bank_line_1.partner_id},
|
||||
self.bank_line_2.id: {'aml_ids': [
|
||||
self.invoice_line_2.id,
|
||||
self.invoice_line_3.id,
|
||||
self.invoice_line_1.id,
|
||||
], 'model': self.rule_1},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1},
|
||||
], 'model': self.rule_1, 'partner': self.bank_line_2.partner_id},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1, 'partner': self.cash_line_1.partner_id},
|
||||
})
|
||||
self.rule_1.match_total_amount_param = 100.0
|
||||
self.bank_line_1.amount += 5
|
||||
@@ -375,7 +378,7 @@ class TestReconciliationMatchingRules(AccountTestInvoicingCommon):
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_1.id: {'aml_ids': []},
|
||||
self.bank_line_2.id: {'aml_ids': []},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1, 'partner': self.cash_line_1.partner_id},
|
||||
})
|
||||
self.rule_1.match_partner_category_ids = False
|
||||
|
||||
@@ -386,13 +389,13 @@ class TestReconciliationMatchingRules(AccountTestInvoicingCommon):
|
||||
self.rule_2.sequence = 2
|
||||
|
||||
self._check_statement_matching(self.rule_1 + self.rule_2, {
|
||||
self.bank_line_1.id: {'aml_ids': [self.invoice_line_1.id], 'model': self.rule_1},
|
||||
self.bank_line_1.id: {'aml_ids': [self.invoice_line_1.id], 'model': self.rule_1, 'partner': self.bank_line_1.partner_id},
|
||||
self.bank_line_2.id: {'aml_ids': [
|
||||
self.invoice_line_2.id,
|
||||
self.invoice_line_3.id,
|
||||
self.invoice_line_1.id,
|
||||
], 'model': self.rule_1},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1},
|
||||
], 'model': self.rule_1, 'partner': self.bank_line_2.partner_id},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1, 'partner': self.cash_line_1.partner_id},
|
||||
})
|
||||
|
||||
# rule_2 is used before rule_1.
|
||||
@@ -400,18 +403,18 @@ class TestReconciliationMatchingRules(AccountTestInvoicingCommon):
|
||||
self.rule_2.sequence = 1
|
||||
|
||||
self._check_statement_matching(self.rule_1 + self.rule_2, {
|
||||
self.bank_line_1.id: {'aml_ids': [], 'model': self.rule_2, 'status': 'write_off'},
|
||||
self.bank_line_2.id: {'aml_ids': [], 'model': self.rule_2, 'status': 'write_off'},
|
||||
self.cash_line_1.id: {'aml_ids': [], 'model': self.rule_2, 'status': 'write_off'},
|
||||
self.bank_line_1.id: {'aml_ids': [], 'model': self.rule_2, 'status': 'write_off', 'partner': self.bank_line_1.partner_id},
|
||||
self.bank_line_2.id: {'aml_ids': [], 'model': self.rule_2, 'status': 'write_off', 'partner': self.bank_line_2.partner_id},
|
||||
self.cash_line_1.id: {'aml_ids': [], 'model': self.rule_2, 'status': 'write_off', 'partner': self.cash_line_1.partner_id},
|
||||
})
|
||||
|
||||
# rule_2 is used before rule_1 but only on partner_1.
|
||||
self.rule_2.match_partner_ids |= self.partner_1
|
||||
|
||||
self._check_statement_matching(self.rule_1 + self.rule_2, {
|
||||
self.bank_line_1.id: {'aml_ids': [], 'model': self.rule_2, 'status': 'write_off'},
|
||||
self.bank_line_2.id: {'aml_ids': [], 'model': self.rule_2, 'status': 'write_off'},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1},
|
||||
self.bank_line_1.id: {'aml_ids': [], 'model': self.rule_2, 'status': 'write_off', 'partner': self.bank_line_1.partner_id},
|
||||
self.bank_line_2.id: {'aml_ids': [], 'model': self.rule_2, 'status': 'write_off', 'partner': self.bank_line_2.partner_id},
|
||||
self.cash_line_1.id: {'aml_ids': [self.invoice_line_4.id], 'model': self.rule_1, 'partner': self.cash_line_1.partner_id},
|
||||
})
|
||||
|
||||
def test_auto_reconcile(self):
|
||||
@@ -426,9 +429,9 @@ class TestReconciliationMatchingRules(AccountTestInvoicingCommon):
|
||||
self.rule_2.auto_reconcile = True
|
||||
|
||||
self._check_statement_matching(self.rule_1 + self.rule_2, {
|
||||
self.bank_line_1.id: {'aml_ids': [self.invoice_line_1.id], 'model': self.rule_1, 'status': 'reconciled'},
|
||||
self.bank_line_1.id: {'aml_ids': [self.invoice_line_1.id], 'model': self.rule_1, 'status': 'reconciled', 'partner': self.bank_line_1.partner_id},
|
||||
self.bank_line_2.id: {'aml_ids': []},
|
||||
self.cash_line_1.id: {'aml_ids': [], 'model': self.rule_2, 'status': 'reconciled'},
|
||||
self.cash_line_1.id: {'aml_ids': [], 'model': self.rule_2, 'status': 'reconciled', 'partner': self.cash_line_1.partner_id},
|
||||
})
|
||||
|
||||
# Check first line has been well reconciled.
|
||||
@@ -464,8 +467,8 @@ class TestReconciliationMatchingRules(AccountTestInvoicingCommon):
|
||||
self.bank_line_1.amount = -121
|
||||
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_1.id: {'aml_ids': [], 'model': self.rule_1, 'status': 'reconciled'},
|
||||
self.bank_line_2.id: {'aml_ids': [], 'model': self.rule_1, 'status': 'reconciled'},
|
||||
self.bank_line_1.id: {'aml_ids': [], 'model': self.rule_1, 'status': 'reconciled', 'partner': self.bank_line_1.partner_id},
|
||||
self.bank_line_2.id: {'aml_ids': [], 'model': self.rule_1, 'status': 'reconciled', 'partner': self.bank_line_2.partner_id},
|
||||
}, statements=self.bank_st)
|
||||
|
||||
# Check first line has been well reconciled.
|
||||
@@ -511,7 +514,7 @@ class TestReconciliationMatchingRules(AccountTestInvoicingCommon):
|
||||
'amount': -10,
|
||||
})
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_1.id: {'aml_ids': [payment_bnk_line.id], 'model': self.rule_1},
|
||||
self.bank_line_1.id: {'aml_ids': [payment_bnk_line.id], 'model': self.rule_1, 'partner': self.bank_line_1.partner_id},
|
||||
self.bank_line_2.id: {'aml_ids': []},
|
||||
}, statements=self.bank_st)
|
||||
|
||||
@@ -528,7 +531,7 @@ class TestReconciliationMatchingRules(AccountTestInvoicingCommon):
|
||||
|
||||
self.bank_line_1.write({'partner_id': partner.id, 'foreign_currency_id': currency_statement.id, 'amount_currency': 100, 'payment_ref': 'test'})
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_1.id: {'aml_ids': invoice_line.ids, 'model': self.rule_1},
|
||||
self.bank_line_1.id: {'aml_ids': invoice_line.ids, 'model': self.rule_1, 'partner': self.bank_line_1.partner_id},
|
||||
self.bank_line_2.id: {'aml_ids': []},
|
||||
}, statements=self.bank_st)
|
||||
|
||||
@@ -551,7 +554,7 @@ class TestReconciliationMatchingRules(AccountTestInvoicingCommon):
|
||||
})
|
||||
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_1.id: {'aml_ids': [self.invoice_line_1.id], 'model': self.rule_1},
|
||||
self.bank_line_1.id: {'aml_ids': [self.invoice_line_1.id], 'model': self.rule_1, 'partner': self.bank_line_1.partner_id},
|
||||
self.bank_line_2.id: {'aml_ids': []},
|
||||
}, self.bank_st)
|
||||
|
||||
@@ -559,41 +562,52 @@ class TestReconciliationMatchingRules(AccountTestInvoicingCommon):
|
||||
self.bank_line_1.write({'partner_id': None, 'payment_ref': 'toto42', 'narration': None})
|
||||
self.bank_line_2.write({'partner_id': None})
|
||||
|
||||
# Without mapping, there should be no match
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_1.id: {'aml_ids': []},
|
||||
self.bank_line_2.id: {'aml_ids': []},
|
||||
}, self.bank_st)
|
||||
# Do the test for both rule 1 and 2, so that we check invoice matching and write-off rules
|
||||
for rule in (self.rule_1 + self.rule_2):
|
||||
|
||||
# We add some mapping for payment reference to rule_1
|
||||
self.rule_1.write({
|
||||
'partner_mapping_line_ids': [(0, 0, {
|
||||
'partner_id': self.partner_1.id,
|
||||
'payment_ref_regex': 'toto.*',
|
||||
})]
|
||||
})
|
||||
# To cope for minor differences in rule results
|
||||
matching_amls = rule.rule_type == 'invoice_matching' and self.invoice_line_1.ids or []
|
||||
result_status = rule.rule_type == 'writeoff_suggestion' and {'status': 'write_off'} or {}
|
||||
|
||||
# bank_line_1 should now match
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_1.id: {'aml_ids': [self.invoice_line_1.id], 'model': self.rule_1},
|
||||
self.bank_line_2.id: {'aml_ids': []},
|
||||
}, self.bank_st)
|
||||
match_result = {**result_status, 'aml_ids': matching_amls, 'model': rule, 'partner': self.partner_1}
|
||||
no_match_result = {'aml_ids': []}
|
||||
|
||||
# If we now add a narration regex to the same mapping line, nothing should match
|
||||
self.rule_1.partner_mapping_line_ids.write({'narration_regex': ".*coincoin"})
|
||||
# Without mapping, there should be no match
|
||||
self._check_statement_matching(rule, {
|
||||
self.bank_line_1.id: no_match_result,
|
||||
self.bank_line_2.id: no_match_result,
|
||||
}, self.bank_st)
|
||||
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_1.id: {'aml_ids': []},
|
||||
self.bank_line_2.id: {'aml_ids': []},
|
||||
}, self.bank_st)
|
||||
# We add some mapping for payment reference to rule_1
|
||||
rule.write({
|
||||
'partner_mapping_line_ids': [(0, 0, {
|
||||
'partner_id': self.partner_1.id,
|
||||
'payment_ref_regex': 'toto.*',
|
||||
})]
|
||||
})
|
||||
|
||||
# If we set the narration so that it matches the new mapping criterium, line_1 matches
|
||||
self.bank_line_1.write({'narration': "42coincoin"})
|
||||
# bank_line_1 should now match
|
||||
self._check_statement_matching(rule, {
|
||||
self.bank_line_1.id: match_result,
|
||||
self.bank_line_2.id: no_match_result,
|
||||
}, self.bank_st)
|
||||
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_1.id: {'aml_ids': [self.invoice_line_1.id], 'model': self.rule_1},
|
||||
self.bank_line_2.id: {'aml_ids': []},
|
||||
}, self.bank_st)
|
||||
# If we now add a narration regex to the same mapping line, nothing should match
|
||||
rule.partner_mapping_line_ids.write({'narration_regex': ".*coincoin"})
|
||||
self.bank_line_1.write({'narration': None}) # Reset from possible previous iteration
|
||||
|
||||
self._check_statement_matching(rule, {
|
||||
self.bank_line_1.id: no_match_result,
|
||||
self.bank_line_2.id: no_match_result,
|
||||
}, self.bank_st)
|
||||
|
||||
# If we set the narration so that it matches the new mapping criterium, line_1 matches
|
||||
self.bank_line_1.write({'narration': "42coincoin"})
|
||||
|
||||
self._check_statement_matching(rule, {
|
||||
self.bank_line_1.id: match_result,
|
||||
self.bank_line_2.id: no_match_result,
|
||||
}, self.bank_st)
|
||||
|
||||
def test_partner_name_in_communication(self):
|
||||
self.invoice_line_1.partner_id.write({'name': "Archibald Haddock"})
|
||||
@@ -603,7 +617,7 @@ class TestReconciliationMatchingRules(AccountTestInvoicingCommon):
|
||||
|
||||
# bank_line_1 should match, as its communication contains the invoice's partner name
|
||||
self._check_statement_matching(self.rule_1, {
|
||||
self.bank_line_1.id: {'aml_ids': [self.invoice_line_1.id], 'model': self.rule_1},
|
||||
self.bank_line_1.id: {'aml_ids': [self.invoice_line_1.id], 'model': self.rule_1, 'partner': self.bank_line_1.partner_id},
|
||||
self.bank_line_2.id: {'aml_ids': []},
|
||||
}, self.bank_st)
|
||||
|
||||
@@ -696,5 +710,5 @@ class TestReconciliationMatchingRules(AccountTestInvoicingCommon):
|
||||
|
||||
with freeze_time('2017-01-01'):
|
||||
self._check_statement_matching(matching_rule, {
|
||||
statement_line.id: {'aml_ids': (move_line_1 + move_line_2).ids, 'model': matching_rule}
|
||||
statement_line.id: {'aml_ids': (move_line_1 + move_line_2).ids, 'model': matching_rule, 'partner': statement_line.partner_id}
|
||||
}, statements=statement)
|
||||
|
||||
Reference in New Issue
Block a user