{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE LambdaCase #-} module Deal.DealDate (DealDates,getClosingDate,getFirstPayDate,getLastPayDate) where import qualified Data.Map as Map import Deal.DealBase import Types import Lib class DealDates a where getClosingDate :: a -> Either String Date getFirstPayDate :: a -> Date getLastPayDate :: a -> Either String Date instance DealDates DateDesp where getClosingDate :: DateDesp -> Either String Date getClosingDate (GenericDates Map DateType DatePattern m) = case DateType -> Map DateType DatePattern -> Maybe DatePattern forall k a. Ord k => k -> Map k a -> Maybe a Map.lookup DateType ClosingDate Map DateType DatePattern m of Just (SingletonDate Date x) -> Date -> Either String Date forall a b. b -> Either a b Right Date x Maybe DatePattern Nothing -> String -> Either String Date forall a b. a -> Either a b Left (String -> Either String Date) -> String -> Either String Date forall a b. (a -> b) -> a -> b $ String "ClosingDate not found in GenericDates"String -> String -> String forall a. [a] -> [a] -> [a] ++Map DateType DatePattern -> String forall a. Show a => a -> String show Map DateType DatePattern m getClosingDate (PreClosingDates Date _ Date x Maybe Date _ Date _ (Date, DatePattern) _ (Date, DatePattern) _) = Date -> Either String Date forall a b. b -> Either a b Right Date x getClosingDate (CurrentDates (Date _,Date cd) Maybe Date _ Date _ (Date, DatePattern) _ (Date, DatePattern) _ ) = Date -> Either String Date forall a b. b -> Either a b Right Date cd getLastPayDate :: DateDesp -> Either String Date getLastPayDate (GenericDates Map DateType DatePattern m) = case DateType -> Map DateType DatePattern -> Maybe DatePattern forall k a. Ord k => k -> Map k a -> Maybe a Map.lookup DateType LastPayDate Map DateType DatePattern m of Just (SingletonDate Date x) -> Date -> Either String Date forall a b. b -> Either a b Right Date x Maybe DatePattern Nothing -> String -> Either String Date forall a b. a -> Either a b Left (String -> Either String Date) -> String -> Either String Date forall a b. (a -> b) -> a -> b $ String "LastPayDate not found in GenericDates"String -> String -> String forall a. [a] -> [a] -> [a] ++ Map DateType DatePattern -> String forall a. Show a => a -> String show Map DateType DatePattern m getLastPayDate (CurrentDates (Date _,Date cd) Maybe Date _ Date _ (Date, DatePattern) _ (Date, DatePattern) _ ) = Date -> Either String Date forall a b. b -> Either a b Right Date cd getLastPayDate (PreClosingDates {}) = String -> Either String Date forall a b. a -> Either a b Left String "Error : try to get last pay date from PreClosingDates" getFirstPayDate :: DateDesp -> Date getFirstPayDate (PreClosingDates Date _ Date _ Maybe Date _ Date _ (Date, DatePattern) _ (Date fp,DatePattern _)) = Date fp getFirstPayDate (CurrentDates (Date, Date) _ Maybe Date _ Date _ (Date, DatePattern) _ (Date cpay,DatePattern _)) = Date cpay getFirstPayDate (GenericDates Map DateType DatePattern m) = case DateType -> Map DateType DatePattern -> Maybe DatePattern forall k a. Ord k => k -> Map k a -> Maybe a Map.lookup DateType FirstPayDate Map DateType DatePattern m of Just (SingletonDate Date x) -> Date x Maybe DatePattern Nothing -> String -> Date forall a. HasCallStack => String -> a error String "FirstPayDate not found in GenericDates"