packages feed

Hastructure-0.50.3: src/Triggers.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE DeriveGeneric #-}

module Triggers(
    Trigger(..),TriggerEffect(..),TriggerName,trgStatusLens
)
 where

import qualified Data.Text as T
import qualified Stmt as S
import qualified Liability as L
import Text.Read (readMaybe)
import Lib 
import Types
import Accounts (ReserveAmount)
import Waterfall (Action)
import Data.Aeson ( defaultOptions )
import Language.Haskell.TH
import Data.Aeson.TH
import Data.Aeson.Types
import Data.Fixed
import Data.Maybe
import Data.Map
import GHC.Generics
import Control.Lens
import Deal.DealCollection (CollectionRule(..))

type TriggerName = String

data TriggerEffect = DealStatusTo DealStatus                           -- ^ change deal status
                   | DoAccrueFee FeeNames                              -- ^ accure fee
                   | AddTrigger Trigger                                -- ^ add a new trigger
                   | ChangeReserveBalance String ReserveAmount         -- ^ update reserve target balance  
                   | CloseDeal (Int, DatePattern) (Int, DatePattern)
                               (PricingMethod, AccountName, Maybe DealStats)   
                               (Maybe [CollectionRule])                -- ^ close the deal
                   | BuyAsset AccountName PricingMethod                -- ^ buy asset from the assumption using funds from account
                   | ChangeBondRate BondName L.InterestInfo IRate      -- ^ change bond rate
                   | TriggerEffects [TriggerEffect]                    -- ^ a combination of effects above
                   | RunActions [Action]                               -- ^ run a list of waterfall actions
                   | DoNothing                                         -- ^ do nothing
                   deriving (Show, Eq, Generic,Ord)
 
data Trigger = Trigger {
            trgCondition :: Pre                       -- ^ condition to trigger 
            ,trgEffects :: TriggerEffect              -- ^ what happen if it was triggered
            ,trgStatus :: Bool                        -- ^ if it is triggered or not 
            ,trgCurable :: Bool                       -- ^ if it is curable trigger
            ,trgStmt :: Maybe S.Statement             -- ^ Transaction stmt
            } deriving (Show, Eq, Generic,Ord)

makeLensesFor [("trgStatus","trgStatusLens") 
                ,("trgEffects","trgEffectsLens") 
                ,("trgCondition","trgConditionLens") 
                ,("trgCurable","trgCurableLens")] ''Trigger

$(concat <$> traverse (deriveJSON defaultOptions) [''TriggerEffect, ''Trigger])