private void butOK_Click(object sender, EventArgs e) { if (textUserName.Text == "") { OpenDental.MessageBox.Show(this, "Please enter a username."); return; } if (listUserGroup.SelectedItems.Count == 0) { OpenDental.MessageBox.Show(this, "Every user must be associated to at least one User Group."); return; } List <AlertSub> listAlertSubsCur = new List <AlertSub>(); foreach (int index in listAlertSubMulti.SelectedIndices) { AlertSub alertSub = new AlertSub(); alertSub.ClinicNum = 0; alertSub.UserNum = Security.CurUser.UserNum; alertSub.Type = (AlertType)index; listAlertSubsCur.Add(alertSub); } AlertSubs.Sync(listAlertSubsCur, _listAlertSubsOld); UserCur.IsHidden = checkIsHidden.Checked; UserCur.UserName = textUserName.Text; if (UserCur.UserNum == Security.CurUser.UserNum) { Security.CurUser.UserName = textUserName.Text; //They changed their logged in user's information. Update for when they sync then attempt to connect to remote DB. } UserCur.EmployeeNum = 0; UserCur.ProvNum = 0; UserCur.ClinicNum = 0; UserCur.ClinicIsRestricted = false; try{ if (UserCur.IsNew) { //also updates the user's UserNumCEMT to be the user's usernum. long userNum = Userods.Insert(UserCur, listUserGroup.SelectedItems.OfType <ODBoxItem <UserGroup> >().Select(x => x.Tag.UserGroupNum).ToList(), true); } else { Userods.Update(UserCur, listUserGroup.SelectedItems.OfType <ODBoxItem <UserGroup> >().Select(x => x.Tag.UserGroupNum).ToList()); } } catch (Exception ex) { OpenDental.MessageBox.Show(ex.Message); return; } Cache.Refresh(InvalidType.Security); DialogResult = DialogResult.OK; }
private void FormCentralUserEdit_Load(object sender, EventArgs e) { checkIsHidden.Checked = UserCur.IsHidden; textUserName.Text = UserCur.UserName; List <UserGroup> listUserGroups = UserGroups.GetDeepCopy(); _isFillingList = true; for (int i = 0; i < listUserGroups.Count; i++) { UserGroup groupCur = listUserGroups[i]; ODBoxItem <UserGroup> boxItemGroup = new ODBoxItem <UserGroup>(groupCur.Description, groupCur); listUserGroup.Items.Add(boxItemGroup); if (UserCur.IsInUserGroup(groupCur.UserGroupNum)) { listUserGroup.SetSelected(i, true); } } if (listUserGroup.SelectedIndex == -1) //never allowed to delete last group, so this won't fail { listUserGroup.SelectedIndex = 0; } _isFillingList = false; securityTreeUser.FillTreePermissionsInitial(); RefreshUserTree(); if (UserCur.PasswordHash == "") { butPassword.Text = "Create Password"; } _listAlertSubsOld = AlertSubs.GetAllForUser(Security.CurUser.UserNum); listAlertSubMulti.Items.Clear(); string[] arrayAlertTypes = Enum.GetNames(typeof(AlertType)); for (int i = 0; i < arrayAlertTypes.Length; i++) { listAlertSubMulti.Items.Add(arrayAlertTypes[i]); listAlertSubMulti.SetSelected(i, _listAlertSubsOld.Exists(x => x.Type == (AlertType)i)); } if (UserCur.IsNew) { butUnlock.Visible = false; } }
private void FormUserEdit_Load(object sender, System.EventArgs e) { checkIsHidden.Checked = UserCur.IsHidden; if (UserCur.UserNum != 0) { textUserNum.Text = UserCur.UserNum.ToString(); } textUserName.Text = UserCur.UserName; textDomainUser.Text = UserCur.DomainUser; if (!PrefC.GetBool(PrefName.DomainLoginEnabled)) { labelDomainUser.Visible = false; textDomainUser.Visible = false; butPickDomainUser.Visible = false; } checkRequireReset.Checked = UserCur.IsPasswordResetRequired; _listUserGroups = UserGroups.GetList(); _isFillingList = true; for (int i = 0; i < _listUserGroups.Count; i++) { listUserGroup.Items.Add(new ODBoxItem <UserGroup>(_listUserGroups[i].Description, _listUserGroups[i])); if (!_isFromAddUser && UserCur.IsInUserGroup(_listUserGroups[i].UserGroupNum)) { listUserGroup.SetSelected(i, true); } if (_isFromAddUser && _listUserGroups[i].UserGroupNum == PrefC.GetLong(PrefName.DefaultUserGroup)) { listUserGroup.SetSelected(i, true); } } if (listUserGroup.SelectedIndex == -1) //never allowed to delete last group, so this won't fail { listUserGroup.SelectedIndex = 0; } _isFillingList = false; securityTreeUser.FillTreePermissionsInitial(); RefreshUserTree(); listEmployee.Items.Clear(); listEmployee.Items.Add(Lan.g(this, "none")); listEmployee.SelectedIndex = 0; _listEmployees = Employees.GetDeepCopy(true); for (int i = 0; i < _listEmployees.Count; i++) { listEmployee.Items.Add(Employees.GetNameFL(_listEmployees[i])); if (UserCur.EmployeeNum == _listEmployees[i].EmployeeNum) { listEmployee.SelectedIndex = i + 1; } } listProv.Items.Clear(); listProv.Items.Add(Lan.g(this, "none")); listProv.SelectedIndex = 0; _listProviders = Providers.GetDeepCopy(true); for (int i = 0; i < _listProviders.Count; i++) { listProv.Items.Add(_listProviders[i].GetLongDesc()); if (UserCur.ProvNum == _listProviders[i].ProvNum) { listProv.SelectedIndex = i + 1; } } _listClinics = Clinics.GetDeepCopy(true); _listUserAlertTypesOld = AlertSubs.GetAllForUser(UserCur.UserNum); List <long> listSubscribedClinics; bool isAllClinicsSubscribed = false; if (_listUserAlertTypesOld.Select(x => x.ClinicNum).Contains(-1)) //User subscribed to all clinics { isAllClinicsSubscribed = true; listSubscribedClinics = _listClinics.Select(x => x.ClinicNum).Distinct().ToList(); } else { listSubscribedClinics = _listUserAlertTypesOld.Select(x => x.ClinicNum).Distinct().ToList(); } List <long> listAlertCatNums = _listUserAlertTypesOld.Select(x => x.AlertCategoryNum).Distinct().ToList(); listAlertSubMulti.Items.Clear(); _listAlertCategories = AlertCategories.GetDeepCopy(); List <long> listUserAlertCatNums = _listUserAlertTypesOld.Select(x => x.AlertCategoryNum).ToList(); foreach (AlertCategory cat in _listAlertCategories) { int index = listAlertSubMulti.Items.Add(Lan.g(this, cat.Description)); listAlertSubMulti.SetSelected(index, listUserAlertCatNums.Contains(cat.AlertCategoryNum)); } if (!PrefC.HasClinicsEnabled) { tabClinics.Enabled = false; //Disables all controls in the clinics tab. Tab is still selectable. listAlertSubsClinicsMulti.Visible = false; labelAlertClinic.Visible = false; } else { listClinic.Items.Clear(); listClinic.Items.Add(Lan.g(this, "All")); listAlertSubsClinicsMulti.Items.Add(Lan.g(this, "All")); listAlertSubsClinicsMulti.Items.Add(Lan.g(this, "Headquarters")); if (UserCur.ClinicNum == 0) //Unrestricted { listClinic.SetSelected(0, true); checkClinicIsRestricted.Enabled = false; //We don't really need this checkbox any more but it's probably better for users to keep it.... } if (isAllClinicsSubscribed) //They are subscribed to all clinics { listAlertSubsClinicsMulti.SetSelected(0, true); } else if (listSubscribedClinics.Contains(0)) //They are subscribed to Headquarters { listAlertSubsClinicsMulti.SetSelected(1, true); } List <UserClinic> listUserClinics = UserClinics.GetForUser(UserCur.UserNum); for (int i = 0; i < _listClinics.Count; i++) { listClinic.Items.Add(_listClinics[i].Abbr); listClinicMulti.Items.Add(_listClinics[i].Abbr); listAlertSubsClinicsMulti.Items.Add(_listClinics[i].Abbr); if (UserCur.ClinicNum == _listClinics[i].ClinicNum) { listClinic.SetSelected(i + 1, true); } if (UserCur.ClinicNum != 0 && listUserClinics.Exists(x => x.ClinicNum == _listClinics[i].ClinicNum)) { listClinicMulti.SetSelected(i, true); //No "All" option, don't select i+1 } if (!isAllClinicsSubscribed && _listUserAlertTypesOld.Exists(x => x.ClinicNum == _listClinics[i].ClinicNum)) { listAlertSubsClinicsMulti.SetSelected(i + 2, true); //All+HQ } } checkClinicIsRestricted.Checked = UserCur.ClinicIsRestricted; } if (string.IsNullOrEmpty(UserCur.PasswordHash)) { butPassword.Text = Lan.g(this, "Create Password"); } if (!PrefC.IsODHQ) { butJobRoles.Visible = false; } if (IsNew) { butUnlock.Visible = false; } _listDoseSpotUserPrefOld = UserOdPrefs.GetByUserAndFkeyAndFkeyType(UserCur.UserNum, Programs.GetCur(ProgramName.eRx).ProgramNum, UserOdFkeyType.Program, Clinics.GetForUserod(Security.CurUser, true).Select(x => x.ClinicNum) .Union(new List <long>() { 0 }) //Always include 0 clinic, this is the default, NOT a headquarters only value. .Distinct() .ToList()); _listDoseSpotUserPrefNew = _listDoseSpotUserPrefOld.Select(x => x.Clone()).ToList(); _doseSpotUserPrefDefault = _listDoseSpotUserPrefNew.Find(x => x.ClinicNum == 0); if (_doseSpotUserPrefDefault == null) { _doseSpotUserPrefDefault = DoseSpot.GetDoseSpotUserIdFromPref(UserCur.UserNum, 0); _listDoseSpotUserPrefNew.Add(_doseSpotUserPrefDefault); } textDoseSpotUserID.Text = _doseSpotUserPrefDefault.ValueString; if (_isFromAddUser && !Security.IsAuthorized(Permissions.SecurityAdmin, true)) { butPassword.Visible = false; checkRequireReset.Checked = true; checkRequireReset.Enabled = false; butUnlock.Visible = false; butJobRoles.Visible = false; } if (!PrefC.HasClinicsEnabled) { butDoseSpotAdditional.Visible = false; } }
private void butOK_Click(object sender, System.EventArgs e) { if (textUserName.Text == "") { MsgBox.Show(this, "Please enter a username."); return; } if (!_isFromAddUser && IsNew && PrefC.GetBool(PrefName.PasswordsMustBeStrong) && string.IsNullOrWhiteSpace(_passwordTyped)) { MsgBox.Show(this, "Password may not be blank when the strong password feature is turned on."); return; } if (PrefC.HasClinicsEnabled && listClinic.SelectedIndex == -1) { MsgBox.Show(this, "This user does not have a User Default Clinic set. Please choose one to continue."); return; } if (listUserGroup.SelectedIndices.Count == 0) { MsgBox.Show(this, "Users must have at least one user group associated. Please select a user group to continue."); return; } if (_isFromAddUser && !Security.IsAuthorized(Permissions.SecurityAdmin, true) && (listUserGroup.SelectedItems.Count != 1 || listUserGroup.GetSelected <UserGroup>().UserGroupNum != PrefC.GetLong(PrefName.DefaultUserGroup))) { MsgBox.Show(this, "This user must be assigned to the default user group."); for (int i = 0; i < listUserGroup.Items.Count; i++) { if (((ODBoxItem <UserGroup>)listUserGroup.Items[i]).Tag.UserGroupNum == PrefC.GetLong(PrefName.DefaultUserGroup)) { listUserGroup.SetSelected(i, true); } else { listUserGroup.SetSelected(i, false); } } return; } List <UserClinic> listUserClinics = new List <UserClinic>(); if (PrefC.HasClinicsEnabled && checkClinicIsRestricted.Checked) //They want to restrict the user to certain clinics or clinics are enabled. { for (int i = 0; i < listClinicMulti.SelectedIndices.Count; i++) { listUserClinics.Add(new UserClinic(_listClinics[listClinicMulti.SelectedIndices[i]].ClinicNum, UserCur.UserNum)); } //If they set the user up with a default clinic and it's not in the restricted list, return. if (!listUserClinics.Exists(x => x.ClinicNum == _listClinics[listClinic.SelectedIndex - 1].ClinicNum)) { MsgBox.Show(this, "User cannot have a default clinic that they are not restricted to."); return; } } if (!PrefC.HasClinicsEnabled || listClinic.SelectedIndex == 0) { UserCur.ClinicNum = 0; } else { UserCur.ClinicNum = _listClinics[listClinic.SelectedIndex - 1].ClinicNum; } UserCur.ClinicIsRestricted = checkClinicIsRestricted.Checked; //This is kept in sync with their choice of "All". UserCur.IsHidden = checkIsHidden.Checked; UserCur.IsPasswordResetRequired = checkRequireReset.Checked; UserCur.UserName = textUserName.Text; if (listEmployee.SelectedIndex == 0) { UserCur.EmployeeNum = 0; } else { UserCur.EmployeeNum = _listEmployees[listEmployee.SelectedIndex - 1].EmployeeNum; } if (listProv.SelectedIndex == 0) { Provider prov = Providers.GetProv(UserCur.ProvNum); if (prov != null) { prov.IsInstructor = false; //If there are more than 1 users associated to this provider, they will no longer be an instructor. Providers.Update(prov); } UserCur.ProvNum = 0; } else { Provider prov = Providers.GetProv(UserCur.ProvNum); if (prov != null) { if (prov.ProvNum != _listProviders[listProv.SelectedIndex - 1].ProvNum) { prov.IsInstructor = false; //If there are more than 1 users associated to this provider, they will no longer be an instructor. } Providers.Update(prov); } UserCur.ProvNum = _listProviders[listProv.SelectedIndex - 1].ProvNum; } try{ if (IsNew) { Userods.Insert(UserCur, listUserGroup.SelectedItems.OfType <ODBoxItem <UserGroup> >().Select(x => x.Tag.UserGroupNum).ToList()); //Set the userodprefs to the new user's UserNum that was just retreived from the database. _listDoseSpotUserPrefNew.ForEach(x => x.UserNum = UserCur.UserNum); listUserClinics.ForEach(x => x.UserNum = UserCur.UserNum); //Set the user clinic's UserNum to the one we just inserted. SecurityLogs.MakeLogEntry(Permissions.AddNewUser, 0, "New user '" + UserCur.UserName + "' added"); } else { List <UserGroup> listNewUserGroups = listUserGroup.SelectedItems.OfType <ODBoxItem <UserGroup> >().Select(x => x.Tag).ToList(); List <UserGroup> listOldUserGroups = UserCur.GetGroups(); Userods.Update(UserCur, listNewUserGroups.Select(x => x.UserGroupNum).ToList()); //if this is the current user, update the user, credentials, etc. if (UserCur.UserNum == Security.CurUser.UserNum) { Security.CurUser = UserCur.Copy(); if (_passwordTyped != null) { Security.PasswordTyped = _passwordTyped; //update the password typed for middle tier refresh } } //Log changes to the User's UserGroups. Func <List <UserGroup>, List <UserGroup>, List <UserGroup> > funcGetMissing = (listCur, listCompare) => { List <UserGroup> retVal = new List <UserGroup>(); foreach (UserGroup group in listCur) { if (listCompare.Exists(x => x.UserGroupNum == group.UserGroupNum)) { continue; } retVal.Add(group); } return(retVal); }; List <UserGroup> listRemovedGroups = funcGetMissing(listOldUserGroups, listNewUserGroups); List <UserGroup> listAddedGroups = funcGetMissing(listNewUserGroups, listOldUserGroups); if (listRemovedGroups.Count > 0) //Only log if there are items in the list { SecurityLogs.MakeLogEntry(Permissions.SecurityAdmin, 0, "User " + UserCur.UserName + " removed from User group(s): " + string.Join(", ", listRemovedGroups.Select(x => x.Description).ToArray()) + " by: " + Security.CurUser.UserName); } if (listAddedGroups.Count > 0) //Only log if there are items in the list. { SecurityLogs.MakeLogEntry(Permissions.SecurityAdmin, 0, "User " + UserCur.UserName + " added to User group(s): " + string.Join(", ", listAddedGroups.Select(x => x.Description).ToArray()) + " by: " + Security.CurUser.UserName); } } if (UserClinics.Sync(listUserClinics, UserCur.UserNum)) //Either syncs new list, or clears old list if no longer restricted. { DataValid.SetInvalid(InvalidType.UserClinics); } } catch (Exception ex) { MessageBox.Show(ex.Message); return; } //DoseSpot User ID Insert/Update/Delete if (_doseSpotUserPrefDefault.ValueString != textDoseSpotUserID.Text) { if (string.IsNullOrWhiteSpace(textDoseSpotUserID.Text)) { UserOdPrefs.DeleteMany(_doseSpotUserPrefDefault.UserNum, _doseSpotUserPrefDefault.Fkey, UserOdFkeyType.Program); } else { _doseSpotUserPrefDefault.ValueString = textDoseSpotUserID.Text.Trim(); UserOdPrefs.Upsert(_doseSpotUserPrefDefault); } } DataValid.SetInvalid(InvalidType.Security); //List of AlertTypes that are selected. List <long> listUserAlertCats = new List <long>(); foreach (int index in listAlertSubMulti.SelectedIndices) { listUserAlertCats.Add(_listAlertCategories[index].AlertCategoryNum); } List <long> listClinics = new List <long>(); foreach (int index in listAlertSubsClinicsMulti.SelectedIndices) { if (index == 0) //All { listClinics.Add(-1); //Add All break; } if (index == 1) //HQ { listClinics.Add(0); continue; } Clinic clinic = _listClinics[index - 2]; //Subtract 2 for 'All' and 'HQ' listClinics.Add(clinic.ClinicNum); } List <AlertSub> _listUserAlertTypesNew = _listUserAlertTypesOld.Select(x => x.Copy()).ToList(); //Remove AlertTypes that have been deselected through either deslecting the type or clinic. _listUserAlertTypesNew.RemoveAll(x => !listUserAlertCats.Contains(x.AlertCategoryNum)); if (PrefC.HasClinicsEnabled) { _listUserAlertTypesNew.RemoveAll(x => !listClinics.Contains(x.ClinicNum)); } foreach (long alertCatNum in listUserAlertCats) { if (!PrefC.HasClinicsEnabled) { if (!_listUserAlertTypesOld.Exists(x => x.AlertCategoryNum == alertCatNum)) //Was not subscribed to type. { _listUserAlertTypesNew.Add(new AlertSub(UserCur.UserNum, 0, alertCatNum)); } } else //Clinics enabled. { foreach (long clinicNumCur in listClinics) { if (!_listUserAlertTypesOld.Exists(x => x.ClinicNum == clinicNumCur && x.AlertCategoryNum == alertCatNum)) //Was not subscribed to type. { _listUserAlertTypesNew.Add(new AlertSub(UserCur.UserNum, clinicNumCur, alertCatNum)); continue; } } } } AlertSubs.Sync(_listUserAlertTypesNew, _listUserAlertTypesOld); UserOdPrefs.Sync(_listDoseSpotUserPrefNew, _listDoseSpotUserPrefOld); DialogResult = DialogResult.OK; }
///<summary>Generic function that launches different thread methods depending on how isSyncUsers and isSyncLocks are set. Set only one or the other to true.</summary> private static string SyncAll(List <CentralConnection> listConns, bool isSyncUsers, bool isSyncLocks) { //Get CEMT users, groups, and associated permissions ListSyncErrors = new List <string>(); _listCEMTUsers = Userods.GetUsersForCEMT(); _securityLockDate = PrefC.GetDate(PrefName.SecurityLockDate).ToShortDateString(); _securityLockDays = PrefC.GetInt(PrefName.SecurityLockDays); _securityLockAdmin = PrefC.GetBool(PrefName.SecurityLockIncludesAdmin); _securityCentralLock = PrefC.GetBool(PrefName.CentralManagerSecurityLock); _syncCode = PrefC.GetString(PrefName.CentralManagerSyncCode); _listAlertSubs = AlertSubs.GetAll(); List <CentralUserData> listCentralUserData = new List <CentralUserData>(); List <UserGroup> listUserGroups = UserGroups.GetCEMTGroups(); foreach (UserGroup userGroup in listUserGroups) //for each CEMT user group //get all usergroupattaches, userods, and grouppermissions. { List <UserGroupAttach> listUserGroupAttaches = UserGroupAttaches.GetForUserGroup(userGroup.UserGroupNum); List <Userod> listUserOds = Userods.GetForGroup(userGroup.UserGroupNum); List <GroupPermission> listGroupPermissions = GroupPermissions.GetPerms(userGroup.UserGroupNum); //then create a new CentralUserData and add it to the list. listCentralUserData.Add(new CentralUserData(userGroup, listUserOds, listGroupPermissions, listUserGroupAttaches)); } string failedConns = ""; string nameConflicts = ""; string failedSyncCodes = ""; for (int i = 0; i < listConns.Count; i++) { List <CentralUserData> listCentralDataForThreads = new List <CentralUserData>(); for (int j = 0; j < listCentralUserData.Count; j++) { listCentralDataForThreads.Add(listCentralUserData[j].Copy()); } ODThread odThread = null; if (isSyncUsers) { odThread = new ODThread(ConnectAndSyncUsers, new object[] { listConns[i], listCentralDataForThreads }); odThread.AddExceptionHandler(new ODThread.ExceptionDelegate(SyncExceptionHelper)); } else if (isSyncLocks) { odThread = new ODThread(ConnectAndSyncLocks, new object[] { listConns[i] }); odThread.AddExceptionHandler(new ODThread.ExceptionDelegate(SyncExceptionHelper)); } else { odThread = new ODThread(ConnectAndSyncAll, new object[] { listConns[i], listCentralDataForThreads }); odThread.AddExceptionHandler(new ODThread.ExceptionDelegate(SyncExceptionHelper)); } odThread.GroupName = "Sync"; odThread.Start(false); } ODThread.JoinThreadsByGroupName(Timeout.Infinite, "Sync"); List <ODThread> listComplThreads = ODThread.GetThreadsByGroupName("Sync"); for (int i = 0; i < listComplThreads.Count; i++) { if (listComplThreads[i].Tag == null) { continue; //Failed due to lacking credentials } failedConns += ((List <string>)listComplThreads[i].Tag)[0]; nameConflicts += ((List <string>)listComplThreads[i].Tag)[1]; failedSyncCodes += ((List <string>)listComplThreads[i].Tag)[2]; listComplThreads[i].QuitAsync(); } string errorText = ""; if (failedConns == "" && nameConflicts == "" && failedSyncCodes == "") { errorText += "Done"; } if (failedConns != "") { errorText = "Failed Connections:\r\n" + failedConns + "Please try these connections again.\r\n"; } if (nameConflicts != "") { errorText += "Name Conflicts:\r\n" + nameConflicts + "Please rename users and try again.\r\n"; } if (failedSyncCodes != "") { errorText += "Incorrect Sync Codes:\r\n" + failedSyncCodes + "\r\n"; } return(errorText); }
///<summary>Function used by threads to connect to remote databases and sync user settings.</summary> private static void ConnectAndSyncUsers(ODThread odThread) { CentralConnection connection = (CentralConnection)odThread.Parameters[0]; List <CentralUserData> listCentralUserData = (List <CentralUserData>)odThread.Parameters[1]; string serverName = ""; if (connection.ServiceURI != "") { serverName = connection.ServiceURI; } else { serverName = connection.ServerName + ", " + connection.DatabaseName; } if (!CentralConnectionHelper.UpdateCentralConnection(connection, false)) //No updating the cache since we're going to be connecting to multiple remote servers at the same time. { odThread.Tag = new List <string>() { serverName + "\r\n", "", "" }; connection.ConnectionStatus = "OFFLINE"; return; } string remoteSyncCode = PrefC.GetStringNoCache(PrefName.CentralManagerSyncCode); if (remoteSyncCode != _syncCode) { if (remoteSyncCode == "") { Prefs.UpdateStringNoCache(PrefName.CentralManagerSyncCode, _syncCode); //Lock in the sync code for the remote server. } else { odThread.Tag = new List <string>() { serverName + "\r\n", "", remoteSyncCode }; return; } } //Get remote users, usergroups, associated permissions, and alertsubs List <Userod> listRemoteUsers = Userods.GetUsersNoCache(); #region Detect Conflicts //User conflicts bool nameConflict = false; string nameConflicts = ""; for (int i = 0; i < _listCEMTUsers.Count; i++) { for (int j = 0; j < listRemoteUsers.Count; j++) { if (listRemoteUsers[j].UserName == _listCEMTUsers[i].UserName && listRemoteUsers[j].UserNumCEMT == 0) //User doesn't belong to CEMT { nameConflicts += listRemoteUsers[j].UserName + " already exists in " + serverName + "\r\n"; nameConflict = true; break; } } } if (nameConflict) { odThread.Tag = new List <string>() { serverName + "\r\n", nameConflicts, "" }; return; //Skip on to the next connection. } #endregion Detect Conflicts List <UserGroup> listRemoteCEMTUserGroups = UserGroups.GetCEMTGroupsNoCache(); List <UserGroup> listCEMTUserGroups = new List <UserGroup>(); List <AlertSub> listRemoteAlertSubs = AlertSubs.GetAll(); List <Clinic> listRemoteClinics = Clinics.GetClinicsNoCache(); List <AlertSub> listAlertSubsToInsert = new List <AlertSub>(); for (int i = 0; i < listCentralUserData.Count; i++) { listCEMTUserGroups.Add(listCentralUserData[i].UserGroup.Copy()); } //SyncUserGroups returns the list of UserGroups for deletion so it can be used after syncing Users and GroupPermissions. List <UserGroup> listRemoteCEMTUserGroupsForDeletion = CentralUserGroups.Sync(listCEMTUserGroups, listRemoteCEMTUserGroups); listRemoteCEMTUserGroups = UserGroups.GetCEMTGroupsNoCache(); for (int i = 0; i < listCentralUserData.Count; i++) { List <GroupPermission> listGroupPerms = new List <GroupPermission>(); for (int j = 0; j < listRemoteCEMTUserGroups.Count; j++) { if (listCentralUserData[i].UserGroup.UserGroupNumCEMT == listRemoteCEMTUserGroups[j].UserGroupNumCEMT) { for (int k = 0; k < listCentralUserData[i].ListGroupPermissions.Count; k++) { listCentralUserData[i].ListGroupPermissions[k].UserGroupNum = listRemoteCEMTUserGroups[j].UserGroupNum; //fixing primary keys to be what's in remote db } listGroupPerms = GroupPermissions.GetPermsNoCache(listRemoteCEMTUserGroups[j].UserGroupNum); } } CentralUserods.Sync(listCentralUserData[i].ListUsers, listRemoteUsers); CentralGroupPermissions.Sync(listCentralUserData[i].ListGroupPermissions, listGroupPerms); } //Sync usergroup attaches SyncUserGroupAttaches(listCentralUserData); for (int j = 0; j < listRemoteCEMTUserGroupsForDeletion.Count; j++) { UserGroups.DeleteNoCache(listRemoteCEMTUserGroupsForDeletion[j]); } if (_listAlertSubs.Count > 0) { listRemoteUsers = Userods.GetUsersNoCache(); //Refresh users so we can do alertsubs. } //For each AlertSub, make a copy of that AlertSub for each Clinic. foreach (AlertSub alertSub in _listAlertSubs) { foreach (Clinic clinic in listRemoteClinics) { AlertSub alert = new AlertSub(); alert.ClinicNum = clinic.ClinicNum; alert.Type = alertSub.Type; alert.UserNum = listRemoteUsers.Find(x => x.UserName == _listCEMTUsers.Find(y => y.UserNum == alertSub.UserNum).UserName).UserNum; listAlertSubsToInsert.Add(alert); } } AlertSubs.DeleteAndInsertForSuperUsers(_listCEMTUsers, listAlertSubsToInsert); //Refresh server's cache of userods Signalods.SetInvalidNoCache(InvalidType.Security); SecurityLogs.MakeLogEntryNoCache(Permissions.SecurityAdmin, 0, "Enterprise Management Tool synced users."); odThread.Tag = new List <string>() { "", "", "" }; //No errors. }
public void AlertItems_GetUniqueAlerts_Addclinic() { //This test will check the funcionality of alert items which are marked to show in all clinics(AlertItem.ClinicNum==-1). //Expected behaviour is that a user subscribed to all alert categories, and all clinics(AlertSub.ClinicNum==-1), //will see the alert no matter which clinic they are in. //In addition, when a new clinic is added, the user will be able to see alerts in that new clinic without the need to reenter //FormUserEdit and select "All" again under clinics for alert subscriptions. //Clear AlertSub table. AlertSubT.ClearAlertSubTable(); //Create Users Userod userAdmin = UserodT.CreateUser(); Userod userNormal = UserodT.CreateUser(); //Create Clinics List <Clinic> listClinics = new List <Clinic>(); for (int i = 0; i < 2; i++) { listClinics.Add(ClinicT.CreateClinic()); } //Create AlertItems //First alert Item is an alert item for all clinics(ClinicNum==-1). CreateAlertItem(true); //Second AlertItem is an AlertItem for HQ(ClinicNum==0). CreateAlertItem(false); List <AlertCategory> listAlertCats = AlertCategories.GetDeepCopy(); List <AlertSub> listAlertSubOld = new List <AlertSub>(); List <AlertSub> listAlertSubNew = new List <AlertSub>(); foreach (AlertCategory alertCat in listAlertCats) { AlertSub alSub = new AlertSub(userAdmin.UserNum, -1, alertCat.AlertCategoryNum); listAlertSubNew.Add(alSub); } AlertSubs.Sync(listAlertSubNew, listAlertSubOld); //Check number of alerts which will display in headquarters clinic. //Call CheckUniqueAlerts for user subscribed to all alert categories List <List <AlertItem> > listUniqueAlertsAll = AlertItems.GetUniqueAlerts(userAdmin.UserNum, 0); List <List <AlertItem> > listUniqueAlertsOne = AlertItems.GetUniqueAlerts(userNormal.UserNum, 0); //Assert lists are correct //UserAdmin should see two alerts, one for the generic headquarters alert and one for the eConnector all clinics alert. Assert.AreEqual(2, listUniqueAlertsAll.Count()); //UserNormal is not subscribed to any clinics or alert categories and should not see any alerts. Assert.AreEqual(0, listUniqueAlertsOne.Count()); //Add clinic listClinics.Add(ClinicT.CreateClinic()); //Check that alert for all clinics is included for userAdmin(subscribed to all clinics) listUniqueAlertsAll = AlertItems.GetUniqueAlerts(userAdmin.UserNum, listClinics.LastOrDefault().ClinicNum); Assert.AreEqual(1, listUniqueAlertsAll.Count()); //Check new clinic for user who is not subscribed to all alerts. listUniqueAlertsOne = AlertItems.GetUniqueAlerts(userNormal.UserNum, listClinics.LastOrDefault().ClinicNum); Assert.AreEqual(0, listUniqueAlertsOne.Count()); //Add new alert for new clinic only. CreateAlertItem(false, listClinics.LastOrDefault().ClinicNum); //Check that userAdmin sees new alert item in new clinic. Should have 2, one all clinic econnector alert and the new clinic specific alert. listUniqueAlertsAll = AlertItems.GetUniqueAlerts(userAdmin.UserNum, listClinics.LastOrDefault().ClinicNum); Assert.AreEqual(2, listUniqueAlertsAll.Count()); //Check that userNormal sees no alerts in new clinic, as they are not subscribed to any alert categories, nor clinics. listUniqueAlertsOne = AlertItems.GetUniqueAlerts(userNormal.UserNum, listClinics.LastOrDefault().ClinicNum); Assert.AreEqual(0, listUniqueAlertsOne.Count()); }