Ajout : rangement.
[tool/hledger.git] / script / hledger-equity.hs
diff --git a/script/hledger-equity.hs b/script/hledger-equity.hs
new file mode 100755 (executable)
index 0000000..43ca0ff
--- /dev/null
@@ -0,0 +1,50 @@
+#!/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})