cli: make equity a builtin command
This commit is contained in:
		
							parent
							
								
									fe9cd2a186
								
							
						
					
					
						commit
						4e6aa06b62
					
				| @ -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}) | ||||
| @ -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 | ||||
|  | ||||
							
								
								
									
										85
									
								
								hledger/Hledger/Cli/Commands/Equity.hs
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										85
									
								
								hledger/Hledger/Cli/Commands/Equity.hs
									
									
									
									
									
										Executable file
									
								
							| @ -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}) | ||||
| @ -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) | ||||
|  | ||||
| @ -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. | ||||
| 
 | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user