bs/bse/cf/is: show all balances as normally-positive (experimental)

Income, liability and equity balances, which until now we have
always displayed as negative numbers, are now shown as normally positive
by these reports.
Negative numbers now indicate a contra-balance (eg an overdrawn
checking account), a net loss, a negative net worth, etc.
This makes these reports more like conventional financial statements,
and easier to read and share with normal people.
This commit is contained in:
Simon Michael 2018-01-15 17:58:14 -08:00
parent 3b2a9eaba4
commit 6b349e3123
9 changed files with 291 additions and 124 deletions

View File

@ -10,6 +10,8 @@ module Hledger.Reports.MultiBalanceReports (
MultiBalanceReportRow, MultiBalanceReportRow,
multiBalanceReport, multiBalanceReport,
singleBalanceReport, singleBalanceReport,
-- mbrNegate,
-- mbrNormaliseSign,
-- -- * Tests -- -- * Tests
tests_Hledger_Reports_MultiBalanceReport tests_Hledger_Reports_MultiBalanceReport

View File

@ -105,8 +105,11 @@ data ReportOpts = ReportOpts {
,normalbalance_ :: Maybe NormalSign ,normalbalance_ :: Maybe NormalSign
-- ^ This can be set when running balance reports on a set of accounts -- ^ This can be set when running balance reports on a set of accounts
-- with the same normal balance type (eg all assets, or all incomes). -- with the same normal balance type (eg all assets, or all incomes).
-- It helps --sort-amount know how to sort negative numbers -- - It helps --sort-amount know how to sort negative numbers
-- (eg in the income section of an income statement) -- (eg in the income section of an income statement)
-- - It helps compound balance report commands (is, bs etc.) do
-- sign normalisation, converting normally negative subreports to
-- normally positive for a more conventional display.
,color_ :: Bool ,color_ :: Bool
,forecast_ :: Bool ,forecast_ :: Bool
,auto_ :: Bool ,auto_ :: Bool

View File

@ -27,11 +27,26 @@ This command displays a simple balance sheet, showing historical ending
balances of asset and liability accounts (ignoring any report begin date). balances of asset and liability accounts (ignoring any report begin date).
It assumes that these accounts are under a top-level `asset` or `liability` It assumes that these accounts are under a top-level `asset` or `liability`
account (case insensitive, plural forms also allowed). account (case insensitive, plural forms also allowed).
Note this report shows all account balances with normal positive sign
(like conventional financial statements, unlike balance/print/register)
(experimental).
|], |],
cbctitle = "Balance Sheet", cbctitle = "Balance Sheet",
cbcqueries = [ ("Assets" , journalAssetAccountQuery, Just NormallyPositive), cbcqueries = [
("Liabilities", journalLiabilityAccountQuery, Just NormallyNegative) CBCSubreportSpec{
], cbcsubreporttitle="Assets"
,cbcsubreportquery=journalAssetAccountQuery
,cbcsubreportnormalsign=NormallyPositive
,cbcsubreportincreasestotal=True
}
,CBCSubreportSpec{
cbcsubreporttitle="Liabilities"
,cbcsubreportquery=journalLiabilityAccountQuery
,cbcsubreportnormalsign=NormallyNegative
,cbcsubreportincreasestotal=False
}
],
cbctype = HistoricalBalance cbctype = HistoricalBalance
} }

View File

@ -24,12 +24,32 @@ balancesheetequitySpec = CompoundBalanceCommandSpec {
balances of asset, liability and equity accounts (ignoring any report begin date). balances of asset, liability and equity accounts (ignoring any report begin date).
It assumes that these accounts are under a top-level `asset`, `liability` and `equity` It assumes that these accounts are under a top-level `asset`, `liability` and `equity`
account (plural forms also allowed). account (plural forms also allowed).
Note this report shows all account balances with normal positive sign
(like conventional financial statements, unlike balance/print/register)
(experimental).
|], |],
cbctitle = "Balance Sheet With Equity", cbctitle = "Balance Sheet With Equity",
cbcqueries = [("Assets", journalAssetAccountQuery, Just NormallyPositive), cbcqueries = [
("Liabilities", journalLiabilityAccountQuery, Just NormallyNegative), CBCSubreportSpec{
("Equity", journalEquityAccountQuery, Just NormallyNegative) cbcsubreporttitle="Assets"
], ,cbcsubreportquery=journalAssetAccountQuery
,cbcsubreportnormalsign=NormallyPositive
,cbcsubreportincreasestotal=True
}
,CBCSubreportSpec{
cbcsubreporttitle="Liabilities"
,cbcsubreportquery=journalLiabilityAccountQuery
,cbcsubreportnormalsign=NormallyNegative
,cbcsubreportincreasestotal=False
}
,CBCSubreportSpec{
cbcsubreporttitle="Equity"
,cbcsubreportquery=journalEquityAccountQuery
,cbcsubreportnormalsign=NormallyNegative
,cbcsubreportincreasestotal=False
}
],
cbctype = HistoricalBalance cbctype = HistoricalBalance
} }

