!imp: type: Change the default account inference for Cash accounts to only match

^assets?(:.+)?:(cash|bank|che(ck|que?)(ing)?|savings?|current)(:|$)

This should have no effect outside the cash report.

The rule for auto-detecting "Cash" (liquid assets) from account names
has changed in this release - see [Account types]. This is to simplify
how account types are detected and configured. If you use the cashflow
report without explicitly declaring accounts as Cash, you might notice a
change, and might need to add explicit account type: tags.
This commit is contained in:
Stephen Morgan 2022-02-04 11:43:15 +11:00 committed by Simon Michael
parent 2e4cfccf1b
commit 31fdcdb8ef
3 changed files with 104 additions and 187 deletions

View File

@ -96,7 +96,7 @@ accountSummarisedName a
-- | Regular expressions matching common English top-level account names,
-- used as a fallback when account types are not declared.
assetAccountRegex = toRegexCI' "^assets?(:|$)"
cashAccountRegex = toRegexCI' "(investment|receivable|:A/R|:fixed)"
cashAccountRegex = toRegexCI' "^assets?(:.+)?:(cash|bank|che(ck|que?)(ing)?|savings?|current)(:|$)"
liabilityAccountRegex = toRegexCI' "^(debts?|liabilit(y|ies))(:|$)"
equityAccountRegex = toRegexCI' "^equity(:|$)"
conversionAccountRegex = toRegexCI' "^equity:(trad(e|ing)|conversion)s?(:|$)"
@ -107,8 +107,8 @@ expenseAccountRegex = toRegexCI' "^expenses?(:|$)"
-- matching common English top-level account names.
accountNameInferType :: AccountName -> Maybe AccountType
accountNameInferType a
| a == "asset" || a == "assets" = Just Asset
| regexMatchText assetAccountRegex a = Just $ if regexMatchText cashAccountRegex a then Asset else Cash
| regexMatchText cashAccountRegex a = Just Cash
| regexMatchText assetAccountRegex a = Just Asset
| regexMatchText liabilityAccountRegex a = Just Liability
| regexMatchText conversionAccountRegex a = Just Conversion
| regexMatchText equityAccountRegex a = Just Equity

View File

