diff --git a/bin/hledger-equity.hs b/bin/hledger-equity.hs deleted file mode 100755 index 7527b4531..000000000 --- a/bin/hledger-equity.hs +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/env stack -{- stack runghc --verbosity info - --package hledger-lib - --package hledger - --package here - --package time --} - -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE QuasiQuotes #-} - -import Data.Maybe -import Data.String.Here -import Data.Time.Calendar -import Hledger.Cli - ------------------------------------------------------------------------------- -cmdmode :: Mode RawOpts -cmdmode = hledgerCommandMode - [here| equity -Print a "closing balances" transaction that brings all accounts (or with -query arguments, just the matched accounts) to a zero balance, followed by an -opposite "opening balances" transaction that restores the balances from zero. -Such transactions can be useful, eg, for bringing account balances across -file boundaries. - -FLAGS - -The opening balances transaction is useful to carry over -asset/liability balances if you choose to start a new journal file, -eg at the beginning of the year. - -The closing balances transaction is useful to zero out balances in -the old file, which gives you the option of reporting on both files -at once while still seeing correct balances. - -Balances are calculated, and the opening transaction is dated, as of -the report end date, which you should specify with -e or date: (and -the closing transaction is dated one day earlier). If a report end -date is not specified, it defaults to today. - -Example: -```shell -$ hledger equity -f 2015.journal -e 2016/1/1 assets liabilities >>2015.journal -# move the opening balances transaction to 2016.journal -$ hledger -f 2015.journal bal assets liabilities not:desc:closing # shows correct 2015 balances -$ hledger -f 2016.journal bal assets liabilities # shows correct 2016 balances -$ hledger -f 2015.journal -f 2016.journal bal assets liabilities # still shows correct 2016 balances -``` -Open question: how to handle txns spanning a file boundary ? Eg: -```journal -2015/12/30 * food - expenses:food:dining $10 - assets:bank:checking -$10 ; date:2016/1/4 -``` -This command might or might not have some connection to the concept of -"closing the books" in accounting. - |] - [] - [generalflagsgroup1] - [] - ([], Just $ argsFlag "[QUERY]") ------------------------------------------------------------------------------- - -main :: IO () -main = do - opts <- getHledgerCliOpts cmdmode - withJournalDo opts $ - \CliOpts{reportopts_=ropts} j -> do - today <- getCurrentDay - let ropts_ = ropts{accountlistmode_=ALFlat} - q = queryFromOpts today ropts_ - (acctbals,_) = balanceReport ropts_ q j - balancingamt = negate $ sum $ map (\(_,_,_,b) -> normaliseMixedAmountSquashPricesForDisplay b) acctbals - ps = [posting{paccount=a - ,pamount=mixed [b] - ,pbalanceassertion=Just b - } - |(a,_,_,mb) <- acctbals - ,b <- amounts $ normaliseMixedAmountSquashPricesForDisplay mb - ] - ++ [posting{paccount="equity:opening balances", pamount=balancingamt}] - enddate = fromMaybe today $ queryEndDate (date2_ ropts_) q - nps = [posting{paccount=a - ,pamount=mixed [negate b] - ,pbalanceassertion=Just b{aquantity=0} - } - |(a,_,_,mb) <- acctbals - ,b <- amounts $ normaliseMixedAmountSquashPricesForDisplay mb - ] - ++ [posting{paccount="equity:closing balances", pamount=negate balancingamt}] - putStr $ showTransaction (nulltransaction{tdate=addDays (-1) enddate, tdescription="closing balances", tpostings=nps}) - putStr $ showTransaction (nulltransaction{tdate=enddate, tdescription="opening balances", tpostings=ps}) diff --git a/hledger/Hledger/Cli/Commands.hs b/hledger/Hledger/Cli/Commands.hs index f7e27ce30..97ba76553 100644 --- a/hledger/Hledger/Cli/Commands.hs +++ b/hledger/Hledger/Cli/Commands.hs @@ -20,6 +20,7 @@ module Hledger.Cli.Commands ( ,module Hledger.Cli.Commands.Cashflow ,module Hledger.Cli.Commands.Checkdates ,module Hledger.Cli.Commands.Checkdupes + ,module Hledger.Cli.Commands.Equity ,module Hledger.Cli.Commands.Help ,module Hledger.Cli.Commands.Incomestatement ,module Hledger.Cli.Commands.Print @@ -51,6 +52,7 @@ import Hledger.Cli.Commands.Balancesheetequity import Hledger.Cli.Commands.Cashflow import Hledger.Cli.Commands.Checkdates import Hledger.Cli.Commands.Checkdupes +import Hledger.Cli.Commands.Equity import Hledger.Cli.Commands.Help import Hledger.Cli.Commands.Incomestatement import Hledger.Cli.Commands.Print diff --git a/hledger/Hledger/Cli/Commands/Equity.hs b/hledger/Hledger/Cli/Commands/Equity.hs new file mode 100755 index 000000000..ea1fdcc21 --- /dev/null +++ b/hledger/Hledger/Cli/Commands/Equity.hs @@ -0,0 +1,85 @@ +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE QuasiQuotes #-} + +module Hledger.Cli.Commands.Equity ( + equitymode + ,equity +) +where + +import Data.Maybe +import Data.String.Here +import Data.Time.Calendar +import Hledger +import Hledger.Cli.CliOptions + +equitymode = hledgerCommandMode + [here| equity +Print a "closing balances" transaction that brings all accounts (or with +query arguments, just the matched accounts) to a zero balance, followed by an +opposite "opening balances" transaction that restores the balances from zero. +Such transactions can be useful, eg, for bringing account balances across +file boundaries. + +FLAGS + +The opening balances transaction is useful to carry over +asset/liability balances if you choose to start a new journal file, +eg at the beginning of the year. + +The closing balances transaction is useful to zero out balances in +the old file, which gives you the option of reporting on both files +at once while still seeing correct balances. + +Balances are calculated, and the opening transaction is dated, as of +the report end date, which you should specify with -e or date: (and +the closing transaction is dated one day earlier). If a report end +date is not specified, it defaults to today. + +Example: +```shell +$ hledger equity -f 2015.journal -e 2016/1/1 assets liabilities >>2015.journal +# move the opening balances transaction to 2016.journal +$ hledger -f 2015.journal bal assets liabilities not:desc:closing # shows correct 2015 balances +$ hledger -f 2016.journal bal assets liabilities # shows correct 2016 balances +$ hledger -f 2015.journal -f 2016.journal bal assets liabilities # still shows correct 2016 balances +``` +Open question: how to handle txns spanning a file boundary ? Eg: +```journal +2015/12/30 * food + expenses:food:dining $10 + assets:bank:checking -$10 ; date:2016/1/4 +``` +This command might or might not have some connection to the concept of +"closing the books" in accounting. + |] + [] + [generalflagsgroup1] + [] + ([], Just $ argsFlag "[QUERY]") + +equity CliOpts{reportopts_=ropts} j = do + today <- getCurrentDay + let ropts_ = ropts{accountlistmode_=ALFlat} + q = queryFromOpts today ropts_ + (acctbals,_) = balanceReport ropts_ q j + balancingamt = negate $ sum $ map (\(_,_,_,b) -> normaliseMixedAmountSquashPricesForDisplay b) acctbals + ps = [posting{paccount=a + ,pamount=mixed [b] + ,pbalanceassertion=Just b + } + |(a,_,_,mb) <- acctbals + ,b <- amounts $ normaliseMixedAmountSquashPricesForDisplay mb + ] + ++ [posting{paccount="equity:opening balances", pamount=balancingamt}] + enddate = fromMaybe today $ queryEndDate (date2_ ropts_) q + nps = [posting{paccount=a + ,pamount=mixed [negate b] + ,pbalanceassertion=Just b{aquantity=0} + } + |(a,_,_,mb) <- acctbals + ,b <- amounts $ normaliseMixedAmountSquashPricesForDisplay mb + ] + ++ [posting{paccount="equity:closing balances", pamount=negate balancingamt}] + putStr $ showTransaction (nulltransaction{tdate=addDays (-1) enddate, tdescription="closing balances", tpostings=nps}) + putStr $ showTransaction (nulltransaction{tdate=enddate, tdescription="opening balances", tpostings=ps}) diff --git a/hledger/doc/addons.m4.md b/hledger/doc/addons.m4.md index c8287759a..cd35017b1 100644 --- a/hledger/doc/addons.m4.md +++ b/hledger/doc/addons.m4.md @@ -89,11 +89,6 @@ is an old pie chart generator, in need of some love. [hledger-check.hs](https://github.com/simonmichael/hledger/blob/master/bin/hledger-check.hs) checks more powerful account balance assertions. -### equity - -[hledger-equity.hs](https://github.com/simonmichael/hledger/blob/master/bin/hledger-equity.hs#L17) -prints balance-resetting transactions, useful for bringing account balances across file boundaries. - ### prices [hledger-prices.hs](https://github.com/simonmichael/hledger/blob/master/bin/hledger-prices.hs) diff --git a/hledger/doc/commands.m4.md b/hledger/doc/commands.m4.md index 1ac95e258..e96f7991d 100644 --- a/hledger/doc/commands.m4.md +++ b/hledger/doc/commands.m4.md @@ -346,9 +346,13 @@ Check that transactions are sorted by increasing date. With a query, only matched transactions' dates are checked. ## check-dupes -Reports account names having the same leaf but different prefixes. +Report account names having the same leaf but different prefixes. An example: http://stefanorodighiero.net/software/hledger-dupes.html +## equity +Print closing/opening transactions that bring some or all account balances to zero and back. +Can be useful for bringing account balances across file boundaries. + ## help Show any of the hledger manuals. diff --git a/hledger/hledger.cabal b/hledger/hledger.cabal index e41ac60fb..22ea251e9 100644 --- a/hledger/hledger.cabal +++ b/hledger/hledger.cabal @@ -131,6 +131,7 @@ library Hledger.Cli.Commands.Cashflow Hledger.Cli.Commands.Checkdates Hledger.Cli.Commands.Checkdupes + Hledger.Cli.Commands.Equity Hledger.Cli.Commands.Help Hledger.Cli.Commands.Incomestatement Hledger.Cli.Commands.Print diff --git a/hledger/package.yaml b/hledger/package.yaml index 27b843416..ba2561ad0 100644 --- a/hledger/package.yaml +++ b/hledger/package.yaml @@ -112,6 +112,7 @@ library: - Hledger.Cli.Commands.Cashflow - Hledger.Cli.Commands.Checkdates - Hledger.Cli.Commands.Checkdupes + - Hledger.Cli.Commands.Equity - Hledger.Cli.Commands.Help - Hledger.Cli.Commands.Incomestatement - Hledger.Cli.Commands.Print