imp:setup: check account type declarations
Begin analysing account type declarations (finally). Setting up account types when getting started is just a bit too complicated to be easily understood or easily documented. Making that easy is one of the goals for the setup command.
This commit is contained in:
parent
255e79c550
commit
b0b081f20d
@ -29,6 +29,7 @@ import Control.Monad
|
|||||||
import Data.Char
|
import Data.Char
|
||||||
import Data.List
|
import Data.List
|
||||||
import Data.List.NonEmpty (NonEmpty ((:|)))
|
import Data.List.NonEmpty (NonEmpty ((:|)))
|
||||||
|
import qualified Data.Map as M
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import qualified Data.Text.Encoding as T
|
import qualified Data.Text.Encoding as T
|
||||||
@ -103,7 +104,7 @@ setup _opts@CliOpts{rawopts_=_rawopts, reportspec_=_rspec} _ignoredj = do
|
|||||||
Just HledgerBinaryVersion{hbinPackageVersion=version} -> do
|
Just HledgerBinaryVersion{hbinPackageVersion=version} -> do
|
||||||
setupConfig version
|
setupConfig version
|
||||||
setupFile version
|
setupFile version
|
||||||
-- setupAccounts version
|
setupAccounts version
|
||||||
-- setupCommodities version
|
-- setupCommodities version
|
||||||
-- setupTags version
|
-- setupTags version
|
||||||
return ()
|
return ()
|
||||||
@ -201,7 +202,7 @@ setupHledger = do
|
|||||||
setupConfig version = do
|
setupConfig version = do
|
||||||
pgroup "config"
|
pgroup "config"
|
||||||
|
|
||||||
pdesc "this hledger supports config files ?"
|
pdesc "that hledger supports config files ?"
|
||||||
if (not $ supportsConfigFiles version)
|
if (not $ supportsConfigFiles version)
|
||||||
then p N "hledger 1.40+ needed"
|
then p N "hledger 1.40+ needed"
|
||||||
else do
|
else do
|
||||||
@ -231,13 +232,16 @@ setupConfig version = do
|
|||||||
case mf of
|
case mf of
|
||||||
Nothing -> return ()
|
Nothing -> return ()
|
||||||
Just _ -> do
|
Just _ -> do
|
||||||
pdesc "this hledger can read the config file ?"
|
pdesc "that hledger can read the config file ?"
|
||||||
-- Test config file readability, without requiring journal file readability, forward compatibly.
|
-- Test config file readability, without requiring journal file readability, forward compatibly.
|
||||||
(exit, _, err) <- readProcessWithExitCode progname ["print", "-f-"] ""
|
(exit, _, err) <- readProcessWithExitCode progname ["print", "-f-"] ""
|
||||||
case exit of
|
case exit of
|
||||||
ExitSuccess -> p Y ""
|
ExitSuccess -> p Y ""
|
||||||
ExitFailure _ -> p N ("\n"<>err)
|
ExitFailure _ -> p N ("\n"<>err)
|
||||||
|
|
||||||
|
-- (if needed) Read config file in-process:
|
||||||
|
-- econfsections <- readFile f <&> parseConf f . T.pack
|
||||||
|
|
||||||
-- pdesc "common general options configured ?"
|
-- pdesc "common general options configured ?"
|
||||||
-- --pretty --ignore-assertions --infer-costs"
|
-- --pretty --ignore-assertions --infer-costs"
|
||||||
-- print --explicit --show-costs"
|
-- print --explicit --show-costs"
|
||||||
@ -294,7 +298,7 @@ setupFile version = do
|
|||||||
else (Y, "")
|
else (Y, "")
|
||||||
p ok msg
|
p ok msg
|
||||||
|
|
||||||
pdesc "this hledger can read default journal ?"
|
pdesc "that hledger can read default journal ?"
|
||||||
-- Basic readability check: ignoring config files if it's hledger >=1.40,
|
-- Basic readability check: ignoring config files if it's hledger >=1.40,
|
||||||
-- and balance assertions if possible (can't if it's hledger <=0.23),
|
-- and balance assertions if possible (can't if it's hledger <=0.23),
|
||||||
-- try read the file (ie do the parseable and autobalanced checks pass).
|
-- try read the file (ie do the parseable and autobalanced checks pass).
|
||||||
@ -312,16 +316,74 @@ setupFile version = do
|
|||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
setupAccounts = do
|
setupAccounts version = do
|
||||||
pgroup "accounts"
|
pgroup "accounts"
|
||||||
|
|
||||||
pdesc "all account types declared or detected ?"
|
pdesc "supports account types (ALERXCV) ?"
|
||||||
|
if not $ supportsConversionAccountType version
|
||||||
|
then p N "hledger 1.25+ needed"
|
||||||
|
else do
|
||||||
|
p Y ""
|
||||||
|
|
||||||
-- pdesc " asset, liability, equity, revenue, expense, cash, conversion"
|
pdesc "Asset account(s) declared ?"
|
||||||
|
-- Read journal file in-process, to get accurate declaration info.
|
||||||
|
-- There's the possibility this could read the journal differently from the hledger in PATH,
|
||||||
|
-- if this currently running hledger is a different version.
|
||||||
|
-- Also we assume defaultJournalPath will detect the same file as the logic above.
|
||||||
|
f <- defaultJournalPath
|
||||||
|
ej <- defaultJournalSafely
|
||||||
|
case ej of
|
||||||
|
Left e -> p U $ "could not read default journal " <> f <> ": " <> e
|
||||||
|
Right j@Journal{..} -> do
|
||||||
|
let
|
||||||
|
accttypes = [Asset, Liability, Equity, Revenue, Expense, Cash, Conversion]
|
||||||
|
acctswithdeclaredorinferredtype = nub (M.keys jaccounttypes)
|
||||||
|
usedacctswithnotype = journalAccountNamesUsed j \\ acctswithdeclaredorinferredtype
|
||||||
|
hasdeclaredaccts t = case M.lookup t jdeclaredaccounttypes of
|
||||||
|
Just (_ : _) -> True
|
||||||
|
_ -> False
|
||||||
|
if hasdeclaredaccts Asset then i Y "" else i N ""
|
||||||
|
|
||||||
-- pdesc "untyped accounts ?"
|
pdesc "Liability account(s) declared ?"
|
||||||
|
if hasdeclaredaccts Liability then i Y "" else i N ""
|
||||||
|
|
||||||
-- pdesc "all used accounts declared ?"
|
pdesc "Equity account(s) declared ?"
|
||||||
|
if hasdeclaredaccts Equity then i Y "" else i N ""
|
||||||
|
|
||||||
|
pdesc "Revenue account(s) declared ?"
|
||||||
|
if hasdeclaredaccts Revenue then i Y "" else i N ""
|
||||||
|
|
||||||
|
pdesc "Expense account(s) declared ?"
|
||||||
|
if hasdeclaredaccts Expense then i Y "" else i N ""
|
||||||
|
|
||||||
|
pdesc "Cash account(s) declared ?"
|
||||||
|
if hasdeclaredaccts Cash then i Y "" else i N ""
|
||||||
|
|
||||||
|
pdesc "Conversion account(s) declared ?"
|
||||||
|
if hasdeclaredaccts Conversion then i Y "" else i N "" -- ("--infer-equity will use a default conversion account name")
|
||||||
|
|
||||||
|
-- XXX hard to detect accounts where type was inferred from name
|
||||||
|
-- unless arealltypesdeclared $ do
|
||||||
|
-- let
|
||||||
|
-- acctswithdeclaredtype = concat (M.elems jdeclaredaccounttypes)
|
||||||
|
-- acctswithinferredtype = acctswithdeclaredorinferredtype \\ acctswithdeclaredtype
|
||||||
|
-- arealltypesdeclared = all hasdeclaredaccts accttypes
|
||||||
|
-- typesinferredfromnames =
|
||||||
|
-- if arealltypesdeclared then []
|
||||||
|
-- else sort $ nub $ catMaybes $ map (flip M.lookup jaccounttypes) acctswithinferredtype
|
||||||
|
-- pdesc "types detected from account names ?"
|
||||||
|
-- if null typesinferredfromnames then i N "" else i Y (concatMap show typesinferredfromnames)
|
||||||
|
|
||||||
|
pdesc "all types either declared or inferred ?"
|
||||||
|
let
|
||||||
|
typesdeclaredorinferred = nub $ M.elems jaccounttypes
|
||||||
|
if all (`elem` typesdeclaredorinferred) accttypes then p Y "" else p N ""
|
||||||
|
|
||||||
|
|
||||||
|
pdesc "untyped accounts detected ?"
|
||||||
|
if null usedacctswithnotype then i N "" else i Y ("("<>show (length usedacctswithnotype)<>")")
|
||||||
|
|
||||||
|
-- pdesc "all used accounts declared ?"
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user