diff --git a/conservancy_beancount/plugin/meta_expense_type.py b/conservancy_beancount/plugin/meta_expense_type.py index ce03a1a16d6be5bcd9d77eee93568aca07af63e5..c42314b3661d85e1e0e740cb4a59560384502dd6 100644 --- a/conservancy_beancount/plugin/meta_expense_type.py +++ b/conservancy_beancount/plugin/meta_expense_type.py @@ -21,6 +21,9 @@ from ..beancount_types import ( Transaction, ) +FUND_KEY = 'project' +UNRESTRICTED_FUND = 'Conservancy' + class MetaExpenseType(core._NormalizePostingMetadataHook): VALUES_ENUM = core.MetadataEnum('expense-type', { 'fundraising', @@ -32,13 +35,35 @@ class MetaExpenseType(core._NormalizePostingMetadataHook): 'mgmt': 'management', }) DEFAULT_VALUES = { - 'Expenses:Services:Accounting': VALUES_ENUM['management'], - 'Expenses:Services:Administration': VALUES_ENUM['management'], - 'Expenses:Services:Fundraising': VALUES_ENUM['fundraising'], + 'Expenses:Accounting': ('management', 'management'), + 'Expenses:BadDebt': ('management', 'program'), + 'Expenses:BankingFees': ('management', 'management'), + 'Expenses:ComputerEquipment': ('management', 'program'), + 'Expenses:Fines': ('management', 'program'), + 'Expenses:FilingFees': ('management', 'program'), + 'Expenses:Hosting': ('management', 'program'), + 'Expenses:Insurance': ('management', 'management'), + 'Expenses:Office': ('management', 'program'), + 'Expenses:Other': ('management', 'program'), + 'Expenses:Phones': ('management', 'program'), + 'Expenses:Postage': ('management', 'program'), + 'Expenses:ProfessionalMemberships': ('management', 'program'), + 'Expenses:Services:Accounting': ('management', 'management'), + 'Expenses:Services:Administration': ('management', 'management'), + 'Expenses:Services:Fundraising': ('fundraising', 'fundraising'), + 'Expenses:Travel': ('management', 'management'), } def _run_on_post(self, txn: Transaction, post: data.Posting) -> bool: - return post.account.startswith('Expenses:') + return post.account.is_under('Expenses') is not None def _default_value(self, txn: Transaction, post: data.Posting) -> MetaValueEnum: - return self.DEFAULT_VALUES.get(post.account, 'program') + key = post.account.is_under(*self.DEFAULT_VALUES) + if key is None: + return 'program' + else: + unrestricted, restricted = self.DEFAULT_VALUES[key] + if post.meta.get(FUND_KEY) == UNRESTRICTED_FUND: + return unrestricted + else: + return restricted