|
|
|
@ -329,6 +329,8 @@ updateAvsUserByADC newAvsDataContact@(AvsDataContact apid newAvsPersonInfo newAv
|
|
|
|
let usrId = userAvsUser usravs
|
|
|
|
let usrId = userAvsUser usravs
|
|
|
|
usr <- MaybeT $ get usrId
|
|
|
|
usr <- MaybeT $ get usrId
|
|
|
|
lift $ do -- maybeT no longer needed from here onwards
|
|
|
|
lift $ do -- maybeT no longer needed from here onwards
|
|
|
|
|
|
|
|
uuid :: CryptoUUIDUser <- encrypt usrId
|
|
|
|
|
|
|
|
$logInfoS "AVS" [st|updateAvsUserByADC: #{tshow uuid}|]
|
|
|
|
let oldAvsPersonInfo = userAvsLastPersonInfo usravs -- Nothing is ok here
|
|
|
|
let oldAvsPersonInfo = userAvsLastPersonInfo usravs -- Nothing is ok here
|
|
|
|
oldAvsFirmInfo = userAvsLastFirmInfo usravs -- Nothing is ok here
|
|
|
|
oldAvsFirmInfo = userAvsLastFirmInfo usravs -- Nothing is ok here
|
|
|
|
oldAvsCardNo = userAvsLastCardNo usravs & fmap Just
|
|
|
|
oldAvsCardNo = userAvsLastCardNo usravs & fmap Just
|
|
|
|
@ -380,8 +382,10 @@ updateAvsUserByADC newAvsDataContact@(AvsDataContact apid newAvsPersonInfo newAv
|
|
|
|
, UserAvsLastCardNo =. newAvsCardNo
|
|
|
|
, UserAvsLastCardNo =. newAvsCardNo
|
|
|
|
]
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
usr_up2 <- guardMonoidM (oldAvsFirmInfo /= Just newAvsFirmInfo) $ do
|
|
|
|
-- update company association & supervision
|
|
|
|
-- update company association & supervision
|
|
|
|
newCompanyEnt@Entity{entityKey=newCompanyId} <- upsertAvsCompany newAvsFirmInfo oldAvsFirmInfo
|
|
|
|
newCompanyEnt@Entity{entityKey=newCompanyId} <- upsertAvsCompany newAvsFirmInfo oldAvsFirmInfo
|
|
|
|
|
|
|
|
upsertCompanySuperior newCompanyEnt newAvsFirmInfo oldAvsFirmInfo usrId -- ensure firmInfo superior is supervisor for this user
|
|
|
|
oldCompanyEnt <- getAvsCompany `traverseJoin` oldAvsFirmInfo
|
|
|
|
oldCompanyEnt <- getAvsCompany `traverseJoin` oldAvsFirmInfo
|
|
|
|
primaryCompanyId <- userCompanyCompany <<$>> getUserPrimaryCompany usrId
|
|
|
|
primaryCompanyId <- userCompanyCompany <<$>> getUserPrimaryCompany usrId
|
|
|
|
let oldCompanyId = entityKey <$> oldCompanyEnt
|
|
|
|
let oldCompanyId = entityKey <$> oldCompanyEnt
|
|
|
|
@ -398,7 +402,7 @@ updateAvsUserByADC newAvsDataContact@(AvsDataContact apid newAvsPersonInfo newAv
|
|
|
|
superReasonComDef = tshow SupervisorReasonCompanyDefault
|
|
|
|
superReasonComDef = tshow SupervisorReasonCompanyDefault
|
|
|
|
newUserComp = UserCompany usrId newCompanyId False False 1 True Nothing -- default value for new company insertion, if no update can be done
|
|
|
|
newUserComp = UserCompany usrId newCompanyId False False 1 True Nothing -- default value for new company insertion, if no update can be done
|
|
|
|
|
|
|
|
|
|
|
|
usr_up2 <- case oldAvsFirmInfo of
|
|
|
|
case oldAvsFirmInfo of
|
|
|
|
_ | Just newCompanyId == oldCompanyId -- company unchanged entirely
|
|
|
|
_ | Just newCompanyId == oldCompanyId -- company unchanged entirely
|
|
|
|
-> return mempty -- => do nothing
|
|
|
|
-> return mempty -- => do nothing
|
|
|
|
(Just oafi) | isJust (view _avsFirmPostAddressSimple oafi)
|
|
|
|
(Just oafi) | isJust (view _avsFirmPostAddressSimple oafi)
|
|
|
|
@ -445,7 +449,6 @@ updateAvsUserByADC newAvsDataContact@(AvsDataContact apid newAvsPersonInfo newAv
|
|
|
|
-- newAPs <- count $ (UserSupervisorUser ==. usrId) : (UserSupervisorCompany ==. Just newCompanyId) : (UserSupervisorReason ~=. superReasonComDef)
|
|
|
|
-- newAPs <- count $ (UserSupervisorUser ==. usrId) : (UserSupervisorCompany ==. Just newCompanyId) : (UserSupervisorReason ~=. superReasonComDef)
|
|
|
|
-- when (oldAPs > 0 && newAPs <= 0) $ reportAdminProblem $ AdminProblemNewlyUnsupervised usrId oldCompanyId newCompanyId
|
|
|
|
-- when (oldAPs > 0 && newAPs <= 0) $ reportAdminProblem $ AdminProblemNewlyUnsupervised usrId oldCompanyId newCompanyId
|
|
|
|
-- return pst_up
|
|
|
|
-- return pst_up
|
|
|
|
upsertCompanySuperior newCompanyEnt newAvsFirmInfo oldAvsFirmInfo [usrId] -- ensure firmInfo superior is supervisor for this user
|
|
|
|
|
|
|
|
update usrId usr_up2 -- update user by company switch first (due to possible conflicts with usr_up2)
|
|
|
|
update usrId usr_up2 -- update user by company switch first (due to possible conflicts with usr_up2)
|
|
|
|
update usrId usr_up1 -- update user eventually
|
|
|
|
update usrId usr_up1 -- update user eventually
|
|
|
|
update uaId avs_ups -- update stored avsinfo for future updates
|
|
|
|
update uaId avs_ups -- update stored avsinfo for future updates
|
|
|
|
@ -585,16 +588,18 @@ getAvsCompany afi =
|
|
|
|
|
|
|
|
|
|
|
|
-- | insert a company from AVS firm info or update an existing one based on previous values
|
|
|
|
-- | insert a company from AVS firm info or update an existing one based on previous values
|
|
|
|
upsertAvsCompany :: AvsFirmInfo -> Maybe AvsFirmInfo -> DB (Entity Company)
|
|
|
|
upsertAvsCompany :: AvsFirmInfo -> Maybe AvsFirmInfo -> DB (Entity Company)
|
|
|
|
|
|
|
|
-- upsertAvsCompany newAvsFirmInfo (Just oldAvsFirmInfo)
|
|
|
|
|
|
|
|
-- | newAvsFirmInfo == oldAvsFirmInfo = maybeM (upsertAvsCompany newAvsFirmInfo Nothing) pure $ getAvsCompany newAvsFirmInfo -- firmInfo unchanged, shortcircuit; SHORTCIRCUIT no longer needed, checked at call-site due to result not being wrapped in Maybe
|
|
|
|
upsertAvsCompany newAvsFirmInfo mbOldAvsFirmInfo = do
|
|
|
|
upsertAvsCompany newAvsFirmInfo mbOldAvsFirmInfo = do
|
|
|
|
mbFirmEnt <- getAvsCompany newAvsFirmInfo -- primarily by AvsId, then Shorthand, then name
|
|
|
|
mbFirmEnt <- getAvsCompany newAvsFirmInfo -- primarily by AvsId, then Shorthand, then name
|
|
|
|
$logInfoS "AVS" [st|upsertAvsCompany: old #{tshow mbFirmEnt} new #{tshow newAvsFirmInfo}|]
|
|
|
|
$logInfoS "AVS" [st|upsertAvsCompany: old #{tshow mbOldAvsFirmInfo} new #{tshow newAvsFirmInfo} ent-new #{tshow mbFirmEnt}|]
|
|
|
|
case (mbFirmEnt, mbOldAvsFirmInfo) of
|
|
|
|
case mbFirmEnt of
|
|
|
|
(Nothing, _) -> do -- insert new company, neither AvsId nor Shorthand exist in DB
|
|
|
|
Nothing -> do -- insert new company, neither AvsId nor Shorthand exist in DB
|
|
|
|
afn <- if 0 < newAvsFirmInfo ^. _avsFirmFirmNo
|
|
|
|
afn <- if 0 < newAvsFirmInfo ^. _avsFirmFirmNo
|
|
|
|
then return $ newAvsFirmInfo ^. _avsFirmFirmNo
|
|
|
|
then return $ newAvsFirmInfo ^. _avsFirmFirmNo
|
|
|
|
else maybe (-1) (pred . companyAvsId . entityVal) <$> selectMaybe [CompanyAvsId <. 0] [Asc CompanyAvsId]
|
|
|
|
else maybe (-1) (pred . companyAvsId . entityVal) <$> selectMaybe [CompanyAvsId <. 0] [Asc CompanyAvsId]
|
|
|
|
let upd = flip updateRecord newAvsFirmInfo
|
|
|
|
let upd = flip updateRecord newAvsFirmInfo
|
|
|
|
dmy = Company -- mostly dummy, values are actually prodcued through firmInfo2company below for consistency
|
|
|
|
dmy = Company -- mostly dummy, values are actually produced through firmInfo2company below for consistency
|
|
|
|
{ companyName = newAvsFirmInfo ^. _avsFirmFirm . from _CI
|
|
|
|
{ companyName = newAvsFirmInfo ^. _avsFirmFirm . from _CI
|
|
|
|
, companyShorthand = newAvsFirmInfo ^. _avsFirmAbbreviation . from _CI
|
|
|
|
, companyShorthand = newAvsFirmInfo ^. _avsFirmAbbreviation . from _CI
|
|
|
|
, companyAvsId = afn
|
|
|
|
, companyAvsId = afn
|
|
|
|
@ -606,11 +611,12 @@ upsertAvsCompany newAvsFirmInfo mbOldAvsFirmInfo = do
|
|
|
|
$logInfoS "AVS" $ "Insert new company: " <> tshow cmp
|
|
|
|
$logInfoS "AVS" $ "Insert new company: " <> tshow cmp
|
|
|
|
newCmp <- insertEntity cmp
|
|
|
|
newCmp <- insertEntity cmp
|
|
|
|
reportAdminProblem $ AdminProblemNewCompany $ entityKey newCmp
|
|
|
|
reportAdminProblem $ AdminProblemNewCompany $ entityKey newCmp
|
|
|
|
$logInfoS "AVS" "Insert new company completed."
|
|
|
|
|
|
|
|
return newCmp
|
|
|
|
return newCmp
|
|
|
|
|
|
|
|
|
|
|
|
(Just Entity{entityKey=firmid, entityVal=firm}, oldAvsFirmInfo) -> do -- possibly update existing company, if isJust oldAvsFirmInfo and changed occurred
|
|
|
|
(Just Entity{entityKey=firmid, entityVal=firm}) -> do -- possibly update existing company, if isJust oldAvsFirmInfo and identical AvsFirmNo and changes occurred
|
|
|
|
let cmp_ups = mapMaybe (mkUpdate' firm newAvsFirmInfo oldAvsFirmInfo) firmInfo2company
|
|
|
|
let oldHasSameFirmNo = Just (newAvsFirmInfo ^. _avsFirmFirmNo) == (mbOldAvsFirmInfo ^? _Just . _avsFirmFirmNo)
|
|
|
|
|
|
|
|
oldAvsFirmInfo = guardOnM oldHasSameFirmNo mbOldAvsFirmInfo
|
|
|
|
|
|
|
|
cmp_ups = mapMaybe (mkUpdate' firm newAvsFirmInfo oldAvsFirmInfo) firmInfo2company
|
|
|
|
key_ups = mkUpdate' firm newAvsFirmInfo oldAvsFirmInfo firmInfo2key
|
|
|
|
key_ups = mkUpdate' firm newAvsFirmInfo oldAvsFirmInfo firmInfo2key
|
|
|
|
uniq_ups <- mkUpdateCheckUnique' firm newAvsFirmInfo oldAvsFirmInfo firmInfo2companyNo
|
|
|
|
uniq_ups <- mkUpdateCheckUnique' firm newAvsFirmInfo oldAvsFirmInfo firmInfo2companyNo
|
|
|
|
$logInfoS "AVS" [st|Update company #{companyShorthand firm}: #{tshow (length cmp_ups)}, #{tshow (length key_ups)}, #{tshow (length uniq_ups)} for #{tshow oldAvsFirmInfo}|]
|
|
|
|
$logInfoS "AVS" [st|Update company #{companyShorthand firm}: #{tshow (length cmp_ups)}, #{tshow (length key_ups)}, #{tshow (length uniq_ups)} for #{tshow oldAvsFirmInfo}|]
|
|
|
|
@ -629,7 +635,7 @@ upsertAvsCompany newAvsFirmInfo mbOldAvsFirmInfo = do
|
|
|
|
| otherwise -> $logInfoS "AVS" $ "Update company shorthand failed for " <> ciOriginal cmp_key <> " and " <> ciOriginal alt_key
|
|
|
|
| otherwise -> $logInfoS "AVS" $ "Update company shorthand failed for " <> ciOriginal cmp_key <> " and " <> ciOriginal alt_key
|
|
|
|
maybeM (return res_cmp) return $ getBy uniq_cmp
|
|
|
|
maybeM (return res_cmp) return $ getBy uniq_cmp
|
|
|
|
_otherwise -> return res_cmp
|
|
|
|
_otherwise -> return res_cmp
|
|
|
|
$logInfoS "AVS" "Update company completed."
|
|
|
|
$logInfoS "AVS" [st|Update company #{companyShorthand firm} completed.|]
|
|
|
|
return res_cmp2
|
|
|
|
return res_cmp2
|
|
|
|
where
|
|
|
|
where
|
|
|
|
firmInfo2key =
|
|
|
|
firmInfo2key =
|
|
|
|
@ -645,8 +651,8 @@ upsertAvsCompany newAvsFirmInfo mbOldAvsFirmInfo = do
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- | adjust superiors, assumes that CompanyUser exists for all usrs for given company; does not work otherwise
|
|
|
|
-- | adjust superiors, assumes that CompanyUser exists for all usrs for given company; does not work otherwise
|
|
|
|
upsertCompanySuperior :: Entity Company -> AvsFirmInfo -> Maybe AvsFirmInfo -> [UserId] -> DB () -- may return superior (Maybe UserId), but currently not needed
|
|
|
|
upsertCompanySuperior :: Entity Company -> AvsFirmInfo -> Maybe AvsFirmInfo -> UserId -> DB () -- may return superior (Maybe UserId), but currently not needed
|
|
|
|
upsertCompanySuperior Entity{entityKey=cid, entityVal=Company{}} newAfi oldAfi usrs =
|
|
|
|
upsertCompanySuperior Entity{entityKey=cid, entityVal=Company{}} newAfi oldAfi usrId =
|
|
|
|
let reasonSuperior = Just $ tshow SupervisorReasonAvsSuperior
|
|
|
|
let reasonSuperior = Just $ tshow SupervisorReasonAvsSuperior
|
|
|
|
getInsertUid eml = altM (guessUserByEmail $ stripCI eml) (catchAll2log' $ Just . entityKey <$> ldapLookupAndUpsert eml)
|
|
|
|
getInsertUid eml = altM (guessUserByEmail $ stripCI eml) (catchAll2log' $ Just . entityKey <$> ldapLookupAndUpsert eml)
|
|
|
|
newAvsNo = newAfi ^. _avsFirmFirmNo
|
|
|
|
newAvsNo = newAfi ^. _avsFirmFirmNo
|
|
|
|
@ -655,22 +661,26 @@ upsertCompanySuperior Entity{entityKey=cid, entityVal=Company{}} newAfi oldAfi u
|
|
|
|
mbOldEmail = oldAfi ^? _Just . _avsFirmEMailSuperior . _Just
|
|
|
|
mbOldEmail = oldAfi ^? _Just . _avsFirmEMailSuperior . _Just
|
|
|
|
getSupId = getInsertUid `traverseJoin` mbSupEmail
|
|
|
|
getSupId = getInsertUid `traverseJoin` mbSupEmail
|
|
|
|
getOldId = (guessUserByEmail . stripCI) `traverseJoin` mbOldEmail
|
|
|
|
getOldId = (guessUserByEmail . stripCI) `traverseJoin` mbOldEmail
|
|
|
|
|
|
|
|
getSupervision :: Maybe UserId -> DB (Maybe (Entity UserSupervisor))
|
|
|
|
|
|
|
|
getSupervision = traverseJoin (getBy . flip UniqueUserSupervisor usrId)
|
|
|
|
unchangedCompany = oldAvsNo == Just newAvsNo
|
|
|
|
unchangedCompany = oldAvsNo == Just newAvsNo
|
|
|
|
changedSuperior = mbSupEmail /= mbOldEmail -- beware, both could be Nothing
|
|
|
|
changedSuperior = mbSupEmail /= mbOldEmail -- beware we only have AvsFirmInfo for one user; also both could be Nothing
|
|
|
|
-- 1. not unchangedCompany: do not delete, but ensure that superior supervision is set, since it could be a just a single user company change
|
|
|
|
-- 1. not unchangedCompany: do not delete, but ensure that superior supervision is set, since it could be a just a single user company change
|
|
|
|
-- 2. unchangedCompany && not changedSuperior: superior must already been set, short-circuit
|
|
|
|
-- 2. unchangedCompany && not changedSuperior: superior must already been set, short-circuit
|
|
|
|
-- 3. unchangedCompany && changedSuperior: update superior for all users
|
|
|
|
-- 3. unchangedCompany && changedSuperior: update superior for all users
|
|
|
|
in unless (unchangedCompany && not changedSuperior) $ do -- do nothing if (unchangedCompany && not changedSuperior).
|
|
|
|
in unless (unchangedCompany && not changedSuperior) $ do -- do nothing if (unchangedCompany && not changedSuperior).
|
|
|
|
mbSupId <- getSupId
|
|
|
|
mbSupId <- getSupId
|
|
|
|
|
|
|
|
mbUsrSup <- getSupervision mbSupId
|
|
|
|
-- delete old superiors, if any
|
|
|
|
-- delete old superiors, if any
|
|
|
|
when (unchangedCompany && changedSuperior) $
|
|
|
|
when (unchangedCompany && changedSuperior) $
|
|
|
|
deleteWhere $ mcons ((UserSupervisorSupervisor !=.) <$> mbSupId)
|
|
|
|
deleteWhere $ mcons ((UserSupervisorSupervisor !=.) <$> mbSupId)
|
|
|
|
[ UserSupervisorCompany ==. Just cid, UserSupervisorReason ==. reasonSuperior ]
|
|
|
|
[ UserSupervisorCompany ==. Just cid, UserSupervisorReason ==. reasonSuperior ]
|
|
|
|
unless unchangedCompany $
|
|
|
|
unless unchangedCompany $
|
|
|
|
deleteWhere [ UserSupervisorReason ==. reasonSuperior, UserSupervisorUser <-. usrs ]
|
|
|
|
deleteWhere [ UserSupervisorReason ==. reasonSuperior, UserSupervisorUser ==. usrId ]
|
|
|
|
-- ensure superior supervision
|
|
|
|
-- ensure superior supervision
|
|
|
|
case mbSupId of
|
|
|
|
case (mbSupId, mbUsrSup) of
|
|
|
|
Just supId -> do
|
|
|
|
(_ , Just _) -> return () -- supId is already supervisor for uid for any reason
|
|
|
|
|
|
|
|
(Just supId, Nothing) -> do
|
|
|
|
-- ensure association between company and superior at equal-to-top priority
|
|
|
|
-- ensure association between company and superior at equal-to-top priority
|
|
|
|
prio <- getCompanyUserMaxPrio supId
|
|
|
|
prio <- getCompanyUserMaxPrio supId
|
|
|
|
void $ insertUnique (UserCompany supId cid False False prio True reasonSuperior) -- superior is not a supervisor, do not change existing user company associations
|
|
|
|
void $ insertUnique (UserCompany supId cid False False prio True reasonSuperior) -- superior is not a supervisor, do not change existing user company associations
|
|
|
|
@ -702,7 +712,7 @@ upsertCompanySuperior Entity{entityKey=cid, entityVal=Company{}} newAfi oldAfi u
|
|
|
|
when (unchangedCompany && changedSuperior) $ do
|
|
|
|
when (unchangedCompany && changedSuperior) $ do
|
|
|
|
oldSupId <- getOldId
|
|
|
|
oldSupId <- getOldId
|
|
|
|
reportAdminProblem $ AdminProblemCompanySuperiorChange supId cid oldSupId
|
|
|
|
reportAdminProblem $ AdminProblemCompanySuperiorChange supId cid oldSupId
|
|
|
|
Nothing ->
|
|
|
|
(Nothing, Nothing) ->
|
|
|
|
when (unchangedCompany && changedSuperior) $ do
|
|
|
|
when (unchangedCompany && changedSuperior) $ do
|
|
|
|
oldSupId <- getOldId
|
|
|
|
oldSupId <- getOldId
|
|
|
|
reportAdminProblem $ AdminProblemCompanySuperiorNotFound mbSupEmail cid oldSupId
|
|
|
|
reportAdminProblem $ AdminProblemCompanySuperiorNotFound mbSupEmail cid oldSupId
|
|
|
|
|