View File

@ -30,9 +30,20 @@ This command displays a simple cashflow statement, showing changes
in "cash" accounts. It assumes that these accounts are under a top-level in "cash" accounts. It assumes that these accounts are under a top-level
`asset` account (case insensitive, plural forms also allowed) and do not `asset` account (case insensitive, plural forms also allowed) and do not
contain `receivable` or `A/R` in their name. contain `receivable` or `A/R` in their name.
Note this report shows all account balances with normal positive sign
(like conventional financial statements, unlike balance/print/register)
(experimental).
|], |],
cbctitle = "Cashflow Statement", cbctitle = "Cashflow Statement",
cbcqueries = [("Cash flows", journalCashAccountQuery, Just NormallyPositive)], cbcqueries = [
CBCSubreportSpec{
cbcsubreporttitle="Cash flows"
,cbcsubreportquery=journalCashAccountQuery
,cbcsubreportnormalsign=NormallyPositive
,cbcsubreportincreasestotal=True
}
],
cbctype = PeriodChange cbctype = PeriodChange
} }

View File

@ -27,11 +27,26 @@ This command displays a simple income statement, showing revenues
and expenses during a period. It assumes that these accounts are under a and expenses during a period. It assumes that these accounts are under a
top-level `revenue` or `income` or `expense` account (case insensitive, top-level `revenue` or `income` or `expense` account (case insensitive,
plural forms also allowed). plural forms also allowed).
Note this report shows all account balances with normal positive sign
(like conventional financial statements, unlike balance/print/register)
(experimental).
|], |],
cbctitle = "Income Statement", cbctitle = "Income Statement",
cbcqueries = [ ("Revenues", journalIncomeAccountQuery, Just NormallyNegative), cbcqueries = [
("Expenses", journalExpenseAccountQuery, Just NormallyPositive) CBCSubreportSpec{
], cbcsubreporttitle="Revenues"
,cbcsubreportquery=journalIncomeAccountQuery
,cbcsubreportnormalsign=NormallyNegative
,cbcsubreportincreasestotal=True
}
,CBCSubreportSpec{
cbcsubreporttitle="Expenses"
,cbcsubreportquery=journalExpenseAccountQuery
,cbcsubreportnormalsign=NormallyPositive
,cbcsubreportincreasestotal=False
}
],
cbctype = PeriodChange cbctype = PeriodChange
} }

View File

