diff --git a/src/Handler/Admin.hs b/src/Handler/Admin.hs index 500053b0b..e3c04c0de 100644 --- a/src/Handler/Admin.hs +++ b/src/Handler/Admin.hs @@ -195,8 +195,7 @@ mkUnreachableUsersTable = do -} areAllUsersReachable :: DB Bool --- areAllUsersReachable = isNothing <$> E.selectOne retrieveUnreachableUsers' --- areAllUsersReachable = E.selectNotExists retrieveUnreachableUsers' +-- areAllUsersReachable = E.selectNotExists retrieveUnreachableUsers' -- works and would be more efficient, but we cannot check proper email validity within DB alone areAllUsersReachable = null <$> retrieveUnreachableUsers -- retrieveUnreachableUsers' :: E.SqlQuery (E.SqlExpr (Entity User)) @@ -214,8 +213,16 @@ retrieveUnreachableUsers = do user <- E.from $ E.table @User E.where_ $ E.isNothing (user E.^. UserPostAddress) E.&&. (E.isNothing (user E.^. UserCompanyDepartment) E.||. user E.^. UserCompanyPersonalNumber `E.ilike` E.justVal "E%") + E.&&. E.notExists (do + (cmp :& usrCmp) <- E.from $ E.table @Company `E.innerJoin` E.table @UserCompany + `E.on` (\(cmp :& usrCmp) -> cmp E.^. CompanyId E.==. usrCmp E.^. UserCompanyCompany) + E.where_ $ user E.^. UserId E.==. usrCmp E.^. UserCompanyUser + E.&&. usrCmp E.^. UserCompanyUseCompanyAddress + E.&&. E.isJust (cmp E.^. CompanyPostAddress) + ) return user filterM hasInvalidEmail emailOnlyUsers + -- filterM hasInvalifPostal -- probably not worth it, since Utils.Postal.validPostAddress is pretty weak anyway where hasInvalidEmail = fmap isNothing . getUserEmail