diff --git a/conservancy_beancount/plugin/meta_approval.py b/conservancy_beancount/plugin/meta_approval.py index e8f388e..ce1dbc1 100644 --- a/conservancy_beancount/plugin/meta_approval.py +++ b/conservancy_beancount/plugin/meta_approval.py @@ -33,26 +33,17 @@ class MetaApproval(core._RequireLinksPostingMetadataHook): def _run_on_txn(self, txn: Transaction) -> bool: if not super()._run_on_txn(txn): return False + # approval is required when funds leave a cash equivalent asset, + # UNLESS that transaction is a transfer to another asset, + # or paying off a credit card. + # debits_sum keeps a running tally of how much is moving in each + # direction, and we'll return True if it ends up over the payment + # threshold. debits_sum = decimal.Decimal(0) for post in data.iter_postings(txn): - # approval is required: - # 1. When a payable is accrued - if (post.account.is_under('Liabilities:Payable:Accounts') - and post.is_debit(self.payment_threshold)): - return True - # 2. When funds leave a cash equivalent asset, UNLESS that - # transaction is a transfer to another asset, or paying off a - # credit card. - # In this case, debits_sum keeps a running tally of how much is - # moving in each direction, and we'll return True if it ends up over - # the payment threshold. - elif post.account.is_cash_equivalent() or post.account.is_credit_card(): + if post.account.is_cash_equivalent() or post.account.is_credit_card(): debits_sum -= post.units.number or 0 return debits_sum > self.payment_threshold def _run_on_post(self, txn: Transaction, post: data.Posting) -> bool: - if post.account.is_under('Liabilities:Payable:Accounts'): - threshold_check = post.is_debit(self.payment_threshold) - else: - threshold_check = post.is_payment(0) - return threshold_check is not False + return post.account.is_cash_equivalent() and not post.is_credit(0) diff --git a/tests/test_meta_approval.py b/tests/test_meta_approval.py index da0d7f5..2edc1e2 100644 --- a/tests/test_meta_approval.py +++ b/tests/test_meta_approval.py @@ -24,15 +24,17 @@ REQUIRED_ACCOUNTS = { 'Assets:Bank:Checking', 'Assets:Cash', 'Assets:Savings', - 'Liabilities:Payable:Accounts', } NON_REQUIRED_ACCOUNTS = { 'Assets:Prepaid:Expenses', + # Receivables are checked by meta_receivable_documentation 'Assets:Receivable:Accounts', 'Equity:QpeningBalance', 'Expenses:Other', 'Income:Other', + # Payables are checked by meta_payable_documentation + 'Liabilities:Payable:Accounts', 'Liabilities:Payable:Vacation', 'Liabilities:UnearnedIncome:Donations', }