128 lines
5.7 KiB
Haskell
128 lines
5.7 KiB
Haskell
{-# 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 luid 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"
|
|
lmsUrl = "https://drive.fraport.de"
|
|
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-text" lmsUrl
|
|
, toMeta "url" (lmsUrl <> "/?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")
|
|
-- if we reach the end, mark the user as notified
|
|
-- TODO: defer this until the print job is marked as sent?
|
|
runDB $
|
|
update luid [ LmsUserNotified =. Just now]
|
|
|
|
|