--- /dev/null
+#!/usr/bin/env runhaskell
+{-
+
+Like ledger's equity command, print a journal entry posting the total
+balance of all accounts (or the specified account and its subaccounts)
+in the default journal.
+
+An entry like this is useful in the transition to a new journal file,
+to zero out asset/liability balances in the old file and initialise
+them in the new one. This way you get correct balances when reporting
+on either file, and when including both files at once.
+
+Usage: hledger-equity [ACCTPAT]
+-}
+
+import Data.Maybe (fromMaybe)
+import Hledger.Cli
+
+argsmode :: Mode RawOpts
+argsmode = (defCommandMode ["equity"])
+ { modeHelp = "print a journal entry posting the total balance of all accounts"
+ ++ " (or the specified account and its subaccounts)"
+ , modeGroupFlags = Group
+ { groupNamed =
+ [ ("Input",inputflags)
+ , ("Reporting",reportflags)
+ , ("Misc",helpflags)
+ ]
+ , groupUnnamed = []
+ , groupHidden = []
+ }
+ }
+
+main :: IO ()
+main = do
+ opts <- getCliOpts argsmode
+ withJournalDo opts $
+ \CliOpts{reportopts_=ropts} j -> do
+ today <- getCurrentDay
+ let ropts_ = ropts{flat_=True}
+ q = queryFromOpts today ropts_
+ (acctbals,_) = balanceReport ropts_ q j
+ balancingamt = negate $ sum $ map (\((_,_,_),b) -> b) acctbals
+ ps = [posting{paccount=a, pamount=b} | ((a,_,_),b) <- acctbals]
+ ++ [posting{paccount="equity:opening balances", pamount=balancingamt}]
+ enddate = fromMaybe today $ queryEndDate (date2_ ropts_) q
+ nps = [posting{paccount=a, pamount=negate b} | ((a,_,_),b) <- acctbals]
+ ++ [posting{paccount="equity:closing balances", pamount=negate balancingamt}]
+ putStr $ showTransactionUnelided (nulltransaction{tdate=enddate, tpostings=nps})
+ putStr $ showTransactionUnelided (nulltransaction{tdate=enddate, tpostings=ps})