diff --git a/conservancy_beancount/data.py b/conservancy_beancount/data.py index a7f4ba7..05079ba 100644 --- a/conservancy_beancount/data.py +++ b/conservancy_beancount/data.py @@ -687,10 +687,10 @@ def is_opening_balance_txn(txn: Transaction) -> bool: if not opening_equity.currency: retval = False else: - rest = balance_of(txn, lambda acct: not acct.is_opening_equity()) - if not rest.currency: - retval = False - else: - retval = abs(opening_equity.number + rest.number) < decimal.Decimal('.01') + rest = balance_of(txn, lambda acct: not acct.is_under(*EQUITY_ACCOUNTS)) + retval = ( + opening_equity.currency == rest.currency + and abs(opening_equity.number + rest.number) < decimal.Decimal('.01') + ) _opening_balance_cache[key] = retval return retval diff --git a/setup.py b/setup.py index 81a16dc..d50de59 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.14.2', + version='1.14.3', author='Software Freedom Conservancy', author_email='info@sfconservancy.org', license='GNU AGPLv3+', diff --git a/tests/test_data_is_opening_balance_txn.py b/tests/test_data_is_opening_balance_txn.py index 5dba3c8..70d49bd 100644 --- a/tests/test_data_is_opening_balance_txn.py +++ b/tests/test_data_is_opening_balance_txn.py @@ -50,6 +50,8 @@ def test_opening_with_fx(): ('Expenses:Other', 'Equity:Retained:Costs', 300), # Release from restriction ('Equity:Funds:Unrestricted', 'Equity:Funds:Restricted', 400), + # Donation from project fund + ('Equity:Funds:Restricted', 'Income:Donations', 500), ]) def test_not_opening_balance(acct1, acct2, number): txn = testutil.Transaction(postings=[ diff --git a/tests/test_meta_entity.py b/tests/test_meta_entity.py index f8b0122..c8d5b54 100644 --- a/tests/test_meta_entity.py +++ b/tests/test_meta_entity.py @@ -188,6 +188,19 @@ def test_invalid_payee_but_valid_metadata(hook, payee, src_value): ]) assert not any(hook.run(txn)) +def test_mixed_sources(hook): + txn = testutil.Transaction(payee='Payee', postings=[ + ('Income:Donations', -5), + ('Equity:Funds:Restricted', 5, {TEST_KEY: 'Entity'}), + ]) + assert not any(hook.run(txn)) + assert txn.postings[-1].meta[TEST_KEY] == 'Entity' + assert txn.meta[TEST_KEY] == 'Payee' + try: + assert txn.postings[0].meta[TEST_KEY] == 'Payee' + except (KeyError, TypeError): + pass + @pytest.mark.parametrize('account,required', [ ('Assets:Bank:Checking', False), ('Assets:Cash', False),