budget: new addon
This commit is contained in:
		
							parent
							
								
									71a9cf6bc5
								
							
						
					
					
						commit
						2d9259ab3a
					
				
							
								
								
									
										1
									
								
								bin/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								bin/.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,3 +1,4 @@ | |||||||
|  | hledger-budget | ||||||
| hledger-chart | hledger-chart | ||||||
| hledger-check-dates | hledger-check-dates | ||||||
| hledger-dupes | hledger-dupes | ||||||
|  | |||||||
							
								
								
									
										57
									
								
								bin/hledger-budget.hs
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										57
									
								
								bin/hledger-budget.hs
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,57 @@ | |||||||
|  | #!/usr/bin/env stack | ||||||
|  | {- stack runghc --verbosity info | ||||||
|  |   --package hledger-lib | ||||||
|  |   --package hledger | ||||||
|  |   --package text | ||||||
|  | -} | ||||||
|  | {-# LANGUAGE OverloadedStrings #-} | ||||||
|  | import Data.List | ||||||
|  | import System.Console.CmdArgs | ||||||
|  | import Hledger.Cli | ||||||
|  | import Hledger.Cli.Main (mainmode) | ||||||
|  | import Hledger.Data.AutoTransaction | ||||||
|  | 
 | ||||||
|  | actions :: [(Mode RawOpts, CliOpts -> IO ())] | ||||||
|  | actions = | ||||||
|  |     [ (manmode, man) | ||||||
|  |     , (infomode, info') | ||||||
|  |     , (balancemode, flip withJournalDo' balance) | ||||||
|  |     , (balancesheetmode, flip withJournalDo' balancesheet) | ||||||
|  |     , (cashflowmode, flip withJournalDo' cashflow) | ||||||
|  |     , (incomestatementmode, flip withJournalDo' incomestatement) | ||||||
|  |     , (registermode, flip withJournalDo' register) | ||||||
|  |     , (printmode, flip withJournalDo' print') | ||||||
|  |     ] | ||||||
|  | 
 | ||||||
|  | cmdmode :: Mode RawOpts | ||||||
|  | cmdmode = (mainmode []) | ||||||
|  |     { modeNames = ["hledger-budget"] | ||||||
|  |     , modeGroupModes = Group | ||||||
|  |         { groupUnnamed = map fst actions | ||||||
|  |         , groupNamed = [] | ||||||
|  |         , groupHidden = [] | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | journalBalanceTransactions' :: CliOpts -> Journal -> IO Journal | ||||||
|  | journalBalanceTransactions' opts j = do | ||||||
|  |     let assrt = not $ ignore_assertions_ opts | ||||||
|  |     either error' return $ journalBalanceTransactions assrt j | ||||||
|  | 
 | ||||||
|  | withJournalDo' :: CliOpts -> (CliOpts -> Journal -> IO ()) -> IO () | ||||||
|  | withJournalDo' opts = withJournalDo opts . wrapper where | ||||||
|  |     wrapper f opts' j = f opts' =<< journalBalanceTransactions' opts' j{ jtxns = ts' } where | ||||||
|  |         -- use original transactions as input for journalBalanceTransactions to re-infer balances/prices | ||||||
|  |         modifier = originalTransaction . foldr (flip (.) . fmap txnTieKnot . runModifierTransaction Any) id mtxns | ||||||
|  |         mtxns = jmodifiertxns j | ||||||
|  |         ts' = map modifier $ jtxns j | ||||||
|  | 
 | ||||||
|  | main :: IO () | ||||||
|  | main = do | ||||||
|  |     rawopts <- fmap decodeRawOpts . processArgs $ cmdmode | ||||||
|  |     opts <- rawOptsToCliOpts rawopts | ||||||
|  |     let cmd = command_ opts | ||||||
|  |     case find (\e -> cmd `elem` modeNames (fst e)) actions of | ||||||
|  |         Just (amode, _) | "h" `elem` map fst (rawopts_ opts) -> print amode | ||||||
|  |         Just (_, action) -> action opts | ||||||
|  |         Nothing -> print cmdmode | ||||||
							
								
								
									
										115
									
								
								tests/bin/budget.test
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								tests/bin/budget.test
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,115 @@ | |||||||
|  | # Test budget addon | ||||||
|  | 
 | ||||||
|  | # Rewrite rules within journal always applied | ||||||
|  | runghc ../../bin/hledger-budget.hs bal -f - --no-total -DH budget | ||||||
|  | <<< | ||||||
|  | = ^assets:bank$ date:2017/1 amt:<0 | ||||||
|  |     assets:bank  *0.008 | ||||||
|  |     expenses:fee  *-0.008  ; cash withdraw fee | ||||||
|  | = ^expenses:housing | ||||||
|  |     (budget:housing)  *-1 | ||||||
|  | = ^expenses:grocery ^expenses:food | ||||||
|  |     (budget:food)  *-1 | ||||||
|  | 
 | ||||||
|  | 2016/12/31 | ||||||
|  |     expenses:housing  $600 | ||||||
|  |     assets:cash | ||||||
|  | 
 | ||||||
|  | 2017/1/1 | ||||||
|  |     expenses:food  $20 | ||||||
|  |     expenses:leisure  $15 | ||||||
|  |     expenses:grocery  $30 | ||||||
|  |     assets:cash | ||||||
|  | 
 | ||||||
|  | 2017/1/2 | ||||||
|  |     assets:cash  $200.00 | ||||||
|  |     assets:bank | ||||||
|  | 
 | ||||||
|  | 2017/2/1 | ||||||
|  |     assets:cash  $100.00 | ||||||
|  |     assets:bank | ||||||
|  | 
 | ||||||
|  | ; order with normal entries doesn't matter | ||||||
|  | ; but relative order matters to refer-rewritten transactions | ||||||
|  | = ^expenses not:housing not:grocery not:food | ||||||
|  |     (budget:misc)  *-1 | ||||||
|  | >>> | ||||||
|  | Ending balances (historical) in 2016/12/31-2017/01/02: | ||||||
|  | 
 | ||||||
|  |                 ||  2016/12/31  2017/01/01  2017/01/02  | ||||||
|  | ================++===================================== | ||||||
|  |  budget:food    ||           0     $-50.00     $-50.00  | ||||||
|  |  budget:housing ||    $-600.00    $-600.00    $-600.00  | ||||||
|  |  budget:misc    ||           0     $-15.00     $-16.60  | ||||||
|  | 
 | ||||||
|  | >>>2 | ||||||
|  | >>>=0 | ||||||
|  | 
 | ||||||
|  | # Rewrite rules can chain one another according to order of definition | ||||||
|  | runghc ../../bin/hledger-budget.hs reg -f - | ||||||
|  | <<< | ||||||
|  | 
 | ||||||
|  | ; unfortunately date override in posting comment doesn't work | ||||||
|  | 
 | ||||||
|  | = liabilities:credit amt:<0 date:2016/12 | ||||||
|  |     liabilities:credit  *-1  ; [2017/1/1] | ||||||
|  |     assets:bank  *1  ; [2017/1/1] | ||||||
|  | 
 | ||||||
|  | = liabilities:credit amt:<0 date:2017/1 | ||||||
|  |     liabilities:credit  *-1  ; [2017/2/1] | ||||||
|  |     assets:bank  *1  ; [2017/2/1] | ||||||
|  | 
 | ||||||
|  | = liabilities:credit amt:<0 date:2017/2 | ||||||
|  |     liabilities:credit  *-1  ; [2017/3/1] | ||||||
|  |     assets:bank  *1  ; [2017/3/1] | ||||||
|  | 
 | ||||||
|  | = assets:bank date:2017/2 amt:<0 | ||||||
|  |     assets:bank  *0.008 | ||||||
|  |     expenses:fee  *-0.008  ; :salary-card: cash withdraw fee | ||||||
|  | 
 | ||||||
|  | = expenses:fee tag:salary-card date:2017-2017/12/26 | ||||||
|  |     income:compensate  *-0.5 | ||||||
|  |     assets:bank  *0.5  ; compensation from employer | ||||||
|  | 
 | ||||||
|  | 2016/12/31 | ||||||
|  |     expenses:housing  $600 | ||||||
|  |     liabilities:credit | ||||||
|  | 
 | ||||||
|  | 2017/1/1 | ||||||
|  |     expenses:food  $20 | ||||||
|  |     expenses:leisure  $15 | ||||||
|  |     expenses:grocery  $30 | ||||||
|  |     liabilities:credit | ||||||
|  | 
 | ||||||
|  | 2017/1/2 | ||||||
|  |     assets:cash  $200.00 | ||||||
|  |     liabilities:credit | ||||||
|  | 
 | ||||||
|  | 2017/2/1 | ||||||
|  |     assets:cash  $100.00 | ||||||
|  |     liabilities:credit | ||||||
|  | >>> | ||||||
|  | 2016/12/31                      expenses:housing           $600.00       $600.00 | ||||||
|  |                                 liabilities:credit        $-600.00             0 | ||||||
|  |                                 liabilities:credit         $600.00       $600.00 | ||||||
|  |                                 assets:bank               $-600.00             0 | ||||||
|  | 2017/01/01                      expenses:food               $20.00        $20.00 | ||||||
|  |                                 expenses:leisure            $15.00        $35.00 | ||||||
|  |                                 expenses:grocery            $30.00        $65.00 | ||||||
|  |                                 liabilities:credit         $-65.00             0 | ||||||
|  |                                 liabilities:credit          $65.00        $65.00 | ||||||
|  |                                 assets:bank                $-65.00             0 | ||||||
|  | 2017/01/02                      assets:cash                $200.00       $200.00 | ||||||
|  |                                 liabilities:credit        $-200.00             0 | ||||||
|  |                                 liabilities:credit         $200.00       $200.00 | ||||||
|  |                                 assets:bank               $-200.00             0 | ||||||
|  | 2017/02/01                      assets:cash                $100.00       $100.00 | ||||||
|  |                                 liabilities:credit        $-100.00             0 | ||||||
|  |                                 liabilities:credit         $100.00       $100.00 | ||||||
|  |                                 assets:bank               $-100.00             0 | ||||||
|  |                                 assets:bank                 $-0.80        $-0.80 | ||||||
|  |                                 expenses:fee                 $0.80             0 | ||||||
|  |                                 income:compensate           $-0.40        $-0.40 | ||||||
|  |                                 assets:bank                  $0.40             0 | ||||||
|  | >>>2 | ||||||
|  | >>>=0 | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user