{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}
module Hcompta.Format.Ledger where
import Data.Data (Data(..))
-import Data.Typeable (Typeable)
-import Text.Parsec.Pos (SourcePos, initialPos)
-import qualified Data.Map.Strict as Data.Map
-import Data.Map.Strict (Map)
+import Data.Functor.Compose (Compose(..))
import qualified Data.List as Data.List
+import Data.Map.Strict (Map)
+import qualified Data.Map.Strict as Data.Map
+import Data.Text (Text)
import qualified Data.Time.Clock as Time
import qualified Data.Time.Clock.POSIX as Time
+import Data.Typeable (Typeable)
+import Text.Parsec.Pos (SourcePos, initialPos)
+import Hcompta.Account (Account)
+import Hcompta.Amount (Amount)
+import qualified Hcompta.Amount as Amount
+import qualified Hcompta.Balance as Balance
+import Hcompta.Date (Date)
+import qualified Hcompta.Date as Date
+import qualified Hcompta.Filter as Filter
import Hcompta.Lib.Parsec ()
-import qualified Hcompta.Calc.Balance as Balance
-import Hcompta.Model.Date (Date)
-import qualified Hcompta.Model.Date as Date
-import Hcompta.Model.Account (Account)
--- import qualified Hcompta.Model.Account as Account
-import Hcompta.Model.Amount (Amount)
-import qualified Hcompta.Model.Amount as Amount
-import qualified Hcompta.Model.Filter as Model.Filter
-import Data.Text (Text)
+import qualified Hcompta.GL as GL
type Code = Text
type Description = Text
, transaction_tags = Data.Map.empty
}
-instance Model.Filter.Transaction Transaction where
+instance Filter.Transaction Transaction where
type Transaction_Posting Transaction = Posting
transaction_date = fst . transaction_dates
transaction_description = transaction_description
transaction_postings = transaction_postings
transaction_tags = transaction_tags
+{-
+instance Filter.GL (GL.GL_Line Transaction) where
+ type GL_Amount (GL.GL_Line Transaction) = Amount
+ register_account = GL.posting_account . GL.register_line_posting
+ register_date = GL.transaction_date . GL.register_line_transaction
+ register_amount_positive = Amount.sum_positive . GL.posting_amount . GL.register_line_posting
+ register_amount_negative = Amount.sum_negative . GL.posting_amount . GL.register_line_posting
+ register_amount_balance = Amount.sum_balance . GL.posting_amount . GL.register_line_posting
+ register_sum_positive = Amount.sum_positive . GL.register_line_sum
+ register_sum_negative = Amount.sum_negative . GL.register_line_sum
+ register_sum_balance = Amount.sum_balance . GL.register_line_sum
+-}
+
+instance GL.Transaction Transaction where
+ type Transaction_Posting Transaction = Posting
+ type Transaction_Postings Transaction = Compose (Map Account) []
+ transaction_date = fst . transaction_dates
+ transaction_postings = Compose . transaction_postings
+
type Transaction_by_Date
= Data.Map.Map Date [Transaction]
instance
Balance.Posting Posting where
- type Posting_Amount Posting = Balance.Amount_Sum Amount
+ type Posting_Amount Posting = Amount.Sum Amount
posting_account = posting_account
- posting_amounts = Data.Map.map Balance.amount_sum . posting_amounts
+ posting_amounts = Data.Map.map Amount.sum . posting_amounts
posting_set_amounts amounts p =
- p { posting_amounts=Data.Map.map Balance.amount_sum_balance amounts }
+ p { posting_amounts=Data.Map.map Amount.sum_balance amounts }
-instance Model.Filter.Posting Posting where
+instance Filter.Posting Posting where
type Posting_Amount Posting = Amount
posting_account = posting_account
posting_amounts = posting_amounts
+instance GL.Posting Posting where
+ type Posting_Amount Posting = Amount.Sum (Map Amount.Unit Amount)
+ posting_account = posting_account
+ posting_amount = Amount.sum . posting_amounts
+
-- ** The 'Posting' mappings
type Posting_by_Account
- = Data.Map.Map Account [Posting]
+ = Map Account [Posting]
type Posting_by_Amount_and_Account
- = Data.Map.Map Amount.By_Unit Posting_by_Account
+ = Map Amount.By_Unit Posting_by_Account
type Posting_by_Signs_and_Account
- = Data.Map.Map Amount.Signs Posting_by_Account
+ = Map Amount.Signs Posting_by_Account
-- | Return a Data.'Data.Map.Map' associating the given 'Posting's with their respective 'Account'.
posting_by_Account :: [Posting] -> Posting_by_Account
type Tag_Name = Text
type Tag_Value = Text
-type Tag_by_Name = Data.Map.Map Tag_Name [Tag_Value]
+type Tag_by_Name = Map Tag_Name [Tag_Value]
-- | Return a 'Data.Map.Map' associating the 'Value's of the given 'Tag's with their respective 'Name'.
tag_by_Name :: [Tag] -> Tag_by_Name