mirror of
https://github.com/simonmichael/hledger.git
synced 2024-12-29 05:11:33 +03:00
journal: better errors and debug output for balance assertions
With --debug=2, better information about assertions is printed. Balance assertion errors now have a more standard and parseable layout. The asserted balance is now shown with the diff, let's see if that's better.
This commit is contained in:
parent
2d7a1904b4
commit
479a4138fe
@ -500,42 +500,47 @@ checkBalanceAssertionsForAccount ps
|
||||
checkBalanceAssertion :: ([String],MixedAmount) -> [Posting] -> ([String],MixedAmount)
|
||||
checkBalanceAssertion (errs,startbal) ps
|
||||
| null ps = (errs,startbal)
|
||||
| isNothing assertion = (errs,startbal)
|
||||
| -- bal' /= assertedbal -- MixedAmount's Eq instance currently gets confused by different precisions
|
||||
not $ isReallyZeroMixedAmount (actualbal - assertedbal) = (errs++[err], finalfullbal)
|
||||
| isNothing $ pbalanceassertion p = (errs,startbal)
|
||||
| iswrong = (errs++[err], finalfullbal)
|
||||
| otherwise = (errs,finalfullbal)
|
||||
where
|
||||
p = last ps
|
||||
assertion = pbalanceassertion p
|
||||
Just assertedbal = dbg2 "assertedbal" assertion
|
||||
assertedcomm = dbg2 "assertedcomm" $ maybe "" acommodity $ headMay $ amounts assertedbal
|
||||
finalfullbal = dbg2 "finalfullbal" $ sum $ [dbg2 "startbal" startbal] ++ map pamount ps
|
||||
finalsinglebal = dbg2 "finalsinglebal" $ filterMixedAmount (\a -> acommodity a == assertedcomm) finalfullbal
|
||||
Just assertedbal = pbalanceassertion p
|
||||
assertedcomm = maybe "" acommodity $ headMay $ amounts assertedbal
|
||||
finalfullbal = sum $ [startbal] ++ map pamount (dbg2 "ps" ps)
|
||||
finalsinglebal = filterMixedAmount (\a -> acommodity a == assertedcomm) finalfullbal
|
||||
actualbal = finalsinglebal -- just check the single-commodity balance, like Ledger; maybe add ==FULLBAL later
|
||||
diff = actualbal - assertedbal
|
||||
iswrong = dbgtrace 2 debugmsg $
|
||||
not (isReallyZeroMixedAmount (actualbal - assertedbal))
|
||||
-- bal' /= assertedbal -- MixedAmount's Eq instance currently gets confused by different precisions
|
||||
where
|
||||
debugmsg = "assertions: on " ++ show (postingDate p) ++ " balance of " ++ show assertedcomm
|
||||
++ " in " ++ T.unpack (paccount p) ++ " should be " ++ show assertedbal
|
||||
diff = assertedbal - actualbal
|
||||
diffplus | isNegativeMixedAmount diff == Just False = "+"
|
||||
| otherwise = ""
|
||||
err = printf (unlines [
|
||||
"a balance assertion failed on %s",
|
||||
"in account %s",
|
||||
"in commodity %s",
|
||||
"asserted balance is %s, calculated balance is %s (difference: %s)",
|
||||
"balance assertion error%s",
|
||||
"after posting:",
|
||||
"%s",
|
||||
"%s"
|
||||
"balance assertion details:",
|
||||
"date: %s",
|
||||
"account: %s",
|
||||
"commodity: %s",
|
||||
"calculated: %s",
|
||||
"asserted: %s (difference: %s)"
|
||||
])
|
||||
(case ptransaction p of
|
||||
Nothing -> ":" -- shouldn't happen
|
||||
Just t -> printf " in \"%s\" (line %d, column %d):\nin transaction:\n%s" f l c (chomp $ show t) :: String
|
||||
where GenericSourcePos f l c = tsourcepos t)
|
||||
(showPostingLine p)
|
||||
(showDate $ postingDate p)
|
||||
(T.unpack $ paccount p) -- XXX pack
|
||||
assertedcomm
|
||||
(showMixedAmount assertedbal)
|
||||
(showMixedAmount finalsinglebal)
|
||||
(showMixedAmount assertedbal)
|
||||
(diffplus ++ showMixedAmount diff)
|
||||
(showPostingLine p)
|
||||
(case ptransaction p of
|
||||
Nothing -> ""
|
||||
Just t -> printf "in transaction at %s line %d:\n%s" f l (show t) :: String
|
||||
where GenericSourcePos f l _ = tsourcepos t
|
||||
)
|
||||
|
||||
-- Given a sequence of postings to a single account, split it into
|
||||
-- sub-sequences consisting of ordinary postings followed by a single
|
||||
|
Loading…
Reference in New Issue
Block a user