1 {-# LANGUAGE DeriveDataTypeable #-}
2 {-# LANGUAGE ScopedTypeVariables #-}
3 {-# OPTIONS_GHC -fno-warn-orphans #-}
4 module Hcompta.Model.Transaction.Posting where
7 import qualified Data.Foldable
8 import qualified Data.List
9 import qualified Data.Map.Strict as Data.Map
10 import Data.Text (Text)
11 import Data.Typeable ()
12 import Text.Parsec.Pos (SourcePos, initialPos)
14 import qualified Hcompta.Model.Account as Account ()
15 import Hcompta.Model.Account (Account)
16 import qualified Hcompta.Model.Amount as Amount
17 import Hcompta.Model.Date (Date)
18 import qualified Hcompta.Model.Transaction.Tag as Tag
20 -- * The 'Posting' type
25 , amounts :: Amount.By_Unit
26 , comments :: [Comment]
28 , sourcepos :: SourcePos
31 } deriving (Data, Eq, Read, Show, Typeable)
35 instance Read SourcePos where
36 readsPrec _ s = [(initialPos s, "")]
41 | Type_Virtual_Balanced
42 deriving (Data, Eq, Read, Show, Typeable)
44 -- ** Convenient constructors
50 , amounts = Data.Map.empty
54 , sourcepos = initialPos ""
55 , tags = Data.Map.empty
58 -- * The 'By_Account' mapping
61 = Data.Map.Map Account [Posting]
63 type By_Amount_and_Account
64 = Data.Map.Map Amount.By_Unit By_Account
66 type By_Signs_and_Account
67 = Data.Map.Map Amount.Signs By_Account
69 by_amount_and_account :: By_Account -> By_Amount_and_Account
70 by_amount_and_account =
76 (Data.Map.unionWith (++))
78 (Data.Map.singleton acct [p])))))
81 by_signs_and_account :: By_Account -> By_Signs_and_Account
82 by_signs_and_account =
88 (Data.Map.unionWith (++))
89 (Amount.signs $ amounts p)
90 (Data.Map.singleton acct [p])))))
93 -- ** Convenient constructors
95 -- | Return a tuple associating the given 'Posting' with its 'Account'.
96 by_account :: Posting -> (Account, Posting)
97 by_account posting = (account posting, posting)
99 -- | Return a Data.'Data.Map.Map' associating the given 'Posting's with their respective 'Account'.
100 from_List :: [Posting] -> By_Account
102 Data.Map.fromListWith (flip (++)) $
104 (\posting -> (account posting, [posting]))
109 -- | Return the 'Unit's in use within the given 'Posting's
111 :: Data.Foldable.Foldable m
117 Data.List.union acc .
119 (Data.Map.keys . amounts))