From 31fdcdb8ef5156a2b1dc2ff55e62d774f8760f3e Mon Sep 17 00:00:00 2001 From: Stephen Morgan Date: Fri, 4 Feb 2022 11:43:15 +1100 Subject: [PATCH] !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. --- hledger-lib/Hledger/Data/AccountName.hs | 6 +- hledger-lib/Hledger/Data/Journal.hs | 40 ++-- hledger/test/cashflow.test | 245 +++++++++--------------- 3 files changed, 104 insertions(+), 187 deletions(-) diff --git a/hledger-lib/Hledger/Data/AccountName.hs b/hledger-lib/Hledger/Data/AccountName.hs index fdafdf108..1eeb87135 100644 --- a/hledger-lib/Hledger/Data/AccountName.hs +++ b/hledger-lib/Hledger/Data/AccountName.hs @@ -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 diff --git a/hledger-lib/Hledger/Data/Journal.hs b/hledger-lib/Hledger/Data/Journal.hs index 66f3240f0..a2f787624 100644 --- a/hledger-lib/Hledger/Data/Journal.hs +++ b/hledger-lib/Hledger/Data/Journal.hs @@ -466,41 +466,27 @@ journalAccountTypeQuery atypes fallbackregex Journal{jdeclaredaccounttypes} = -- or otherwise for accounts with names matched by the case-insensitive -- regular expression @^assets?(:|$)@. journalAssetAccountQuery :: Journal -> Query -journalAssetAccountQuery j = +journalAssetAccountQuery j = Or [ journalAccountTypeQuery [Asset] assetAccountRegex 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) diff --git a/hledger/test/cashflow.test b/hledger/test/cashflow.test index 3f405bf06..38ec19714 100644 --- a/hledger/test/cashflow.test +++ b/hledger/test/cashflow.test @@ -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