module MonthlyPaymentJob ( monthlyPaymentJobListener ) where import Control.Monad.IO.Class (liftIO) import Data.Time.Clock import Database.Persist (entityVal, insert) import Job (jobListener) import Model.Database import qualified Model.Payment as Payment import Model.JobKind import Model.Frequency import Utils.Time (belongToCurrentMonth, timeToDay) monthlyPaymentJobListener :: IO () monthlyPaymentJobListener = let lastExecutionTooOld = fmap not . belongToCurrentMonth runJob () = monthlyPaymentJob msDelay = 1000000 * 60 * 60 in jobListener MonthlyPaymentJob lastExecutionTooOld runJob msDelay monthlyPaymentJob :: Persist () monthlyPaymentJob = do monthlyPayments <- map entityVal <$> Payment.listMonthly now <- liftIO $ getCurrentTime actualDay <- liftIO $ timeToDay now let punctualPayments = map (\p -> p { paymentFrequency = Punctual, paymentDate = actualDay, paymentCreatedAt = now }) monthlyPayments sequence_ $ map insert punctualPayments