lib: Do not include price directives in journalDateSpan. Only include
price directives after the last transaction/posting date if using --value=end. Also enlarges the reportspan to encompass full intervals for budget goals.
This commit is contained in:
		
							parent
							
								
									ff5e810c78
								
							
						
					
					
						commit
						edaaef897b
					
				| @ -58,6 +58,7 @@ module Hledger.Data.Journal ( | ||||
|   journalPayeesDeclaredOrUsed, | ||||
|   journalCommoditiesDeclared, | ||||
|   journalDateSpan, | ||||
|   journalDateSpanBothDates, | ||||
|   journalStartDate, | ||||
|   journalEndDate, | ||||
|   journalDescriptions, | ||||
| @ -106,14 +107,14 @@ import qualified Data.HashTable.ST.Cuckoo as H | ||||
| import Data.List (find, foldl', sortOn) | ||||
| import Data.List.Extra (nubSort) | ||||
| import qualified Data.Map.Strict as M | ||||
| import Data.Maybe (catMaybes, fromJust, fromMaybe, isJust, mapMaybe) | ||||
| import Data.Maybe (catMaybes, fromJust, fromMaybe, isJust, mapMaybe, maybeToList) | ||||
| #if !(MIN_VERSION_base(4,11,0)) | ||||
| import Data.Semigroup (Semigroup(..)) | ||||
| #endif | ||||
| import qualified Data.Set as S | ||||
| import Data.Text (Text) | ||||
| import qualified Data.Text as T | ||||
| import Safe (headMay, headDef) | ||||
| import Safe (headMay, headDef, maximumMay, minimumMay) | ||||
| import Data.Time.Calendar (Day, addDays, fromGregorian) | ||||
| import Data.Tree (Tree, flatten) | ||||
| import System.Time (ClockTime(TOD)) | ||||
| @ -1286,23 +1287,34 @@ journalStyleInfluencingAmounts j = | ||||
| -- | The fully specified date span enclosing the dates (primary or secondary) | ||||
| -- of all this journal's transactions and postings, or DateSpan Nothing Nothing | ||||
| -- if there are none. | ||||
| -- | ||||
| -- This will include the dates of any price directives that come after the last | ||||
| -- posting/transaction, but not those that come before the first. | ||||
| journalDateSpan :: Bool -> Journal -> DateSpan | ||||
| journalDateSpan secondary j | ||||
|     | null ts   = DateSpan Nothing Nothing | ||||
|     | otherwise = DateSpan (Just earliest) (Just $ addDays 1 latest) | ||||
|     where | ||||
|       earliest = minimumStrict dates | ||||
|       latest   = case ddates of | ||||
|                       [] -> maximumStrict dates | ||||
|                       _  -> max (maximumStrict ddates) (maximumStrict dates)  -- Include commodity price directives in journal end | ||||
|       dates    = pdates ++ tdates | ||||
|       tdates   = map (if secondary then transactionDate2 else tdate) ts | ||||
|       pdates   = concatMap (mapMaybe (if secondary then (Just . postingDate2) else pdate) . tpostings) ts | ||||
|       ddates   = map pddate $ jpricedirectives j | ||||
|       ts       = jtxns j | ||||
| journalDateSpan False = journalDateSpanHelper $ Just PrimaryDate | ||||
| journalDateSpan True  = journalDateSpanHelper $ Just SecondaryDate | ||||
| 
 | ||||
| -- | The fully specified date span enclosing the dates (primary and secondary) | ||||
| -- of all this journal's transactions and postings, or DateSpan Nothing Nothing | ||||
| -- if there are none. | ||||
| journalDateSpanBothDates :: Journal -> DateSpan | ||||
| journalDateSpanBothDates = journalDateSpanHelper Nothing | ||||
| 
 | ||||
| -- | A helper for journalDateSpan which takes Maybe WhichDate directly. Nothing | ||||
| -- uses both primary and secondary dates. | ||||
| journalDateSpanHelper :: Maybe WhichDate -> Journal -> DateSpan | ||||
| journalDateSpanHelper whichdate j = | ||||
|     DateSpan (minimumMay dates) (addDays 1 <$> maximumMay dates) | ||||
|   where | ||||
|     dates    = pdates ++ tdates | ||||
|     tdates   = concatMap gettdate ts | ||||
|     pdates   = concatMap getpdate $ concatMap tpostings ts | ||||
|     ts       = jtxns j | ||||
|     gettdate t = case whichdate of | ||||
|         Just PrimaryDate   -> [tdate t] | ||||
|         Just SecondaryDate -> [fromMaybe (tdate t) $ tdate2 t] | ||||
|         Nothing            -> tdate t : maybeToList (tdate2 t) | ||||
|     getpdate p = case whichdate of | ||||
|         Just PrimaryDate   -> maybeToList $ pdate p | ||||
|         Just SecondaryDate -> maybeToList $ pdate2 p <|> pdate p | ||||
|         Nothing            -> catMaybes [pdate p, pdate2 p] | ||||
| 
 | ||||
| -- | The earliest of this journal's transaction and posting dates, or | ||||
| -- Nothing if there are none. | ||||
| @ -1349,7 +1361,7 @@ journalApplyAliases aliases j = | ||||
|   case mapM (transactionApplyAliases aliases) $ jtxns j of | ||||
|     Right ts -> Right j{jtxns = ts} | ||||
|     Left err -> Left err | ||||
|    | ||||
| 
 | ||||
| -- -- | Build a database of market prices in effect on the given date, | ||||
| -- -- from the journal's price directives. | ||||
| -- journalPrices :: Day -> Journal -> Prices | ||||
|  | ||||
| @ -23,7 +23,6 @@ module Hledger.Reports.MultiBalanceReport ( | ||||
|   sortRowsLike, | ||||
| 
 | ||||
|   -- * Helper functions | ||||
|   calculateReportSpan, | ||||
|   makeReportQuery, | ||||
|   getPostingsByColumn, | ||||
|   getPostings, | ||||
| @ -50,7 +49,7 @@ import Data.Semigroup ((<>)) | ||||
| #endif | ||||
| import Data.Semigroup (sconcat) | ||||
| import Data.Time.Calendar (Day, addDays, fromGregorian) | ||||
| import Safe (headMay, lastDef, lastMay, minimumMay) | ||||
| import Safe (lastDef, minimumMay) | ||||
| 
 | ||||
| import Hledger.Data | ||||
| import Hledger.Query | ||||
| @ -112,7 +111,7 @@ multiBalanceReportWith :: ReportSpec -> Journal -> PriceOracle -> MultiBalanceRe | ||||
| multiBalanceReportWith rspec' j priceoracle = report | ||||
|   where | ||||
|     -- Queries, report/column dates. | ||||
|     reportspan = dbg3 "reportspan" $ calculateReportSpan rspec' j | ||||
|     reportspan = dbg3 "reportspan" $ reportSpan j rspec' | ||||
|     rspec      = dbg3 "reportopts" $ makeReportQuery rspec' reportspan | ||||
| 
 | ||||
|     -- Group postings into their columns. | ||||
| @ -140,7 +139,7 @@ compoundBalanceReportWith :: ReportSpec -> Journal -> PriceOracle | ||||
| compoundBalanceReportWith rspec' j priceoracle subreportspecs = cbr | ||||
|   where | ||||
|     -- Queries, report/column dates. | ||||
|     reportspan = dbg3 "reportspan" $ calculateReportSpan rspec' j | ||||
|     reportspan = dbg3 "reportspan" $ reportSpan j rspec' | ||||
|     rspec      = dbg3 "reportopts" $ makeReportQuery rspec' reportspan | ||||
| 
 | ||||
|     -- Group postings into their columns. | ||||
| @ -215,26 +214,6 @@ startingBalances rspec@ReportSpec{rsQuery=query,rsOpts=ropts} j priceoracle repo | ||||
|         DateSpan Nothing Nothing -> emptydatespan | ||||
|         a -> a | ||||
| 
 | ||||
| -- | Calculate the span of the report to be generated. | ||||
| calculateReportSpan :: ReportSpec -> Journal -> DateSpan | ||||
| calculateReportSpan ReportSpec{rsQuery=query,rsOpts=ropts} j = reportspan | ||||
|   where | ||||
|     -- The date span specified by -b/-e/-p options and query args if any. | ||||
|     requestedspan  = dbg3 "requestedspan" $ queryDateSpan (date2_ ropts) query | ||||
|     -- If the requested span is open-ended, close it using the journal's start and end dates. | ||||
|     -- This can still be the null (open) span if the journal is empty. | ||||
|     requestedspan' = dbg3 "requestedspan'" $ | ||||
|         requestedspan `spanDefaultsFrom` journalDateSpan (date2_ ropts) j | ||||
|     -- The list of interval spans enclosing the requested span. | ||||
|     -- This list can be empty if the journal was empty, | ||||
|     -- or if hledger-ui has added its special date:-tomorrow to the query | ||||
|     -- and all txns are in the future. | ||||
|     intervalspans  = dbg3 "intervalspans" $ splitSpan (interval_ ropts) requestedspan' | ||||
|     -- The requested span enlarged to enclose a whole number of intervals. | ||||
|     -- This can be the null span if there were no intervals. | ||||
|     reportspan = DateSpan (spanStart =<< headMay intervalspans) | ||||
|                           (spanEnd =<< lastMay intervalspans) | ||||
| 
 | ||||
| -- | Remove any date queries and insert queries from the report span. | ||||
| -- The user's query expanded to the report span | ||||
| -- if there is one (otherwise any date queries are left as-is, which | ||||
|  | ||||
| @ -65,7 +65,7 @@ type SummaryPosting = (Posting, Day) | ||||
| postingsReport :: ReportSpec -> Journal -> PostingsReport | ||||
| postingsReport rspec@ReportSpec{rsOpts=ropts@ReportOpts{..}} j = items | ||||
|     where | ||||
|       reportspan  = adjustReportDates rspec j | ||||
|       reportspan  = reportSpanBothDates j rspec | ||||
|       whichdate   = whichDateFromOpts ropts | ||||
|       mdepth      = queryDepth $ rsQuery rspec | ||||
|       styles      = journalCommodityStyles j | ||||
| @ -124,26 +124,6 @@ registerRunningCalculationFn ropts | ||||
|   | average_ ropts = \i avg amt -> avg + divideMixedAmount (fromIntegral i) (amt - avg) | ||||
|   | otherwise      = \_ bal amt -> bal + amt | ||||
| 
 | ||||
| -- | Adjust report start/end dates to more useful ones based on | ||||
| -- journal data and report intervals. Ie: | ||||
| -- 1. If the start date is unspecified, use the earliest date in the journal (if any) | ||||
| -- 2. If the end date is unspecified, use the latest date in the journal (if any) | ||||
| -- 3. If a report interval is specified, enlarge the dates to enclose whole intervals | ||||
| adjustReportDates :: ReportSpec -> Journal -> DateSpan | ||||
| adjustReportDates rspec@ReportSpec{rsOpts=ropts} j = reportspan | ||||
|   where | ||||
|     -- see also multiBalanceReport | ||||
|     requestedspan       = dbg3 "requestedspan"       $ queryDateSpan' $ rsQuery rspec                         -- span specified by -b/-e/-p options and query args | ||||
|     journalspan         = dbg3 "journalspan"         $ dates `spanUnion` date2s                               -- earliest and latest dates (or date2s) in the journal | ||||
|       where | ||||
|         dates  = journalDateSpan False j | ||||
|         date2s = journalDateSpan True  j | ||||
|     requestedspanclosed = dbg3 "requestedspanclosed" $ requestedspan `spanDefaultsFrom` journalspan           -- if open-ended, close it using the journal's dates (if any) | ||||
|     intervalspans       = dbg3 "intervalspans"       $ splitSpan (interval_ ropts) requestedspanclosed  -- get the whole intervals enclosing that | ||||
|     mreportstart        = dbg3 "reportstart"         $ maybe Nothing spanStart $ headMay intervalspans        -- start of the first interval, or open ended | ||||
|     mreportend          = dbg3 "reportend"           $ maybe Nothing spanEnd   $ lastMay intervalspans        -- end of the last interval, or open ended | ||||
|     reportspan          = dbg3 "reportspan"          $ DateSpan mreportstart mreportend                       -- the requested span enlarged to whole intervals if possible | ||||
| 
 | ||||
| -- | Find postings matching a given query, within a given date span, | ||||
| -- and also any similarly-matched postings before that date span. | ||||
| -- Date restrictions and depth restrictions in the query are ignored. | ||||
|  | ||||
| @ -34,6 +34,7 @@ module Hledger.Reports.ReportOptions ( | ||||
|   transactionDateFn, | ||||
|   postingDateFn, | ||||
|   reportSpan, | ||||
|   reportSpanBothDates, | ||||
|   reportStartDate, | ||||
|   reportEndDate, | ||||
|   reportPeriodStart, | ||||
| @ -49,7 +50,7 @@ import Data.Maybe (fromMaybe, isJust, mapMaybe) | ||||
| import qualified Data.Text as T | ||||
| import Data.Time.Calendar (Day, addDays) | ||||
| import Data.Default (Default(..)) | ||||
| import Safe (lastDef, lastMay) | ||||
| import Safe (headMay, lastDef, lastMay, maximumMay) | ||||
| 
 | ||||
| import System.Console.ANSI (hSupportsANSIColor) | ||||
| import System.Environment (lookupEnv) | ||||
| @ -513,13 +514,41 @@ queryFromFlags ReportOpts{..} = simplifyQuery $ And flagsq | ||||
| -- options or queries, or otherwise the earliest and latest transaction or | ||||
| -- posting dates in the journal. If no dates are specified by options/queries | ||||
| -- and the journal is empty, returns the null date span. | ||||
| -- The boolean argument flags whether primary and secondary dates are considered | ||||
| -- equivalently. | ||||
| reportSpan :: Journal -> ReportSpec -> DateSpan | ||||
| reportSpan j ReportSpec{rsQuery=query} = dbg3 "reportspan" $ DateSpan mstartdate menddate | ||||
| reportSpan = reportSpanHelper False | ||||
| 
 | ||||
| -- | Like reportSpan, but uses both primary and secondary dates when calculating | ||||
| -- the span. | ||||
| reportSpanBothDates :: Journal -> ReportSpec -> DateSpan | ||||
| reportSpanBothDates = reportSpanHelper True | ||||
| 
 | ||||
| -- | A helper for reportSpan, which takes a Bool indicating whether to use both | ||||
| -- primary and secondary dates. | ||||
| reportSpanHelper :: Bool -> Journal -> ReportSpec -> DateSpan | ||||
| reportSpanHelper bothdates j ReportSpec{rsQuery=query, rsOpts=ropts} = reportspan | ||||
|   where | ||||
|     DateSpan mjournalstartdate mjournalenddate = | ||||
|       dbg3 "journalspan" $ journalDateSpan False j  -- ignore secondary dates | ||||
|     mstartdate = queryStartDate False query <|> mjournalstartdate | ||||
|     menddate   = queryEndDate   False query <|> mjournalenddate | ||||
|     -- The date span specified by -b/-e/-p options and query args if any. | ||||
|     requestedspan  = dbg3 "requestedspan" $ if bothdates then queryDateSpan' query else queryDateSpan (date2_ ropts) query | ||||
|     -- If we are requesting period-end valuation, the journal date span should | ||||
|     -- include price directives after the last transaction | ||||
|     journalspan = dbg3 "journalspan" $ if bothdates then journalDateSpanBothDates j else journalDateSpan (date2_ ropts) j | ||||
|     pricespan = dbg3 "pricespan" . DateSpan Nothing $ case value_ ropts of | ||||
|         Just (AtEnd _) -> fmap (addDays 1) . maximumMay . map pddate $ jpricedirectives j | ||||
|         _              -> Nothing | ||||
|     -- If the requested span is open-ended, close it using the journal's start and end dates. | ||||
|     -- This can still be the null (open) span if the journal is empty. | ||||
|     requestedspan' = dbg3 "requestedspan'" $ requestedspan `spanDefaultsFrom` (journalspan `spanUnion` pricespan) | ||||
|     -- The list of interval spans enclosing the requested span. | ||||
|     -- This list can be empty if the journal was empty, | ||||
|     -- or if hledger-ui has added its special date:-tomorrow to the query | ||||
|     -- and all txns are in the future. | ||||
|     intervalspans  = dbg3 "intervalspans" $ splitSpan (interval_ ropts) requestedspan' | ||||
|     -- The requested span enlarged to enclose a whole number of intervals. | ||||
|     -- This can be the null span if there were no intervals. | ||||
|     reportspan = dbg3 "reportspan" $ DateSpan (spanStart =<< headMay intervalspans) | ||||
|                                               (spanEnd =<< lastMay intervalspans) | ||||
| 
 | ||||
| reportStartDate :: Journal -> ReportSpec -> Maybe Day | ||||
| reportStartDate j = spanStart . reportSpan j | ||||
| @ -550,8 +579,13 @@ reportPeriodLastDay = fmap (addDays (-1)) . queryEndDate False . rsQuery | ||||
| 
 | ||||
| -- Get the last day of the overall report period, or if no report | ||||
| -- period is specified, the last day of the journal (ie the latest | ||||
| -- posting date). If there's no report period and nothing in the | ||||
| -- posting date). If we're doing period-end valuation, include price | ||||
| -- directive dates. If there's no report period and nothing in the | ||||
| -- journal, will be Nothing. | ||||
| reportPeriodOrJournalLastDay :: ReportSpec -> Journal -> Maybe Day | ||||
| reportPeriodOrJournalLastDay rspec j = | ||||
|   reportPeriodLastDay rspec <|> journalEndDate False j | ||||
| reportPeriodOrJournalLastDay rspec j = reportPeriodLastDay rspec <|> journalOrPriceEnd | ||||
|   where | ||||
|     journalOrPriceEnd = case value_ $ rsOpts rspec of | ||||
|         Just (AtEnd _) -> max (journalEndDate False j) lastPriceDirective | ||||
|         _              -> journalEndDate False j | ||||
|     lastPriceDirective = fmap (addDays 1) . maximumMay . map pddate $ jpricedirectives j | ||||
|  | ||||
| @ -158,11 +158,11 @@ Budget performance in 2018-01-01W01: | ||||
| 
 | ||||
|    ||  2018-01-01W01  | ||||
| ===++================ | ||||
|  a || 2 [7% of   30]  | ||||
|  a || 2 [3% of   70]  | ||||
|  b || 2 [2% of  100]  | ||||
|  c || 2 [0% of 1000]  | ||||
| ---++---------------- | ||||
|    || 6 [1% of 1130]  | ||||
|    || 6 [1% of 1170]  | ||||
| 
 | ||||
| # 7. A bounded two day budget. The end date is exclusive as usual. | ||||
| < | ||||
| @ -557,11 +557,12 @@ $ hledger bal -f- --budget -TA not:income -O csv | ||||
| "expenses:bills:f","$10","0","$10","0","$10","0" | ||||
| "Total:","$80","$370","$80","$370","$80","$370" | ||||
| 
 | ||||
| # 28. You might expect this to show a budget goal in jan, feb, mar. | ||||
| # 28. You would expect this to show a budget goal in jan, feb, mar. | ||||
| # But by the usual report date logic, which picks the oldest and newest  | ||||
| # transaction date (1/15 and 3/15) as start and end date by default,  | ||||
| # and since "monthly" generates transactions on the 1st, | ||||
| # the january budget goal transaction is excluded. | ||||
| # the january budget goal transaction is excluded. Make sure we entend so | ||||
| # they're included. | ||||
| < | ||||
| ~ monthly in 2020 | ||||
|   (expenses:food)  $500 | ||||
| @ -577,12 +578,12 @@ $ hledger bal -f- --budget -TA not:income -O csv | ||||
| $ hledger -f- bal --budget -M | ||||
| Budget performance in 2020Q1: | ||||
| 
 | ||||
|                ||   Jan             Feb                   Mar  | ||||
| ===============++============================================= | ||||
|  <unbudgeted>  || $-400  0               $-600                 | ||||
|  expenses:food ||  $400  0 [0% of $500]   $600 [120% of $500]  | ||||
| ---------------++--------------------------------------------- | ||||
|                ||     0  0 [0% of $500]      0 [  0% of $500]  | ||||
|                ||                 Jan             Feb                   Mar  | ||||
| ===============++=========================================================== | ||||
|  <unbudgeted>  || $-400                0               $-600                 | ||||
|  expenses:food ||  $400 [80% of $500]  0 [0% of $500]   $600 [120% of $500]  | ||||
| ---------------++----------------------------------------------------------- | ||||
|                ||     0 [ 0% of $500]  0 [0% of $500]      0 [  0% of $500]  | ||||
| 
 | ||||
| # 29. Specifying the report period works around it. | ||||
| $ hledger -f- bal --budget -M date:2020q1 | ||||
|  | ||||
| @ -368,23 +368,23 @@ $ hledger -f- bal -N -V -b 2000 | ||||
| 
 | ||||
| # 34. multicolumn balance report valued at cost | ||||
| $ hledger -f- bal -MTA --value=cost -b 2000 | ||||
| Balance changes in 2000-01-01..2000-04-30, converted to cost: | ||||
| Balance changes in 2000Q1, converted to cost: | ||||
| 
 | ||||
|    || Jan  Feb  Mar  Apr    Total  Average  | ||||
| ===++====================================== | ||||
|  a || 6 B  7 B  8 B    0     21 B      5 B  | ||||
| ---++-------------------------------------- | ||||
|    || 6 B  7 B  8 B    0     21 B      5 B  | ||||
|    || Jan  Feb  Mar    Total  Average  | ||||
| ===++================================= | ||||
|  a || 6 B  7 B  8 B     21 B      7 B  | ||||
| ---++--------------------------------- | ||||
|    || 6 B  7 B  8 B     21 B      7 B  | ||||
| 
 | ||||
| # 35. multicolumn balance report valued at posting date | ||||
| $ hledger -f- bal -M --value=then -b 2000 | ||||
| Balance changes in 2000-01-01..2000-04-30, valued at posting date: | ||||
| Balance changes in 2000Q1, valued at posting date: | ||||
| 
 | ||||
|    || Jan  Feb  Mar  Apr  | ||||
| ===++==================== | ||||
|  a || 1 B  2 B  3 B    0  | ||||
| ---++-------------------- | ||||
|    || 1 B  2 B  3 B    0  | ||||
|    || Jan  Feb  Mar  | ||||
| ===++=============== | ||||
|  a || 1 B  2 B  3 B  | ||||
| ---++--------------- | ||||
|    || 1 B  2 B  3 B  | ||||
| 
 | ||||
| # 36. multicolumn balance report showing changes in period-end values with -T or -A | ||||
| $ hledger -f- bal -MTA --value=end -b 2000 | ||||
| @ -398,23 +398,23 @@ Balance changes in 2000-01-01..2000-04-30, valued at period ends: | ||||
| 
 | ||||
| # 37. multicolumn balance report valued at other date | ||||
| $ hledger -f- bal -MTA --value=2000-01-15 -b 2000 | ||||
| Balance changes in 2000-01-01..2000-04-30, valued at 2000-01-15: | ||||
| Balance changes in 2000Q1, valued at 2000-01-15: | ||||
| 
 | ||||
|    || Jan  Feb  Mar  Apr    Total  Average  | ||||
| ===++====================================== | ||||
|  a || 5 B  5 B  5 B    0     15 B      4 B  | ||||
| ---++-------------------------------------- | ||||
|    || 5 B  5 B  5 B    0     15 B      4 B  | ||||
|    || Jan  Feb  Mar    Total  Average  | ||||
| ===++================================= | ||||
|  a || 5 B  5 B  5 B     15 B      5 B  | ||||
| ---++--------------------------------- | ||||
|    || 5 B  5 B  5 B     15 B      5 B  | ||||
| 
 | ||||
| # 38. multicolumn balance report valued today (with today >= 2000-04-01) | ||||
| $ hledger -f- bal -M --value=now -b 2000 | ||||
| Balance changes in 2000-01-01..2000-04-30, current value: | ||||
| Balance changes in 2000Q1, current value: | ||||
| 
 | ||||
|    || Jan  Feb  Mar  Apr  | ||||
| ===++==================== | ||||
|  a || 4 B  4 B  4 B    0  | ||||
| ---++-------------------- | ||||
|    || 4 B  4 B  4 B    0  | ||||
|    || Jan  Feb  Mar  | ||||
| ===++=============== | ||||
|  a || 4 B  4 B  4 B  | ||||
| ---++--------------- | ||||
|    || 4 B  4 B  4 B  | ||||
| 
 | ||||
| # 39. multicolumn balance report showing changes in period-end values (same as --value=end) | ||||
| $ hledger -f- bal -M -V -b 2000 | ||||
| @ -432,14 +432,14 @@ Balance changes in 2000-01-01..2000-04-30, valued at period ends: | ||||
| # The starting balance on 2000/01/01 is 14 B (cost of the first 8A). | ||||
| # February adds 1 A costing 7 B, making 21 B. | ||||
| # March adds 1 A costing 8 B, making 29 B. | ||||
| $ hledger -f- bal -M -H -b 200002 --value=cost | ||||
| Ending balances (historical) in 2000-02-01..2000-04-30, converted to cost: | ||||
| $ hledger -f- bal -M -H -b 200002 --cost | ||||
| Ending balances (historical) in 2000-02-01..2000-03-31, converted to cost: | ||||
| 
 | ||||
|    || 2000-02-29  2000-03-31  2000-04-30  | ||||
| ===++==================================== | ||||
|  a ||       13 B        21 B        21 B  | ||||
| ---++------------------------------------ | ||||
|    ||       13 B        21 B        21 B  | ||||
|    || 2000-02-29  2000-03-31  | ||||
| ===++======================== | ||||
|  a ||       13 B        21 B  | ||||
| ---++------------------------ | ||||
|    ||       13 B        21 B  | ||||
| 
 | ||||
| # 41. multicolumn balance report with -H valued at period end. | ||||
| # The starting balance is 1 A. | ||||
| @ -458,13 +458,13 @@ Ending balances (historical) in 2000-02-01..2000-04-30, valued at period ends: | ||||
| # 42. multicolumn balance report with -H valued at other date. | ||||
| # The starting balance is 15 B (3 A valued at 2000/1/15). | ||||
| $ hledger -f- bal -M -H -b 200002 --value=2000-01-15 | ||||
| Ending balances (historical) in 2000-02-01..2000-04-30, valued at 2000-01-15: | ||||
| Ending balances (historical) in 2000-02-01..2000-03-31, valued at 2000-01-15: | ||||
| 
 | ||||
|    || 2000-02-29  2000-03-31  2000-04-30  | ||||
| ===++==================================== | ||||
|  a ||       10 B        15 B        15 B  | ||||
| ---++------------------------------------ | ||||
|    ||       10 B        15 B        15 B  | ||||
|    || 2000-02-29  2000-03-31  | ||||
| ===++======================== | ||||
|  a ||       10 B        15 B  | ||||
| ---++------------------------ | ||||
|    ||       10 B        15 B  | ||||
| 
 | ||||
| # 43. multicolumn balance report with -H, valuing each period's carried-over balances at cost. | ||||
| < | ||||
| @ -531,23 +531,23 @@ P 2000/04/01 A  4 B | ||||
| 
 | ||||
| # 46. budget report, unvalued (for reference). | ||||
| $ hledger -f- bal -M --budget | ||||
| Budget performance in 2000-01-01..2000-04-30: | ||||
| Budget performance in 2000Q1: | ||||
| 
 | ||||
|    ||              Jan               Feb               Mar            Apr  | ||||
| ===++===================================================================== | ||||
|  a || 1 A [50% of 2 A]  1 A [50% of 2 A]  1 A [50% of 2 A]  0 [0% of 2 A]  | ||||
| ---++--------------------------------------------------------------------- | ||||
|    || 1 A [50% of 2 A]  1 A [50% of 2 A]  1 A [50% of 2 A]  0 [0% of 2 A]  | ||||
|    ||              Jan               Feb               Mar  | ||||
| ===++====================================================== | ||||
|  a || 1 A [50% of 2 A]  1 A [50% of 2 A]  1 A [50% of 2 A]  | ||||
| ---++------------------------------------------------------ | ||||
|    || 1 A [50% of 2 A]  1 A [50% of 2 A]  1 A [50% of 2 A]  | ||||
| 
 | ||||
| # 47. budget report, valued at cost. | ||||
| $ hledger -f- bal -MTA --budget --value=c | ||||
| Budget performance in 2000-01-01..2000-04-30, converted to cost: | ||||
| Budget performance in 2000Q1, converted to cost: | ||||
| 
 | ||||
|    ||               Jan                Feb                Mar            Apr               Total            Average  | ||||
| ===++=============================================================================================================== | ||||
|  a || 6 B [300% of 2 B]  7 B [350% of 2 B]  8 B [400% of 2 B]  0 [0% of 2 B]  21 B [262% of 8 B]  5 B [262% of 2 B]  | ||||
| ---++--------------------------------------------------------------------------------------------------------------- | ||||
|    || 6 B [300% of 2 B]  7 B [350% of 2 B]  8 B [400% of 2 B]  0 [0% of 2 B]  21 B [262% of 8 B]  5 B [262% of 2 B]  | ||||
|    ||               Jan                Feb                Mar               Total            Average  | ||||
| ===++================================================================================================ | ||||
|  a || 6 B [300% of 2 B]  7 B [350% of 2 B]  8 B [400% of 2 B]  21 B [350% of 6 B]  7 B [350% of 2 B]  | ||||
| ---++------------------------------------------------------------------------------------------------ | ||||
|    || 6 B [300% of 2 B]  7 B [350% of 2 B]  8 B [400% of 2 B]  21 B [350% of 6 B]  7 B [350% of 2 B]  | ||||
| 
 | ||||
| # 48. budget report, showing changes in period-end values. | ||||
| $ hledger -f- bal -MTA --budget --value=e | ||||
| @ -561,13 +561,13 @@ Budget performance in 2000-01-01..2000-04-30, valued at period ends: | ||||
| 
 | ||||
| # 49. budget report, valued at other date. | ||||
| $ hledger -f- bal -MTA --budget --value=2000-01-15 | ||||
| Budget performance in 2000-01-01..2000-04-30, valued at 2000-01-15: | ||||
| Budget performance in 2000Q1, valued at 2000-01-15: | ||||
| 
 | ||||
|    ||               Jan                Feb                Mar             Apr               Total            Average  | ||||
| ===++================================================================================================================ | ||||
|  a || 5 B [50% of 10 B]  5 B [50% of 10 B]  5 B [50% of 10 B]  0 [0% of 10 B]  15 B [38% of 40 B]  4 B [38% of 10 B]  | ||||
| ---++---------------------------------------------------------------------------------------------------------------- | ||||
|    || 5 B [50% of 10 B]  5 B [50% of 10 B]  5 B [50% of 10 B]  0 [0% of 10 B]  15 B [38% of 40 B]  4 B [38% of 10 B]  | ||||
|    ||               Jan                Feb                Mar               Total            Average  | ||||
| ===++================================================================================================ | ||||
|  a || 5 B [50% of 10 B]  5 B [50% of 10 B]  5 B [50% of 10 B]  15 B [50% of 30 B]  5 B [50% of 10 B]  | ||||
| ---++------------------------------------------------------------------------------------------------ | ||||
|    || 5 B [50% of 10 B]  5 B [50% of 10 B]  5 B [50% of 10 B]  15 B [50% of 30 B]  5 B [50% of 10 B]  | ||||
| 
 | ||||
| # 50. --value=then with --historical. The starting total is valued individually for each posting at its posting time. | ||||
| < | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user