Correction : CLI.Command.Balance : détermine is_worth avant d’appliquer balance_filter.
[comptalang.git] / lib / Hcompta / Format / Ledger.hs
index 7e235ea86dc6c722d73cc10ec6f8b1101558a3e9..e2374175b9c9259f24daa10cdd5bc0812b9660a5 100644 (file)
@@ -1,28 +1,30 @@
 {-# 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
@@ -83,13 +85,32 @@ transaction =
         , 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]
 
@@ -133,27 +154,32 @@ posting acct =
 
 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
@@ -192,7 +218,7 @@ type Tag = (Tag_Name, Tag_Value)
 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