chore(lpr): fix #83 by add resending option to print center

This commit is contained in:
Steffen Jost 2023-06-15 15:17:40 +00:00
parent c76dc47890
commit 933173dfcb
5 changed files with 48 additions and 10 deletions

View File

@ -3,6 +3,7 @@
# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-License-Identifier: AGPL-3.0-or-later
PJActAcknowledge: Druck und Versand bestätigen PJActAcknowledge: Druck und Versand bestätigen
PJActReprint: Erneut drucken über APC
PrintJobName: Bezeichnung PrintJobName: Bezeichnung
PrintJobFilename: Dateiname PrintJobFilename: Dateiname
PrintJobId !ident-ok: Id PrintJobId !ident-ok: Id
@ -11,6 +12,7 @@ PrintJobApcAcknowledge: Bestätigungs ID
PrintJobAcknowledged: Bestätigt PrintJobAcknowledged: Bestätigt
PrintJobUnacknowledged: Noch nicht gedruckt PrintJobUnacknowledged: Noch nicht gedruckt
PrintJobAcknowledge n@Int64: #{n} #{pluralDE n "Druckauftrag" "Druckaufräge"} als gedruckt und versendet bestätigt PrintJobAcknowledge n@Int64: #{n} #{pluralDE n "Druckauftrag" "Druckaufräge"} als gedruckt und versendet bestätigt
PrintJobReprint n@Int m@Int: #{n}/#{m} #{pluralDE n "Druckauftrag" "Druckaufräge"} wurden erneut zum Drucken ans APC gesendet; Bestätigungs-Idents wurden dabei nicht verändert und sind nun ggf. doppelt vorhanden.
PrintJobAcknowledgeFailed: Keine Druckaufträge bestätigt aufgrund zwischenzeitlicher Änderungen. Bitte die Seite im Browser aktualisieren! PrintJobAcknowledgeFailed: Keine Druckaufträge bestätigt aufgrund zwischenzeitlicher Änderungen. Bitte die Seite im Browser aktualisieren!
PrintJobAcknowledgeQuestion n@Int d@Text: #{n} #{pluralDE n "Druckauftrag" "Druckaufräge"} vom #{d} als gedruckt und versendet bestätigen? PrintJobAcknowledgeQuestion n@Int d@Text: #{n} #{pluralDE n "Druckauftrag" "Druckaufräge"} vom #{d} als gedruckt und versendet bestätigen?
PrintJobAcknowledgements: Versanddatum von Briefen an PrintJobAcknowledgements: Versanddatum von Briefen an

View File

@ -3,6 +3,7 @@
# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-License-Identifier: AGPL-3.0-or-later
PJActAcknowledge: Acknowledge printing and mailing PJActAcknowledge: Acknowledge printing and mailing
PJActReprint: Print again via APC
PrintJobName: Description PrintJobName: Description
PrintJobFilename: Filename PrintJobFilename: Filename
PrintJobId: Id PrintJobId: Id
@ -11,6 +12,7 @@ PrintJobApcAcknowledge: Acknowledge ID
PrintJobAcknowledged: Acknowledged PrintJobAcknowledged: Acknowledged
PrintJobUnacknowledged: Not yet printed PrintJobUnacknowledged: Not yet printed
PrintJobAcknowledge n: #{n} #{pluralENs n "print-job"} marked as printed and mailed PrintJobAcknowledge n: #{n} #{pluralENs n "print-job"} marked as printed and mailed
PrintJobReprint n m: #{n}/#{m} #{pluralENs n "print-job"} were sent for printing to the APC once more. Notice that the acknowledge idents remained unchanged and may thus be duplicated now.
PrintJobAcknowledgeFailed: No print-jobs acknowledged, due to intermediate changes. Please reload this page! PrintJobAcknowledgeFailed: No print-jobs acknowledged, due to intermediate changes. Please reload this page!
PrintJobAcknowledgeQuestion n d: Mark #{n} #{pluralENs n "print-job"} issued on #{d} as printed and mailed already? PrintJobAcknowledgeQuestion n d: Mark #{n} #{pluralENs n "print-job"} issued on #{d} as printed and mailed already?
PrintJobAcknowledgements: Sent-dates for Letter to PrintJobAcknowledgements: Sent-dates for Letter to

