57 lines
2.4 KiB
Python
57 lines
2.4 KiB
Python
from odoo.tests.common import TransactionCase, tagged
|
|
from odoo.addons.fusion_accounting_bank_rec.services.exchange_diff import (
|
|
compute_exchange_diff, ExchangeDiffResult,
|
|
)
|
|
|
|
|
|
@tagged('post_install', '-at_install')
|
|
class TestExchangeDiff(TransactionCase):
|
|
|
|
def test_no_diff_when_currencies_match_and_rates_match(self):
|
|
result = compute_exchange_diff(
|
|
line_amount=100.00, line_currency_code='CAD',
|
|
against_amount=100.00, against_currency_code='CAD',
|
|
line_rate=1.0, against_rate=1.0,
|
|
)
|
|
self.assertFalse(result.needs_diff_move)
|
|
self.assertEqual(result.diff_amount, 0.0)
|
|
|
|
def test_diff_when_rates_differ_same_currency(self):
|
|
"""USD invoice posted at 1.35, USD bank line settled at 1.40 -> diff exists.
|
|
100 USD at 1.40 = 140 CAD; same at 1.35 = 135 CAD; diff = 5 CAD gain."""
|
|
result = compute_exchange_diff(
|
|
line_amount=100.00, line_currency_code='USD',
|
|
against_amount=100.00, against_currency_code='USD',
|
|
line_rate=1.40, against_rate=1.35,
|
|
)
|
|
self.assertTrue(result.needs_diff_move)
|
|
self.assertAlmostEqual(result.diff_amount, 5.00, places=2)
|
|
|
|
def test_diff_negative_when_rate_dropped(self):
|
|
"""USD invoice at 1.40, settled at 1.35 -> loss"""
|
|
result = compute_exchange_diff(
|
|
line_amount=100.00, line_currency_code='USD',
|
|
against_amount=100.00, against_currency_code='USD',
|
|
line_rate=1.35, against_rate=1.40,
|
|
)
|
|
self.assertTrue(result.needs_diff_move)
|
|
self.assertAlmostEqual(result.diff_amount, -5.00, places=2)
|
|
|
|
def test_company_amounts_computed_correctly(self):
|
|
result = compute_exchange_diff(
|
|
line_amount=100.00, line_currency_code='USD',
|
|
against_amount=100.00, against_currency_code='USD',
|
|
line_rate=1.40, against_rate=1.35,
|
|
)
|
|
self.assertAlmostEqual(result.line_company_amount, 140.00, places=2)
|
|
self.assertAlmostEqual(result.against_company_amount, 135.00, places=2)
|
|
|
|
def test_tolerance_handles_rounding_noise(self):
|
|
"""Tiny FX rounding under 0.005 should NOT trigger a diff move."""
|
|
result = compute_exchange_diff(
|
|
line_amount=100.00, line_currency_code='USD',
|
|
against_amount=100.00, against_currency_code='USD',
|
|
line_rate=1.40000, against_rate=1.40003, # 0.003 cent diff
|
|
)
|
|
self.assertFalse(result.needs_diff_move)
|