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
|
-- 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
|
-- | A query for accounts in this journal which have been
|
||||||
-- declared as Asset (or Cash, a subtype of Asset) by account directives,
|
-- declared as Asset (or Cash, a subtype of Asset) by account directives,
|
||||||
-- or otherwise for accounts with names matched by the case-insensitive
|
-- or otherwise for accounts with names matched by the case-insensitive
|
||||||
@ -331,19 +359,39 @@ journalAssetAccountQuery :: Journal -> Query
|
|||||||
journalAssetAccountQuery j =
|
journalAssetAccountQuery j =
|
||||||
Or [
|
Or [
|
||||||
journalAccountTypeQuery [Asset] (toRegexCI' "^assets?(:|$)") j
|
journalAccountTypeQuery [Asset] (toRegexCI' "^assets?(:|$)") j
|
||||||
,journalCashAccountQuery j
|
,journalCashAccountOnlyQuery j
|
||||||
]
|
]
|
||||||
|
|
||||||
-- | A query for "Cash" (liquid asset) accounts in this journal, ie accounts
|
-- | A query for accounts in this journal which have been
|
||||||
-- declared as Cash by account directives, or otherwise with names matched by the
|
-- declared as Asset (and not Cash) by account directives,
|
||||||
-- case-insensitive regular expression @^assets?(:|$)@. and not including
|
-- or otherwise for accounts with names matched by the case-insensitive
|
||||||
-- the case-insensitive regular expression @(investment|receivable|:A/R|:fixed)@.
|
-- 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 :: Journal -> Query
|
||||||
journalCashAccountQuery j =
|
journalCashAccountQuery j =
|
||||||
case M.lookup Cash (jdeclaredaccounttypes j) of
|
case M.lookup Cash (jdeclaredaccounttypes j) of
|
||||||
Nothing -> And [ journalAssetAccountQuery j, Not . Acct $ toRegexCI' "(investment|receivable|:A/R|:fixed)" ]
|
Just _ -> journalCashAccountOnlyQuery j
|
||||||
Just _ -> journalAccountTypeQuery [Cash] notused j
|
Nothing ->
|
||||||
where notused = error' "journalCashAccountQuery: this should not have happened!" -- PARTIAL:
|
-- 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
|
-- | A query for accounts in this journal which have been
|
||||||
-- declared as Liability by account directives, or otherwise for
|
-- declared as Liability by account directives, or otherwise for
|
||||||
@ -388,34 +436,6 @@ journalProfitAndLossAccountQuery j = Or [journalRevenueAccountQuery j
|
|||||||
,journalExpenseAccountQuery 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
|
-- Various kinds of filtering on journals. We do it differently depending
|
||||||
-- on the command.
|
-- on the command.
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user