lib,cli,ui: Ensure ReportOpts always has today_ set.
This commit is contained in:
		
							parent
							
								
									fcbe511d42
								
							
						
					
					
						commit
						1171c23eee
					
				| @ -117,10 +117,9 @@ accountTransactionsReport ropts j reportq thisacctq = (label, items) | ||||
|       fromMaybe (error' "journalApplyValuation: expected a non-empty journal") $ -- XXX shouldn't happen | ||||
|       reportPeriodOrJournalLastDay ropts j | ||||
|     mreportlast = reportPeriodLastDay ropts | ||||
|     today = fromMaybe (error' "journalApplyValuation: could not pick a valuation date, ReportOpts today_ is unset") $ today_ ropts -- XXX shouldn't happen | ||||
|     multiperiod = interval_ ropts /= NoInterval | ||||
|     tval = case value_ ropts of | ||||
|              Just v  -> \t -> transactionApplyValuation prices styles periodlast mreportlast today multiperiod t v | ||||
|              Just v  -> \t -> transactionApplyValuation prices styles periodlast mreportlast (today_ ropts) multiperiod t v | ||||
|              Nothing -> id | ||||
|     ts4 = | ||||
|       ptraceAtWith 5 (("ts4:\n"++).pshowTransactions) $ | ||||
|  | ||||
| @ -41,12 +41,11 @@ entriesReport ropts@ReportOpts{..} j@Journal{..} = | ||||
|     tvalue t@Transaction{..} = t{tpostings=map pvalue tpostings} | ||||
|       where | ||||
|         pvalue p = maybe p | ||||
|           (postingApplyValuation (journalPriceOracle infer_value_ j) (journalCommodityStyles j) periodlast mreportlast today False p) | ||||
|           (postingApplyValuation (journalPriceOracle infer_value_ j) (journalCommodityStyles j) periodlast mreportlast today_ False p) | ||||
|           value_ | ||||
|           where | ||||
|             periodlast  = fromMaybe today $ reportPeriodOrJournalLastDay ropts j | ||||
|             periodlast  = fromMaybe today_ $ reportPeriodOrJournalLastDay ropts j | ||||
|             mreportlast = reportPeriodLastDay ropts | ||||
|             today       = fromMaybe (error' "erValue: could not pick a valuation date, ReportOpts today_ is unset") today_  -- PARTIAL: should not happen | ||||
| 
 | ||||
| tests_EntriesReport = tests "EntriesReport" [ | ||||
|   tests "entriesReport" [ | ||||
|  | ||||
| @ -244,12 +244,11 @@ makeReportQuery ropts reportspan | ||||
| makeValuation :: ReportOpts -> Journal -> PriceOracle -> Valuation | ||||
| makeValuation ropts j priceoracle day = case value_ ropts of | ||||
|     Nothing -> id | ||||
|     Just v  -> mixedAmountApplyValuation priceoracle styles day mreportlast today multiperiod v | ||||
|     Just v  -> mixedAmountApplyValuation priceoracle styles day mreportlast (today_ ropts) multiperiod v | ||||
|   where | ||||
|     -- Some things needed if doing valuation. | ||||
|     styles = journalCommodityStyles j | ||||
|     mreportlast = reportPeriodLastDay ropts | ||||
|     today = fromMaybe (error' "multiBalanceReport: could not pick a valuation date, ReportOpts today_ is unset") $ today_ ropts  -- XXX shouldn't happen | ||||
|     multiperiod = interval_ ropts /= NoInterval | ||||
| 
 | ||||
| -- | Group postings, grouped by their column | ||||
|  | ||||
| @ -75,7 +75,6 @@ postingsReport ropts@ReportOpts{..} j = | ||||
|       styles      = journalCommodityStyles j | ||||
|       priceoracle = journalPriceOracle infer_value_ j | ||||
|       multiperiod = interval_ /= NoInterval | ||||
|       today       = fromMaybe (error' "postingsReport: could not pick a valuation date, ReportOpts today_ is unset") today_  -- PARTIAL: | ||||
| 
 | ||||
|       -- postings to be included in the report, and similarly-matched postings before the report start date | ||||
|       (precedingps, reportps) = matchedPostingsBeforeAndDuring ropts j reportspan | ||||
| @ -90,7 +89,7 @@ postingsReport ropts@ReportOpts{..} j = | ||||
|         where | ||||
|           showempty = empty_ || average_ | ||||
|           -- We may be converting posting amounts to value, per hledger_options.m4.md "Effect of --value on reports". | ||||
|           pvalue p periodlast = maybe p (postingApplyValuation priceoracle styles periodlast mreportlast today multiperiod p) value_ | ||||
|           pvalue p periodlast = maybe p (postingApplyValuation priceoracle styles periodlast mreportlast today_ multiperiod p) value_ | ||||
|             where | ||||
|               mreportlast = reportPeriodLastDay ropts | ||||
|           reportorjournallast = | ||||
| @ -113,7 +112,7 @@ postingsReport ropts@ReportOpts{..} j = | ||||
|               precedingsum = sumPostings precedingps | ||||
|               precedingavg | null precedingps = 0 | ||||
|                            | otherwise        = divideMixedAmount (fromIntegral $ length precedingps) precedingsum | ||||
|               bvalue = maybe id (mixedAmountApplyValuation priceoracle styles daybeforereportstart Nothing today multiperiod) value_ | ||||
|               bvalue = maybe id (mixedAmountApplyValuation priceoracle styles daybeforereportstart Nothing today_ multiperiod) value_ | ||||
|                   -- XXX constrain valuation type to AtDate daybeforereportstart here ? | ||||
|                 where | ||||
|                   daybeforereportstart = | ||||
|  | ||||
| @ -80,10 +80,9 @@ instance Default AccountListMode where def = ALFlat | ||||
| -- commands, as noted below. | ||||
| data ReportOpts = ReportOpts { | ||||
|      -- for most reports: | ||||
|      today_          :: Maybe Day  -- ^ The current date. A late addition to ReportOpts. | ||||
|                                    -- Optional, but when set it may affect some reports: | ||||
|                                    -- Reports use it when picking a -V valuation date. | ||||
|                                    -- This is not great, adds indeterminacy. | ||||
|      today_          :: Day  -- ^ The current date. A late addition to ReportOpts. | ||||
|                              -- Reports use it when picking a -V valuation date. | ||||
|                              -- This is not great, adds indeterminacy. | ||||
|     ,period_         :: Period | ||||
|     ,interval_       :: Interval | ||||
|     ,statuses_       :: [Status]  -- ^ Zero, one, or two statuses to be matched | ||||
| @ -134,7 +133,7 @@ instance Default ReportOpts where def = defreportopts | ||||
| 
 | ||||
| defreportopts :: ReportOpts | ||||
| defreportopts = ReportOpts | ||||
|     def | ||||
|     nulldate | ||||
|     def | ||||
|     def | ||||
|     def | ||||
| @ -184,7 +183,7 @@ rawOptsToReportOpts rawopts = do | ||||
|     (argsquery, queryopts) <- either fail return $ parseQuery d querystring | ||||
| 
 | ||||
|     let reportopts = defreportopts | ||||
|           {today_       = Just d | ||||
|           {today_       = d | ||||
|           ,period_      = periodFromRawOpts d rawopts | ||||
|           ,interval_    = intervalFromRawOpts rawopts | ||||
|           ,statuses_    = statusesFromRawOpts rawopts | ||||
| @ -486,9 +485,6 @@ specifiedEndDate ropts = snd <$> specifiedStartEndDates ropts | ||||
| 
 | ||||
| -- Get the report's start date. | ||||
| -- If no report period is specified, will be Nothing. | ||||
| -- Will also be Nothing if ReportOpts does not have today_ set, | ||||
| -- since we need that to get the report period robustly | ||||
| -- (unlike reportStartDate, which looks up the date with IO.) | ||||
| reportPeriodStart :: ReportOpts -> Maybe Day | ||||
| reportPeriodStart = queryStartDate False . query_ | ||||
| 
 | ||||
| @ -503,9 +499,6 @@ reportPeriodOrJournalStart ropts j = | ||||
| -- This the inclusive end date (one day before the | ||||
| -- more commonly used, exclusive, report end date). | ||||
| -- If no report period is specified, will be Nothing. | ||||
| -- Will also be Nothing if ReportOpts does not have today_ set, | ||||
| -- since we need that to get the report period robustly | ||||
| -- (unlike reportEndDate, which looks up the date with IO.) | ||||
| reportPeriodLastDay :: ReportOpts -> Maybe Day | ||||
| reportPeriodLastDay = fmap (addDays (-1)) . queryEndDate False . query_ | ||||
| 
 | ||||
|  | ||||
| @ -79,13 +79,12 @@ tsDraw UIState{aopts=UIOpts{cliopts_=copts@CliOpts{reportopts_=ropts},querystrin | ||||
|           fromMaybe (error' "TransactionScreen: expected a non-empty journal") $  -- PARTIAL: shouldn't happen | ||||
|           reportPeriodOrJournalLastDay ropts j | ||||
|         mreportlast = reportPeriodLastDay ropts | ||||
|         today = fromMaybe (error' "TransactionScreen: could not pick a valuation date, ReportOpts today_ is unset") $ today_ ropts  -- PARTIAL: | ||||
|         multiperiod = interval_ ropts /= NoInterval | ||||
| 
 | ||||
|       render $ defaultLayout toplabel bottomlabel $ str $ | ||||
|         showTransactionOneLineAmounts $ | ||||
|         (if valuationTypeIsCost ropts then transactionToCost (journalCommodityStyles j) else id) $ | ||||
|         (if valuationTypeIsDefaultValue ropts then (\t -> transactionApplyValuation prices styles periodlast mreportlast today multiperiod t (AtDefault Nothing)) else id) $ | ||||
|         (if valuationTypeIsDefaultValue ropts then (\t -> transactionApplyValuation prices styles periodlast mreportlast (today_ ropts) multiperiod t (AtDefault Nothing)) else id) $ | ||||
|         -- (if real_ ropts then filterTransactionPostings (Real True) else id) -- filter postings by --real | ||||
|         t | ||||
|       where | ||||
|  | ||||
| @ -621,7 +621,7 @@ tests_Balance = tests "Balance" [ | ||||
|     test "unicode in balance layout" $ do | ||||
|       j <- readJournal' "2009/01/01 * медвежья шкура\n  расходы:покупки  100\n  актив:наличные\n" | ||||
|       let opts = defreportopts | ||||
|       balanceReportAsText opts (balanceReport opts{today_=Just $ fromGregorian 2008 11 26} j) | ||||
|       balanceReportAsText opts (balanceReport opts{today_=fromGregorian 2008 11 26} j) | ||||
|         @?= | ||||
|         unlines | ||||
|         ["                -100  актив:наличные" | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user