module Model.Payer.Payment ( getTotalPaymentsBefore , getTotalPaymentsAfter ) where import Data.Time.Clock (UTCTime) import Data.Maybe (catMaybes) import Database.Persist import Database.Esqueleto import qualified Database.Esqueleto as E import Model.Database import Model.Frequency getTotalPaymentsBefore :: UTCTime -> Persist [(UserId, Int)] getTotalPaymentsBefore time = getTotalPayments (\p -> p ^. PaymentCreation E.<. val time) getTotalPaymentsAfter :: UTCTime -> Persist [(UserId, Int)] getTotalPaymentsAfter time = getTotalPayments (\p -> p ^. PaymentCreation E.>=. val time) getTotalPayments :: (SqlExpr (Entity Payment) -> SqlExpr (Value Bool)) -> Persist [(UserId, Int)] getTotalPayments paymentWhere = do values <- select $ from $ \payment -> do where_ (isNothing (payment ^. PaymentDeletedAt)) where_ (payment ^. PaymentFrequency E.==. val Punctual) where_ (paymentWhere payment) groupBy (payment ^. PaymentUserId) return (payment ^. PaymentUserId, sum_ (payment ^. PaymentCost)) return $ catMaybes . map (unMaybe . unValueTuple) $ values unValueTuple :: (Value a, Value b) -> (a, b) unValueTuple (Value a, Value b) = (a, b) unMaybe :: (a, Maybe b) -> Maybe (a, b) unMaybe (a, Just b) = Just (a, b) unMaybe _ = Nothing