75 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Haskell
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Haskell
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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
 |