lib: csv parser support for 'balance2', 'balance' renamed to 'balance1'
This commit is contained in:
parent
489b7fd870
commit
3c3200fa66
@ -563,6 +563,8 @@ journalfieldnames = [
|
|||||||
,"amount-in"
|
,"amount-in"
|
||||||
,"amount-out"
|
,"amount-out"
|
||||||
,"amount"
|
,"amount"
|
||||||
|
,"balance1"
|
||||||
|
,"balance2"
|
||||||
,"balance"
|
,"balance"
|
||||||
,"code"
|
,"code"
|
||||||
,"comment"
|
,"comment"
|
||||||
@ -712,7 +714,7 @@ transactionFromCsvRecord sourcepos rules record = t
|
|||||||
]
|
]
|
||||||
amount1 = case maybeamount of
|
amount1 = case maybeamount of
|
||||||
Just a -> a
|
Just a -> a
|
||||||
Nothing | balance /= Nothing -> nullmixedamt
|
Nothing | balance1 /= Nothing || balance2 /= Nothing -> nullmixedamt
|
||||||
Nothing -> error' $ "amount and balance have no value\n"++showRecord record
|
Nothing -> error' $ "amount and balance have no value\n"++showRecord record
|
||||||
-- convert balancing amount to cost like hledger print, so eg if
|
-- convert balancing amount to cost like hledger print, so eg if
|
||||||
-- amount1 is "10 GBP @@ 15 USD", amount2 will be "-15 USD".
|
-- amount1 is "10 GBP @@ 15 USD", amount2 will be "-15 USD".
|
||||||
@ -724,14 +726,21 @@ transactionFromCsvRecord sourcepos rules record = t
|
|||||||
_ -> "expenses:unknown"
|
_ -> "expenses:unknown"
|
||||||
account1 = T.pack $ maybe "" render (mfieldtemplate "account1") `or` defaccount1
|
account1 = T.pack $ maybe "" render (mfieldtemplate "account1") `or` defaccount1
|
||||||
account2 = T.pack $ maybe "" render (mfieldtemplate "account2") `or` defaccount2
|
account2 = T.pack $ maybe "" render (mfieldtemplate "account2") `or` defaccount2
|
||||||
balance = maybe Nothing (parsebalance.render) $ mfieldtemplate "balance"
|
balance1template =
|
||||||
parsebalance str
|
case (mfieldtemplate "balance", mfieldtemplate "balance1") of
|
||||||
|
(Nothing, Nothing) -> Nothing
|
||||||
|
(balance, Nothing) -> balance
|
||||||
|
(Nothing, balance1) -> balance1
|
||||||
|
(Just _, Just _) -> error' "Please use either balance or balance1, but not both"
|
||||||
|
balance1 = maybe Nothing (parsebalance "1".render) $ balance1template
|
||||||
|
balance2 = maybe Nothing (parsebalance "2".render) $ mfieldtemplate "balance2"
|
||||||
|
parsebalance n str
|
||||||
| all isSpace str = Nothing
|
| all isSpace str = Nothing
|
||||||
| otherwise = Just $ (either (balanceerror str) id $ runParser (evalStateT (amountp <* eof) mempty) "" $ T.pack $ (currency++) $ simplifySign str, nullsourcepos)
|
| otherwise = Just $ (either (balanceerror n str) id $ runParser (evalStateT (amountp <* eof) mempty) "" $ T.pack $ (currency++) $ simplifySign str, nullsourcepos)
|
||||||
balanceerror str err = error' $ unlines
|
balanceerror n str err = error' $ unlines
|
||||||
["error: could not parse \""++str++"\" as balance amount"
|
["error: could not parse \""++str++"\" as balance"++n++" amount"
|
||||||
,showRecord record
|
,showRecord record
|
||||||
,"the balance rule is: "++(fromMaybe "" $ mfieldtemplate "balance")
|
,"the balance"++n++" rule is: "++(fromMaybe "" $ mfieldtemplate ("balance"++n))
|
||||||
,"the currency rule is: "++(fromMaybe "unspecified" $ mfieldtemplate "currency")
|
,"the currency rule is: "++(fromMaybe "unspecified" $ mfieldtemplate "currency")
|
||||||
,"the default-currency is: "++fromMaybe "unspecified" mdefaultcurrency
|
,"the default-currency is: "++fromMaybe "unspecified" mdefaultcurrency
|
||||||
,"the parse error is: "++customErrorBundlePretty err
|
,"the parse error is: "++customErrorBundlePretty err
|
||||||
@ -748,8 +757,8 @@ transactionFromCsvRecord sourcepos rules record = t
|
|||||||
tcomment = T.pack comment,
|
tcomment = T.pack comment,
|
||||||
tprecedingcomment = T.pack precomment,
|
tprecedingcomment = T.pack precomment,
|
||||||
tpostings =
|
tpostings =
|
||||||
[posting {paccount=account1, pamount=amount1, ptransaction=Just t, pbalanceassertion=toAssertion <$> balance}
|
[posting {paccount=account1, pamount=amount1, ptransaction=Just t, pbalanceassertion=toAssertion <$> balance1}
|
||||||
,posting {paccount=account2, pamount=amount2, ptransaction=Just t}
|
,posting {paccount=account2, pamount=amount2, ptransaction=Just t, pbalanceassertion=toAssertion <$> balance2}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
toAssertion (a, b) = assertion{
|
toAssertion (a, b) = assertion{
|
||||||
|
|||||||
@ -111,6 +111,27 @@
|
|||||||
>>>2
|
>>>2
|
||||||
>>>=0
|
>>>=0
|
||||||
|
|
||||||
|
# 9. read CSV with balance2 field
|
||||||
|
printf 'fields date, description, amount, balance2\ndate-format %%d/%%Y/%%m\ncurrency $\naccount1 assets:myacct\n' >t.$$.csv.rules; printf '10/2009/09,Flubber Co,50,123\n' | hledger -f csv:- --rules-file t.$$.csv.rules print && rm -rf t.$$.csv.rules
|
||||||
|
>>>
|
||||||
|
2009/09/10 Flubber Co
|
||||||
|
assets:myacct $50
|
||||||
|
income:unknown $-50 = $123
|
||||||
|
|
||||||
|
>>>2
|
||||||
|
>>>=0
|
||||||
|
|
||||||
|
# 10. read CSV with balance1 and balance2 fields
|
||||||
|
printf 'fields date, description, amount, balance1, balance2\ndate-format %%d/%%Y/%%m\ncurrency $\naccount1 assets:myacct\n' >t.$$.csv.rules; printf '10/2009/09,Flubber Co,50,321,123\n' | hledger -f csv:- --rules-file t.$$.csv.rules print && rm -rf t.$$.csv.rules
|
||||||
|
>>>
|
||||||
|
2009/09/10 Flubber Co
|
||||||
|
assets:myacct $50 = $321
|
||||||
|
income:unknown $-50 = $123
|
||||||
|
|
||||||
|
>>>2
|
||||||
|
>>>=0
|
||||||
|
|
||||||
|
|
||||||
# 9. TODO: without --separator gives obscure error
|
# 9. TODO: without --separator gives obscure error
|
||||||
# |
|
# |
|
||||||
# 1 | 10/2009/09;Flubber Co🎅;50;
|
# 1 | 10/2009/09;Flubber Co🎅;50;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user