diff --git a/conservancy_beancount/reports/accrual.py b/conservancy_beancount/reports/accrual.py index 67db8e82fbaf06bcd33433bda67e2ba494acf679..6f1e713459011d77e151ad374062c3513f3a3fdf 100644 --- a/conservancy_beancount/reports/accrual.py +++ b/conservancy_beancount/reports/accrual.py @@ -125,6 +125,7 @@ STANDARD_PATH = Path('-') CompoundAmount = TypeVar('CompoundAmount', data.Amount, core.Balance) PostGroups = Mapping[Optional[MetaValue], 'AccrualPostings'] RTObject = Mapping[str, str] +T = TypeVar('T') logger = logging.getLogger('conservancy_beancount.reports.accrual') @@ -134,19 +135,14 @@ class Sentinel: class Account(NamedTuple): name: str - norm_func: Callable[[CompoundAmount], CompoundAmount] aging_thresholds: Sequence[int] class AccrualAccount(enum.Enum): # Note the aging report uses the same order accounts are defined here. # See AgingODS.start_spreadsheet(). - RECEIVABLE = Account( - 'Assets:Receivable', lambda bal: bal, [365, 120, 90, 60], - ) - PAYABLE = Account( - 'Liabilities:Payable', operator.neg, [365, 90, 60, 30], - ) + RECEIVABLE = Account('Assets:Receivable', [365, 120, 90, 60]) + PAYABLE = Account('Liabilities:Payable', [365, 90, 60, 30]) @classmethod def account_names(cls) -> Iterator[str]: @@ -167,6 +163,10 @@ class AccrualAccount(enum.Enum): return account raise ValueError("unrecognized account set in related postings") + @property + def normalize_amount(self) -> Callable[[T], T]: + return core.normalize_amount_func(self.value.name) + class AccrualPostings(core.RelatedPostings): def _meta_getter(key: MetaKey) -> Callable[[data.Posting], MetaValue]: # type:ignore[misc] @@ -221,8 +221,7 @@ class AccrualPostings(core.RelatedPostings): self.paid_entities = self.accrued_entities else: self.accrual_type = AccrualAccount.classify(self) - accrual_acct: Account = self.accrual_type.value - norm_func = accrual_acct.norm_func + norm_func = self.accrual_type.normalize_amount self.end_balance = norm_func(self.balance_at_cost()) self.accrued_entities = self._collect_entities( lambda post: norm_func(post.units).number > 0, @@ -453,7 +452,7 @@ class AgingODS(core.BaseODS[AccrualPostings, Optional[data.Account]]): return raw_balance = row.balance() if row.accrual_type is not None: - raw_balance = row.accrual_type.value.norm_func(raw_balance) + raw_balance = row.accrual_type.normalize_amount(raw_balance) if raw_balance == row.end_balance: amount_cell = odf.table.TableCell() else: