{-# LANGUAGE OverloadedStrings #-} module Model.Payment ( list , listMonthly , create , editOwn , deleteOwn , modifiedDuring ) where import Data.Text (Text) import Data.Time (UTCTime) import Data.Time.Clock (getCurrentTime) import Data.Time.Calendar (Day) import Control.Monad.IO.Class (liftIO) import Database.Persist import Model.Database import Model.Frequency import qualified Model.Json.Payment as P list :: Persist [P.Payment] list = map getJsonPayment <$> selectList [ PaymentDeletedAt ==. Nothing ] [] listMonthly :: Persist [Entity Payment] listMonthly = selectList [ PaymentDeletedAt ==. Nothing , PaymentFrequency ==. Monthly ] [ Desc PaymentName ] getJsonPayment :: Entity Payment -> P.Payment getJsonPayment paymentEntity = let payment = entityVal paymentEntity in P.Payment { P.id = entityKey paymentEntity , P.date = paymentDate payment , P.name = paymentName payment , P.cost = paymentCost payment , P.userId = paymentUserId payment , P.frequency = paymentFrequency payment } create :: UserId -> Text -> Int -> Day -> Frequency -> Persist PaymentId create userId name cost date frequency = do now <- liftIO getCurrentTime insert (Payment userId name cost date frequency now Nothing Nothing) editOwn :: UserId -> PaymentId -> Text -> Int -> Day -> Frequency -> Persist Bool editOwn userId paymentId name cost date frequency = do mbPayment <- get paymentId case mbPayment of Just payment -> if paymentUserId payment == userId then do now <- liftIO getCurrentTime update paymentId [ PaymentEditedAt =. Just now , PaymentName =. name , PaymentCost =. cost , PaymentDate =. date , PaymentFrequency =. frequency ] return True else return False Nothing -> return False deleteOwn :: UserId -> PaymentId -> Persist Bool deleteOwn userId paymentId = do mbPayment <- get paymentId case mbPayment of Just payment -> if paymentUserId payment == userId then do now <- liftIO getCurrentTime update paymentId [PaymentDeletedAt =. Just now] return True else return False Nothing -> return False modifiedDuring :: UTCTime -> UTCTime -> Persist [Payment] modifiedDuring start end = map entityVal <$> selectList ( [PaymentFrequency ==. Punctual, PaymentCreatedAt >=. start, PaymentCreatedAt <. end] ||. [PaymentFrequency ==. Punctual, PaymentEditedAt >=. Just start, PaymentEditedAt <. Just end] ||. [PaymentFrequency ==. Punctual, PaymentDeletedAt >=. Just start, PaymentDeletedAt <. Just end] ) []