@@ -26,6 +26,7 @@ import Data.Text qualified as T
2626import Data.Text.Lazy qualified as TL
2727import Data.Text.Lazy.IO qualified as TL
2828import Data.Text.Lazy.Builder qualified as TB
29+ import Safe (readMay )
2930import System.Console.CmdArgs.Explicit (flagNone , flagReq )
3031
3132import Hledger hiding (per )
@@ -36,6 +37,8 @@ import Hledger.Write.Spreadsheet qualified as Spr
3637import Hledger.Cli.CliOptions
3738import Hledger.Cli.Utils
3839import Hledger.Cli.Anchor (setAccountAnchor , dateCell )
40+ import Hledger.Data (accountNameDrop )
41+ import Hledger.Data.AccountName (clipAccountName )
3942import Text.Tabular.AsciiWide (Cell (.. ), Align (.. ), Properties (.. ), Header (Header , Group ), renderRowB , textCell , tableBorders , borderSpaces )
4043import Lucid qualified
4144import Data.List (sortBy )
@@ -56,6 +59,7 @@ registermode = hledgerCommandMode
5659 (" fuzzy search for one recent posting with description closest to " ++ arg)
5760 ,flagNone [" related" ," r" ] (setboolopt " related" ) " show postings' siblings instead"
5861 ,flagNone [" invert" ] (setboolopt " invert" ) " display all amounts with reversed sign"
62+ ,flagReq [" drop" ] (\ s opts -> Right $ setopt " drop" s opts) " N" " omit N leading account name parts"
5963 ,flagReq [" sort" ] (\ s opts -> Right $ setopt " sort" s opts) " FIELDS"
6064 (" sort by: " <> sortKeysDescription
6165 <> " , or a comma-separated combination of these. For a descending sort, prefix with -. (Default: date)" )
@@ -101,46 +105,46 @@ register opts@CliOpts{rawopts_=rawopts, reportspec_=rspec} j
101105 rpt = postingsReport rspec j
102106 render | fmt== " txt" = postingsReportAsText opts
103107 | fmt== " json" = toJsonText
104- | fmt== " csv" = printCSV . postingsReportAsCsv
105- | fmt== " tsv" = printTSV . postingsReportAsCsv
108+ | fmt== " csv" = printCSV . postingsReportAsCsv opts
109+ | fmt== " tsv" = printTSV . postingsReportAsCsv opts
106110 | fmt== " html" =
107111 (<> " \n " ) . Lucid. renderText . styledTableHtml .
108112 map (map (fmap Lucid. toHtml)) .
109- postingsReportAsSpreadsheet oneLineNoCostFmt baseUrl query
113+ postingsReportAsSpreadsheet opts oneLineNoCostFmt baseUrl query
110114 | fmt== " fods" =
111115 printFods IO. localeEncoding . Map. singleton " Register" .
112116 (,) (1 ,0 ) .
113- postingsReportAsSpreadsheet oneLineNoCostFmt baseUrl query
117+ postingsReportAsSpreadsheet opts oneLineNoCostFmt baseUrl query
114118 | otherwise = error' $ unsupportedOutputFormatError fmt -- PARTIAL:
115119 where fmt = outputFormatFromOpts opts
116120 baseUrl = balance_base_url_ $ _rsReportOpts rspec
117121 query = querystring_ $ _rsReportOpts rspec
118122
119- postingsReportAsCsv :: PostingsReport -> CSV
120- postingsReportAsCsv =
121- Spr. rawTableContent . postingsReportAsSpreadsheet machineFmt Nothing []
123+ postingsReportAsCsv :: CliOpts -> PostingsReport -> CSV
124+ postingsReportAsCsv opts =
125+ Spr. rawTableContent . postingsReportAsSpreadsheet opts machineFmt Nothing []
122126
123127-- ToDo: --layout=bare etc.
124128-- ToDo: Text output does not show headers, but Spreadsheet does
125129postingsReportAsSpreadsheet ::
126- AmountFormat -> Maybe Text -> [Text ] ->
130+ CliOpts -> AmountFormat -> Maybe Text -> [Text ] ->
127131 PostingsReport -> [[Spr. Cell Spr. NumLines Text ]]
128- postingsReportAsSpreadsheet fmt baseUrl query is =
132+ postingsReportAsSpreadsheet opts fmt baseUrl query is =
129133 Spr. addHeaderBorders
130134 (map Spr. headerCell
131135 [" txnidx" ," date" ," code" ," description" ," account" ," amount" ," total" ])
132136 :
133- map (postingsReportItemAsRecord fmt baseUrl query) is
137+ map (postingsReportItemAsRecord opts fmt baseUrl query) is
134138
135139{- ToDo:
136140link txnidx to journal URL,
137141 however, requires Web.Widget.Common.transactionFragment
138142-}
139143postingsReportItemAsRecord ::
140144 (Spr. Lines border ) =>
141- AmountFormat -> Maybe Text -> [Text ] ->
145+ CliOpts -> AmountFormat -> Maybe Text -> [Text ] ->
142146 PostingsReportItem -> [Spr. Cell border Text ]
143- postingsReportItemAsRecord fmt baseUrl query (_, _, _, p, b) =
147+ postingsReportItemAsRecord opts @ CliOpts {reportspec_ = rspec} fmt baseUrl query (_, _, _, p, b) =
144148 [idx,
145149 (dateCell baseUrl query (paccount p) date) {Spr. cellType = Spr. TypeDate },
146150 cell code, cell desc,
@@ -153,8 +157,10 @@ postingsReportItemAsRecord fmt baseUrl query (_, _, _, p, b) =
153157 date = postingDate p -- XXX csv should show date2 with --date2
154158 code = maybe " " tcode $ ptransaction p
155159 desc = maybe " " tdescription $ ptransaction p
156- acct = bracket $ paccount p
160+ acct = bracket . accountNameDrop dropNum . clipAccountName depthSpec $ paccount p
157161 where
162+ depthSpec = depth_ $ _rsReportOpts rspec
163+ dropNum = fromMaybe 0 $ readMay =<< maybestringopt " drop" (rawopts_ opts)
158164 bracket = case ptype p of
159165 BalancedVirtualPosting -> wrap " [" " ]"
160166 VirtualPosting -> wrap " (" " )"
@@ -199,7 +205,7 @@ postingsReportAsText opts = TB.toLazyText .
199205postingsReportItemAsText :: CliOpts -> Int -> Int
200206 -> (PostingsReportItem , [WideBuilder ], [WideBuilder ])
201207 -> TB. Builder
202- postingsReportItemAsText opts preferredamtwidth preferredbalwidth ((mdate, mperiod, mdesc, p, _), amt, bal) =
208+ postingsReportItemAsText opts@ CliOpts {reportspec_ = rspec} preferredamtwidth preferredbalwidth ((mdate, mperiod, mdesc, p, _), amt, bal) =
203209 table <> TB. singleton ' \n '
204210 where
205211 table = renderRowB def{tableBorders= False , borderSpaces= False } . Group NoLine $ map Header
@@ -243,8 +249,10 @@ postingsReportItemAsText opts preferredamtwidth preferredbalwidth ((mdate, mperi
243249
244250 -- gather content
245251 desc = fromMaybe " " mdesc
246- acct = parenthesise . elideAccountName awidth $ paccount p
252+ acct = parenthesise . elideAccountName awidth . dropAcct . clipAcct $ paccount p
247253 where
254+ clipAcct = clipAccountName (depth_ $ _rsReportOpts rspec)
255+ dropAcct = accountNameDrop (fromMaybe 0 $ readMay =<< maybestringopt " drop" (rawopts_ opts))
248256 (parenthesise, awidth) = case ptype p of
249257 BalancedVirtualPosting -> (wrap " [" " ]" , acctwidth- 2 )
250258 VirtualPosting -> (wrap " (" " )" , acctwidth- 2 )
0 commit comments