View File

@ -114,17 +114,16 @@ lrqf2letter LRQF{..}
getUser (Left mail) = getBy404 $ UniqueEmail mail getUser (Left mail) = getBy404 $ UniqueEmail mail
data PJTableAction = PJActAcknowledge data PJTableAction = PJActAcknowledge | PJActReprint
deriving (Eq, Ord, Enum, Bounded, Read, Show, Generic) deriving (Eq, Ord, Enum, Bounded, Read, Show, Generic)
instance Universe PJTableAction instance Universe PJTableAction
instance Finite PJTableAction instance Finite PJTableAction
nullaryPathPiece ''PJTableAction $ camelToPathPiece' 2 nullaryPathPiece ''PJTableAction $ camelToPathPiece' 2
embedRenderMessage ''UniWorX ''PJTableAction id embedRenderMessage ''UniWorX ''PJTableAction id
-- Not yet needed, since there is no additional data for now: -- Not yet needed, since there is no additional data for now:
data PJTableActionData = PJActAcknowledgeData data PJTableActionData = PJActAcknowledgeData | PJActReprintData
deriving (Eq, Ord, Read, Show, Generic) deriving (Eq, Ord, Read, Show, Generic)
type PJTableExpr = ( E.SqlExpr (Entity PrintJob) type PJTableExpr = ( E.SqlExpr (Entity PrintJob)
@ -259,6 +258,7 @@ mkPJTable = do
= let acts :: Map PJTableAction (AForm Handler PJTableActionData) = let acts :: Map PJTableAction (AForm Handler PJTableActionData)
acts = mconcat acts = mconcat
[ singletonMap PJActAcknowledge $ pure PJActAcknowledgeData [ singletonMap PJActAcknowledge $ pure PJActAcknowledgeData
, singletonMap PJActReprint $ pure PJActReprintData
] ]
in renderAForm FormStandard in renderAForm FormStandard
$ (, mempty) . First . Just $ (, mempty) . First . Just
@ -283,11 +283,19 @@ postPrintCenterR = do
(pjRes, pjTable) <- runDB mkPJTable (pjRes, pjTable) <- runDB mkPJTable
formResult pjRes $ \case formResult pjRes $ \case
(PJActAcknowledgeData, Set.toList -> pjIds) -> do (PJActAcknowledgeData, Set.toList -> pjIds) -> do
now <- liftIO getCurrentTime now <- liftIO getCurrentTime
num <- runDB $ updateWhereCount [PrintJobAcknowledged ==. Nothing, PrintJobId <-. pjIds] [PrintJobAcknowledged =. Just now] num <- runDB $ updateWhereCount [PrintJobAcknowledged ==. Nothing, PrintJobId <-. pjIds] [PrintJobAcknowledged =. Just now]
addMessageI Success $ MsgPrintJobAcknowledge num addMessageI Success $ MsgPrintJobAcknowledge num
reloadKeepGetParams PrintCenterR reloadKeepGetParams PrintCenterR
(PJActReprintData, Set.toList -> pjIds) -> do
let countOk = either (const $ Sum 0) (const $ Sum 1)
oks <- runDB $ forM pjIds $ fmap countOk . reprintPDF
let nr_oks = getSum $ mconcat oks
nr_tot = length pjIds
mstat = bool Warning Success $ nr_oks == nr_tot
addMessageI mstat $ MsgPrintJobReprint nr_oks nr_tot
reloadKeepGetParams PrintCenterR
siteLayoutMsg MsgMenuApc $ do siteLayoutMsg MsgMenuApc $ do
setTitleI MsgMenuApc setTitleI MsgMenuApc

View File

@ -1,4 +1,4 @@
-- SPDX-FileCopyrightText: 2022 Steffen Jost <jost@tcs.ifi.lmu.de> -- SPDX-FileCopyrightText: 2022-23 Steffen Jost <jost@tcs.ifi.lmu.de>
-- --
-- SPDX-License-Identifier: AGPL-3.0-or-later -- SPDX-License-Identifier: AGPL-3.0-or-later
@ -10,6 +10,7 @@ module Utils.Print
, sendEmailOrLetter -- directly print or sends by email , sendEmailOrLetter -- directly print or sends by email
, printLetter -- always send a letter , printLetter -- always send a letter
, printHtml -- return letter as Html only , printHtml -- return letter as Html only
, reprintPDF -- send a PDF once more the APC
, letterApcIdent -- create acknowledge string for APC , letterApcIdent -- create acknowledge string for APC
, letterFileName -- default filename , letterFileName -- default filename
, encryptPDF , encryptPDF
@ -277,6 +278,20 @@ printLetter' pji pdf = do
insert_ PrintJob {..} insert_ PrintJob {..}
return $ Right (ok, printJobFilename) return $ Right (ok, printJobFilename)
reprintPDF :: PrintJobId -> DB (Either Text Text)
reprintPDF pjid = maybeM (return $ Left "Print job id is unknown.") reprint $ get pjid
where
reprint :: PrintJob -> DB (Either Text Text)
reprint pj@PrintJob{..} = do
result <- lprPDF printJobFilename $ LBS.fromStrict printJobFile
whenIsRight result $ const $ do
now <- liftIO getCurrentTime
insert_ pj{ printJobAcknowledged = Nothing
, printJobCreated = now
-- , printJobApcIdent = ??? cannot be modified here, since it is included inside the PDF
}
return result
{- {-
printLetter'' :: _ -> DB PureFile printLetter'' :: _ -> DB PureFile
printLetter'' _ = do printLetter'' _ = do

View File

@ -188,6 +188,17 @@ mkApcIdent uuid envelope lk tnow apcAck = Text.filter apcAcceptedChars $ Text.in
ensureLength :: Int -> Text -> Text ensureLength :: Int -> Text -> Text
ensureLength n = Text.take n . Text.justifyLeft n 'x' ensureLength n = Text.take n . Text.justifyLeft n 'x'
formatApcIdentTime :: (HasLocalTime t, MonadHandler m) => t -> m Text
formatApcIdentTime = formatTime' "%y%m%d-%H"
-- updateApcIdentTime :: UTCTime -> Text -> Text
-- updateApcIdentTime now oldapcident = do
-- tnow <- formatApcIdentTime now
-- let (st,en') = Text.splitAt (38 + 3 + 5 + 3) oldapcident -- TODO: ensure that the numbers are correct
-- en = Text.drop 9 en'
-- TODO: TEST whether the last characters in st and first characters in en are apcIdentSeparators and call error otherwise
-- return $ st <> ensureLength 9 tnow <> en
apcIdentSeparator :: Text apcIdentSeparator :: Text
apcIdentSeparator = Text.take 3 "___" -- must always have length 3 apcIdentSeparator = Text.take 3 "___" -- must always have length 3
@ -233,7 +244,7 @@ class MDLetter l where
letterApcIdent :: (MDLetter l, MonadHandler m) => l -> CryptoUUIDUser -> UTCTime -> m Text letterApcIdent :: (MDLetter l, MonadHandler m) => l -> CryptoUUIDUser -> UTCTime -> m Text
letterApcIdent l uuid now = do letterApcIdent l uuid now = do
-- now <- liftIO getCurrentTime -- now <- liftIO getCurrentTime
tnow <- formatTime' "%y%m%d-%H" now tnow <- formatApcIdentTime now
return $ mkApcIdent uuid (getLetterEnvelope l) (getLetterKind l) tnow (pjiApcAcknowledge $ getPJId l) return $ mkApcIdent uuid (getLetterEnvelope l) (getLetterKind l) tnow (pjiApcAcknowledge $ getPJId l)
letterFileName :: (MDLetter l) => l -> FilePath letterFileName :: (MDLetter l) => l -> FilePath