diff --git a/messages/uniworx/categories/print/de-de-formal.msg b/messages/uniworx/categories/print/de-de-formal.msg index 788a4a21e..1eb9eb034 100644 --- a/messages/uniworx/categories/print/de-de-formal.msg +++ b/messages/uniworx/categories/print/de-de-formal.msg @@ -3,6 +3,7 @@ # SPDX-License-Identifier: AGPL-3.0-or-later PJActAcknowledge: Druck und Versand bestätigen +PJActReprint: Erneut drucken über APC PrintJobName: Bezeichnung PrintJobFilename: Dateiname PrintJobId !ident-ok: Id @@ -11,6 +12,7 @@ PrintJobApcAcknowledge: Bestätigungs ID PrintJobAcknowledged: Bestätigt PrintJobUnacknowledged: Noch nicht gedruckt 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! PrintJobAcknowledgeQuestion n@Int d@Text: #{n} #{pluralDE n "Druckauftrag" "Druckaufräge"} vom #{d} als gedruckt und versendet bestätigen? PrintJobAcknowledgements: Versanddatum von Briefen an diff --git a/messages/uniworx/categories/print/en-eu.msg b/messages/uniworx/categories/print/en-eu.msg index 2a4ba3ccd..a1090de43 100644 --- a/messages/uniworx/categories/print/en-eu.msg +++ b/messages/uniworx/categories/print/en-eu.msg @@ -3,6 +3,7 @@ # SPDX-License-Identifier: AGPL-3.0-or-later PJActAcknowledge: Acknowledge printing and mailing +PJActReprint: Print again via APC PrintJobName: Description PrintJobFilename: Filename PrintJobId: Id @@ -11,6 +12,7 @@ PrintJobApcAcknowledge: Acknowledge ID PrintJobAcknowledged: Acknowledged PrintJobUnacknowledged: Not yet printed 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! PrintJobAcknowledgeQuestion n d: Mark #{n} #{pluralENs n "print-job"} issued on #{d} as printed and mailed already? PrintJobAcknowledgements: Sent-dates for Letter to diff --git a/src/Handler/PrintCenter.hs b/src/Handler/PrintCenter.hs index 98fe75cca..f3b64d3be 100644 --- a/src/Handler/PrintCenter.hs +++ b/src/Handler/PrintCenter.hs @@ -114,17 +114,16 @@ lrqf2letter LRQF{..} getUser (Left mail) = getBy404 $ UniqueEmail mail -data PJTableAction = PJActAcknowledge +data PJTableAction = PJActAcknowledge | PJActReprint deriving (Eq, Ord, Enum, Bounded, Read, Show, Generic) - instance Universe PJTableAction instance Finite PJTableAction nullaryPathPiece ''PJTableAction $ camelToPathPiece' 2 embedRenderMessage ''UniWorX ''PJTableAction id -- Not yet needed, since there is no additional data for now: -data PJTableActionData = PJActAcknowledgeData +data PJTableActionData = PJActAcknowledgeData | PJActReprintData deriving (Eq, Ord, Read, Show, Generic) type PJTableExpr = ( E.SqlExpr (Entity PrintJob) @@ -259,6 +258,7 @@ mkPJTable = do = let acts :: Map PJTableAction (AForm Handler PJTableActionData) acts = mconcat [ singletonMap PJActAcknowledge $ pure PJActAcknowledgeData + , singletonMap PJActReprint $ pure PJActReprintData ] in renderAForm FormStandard $ (, mempty) . First . Just @@ -283,11 +283,19 @@ postPrintCenterR = do (pjRes, pjTable) <- runDB mkPJTable formResult pjRes $ \case - (PJActAcknowledgeData, Set.toList -> pjIds) -> do - now <- liftIO getCurrentTime - num <- runDB $ updateWhereCount [PrintJobAcknowledged ==. Nothing, PrintJobId <-. pjIds] [PrintJobAcknowledged =. Just now] - addMessageI Success $ MsgPrintJobAcknowledge num - reloadKeepGetParams PrintCenterR + (PJActAcknowledgeData, Set.toList -> pjIds) -> do + now <- liftIO getCurrentTime + num <- runDB $ updateWhereCount [PrintJobAcknowledged ==. Nothing, PrintJobId <-. pjIds] [PrintJobAcknowledged =. Just now] + addMessageI Success $ MsgPrintJobAcknowledge num + 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 setTitleI MsgMenuApc diff --git a/src/Utils/Print.hs b/src/Utils/Print.hs index 0d17e1781..cd61e47e7 100644 --- a/src/Utils/Print.hs +++ b/src/Utils/Print.hs @@ -1,4 +1,4 @@ --- SPDX-FileCopyrightText: 2022 Steffen Jost +-- SPDX-FileCopyrightText: 2022-23 Steffen Jost -- -- SPDX-License-Identifier: AGPL-3.0-or-later @@ -10,6 +10,7 @@ module Utils.Print , sendEmailOrLetter -- directly print or sends by email , printLetter -- always send a letter , printHtml -- return letter as Html only + , reprintPDF -- send a PDF once more the APC , letterApcIdent -- create acknowledge string for APC , letterFileName -- default filename , encryptPDF @@ -277,6 +278,20 @@ printLetter' pji pdf = do insert_ PrintJob {..} 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'' _ = do diff --git a/src/Utils/Print/Letters.hs b/src/Utils/Print/Letters.hs index 37ffde18c..0718a294b 100644 --- a/src/Utils/Print/Letters.hs +++ b/src/Utils/Print/Letters.hs @@ -188,6 +188,17 @@ mkApcIdent uuid envelope lk tnow apcAck = Text.filter apcAcceptedChars $ Text.in ensureLength :: Int -> Text -> Text 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.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 l uuid now = do -- now <- liftIO getCurrentTime - tnow <- formatTime' "%y%m%d-%H" now + tnow <- formatApcIdentTime now return $ mkApcIdent uuid (getLetterEnvelope l) (getLetterKind l) tnow (pjiApcAcknowledge $ getPJId l) letterFileName :: (MDLetter l) => l -> FilePath