add: use command line arguments as defaults for first txn (part 2)
It seems I missed some.
This commit is contained in:
		
							parent
							
								
									bf91efda7c
								
							
						
					
					
						commit
						4f1ce14033
					
				@ -17,8 +17,8 @@ import Control.Monad.Trans (liftIO)
 | 
				
			|||||||
import Data.Char (toUpper)
 | 
					import Data.Char (toUpper)
 | 
				
			||||||
import Data.List
 | 
					import Data.List
 | 
				
			||||||
import Data.Maybe
 | 
					import Data.Maybe
 | 
				
			||||||
import Data.Time.Calendar
 | 
					 | 
				
			||||||
import Data.Typeable (Typeable)
 | 
					import Data.Typeable (Typeable)
 | 
				
			||||||
 | 
					import Safe (headDef, tailDef, headMay)
 | 
				
			||||||
import System.Console.Haskeline (InputT, runInputT, defaultSettings, setComplete, getInputLine)
 | 
					import System.Console.Haskeline (InputT, runInputT, defaultSettings, setComplete, getInputLine)
 | 
				
			||||||
import System.Console.Haskeline.Completion
 | 
					import System.Console.Haskeline.Completion
 | 
				
			||||||
import System.IO ( stderr, hPutStrLn )
 | 
					import System.IO ( stderr, hPutStrLn )
 | 
				
			||||||
@ -58,44 +58,51 @@ add opts j
 | 
				
			|||||||
    ,"To record a transaction, enter . when prompted."
 | 
					    ,"To record a transaction, enter . when prompted."
 | 
				
			||||||
    ,"To quit, press control-d or control-c."
 | 
					    ,"To quit, press control-d or control-c."
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
  today <- getCurrentDay
 | 
					  today <- showDate `fmap` getCurrentDay
 | 
				
			||||||
  getAndAddTransactions j opts today
 | 
					  let args = words' $ query_ $ reportopts_ opts
 | 
				
			||||||
 | 
					      (defdate, moredefs) = headTailDef today args
 | 
				
			||||||
 | 
					  getAndAddTransactions j opts defdate moredefs
 | 
				
			||||||
        `C.catch` (\e -> unless (isEOFError e) $ ioError e)
 | 
					        `C.catch` (\e -> unless (isEOFError e) $ ioError e)
 | 
				
			||||||
      where f = journalFilePath j
 | 
					      where f = journalFilePath j
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					headTailDef :: a -> [a] -> (a,[a])
 | 
				
			||||||
 | 
					headTailDef defhead as = (headDef defhead as, tailDef [] as)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- | Read a number of transactions from the command line, prompting,
 | 
					-- | Read a number of transactions from the command line, prompting,
 | 
				
			||||||
-- validating, displaying and appending them to the journal file, until
 | 
					-- validating, displaying and appending them to the journal file, until
 | 
				
			||||||
-- end of input (then raise an EOF exception). Any command-line arguments
 | 
					-- end of input (then raise an EOF exception). Any command-line arguments
 | 
				
			||||||
-- are used as the first transaction's description.
 | 
					-- are used as the first transaction's description.
 | 
				
			||||||
getAndAddTransactions :: Journal -> CliOpts -> Day -> IO ()
 | 
					getAndAddTransactions :: Journal -> CliOpts -> String -> [String] -> IO ()
 | 
				
			||||||
