bs: don't let just a Cash declaration hide Asset accounts
Clarify the account type queries a bit, and don't let a declaration of account as Cash cause the fallback regex for Asset accounts to be ignored.
This commit is contained in:
parent
b9d33a4294
commit
6c392e9f43
@ -323,6 +323,34 @@ journalAccountNameTree = accountNameTreeFrom . journalAccountNames
|
||||
|
||||
-- queries for standard account types
|
||||
|
||||
-- | Get a query for accounts of the specified types in this journal.
|
||||
-- Account types include Asset, Liability, Equity, Revenue, Expense, Cash.
|
||||
-- For each type, if no accounts were declared with this type, the query
|
||||
-- will instead match accounts with names matched by the case-insensitive
|
||||
-- regular expression provided as a fallback.
|
||||
-- The query will match all accounts which were declared as one of
|
||||
-- these types (by account directives with the type: tag), plus all their
|
||||
-- subaccounts which have not been declared as some other type.
|
||||
journalAccountTypeQuery :: [AccountType] -> Regexp -> Journal -> Query
|
||||
journalAccountTypeQuery atypes fallbackregex Journal{jdeclaredaccounttypes} =
|
||||
let
|
||||
declaredacctsoftype :: [AccountName] =
|
||||
concat $ mapMaybe (`M.lookup` jdeclaredaccounttypes) atypes
|
||||
in case declaredacctsoftype of
|
||||
[] -> Acct fallbackregex
|
||||
as -> And [ Or acctnameRegexes , Not $ Or differentlyTypedRegexes ]
|
||||
where
|
||||
-- XXX Query isn't able to match account type since that requires extra info from the journal.
|
||||
-- So we do a hacky search by name instead.
|
||||
acctnameRegexes = map (Acct . accountNameToAccountRegex) as
|
||||
differentlyTypedRegexes = map (Acct . accountNameToAccountRegex) differentlytypedsubs
|
||||
|
||||
differentlytypedsubs = concat
|
||||
[subs | (t,bs) <- M.toList jdeclaredaccounttypes
|
||||
, not $ t `elem` atypes
|
||||
, let subs = [b | b <- bs, any (`isAccountNamePrefixOf` b) as]
|
||||
]
|
||||
|
||||
-- | A query for accounts in this journal which have been
|
||||
-- declared as Asset (or Cash, a subtype of Asset) by account directives,
|
||||
-- or otherwise for accounts with names matched by the case-insensitive
|
||||
@ -331,19 +359,39 @@ journalAssetAccountQuery :: Journal -> Query
|
||||
journalAssetAccountQuery j =
|
||||
Or [
|
||||
journalAccountTypeQuery [Asset] (toRegexCI' "^assets?(:|$)") j
|
||||
,journalCashAccountQuery j
|
||||
,journalCashAccountOnlyQuery j
|
||||
]
|
||||
|
||||
-- | A query for "Cash" (liquid asset) accounts in this journal, ie accounts
|
||||
-- declared as Cash by account directives, or otherwise with names matched by the
|
||||
-- case-insensitive regular expression @^assets?(:|$)@. and not including
|
||||
-- the case-insensitive regular expression @(investment|receivable|:A/R|:fixed)@.
|
||||
-- | A query for accounts in this journal which have been
|
||||
-- declared as Asset (and not Cash) by account directives,
|
||||
-- or otherwise for accounts with names matched by the case-insensitive
|
||||
-- regular expression @^assets?(:|$)@.
|
||||
journalAssetNonCashAccountQuery :: Journal -> Query
|
||||
journalAssetNonCashAccountQuery j =
|
||||
journalAccountTypeQuery [Asset] (toRegexCI' "^assets?(:|$)") j
|
||||
|
||||
-- | A query for Cash (liquid asset) accounts in this journal, ie accounts
|
||||
-- declared as Cash by account directives, or otherwise Asset accounts whose
|
||||
-- names do not include the case-insensitive regular expression
|
||||
-- @(investment|receivable|:A/R|:fixed)@.
|
||||
journalCashAccountQuery :: Journal -> Query
|
||||
journalCashAccountQuery j =
|
||||
case M.lookup Cash (jdeclaredaccounttypes j) of
|
||||
Nothing -> And [ journalAssetAccountQuery j, Not . Acct $ toRegexCI' "(investment|receivable|:A/R|:fixed)" ]
|
||||
Just _ -> journalAccountTypeQuery [Cash] notused j
|
||||
where notused = error' "journalCashAccountQuery: this should not have happened!" -- PARTIAL:
|
||||
Just _ -> journalCashAccountOnlyQuery j
|
||||
Nothing ->
|
||||
-- no Cash accounts are declared; query for Asset accounts and exclude some of them
|
||||
And [ journalAssetNonCashAccountQuery j, Not . Acct $ toRegexCI' "(investment|receivable|:A/R|:fixed)" ]
|
||||
|
||||
-- | A query for accounts in this journal specifically declared as Cash by
|
||||
-- account directives, or otherwise the None query.
|
||||
journalCashAccountOnlyQuery :: Journal -> Query
|
||||
journalCashAccountOnlyQuery j =
|
||||
case M.lookup Cash (jdeclaredaccounttypes j) of
|
||||
Just _ ->
|
||||
-- Cash accounts are declared; get a query for them (the fallback regex won't be used)
|
||||
journalAccountTypeQuery [Cash] notused j
|
||||
where notused = error' "journalCashAccountOnlyQuery: this should not have happened!" -- PARTIAL:
|
||||
Nothing -> None
|
||||
|
||||
-- | A query for accounts in this journal which have been
|
||||
-- declared as Liability by account directives, or otherwise for
|
||||
@ -388,34 +436,6 @@ journalProfitAndLossAccountQuery j = Or [journalRevenueAccountQuery j
|
||||
,journalExpenseAccountQuery j
|
||||
]
|
||||
|
||||
-- | Get a query for accounts of the specified types in this journal.
|
||||
-- Account types include Asset, Liability, Equity, Revenue, Expense, Cash.
|
||||
-- The query will match all accounts which were declared as one of
|
||||
-- these types by account directives, plus all their subaccounts which
|
||||
-- have not been declared as some other type.
|
||||
-- For each type, if no accounts were declared with this type, the query
|
||||
-- will instead match accounts with names matched by the case-insensitive
|
||||
-- regular expression provided as a fallback.
|
||||
journalAccountTypeQuery :: [AccountType] -> Regexp -> Journal -> Query
|
||||
journalAccountTypeQuery atypes fallbackregex Journal{jdeclaredaccounttypes} =
|
||||
let
|
||||
declaredacctsoftype :: [AccountName] =
|
||||
concat $ mapMaybe (`M.lookup` jdeclaredaccounttypes) atypes
|
||||
in case declaredacctsoftype of
|
||||
[] -> Acct fallbackregex
|
||||
as -> And [ Or acctnameRegexes, Not $ Or differentlyTypedRegexes ]
|
||||
where
|
||||
-- XXX Query isn't able to match account type since that requires extra info from the journal.
|
||||
-- So we do a hacky search by name instead.
|
||||
acctnameRegexes = map (Acct . accountNameToAccountRegex) as
|
||||
differentlyTypedRegexes = map (Acct . accountNameToAccountRegex) differentlytypedsubs
|
||||
|
||||
differentlytypedsubs = concat
|
||||
[subs | (t,bs) <- M.toList jdeclaredaccounttypes
|
||||
, not $ t `elem` atypes
|
||||
, let subs = [b | b <- bs, any (`isAccountNamePrefixOf` b) as]
|
||||
]
|
||||
|
||||
-- Various kinds of filtering on journals. We do it differently depending
|
||||
-- on the command.
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user