lib: allow more account directive info in Account records
This commit is contained in:
parent
899946f270
commit
90bf354566
@ -45,14 +45,14 @@ instance Eq Account where
|
||||
-- ]
|
||||
|
||||
nullacct = Account
|
||||
{ aname = ""
|
||||
, adeclarationorder = Nothing
|
||||
, aparent = Nothing
|
||||
, asubs = []
|
||||
, anumpostings = 0
|
||||
, aebalance = nullmixedamt
|
||||
, aibalance = nullmixedamt
|
||||
, aboring = False
|
||||
{ aname = ""
|
||||
, adeclarationinfo = Nothing
|
||||
, asubs = []
|
||||
, aparent = Nothing
|
||||
, aboring = False
|
||||
, anumpostings = 0
|
||||
, aebalance = nullmixedamt
|
||||
, aibalance = nullmixedamt
|
||||
}
|
||||
|
||||
-- | Derive 1. an account tree and 2. each account's total exclusive
|
||||
@ -83,7 +83,11 @@ accountTree :: AccountName -> [AccountName] -> Account
|
||||
accountTree rootname as = nullacct{aname=rootname, asubs=map (uncurry accountTree') $ M.assocs m }
|
||||
where
|
||||
T m = treeFromPaths $ map expandAccountName as :: FastTree AccountName
|
||||
accountTree' a (T m) = nullacct{aname=a, asubs=map (uncurry accountTree') $ M.assocs m}
|
||||
accountTree' a (T m) =
|
||||
nullacct{
|
||||
aname=a
|
||||
,asubs=map (uncurry accountTree') $ M.assocs m
|
||||
}
|
||||
|
||||
-- | Tie the knot so all subaccounts' parents are set correctly.
|
||||
tieAccountParents :: Account -> Account
|
||||
@ -204,12 +208,17 @@ sortAccountTreeByAmount normalsign a
|
||||
maybeflip | normalsign==NormallyNegative = id
|
||||
| otherwise = flip
|
||||
|
||||
-- | Look up an account's declaration order, if any, from the Journal and set it.
|
||||
-- This is the relative position of its account directive
|
||||
-- among the other account directives.
|
||||
accountSetDeclarationOrder :: Journal -> Account -> Account
|
||||
accountSetDeclarationOrder j a@Account{..} =
|
||||
a{adeclarationorder = findIndex (==aname) (jdeclaredaccounts j)}
|
||||
-- | Add extra info for this account derived from the Journal's
|
||||
-- account directives, if any (comment, tags, declaration order..).
|
||||
-- Currently only sets declaration order.
|
||||
-- Expects that this account is among the Journal's jdeclaredaccounts
|
||||
-- (otherwise sets declaration order to 0).
|
||||
accountSetDeclarationInfo :: Journal -> Account -> Account
|
||||
accountSetDeclarationInfo j a@Account{..} =
|
||||
a{adeclarationinfo=Just nullaccountdeclarationinfo{
|
||||
adideclarationorder = fromMaybe 0 $ findIndex (==aname) (jdeclaredaccounts j)
|
||||
}
|
||||
}
|
||||
|
||||
-- | Sort account names by the order in which they were declared in
|
||||
-- the journal, at each level of the account tree (ie within each
|
||||
@ -227,7 +236,7 @@ sortAccountNamesByDeclaration j keepparents as =
|
||||
drop 1 $ -- drop the root node that was added
|
||||
flattenAccounts $ -- convert to an account list
|
||||
sortAccountTreeByDeclaration $ -- sort by declaration order (and name)
|
||||
mapAccounts (accountSetDeclarationOrder j) $ -- add declaration order info
|
||||
mapAccounts (accountSetDeclarationInfo j) $ -- add declaration order info
|
||||
accountTree "root" -- convert to an account tree
|
||||
as
|
||||
|
||||
@ -243,9 +252,10 @@ sortAccountTreeByDeclaration a
|
||||
map sortAccountTreeByDeclaration $ asubs a
|
||||
}
|
||||
|
||||
accountDeclarationOrderAndName :: Account -> (Int, AccountName)
|
||||
accountDeclarationOrderAndName a = (adeclarationorder', aname a)
|
||||
where
|
||||
adeclarationorder' = fromMaybe maxBound (adeclarationorder a)
|
||||
adeclarationorder' = maybe maxBound adideclarationorder $ adeclarationinfo a
|
||||
|
||||
-- | Search an account list by name.
|
||||
lookupAccount :: AccountName -> [Account] -> Maybe Account
|
||||
|
||||
@ -439,18 +439,33 @@ type ParsedJournal = Journal
|
||||
-- The --output-format option selects one of these for output.
|
||||
type StorageFormat = String
|
||||
|
||||
-- | An account, with name, balances and links to parent/subaccounts
|
||||
-- which let you walk up or down the account tree.
|
||||
-- | Extra information about an account that can be derived from
|
||||
-- its account directive (and the other account directives).
|
||||
data AccountDeclarationInfo = AccountDeclarationInfo {
|
||||
adicomment :: Text -- ^ any comment lines following an account directive for this account
|
||||
,aditags :: [Tag] -- ^ tags extracted from the account comment, if any
|
||||
,adideclarationorder :: Int -- ^ the relative position of this account's account directive, if any. Normally a natural number.
|
||||
} deriving (Data)
|
||||
|
||||
nullaccountdeclarationinfo = AccountDeclarationInfo {
|
||||
adicomment = ""
|
||||
,aditags = []
|
||||
,adideclarationorder = 0
|
||||
}
|
||||
|
||||
-- | An account, with its balances, parent/subaccount relationships, etc.
|
||||
-- Only the name is required; the other fields are added when needed.
|
||||
data Account = Account {
|
||||
aname :: AccountName, -- ^ this account's full name
|
||||
adeclarationorder :: Maybe Int , -- ^ the relative position of this account's account directive, if any. Normally a natural number.
|
||||
aebalance :: MixedAmount, -- ^ this account's balance, excluding subaccounts
|
||||
asubs :: [Account], -- ^ sub-accounts
|
||||
anumpostings :: Int, -- ^ number of postings to this account
|
||||
-- derived from the above :
|
||||
aibalance :: MixedAmount, -- ^ this account's balance, including subaccounts
|
||||
aparent :: Maybe Account, -- ^ parent account
|
||||
aboring :: Bool -- ^ used in the accounts report to label elidable parents
|
||||
aname :: AccountName -- ^ this account's full name
|
||||
,adeclarationinfo :: Maybe AccountDeclarationInfo -- ^ optional extra info from account directives
|
||||
-- relationships in the tree
|
||||
,asubs :: [Account] -- ^ this account's sub-accounts
|
||||
,aparent :: Maybe Account -- ^ parent account
|
||||
,aboring :: Bool -- ^ used in the accounts report to label elidable parents
|
||||
-- balance information
|
||||
,anumpostings :: Int -- ^ the number of postings to this account
|
||||
,aebalance :: MixedAmount -- ^ this account's balance, excluding subaccounts
|
||||
,aibalance :: MixedAmount -- ^ this account's balance, including subaccounts
|
||||
} deriving (Typeable, Data, Generic)
|
||||
|
||||
-- | Whether an account's balance is normally a positive number (in
|
||||
|
||||
Loading…
Reference in New Issue
Block a user