mirror of
https://github.com/simonmichael/hledger.git
synced 2024-12-28 12:54:07 +03:00
fix: aregister: Make multicommodity amounts are properly aligned in
aregister. (#1656) This also switches to the renderTable interface for laying out aregister, just as in postingsReport.
This commit is contained in:
parent
06312c353a
commit
59b89947eb
@ -19,17 +19,19 @@ module Hledger.Cli.Commands.Aregister (
|
||||
,tests_Aregister
|
||||
) where
|
||||
|
||||
import Data.List (find, intersperse)
|
||||
import Data.Default (def)
|
||||
import Data.List (find)
|
||||
import Data.Maybe (fromMaybe)
|
||||
import qualified Data.Text as T
|
||||
import qualified Data.Text.Lazy as TL
|
||||
import qualified Data.Text.Lazy.Builder as TB
|
||||
import System.Console.CmdArgs.Explicit (flagNone, flagReq)
|
||||
import Hledger.Read.CsvReader (CSV, CsvRecord, printCSV)
|
||||
|
||||
import Hledger
|
||||
import Hledger.Read.CsvReader (CSV, CsvRecord, printCSV)
|
||||
import Hledger.Cli.CliOptions
|
||||
import Hledger.Cli.Utils
|
||||
import Text.Tabular.AsciiWide
|
||||
|
||||
aregistermode = hledgerCommandMode
|
||||
$(embedFileRelative "Hledger/Cli/Commands/Aregister.txt")
|
||||
@ -123,17 +125,16 @@ accountTransactionsReportItemAsCsvRecord
|
||||
|
||||
-- | Render a register report as plain text suitable for console output.
|
||||
accountTransactionsReportAsText :: CliOpts -> Query -> Query -> AccountTransactionsReport -> TL.Text
|
||||
accountTransactionsReportAsText copts reportq thisacctq items
|
||||
= TB.toLazyText . unlinesB $
|
||||
title :
|
||||
map (accountTransactionsReportItemAsText copts reportq thisacctq amtwidth balwidth) items
|
||||
accountTransactionsReportAsText copts reportq thisacctq items = TB.toLazyText $
|
||||
title <> TB.singleton '\n' <> lines
|
||||
where
|
||||
amtwidth = maximumStrict $ 12 : map (wbWidth . showamt . itemamt) items
|
||||
balwidth = maximumStrict $ 12 : map (wbWidth . showamt . itembal) items
|
||||
showamt = showMixedAmountB oneLine{displayMinWidth=Just 12, displayMaxWidth=mmax} -- color_
|
||||
where mmax = if no_elide_ . _rsReportOpts . reportspec_ $ copts then Nothing else Just 32
|
||||
lines = foldMap (accountTransactionsReportItemAsText copts reportq thisacctq amtwidth balwidth) items
|
||||
amtwidth = maximumStrict $ 12 : widths (map itemamt items)
|
||||
balwidth = maximumStrict $ 12 : widths (map itembal items)
|
||||
widths = map wbWidth . concatMap (showMixedAmountLinesB oneLine)
|
||||
itemamt (_,_,_,_,a,_) = a
|
||||
itembal (_,_,_,_,_,a) = a
|
||||
|
||||
-- show a title indicating which account was picked, which can be confusing otherwise
|
||||
title = maybe mempty (\s -> foldMap TB.fromText ["Transactions in ", s, " and subaccounts:"]) macct
|
||||
where
|
||||
@ -165,20 +166,23 @@ accountTransactionsReportItemAsText
|
||||
-- String -- a display string describing the other account(s), if any
|
||||
-- MixedAmount -- the amount posted to the current account(s) (or total amount posted)
|
||||
-- MixedAmount -- the register's running total or the current account(s)'s historical balance, after this transaction
|
||||
foldMap TB.fromText . concat . intersperse (["\n"]) $
|
||||
[ fitText (Just datewidth) (Just datewidth) True True date
|
||||
, " "
|
||||
, fitText (Just descwidth) (Just descwidth) True True tdescription
|
||||
, " "
|
||||
, fitText (Just acctwidth) (Just acctwidth) True True accts
|
||||
, " "
|
||||
, amtfirstline
|
||||
, " "
|
||||
, balfirstline
|
||||
]
|
||||
:
|
||||
[ [ spacer, a, " ", b ] | (a,b) <- zip amtrest balrest ]
|
||||
table <> TB.singleton '\n'
|
||||
where
|
||||
table = renderRowB def{tableBorders=False, borderSpaces=False} . Group NoLine $ map Header
|
||||
[ textCell TopLeft $ fitText (Just datewidth) (Just datewidth) True True date
|
||||
, spacerCell
|
||||
, textCell TopLeft $ fitText (Just descwidth) (Just descwidth) True True tdescription
|
||||
, spacerCell2
|
||||
, textCell TopLeft $ fitText (Just acctwidth) (Just acctwidth) True True accts
|
||||
, spacerCell2
|
||||
, Cell TopRight $ map (pad amtwidth) amt
|
||||
, spacerCell2
|
||||
, Cell BottomRight $ map (pad balwidth) bal
|
||||
]
|
||||
spacerCell = Cell BottomLeft [WideBuilder (TB.singleton ' ') 1]
|
||||
spacerCell2 = Cell BottomLeft [WideBuilder (TB.fromString " ") 2]
|
||||
pad fullwidth amt = WideBuilder (TB.fromText $ T.replicate w " ") w <> amt
|
||||
where w = fullwidth - wbWidth amt
|
||||
-- calculate widths
|
||||
(totalwidth,mdescwidth) = registerWidthsFromOpts copts
|
||||
(datewidth, date) = (10, showDate $ transactionRegisterDate reportq thisacctq t)
|
||||
@ -200,18 +204,9 @@ accountTransactionsReportItemAsText
|
||||
-- gather content
|
||||
accts = -- T.unpack $ elideAccountName acctwidth $ T.pack
|
||||
otheracctsstr
|
||||
amt = TL.toStrict . TB.toLazyText . wbBuilder $ showamt amtwidth change
|
||||
bal = TL.toStrict . TB.toLazyText . wbBuilder $ showamt balwidth balance
|
||||
showamt w = showMixedAmountB noPrice{displayColour=color_, displayMinWidth=Just w, displayMaxWidth=Just w}
|
||||
-- alternate behaviour, show null amounts as 0 instead of blank
|
||||
-- amt = if null amt' then "0" else amt'
|
||||
-- bal = if null bal' then "0" else bal'
|
||||
(amtlines, ballines) = (T.lines amt, T.lines bal)
|
||||
(amtlen, ballen) = (length amtlines, length ballines)
|
||||
numlines = max 1 (max amtlen ballen)
|
||||
(amtfirstline:amtrest) = take numlines $ amtlines ++ repeat "" -- posting amount is top-aligned
|
||||
(balfirstline:balrest) = take numlines $ replicate (numlines - ballen) "" ++ ballines -- balance amount is bottom-aligned
|
||||
spacer = T.replicate (totalwidth - (amtwidth + 2 + balwidth)) " "
|
||||
amt = showamt change
|
||||
bal = showamt balance
|
||||
showamt = showMixedAmountLinesB noPrice{displayColour=color_}
|
||||
|
||||
-- tests
|
||||
|
||||
|
@ -79,3 +79,24 @@ Transactions in a and subaccounts:
|
||||
2021-01-03 fifth a 5 15
|
||||
2021-01-03 sixth, because fo.. a 6 21
|
||||
2021-01-04 seventh, because .. b 7 28
|
||||
|
||||
<
|
||||
2021-01-01
|
||||
a 1 A
|
||||
a -1 B
|
||||
b 1 B
|
||||
c -1 A
|
||||
|
||||
2021-01-02
|
||||
a 1 C
|
||||
b -1 C
|
||||
|
||||
# 6. aregister correctly aligns amounts when there are multiple commodities (#1656).
|
||||
$ hledger -f- areg a
|
||||
Transactions in a and subaccounts:
|
||||
2021-01-01 b, c 1 A 1 A
|
||||
-1 B -1 B
|
||||
2021-01-02 b 1 C 1 A
|
||||
-1 B
|
||||
1 C
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user