From 8c24464a4bd0a486cd0ddf846d3b5a323a7aaa9a Mon Sep 17 00:00:00 2001 From: Joris Date: Sun, 4 Oct 2015 20:48:32 +0200 Subject: Using incomes to compute a fair computation to designate the payer --- src/server/Model/Payer/Payment.hs | 40 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/server/Model/Payer/Payment.hs (limited to 'src/server/Model/Payer/Payment.hs') diff --git a/src/server/Model/Payer/Payment.hs b/src/server/Model/Payer/Payment.hs new file mode 100644 index 0000000..6efc38d --- /dev/null +++ b/src/server/Model/Payer/Payment.hs @@ -0,0 +1,40 @@ +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 -- cgit v1.2.3