getAndAddTransactions j opts defaultDate = do
 | 
					getAndAddTransactions j opts defdate moredefs = do
 | 
				
			||||||
  (t, d) <- getTransaction j opts defaultDate
 | 
					  (t, defdate') <- getTransaction j opts defdate moredefs
 | 
				
			||||||
  j <- journalAddTransaction j opts t
 | 
					  j <- journalAddTransaction j opts t
 | 
				
			||||||
  hPrintf stderr "\nRecorded transaction:\n%s" (show t)
 | 
					  hPrintf stderr "\nRecorded transaction:\n%s" (show t)
 | 
				
			||||||
  getAndAddTransactions j opts d
 | 
					  getAndAddTransactions j opts defdate' []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- | Read a transaction from the command line, with history-aware prompting.
 | 
					-- | Read a transaction from the command line, with history-aware prompting.
 | 
				
			||||||
getTransaction :: Journal -> CliOpts -> Day -> IO (Transaction,Day)
 | 
					-- A default date, and zero or more defaults for subsequent fields, are provided.
 | 
				
			||||||
getTransaction j opts defaultDate = do
 | 
					getTransaction :: Journal -> CliOpts -> String -> [String] -> IO (Transaction,String)
 | 
				
			||||||
 | 
					getTransaction j opts defdate moredefs = do
 | 
				
			||||||
  datestr <- runInteractionDefault $ askFor "date"
 | 
					  datestr <- runInteractionDefault $ askFor "date"
 | 
				
			||||||
            (Just $ showDate defaultDate)
 | 
					            (Just defdate)
 | 
				
			||||||
            (Just $ \s -> null s
 | 
					            (Just $ \s -> null s
 | 
				
			||||||
                         || s == "."
 | 
					                         || s == "."
 | 
				
			||||||
                         || isRight (parse (smartdate >> many spacenonewline >> eof) "" $ lowercase s))
 | 
					                         || isRight (parse (smartdate >> many spacenonewline >> eof) "" $ lowercase s))
 | 
				
			||||||
  when (datestr == ".") $ ioError $ mkIOError eofErrorType "" Nothing Nothing
 | 
					  when (datestr == ".") $ ioError $ mkIOError eofErrorType "" Nothing Nothing
 | 
				
			||||||
  description <- runInteractionDefault $ askFor "description" (Just "") Nothing
 | 
					  let (defdesc, moredefs') = headTailDef "" moredefs
 | 
				
			||||||
 | 
					  description <- runInteractionDefault $ askFor "description" (Just defdesc) Nothing
 | 
				
			||||||
  let restart = do hPrintf stderr "\nRestarting this transaction..\n\n"
 | 
					  let restart = do hPrintf stderr "\nRestarting this transaction..\n\n"
 | 
				
			||||||
                   getTransaction j opts defaultDate
 | 
					                   getTransaction j opts defdate moredefs'
 | 
				
			||||||
  if description == "<"
 | 
					  if description == "<"
 | 
				
			||||||
   then restart
 | 
					   then restart
 | 
				
			||||||
   else do
 | 
					   else do
 | 
				
			||||||
    mr <- getPostingsAndValidateTransaction j opts datestr description
 | 
					    mr <- getPostingsAndValidateTransaction j opts datestr description moredefs'
 | 
				
			||||||
    case mr of
 | 
					    case mr of
 | 
				
			||||||
      Nothing -> restart
 | 
					      Nothing -> restart
 | 
				
			||||||
      Just r  -> return r
 | 
					      Just r  -> return r
 | 
				
			||||||
 | 
					
 | 
				
			||||||
getPostingsAndValidateTransaction :: Journal -> CliOpts -> String -> String -> IO (Maybe (Transaction,Day))
 | 
					getPostingsAndValidateTransaction :: Journal -> CliOpts -> String -> String -> [String] -> IO (Maybe (Transaction,String))
 | 
				
			||||||
getPostingsAndValidateTransaction j opts datestr description = do
 | 
					getPostingsAndValidateTransaction j opts datestr description defargs = do
 | 
				
			||||||
  today <- getCurrentDay
 | 
					  today <- getCurrentDay
 | 
				
			||||||
  let historymatches = transactionsSimilarTo j (queryFromOpts today $ reportopts_ opts) description
 | 
					  let historymatches = transactionsSimilarTo j (queryFromOpts today $ reportopts_ opts) description
 | 
				
			||||||
      bestmatch | not (null defargs) || null historymatches = Nothing
 | 
					      bestmatch | not (null defargs) || null historymatches = Nothing
 | 
				
			||||||
@ -108,7 +115,7 @@ getPostingsAndValidateTransaction j opts datestr description = do
 | 
				
			|||||||
            else True
 | 
					            else True
 | 
				
			||||||
      existingaccts = journalAccountNames j
 | 
					      existingaccts = journalAccountNames j
 | 
				
			||||||
      getpostingsandvalidate = do
 | 
					      getpostingsandvalidate = do
 | 
				
			||||||
        ps <- getPostingsWithState (PostingState j accept True bestmatchpostings) []
 | 
					        ps <- getPostingsWithState (PostingState j accept True bestmatchpostings) [] defargs
 | 
				
			||||||
        let t = nulltransaction{tdate=date
 | 
					        let t = nulltransaction{tdate=date
 | 
				
			||||||
                               ,tstatus=False
 | 
					                               ,tstatus=False
 | 
				
			||||||
                               ,tdescription=description
 | 
					                               ,tdescription=description
 | 
				
			||||||
@ -118,10 +125,8 @@ getPostingsAndValidateTransaction j opts datestr description = do
 | 
				
			|||||||
              let msg' = capitalize msg
 | 
					              let msg' = capitalize msg
 | 
				
			||||||
              liftIO $ hPutStrLn stderr $ "\n" ++ msg' ++ "please re-enter."
 | 
					              liftIO $ hPutStrLn stderr $ "\n" ++ msg' ++ "please re-enter."
 | 
				
			||||||
              getpostingsandvalidate
 | 
					              getpostingsandvalidate
 | 
				
			||||||
        either retry (return . Just . flip (,) date) $ balanceTransaction Nothing t -- imprecise balancing
 | 
					        either retry (return . Just . flip (,) (showDate date)) $ balanceTransaction Nothing t -- imprecise balancing
 | 
				
			||||||
  unless (null historymatches) $ liftIO $ hPutStr stderr $
 | 
					  when (isJust bestmatch) $ liftIO $ hPrintf stderr "\nUsing this similar transaction for defaults:\n%s" (show $ fromJust bestmatch)
 | 
				
			||||||
    "\nSimilar transactions found, using the first for defaults:\n"
 | 
					 | 
				
			||||||
    ++ concatMap (\(n,t) -> printf "[%3d%%] %s" (round $ n*100 :: Int) (show t)) (take 3 historymatches)
 | 
					 | 
				
			||||||
  getpostingsandvalidate `catch` \(_::RestartEntryException) -> return Nothing
 | 
					  getpostingsandvalidate `catch` \(_::RestartEntryException) -> return Nothing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
data RestartEntryException = RestartEntryException deriving (Typeable,Show)
 | 
					data RestartEntryException = RestartEntryException deriving (Typeable,Show)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user