fix: Allow accountNameInferType to recognise Conversion accounts.

This commit is contained in:
Stephen Morgan 2022-02-01 16:07:05 +11:00 committed by Simon Michael
parent e17cd1540d
commit 36fe6bbcff

View File

@ -25,6 +25,7 @@ module Hledger.Data.AccountName (
,cashAccountRegex ,cashAccountRegex
,liabilityAccountRegex ,liabilityAccountRegex
,equityAccountRegex ,equityAccountRegex
,conversionAccountRegex
,revenueAccountRegex ,revenueAccountRegex
,expenseAccountRegex ,expenseAccountRegex
,acctsep ,acctsep
@ -89,26 +90,28 @@ accountSummarisedName a
cs = accountNameComponents a cs = accountNameComponents a
a' = accountLeafName a a' = accountLeafName a
-- | Regular expressions matching common english top-level account names, -- | Regular expressions matching common English top-level account names,
-- used as a fallback when account types are not declared. -- used as a fallback when account types are not declared.
assetAccountRegex = toRegexCI' "^assets?(:|$)" assetAccountRegex = toRegexCI' "^assets?(:|$)"
cashAccountRegex = toRegexCI' "(investment|receivable|:A/R|:fixed)" cashAccountRegex = toRegexCI' "(investment|receivable|:A/R|:fixed)"
liabilityAccountRegex = toRegexCI' "^(debts?|liabilit(y|ies))(:|$)" liabilityAccountRegex = toRegexCI' "^(debts?|liabilit(y|ies))(:|$)"
equityAccountRegex = toRegexCI' "^equity(:|$)" equityAccountRegex = toRegexCI' "^equity(:|$)"
revenueAccountRegex = toRegexCI' "^(income|revenue)s?(:|$)" conversionAccountRegex = toRegexCI' "^equity:(trad(e|ing)|conversion)s?(:|$)"
expenseAccountRegex = toRegexCI' "^expenses?(:|$)" revenueAccountRegex = toRegexCI' "^(income|revenue)s?(:|$)"
expenseAccountRegex = toRegexCI' "^expenses?(:|$)"
-- | Try to guess an account's type from its name, -- | Try to guess an account's type from its name,
-- matching common English top-level account names. -- matching common English top-level account names.
accountNameInferType :: AccountName -> Maybe AccountType accountNameInferType :: AccountName -> Maybe AccountType
accountNameInferType a accountNameInferType a
| a == "asset" || a == "assets" = Just Asset | a == "asset" || a == "assets" = Just Asset
| regexMatchText assetAccountRegex a = Just $ if regexMatchText cashAccountRegex a then Asset else Cash | regexMatchText assetAccountRegex a = Just $ if regexMatchText cashAccountRegex a then Asset else Cash
| regexMatchText liabilityAccountRegex a = Just Liability | regexMatchText liabilityAccountRegex a = Just Liability
| regexMatchText equityAccountRegex a = Just Equity | regexMatchText conversionAccountRegex a = Just Conversion
| regexMatchText revenueAccountRegex a = Just Revenue | regexMatchText equityAccountRegex a = Just Equity
| regexMatchText expenseAccountRegex a = Just Expense | regexMatchText revenueAccountRegex a = Just Revenue
| otherwise = Nothing | regexMatchText expenseAccountRegex a = Just Expense
| otherwise = Nothing
accountNameLevel :: AccountName -> Int accountNameLevel :: AccountName -> Int
accountNameLevel "" = 0 accountNameLevel "" = 0
@ -289,6 +292,7 @@ tests_AccountName = testGroup "AccountName" [
accountNameInferType "assets:A/R" @?= Just Asset accountNameInferType "assets:A/R" @?= Just Asset
accountNameInferType "liabilities" @?= Just Liability accountNameInferType "liabilities" @?= Just Liability
accountNameInferType "equity" @?= Just Equity accountNameInferType "equity" @?= Just Equity
accountNameInferType "equity:conversion" @?= Just Conversion
accountNameInferType "expenses" @?= Just Expense accountNameInferType "expenses" @?= Just Expense
accountNameInferType "revenues" @?= Just Revenue accountNameInferType "revenues" @?= Just Revenue
accountNameInferType "revenue" @?= Just Revenue accountNameInferType "revenue" @?= Just Revenue