lib, cli: Move CompoundBalanceReport into ReportTypes, compoundReportWith into MultiBalanceReport, share postings amongst subreports.
This commit is contained in:
		
							parent
							
								
									d09a90b38b
								
							
						
					
					
						commit
						604868cea5
					
				| @ -16,6 +16,10 @@ module Hledger.Reports.MultiBalanceReport ( | |||||||
|   multiBalanceReport, |   multiBalanceReport, | ||||||
|   multiBalanceReportWith, |   multiBalanceReportWith, | ||||||
|   balanceReportFromMultiBalanceReport, |   balanceReportFromMultiBalanceReport, | ||||||
|  | 
 | ||||||
|  |   CompoundBalanceReport, | ||||||
|  |   compoundBalanceReportWith, | ||||||
|  | 
 | ||||||
|   tableAsText, |   tableAsText, | ||||||
| 
 | 
 | ||||||
|   sortAccountItemsLike, |   sortAccountItemsLike, | ||||||
| @ -28,6 +32,7 @@ where | |||||||
| import Control.Monad (guard) | import Control.Monad (guard) | ||||||
| import Data.Foldable (toList) | import Data.Foldable (toList) | ||||||
| import Data.List (sortBy, transpose) | import Data.List (sortBy, transpose) | ||||||
|  | import Data.List.NonEmpty (NonEmpty(..)) | ||||||
| import Data.HashMap.Strict (HashMap) | import Data.HashMap.Strict (HashMap) | ||||||
| import qualified Data.HashMap.Strict as HM | import qualified Data.HashMap.Strict as HM | ||||||
| import Data.Map (Map) | import Data.Map (Map) | ||||||
| @ -37,6 +42,7 @@ import Data.Ord (comparing) | |||||||
| #if !(MIN_VERSION_base(4,11,0)) | #if !(MIN_VERSION_base(4,11,0)) | ||||||
| import Data.Semigroup ((<>)) | import Data.Semigroup ((<>)) | ||||||
| #endif | #endif | ||||||
|  | import Data.Semigroup (sconcat) | ||||||
| import Data.Time.Calendar (Day, addDays, fromGregorian) | import Data.Time.Calendar (Day, addDays, fromGregorian) | ||||||
| import Safe (headDef, headMay, lastMay) | import Safe (headDef, headMay, lastMay) | ||||||
| import Text.Tabular as T | import Text.Tabular as T | ||||||
| @ -70,10 +76,13 @@ import Hledger.Reports.ReportTypes | |||||||
| 
 | 
 | ||||||
| type MultiBalanceReport    = PeriodicReport    DisplayName MixedAmount | type MultiBalanceReport    = PeriodicReport    DisplayName MixedAmount | ||||||
| type MultiBalanceReportRow = PeriodicReportRow DisplayName MixedAmount | type MultiBalanceReportRow = PeriodicReportRow DisplayName MixedAmount | ||||||
|  | type CompoundBalanceReport = CompoundPeriodicReport DisplayName MixedAmount | ||||||
| 
 | 
 | ||||||
| -- type alias just to remind us which AccountNames might be depth-clipped, below. | -- type alias just to remind us which AccountNames might be depth-clipped, below. | ||||||
| type ClippedAccountName = AccountName | type ClippedAccountName = AccountName | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| -- | Generate a multicolumn balance report for the matched accounts, | -- | Generate a multicolumn balance report for the matched accounts, | ||||||
| -- showing the change of balance, accumulated balance, or historical balance | -- showing the change of balance, accumulated balance, or historical balance | ||||||
| -- in each of the specified periods. Does not support tree-mode boring parent eliding. | -- in each of the specified periods. Does not support tree-mode boring parent eliding. | ||||||
| @ -109,6 +118,49 @@ multiBalanceReportWith ropts q j priceoracle = report | |||||||
|     -- Postprocess the report, negating balances and taking percentages if needed |     -- Postprocess the report, negating balances and taking percentages if needed | ||||||
|     report = dbg' "report" $ generateMultiBalanceReport ropts' reportq j priceoracle reportspan colspans colps |     report = dbg' "report" $ generateMultiBalanceReport ropts' reportq j priceoracle reportspan colspans colps | ||||||
| 
 | 
 | ||||||
|  | compoundBalanceReportWith :: ReportOpts -> Query -> Journal -> PriceOracle | ||||||
|  |                           -> [CBCSubreportSpec] | ||||||
|  |                           -> CompoundBalanceReport | ||||||
|  | compoundBalanceReportWith ropts q j priceoracle subreportspecs = cbr | ||||||
|  |   where | ||||||
|  |     -- Queries, report/column dates. | ||||||
|  |     ropts'     = dbg "ropts'"     $ setDefaultAccountListMode ALFlat ropts | ||||||
|  |     reportspan = dbg "reportspan" $ calculateReportSpan ropts' q j | ||||||
|  |     reportq    = dbg "reportq"    $ makeReportQuery ropts' reportspan q | ||||||
|  | 
 | ||||||
|  |     -- Group postings into their columns. | ||||||
|  |     colps    = dbg'' "colps"  $ getPostingsByColumn ropts'{empty_=True} reportq j reportspan | ||||||
|  |     colspans = dbg "colspans" $ M.keys colps | ||||||
|  | 
 | ||||||
|  |     -- Filter the column postings according to each subreport | ||||||
|  |     subreportcolps = map filterSubreport subreportspecs | ||||||
|  |       where filterSubreport sr = filter (matchesPosting $ cbcsubreportquery sr j) <$> colps | ||||||
|  | 
 | ||||||
|  |     subreports = zipWith generateSubreport subreportspecs subreportcolps | ||||||
|  |       where | ||||||
|  |         generateSubreport CBCSubreportSpec{..} colps' = | ||||||
|  |             ( cbcsubreporttitle | ||||||
|  |             -- Postprocess the report, negating balances and taking percentages if needed | ||||||
|  |             , prNormaliseSign cbcsubreportnormalsign $ | ||||||
|  |                 generateMultiBalanceReport ropts'' reportq j priceoracle reportspan colspans colps' | ||||||
|  |             , cbcsubreportincreasestotal | ||||||
|  |             ) | ||||||
|  |           where | ||||||
|  |             ropts'' = ropts'{normalbalance_=Just cbcsubreportnormalsign} | ||||||
|  | 
 | ||||||
|  |     -- Sum the subreport totals by column. Handle these cases: | ||||||
|  |     -- - no subreports | ||||||
|  |     -- - empty subreports, having no subtotals (#588) | ||||||
|  |     -- - subreports with a shorter subtotals row than the others | ||||||
|  |     overalltotals = case subreports of | ||||||
|  |         []     -> PeriodicReportRow () [] nullmixedamt nullmixedamt | ||||||
|  |         (r:rs) -> sconcat $ fmap subreportTotal (r:|rs) | ||||||
|  |       where | ||||||
|  |         subreportTotal (_, sr, increasestotal) = | ||||||
|  |             (if increasestotal then id else prrNegate) $ prTotals sr | ||||||
|  | 
 | ||||||
|  |     cbr = CompoundPeriodicReport "" colspans subreports overalltotals | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| -- | Calculate the span of the report to be generated. | -- | Calculate the span of the report to be generated. | ||||||
| setDefaultAccountListMode :: AccountListMode -> ReportOpts -> ReportOpts | setDefaultAccountListMode :: AccountListMode -> ReportOpts -> ReportOpts | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| {- | | {- | | ||||||
| New common report types, used by the BudgetReport for now, perhaps all reports later. | New common report types, used by the BudgetReport for now, perhaps all reports later. | ||||||
| -} | -} | ||||||
|  | {-# LANGUAGE CPP            #-} | ||||||
| {-# LANGUAGE DeriveAnyClass #-} | {-# LANGUAGE DeriveAnyClass #-} | ||||||
| {-# LANGUAGE DeriveGeneric  #-} | {-# LANGUAGE DeriveGeneric  #-} | ||||||
| 
 | 
 | ||||||
| @ -17,10 +18,14 @@ module Hledger.Reports.ReportTypes | |||||||
| , periodicReportSpan | , periodicReportSpan | ||||||
| , prNegate | , prNegate | ||||||
| , prNormaliseSign | , prNormaliseSign | ||||||
| 
 |  | ||||||
| , prMapName | , prMapName | ||||||
| , prMapMaybeName | , prMapMaybeName | ||||||
| 
 | 
 | ||||||
|  | , prrNegate | ||||||
|  | 
 | ||||||
|  | , CompoundPeriodicReport(..) | ||||||
|  | , CBCSubreportSpec(..) | ||||||
|  | 
 | ||||||
| , DisplayName(..) | , DisplayName(..) | ||||||
| , flatDisplayName | , flatDisplayName | ||||||
| , treeDisplayName | , treeDisplayName | ||||||
| @ -33,8 +38,12 @@ module Hledger.Reports.ReportTypes | |||||||
| import Data.Aeson | import Data.Aeson | ||||||
| import Data.Decimal | import Data.Decimal | ||||||
| import Data.Maybe (mapMaybe) | import Data.Maybe (mapMaybe) | ||||||
|  | #if !(MIN_VERSION_base(4,11,0)) | ||||||
|  | import Data.Semigroup (Semigroup(..)) | ||||||
|  | #endif | ||||||
| import GHC.Generics (Generic) | import GHC.Generics (Generic) | ||||||
| import Hledger.Data | import Hledger.Data | ||||||
|  | import Hledger.Query (Query) | ||||||
| 
 | 
 | ||||||
| type Percentage = Decimal | type Percentage = Decimal | ||||||
| 
 | 
 | ||||||
| @ -89,6 +98,14 @@ data PeriodicReportRow a b = | |||||||
|   , prrAverage :: b    -- The average of this row's values. |   , prrAverage :: b    -- The average of this row's values. | ||||||
|   } deriving (Show, Generic, ToJSON) |   } deriving (Show, Generic, ToJSON) | ||||||
| 
 | 
 | ||||||
|  | instance Num b => Semigroup (PeriodicReportRow a b) where | ||||||
|  |   (PeriodicReportRow _ amts1 t1 a1) <> (PeriodicReportRow n2 amts2 t2 a2) = | ||||||
|  |       PeriodicReportRow n2 (sumPadded amts1 amts2) (t1 + t2) (a1 + a2) | ||||||
|  |     where | ||||||
|  |       sumPadded (a:as) (b:bs) = (a + b) : sumPadded as bs | ||||||
|  |       sumPadded as     []     = as | ||||||
|  |       sumPadded []     bs     = bs | ||||||
|  | 
 | ||||||
| -- | Figure out the overall date span of a PeridicReport | -- | Figure out the overall date span of a PeridicReport | ||||||
| periodicReportSpan :: PeriodicReport a b -> DateSpan | periodicReportSpan :: PeriodicReport a b -> DateSpan | ||||||
| periodicReportSpan (PeriodicReport [] _ _)       = DateSpan Nothing Nothing | periodicReportSpan (PeriodicReport [] _ _)       = DateSpan Nothing Nothing | ||||||
| @ -103,9 +120,11 @@ prNormaliseSign _ = id | |||||||
| -- | Flip the sign of all amounts in a PeriodicReport. | -- | Flip the sign of all amounts in a PeriodicReport. | ||||||
| prNegate :: Num b => PeriodicReport a b -> PeriodicReport a b | prNegate :: Num b => PeriodicReport a b -> PeriodicReport a b | ||||||
| prNegate (PeriodicReport colspans rows totalsrow) = | prNegate (PeriodicReport colspans rows totalsrow) = | ||||||
|     PeriodicReport colspans (map rowNegate rows) (rowNegate totalsrow) |     PeriodicReport colspans (map prrNegate rows) (prrNegate totalsrow) | ||||||
|   where | 
 | ||||||
|     rowNegate (PeriodicReportRow name amts tot avg) = | -- | Flip the sign of all amounts in a PeriodicReportRow. | ||||||
|  | prrNegate :: Num b => PeriodicReportRow a b -> PeriodicReportRow a b | ||||||
|  | prrNegate (PeriodicReportRow name amts tot avg) = | ||||||
|     PeriodicReportRow name (map negate amts) (-tot) (-avg) |     PeriodicReportRow name (map negate amts) (-tot) (-avg) | ||||||
| 
 | 
 | ||||||
| -- | Map a function over the row names. | -- | Map a function over the row names. | ||||||
| @ -127,6 +146,36 @@ prrMapMaybeName f row = case f $ prrName row of | |||||||
|     Just a  -> Just row{prrName = a} |     Just a  -> Just row{prrName = a} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | -- | A compound balance report has: | ||||||
|  | -- | ||||||
|  | -- * an overall title | ||||||
|  | -- | ||||||
|  | -- * the period (date span) of each column | ||||||
|  | -- | ||||||
|  | -- * one or more named, normal-positive multi balance reports, | ||||||
|  | --   with columns corresponding to the above, and a flag indicating | ||||||
|  | --   whether they increased or decreased the overall totals | ||||||
|  | -- | ||||||
|  | -- * a list of overall totals for each column, and their grand total and average | ||||||
|  | -- | ||||||
|  | -- It is used in compound balance report commands like balancesheet, | ||||||
|  | -- cashflow and incomestatement. | ||||||
|  | data CompoundPeriodicReport a b = CompoundPeriodicReport | ||||||
|  |   { cbrTitle      :: String | ||||||
|  |   , cbrDates      :: [DateSpan] | ||||||
|  |   , cbrSubreports :: [(String, PeriodicReport a b, Bool)] | ||||||
|  |   , cbrTotals     :: PeriodicReportRow () b | ||||||
|  |   } deriving (Show, Generic, ToJSON) | ||||||
|  | 
 | ||||||
|  | -- | Description of one subreport within a compound balance report. | ||||||
|  | data CBCSubreportSpec = CBCSubreportSpec | ||||||
|  |   { cbcsubreporttitle          :: String | ||||||
|  |   , cbcsubreportquery          :: Journal -> Query | ||||||
|  |   , cbcsubreportnormalsign     :: NormalSign | ||||||
|  |   , cbcsubreportincreasestotal :: Bool | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| -- | A full name, display name, and depth for an account. | -- | A full name, display name, and depth for an account. | ||||||
| data DisplayName = DisplayName | data DisplayName = DisplayName | ||||||
|     { displayFull :: AccountName |     { displayFull :: AccountName | ||||||
|  | |||||||
| @ -8,7 +8,6 @@ like balancesheet, cashflow, and incomestatement. | |||||||
| 
 | 
 | ||||||
| module Hledger.Cli.CompoundBalanceCommand ( | module Hledger.Cli.CompoundBalanceCommand ( | ||||||
|   CompoundBalanceCommandSpec(..) |   CompoundBalanceCommandSpec(..) | ||||||
|  ,CBCSubreportSpec(..) |  | ||||||
|  ,compoundBalanceCommandMode |  ,compoundBalanceCommandMode | ||||||
|  ,compoundBalanceCommand |  ,compoundBalanceCommand | ||||||
| ) where | ) where | ||||||
| @ -49,36 +48,6 @@ data CompoundBalanceCommandSpec = CompoundBalanceCommandSpec { | |||||||
|                                       --   this report shows (overrides command line flags) |                                       --   this report shows (overrides command line flags) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| -- | Description of one subreport within a compound balance report. |  | ||||||
| data CBCSubreportSpec = CBCSubreportSpec { |  | ||||||
|    cbcsubreporttitle :: String |  | ||||||
|   ,cbcsubreportquery :: Journal -> Query |  | ||||||
|   ,cbcsubreportnormalsign :: NormalSign |  | ||||||
|   ,cbcsubreportincreasestotal :: Bool |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| -- | A compound balance report has: |  | ||||||
| -- |  | ||||||
| -- * an overall title |  | ||||||
| -- |  | ||||||
| -- * the period (date span) of each column |  | ||||||
| -- |  | ||||||
| -- * one or more named, normal-positive multi balance reports, |  | ||||||
| --   with columns corresponding to the above, and a flag indicating |  | ||||||
| --   whether they increased or decreased the overall totals |  | ||||||
| -- |  | ||||||
| -- * a list of overall totals for each column, and their grand total and average |  | ||||||
| -- |  | ||||||
| -- It is used in compound balance report commands like balancesheet, |  | ||||||
| -- cashflow and incomestatement. |  | ||||||
| type CompoundBalanceReport = |  | ||||||
|   ( String |  | ||||||
|   , [DateSpan] |  | ||||||
|   , [(String, MultiBalanceReport, Bool)] |  | ||||||
|   , ([MixedAmount], MixedAmount, MixedAmount) |  | ||||||
|   ) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| -- | Generate a cmdargs option-parsing mode from a compound balance command | -- | Generate a cmdargs option-parsing mode from a compound balance command | ||||||
| -- specification. | -- specification. | ||||||
| compoundBalanceCommandMode :: CompoundBalanceCommandSpec -> Mode RawOpts | compoundBalanceCommandMode :: CompoundBalanceCommandSpec -> Mode RawOpts | ||||||
| @ -147,46 +116,6 @@ compoundBalanceCommand CompoundBalanceCommandSpec{..} opts@CliOpts{reportopts_=r | |||||||
|       -- make a CompoundBalanceReport. |       -- make a CompoundBalanceReport. | ||||||
|       -- For efficiency, generate a price oracle here and reuse it with each subreport. |       -- For efficiency, generate a price oracle here and reuse it with each subreport. | ||||||
|       priceoracle = journalPriceOracle infer_value_ j |       priceoracle = journalPriceOracle infer_value_ j | ||||||
|       subreports = |  | ||||||
|         map (\CBCSubreportSpec{..} -> |  | ||||||
|                 (cbcsubreporttitle |  | ||||||
|                 ,prNormaliseSign cbcsubreportnormalsign $ -- <- convert normal-negative to normal-positive |  | ||||||
|                   compoundBalanceSubreport ropts' userq j priceoracle cbcsubreportquery cbcsubreportnormalsign |  | ||||||
|                 ,cbcsubreportincreasestotal |  | ||||||
|                 )) |  | ||||||
|             cbcqueries |  | ||||||
| 
 |  | ||||||
|       subtotalrows = |  | ||||||
|         [(prrAmounts $ prTotals report, increasesoveralltotal) |  | ||||||
|         | (_, report, increasesoveralltotal) <- subreports |  | ||||||
|         ] |  | ||||||
| 
 |  | ||||||
|       -- Sum the subreport totals by column. Handle these cases: |  | ||||||
|       -- - no subreports |  | ||||||
|       -- - empty subreports, having no subtotals (#588) |  | ||||||
|       -- - subreports with a shorter subtotals row than the others |  | ||||||
|       overalltotals = case subtotalrows of |  | ||||||
|         [] -> ([], nullmixedamt, nullmixedamt) |  | ||||||
|         rs -> |  | ||||||
|           let |  | ||||||
|             numcols = maximum $ map (length.fst) rs  -- partial maximum is ok, rs is non-null |  | ||||||
|             paddedsignedsubtotalrows = |  | ||||||
|               [map (if increasesoveralltotal then id else negate) $  -- maybe flip the signs |  | ||||||
|                take numcols $ as ++ repeat nullmixedamt              -- pad short rows with zeros |  | ||||||
|               | (as,increasesoveralltotal) <- rs |  | ||||||
|               ] |  | ||||||
|             coltotals = foldl' (zipWith (+)) zeros paddedsignedsubtotalrows  -- sum the columns |  | ||||||
|               where zeros = replicate numcols nullmixedamt |  | ||||||
|             grandtotal = sum coltotals |  | ||||||
|             grandavg | null coltotals = nullmixedamt |  | ||||||
|                      | otherwise      = fromIntegral (length coltotals) `divideMixedAmount` grandtotal |  | ||||||
|           in |  | ||||||
|             (coltotals, grandtotal, grandavg) |  | ||||||
| 
 |  | ||||||
|       colspans = |  | ||||||
|         case subreports of |  | ||||||
|           (_, PeriodicReport ds _ _, _):_ -> ds |  | ||||||
|           [] -> [] |  | ||||||
| 
 | 
 | ||||||
|       title = |       title = | ||||||
|         cbctitle |         cbctitle | ||||||
| @ -201,11 +130,11 @@ compoundBalanceCommand CompoundBalanceCommandSpec{..} opts@CliOpts{reportopts_=r | |||||||
|           -- column heading(s) (not the date span of the transactions). |           -- column heading(s) (not the date span of the transactions). | ||||||
|           -- Also the dates should not be simplified (it should show |           -- Also the dates should not be simplified (it should show | ||||||
|           -- "2008/01/01-2008/12/31", not "2008"). |           -- "2008/01/01-2008/12/31", not "2008"). | ||||||
|           titledatestr |           titledatestr = case balancetype of | ||||||
|             | balancetype == HistoricalBalance = showEndDates enddates |               HistoricalBalance -> showEndDates enddates | ||||||
|             | otherwise                        = showDateSpan requestedspan |               _                 -> showDateSpan requestedspan | ||||||
|             where |             where | ||||||
|               enddates = map (addDays (-1)) $ catMaybes $ map spanEnd colspans  -- these spans will always have a definite end date |               enddates = map (addDays (-1)) . mapMaybe spanEnd $ cbrDates cbr  -- these spans will always have a definite end date | ||||||
|               requestedspan = queryDateSpan date2_ userq `spanDefaultsFrom` journalDateSpan date2_ j |               requestedspan = queryDateSpan date2_ userq `spanDefaultsFrom` journalDateSpan date2_ j | ||||||
| 
 | 
 | ||||||
|           -- when user overrides, add an indication to the report title |           -- when user overrides, add an indication to the report title | ||||||
| @ -226,12 +155,9 @@ compoundBalanceCommand CompoundBalanceCommandSpec{..} opts@CliOpts{reportopts_=r | |||||||
|             Nothing             -> "" |             Nothing             -> "" | ||||||
|             where |             where | ||||||
|               multiperiod = interval_ /= NoInterval |               multiperiod = interval_ /= NoInterval | ||||||
|       cbr = | 
 | ||||||
|         (title |       cbr' = compoundBalanceReportWith ropts' userq j priceoracle cbcqueries | ||||||
|         ,colspans |       cbr  = cbr'{cbrTitle=title} | ||||||
|         ,subreports |  | ||||||
|         ,overalltotals |  | ||||||
|         ) |  | ||||||
| 
 | 
 | ||||||
|     -- render appropriately |     -- render appropriately | ||||||
|     writeOutput opts $ |     writeOutput opts $ | ||||||
| @ -254,30 +180,6 @@ showEndDates es = case es of | |||||||
|   where |   where | ||||||
|     showdate = show |     showdate = show | ||||||
| 
 | 
 | ||||||
| -- | Run one subreport for a compound balance command in multi-column mode. |  | ||||||
| -- This returns a MultiBalanceReport. |  | ||||||
| compoundBalanceSubreport :: ReportOpts -> Query -> Journal -> PriceOracle -> (Journal -> Query) -> NormalSign -> MultiBalanceReport |  | ||||||
| compoundBalanceSubreport ropts@ReportOpts{..} userq j priceoracle subreportqfn subreportnormalsign = r' |  | ||||||
|   where |  | ||||||
|     -- force --empty to ensure same columns in all sections |  | ||||||
|     ropts' = ropts { empty_=True, normalbalance_=Just subreportnormalsign } |  | ||||||
|     -- run the report |  | ||||||
|     q = And [subreportqfn j, userq] |  | ||||||
|     r@(PeriodicReport dates rows totals) = multiBalanceReportWith ropts' q j priceoracle |  | ||||||
|     -- if user didn't specify --empty, now remove the all-zero rows, unless they have non-zero subaccounts |  | ||||||
|     -- in this report |  | ||||||
|     r' | empty_    = r |  | ||||||
|        | otherwise = PeriodicReport dates rows' totals |  | ||||||
|           where |  | ||||||
|             nonzeroaccounts = |  | ||||||
|               dbg5 "nonzeroaccounts" $ |  | ||||||
|               mapMaybe (\(PeriodicReportRow act amts _ _) -> |  | ||||||
|                             if not (all mixedAmountLooksZero amts) then Just (displayFull act) else Nothing) rows |  | ||||||
|             rows' = filter (not . emptyRow) rows |  | ||||||
|               where |  | ||||||
|                 emptyRow (PeriodicReportRow act amts _ _) = |  | ||||||
|                   all mixedAmountLooksZero amts && not (any (displayFull act `isAccountNamePrefixOf`) nonzeroaccounts) |  | ||||||
| 
 |  | ||||||
| -- | Render a compound balance report as plain text suitable for console output. | -- | Render a compound balance report as plain text suitable for console output. | ||||||
| {- Eg: | {- Eg: | ||||||
| Balance Sheet | Balance Sheet | ||||||
| @ -299,7 +201,8 @@ Balance Sheet | |||||||
| 
 | 
 | ||||||
| -} | -} | ||||||
| compoundBalanceReportAsText :: ReportOpts -> CompoundBalanceReport -> String | compoundBalanceReportAsText :: ReportOpts -> CompoundBalanceReport -> String | ||||||
| compoundBalanceReportAsText ropts (title, _colspans, subreports, (coltotals, grandtotal, grandavg)) = | compoundBalanceReportAsText ropts | ||||||
|  |   (CompoundPeriodicReport title _colspans subreports (PeriodicReportRow _ coltotals grandtotal grandavg)) = | ||||||
|     title ++ "\n\n" ++ |     title ++ "\n\n" ++ | ||||||
|     balanceReportTableAsText ropts bigtable' |     balanceReportTableAsText ropts bigtable' | ||||||
|   where |   where | ||||||
| @ -337,7 +240,7 @@ concatTables (Table hLeft hTop dat) (Table hLeft' _ dat') = | |||||||
| -- subreport title row, and an overall title row, one headings row, and an | -- subreport title row, and an overall title row, one headings row, and an | ||||||
| -- optional overall totals row is added. | -- optional overall totals row is added. | ||||||
| compoundBalanceReportAsCsv :: ReportOpts -> CompoundBalanceReport -> CSV | compoundBalanceReportAsCsv :: ReportOpts -> CompoundBalanceReport -> CSV | ||||||
| compoundBalanceReportAsCsv ropts (title, colspans, subreports, (coltotals, grandtotal, grandavg)) = | compoundBalanceReportAsCsv ropts (CompoundPeriodicReport title colspans subreports (PeriodicReportRow _ coltotals grandtotal grandavg)) = | ||||||
|   addtotals $ |   addtotals $ | ||||||
|   padRow title : |   padRow title : | ||||||
|   ("Account" : |   ("Account" : | ||||||
| @ -376,7 +279,7 @@ compoundBalanceReportAsCsv ropts (title, colspans, subreports, (coltotals, grand | |||||||
| compoundBalanceReportAsHtml :: ReportOpts -> CompoundBalanceReport -> Html () | compoundBalanceReportAsHtml :: ReportOpts -> CompoundBalanceReport -> Html () | ||||||
| compoundBalanceReportAsHtml ropts cbr = | compoundBalanceReportAsHtml ropts cbr = | ||||||
|   let |   let | ||||||
|     (title, colspans, subreports, (coltotals, grandtotal, grandavg)) = cbr |     CompoundPeriodicReport title colspans subreports (PeriodicReportRow _ coltotals grandtotal grandavg) = cbr | ||||||
|     colspanattr = colspan_ $ TS.pack $ show $ |     colspanattr = colspan_ $ TS.pack $ show $ | ||||||
|       1 + length colspans + (if row_total_ ropts then 1 else 0) + (if average_ ropts then 1 else 0) |       1 + length colspans + (if row_total_ ropts then 1 else 0) + (if average_ ropts then 1 else 0) | ||||||
|     leftattr = style_ "text-align:left" |     leftattr = style_ "text-align:left" | ||||||
|  | |||||||
| @ -97,24 +97,23 @@ hledger -f sample.journal balancesheet -p 'monthly in 2008' --tree | |||||||
| Balance Sheet 2008-01-31..2008-12-31 | Balance Sheet 2008-01-31..2008-12-31 | ||||||
| 
 | 
 | ||||||
|                    || 2008-01-31  2008-02-29  2008-03-31  2008-04-30  2008-05-31  2008-06-30  2008-07-31  2008-08-31  2008-09-30  2008-10-31  2008-11-30  2008-12-31  |                    || 2008-01-31  2008-02-29  2008-03-31  2008-04-30  2008-05-31  2008-06-30  2008-07-31  2008-08-31  2008-09-30  2008-10-31  2008-11-30  2008-12-31  | ||||||
| ==============++================================================================================================================================================ | ===================++================================================================================================================================================ | ||||||
|  Assets            ||                                                                                                                                                 |  Assets            ||                                                                                                                                                 | ||||||
| --------------++------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------++------------------------------------------------------------------------------------------------------------------------------------------------ | ||||||
|  assets            ||         $1          $1          $1          $1          $1           0           0           0           0           0           0         $-1  |  assets            ||         $1          $1          $1          $1          $1           0           0           0           0           0           0         $-1  | ||||||
|    bank            ||         $1          $1          $1          $1          $1          $2          $2          $2          $2          $2          $2          $1  |    bank            ||         $1          $1          $1          $1          $1          $2          $2          $2          $2          $2          $2          $1  | ||||||
|      checking      ||         $1          $1          $1          $1          $1          $1          $1          $1          $1          $1          $1           0  |      checking      ||         $1          $1          $1          $1          $1          $1          $1          $1          $1          $1          $1           0  | ||||||
|      saving        ||          0           0           0           0           0          $1          $1          $1          $1          $1          $1          $1  |      saving        ||          0           0           0           0           0          $1          $1          $1          $1          $1          $1          $1  | ||||||
|    cash            ||          0           0           0           0           0         $-2         $-2         $-2         $-2         $-2         $-2         $-2  |    cash            ||          0           0           0           0           0         $-2         $-2         $-2         $-2         $-2         $-2         $-2  | ||||||
| --------------++------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------++------------------------------------------------------------------------------------------------------------------------------------------------ | ||||||
|                    ||         $1          $1          $1          $1          $1           0           0           0           0           0           0         $-1  |                    ||         $1          $1          $1          $1          $1           0           0           0           0           0           0         $-1  | ||||||
| ==============++================================================================================================================================================ | ===================++================================================================================================================================================ | ||||||
|  Liabilities       ||                                                                                                                                                 |  Liabilities       ||                                                                                                                                                 | ||||||
| --------------++------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------++------------------------------------------------------------------------------------------------------------------------------------------------ | ||||||
|  liabilities  ||          0           0           0           0           0           0           0           0           0           0           0         $-1  |  liabilities:debts ||          0           0           0           0           0           0           0           0           0           0           0         $-1  | ||||||
|    debts      ||          0           0           0           0           0           0           0           0           0           0           0         $-1  | -------------------++------------------------------------------------------------------------------------------------------------------------------------------------ | ||||||
| --------------++------------------------------------------------------------------------------------------------------------------------------------------------ |  | ||||||
|                    ||          0           0           0           0           0           0           0           0           0           0           0         $-1  |                    ||          0           0           0           0           0           0           0           0           0           0           0         $-1  | ||||||
| ==============++================================================================================================================================================ | ===================++================================================================================================================================================ | ||||||
|  Net:              ||         $1          $1          $1          $1          $1           0           0           0           0           0           0           0  |  Net:              ||         $1          $1          $1          $1          $1           0           0           0           0           0           0           0  | ||||||
| >>>= 0 | >>>= 0 | ||||||
| 
 | 
 | ||||||
| @ -150,8 +149,7 @@ Balance Sheet 2017-01-01 | |||||||
| =============++============ | =============++============ | ||||||
|  Assets      ||             |  Assets      ||             | ||||||
| -------------++------------ | -------------++------------ | ||||||
|  assets      ||          1  |  assets:b    ||          1  | ||||||
|    b         ||          1  |  | ||||||
| -------------++------------ | -------------++------------ | ||||||
|              ||          1  |              ||          1  | ||||||
| =============++============ | =============++============ | ||||||
|  | |||||||
| @ -48,13 +48,11 @@ Balance Sheet 2018-01-01 | |||||||
| =============++============ | =============++============ | ||||||
|  Assets      ||             |  Assets      ||             | ||||||
| -------------++------------ | -------------++------------ | ||||||
|  b           ||          3  |  b:bb        ||          3  | ||||||
|    bb        ||          3  |  | ||||||
| =============++============ | =============++============ | ||||||
|  Liabilities ||             |  Liabilities ||             | ||||||
| -------------++------------ | -------------++------------ | ||||||
|  asset       ||         -1  |  asset:a     ||         -1  | ||||||
|    a         ||         -1  |  | ||||||
|  b           ||         -2  |  b           ||         -2  | ||||||
| 
 | 
 | ||||||
| # TODO | # TODO | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user