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 = [] |   , asubs = [] | ||||||
|   , anumpostings = 0 |   , anumpostings = 0 | ||||||
|   , aebalance = nullmixedamt |   , aebalance = nullmixedamt | ||||||
|  |   , aestartbalance = nullmixedamt | ||||||
|  |   , aeperiodchange = nullmixedamt | ||||||
|  |   , aeendbalance   = nullmixedamt | ||||||
|   , aibalance = nullmixedamt |   , aibalance = nullmixedamt | ||||||
|  |   , aistartbalance = nullmixedamt | ||||||
|  |   , aiperiodchange = nullmixedamt | ||||||
|  |   , aiendbalance   = nullmixedamt | ||||||
|   , aboring = False |   , 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 | -- (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 :: [Posting] -> [Account] | ||||||
| accountsFromPostings ps = | accountsFromPostings ps = | ||||||
|   let |   let | ||||||
|  | |||||||
| @ -18,9 +18,11 @@ import Text.Printf | |||||||
| 
 | 
 | ||||||
| import Hledger.Data.Types | import Hledger.Data.Types | ||||||
| import Hledger.Data.Account | import Hledger.Data.Account | ||||||
|  | import Hledger.Data.Dates | ||||||
| import Hledger.Data.Journal | import Hledger.Data.Journal | ||||||
| import Hledger.Data.Posting | import Hledger.Data.Posting | ||||||
| import Hledger.Query | import Hledger.Query | ||||||
|  | import Hledger.Utils.Debug | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| instance Show Ledger where | instance Show Ledger where | ||||||
| @ -39,16 +41,33 @@ nullledger = Ledger { | |||||||
| 
 | 
 | ||||||
| -- | Filter a journal's transactions with the given query, then derive | -- | Filter a journal's transactions with the given query, then derive | ||||||
| -- a ledger containing the chart of accounts and balances. If the | -- 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. | -- journal but not the ledger's account tree. | ||||||
| ledgerFromJournal :: Query -> Journal -> Ledger | ledgerFromJournal :: Query -> Journal -> Ledger | ||||||
| ledgerFromJournal q j = nullledger{ljournal=j'', laccounts=as} | ledgerFromJournal q j = nullledger{ljournal=depthclippedperiodj, laccounts=as} | ||||||
|   where |   where | ||||||
|     (q',depthq)  = (filterQuery (not . queryIsDepth) q, filterQuery queryIsDepth q) |     symq        = filterQuery queryIsSym q | ||||||
|     j'  = filterJournalAmounts (filterQuery queryIsSym q) $ -- remove amount parts which the query's sym: terms would exclude |     depthq      = filterQuery queryIsDepth q | ||||||
|           filterJournalPostings q' j |     periodq     = filterQuery (not . queryIsDepth) q | ||||||
|     as  = accountsFromPostings $ journalPostings j' |     -- get account totals before and during report period | ||||||
|     j'' = filterJournalPostings depthq j' |     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. | -- | List a ledger's account names. | ||||||
| ledgerAccountNames :: Ledger -> [AccountName] | ledgerAccountNames :: Ledger -> [AccountName] | ||||||
|  | |||||||
| @ -281,8 +281,8 @@ instance NFData MarketPrice | |||||||
| -- | -- | ||||||
| data Journal = Journal { | data Journal = Journal { | ||||||
|   -- parsing-related data |   -- parsing-related data | ||||||
|    jparsedefaultyear      :: (Maybe Year)                          -- ^ the current default year, specified by the most recent Y directive (or current date) |    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 |   ,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 |   ,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 ?) |   ,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) |   ,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" | instance Show Reader where show r = rFormat r ++ " reader" | ||||||
| 
 | 
 | ||||||
| -- | An account, with name, balances and links to parent/subaccounts | -- | An account, with name, links to parent/subaccounts | ||||||
| -- which let you walk up or down the account tree. | -- 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 { | data Account = Account { | ||||||
|   aname                     :: AccountName,   -- ^ this account's full name |   aname                     :: AccountName,   -- ^ this account's full name | ||||||
|   aebalance                 :: MixedAmount,   -- ^ this account's balance, excluding subaccounts |   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 |   asubs                     :: [Account],     -- ^ sub-accounts | ||||||
|   anumpostings              :: Int,           -- ^ number of postings to this account |   anumpostings              :: Int,           -- ^ number of postings to this account | ||||||
|   -- derived from the above : |   -- derived from the above : | ||||||
|   aibalance                 :: MixedAmount,   -- ^ this account's balance, including subaccounts |   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 |   aparent                   :: Maybe Account, -- ^ parent account | ||||||
|   aboring                   :: Bool           -- ^ used in the accounts report to label elidable parents |   aboring                   :: Bool           -- ^ used in the accounts report to label elidable parents | ||||||
|   } deriving (Typeable, Data, Generic) |   } deriving (Typeable, Data, Generic) | ||||||
|  | |||||||
| @ -22,7 +22,7 @@ import Hledger.Reports.ReportOptions | |||||||
| import Hledger.Reports.TransactionsReports | 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. | -- from earliest to latest posting date. | ||||||
| accountBalanceHistory :: ReportOpts -> Journal -> Account -> [(Day, MixedAmount)] | accountBalanceHistory :: ReportOpts -> Journal -> Account -> [(Day, MixedAmount)] | ||||||
| accountBalanceHistory ropts j a = [(getdate t, bal) | (t,_,_,_,_,bal) <- items] | 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 ( | module Hledger.Reports.BalanceReport ( | ||||||
|   BalanceReport, |   BalanceReport, | ||||||
|   BalanceReportItem, |   BalanceReportItem, | ||||||
| @ -31,6 +38,12 @@ import Hledger.Utils | |||||||
| import Hledger.Reports.ReportOptions | import Hledger.Reports.ReportOptions | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| -- | A simple single-column balance report. It has: | -- | A simple single-column balance report. It has: | ||||||
| -- | -- | ||||||
| -- 1. a list of rows, each containing a renderable account name and a corresponding amount | -- 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 | 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 | -- | 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, based on recorded market prices. | ||||||
| -- default valuation commodity can be found, the amount is left | -- If no default valuation commodity can be found, the amount is left | ||||||
| -- unchanged. | -- unchanged. | ||||||
| amountValue :: Journal -> Day -> Amount -> Amount | amountValue :: Journal -> Day -> Amount -> Amount | ||||||
| amountValue j d a = | 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 | -- | 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 | -- the given date, in the commodity in which it has most recently been | ||||||
| -- market-priced (ie the commodity mentioned in the most recent | -- 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 :: Journal -> Day -> CommoditySymbol -> Maybe Amount | ||||||
| commodityValue j d c | commodityValue j d c | ||||||
|     | null applicableprices = Nothing |     | null applicableprices = Nothing | ||||||
| @ -163,6 +176,13 @@ commodityValue j d c | |||||||
|   where |   where | ||||||
|     applicableprices = [p | p <- sort $ jmarketprices j, mpcommodity p == c, mpdate p <= d] |     applicableprices = [p | p <- sort $ jmarketprices j, mpcommodity p == c, mpdate p <= d] | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| tests_balanceReport = | tests_balanceReport = | ||||||
|   let |   let | ||||||
|     (opts,journal) `gives` r = do |     (opts,journal) `gives` r = do | ||||||
|  | |||||||
| @ -260,6 +260,7 @@ accountWizard EntryState{..} = do | |||||||
|                             | otherwise = Just t |                             | otherwise = Just t | ||||||
|       dbg1 = id -- strace |       dbg1 = id -- strace | ||||||
| 
 | 
 | ||||||
|  | amountAndCommentWizard :: EntryState -> Wizard Haskeline (Amount, Text) | ||||||
| amountAndCommentWizard EntryState{..} = do | amountAndCommentWizard EntryState{..} = do | ||||||
|   let pnum = length esPostings + 1 |   let pnum = length esPostings + 1 | ||||||
|       (mhistoricalp,followedhistoricalsofar) = |       (mhistoricalp,followedhistoricalsofar) = | ||||||
| @ -270,7 +271,7 @@ amountAndCommentWizard EntryState{..} = do | |||||||
|       def = case (esArgs, mhistoricalp, followedhistoricalsofar) of |       def = case (esArgs, mhistoricalp, followedhistoricalsofar) of | ||||||
|               (d:_,_,_)                                             -> d |               (d:_,_,_)                                             -> d | ||||||
|               (_,Just hp,True)                                      -> showamt $ pamount hp |               (_,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\"." $ |   retryMsg "A valid hledger amount is required. Eg: 1, $2, 3 EUR, \"4 red apples\"." $ | ||||||
|    parser parseAmountAndComment $ |    parser parseAmountAndComment $ | ||||||
| @ -293,7 +294,9 @@ amountAndCommentWizard EntryState{..} = do | |||||||
|         -- eof |         -- eof | ||||||
|         return (a,c) |         return (a,c) | ||||||
|       balancingamt = negate $ sum $ map pamount realps where realps = filter isReal esPostings |       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 ? |                   -- what should this be ? | ||||||
|                   -- 1 maxprecision (show all decimal places or none) ? |                   -- 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) ? |                   -- 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