;csv: refactor transactionFromCsvRecord
This commit is contained in:
parent
2dd6e2d797
commit
bc4ea83d86
@ -849,35 +849,32 @@ transactionFromCsvRecord sourcepos rules record = t
|
|||||||
("account"++n) ("amount"++n) ("amount"++n++"-in")
|
("account"++n) ("amount"++n) ("amount"++n++"-in")
|
||||||
("amount"++n++"-out") ("balance"++n) ("comment"++n) t
|
("amount"++n++"-out") ("balance"++n) ("comment"++n) t
|
||||||
|
|
||||||
-- Adjust the postings to mimic some pre-1.16 behaviour, for compatibility.
|
-- Auto-generate a second posting or second posting amount,
|
||||||
-- And also, wherever default "unknown" accounts were used, refine these
|
-- for compatibility with pre-1.16 rules.
|
||||||
-- based on the sign of the posting amount if it's known.
|
|
||||||
-- XXX split
|
|
||||||
postings' =
|
postings' =
|
||||||
case postings of
|
case postings of
|
||||||
-- when rules generate just one posting, and it's a type that needs to
|
-- when rules generate just one posting, of a kind that needs to be
|
||||||
-- be balanced, generate the second posting to balance it.
|
-- balanced, generate the second posting to balance it.
|
||||||
[(p1,final)] ->
|
[p1@(p1',_)] ->
|
||||||
if ptype p1 == VirtualPosting
|
if ptype p1' == VirtualPosting then [p1] else [p1, p2]
|
||||||
then [improveUnless final p1]
|
|
||||||
else [improveUnless final p1, improveUnknownAccountName p2]
|
|
||||||
where
|
where
|
||||||
p2 = nullposting{paccount=unknownExpenseAccount
|
p2 = (nullposting{paccount=unknownExpenseAccount
|
||||||
,pamount=costOfMixedAmount (-pamount p1)
|
,pamount=costOfMixedAmount (-pamount p1')
|
||||||
,ptransaction=Just t}
|
,ptransaction=Just t}, False)
|
||||||
|
|
||||||
-- when rules generate exactly two postings, and only the second has
|
-- when rules generate exactly two postings, and only the second has
|
||||||
-- no amount, give it the balancing amount.
|
-- no amount, give it the balancing amount.
|
||||||
[(p1,final1), (p2,final2)] ->
|
[p1@(p1',_), p2@(p2',final2)] ->
|
||||||
if hasAmount p1 && not (hasAmount p2)
|
if hasAmount p1' && not (hasAmount p2')
|
||||||
then [improveUnless final1 p1, improveUnless final2 p2{pamount=costOfMixedAmount(-(pamount p1))}]
|
then [p1, (p2'{pamount=costOfMixedAmount(-(pamount p1'))}, final2)]
|
||||||
else [improveUnless final1 p1, improveUnless final2 p2]
|
else [p1, p2]
|
||||||
|
--
|
||||||
-- otherwise, just refine any unknown account names.
|
ps -> ps
|
||||||
ps -> [improveUnless final p | (p,final) <- ps]
|
|
||||||
|
|
||||||
|
-- Finally, wherever default "unknown" accounts were used, refine them
|
||||||
|
-- based on the sign of the posting amount if it's now known.
|
||||||
|
postings'' = map maybeImprove postings'
|
||||||
where
|
where
|
||||||
improveUnless final = if final then id else improveUnknownAccountName
|
maybeImprove (p,final) = if final then p else improveUnknownAccountName p
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
-- 4. Build the transaction (and name it, so the postings can reference it).
|
-- 4. Build the transaction (and name it, so the postings can reference it).
|
||||||
@ -891,7 +888,7 @@ transactionFromCsvRecord sourcepos rules record = t
|
|||||||
,tdescription = T.pack description
|
,tdescription = T.pack description
|
||||||
,tcomment = T.pack comment
|
,tcomment = T.pack comment
|
||||||
,tprecedingcomment = T.pack precomment
|
,tprecedingcomment = T.pack precomment
|
||||||
,tpostings = postings'
|
,tpostings = postings''
|
||||||
}
|
}
|
||||||
|
|
||||||
-- | Given CSV rules and a CSV record, generate the corresponding transaction's
|
-- | Given CSV rules and a CSV record, generate the corresponding transaction's
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user