{-# OPTIONS_GHC -fno-warn-unused-do-bind #-} -- ihamletFile discards do results module Jobs.Handler.SendNotification.Qualification ( dispatchNotificationQualificationExpiry , dispatchNotificationQualificationRenewal ) where import Import import Utils.Print import Handler.Utils import Handler.Utils.Users import Jobs.Handler.SendNotification.Utils import qualified Data.ByteString.Lazy as LBS import qualified Data.Text as Text -- import Handler.Info (FAQItem(..)) import qualified Data.CaseInsensitive as CI import Text.Hamlet -- import qualified Database.Esqueleto.Experimental as E -- import qualified Database.Esqueleto.Utils as E dispatchNotificationQualificationExpiry :: QualificationId -> Day -> UserId -> Handler () dispatchNotificationQualificationExpiry nQualification _nExpiry jRecipient = userMailT jRecipient $ do (recipient@User{..}, Qualification{..}, Entity _ QualificationUser{..}) <- liftHandler . runDB $ (,,) <$> getJust jRecipient <*> getJust nQualification <*> getJustBy (UniqueQualificationUser nQualification jRecipient) encRecipient :: CryptoUUIDUser <- liftHandler $ encrypt jRecipient let entRecipient = Entity jRecipient recipient qname = CI.original qualificationName expiryDate <- formatTimeUser SelFormatDate qualificationUserValidUntil $ Just entRecipient $logDebugS "LMS" $ "Notify " <> tshow encRecipient <> " about expiry of qualification " <> qname replaceMailHeader "Auto-Submitted" $ Just "auto-generated" setSubjectI $ MsgMailSubjectQualificationExpiry qname editNotifications <- mkEditNotifications jRecipient addHtmlMarkdownAlternatives $(ihamletFile "templates/mail/qualificationExpiry.hamlet") -- NOTE: qualificationRenewal expects that LmsUser already exists for recipient dispatchNotificationQualificationRenewal :: QualificationId -> UserId -> Handler () dispatchNotificationQualificationRenewal nQualification jRecipient = do (recipient@User{..}, Qualification{..}, Entity _ QualificationUser{..}, Entity _ LmsUser{..}) <- runDB $ (,,,) <$> getJust jRecipient <*> getJust nQualification <*> getJustBy (UniqueQualificationUser nQualification jRecipient) <*> getJustBy (UniqueLmsQualificationUser nQualification jRecipient) encRecipient :: CryptoUUIDUser <- encrypt jRecipient let entRecipient = Entity jRecipient recipient qname = CI.original qualificationName $logDebugS "LMS" $ "Notify " <> tshow encRecipient <> " for renewal of qualification " <> qname now <- liftIO getCurrentTime letterDate <- formatTimeUser SelFormatDate now $ Just entRecipient expiryDate <- formatTimeUser SelFormatDate qualificationUserValidUntil $ Just entRecipient let printJobName = "RenewalPin" prepAddress upa = userDisplayName : (upa & html2textlines) -- TODO: use supervisor's address lmsIdent = lmsUserIdent & getLmsIdent pdfMeta = mkMeta [ toMeta "date" letterDate , toMeta "lang" (selectDeEn userLanguages) -- select either German or English only, see Utils.Lang , toMeta "login" lmsIdent , toMeta "pin" lmsUserPin , toMeta "recipient" userDisplayName , mbMeta "address" (prepAddress <$> userPostAddress) , toMeta "expiry" expiryDate , mbMeta "validduration" (show <$> qualificationValidDuration) , toMeta "url" ("[https://drive.fraport.de](https://drive.fraport.de/?login=" <> lmsIdent <> ")") ] pdfRenewal pdfMeta >>= \case Left err -> do let msg = "Notify " <> tshow encRecipient <> " PDF generation failed with error: " <> err $logErrorS "LMS" msg error $ unpack msg Right pdf | userPrefersLetter recipient -> do let printSender = Nothing runDB (sendLetter printJobName pdf (Just jRecipient, printSender) Nothing (Just nQualification)) >>= \case Left err -> do let msg = "Notify " <> tshow encRecipient <> " PDF printing to send letter failed with error: " <> err $logErrorS "LMS" msg error $ unpack msg Right (msg,_) | null msg -> return () | otherwise -> $logWarnS "LMS" $ "PDF printing to send letter with lpr returned ExitSucces and the following message: " <> msg Right pdf -> userMailT jRecipient $ do -- userPrefersLetter is false if both userEmail and userPostAddress are null when (Text.null (CI.original userEmail)) $ $logErrorS "LMS" ("Notify " <> tshow encRecipient <> " failed: no email nor address for user known!") replaceMailHeader "Auto-Submitted" $ Just "auto-generated" setSubjectI $ MsgMailSubjectQualificationRenewal qname let fileName = printJobName <> "_" <> abbrvName recipient <> ".pdf" encryptPDF (fromMaybe "tomatenmarmelade" userPinPassword) pdf >>= \case -- TODO Left err -> do let msg = "Notify " <> tshow encRecipient <> " PDF encryption failed with error: " <> err $logErrorS "LMS" msg Right pdffile -> do addPart (File { fileTitle = Text.unpack fileName , fileModified = now , fileContent = Just $ yield $ LBS.toStrict pdffile } :: PureFile) editNotifications <- mkEditNotifications jRecipient addHtmlMarkdownAlternatives $(ihamletFile "templates/mail/qualificationRenewal.hamlet")