@ -472,35 +472,21 @@ journalAssetAccountQuery j =
,journalCashAccountOnlyQuery j
]
-- | 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 = journalAccountTypeQuery [Asset] assetAccountRegex
-- | 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
Just _ -> journalCashAccountOnlyQuery j
Nothing ->
-- no Cash accounts are declared; query for Asset accounts and exclude some of them
And [ journalAssetNonCashAccountQuery j, Not $ Acct cashAccountRegex ]
-- declared as Cash by account directives, or otherwise accounts whose
-- names match the case-insensitive regular expression
-- @(^assets:(.+:)?(cash|bank)(:|$)@.
journalCashAccountQuery :: Journal -> Query
journalCashAccountQuery = journalAccountTypeQuery [Cash] cashAccountRegex
-- | 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
journalCashAccountOnlyQuery :: Journal -> Query
journalCashAccountOnlyQuery j
-- Cash accounts are declared; get a query for them (the fallback regex won't be used)
| Cash `M.member` jdeclaredaccounttypes j = journalAccountTypeQuery [Cash] notused j
| otherwise = None
where notused = error' "journalCashAccountOnlyQuery: this should not have happened!" -- PARTIAL:
-- | A query for accounts in this journal which have been
-- declared as Liability by account directives, or otherwise for
@ -1319,7 +1305,7 @@ tests_Journal = testGroup "Journal" [
namesfrom qfunc = journalAccountNamesMatching (qfunc j) j
in [testCase "assets" $ assertEqual "" ["assets","assets:bank","assets:bank:checking","assets:bank:saving","assets:cash"]
(namesfrom journalAssetAccountQuery)
,testCase "cash" $ assertEqual "" ["assets","assets:bank","assets:bank:checking","assets:bank:saving","assets:cash"]
,testCase "cash" $ assertEqual "" ["assets:bank","assets:bank:checking","assets:bank:saving","assets:cash"]
(namesfrom journalCashAccountQuery)
,testCase "liabilities" $ assertEqual "" ["liabilities","liabilities:debts"]
(namesfrom journalLiabilityAccountQuery)

View File

@ -1,150 +1,86 @@
# 1.
hledger -f - cashflow
<<<
<
2016/1/1
assets 1
assets:cash 1
b
>>>
$ hledger -f - cashflow
Cashflow Statement 2016-01-01
|| 2016-01-01
============++============
Cash flows ||
------------++------------
assets || 1
------------++------------
|| 1
>>>2
>>>= 0
|| 2016-01-01
=============++============
Cash flows ||
-------------++------------
assets:cash || 1
-------------++------------
|| 1
>2
>= 0
<
2015/10/10 Client A | Invoice #1
assets:receivables $10,000.00
revenue:clients:A -$10,000.00
2015/11/02 Deposit | Invoice #1
assets:bank:checking $10,000.00
assets:receivables -$10,000.00
2016/02/01 Client B | Invoice #2
assets:receivables $10.00
revenue:clients:B -$10.00
2016/02/15 ACME | Hosting Costs
expense:hosting $50.00
assets:bank:checking -$50.00
2016/03/01 Deposit | Invoice #2
assets:bank:checking $10.00
assets:receivables -$10.00
# 2. Period reporting works for a specific year
hledger -f - cashflow -b 2016 -e 2017
<<<
2015/10/10 Client A | Invoice #1
assets:receivables $10,000.00
revenue:clients:A -$10,000.00
2015/11/02 Deposit | Invoice #1
assets:checking $10,000.00
assets:receivables -$10,000.00
2016/02/01 Client B | Invoice #2
assets:receivables $10.00
revenue:clients:B -$10.00
2016/02/15 ACME | Hosting Costs
expense:hosting $50.00
assets:checking -$50.00
2016/03/01 Deposit | Invoice #2
assets:checking $10.00
assets:receivables -$10.00
>>>
$ hledger -f - cashflow -b 2016 -e 2017
Cashflow Statement 2016
|| 2016
=================++=========
Cash flows ||
-----------------++---------
assets:checking || $-40.00
-----------------++---------
|| $-40.00
>>>2
>>>= 0
|| 2016
======================++=========
Cash flows ||
----------------------++---------
assets:bank:checking || $-40.00
----------------------++---------
|| $-40.00
>2
>= 0
# 3. Period reporting works for two years
hledger -f - cashflow -b 2015 -e 2017
<<<
2015/10/10 Client A | Invoice #1
assets:receivables $10,000.00
revenue:clients:A -$10,000.00
2015/11/02 Deposit | Invoice #1
assets:checking $10,000.00
assets:receivables -$10,000.00
2016/02/01 Client B | Invoice #2
assets:receivables $10.00
revenue:clients:B -$10.00
2016/02/15 ACME | Hosting Costs
expense:hosting $50.00
assets:checking -$50.00
2016/03/01 Deposit | Invoice #2
assets:checking $10.00
assets:receivables -$10.00
>>>
$ hledger -f - cashflow -b 2015 -e 2017
Cashflow Statement 2015-01-01..2016-12-31
|| 2015-01-01..2016-12-31
=================++========================
Cash flows ||
-----------------++------------------------
assets:checking || $9,960.00
-----------------++------------------------
|| $9,960.00
>>>2
>>>= 0
|| 2015-01-01..2016-12-31
======================++========================
Cash flows ||
----------------------++------------------------
assets:bank:checking || $9,960.00
----------------------++------------------------
|| $9,960.00
>2
>= 0
# 4. Period reporting works for one month
hledger -f - cashflow -b 2015/11 -e 2015/12
<<<
2015/10/10 Client A | Invoice #1
assets:receivables $10,000.00
revenue:clients:A -$10,000.00
2015/11/02 Deposit | Invoice #1
assets:checking $10,000.00
assets:receivables -$10,000.00
2016/02/01 Client B | Invoice #2
assets:receivables $10.00
revenue:clients:B -$10.00
2016/02/15 ACME | Hosting Costs
expense:hosting $50.00
assets:checking -$50.00
2016/03/01 Deposit | Invoice #2
assets:checking $10.00
assets:receivables -$10.00
>>>
$ hledger -f - cashflow -b 2015/11 -e 2015/12
Cashflow Statement 2015-11
|| Nov
=================++============
Cash flows ||
-----------------++------------
assets:checking || $10,000.00
-----------------++------------
|| $10,000.00
>>>2
>>>= 0
|| Nov
======================++============
Cash flows ||
----------------------++------------
assets:bank:checking || $10,000.00
----------------------++------------
|| $10,000.00
>2
>= 0
# 5. Period reporting works for one month in another year
hledger -f - cashflow -b 2016/10 -e 2016/11
<<<
2015/10/10 Client A | Invoice #1
assets:receivables $10,000.00
revenue:clients:A -$10,000.00
2015/11/02 Deposit | Invoice #1
assets:checking $10,000.00
assets:receivables -$10,000.00
2016/02/01 Client B | Invoice #2
assets:receivables $10.00
revenue:clients:B -$10.00
2016/02/15 ACME | Hosting Costs
expense:hosting $50.00
assets:checking -$50.00
2016/03/01 Deposit | Invoice #2
assets:checking $10.00
assets:receivables -$10.00
>>>
$ hledger -f - cashflow -b 2016/10 -e 2016/11
Cashflow Statement 2016-10
|| Oct
@ -153,12 +89,11 @@ Cashflow Statement 2016-10
------------++-----
------------++-----
||
>>>2
>>>= 0
>2
>= 0
# 6. Multicolumn test
hledger -f sample.journal cashflow -p 'monthly in 2008'
>>>
$ hledger -f sample.journal cashflow -p 'monthly in 2008'
Cashflow Statement 2008
|| Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
@ -170,11 +105,10 @@ Cashflow Statement 2008
assets:cash || 0 0 0 0 0 $-2 0 0 0 0 0 0
----------------------++------------------------------------------------------------
|| $1 0 0 0 0 $-1 0 0 0 0 0 $-1
>>>= 0
>= 0
# 7. Multicolumn test (historical)
hledger -f sample.journal cashflow -p 'monthly in 2008' -A --historical
>>>
$ hledger -f sample.journal cashflow -p 'monthly in 2008' -A --historical
Cashflow Statement 2008-01-31..2008-12-31 (Historical Ending Balances)
|| 2008-01-31 2008-02-29 2008-03-31 2008-04-30 2008-05-31 2008-06-30 2008-07-31 2008-08-31 2008-09-30 2008-10-31 2008-11-30 2008-12-31 Average
@ -186,11 +120,10 @@ Cashflow Statement 2008-01-31..2008-12-31 (Historical Ending Balances)
assets:cash || 0 0 0 0 0 $-2 $-2 $-2 $-2 $-2 $-2 $-2 $-1
----------------------++---------------------------------------------------------------------------------------------------------------------------------------------------------
|| $1 $1 $1 $1 $1 0 0 0 0 0 0 $-1 0
>>>= 0
>= 0
# 8. without -N/--no-total
hledger -f sample.journal cf
>>>
$ hledger -f sample.journal cf
Cashflow Statement 2008
|| 2008
@ -201,12 +134,11 @@ Cashflow Statement 2008
assets:cash || $-2
--------------------++------
|| $-1
>>>2
>>>= 0
>2
>= 0
# 9. with -N
hledger -f sample.journal cf -N
>>>
$ hledger -f sample.journal cf -N
Cashflow Statement 2008
|| 2008
@ -215,28 +147,27 @@ Cashflow Statement 2008
--------------------++------
assets:bank:saving || $1
assets:cash || $-2
>>>2
>>>= 0
>2
>= 0
# 10. exclude fixed assets from cashflow
hledger -f - cashflow
<<<
<
2016/1/1
assets 1
assets:cash 1
b
2016/1/1
assets:fixed assets:equipment 1
b
>>>
$ hledger -f - cashflow
Cashflow Statement 2016-01-01
|| 2016-01-01
============++============
Cash flows ||
------------++------------
assets || 1
------------++------------
|| 1
>>>2
>>>= 0
|| 2016-01-01
=============++============
Cash flows ||
-------------++------------
assets:cash || 1
-------------++------------
|| 1
>2
>= 0