@ -8,6 +8,7 @@ like balancesheet, cashflow, and incomestatement.
module Hledger.Cli.CompoundBalanceCommand ( module Hledger.Cli.CompoundBalanceCommand (
CompoundBalanceCommandSpec(..) CompoundBalanceCommandSpec(..)
,CBCSubreportSpec(..)
,compoundBalanceCommandMode ,compoundBalanceCommandMode
,compoundBalanceCommand ,compoundBalanceCommand
) where ) where
@ -17,7 +18,6 @@ import Data.Maybe (fromMaybe)
import Data.Monoid (Sum(..), (<>)) import Data.Monoid (Sum(..), (<>))
import qualified Data.Text import qualified Data.Text
import qualified Data.Text.Lazy as TL import qualified Data.Text.Lazy as TL
import Data.Tuple.HT (uncurry3)
import System.Console.CmdArgs.Explicit as C import System.Console.CmdArgs.Explicit as C
import Text.CSV import Text.CSV
import Lucid as L import Lucid as L
@ -34,15 +34,29 @@ import Hledger.Cli.Utils (writeOutput)
-- each with its own title and subtotals row, in a certain order, -- each with its own title and subtotals row, in a certain order,
-- plus a grand totals row if there's more than one section. -- plus a grand totals row if there's more than one section.
-- Examples are the balancesheet, cashflow and incomestatement commands. -- Examples are the balancesheet, cashflow and incomestatement commands.
--
-- Compound balance reports do sign normalisation: they show all account balances
-- as normally positive, unlike the ordinary BalanceReport and most hledger commands
-- which show income/liability/equity balances as normally negative.
-- Each subreport specifies the normal sign of its amounts, and whether
-- it should be added to or subtracted from the grand total.
--
data CompoundBalanceCommandSpec = CompoundBalanceCommandSpec { data CompoundBalanceCommandSpec = CompoundBalanceCommandSpec {
cbcname :: String, -- ^ command name cbcname :: String, -- ^ command name
cbcaliases :: [String], -- ^ command aliases cbcaliases :: [String], -- ^ command aliases
cbchelp :: String, -- ^ command line help cbchelp :: String, -- ^ command line help
cbctitle :: String, -- ^ overall report title cbctitle :: String, -- ^ overall report title
cbcqueries :: [(String, Journal -> Query, Maybe NormalSign)], cbcqueries :: [CBCSubreportSpec], -- ^ subreport details
-- ^ title, journal-parameterised query, and normal balance sign for each subreport. cbctype :: BalanceType -- ^ the "balance" type (change, cumulative, historical)
-- The normal balance helps --sort-amount know how to sort negative amounts. -- this report shows (overrides command line flags)
cbctype :: BalanceType -- ^ the type of "balance" 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: -- | A compound balance report has:
@ -51,7 +65,9 @@ data CompoundBalanceCommandSpec = CompoundBalanceCommandSpec {
-- --
-- * the period (date span) of each column -- * the period (date span) of each column
-- --
-- * one or more named multi balance reports, with columns corresponding to the above -- * 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 -- * a list of overall totals for each column, and their grand total and average
-- --
@ -60,7 +76,7 @@ data CompoundBalanceCommandSpec = CompoundBalanceCommandSpec {
type CompoundBalanceReport = type CompoundBalanceReport =
( String ( String
, [DateSpan] , [DateSpan]
, [(String, MultiBalanceReport)] , [(String, MultiBalanceReport, Bool)]
, ([MixedAmount], MixedAmount, MixedAmount) , ([MixedAmount], MixedAmount, MixedAmount)
) )
@ -145,15 +161,16 @@ compoundBalanceCommand CompoundBalanceCommandSpec{..} opts@CliOpts{command_=cmd,
-- single-column report -- single-column report
-- TODO refactor, support output format like multi column -- TODO refactor, support output format like multi column
-- TODO support sign normalisation ?
NoInterval -> do NoInterval -> do
let let
-- concatenate the rendering and sum the totals from each subreport -- concatenate the rendering and sum the totals from each subreport
(subreportstr, total) = (output, total) =
foldMap (uncurry3 (compoundBalanceCommandSingleColumnReport ropts' userq j)) cbcqueries foldMap (compoundBalanceCommandSingleColumnReport ropts' userq j) cbcqueries
writeOutput opts $ unlines $ writeOutput opts $ unlines $
[title ++ "\n"] ++ [title ++ "\n"] ++
subreportstr ++ output ++
if (no_total_ ropts' || cmd=="cashflow") if (no_total_ ropts' || cmd=="cashflow")
then [] then []
else else
@ -170,35 +187,48 @@ compoundBalanceCommand CompoundBalanceCommandSpec{..} opts@CliOpts{command_=cmd,
_ -> do _ -> do
let let
-- make a CompoundBalanceReport -- make a CompoundBalanceReport
namedsubreports = subreports =
map (\(subreporttitle, subreportq, subreportnormalsign) -> map (\CBCSubreportSpec{..} ->
(subreporttitle, compoundBalanceSubreport ropts' userq j subreportq subreportnormalsign)) (cbcsubreporttitle
,mbrNormaliseSign cbcsubreportnormalsign $ -- <- convert normal-negative to normal-positive
compoundBalanceSubreport ropts' userq j cbcsubreportquery cbcsubreportnormalsign
-- ^ allow correct amount sorting
,cbcsubreportincreasestotal
))
cbcqueries cbcqueries
subtotalrows = [coltotals | MultiBalanceReport (_,_,(coltotals,_,_)) <- map snd namedsubreports] subtotalrows =
[(coltotals, increasesoveralltotal)
| (_, MultiBalanceReport (_,_,(coltotals,_,_)), 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 overalltotals = case subtotalrows of
[] -> ([], nullmixedamt, nullmixedamt) [] -> ([], nullmixedamt, nullmixedamt)
rs -> rs ->
-- Sum the subtotals in each column.
-- A subreport might be empty and have no subtotals, count those as zeros (#588).
-- Short subtotals rows are also implicitly padded with zeros, though that is not expected to happen.
let let
numcols = maximum $ map length rs -- depends on non-null ts numcols = maximum $ map (length.fst) rs -- partial maximum is ok, rs is non-null
zeros = replicate numcols nullmixedamt paddedsignedsubtotalrows =
rs' = [take numcols $ as ++ repeat nullmixedamt | as <- rs] [map (if increasesoveralltotal then id else negate) $ -- maybe flip the signs
coltotals = foldl' (zipWith (+)) zeros rs' 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 grandtotal = sum coltotals
grandavg | null coltotals = nullmixedamt grandavg | null coltotals = nullmixedamt
| otherwise = grandtotal `divideMixedAmount` fromIntegral (length coltotals) | otherwise = grandtotal `divideMixedAmount` fromIntegral (length coltotals)
in in
(coltotals, grandtotal, grandavg) (coltotals, grandtotal, grandavg)
colspans = colspans =
case namedsubreports of case subreports of
(_, MultiBalanceReport (ds,_,_)):_ -> ds (_, MultiBalanceReport (ds,_,_), _):_ -> ds
[] -> [] [] -> []
cbr = cbr =
(title (title
,colspans ,colspans
,namedsubreports ,subreports
,overalltotals ,overalltotals
) )
-- render appropriately -- render appropriately
@ -208,6 +238,19 @@ compoundBalanceCommand CompoundBalanceCommandSpec{..} opts@CliOpts{command_=cmd,
"html" -> (++ "\n") $ TL.unpack $ L.renderText $ compoundBalanceReportAsHtml ropts cbr "html" -> (++ "\n") $ TL.unpack $ L.renderText $ compoundBalanceReportAsHtml ropts cbr
_ -> compoundBalanceReportAsText ropts' cbr _ -> compoundBalanceReportAsText ropts' cbr
-- | Given a MultiBalanceReport and its normal balance sign,
-- if it is known to be normally negative, convert it to normally positive.
mbrNormaliseSign :: NormalSign -> MultiBalanceReport -> MultiBalanceReport
mbrNormaliseSign NormallyNegative = mbrNegate
mbrNormaliseSign _ = id
-- | Flip the sign of all amounts in a MultiBalanceReport.
mbrNegate (MultiBalanceReport (colspans, rows, totalsrow)) =
MultiBalanceReport (colspans, map mbrRowNegate rows, mbrTotalsRowNegate totalsrow)
where
mbrRowNegate (acct,shortacct,indent,amts,tot,avg) = (acct,shortacct,indent,map negate amts,-tot,-avg)
mbrTotalsRowNegate (amts,tot,avg) = (map negate amts,-tot,-avg)
-- | Run one subreport for a compound balance command in single-column mode. -- | Run one subreport for a compound balance command in single-column mode.
-- Currently this returns the plain text rendering of the subreport, and its total. -- Currently this returns the plain text rendering of the subreport, and its total.
-- The latter is wrapped in a Sum for easy monoidal combining. -- The latter is wrapped in a Sum for easy monoidal combining.
@ -215,30 +258,28 @@ compoundBalanceCommandSingleColumnReport
:: ReportOpts :: ReportOpts
-> Query -> Query
-> Journal -> Journal
-> String -> CBCSubreportSpec
-> (Journal -> Query)
-> Maybe NormalSign
-> ([String], Sum MixedAmount) -> ([String], Sum MixedAmount)
compoundBalanceCommandSingleColumnReport ropts userq j subreporttitle subreportqfn subreportnormalsign = compoundBalanceCommandSingleColumnReport ropts userq j CBCSubreportSpec{..} =
([subreportstr], Sum total) ([subreportstr], Sum total)
where where
q = And [subreportqfn j, userq] q = And [cbcsubreportquery j, userq]
ropts' = ropts{normalbalance_=subreportnormalsign} ropts' = ropts{normalbalance_=Just cbcsubreportnormalsign}
r@(_,total) r@(_,total)
-- XXX For --historical/--cumulative, we must use singleBalanceReport; -- XXX For --historical/--cumulative, we must use singleBalanceReport;
-- otherwise we use balanceReport -- because it supports eliding boring parents. -- otherwise we use balanceReport -- because it supports eliding boring parents.
-- See also compoundBalanceCommand, Balance.hs -> balance. -- See also compoundBalanceCommand, Balance.hs -> balance.
| balancetype_ ropts `elem` [CumulativeChange, HistoricalBalance] = singleBalanceReport ropts' q j | balancetype_ ropts `elem` [CumulativeChange, HistoricalBalance] = singleBalanceReport ropts' q j
| otherwise = balanceReport ropts' q j | otherwise = balanceReport ropts' q j
subreportstr = intercalate "\n" [subreporttitle <> ":", balanceReportAsText ropts r] subreportstr = intercalate "\n" [cbcsubreporttitle <> ":", balanceReportAsText ropts r]
-- | Run one subreport for a compound balance command in multi-column mode. -- | Run one subreport for a compound balance command in multi-column mode.
-- This returns a MultiBalanceReport. -- This returns a MultiBalanceReport.
compoundBalanceSubreport :: ReportOpts -> Query -> Journal -> (Journal -> Query) -> Maybe NormalSign -> MultiBalanceReport compoundBalanceSubreport :: ReportOpts -> Query -> Journal -> (Journal -> Query) -> NormalSign -> MultiBalanceReport
compoundBalanceSubreport ropts userq j subreportqfn subreportnormalsign = r' compoundBalanceSubreport ropts userq j subreportqfn subreportnormalsign = r'
where where
-- force --empty to ensure same columns in all sections -- force --empty to ensure same columns in all sections
ropts' = ropts { empty_=True, normalbalance_=subreportnormalsign } ropts' = ropts { empty_=True, normalbalance_=Just subreportnormalsign }
-- run the report -- run the report
q = And [subreportqfn j, userq] q = And [subreportqfn j, userq]
r@(MultiBalanceReport (dates, rows, totals)) = multiBalanceReport ropts' q j r@(MultiBalanceReport (dates, rows, totals)) = multiBalanceReport ropts' q j
@ -286,7 +327,7 @@ compoundBalanceReportAsText ropts (title, _colspans, subreports, (coltotals, gra
| otherwise = | otherwise =
bigtable bigtable
+====+ +====+
row "Total" ( row "Net:" (
coltotals coltotals
++ (if row_total_ ropts then [grandtotal] else []) ++ (if row_total_ ropts then [grandtotal] else [])
++ (if average_ ropts then [grandavg] else []) ++ (if average_ ropts then [grandavg] else [])
@ -294,7 +335,7 @@ compoundBalanceReportAsText ropts (title, _colspans, subreports, (coltotals, gra
-- | Convert a named multi balance report to a table suitable for -- | Convert a named multi balance report to a table suitable for
-- concatenating with others to make a compound balance report table. -- concatenating with others to make a compound balance report table.
subreportAsTable ropts singlesubreport (title, r) = t subreportAsTable ropts singlesubreport (title, r, _) = t
where where
-- unless there's only one section, always show the subtotal row -- unless there's only one section, always show the subtotal row
ropts' | singlesubreport = ropts ropts' | singlesubreport = ropts
@ -325,7 +366,7 @@ compoundBalanceReportAsCsv ropts (title, colspans, subreports, (coltotals, grand
where where
singlesubreport = length subreports == 1 singlesubreport = length subreports == 1
-- | Add a subreport title row and drop the heading row. -- | Add a subreport title row and drop the heading row.
subreportAsCsv ropts singlesubreport (subreporttitle, multibalreport) = subreportAsCsv ropts singlesubreport (subreporttitle, multibalreport, _) =
padRow subreporttitle : padRow subreporttitle :
tail (multiBalanceReportAsCsv ropts' multibalreport) tail (multiBalanceReportAsCsv ropts' multibalreport)
where where
@ -342,11 +383,11 @@ compoundBalanceReportAsCsv ropts (title, colspans, subreports, (coltotals, grand
(if average_ ropts then (1+) else id) $ (if average_ ropts then (1+) else id) $
maximum $ -- depends on non-null subreports maximum $ -- depends on non-null subreports
map (\(MultiBalanceReport (amtcolheadings, _, _)) -> length amtcolheadings) $ map (\(MultiBalanceReport (amtcolheadings, _, _)) -> length amtcolheadings) $
map snd subreports map second3 subreports
addtotals addtotals
| no_total_ ropts || length subreports == 1 = id | no_total_ ropts || length subreports == 1 = id
| otherwise = (++ | otherwise = (++
["Grand total" : ["Net:" :
map showMixedAmountOneLineWithoutPrice ( map showMixedAmountOneLineWithoutPrice (
coltotals coltotals
++ (if row_total_ ropts then [grandtotal] else []) ++ (if row_total_ ropts then [grandtotal] else [])
@ -374,8 +415,8 @@ compoundBalanceReportAsHtml ropts cbr =
-- Make rows for a subreport: its title row, not the headings row, -- Make rows for a subreport: its title row, not the headings row,
-- the data rows, any totals row, and a blank row for whitespace. -- the data rows, any totals row, and a blank row for whitespace.
subreportrows :: (String, MultiBalanceReport) -> [Html ()] subreportrows :: (String, MultiBalanceReport, Bool) -> [Html ()]
subreportrows (subreporttitle, mbr) = subreportrows (subreporttitle, mbr, _increasestotal) =
let let
(_,bodyrows,mtotalsrow) = multiBalanceReportHtmlRows ropts mbr (_,bodyrows,mtotalsrow) = multiBalanceReportHtmlRows ropts mbr
in in
@ -387,7 +428,7 @@ compoundBalanceReportAsHtml ropts cbr =
totalrows | no_total_ ropts || length subreports == 1 = [] totalrows | no_total_ ropts || length subreports == 1 = []
| otherwise = | otherwise =
[thRow $ [thRow $
"Grand Total:" : "Net:" :
map showMixedAmountOneLineWithoutPrice ( map showMixedAmountOneLineWithoutPrice (
coltotals coltotals
++ (if row_total_ ropts then [grandtotal] else []) ++ (if row_total_ ropts then [grandtotal] else [])

View File

@ -1,4 +1,4 @@
# 1. # 1. trivial balance sheet
hledger -f - balancesheet hledger -f - balancesheet
<<< <<<
2016/1/1 2016/1/1
@ -23,7 +23,28 @@ Total:
>>>2 >>>2
>>>= 0 >>>= 0
# 2. # 2. monthly balance sheet, normal positive sign
# old (arithmetic sign):
#Balance Sheet
#
# || 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:bank:checking || $1 $1 $1 $1 $1 $1 $1 $1 $1 $1 $1 0
# assets:bank:saving || 0 0 0 0 0 $1 $1 $1 $1 $1 $1 $1
# assets: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
#======================++================================================================================================================================================
# Liabilities ||
#----------------------++------------------------------------------------------------------------------------------------------------------------------------------------
# liabilities: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
#======================++================================================================================================================================================
# Total || $1 $1 $1 $1 $1 0 0 0 0 0 0 0
#
hledger -f sample.journal balancesheet -p 'monthly in 2008' hledger -f sample.journal balancesheet -p 'monthly in 2008'
>>> >>>
Balance Sheet Balance Sheet
@ -40,15 +61,37 @@ Balance Sheet
======================++================================================================================================================================================ ======================++================================================================================================================================================
Liabilities || Liabilities ||
----------------------++------------------------------------------------------------------------------------------------------------------------------------------------ ----------------------++------------------------------------------------------------------------------------------------------------------------------------------------
liabilities:debts || 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
----------------------++------------------------------------------------------------------------------------------------------------------------------------------------ ----------------------++------------------------------------------------------------------------------------------------------------------------------------------------
|| 0 0 0 0 0 0 0 0 0 0 0 $1 || 0 0 0 0 0 0 0 0 0 0 0 $-1
======================++================================================================================================================================================ ======================++================================================================================================================================================
Total || $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
# 3. # 3. monthly balance sheet in tree mode
# old (arithmetic sign):
# || 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 || $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
# 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
# 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
#==============++================================================================================================================================================
# Liabilities ||
#--------------++------------------------------------------------------------------------------------------------------------------------------------------------
# liabilities || 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
#==============++================================================================================================================================================
# Total || $1 $1 $1 $1 $1 0 0 0 0 0 0 0
#
hledger -f sample.journal balancesheet -p 'monthly in 2008' --tree hledger -f sample.journal balancesheet -p 'monthly in 2008' --tree
>>> >>>
Balance Sheet Balance Sheet
@ -67,64 +110,39 @@ Balance Sheet
==============++================================================================================================================================================ ==============++================================================================================================================================================
Liabilities || Liabilities ||
--------------++------------------------------------------------------------------------------------------------------------------------------------------------ --------------++------------------------------------------------------------------------------------------------------------------------------------------------
liabilities || 0 0 0 0 0 0 0 0 0 0 0 $1 liabilities || 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 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
==============++================================================================================================================================================ ==============++================================================================================================================================================
Total || $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
# 4. # 4. monthly balancesheet with average/total columns and without overall totals row
hledger -f sample.journal balancesheet -p 'monthly in 2008' -A hledger -f sample.journal balancesheet -p 'monthly in 2008' -NAT
>>> >>>
Balance Sheet Balance Sheet
|| 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 Average || 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 Total Average
======================++========================================================================================================================================================= ======================++==================================================================================================================================================================
Assets || Assets ||
----------------------++--------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------++------------------------------------------------------------------------------------------------------------------------------------------------------------------
assets:bank:checking || $1 $1 $1 $1 $1 $1 $1 $1 $1 $1 $1 0 $1 assets:bank:checking || $1 $1 $1 $1 $1 $1 $1 $1 $1 $1 $1 0 $11 $1
assets:bank:saving || 0 0 0 0 0 $1 $1 $1 $1 $1 $1 $1 $1 assets:bank:saving || 0 0 0 0 0 $1 $1 $1 $1 $1 $1 $1 $7 $1
assets:cash || 0 0 0 0 0 $-2 $-2 $-2 $-2 $-2 $-2 $-2 $-1 assets:cash || 0 0 0 0 0 $-2 $-2 $-2 $-2 $-2 $-2 $-2 $-14 $-1
----------------------++--------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------++------------------------------------------------------------------------------------------------------------------------------------------------------------------
|| $1 $1 $1 $1 $1 0 0 0 0 0 0 $-1 0 || $1 $1 $1 $1 $1 0 0 0 0 0 0 $-1 $4 0
======================++========================================================================================================================================================= ======================++==================================================================================================================================================================
Liabilities || Liabilities ||
----------------------++--------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------++------------------------------------------------------------------------------------------------------------------------------------------------------------------
liabilities:debts || 0 0 0 0 0 0 0 0 0 0 0 $1 0 liabilities:debts || 0 0 0 0 0 0 0 0 0 0 0 $-1 $-1 0
----------------------++--------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------++------------------------------------------------------------------------------------------------------------------------------------------------------------------
|| 0 0 0 0 0 0 0 0 0 0 0 $1 0 || 0 0 0 0 0 0 0 0 0 0 0 $-1 $-1 0
======================++=========================================================================================================================================================
Total || $1 $1 $1 $1 $1 0 0 0 0 0 0 0 0
>>>= 0 >>>= 0
# 5. # 5. Tree output still works, #565
hledger -f sample.journal balancesheet -p 'monthly in 2008' -NT
>>>
Balance Sheet
|| 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 Total
======================++=========================================================================================================================================================
Assets ||
----------------------++---------------------------------------------------------------------------------------------------------------------------------------------------------
assets:bank:checking || $1 $1 $1 $1 $1 $1 $1 $1 $1 $1 $1 0 $11
assets:bank:saving || 0 0 0 0 0 $1 $1 $1 $1 $1 $1 $1 $7
assets:cash || 0 0 0 0 0 $-2 $-2 $-2 $-2 $-2 $-2 $-2 $-14
----------------------++---------------------------------------------------------------------------------------------------------------------------------------------------------
|| $1 $1 $1 $1 $1 0 0 0 0 0 0 $-1 $4
======================++=========================================================================================================================================================
Liabilities ||
----------------------++---------------------------------------------------------------------------------------------------------------------------------------------------------
liabilities:debts || 0 0 0 0 0 0 0 0 0 0 0 $1 $1
----------------------++---------------------------------------------------------------------------------------------------------------------------------------------------------
|| 0 0 0 0 0 0 0 0 0 0 0 $1 $1
>>>= 0
# 6. Tree output still works, #565
hledger -f- balancesheet hledger -f- balancesheet
<<< <<<
2017/1/1 2017/1/1
@ -149,7 +167,7 @@ Total:
>>>2 >>>2
>>>=0 >>>=0
# 7. Flat output still works, #552 # 6. Flat output still works, #552
hledger -f- balancesheet --flat hledger -f- balancesheet --flat
<<< <<<
2017/1/1 2017/1/1
@ -173,7 +191,7 @@ Total:
>>>2 >>>2
>>>=0 >>>=0
# 8. An empty section is does not disrupt the overall totals, #588 # 7. An empty section is does not disrupt the overall totals, #588
hledger -f- balancesheet -YTA hledger -f- balancesheet -YTA
<<< <<<
2017/1/1 2017/1/1
@ -194,7 +212,7 @@ Balance Sheet
-------------++------------------------------ -------------++------------------------------
|| ||
=============++============================== =============++==============================
Total || $1 $1 $1 Net: || $1 $1 $1
>>>2 >>>2
>>>=0 >>>=0
@ -221,7 +239,7 @@ Balance Sheet
─────────────╫──────────── ─────────────╫────────────
═════════════╬════════════ ═════════════╬════════════
Total ║ 1 Net: ║ 1
>>>2 >>>2
>>>= 0 >>>= 0

View File

@ -191,6 +191,27 @@ Total:
>>>= 0 >>>= 0
# 6. Multicolumn test # 6. Multicolumn test
# old (arithmetic sign):
# Income Statement
#
# || 2008/01 2008/02 2008/03 2008/04 2008/05 2008/06 2008/07 2008/08 2008/09 2008/10 2008/11 2008/12 Total Average
# ===================++==============================================================================================================================
# Revenues ||
# -------------------++------------------------------------------------------------------------------------------------------------------------------
# income:gifts || 0 0 0 0 0 $-1 0 0 0 0 0 0 $-1 0
# income:salary || $-1 0 0 0 0 0 0 0 0 0 0 0 $-1 0
# -------------------++------------------------------------------------------------------------------------------------------------------------------
# || $-1 0 0 0 0 $-1 0 0 0 0 0 0 $-2 0
# ===================++==============================================================================================================================
# Expenses ||
# -------------------++------------------------------------------------------------------------------------------------------------------------------
# expenses:food || 0 0 0 0 0 $1 0 0 0 0 0 0 $1 0
# expenses:supplies || 0 0 0 0 0 $1 0 0 0 0 0 0 $1 0
# -------------------++------------------------------------------------------------------------------------------------------------------------------
# || 0 0 0 0 0 $2 0 0 0 0 0 0 $2 0
# ===================++==============================================================================================================================
# Total || $-1 0 0 0 0 $1 0 0 0 0 0 0 0 0
#
hledger -f sample.journal incomestatement -p 'monthly in 2008' -AT hledger -f sample.journal incomestatement -p 'monthly in 2008' -AT
>>> >>>
Income Statement Income Statement
@ -199,10 +220,10 @@ Income Statement
===================++============================================================================================================================== ===================++==============================================================================================================================
Revenues || Revenues ||
-------------------++------------------------------------------------------------------------------------------------------------------------------ -------------------++------------------------------------------------------------------------------------------------------------------------------
income:gifts || 0 0 0 0 0 $-1 0 0 0 0 0 0 $-1 0 income:gifts || 0 0 0 0 0 $1 0 0 0 0 0 0 $1 0
income:salary || $-1 0 0 0 0 0 0 0 0 0 0 0 $-1 0 income:salary || $1 0 0 0 0 0 0 0 0 0 0 0 $1 0
-------------------++------------------------------------------------------------------------------------------------------------------------------ -------------------++------------------------------------------------------------------------------------------------------------------------------
|| $-1 0 0 0 0 $-1 0 0 0 0 0 0 $-2 0 || $1 0 0 0 0 $1 0 0 0 0 0 0 $2 0
===================++============================================================================================================================== ===================++==============================================================================================================================
Expenses || Expenses ||
-------------------++------------------------------------------------------------------------------------------------------------------------------ -------------------++------------------------------------------------------------------------------------------------------------------------------
@ -211,11 +232,32 @@ Income Statement
-------------------++------------------------------------------------------------------------------------------------------------------------------ -------------------++------------------------------------------------------------------------------------------------------------------------------
|| 0 0 0 0 0 $2 0 0 0 0 0 0 $2 0 || 0 0 0 0 0 $2 0 0 0 0 0 0 $2 0
===================++============================================================================================================================== ===================++==============================================================================================================================
Total || $-1 0 0 0 0 $1 0 0 0 0 0 0 0 0 Net: || $1 0 0 0 0 $-1 0 0 0 0 0 0 0 0
>>>= 0 >>>= 0
# 6. Multicolumn test (historical) # 7. Multicolumn test (historical)
# old (arithmetic sign):
# Income Statement (Historical Ending Balances)
#
# || 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
# ===================++================================================================================================================================================
# Revenues ||
# -------------------++------------------------------------------------------------------------------------------------------------------------------------------------
# income:gifts || 0 0 0 0 0 $-1 $-1 $-1 $-1 $-1 $-1 $-1
# income:salary || $-1 $-1 $-1 $-1 $-1 $-1 $-1 $-1 $-1 $-1 $-1 $-1
# -------------------++------------------------------------------------------------------------------------------------------------------------------------------------
# || $-1 $-1 $-1 $-1 $-1 $-2 $-2 $-2 $-2 $-2 $-2 $-2
# ===================++================================================================================================================================================
# Expenses ||
# -------------------++------------------------------------------------------------------------------------------------------------------------------------------------
# expenses:food || 0 0 0 0 0 $1 $1 $1 $1 $1 $1 $1
# expenses:supplies || 0 0 0 0 0 $1 $1 $1 $1 $1 $1 $1
# -------------------++------------------------------------------------------------------------------------------------------------------------------------------------
# || 0 0 0 0 0 $2 $2 $2 $2 $2 $2 $2
# ===================++================================================================================================================================================
# Total || $-1 $-1 $-1 $-1 $-1 0 0 0 0 0 0 0
#
hledger -f sample.journal incomestatement -p 'monthly in 2008' --historical hledger -f sample.journal incomestatement -p 'monthly in 2008' --historical
>>> >>>
Income Statement (Historical Ending Balances) Income Statement (Historical Ending Balances)
@ -224,10 +266,10 @@ Income Statement (Historical Ending Balances)
===================++================================================================================================================================================ ===================++================================================================================================================================================
Revenues || Revenues ||
-------------------++------------------------------------------------------------------------------------------------------------------------------------------------ -------------------++------------------------------------------------------------------------------------------------------------------------------------------------
income:gifts || 0 0 0 0 0 $-1 $-1 $-1 $-1 $-1 $-1 $-1 income:gifts || 0 0 0 0 0 $1 $1 $1 $1 $1 $1 $1
income:salary || $-1 $-1 $-1 $-1 $-1 $-1 $-1 $-1 $-1 $-1 $-1 $-1 income:salary || $1 $1 $1 $1 $1 $1 $1 $1 $1 $1 $1 $1
-------------------++------------------------------------------------------------------------------------------------------------------------------------------------ -------------------++------------------------------------------------------------------------------------------------------------------------------------------------
|| $-1 $-1 $-1 $-1 $-1 $-2 $-2 $-2 $-2 $-2 $-2 $-2 || $1 $1 $1 $1 $1 $2 $2 $2 $2 $2 $2 $2
===================++================================================================================================================================================ ===================++================================================================================================================================================
Expenses || Expenses ||
-------------------++------------------------------------------------------------------------------------------------------------------------------------------------ -------------------++------------------------------------------------------------------------------------------------------------------------------------------------
@ -236,6 +278,6 @@ Income Statement (Historical Ending Balances)
-------------------++------------------------------------------------------------------------------------------------------------------------------------------------ -------------------++------------------------------------------------------------------------------------------------------------------------------------------------
|| 0 0 0 0 0 $2 $2 $2 $2 $2 $2 $2 || 0 0 0 0 0 $2 $2 $2 $2 $2 $2 $2
===================++================================================================================================================================================ ===================++================================================================================================================================================
Total || $-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