journal: split up the parts of journalFinalise, and use them as needed.

`journalFinalise` is only used in the `parseAndFinaliseJournal`
functions, but it needs to be run differently at different stages when
transaction modifiers are applied. This change breaks it into smaller
functions, and uses those smaller parts in `parseAndFinaliseJournal`
as needed.
This commit is contained in:
Jesse Rosenthal 2018-10-12 10:01:39 -04:00 committed by Simon Michael
parent 20f134c96b
commit 53b3e2bd94
2 changed files with 34 additions and 6 deletions

View File

@ -22,6 +22,9 @@ module Hledger.Data.Journal (
journalCommodityStyles, journalCommodityStyles,
journalConvertAmountsToCost, journalConvertAmountsToCost,
journalFinalise, journalFinalise,
journalReverse,
journalSetTime,
journalSetFilePath,
journalPivot, journalPivot,
-- * Filtering -- * Filtering
filterJournalTransactions, filterJournalTransactions,
@ -519,6 +522,23 @@ filterJournalTransactionsByAccount apats j@Journal{jtxns=ts} = j{jtxns=filter tm
-} -}
journalReverse :: Journal -> Journal
journalReverse j =
j {jfiles = reverse $ jfiles j
,jdeclaredaccounts = reverse $ jdeclaredaccounts j
,jtxns = reverse $ jtxns j
,jtxnmodifiers = reverse $ jtxnmodifiers j
,jperiodictxns = reverse $ jperiodictxns j
,jmarketprices = reverse $ jmarketprices j
}
journalSetTime :: ClockTime -> Journal -> Journal
journalSetTime t j = j{ jlastreadtime = t }
journalSetFilePath :: FilePath -> Text -> Journal -> Journal
journalSetFilePath path txt j = j {jfiles = (path,txt) : jfiles j}
-- | Do post-parse processing on a parsed journal to make it ready for -- | Do post-parse processing on a parsed journal to make it ready for
-- use. Reverse parsed data to normal order, standardise amount -- use. Reverse parsed data to normal order, standardise amount
-- formats, check/ensure that transactions are balanced, and maybe -- formats, check/ensure that transactions are balanced, and maybe

View File

@ -293,13 +293,21 @@ parseAndFinaliseJournal' parser iopts f txt = do
-- be false pending modifiers) and we don't reorder the second -- be false pending modifiers) and we don't reorder the second
-- time. If we are only running once, we reorder and follow the -- time. If we are only running once, we reorder and follow the
-- options for checking assertions. -- options for checking assertions.
let runFin :: Bool -> Bool -> (ParsedJournal -> Either String Journal) let fj = if auto_ iopts && (not . null . jtxnmodifiers) pj
runFin reorder ignore = journalFinalise t f txt reorder ignore
fj = if auto_ iopts && (not . null . jtxnmodifiers) pj
then applyTransactionModifiers <$> then applyTransactionModifiers <$>
runFin True False pj >>= (journalBalanceTransactions False $
runFin False (not $ ignore_assertions_ iopts) journalReverse $
else runFin True (not $ ignore_assertions_ iopts) pj journalApplyCommodityStyles pj) >>=
(\j -> journalBalanceTransactions (not $ ignore_assertions_ iopts) $
journalSetTime t $
journalSetFilePath f txt $
j)
else journalBalanceTransactions (not $ ignore_assertions_ iopts) $
journalReverse $
journalApplyCommodityStyles $
journalSetTime t $
journalSetFilePath f txt $
pj
in in
case fj of case fj of
Right j -> return j Right j -> return j