---------------------------------------------------------
--
-- Module : CalcConfigurationType
-- Copyright : Bartosz Wójcik (2010)
-- License : BSD3
--
-- Maintainer : bartek@sudety.it
-- Stability : Unstable
-- Portability : portable
--
-- | This module implements data types of loan consturctors.
---------------------------------------------------------
module Haslo.CalcConfigurationType
(module Haslo.CalcCalendar
,InstalmentLoanData (..)
,ClassicLoan (..)
,Balloons (..)
,UnfdBalloons (..)
,Classical (..)
,Balloon (..)
,BalloonPlus (..)
,UnfdBalloon (..)
,UnfdBalloonPlus (..)
,ReversBalloon (..)
,Bullet (..)
,myRound
)
where
import Haslo.BasicType
import Haslo.CalcCalendar
import Haslo.ErrorHandling
import Haslo.Parameters
import Haslo.InstalmentPlan
import Text.PrettyShow
-- ==============================
-- Types' definitions
-- ==============================
-- | Data type for retriving loan data of particular products directly from consturctors.
data InstalmentLoanData = InstalmentLoanData {principal :: Amount
,duration :: Duration
,deferrment :: Duration
,rate :: Rate
}
deriving (Eq, Ord, Show)
-- | Classical Loan provides a constructor function which
-- creates @Instalment Plan@ of this loan.
class ClassicLoan a where
newLoanI :: a -- ^ type of loan
-> IPPMonad InstalmentPlan
extract :: a -> InstalmentLoanData
-- | Class of loans with specific last instalment.
class (ClassicLoan a) => Balloons a where
balloon :: a -> Amount
-- | Class of loans with extended duration.
class (Balloons a) => UnfdBalloons a where
eXtendedDuration :: a -> Duration -- ^ Max duration of extended period.
-- | Eeach installment is equal:
-- principal, duration in freq units, 1st instalment postponement in duration units,
-- yearly effective interest rate
data Classical = Classical !Amount -- principal
!Duration -- duration in freq units
!Duration -- 1st instalment postponement in duration units
!Rate -- yearly effective interest rate
deriving (Eq, Ord)
-- | Last installment is given, rest are equal
-- Datatype elements: principal, duration in freq units, 1st instalment postponement in duration units,
-- yearly effective interest rate,balloon amount.
data Balloon = Balloon !Amount -- principal
!Duration -- duration in freq units
!Duration -- 1st instalment postponement in duration units
!Rate -- yearly effective interest rate
!Amount -- balloon amount
deriving (Eq, Ord)
-- | Balloon + given amount is put on top of last installment.
-- | Last installment is given, rest are equal
-- Datatype elements: principal, duration in freq units, 1st instalment postponement in duration units,
-- yearly effective interest rate,balloon amount.
data BalloonPlus = BalloonPlus !Amount -- principal
!Duration -- duration in freq units
!Duration -- 1st instalment postponement in duration units
!Rate -- yearly effective interest rate
!Amount -- balloon amount
deriving (Eq, Ord)
-- | 2 periods product with given duration of 1st one and
-- residual balloon amount (RBA).
-- RBA serves to calculate first period installment amount like in balloon.
-- 2nd period amount is equal to 1st one, its duration is calculated
-- based on it. Last installment may differ.
-- Datatype elements: principal, duration in freq units, 1st instalment postponement in duration units,
-- yearly effective interest rate, residual balloon amount (RBA), maximal duration of unfolded RBA.
data UnfdBalloon = UnfdBalloon !Amount -- principal
!Duration -- duration till balloon (inclusive) in freq units
!Duration -- 1st instalment postponement in duration units
!Rate -- yearly effective interest rate
!Amount -- residual balloon amount (RBA).
!Duration -- maximal duration of unfolded RBA
deriving (Eq, Ord)
-- | Similar to UnfdBalloon. There is 1 difference: RBA maturess together with
-- last installment of 1st period (like BalloonPlus),
-- whilst in UnfdBalloon - one month later.
-- Datatype elements: principal, duration in freq units, 1st instalment postponement in duration units,
-- yearly effective interest rate, residual balloon amount (RBA), maximal duration of unfolded RBA.
data UnfdBalloonPlus = UnfdBalloonPlus !Amount -- principal
!Duration -- duration till balloon (inclusive) in freq units
!Duration -- 1st instalment postponement in duration units
!Rate -- yearly effective interest rate
!Amount -- residual balloon amount (RBA).
!Duration -- maximal duration of unfolded RBA
deriving (Eq, Ord)
-- | Each installment is equal to given amount but the last one.
-- Datatype elements: principal, duration in freq units, 1st instalment postponement in duration units,
-- yearly effective interest rate, regular instalment amount.
data ReversBalloon = ReversBalloon !Amount -- principal
!Duration -- duration till balloon (inclusive) in freq units
!Duration -- 1st instalment postponement in duration units
!Rate -- yearly effective interest rate
!Amount -- regular instalment amount.
deriving (Eq, Ord)
-- | Balloon, where all installments equal 0 except last one which contains full
-- capital and first one which contains interest.
-- Datatype elements: principal, duration in freq units, 1st instalment postponement in duration units,
-- yearly effective interest rate.
data Bullet = Bullet !Amount -- principal
!Duration -- duration till balloon (inclusive) in freq units
!Duration -- 1st instalment postponement in duration units
!Rate -- yearly effective interest rate
deriving (Eq, Ord)
instance Show Classical where
show (Classical p n d r) = showWithLen 20 "Classical" ++
showAmtWithLen 11 p ++
showWithLen 5 n ++
showWithLen 3 d ++
" " ++ show r
instance Show Balloon where
show (Balloon p n d r b) = showWithLen 20 "Balloon" ++
showAmtWithLen 11 p ++
showWithLen 5 n ++
showWithLen 3 d ++
" " ++ show r ++ " " ++
showAmtWithLen 11 b
instance Show BalloonPlus where
show (BalloonPlus p n d r b) = showWithLen 20 "BalloonPlus" ++
showAmtWithLen 11 p ++
showWithLen 5 n ++
showWithLen 3 d ++
" " ++ show r ++ " " ++
showAmtWithLen 11 b
instance Show UnfdBalloon where
show (UnfdBalloon p n d r b x) = showWithLen 20 "UnfoldedBalloon" ++
showAmtWithLen 11 p ++
showWithLen 5 n ++
showWithLen 3 d ++
" " ++ show r ++ " " ++
showAmtWithLen 11 b ++
showWithLen 5 x
instance Show UnfdBalloonPlus where
show (UnfdBalloonPlus p n d r b x) = showWithLen 20 "UnfoldedBalloonPlus" ++
showAmtWithLen 11 p ++
showWithLen 5 n ++
showWithLen 3 d ++
" " ++ show r ++ " " ++
showAmtWithLen 11 b ++
showWithLen 5 x
instance Show ReversBalloon where
show (ReversBalloon p n d r b) = showWithLen 20 "ReversBalloon" ++
showAmtWithLen 11 p ++
showWithLen 5 n ++
showWithLen 3 d ++
" " ++ show r ++ " " ++
showAmtWithLen 11 b
instance Show Bullet where
show (Bullet p n d r) = showWithLen 20 "Bullet" ++
showAmtWithLen 11 p ++
showWithLen 5 n ++
showWithLen 3 d ++
" " ++ show r
-- | Rounding function out of RoundingType.
myRound :: (RealFrac a) => RoundingType -> (a -> Amount)
myRound Rounded = round
myRound Truncated = truncate