+++ /dev/null
-#!/usr/bin/env runhaskell
-{-|
-hledger-print-csv [-f JOURNALFILE]
-
-Print matched journal entries as CSV
-Reads the default or specified journal.
-|-}
-
-import Hledger.Cli
-import Text.CSV
-import Data.Char (isSpace)
-import Data.List (mapAccumL)
-
-argsmode :: Mode RawOpts
-argsmode = (defCommandMode ["print-csv"])
- { modeHelp = "print matched journal entries as CSV"
- , modeGroupFlags = Group
- { groupNamed =
- [ ("Input",inputflags)
- , ("Reporting",reportflags)
- , ("Misc",helpflags)
- ]
- , groupUnnamed = []
- , groupHidden = []
- }
- }
-
-chomp :: String -> String
-chomp = reverse . dropWhile isSpace . reverse . dropWhile isSpace
-
-postingToCSV :: Posting -> CSV
-postingToCSV p =
- map (\(a@(Amount {aquantity=q,acommodity=c})) ->
- let a_ = a{acommodity=""} in
- let amount = showAmount a_ in
- let commodity = c in
- let credit = if q < 0 then showAmount $ negate a_ else "" in
- let debit = if q > 0 then showAmount a_ else "" in
- account:amount:commodity:credit:debit:status:comment:[])
- amounts
- where
- Mixed amounts = pamount p
- status = if pstatus p then "*" else ""
- account = showAccountName Nothing (ptype p) (paccount p)
- comment = chomp $ pcomment p
-
-postingsToCSV :: [Posting] -> CSV
-postingsToCSV ps =
- concatMap postingToCSV ps
-
-transactionToCSV :: Integer -> Transaction -> CSV
-transactionToCSV n t =
- map (\p -> show n:date:date2:status:code:description:comment:p)
- (postingsToCSV (tpostings t))
- where
- description = tdescription t
- date = showDate (tdate t)
- date2 = maybe "" showDate (tdate2 t)
- status = if tstatus t then "*" else ""
- code = tcode t
- comment = chomp $ tcomment t
-
-main :: IO ()
-main = do
- opts <- getCliOpts argsmode
- withJournalDo opts $
- \CliOpts{reportopts_=ropts} j -> do
- d <- getCurrentDay
- let ropts_ = ropts{flat_=True}
- let q = queryFromOpts d ropts_
- putStrLn $ printCSV $ concat $
- ([["nth","date","date2","status","code","description","comment","account","amount","commodity","credit","debit","status","posting-comment"]]:).snd $
- mapAccumL (\n e -> (n + 1, transactionToCSV n e)) 0 $
- entriesReport ropts_ q j