74 lines
3.4 KiB
Python
74 lines
3.4 KiB
Python
from datetime import date, timedelta, datetime
|
|
from odoo.tests.common import TransactionCase, tagged
|
|
from odoo.addons.fusion_accounting_bank_rec.services.pattern_extractor import (
|
|
extract_pattern_for_partner,
|
|
)
|
|
|
|
|
|
@tagged('post_install', '-at_install')
|
|
class TestPatternExtractor(TransactionCase):
|
|
|
|
def setUp(self):
|
|
super().setUp()
|
|
self.partner = self.env['res.partner'].create({'name': 'Pattern Test Partner'})
|
|
self.currency = self.env.ref('base.CAD')
|
|
self.company = self.env.company
|
|
|
|
def _make_precedent(self, *, amount, days_ago, memo='RBC,ETF', count=1, source='manual'):
|
|
return self.env['fusion.reconcile.precedent'].create({
|
|
'company_id': self.company.id,
|
|
'partner_id': self.partner.id,
|
|
'amount': amount,
|
|
'currency_id': self.currency.id,
|
|
'date': date.today() - timedelta(days=days_ago),
|
|
'memo_tokens': memo,
|
|
'matched_move_line_count': count,
|
|
'reconciled_at': datetime.now() - timedelta(days=days_ago),
|
|
'source': source,
|
|
})
|
|
|
|
def test_extracts_typical_amount_range(self):
|
|
for d in [10, 24, 38, 52]:
|
|
self._make_precedent(amount=1847.50, days_ago=d)
|
|
|
|
pattern_vals = extract_pattern_for_partner(
|
|
self.env, company_id=self.company.id, partner_id=self.partner.id)
|
|
self.assertIn('typical_amount_range', pattern_vals)
|
|
self.assertEqual(pattern_vals['reconcile_count'], 4)
|
|
|
|
def test_detects_exact_amount_strategy(self):
|
|
for d in range(0, 56, 14):
|
|
self._make_precedent(amount=1847.50, days_ago=d, count=1)
|
|
pattern_vals = extract_pattern_for_partner(
|
|
self.env, company_id=self.company.id, partner_id=self.partner.id)
|
|
self.assertEqual(pattern_vals['pref_strategy'], 'exact_amount')
|
|
|
|
def test_detects_multi_invoice_strategy(self):
|
|
for d in range(0, 56, 14):
|
|
self._make_precedent(amount=2500.00, days_ago=d, count=3)
|
|
pattern_vals = extract_pattern_for_partner(
|
|
self.env, company_id=self.company.id, partner_id=self.partner.id)
|
|
self.assertEqual(pattern_vals['pref_strategy'], 'multi_invoice')
|
|
|
|
def test_computes_cadence_days(self):
|
|
for d in [0, 14, 28, 42]:
|
|
self._make_precedent(amount=1000, days_ago=d)
|
|
pattern_vals = extract_pattern_for_partner(
|
|
self.env, company_id=self.company.id, partner_id=self.partner.id)
|
|
self.assertAlmostEqual(pattern_vals['typical_cadence_days'], 14.0, delta=1)
|
|
|
|
def test_extracts_common_memo_tokens(self):
|
|
self._make_precedent(amount=1000, days_ago=10, memo='RBC,ETF,REF')
|
|
self._make_precedent(amount=1000, days_ago=24, memo='RBC,ETF,DEPOSIT')
|
|
self._make_precedent(amount=1000, days_ago=38, memo='RBC,ETF,REF')
|
|
pattern_vals = extract_pattern_for_partner(
|
|
self.env, company_id=self.company.id, partner_id=self.partner.id)
|
|
self.assertIn('RBC', pattern_vals['common_memo_tokens'])
|
|
self.assertIn('ETF', pattern_vals['common_memo_tokens'])
|
|
|
|
def test_returns_zero_count_for_partner_with_no_precedents(self):
|
|
other_partner = self.env['res.partner'].create({'name': 'Empty Partner'})
|
|
pattern_vals = extract_pattern_for_partner(
|
|
self.env, company_id=self.company.id, partner_id=other_partner.id)
|
|
self.assertEqual(pattern_vals['reconcile_count'], 0)
|