{-# LANGUAGE NamedFieldPuns #-} module Hcompta.Format.Ledger.Balance where import Hcompta.Model (Transaction) import qualified Hcompta.Calc.Balance as Balance import qualified Hcompta.Format.Ledger.Journal as Journal import Hcompta.Format.Ledger.Journal (Journal(..)) import qualified Hcompta.Lib.Foldable as Lib.Foldable -- * The 'Balance.Deviation' type -- | Return the first 'Transaction' (if any) whose 'Posting's -- do not sum to a 'Balance' respecting 'Balance.is_inferrable', -- with the path of 'Journal's leading to that 'Transaction'. check_equilibrium :: Journal -> Maybe ((Transaction, Balance.Deviation), [Journal]) check_equilibrium = Journal.find (\Journal{Journal.transactions} -> Lib.Foldable.find (Lib.Foldable.find (\tr -> do let bal = Balance.transaction tr Balance.nil let dev = Balance.deviation bal if Balance.is_equilibrium_inferrable dev then Nothing else Just (tr, dev) ) ) transactions )