feat(fusion_accounting_bank_rec): pattern_extractor for per-partner aggregates
Made-with: Cursor
This commit is contained in:
73
fusion_accounting_bank_rec/tests/test_pattern_extraction.py
Normal file
73
fusion_accounting_bank_rec/tests/test_pattern_extraction.py
Normal file
@@ -0,0 +1,73 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user