diff --git a/src/Handler/Utils/Avs.hs b/src/Handler/Utils/Avs.hs index a9ebd401d..3fc321733 100644 --- a/src/Handler/Utils/Avs.hs +++ b/src/Handler/Utils/Avs.hs @@ -435,8 +435,8 @@ data CheckAvsUpdate record iavs = forall typ. (Eq typ, PersistField typ) => Chec -- | Compute necessary updates. Given an database record, a new and an old avs response and a pair consisting of a getter from avs response to a value and and EntityField of the same value, -- an update is returned, if the current value is identical to the old avs value, which changed in the new avs query -mkUpdate :: PersistEntity record => record -> iavs -> iavs -> CheckAvsUpdate record iavs -> Maybe (Update record) -mkUpdate ent newapi oldapi (CheckAvsUpdate up la) +mkUpdate :: PersistEntity record => record -> iavs -> Maybe iavs -> CheckAvsUpdate record iavs -> Maybe (Update record) +mkUpdate ent newapi (Just oldapi) (CheckAvsUpdate up la) | let newval = newapi ^. la , let oldval = oldapi ^. la , let entval = getField up ent @@ -480,7 +480,7 @@ updateAvsUserByIds apids = do let usrId = userAvsUser usravs usr <- MaybeT $ get usrId now <- liftIO getCurrentTime - let per_ups = maybeEmpty oldAvsPersonInfo $ \oldAvsPersonInfo' -> mapMaybe (mkUpdate usr newAvsPersonInfo oldAvsPersonInfo') + let per_ups = mapMaybe (mkUpdate usr newAvsPersonInfo oldAvsPersonInfo) -- NOTE: Updates erfolgen nur, wenn der Alt-Wert identisch zu Aktuellem-Wert sind! Bei mehreren Update-Möglichkeiten für ein Feld kann nur eines zutreffen. [ CheckAvsUpdate UserFirstName _avsInfoFirstName , CheckAvsUpdate UserSurname _avsInfoLastName , CheckAvsUpdate UserDisplayName _avsInfoDisplayName @@ -488,17 +488,15 @@ updateAvsUserByIds apids = do , CheckAvsUpdate UserMobile _avsInfoPersonMobilePhoneNo , CheckAvsUpdate UserMatrikelnummer $ _avsInfoPersonNo . re _Just -- Maybe im User, aber nicht im AvsInfo; also: `re _Just` work like `to Just` , CheckAvsUpdate UserCompanyPersonalNumber $ _avsInfoInternalPersonalNo . _Just . _avsInternalPersonalNo . re _Just -- Maybe im User und im AvsInfo - ] - eml_up = let -- Comm > Superior > Company > Personal; NOTE: Email update depends simultaneously on AvsFirmInfo and AvsPersonInfo - eml_old = (oldAvsFirmInfo ^. _Just . _avsFirmPrimaryEmail) <|> (oldAvsPersonInfo ^. _Just . _avsInfoPersonEMail) - eml_new = (newAvsFirmInfo ^. _avsFirmPrimaryEmail) <|> (newAvsPersonInfo ^. _avsInfoPersonEMail) - in mkUpdate usr eml_new eml_old $ - CheckAvsUpdate UserDisplayEmail $ to (fromMaybe mempty) . from _CI -- Maybe nicht im User, aber im AvsInfo PROBLEM: Hängt auch von der FirmenEmail ab und muss daher im Verbund betrachtet werden. - -- Note: company address no longer stored with each individual user; referenced with UserCompany instead - -- frm_ups = maybeEmpty oldAvsFirmInfo $ \oldAvsFirmInfo' -> mapMaybe (mkUpdate usr newAvsFirmInfo oldAvsFirmInfo') - -- [ CheckAvsUpdate UserPostAddress _avsFirmPostAddress - -- ] - usr_ups = mcons eml_up per_ups -- <> frm_ups + ] + em_p_up = mkUpdate usr newAvsPersonInfo oldAvsPersonInfo $ + CheckAvsUpdate UserDisplayEmail $ _avsInfoPersonEMail . to (fromMaybe mempty) . from _CI -- Maybe im AvsInfo, aber nicht im User + em_f_up = mkUpdate usr newAvsFirmInfo oldAvsFirmInfo $ -- Email updates erfolgen nur, wenn identisch. Für Firmen-Email leer lassen. + CheckAvsUpdate UserDisplayEmail $ _avsFirmPrimaryEmail . to (fromMaybe mempty) . from _CI + eml_up = em_p_up <|> em_f_up -- ensure that only one email update is produced; there is no Eq instance for the Update type + frm_up = mkUpdate usr newAvsFirmInfo oldAvsFirmInfo $ -- Legacy, if company postal is stored in user; should no longer be true for new users, + CheckAvsUpdate UserPostAddress _avsFirmPostAddress -- since company address should now be referenced with UserCompany instead + usr_ups = eml_up `mcons` (frm_up `mcons` per_ups) avs_ups = ((UserAvsNoPerson =.) <$> readMay (avsInfoPersonNo newAvsPersonInfo)) `mcons` [ UserAvsLastSynch =. now , UserAvsLastSynchError =. Nothing @@ -506,7 +504,7 @@ updateAvsUserByIds apids = do , UserAvsLastFirmInfo =. Just newAvsFirmInfo ] -- - lift $ do -- no more maybe here + lift $ do -- no more maybeT neeed from here update usrId usr_ups oldCompanyMb <- join <$> (getAvsCompany `traverse` oldAvsFirmInfo) let oldCompanyId = entityKey <$> oldCompanyMb @@ -578,7 +576,7 @@ upsertAvsCompany newAvsFirmInfo mbOldAvsFirmInfo = do case (mbFirmEnt, mbOldAvsFirmInfo) of (Nothing, _) -> do -- insert new company let upd = flip updateRecord newAvsFirmInfo - dmy = Company + dmy = Company -- mostly dummy, values are actually prodcued through firmInfo2company below for consistency { companyName = newAvsFirmInfo ^. _avsFirmFirm . from _CI , companyShorthand = newAvsFirmInfo ^. _avsFirmAbbreviation . from _CI , companyAvsId = newAvsFirmInfo ^. _avsFirmFirmNo @@ -588,11 +586,7 @@ upsertAvsCompany newAvsFirmInfo mbOldAvsFirmInfo = do } insert $ foldl' upd dmy firmInfo2company - (Just Entity{entityKey=firmid }, Nothing) -> do -- neither insert nor update; update impossible without old comparison values, since company could have been edited - $logWarnS "AVS" $ "upsertAvsCompany: neither insert nor update. Received existing company " <> (newAvsFirmInfo ^. _avsFirmFirm) <> " without old comparison value for update." - return firmid - - (Just Entity{entityKey=firmid, entityVal=firm}, Just oldAvsFirmInfo) -> do -- possibly update existing company + (Just Entity{entityKey=firmid, entityVal=firm}, oldAvsFirmInfo) -> do -- possibly update existing company, if isJust oldAvsFirmInfo and changed occurred let cmp_ups = mapMaybe (mkUpdate firm newAvsFirmInfo oldAvsFirmInfo) firmInfo2company update firmid cmp_ups return firmid @@ -733,12 +727,11 @@ retrieveDifferingLicences' getStatus = do #else let statQry = avsLicenceDifferences2LicenceIds lDiff lStat <- if getStatus && notNull statQry - then -- throwLeftM $ avsQueryStatus $ AvsQueryStatus statQry -- don't throw up here, licence differences are too important! TODO: Warn in Problem-Handler - avsQueryStatus (AvsQueryStatus statQry) >>= \case - Left err -> do - addMessage Error $ toHtml $ "avsQueryStatus failed for " <> tshow (length statQry) <> " requests with: \n" <> tshow err <> "\nREQUEST:\n" <> tshow statQry - return $ AvsResponseStatus mempty - Right res -> return res + then avsQueryNoCache (AvsQueryStatus statQry) + -- `catch` handler + -- let handler _exception = do + -- addMessage Error $ toHtml $ "avsQueryStatus failed for " <> tshow (length statQry) <> " requests with: \n" <> tshow err <> "\nREQUEST:\n" <> tshow statQry + -- return $ AvsResponseStatus mempty else return $ AvsResponseStatus mempty -- avoid unnecessary avs calls #endif return (lDiff, avsResponseStatusMap lStat)