chore(letter): complete envelope max counting, hard coded limit yet

This commit is contained in:
Steffen Jost 2023-06-22 10:12:51 +00:00
parent 97d26dcded
commit 28affa57f2
2 changed files with 34 additions and 20 deletions

View File

@ -965,10 +965,10 @@ forMaybeM :: ( Monad m
) => f a -> (Element (f a) -> MaybeT m (Element (f b))) -> m (f b)
forMaybeM = flip mapMaybeM
{-
-- Takes computations returnings @Maybes@; tries each one in order.
-- The first one to return a @Just@ wins. Returns @Nothing@ if all computations
-- return @Nothing@.
-- | Takes computations returnings @Maybe@; tries each one in order.
-- The first one to return a @Just@ wins.
-- Returns @Nothing@ if all computations return @Nothing@.
-- Copied from GHC.Data.Maybe, which could not be imported somehow.
firstJustsM :: (Monad m, Foldable f) => f (m (Maybe a)) -> m (Maybe a)
firstJustsM = foldlM go Nothing
@ -976,7 +976,6 @@ firstJustsM = foldlM go Nothing
go :: Monad m => Maybe a -> m (Maybe a) -> m (Maybe a)
go Nothing action = action
go result@(Just _) _action = return result
-}
-- | Run the maybe computation repeatedly until the first Just is returned
-- or the number of maximum retries is exhausted.

View File

@ -3,6 +3,7 @@
-- SPDX-License-Identifier: AGPL-3.0-or-later
{-# OPTIONS_GHC -fno-warn-unused-top-binds #-}
{-# LANGUAGE TypeApplications #-}
module Utils.Print.Letters where
@ -23,6 +24,10 @@ import qualified Text.Pandoc.Builder as P
import Text.Hamlet
-- import Database.Esqueleto.Experimental ((:&)(..))
import qualified Database.Esqueleto.Experimental as E -- needs TypeApplications Lang-Pragma
import qualified Database.Esqueleto.Utils as E
-- import System.Exit
-- import System.Process.Typed -- for calling pdftk for pdf encryption
@ -186,19 +191,19 @@ mkApcIdent uuid envelope lk tnow apcAck = Text.filter apcAcceptedChars $ Text.in
]
where
ensureLength :: Int -> Text -> Text
ensureLength n = Text.take n . Text.justifyLeft n 'x'
ensureLength n = Text.take n . Text.justifyLeft n 'x' . Text.filter apcAcceptedChars
mkEnvelope :: (Int, Char) -> Text
mkEnvelope (i,c) = Text.cons (pfx $ i `mod` 63) $ Text.singleton sfx
where
pfx n
| n <= 0 = Text.cons '-' $ Text.singleton c
| n <= 10 = Text.cons (chr $ ord '0' + n `mod` 10)
| n <= 36 = Text.cons (chr $ ord 'a' + n - 11)
| n <= 62 = Text.cons (chr $ ord 'A' + n - 37)
| otherwise = Text.cons '-' $ Text.singleton c
| n <= 0 = '-'
| n <= 10 = chr $ ord '0' + n `mod` 10
| n <= 36 = chr $ ord 'a' + n - 11
| n <= 62 = chr $ ord 'A' + n - 37
| otherwise = '-'
sfx
| n <= 62 = c
| i <= 62 = Char.toLower c
| otherwise = Char.toUpper c
formatApcIdentTime :: (HasLocalTime t, MonadHandler m) => t -> m Text
@ -221,7 +226,8 @@ apcAcceptedChars '-' = True
apcAcceptedChars '_' = True
apcAcceptedChars c = isAlphaNum c
apcEnvelopeSize :: Int64
apcEnvelopeSize = 6
------------------
-- Letter Class --
@ -254,14 +260,23 @@ class MDLetter l where
getMailBody :: l -> Maybe (DateTimeFormatter -> HtmlUrlI18n (SomeMessage UniWorX) (Route UniWorX)) -- Just returns cover-lettter for attaching PDF to, Nothing indicates that the letter should be sent as direct Html Email
getMailBody = const Nothing
letterApcIdent :: (MDLetter l, MonadHandler m) => l -> CryptoUUIDUser -> UTCTime -> m Text
letterApcIdent :: (MDLetter l) => l -> CryptoUUIDUser -> UTCTime -> Handler Text
letterApcIdent l uuid now = do
-- now <- liftIO getCurrentTime
tnow <- formatApcIdentTime now
let startEnvelope = (0, getLetterEnvelope l)
mkApcEnv env = mkApcIdent uuid env (getLetterKind l) tnow (pjiApcAcknowledge $ getPJId l)
-- TODO: turn this into a loop increasing the number for each 6 unacknowledged letters to the first part of the ident only
return $ mkApcEnv startEnvelope
-- now <- liftIO getCurrentTime
tnow <- formatApcIdentTime now
let mkApcIdnt i = mkApcIdent uuid (i,getLetterEnvelope l) (getLetterKind l) tnow (pjiApcAcknowledge $ getPJId l)
attemptId i = do
let apcId = mkApcIdnt i
recenv = fst $ Text.breakOn apcIdentSeparator apcId
envCount <- runDB . E.select $ do
pj <- E.from $ E.table @PrintJob
E.where_ $ E.isNothing (pj E.^. PrintJobAcknowledged)
E.&&. (E.val recenv `E.isPrefixOf_` pj E.^. PrintJobApcIdent)
return E.countRows
case envCount of
(E.Value nrLetters):_ -> return $ toMaybe (nrLetters < apcEnvelopeSize) apcId
[] -> return $ Just apcId
fromMaybe (mkApcIdnt 0) <$> firstJustsM [attemptId i | i <- [0..128]]
letterFileName :: (MDLetter l) => l -> FilePath
letterFileName = Text.unpack . (<> ".pdf") . text2asciiAlphaNum . pjiFileName . getPJId