diff --git a/conservancy_beancount/plugin/meta_receipt.py b/conservancy_beancount/plugin/meta_receipt.py index c679020a5429bfcd86c5e2ba63d6d56fb2195cef..8cc9508947bd536d76ed979862e97d22bfa1fa67 100644 --- a/conservancy_beancount/plugin/meta_receipt.py +++ b/conservancy_beancount/plugin/meta_receipt.py @@ -36,6 +36,18 @@ class MetaReceipt(core._RequireLinksPostingMetadataHook): def __init__(self, config: configmod.Config) -> None: self.payment_threshold = abs(config.payment_threshold()) + def _run_on_txn(self, txn: Transaction) -> bool: + if not super()._run_on_txn(txn): + return False + elif (all(post.account.startswith('Assets:') for post in txn.postings + if post.units.number and post.units.number > 0) + and all(post.account == 'Income:Interest' for post in txn.postings + if post.units.number and post.units.number < 0) + ): + return False + else: + return True + def _run_on_post(self, txn: Transaction, post: data.Posting) -> bool: return ( (post.account.is_cash_equivalent() or post.account.is_credit_card()) diff --git a/setup.py b/setup.py index 60c10d6ad3236e8b78dd10246ad6335be73acfa7..1cae3a0d88263f7a538e3b79d953fd12317fc7a2 100755 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ from setuptools import setup setup( name='conservancy_beancount', description="Plugin, library, and reports for reading Conservancy's books", - version='1.3.0', + version='1.3.1', author='Software Freedom Conservancy', author_email='info@sfconservancy.org', license='GNU AGPLv3+', diff --git a/tests/test_meta_receipt.py b/tests/test_meta_receipt.py index 842064ea0902b0991a144a5dcdf4baba4536bb71..d189c9b8568ae520e062e7feeea291910258ae48 100644 --- a/tests/test_meta_receipt.py +++ b/tests/test_meta_receipt.py @@ -344,6 +344,24 @@ def test_fallback_on_zero_amount_postings(hook, test_pair, other_acct, value): ]) assert not list(hook.run(txn)) +@pytest.mark.parametrize('test_acct', ( + acct for acct in ACCOUNTS + if acct.name.startswith('Assets:') + and acct.required_types & PostType.CREDIT +)) +def test_not_required_on_interest(hook, test_acct): + check(hook, test_acct, 'Income:Interest', None, + check_type=PostType.CREDIT) + +@pytest.mark.parametrize('test_acct', ( + acct for acct in ACCOUNTS + if acct.name.startswith('Assets:') + and acct.required_types & PostType.DEBIT +)) +def test_required_on_reverse_interest(hook, test_acct): + check(hook, test_acct, 'Income:Interest', {test_acct.missing_message()}, + check_type=PostType.DEBIT) + @pytest.mark.parametrize('test_acct,equity_acct', testutil.combine_values( ACCOUNTS, testutil.OPENING_EQUITY_ACCOUNTS,