add: suggest only one commodity at a time as default amount #383
Since we currently can't accept more than one commodity as input.
This commit is contained in:
parent
2276b1c2d1
commit
92b97e7bd3
@ -48,13 +48,20 @@ nullacct = Account
|
||||
, asubs = []
|
||||
, anumpostings = 0
|
||||
, aebalance = nullmixedamt
|
||||
, aestartbalance = nullmixedamt
|
||||
, aeperiodchange = nullmixedamt
|
||||
, aeendbalance = nullmixedamt
|
||||
, aibalance = nullmixedamt
|
||||
, aistartbalance = nullmixedamt
|
||||
, aiperiodchange = nullmixedamt
|
||||
, aiendbalance = nullmixedamt
|
||||
, aboring = False
|
||||
}
|
||||
|
||||
-- | Derive 1. an account tree and 2. their balances from a list of postings.
|
||||
-- | Derive 1. an account tree and 2. their total changes from a list of postings.
|
||||
-- (ledger's core feature). The accounts are returned in a list, but
|
||||
-- retain their tree structure; the first one is the root of the tree.
|
||||
-- also reference each other as a tree structure; the first account is
|
||||
-- the root of the tree.
|
||||
accountsFromPostings :: [Posting] -> [Account]
|
||||
accountsFromPostings ps =
|
||||
let
|
||||
|
||||
@ -18,9 +18,11 @@ import Text.Printf
|
||||
|
||||
import Hledger.Data.Types
|
||||
import Hledger.Data.Account
|
||||
import Hledger.Data.Dates
|
||||
import Hledger.Data.Journal
|
||||
import Hledger.Data.Posting
|
||||
import Hledger.Query
|
||||
import Hledger.Utils.Debug
|
||||
|
||||
|
||||
instance Show Ledger where
|
||||
@ -39,16 +41,33 @@ nullledger = Ledger {
|
||||
|
||||
-- | Filter a journal's transactions with the given query, then derive
|
||||
-- a ledger containing the chart of accounts and balances. If the
|
||||
-- query includes a depth limit, that will affect the this ledger's
|
||||
-- query includes a depth limit, that will affect the ledger's
|
||||
-- journal but not the ledger's account tree.
|
||||
ledgerFromJournal :: Query -> Journal -> Ledger
|
||||
ledgerFromJournal q j = nullledger{ljournal=j'', laccounts=as}
|
||||
ledgerFromJournal q j = nullledger{ljournal=depthclippedperiodj, laccounts=as}
|
||||
where
|
||||
(q',depthq) = (filterQuery (not . queryIsDepth) q, filterQuery queryIsDepth q)
|
||||
j' = filterJournalAmounts (filterQuery queryIsSym q) $ -- remove amount parts which the query's sym: terms would exclude
|
||||
filterJournalPostings q' j
|
||||
as = accountsFromPostings $ journalPostings j'
|
||||
j'' = filterJournalPostings depthq j'
|
||||
symq = filterQuery queryIsSym q
|
||||
depthq = filterQuery queryIsDepth q
|
||||
periodq = filterQuery (not . queryIsDepth) q
|
||||
-- get account totals before and during report period
|
||||
datelessq = filterQuery (not . queryIsDateOrDate2) periodq
|
||||
dateqcons = Date -- if date2_ opts then Date2 else Date -- import cycle, don't bother supporting date2
|
||||
reportspan = queryDateSpan False {-(date2_ opts)-} q -- date span specified by -b/-e/-p options and query args
|
||||
mstartdate = dbg1 "mstartdate" $ spanStart reportspan
|
||||
menddate = dbg1 "menddate" $ spanEnd reportspan
|
||||
precedingq = dbg1 "precedingq" $
|
||||
case mstartdate of
|
||||
Just _ -> And [datelessq, dateqcons $ DateSpan Nothing mstartdate]
|
||||
Nothing -> None
|
||||
|
||||
-- remove amount parts which the query's sym: terms would exclude
|
||||
precedingj = filterJournalAmounts symq $ filterJournalPostings precedingq j
|
||||
periodj = filterJournalAmounts symq $ filterJournalPostings periodq j
|
||||
precedingas = accountsFromPostings $ journalPostings precedingj
|
||||
as = accountsFromPostings $ journalPostings periodj
|
||||
depthclippedperiodj = filterJournalPostings depthq periodj
|
||||
|
||||
-- j' = journalSelectingAmountFromOpts opts j
|
||||
|
||||
-- | List a ledger's account names.
|
||||
ledgerAccountNames :: Ledger -> [AccountName]
|
||||
|
||||
@ -281,8 +281,8 @@ instance NFData MarketPrice
|
||||
--
|
||||
data Journal = Journal {
|
||||
-- parsing-related data
|
||||
jparsedefaultyear :: (Maybe Year) -- ^ the current default year, specified by the most recent Y directive (or current date)
|
||||
,jparsedefaultcommodity :: (Maybe (CommoditySymbol,AmountStyle)) -- ^ the current default commodity and its format, specified by the most recent D directive
|
||||
jparsedefaultyear :: Maybe Year -- ^ the current default year, specified by the most recent Y directive (or current date)
|
||||
,jparsedefaultcommodity :: Maybe (CommoditySymbol,AmountStyle) -- ^ the current default commodity and its format, specified by the most recent D directive
|
||||
,jparseparentaccounts :: [AccountName] -- ^ the current stack of parent account names, specified by apply account directives
|
||||
,jparsealiases :: [AccountAlias] -- ^ the current account name aliases in effect, specified by alias directives (& options ?)
|
||||
,jparsetransactioncount :: Integer -- ^ the current count of transactions parsed so far (only journal format txns, currently)
|
||||
@ -329,15 +329,23 @@ data Reader = Reader {
|
||||
|
||||
instance Show Reader where show r = rFormat r ++ " reader"
|
||||
|
||||
-- | An account, with name, balances and links to parent/subaccounts
|
||||
-- which let you walk up or down the account tree.
|
||||
-- | An account, with name, links to parent/subaccounts
|
||||
-- which let you walk up or down the account tree, and
|
||||
-- and start/end balances and balance change amount relative to
|
||||
-- some report period.
|
||||
data Account = Account {
|
||||
aname :: AccountName, -- ^ this account's full name
|
||||
aebalance :: MixedAmount, -- ^ this account's balance, excluding subaccounts
|
||||
aestartbalance :: MixedAmount, -- ^ this account's balance at start of report period, excluding subaccounts
|
||||
aeperiodchange :: MixedAmount, -- ^ the change in this account's balance during the report period, excluding subaccounts
|
||||
aeendbalance :: MixedAmount, -- ^ this account's balance at end of report period, 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
|
||||
aistartbalance :: MixedAmount, -- ^ this account's balance at start of report period, excluding subaccounts
|
||||
aiperiodchange :: MixedAmount, -- ^ the change in this account's balance during the report period, excluding subaccounts
|
||||
aiendbalance :: MixedAmount, -- ^ this account's balance at end of report period, excluding subaccounts
|
||||
aparent :: Maybe Account, -- ^ parent account
|
||||
aboring :: Bool -- ^ used in the accounts report to label elidable parents
|
||||
} deriving (Typeable, Data, Generic)
|
||||
|
||||
@ -22,7 +22,7 @@ import Hledger.Reports.ReportOptions
|
||||
import Hledger.Reports.TransactionsReports
|
||||
|
||||
|
||||
-- | Get the historical running inclusive balance of a particular account,
|
||||
-- | Get the historical inclusive balance of a particular account over time,
|
||||
-- from earliest to latest posting date.
|
||||
accountBalanceHistory :: ReportOpts -> Journal -> Account -> [(Day, MixedAmount)]
|
||||
accountBalanceHistory ropts j a = [(getdate t, bal) | (t,_,_,_,_,bal) <- items]
|
||||
|
||||
@ -5,6 +5,13 @@ Balance report, used by the balance command.
|
||||
|
||||
-}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
module Hledger.Reports.BalanceReport (
|
||||
BalanceReport,
|
||||
BalanceReportItem,
|
||||
@ -31,6 +38,12 @@ import Hledger.Utils
|
||||
import Hledger.Reports.ReportOptions
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
-- | A simple single-column balance report. It has:
|
||||
--
|
||||
-- 1. a list of rows, each containing a renderable account name and a corresponding amount
|
||||
@ -141,8 +154,8 @@ mixedAmountValue :: Journal -> Day -> MixedAmount -> MixedAmount
|
||||
mixedAmountValue j d (Mixed as) = Mixed $ map (amountValue j d) as
|
||||
|
||||
-- | Find the market value of this amount on the given date, in it's
|
||||
-- default valuation commodity, based on historical prices. If no
|
||||
-- default valuation commodity can be found, the amount is left
|
||||
-- default valuation commodity, based on recorded market prices.
|
||||
-- If no default valuation commodity can be found, the amount is left
|
||||
-- unchanged.
|
||||
amountValue :: Journal -> Day -> Amount -> Amount
|
||||
amountValue j d a =
|
||||
@ -155,7 +168,7 @@ amountValue j d a =
|
||||
-- | Find the market value, if known, of one unit of this commodity on
|
||||
-- the given date, in the commodity in which it has most recently been
|
||||
-- market-priced (ie the commodity mentioned in the most recent
|
||||
-- applicable historical price directive before this date).
|
||||
-- applicable market price directive before this date).
|
||||
commodityValue :: Journal -> Day -> CommoditySymbol -> Maybe Amount
|
||||
commodityValue j d c
|
||||
| null applicableprices = Nothing
|
||||
@ -163,6 +176,13 @@ commodityValue j d c
|
||||
where
|
||||
applicableprices = [p | p <- sort $ jmarketprices j, mpcommodity p == c, mpdate p <= d]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
tests_balanceReport =
|
||||
let
|
||||
(opts,journal) `gives` r = do
|
||||
|
||||
@ -260,6 +260,7 @@ accountWizard EntryState{..} = do
|
||||
| otherwise = Just t
|
||||
dbg1 = id -- strace
|
||||
|
||||
amountAndCommentWizard :: EntryState -> Wizard Haskeline (Amount, Text)
|
||||
amountAndCommentWizard EntryState{..} = do
|
||||
let pnum = length esPostings + 1
|
||||
(mhistoricalp,followedhistoricalsofar) =
|
||||
@ -270,7 +271,7 @@ amountAndCommentWizard EntryState{..} = do
|
||||
def = case (esArgs, mhistoricalp, followedhistoricalsofar) of
|
||||
(d:_,_,_) -> d
|
||||
(_,Just hp,True) -> showamt $ pamount hp
|
||||
_ | pnum > 1 && not (isZeroMixedAmount balancingamt) -> showamt balancingamt
|
||||
_ | pnum > 1 && not (isZeroMixedAmount balancingamt) -> showamt balancingamtfirstcommodity
|
||||
_ -> ""
|
||||
retryMsg "A valid hledger amount is required. Eg: 1, $2, 3 EUR, \"4 red apples\"." $
|
||||
parser parseAmountAndComment $
|
||||
@ -293,7 +294,9 @@ amountAndCommentWizard EntryState{..} = do
|
||||
-- eof
|
||||
return (a,c)
|
||||
balancingamt = negate $ sum $ map pamount realps where realps = filter isReal esPostings
|
||||
showamt = showMixedAmountWithPrecision
|
||||
balancingamtfirstcommodity = Mixed $ take 1 $ amounts balancingamt
|
||||
showamt =
|
||||
showMixedAmountWithPrecision
|
||||
-- what should this be ?
|
||||
-- 1 maxprecision (show all decimal places or none) ?
|
||||
-- 2 maxprecisionwithpoint (show all decimal places or .0 - avoids some but not all confusion with thousands separators) ?
|
||||
|
||||
Loading…
Reference in New Issue
Block a user