add: better handling of virtual postings and default amounts

This commit is contained in:
Simon Michael 2009-05-24 06:54:12 +00:00
parent 8cb526f655
commit 9b8f00b54e

View File

@ -96,7 +96,7 @@ getPostings bestmatchps enteredps = do
else do else do
(amountstr, eoi) <- askFor (printf "amount %d" n) defaultamount validateamount (amountstr, eoi) <- askFor (printf "amount %d" n) defaultamount validateamount
let amount = fromparse $ parse (someamount <|> return missingamt) "" amountstr let amount = fromparse $ parse (someamount <|> return missingamt) "" amountstr
let p = nullrawposting{paccount=account,pamount=amount} let p = nullrawposting{paccount=stripbrackets account,pamount=amount,ptype=postingaccounttype account}
if eoi if eoi
then if null enteredps then if null enteredps
then return ([], True) then return ([], True)
@ -106,14 +106,21 @@ getPostings bestmatchps enteredps = do
else getPostings bestmatchps $ enteredps ++ [p] else getPostings bestmatchps $ enteredps ++ [p]
where where
n = length enteredps + 1 n = length enteredps + 1
realn = length enteredrealps + 1
bestmatch | isNothing bestmatchps = Nothing bestmatch | isNothing bestmatchps = Nothing
| n <= length ps = Just $ ps !! (n-1) | n <= length ps = Just $ ps !! (n-1)
| otherwise = Nothing | otherwise = Nothing
where Just ps = bestmatchps where Just ps = bestmatchps
defaultaccount = maybe Nothing (Just . paccount) bestmatch defaultaccount = maybe Nothing (Just . showacctname) bestmatch
showacctname p = showAccountName Nothing (ptype p) $ paccount p
validateaccount = Just $ \s -> not $ null s validateaccount = Just $ \s -> not $ null s
defaultamount | n==1 = maybe Nothing (Just . show . pamount) bestmatch -- previously used amount defaultamount = maybe balancingamount (Just . show . pamount) bestmatch
| otherwise = Just $ show $ negate $ sum $ map pamount enteredps -- balancing amount where balancingamount = Just $ show $ negate $ sum $ map pamount enteredrealps
enteredrealps = filter isReal enteredps
postingaccounttype ('[':_) = BalancedVirtualPosting
postingaccounttype ('(':_) = VirtualPosting
postingaccounttype _ = RegularPosting
stripbrackets = dropWhile (`elem` "([") . reverse . dropWhile (`elem` "])") . reverse
validateamount = Just $ \s -> validateamount = Just $ \s ->
(null s && (not $ null enteredps)) || (null s && (not $ null enteredps)) ||
(isRight $ parse (someamount>>many spacenonewline>>eof) "" s) (isRight $ parse (someamount>>many spacenonewline>>eof) "" s)