diff --git a/messages/uniworx/categories/admin/de-de-formal.msg b/messages/uniworx/categories/admin/de-de-formal.msg index 2bb340724..d6cd1fe98 100644 --- a/messages/uniworx/categories/admin/de-de-formal.msg +++ b/messages/uniworx/categories/admin/de-de-formal.msg @@ -111,7 +111,6 @@ ProblemsDriversHaveAvsIds: Alle Inhaber einer Fahrberechtigung konnten einer AVS ProblemsUsersAreReachable: Für alle Benutzer ist eine E-Mail oder postalische Adresse bekannt ProblemsNoStalePrintJobs n@Integer: Alle Briefversandaufträge der vergangenen #{show n} Tage wurden von der Druckerei bestätigt ProblemsNoBadAPCIds: Alle kürzlich empfangenen Druckauftragsbestätigungen waren gültig -ProblemsNoAvsSynchProblems: Synchronisation mit Ausweisverwaltungssystem (AVS) meldete keine Probleme ProblemsUnreachableHeading: Unerreichbare Benutzer ProblemsUnreachableBody: Benutzer ohne E-Mail oder Postadresse, welche z.B. bei ablaufenden Berechtigungen nicht benachrichtigt werden können: ProblemsRWithoutFHeading: Fahrer mit R ohne F @@ -119,4 +118,5 @@ ProblemsRWithoutFBody: Diese Fahrer sind wegen einer ungültigen Vorfeld-Fahrber ProblemsNoAvsIdHeading: Fahrer ohne AVS-Id ProblemsNoAvsIdBody: Fahrer mit gültiger Fahrberechtigung in FRADrive, welche trotzdem nicht fahren dürfen, da die Fahrberechtigung aufgrund einer unbekannten AVS Id nicht an die Ausweisstelle übermittelt werden konnte: ProblemsAvsSynchHeading: Synchronisation AVS Fahrberechtigungen -ProblemsAvsErrorHeading: Fehlermeldungen \ No newline at end of file +ProblemsAvsErrorHeading: Fehlermeldungen +ProblemsInterfaceSince: Berücksichtigt werden nur Erfolge und Fehler seit \ No newline at end of file diff --git a/messages/uniworx/categories/admin/en-eu.msg b/messages/uniworx/categories/admin/en-eu.msg index 4d973593a..111fd0883 100644 --- a/messages/uniworx/categories/admin/en-eu.msg +++ b/messages/uniworx/categories/admin/en-eu.msg @@ -111,7 +111,6 @@ ProblemsDriversHaveAvsIds: All driving licence holder could be matched with thei ProblemsUsersAreReachable: Either Email or postal address is known for all users ProblemsNoStalePrintJobs n: All requests for letter mailing within the last #{show n} days were acknowledged as printed by the airport printing center ProblemsNoBadAPCIds: All recently received print job ids from Airport Print Center were legit -ProblemsNoAvsSynchProblems: AVS synchronisation had not problems ProblemsUnreachableHeading: Unreachable Users ProblemsUnreachableBody: Users without Email nor postal address, who thus cannot be notified about expiring qualifications: ProblemsRWithoutFHeading: Drivers having 'R' but not 'F' @@ -119,4 +118,5 @@ ProblemsRWithoutFBody: Drivers without apron driving licence are prohibited from ProblemsNoAvsIdHeading: Drivers without AVS id ProblemsNoAvsIdBody: Drivers having a valid apron driving licence within FRADrive only, but who may not drive since a missing AVS id prevents communication of the driving licence to AVS: ProblemsAvsSynchHeading: Synchronisation AVS Driving Licences -ProblemsAvsErrorHeading: Error Log \ No newline at end of file +ProblemsAvsErrorHeading: Error Log +ProblemsInterfaceSince: Only considering successes and errors since \ No newline at end of file diff --git a/src/Handler/Admin.hs b/src/Handler/Admin.hs index 1ede7e62a..eb80a0633 100644 --- a/src/Handler/Admin.hs +++ b/src/Handler/Admin.hs @@ -54,13 +54,12 @@ getAdminProblemsR = do flagNonZero n | n <= 0 = flagError True | otherwise = messageTooltip =<< handlerToWidget (messageI Error (MsgProblemsDriverSynch n)) - (usersAreReachable, driversHaveAvsIds, rDriversHaveFs, noStalePrintJobs, noBadAPCids, noAvsSynchProblems, interfaceTable) <- runDB $ (,,,,,,) + (usersAreReachable, driversHaveAvsIds, rDriversHaveFs, noStalePrintJobs, noBadAPCids, interfaceTable) <- runDB $ (,,,,,) <$> areAllUsersReachable <*> allDriversHaveAvsId now <*> allRDriversHaveFs now <*> (not <$> exists [PrintJobAcknowledged ==. Nothing, PrintJobCreated <. cutOffOldTime]) - <*> (not <$> exists [PrintAcknowledgeProcessed ==. False]) - <*> (not <$> exists [UserAvsLastSynchError !=. Nothing]) + <*> (not <$> exists [PrintAcknowledgeProcessed ==. False]) <*> fmap (view _2) (mkInterfaceLogTable flagError cutOffOldTime) diffLics <- try retrieveDifferingLicences >>= \case -- (Left (UnsupportedContentType "text/html" resp)) -> Left $ text2widget "Html received" @@ -248,11 +247,14 @@ mkInterfaceLogTable flagError cutOffOldTime = do E.where_ $ uavs E.^. UserAvsLastSynch E.>. E.val cutOffOldTime let isOk = E.isNothing (uavs E.^. UserAvsLastSynchError) E.groupBy isOk - -- E.orderBy [E.descNullsLast isOk] + E.orderBy [E.descNullsLast isOk] return (isOk, E.countRows, E.max_ $ uavs E.^. UserAvsLastSynch) let - mkBadInfo badRows (fromMaybe cutOffOldTime -> badTime) = - if badRows > 0 then tshow badRows <> " errors, last " <> tshow (utctDay badTime) else mempty + mkBadInfo badRows (fromMaybe cutOffOldTime -> badTime) | badRows > 0 = do + fmtCut <- formatTime SelFormatDate cutOffOldTime + fmtBad <- formatTime SelFormatDateTime badTime + return $ tshow badRows <> " Fehler seit " <> fmtCut <> ", zuletzt um " <> fmtBad + mkBadInfo _ _ = return mempty writeAvsSynchStats okRows (fromMaybe cutOffOldTime -> okTime) badInfo = void $ upsertBy (UniqueInterfaceSubtypeWrite "AVS" "Synch" True) (InterfaceLog "AVS" "Synch" True okTime okRows badInfo) @@ -260,11 +262,12 @@ mkInterfaceLogTable flagError cutOffOldTime = do --case $(unValueN 3) <$> avsSynchStats of case avsSynchStats of ((E.Value True , E.Value okRows, E.Value okTime):(E.Value False, E.Value badRows, E.Value badTime):_) -> - writeAvsSynchStats (Just okRows) okTime $ mkBadInfo badRows badTime + writeAvsSynchStats (Just okRows) okTime =<< mkBadInfo badRows badTime ((E.Value True , E.Value okRows, E.Value okTime):_) -> writeAvsSynchStats (Just okRows) okTime mempty - ((E.Value False, E.Value badRows, E.Value badTime):_) -> - writeAvsSynchStats Nothing Nothing $ mkBadInfo badRows badTime + ((E.Value False, E.Value badRows, E.Value badTime):_) -> do + lastOk <- userAvsLastSynch . entityVal <<$>> selectFirst [UserAvsLastSynchError ==. Nothing] [Desc UserAvsLastSynch] + writeAvsSynchStats Nothing lastOk =<< mkBadInfo badRows badTime _ -> return () let @@ -277,20 +280,22 @@ mkInterfaceLogTable flagError cutOffOldTime = do dbtRowKey = (E.^. InterfaceLogId) dbtProj = dbtProjId dbtColonnade = dbColonnade $ mconcat - [ sortable Nothing mempty $ wgtCell . flagOld . view (resultILog . _interfaceLogTime) + [ sortable Nothing (textCell "Status" ) $ wgtCell . flagOld . view (resultILog . _interfaceLogTime) , sortable (Just "interface") (textCell "Interface") $ \(view (resultILog . _interfaceLogInterface) -> n) -> textCell n , sortable (Just "subtype") (textCell "Art" ) $ textCell . view (resultILog . _interfaceLogSubtype) , sortable (Just "write") (textCell "Write" ) $ (`ifIconCell` IconEdit) . view (resultILog . _interfaceLogWrite) - , sortable (Just "rows") (textCell "Zeilen" ) $ cellMaybe numCell . view (resultILog . _interfaceLogRows) - , sortable Nothing (textCell "Info" ) $ textCell . view (resultILog . _interfaceLogInfo) , sortable (Just "time") (i18nCell MsgSystemMessageTimestamp) $ dateTimeCell . view (resultILog . _interfaceLogTime) + , sortable (Just "rows") (textCell "Zeilen" ) $ cellMaybe numCell . view (resultILog . _interfaceLogRows) + , sortable Nothing (textCell "Info" ) $ \(view resultILog -> ilt) -> case ilt of + InterfaceLog "AVS" "Synch" True _ _ i -> anchorCell ProblemAvsErrorR $ toWgt i + InterfaceLog _ _ _ _ _ i -> textCell i ] dbtSorting = mconcat [ singletonMap "interface" $ SortColumn (E.^. InterfaceLogInterface) , singletonMap "subtype" $ SortColumn (E.^. InterfaceLogSubtype) , singletonMap "write" $ SortColumn (E.^. InterfaceLogWrite) - , singletonMap "rows" $ SortColumn (E.^. InterfaceLogRows) , singletonMap "time" $ SortColumn (E.^. InterfaceLogTime) + , singletonMap "rows" $ SortColumn (E.^. InterfaceLogRows) ] dbtFilter = mempty dbtFilterUI = mempty diff --git a/templates/admin-problems.hamlet b/templates/admin-problems.hamlet index 0754f5104..d07df69fd 100644 --- a/templates/admin-problems.hamlet +++ b/templates/admin-problems.hamlet @@ -54,14 +54,10 @@ $# SPDX-License-Identifier: AGPL-3.0-or-later

- _{MsgMenuInterfaces} - -
-
-
^{flagError noAvsSynchProblems} -
^{simpleLinkI MsgProblemsNoAvsSynchProblems ProblemAvsErrorR} - + _{MsgMenuInterfaces}
+

+ _{MsgProblemsInterfaceSince} ^{formatTimeW SelFormatDate cutOffOldTime} ^{interfaceTable}