///<summary>Synchronizes CurUser with the corresponding userod object from the user cache. Used to update CurUser with any changes from cache refreshes. ///Throws an exception if CurUser was instantiated but is no longer in the user cache. Does nothing if CurUser is null when invoked.</summary> public static void SyncCurUser() { if (CurUser == null || CurUser.UserNum == 0) //Usernum will be 0 for users instantiated for web. See InitWebcore.Init. { return; } //Update CurUser with the user from the cache synchronizing any fields that could have been updated. E.g. TaskListInBox CurUser = Userods.GetFirstOrDefault(x => x.UserNum == CurUser.UserNum); //The user could have been deleted and/or data loss could have occurred and the CurUser is no longer in the db. if (CurUser == null && !ODInitialize.IsRunningInUnitTest) { throw new ODException("The current user has been removed from the cache."); } }
///<summary>Updates a password for a given Userod account and saves it to the database. Suggested hash type is SHA3-512. ///Throws an exception if a passed in hash type is not implimented.</summary> public static bool UpdatePasswordUserod(Userod user, string inputPass, HashTypes hashType = HashTypes.SHA3_512) { //No need to check RemotingRole; no call to db. //Calculate the password strength. bool passStrength = String.IsNullOrEmpty(Userods.IsPasswordStrong(inputPass)); PasswordContainer loginDetails = GenerateLoginDetails(inputPass, hashType); try { Userods.UpdatePassword(user, loginDetails, passStrength); } catch { return(false); } return(true); }
///<summary>Builds WHERE clauses appropriate to the type of GlobalFilterType. Returns empty string if not filtering. Pass filterClinicFkey=0 ///and filterRegionFkey=0 to intentionally bypass filtering.</summary> public static string BuildFilterWhereClause(long currentUserNum, long filterClinicFkey, long filterRegionFkey) { string command = string.Empty; //Only add WHERE clauses if filtering. Filtering will never happen if clinics are turned off, because regions link via clinics. if ((GlobalTaskFilterType)PrefC.GetInt(PrefName.TasksGlobalFilterType) == GlobalTaskFilterType.Disabled || (filterClinicFkey == 0 && filterRegionFkey == 0) || !PrefC.HasClinicsEnabled) { return(command); } List <Clinic> listUnrestrictedClinics = Clinics.GetAllForUserod(Userods.GetUser(currentUserNum)); List <long> listClinicNums = new List <long>() { 0 }; //All users can see Tasks associated to HQ clinic or "0" region. List <long> listClinicNumsInRegion = new List <long>() { 0 }; //All users can see Tasks associated to HQ clinic or "0" region. List <long> listUnrestrictedClinicNums = listUnrestrictedClinics.Select(x => x.ClinicNum).ToList(); //User can view these clinicnums. List <long> listUnrestrictedClinicNumsInRegion = listUnrestrictedClinics.FindAll(x => x.Region == filterRegionFkey).Select(x => x.ClinicNum).ToList(); if (filterClinicFkey.In(listUnrestrictedClinicNums)) //Make sure user is not restricted for this clinic. { listClinicNums.Add(filterClinicFkey); } listClinicNumsInRegion.AddRange(listUnrestrictedClinicNumsInRegion); string strClinicFilterNums = string.Join(",", listClinicNums.Select(x => POut.Long(x))); string strRegionFilterNums = string.Join(",", listClinicNumsInRegion.Select(x => POut.Long(x))); //Clause for TaskLists that have Default filter. string cmdFilterTaskListByDefault = "(tasklistfortask.GlobalTaskFilterType=" + POut.Long((long)GlobalTaskFilterType.Default) + GetDefaultFilterTypeString((GlobalTaskFilterType)PrefC.GetInt(PrefName.TasksGlobalFilterType), strClinicFilterNums, strRegionFilterNums) + ") "; //Clause for TaskLists that have None filter. string cmdFilterTaskListByNone = "(tasklistfortask.GlobalTaskFilterType=" + POut.Long((long)GlobalTaskFilterType.None) + ")"; //Clause for TaskLists that have Clinic filter. string cmdFilterTaskListByClinic = "(tasklistfortask.GlobalTaskFilterType=" + POut.Long((long)GlobalTaskFilterType.Clinic) + " AND (patient.ClinicNum IN (" + strClinicFilterNums + ") OR appointment.ClinicNum IN (" + strClinicFilterNums + "))) "; //Clause for TaskLists that have Region filter. string cmdFilterTaskListByRegion = "(tasklistfortask.GlobalTaskFilterType=" + POut.Long((long)GlobalTaskFilterType.Region) + " AND (patient.ClinicNum IN (" + strRegionFilterNums + ") OR appointment.ClinicNum IN (" + strRegionFilterNums + "))) "; //Clause for Tasks that are not connected to a patient or clinic. string cmdTaskClinicIsNull = "((patient.ClinicNum IS NULL) AND (appointment.ClinicNum IS NULL))"; command = " AND (" + cmdFilterTaskListByDefault + " OR " + cmdFilterTaskListByNone + " OR " + cmdFilterTaskListByClinic + " OR " + cmdFilterTaskListByRegion + "OR " + cmdTaskClinicIsNull + ") "; return(command); }
///<summary>DateType and ObjectType to None, the TaskListStatus to 1 - Archived, ///and set all Task List Inboxes that reference this Task List to 0.</summary> public static void Archive(TaskList taskList) { //No need to check RemotingRole; no call to db. if (taskList.TaskListStatus != TaskListStatusEnum.Active) { return; } TaskList taskListOld = taskList.Copy(); taskList.DateType = TaskDateType.None; taskList.DateTL = DateTime.MinValue; taskList.ObjectType = TaskObjectType.None; taskList.TaskListStatus = TaskListStatusEnum.Archived; Update(taskList, taskListOld); Userods.DisassociateTaskListInBox(taskList.TaskListNum); Signalods.SetInvalid(InvalidType.Security); //Send a signal in case any userod was associated to the task list. }
///<summary>Returns a list of AlertItems for the given clinicNum. Doesn't include alerts that are assigned to other users.</summary> public static List <AlertItem> RefreshForClinicAndTypes(long clinicNum, List <AlertType> listAlertTypes = null) { if (RemotingClient.RemotingRole == RemotingRole.ClientWeb) { return(Meth.GetObject <List <AlertItem> >(MethodBase.GetCurrentMethod(), clinicNum, listAlertTypes)); } if (listAlertTypes == null || listAlertTypes.Count == 0) { return(new List <AlertItem>()); } long provNum = 0; if (Security.CurUser != null && Userods.IsUserCpoe(Security.CurUser)) { provNum = Security.CurUser.ProvNum; } long curUserNum = 0; if (Security.CurUser != null) { curUserNum = Security.CurUser.UserNum; } string command = ""; if (DataConnection.DBtype == DatabaseType.MySql) { command = "SELECT * FROM alertitem " + "WHERE Type IN (" + String.Join(",", listAlertTypes.Cast <int>().ToList()) + ") " + "AND (UserNum=0 OR UserNum=" + POut.Long(curUserNum) + ") " //For AlertType.RadiologyProcedures we only care if the alert is associated to the current logged in provider. //When provNum is 0 the initial WHEN check below will not bring any rows by definition of the FKey column. + "AND (CASE TYPE WHEN " + POut.Int((int)AlertType.RadiologyProcedures) + " THEN FKey=" + POut.Long(provNum) + " " + "ELSE ClinicNum = " + POut.Long(clinicNum) + " OR ClinicNum=-1 END)"; } else //oracle //Case statements cannot change column return results unless they are within the SELECT case. { command = "SELECT AlertItemNum,CASE Type WHEN 3 THEN ClinicNum ELSE 0 END ClinicNum,Description,Type,Severity,Actions,FormToOpen,CASE Type WHEN 3 THEN 0 ELSE FKey END FKey,ItemValue " + "FROM alertitem " + "WHERE Type IN (" + String.Join(",", listAlertTypes.Cast <int>().ToList()) + ") "; } return(Crud.AlertItemCrud.SelectMany(command)); }
public static List <Userod> GetAssociatedUsers(Job job) { List <Userod> listUsers = new List <Userod>(); foreach (Userod user in Userods.GetDeepCopy()) { JobAction action; action = job.ActionForUser(user); if (action.In(JobAction.Document, JobAction.NeedsTechnicalWriter, JobAction.ContactCustomer, JobAction.ContactCustomerPreDoc, JobAction.Undefined, JobAction.UnknownJobPhase, JobAction.None)) { continue; } if (job.Category == JobCategory.Query) { continue; } listUsers.Add(user); } return(listUsers); }
///<summary>Pass in a list of CEMT usergroupattaches, and this will return a list of corresponding local usergroupattaches.</summary> public static List <UserGroupAttach> TranslateCEMTToLocal(List <UserGroupAttach> listUserGroupAttachCEMT) { List <UserGroupAttach> retVal = new List <UserGroupAttach>(); List <Userod> listRemoteUsers = Userods.GetUsersNoCache(); List <UserGroup> listRemoteGroups = UserGroups.GetCEMTGroupsNoCache(); foreach (UserGroupAttach attachCur in listUserGroupAttachCEMT) { Userod userCur = listRemoteUsers.FirstOrDefault(x => attachCur.UserNum == x.UserNumCEMT); UserGroup userGroupCur = listRemoteGroups.FirstOrDefault(x => attachCur.UserGroupNum == x.UserGroupNumCEMT); if (userCur == null || userGroupCur == null) { continue; } UserGroupAttach userGroupAttachNew = new UserGroupAttach() { UserNum = userCur.UserNum, UserGroupNum = userGroupCur.UserGroupNum }; retVal.Add(userGroupAttachNew); } return(retVal); }
///<summary>Attempts to fill the list of engineers from the wikilist. Fills with empty if something failed</summary> private static void FillEngineerList() { if (RemotingClient.RemotingRole == RemotingRole.ClientWeb) { Meth.GetVoid(MethodBase.GetCurrentMethod()); return; } _listEngineers = new List <Engineer>(); try { string command = "SELECT Title,EmployeeNum FROM wikilist_employees WHERE Title LIKE '%Engineer%'"; DataTable dt = Db.GetTable(command); foreach (DataRow dr in dt.Rows) { Employee emp = Employees.GetEmp(PIn.Long(dr["EmployeeNum"].ToString())); Userod user = Userods.GetUserByEmployeeNum(emp.EmployeeNum); Engineer newEngineer = new Engineer(user, emp, PIn.String(dr["Title"].ToString())); _listEngineers.Add(newEngineer); } } catch (Exception e) { //Do nothing } }
///<summary>If ClientWeb, then this method is instead run on the server, and the result passed back to the client. And since it's ClientWeb, FillCache will be run on the client.</summary> public static DataSet GetCacheDs(bool doRefreshServerCache, params InvalidType[] arrayITypes) { if (RemotingClient.RemotingRole == RemotingRole.ClientWeb) { return(Meth.GetDS(MethodBase.GetCurrentMethod(), doRefreshServerCache, arrayITypes)); } Logger.LogToPath("", LogPath.Signals, LogPhase.Start, "InvalidType(s): " + string.Join(" - ", arrayITypes.OrderBy(x => x.ToString()))); List <InvalidType> listITypes = arrayITypes.ToList(); //so this part below only happens if direct or server------------------------------------------------ bool isAll = false; if (listITypes.Contains(InvalidType.AllLocal)) { isAll = true; } DataSet ds = new DataSet(); //All Internal OD Tables that are cached go here if (PrefC.IsODHQ) { if (listITypes.Contains(InvalidType.JobPermission) || isAll) { ds.Tables.Add(JobPermissions.RefreshCache()); } if (listITypes.Contains(InvalidType.PhoneComps) || isAll) { ds.Tables.Add(PhoneComps.GetTableFromCache(doRefreshServerCache)); } } //All cached public tables go here if (listITypes.Contains(InvalidType.AccountingAutoPays) || isAll) { ds.Tables.Add(AccountingAutoPays.GetTableFromCache(doRefreshServerCache)); } //if(listITypes.Contains(InvalidType.AlertItems) || isAll) {//THIS IS NOT CACHED. But is used to make server run the alert logic in OpenDentalService. // ds.Tables.Add(AlertItems.RefreshCache()); //} if (listITypes.Contains(InvalidType.AlertCategories) || isAll) { ds.Tables.Add(AlertCategories.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.AlertCategoryLinks) || isAll) { ds.Tables.Add(AlertCategoryLinks.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.AppointmentTypes) || isAll) { ds.Tables.Add(AppointmentTypes.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.AutoCodes) || isAll) { ds.Tables.Add(AutoCodes.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(AutoCodeItems.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(AutoCodeConds.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.Automation) || isAll) { ds.Tables.Add(Automations.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.AutoNotes) || isAll) { ds.Tables.Add(AutoNotes.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(AutoNoteControls.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.Carriers) || isAll) { ds.Tables.Add(Carriers.GetTableFromCache(doRefreshServerCache)); //run on startup, after telephone reformat, after list edit. } if (listITypes.Contains(InvalidType.ClaimForms) || isAll) { ds.Tables.Add(ClaimFormItems.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(ClaimForms.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.ClearHouses) || isAll) { ds.Tables.Add(Clearinghouses.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.ClinicErxs) || isAll) { ds.Tables.Add(ClinicErxs.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.ClinicPrefs) || isAll) { ds.Tables.Add(ClinicPrefs.GetTableFromCache(doRefreshServerCache)); } //InvalidType.Clinics see InvalidType.Providers if (listITypes.Contains(InvalidType.Computers) || isAll) { ds.Tables.Add(Computers.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(Printers.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.Defs) || isAll) { ds.Tables.Add(Defs.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.DentalSchools) || isAll) { ds.Tables.Add(SchoolClasses.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(SchoolCourses.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.DictCustoms) || isAll) { ds.Tables.Add(DictCustoms.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.Diseases) || isAll) { ds.Tables.Add(DiseaseDefs.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(ICD9s.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.DisplayFields) || isAll) { ds.Tables.Add(DisplayFields.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.DisplayReports) || isAll) { ds.Tables.Add(DisplayReports.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.Ebills) || isAll) { ds.Tables.Add(Ebills.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.EhrCodes)) { EhrCodes.UpdateList(); //Unusual pattern for an unusual "table". Not really a table, but a mishmash of hard coded partial code systems that are needed for CQMs. } if (listITypes.Contains(InvalidType.ElectIDs) || isAll) { ds.Tables.Add(ElectIDs.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.Email) || isAll) { ds.Tables.Add(EmailAddresses.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(EmailTemplates.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(EmailAutographs.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.Employees) || isAll) { ds.Tables.Add(Employees.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(PayPeriods.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.Employers) || isAll) { ds.Tables.Add(Employers.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.Fees) || isAll) { //Fee Cache follows an unusual pattern. This fills the cache with the HQ fees, and whatever clinics happen to be currently cached. ds.Tables.Add(Fees.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.FeeScheds) || isAll) { ds.Tables.Add(FeeScheds.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.HL7Defs) || isAll) { ds.Tables.Add(HL7Defs.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(HL7DefMessages.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(HL7DefSegments.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(HL7DefFields.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.InsCats) || isAll) { ds.Tables.Add(CovCats.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(CovSpans.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.InsFilingCodes) || isAll) { ds.Tables.Add(InsFilingCodes.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(InsFilingCodeSubtypes.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.Languages) || isAll) { if (CultureInfo.CurrentCulture.Name != "en-US") { ds.Tables.Add(Lans.GetTableFromCache(doRefreshServerCache)); } } if (listITypes.Contains(InvalidType.Letters) || isAll) { ds.Tables.Add(Letters.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.LetterMerge) || isAll) { ds.Tables.Add(LetterMergeFields.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(LetterMerges.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.Medications) || isAll) { ds.Tables.Add(Medications.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.Operatories) || isAll) { ds.Tables.Add(Operatories.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.OrthoChartTabs) || isAll) { ds.Tables.Add(OrthoChartTabs.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(OrthoChartTabLinks.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.PatFields) || isAll) { ds.Tables.Add(PatFieldDefs.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(ApptFieldDefs.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.Pharmacies) || isAll) { ds.Tables.Add(Pharmacies.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.Prefs) || isAll) { ds.Tables.Add(Prefs.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.ProcButtons) || isAll) { ds.Tables.Add(ProcButtons.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(ProcButtonItems.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.ProcCodes) || isAll) { ds.Tables.Add(ProcedureCodes.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(ProcCodeNotes.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.Programs) || isAll) { ds.Tables.Add(Programs.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(ProgramProperties.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.ProviderErxs) || isAll) { ds.Tables.Add(ProviderErxs.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.ProviderIdents) || isAll) { ds.Tables.Add(ProviderIdents.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.Providers) || isAll) { ds.Tables.Add(Providers.GetTableFromCache(doRefreshServerCache)); //Refresh the clinics as well because InvalidType.Providers has a comment that says "also includes clinics". Also, there currently isn't an itype for Clinics. ds.Tables.Add(Clinics.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.QuickPaste) || isAll) { ds.Tables.Add(QuickPasteNotes.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(QuickPasteCats.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.RecallTypes) || isAll) { ds.Tables.Add(RecallTypes.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(RecallTriggers.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.ReplicationServers) || isAll) { ds.Tables.Add(ReplicationServers.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.RequiredFields) || isAll) { ds.Tables.Add(RequiredFields.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(RequiredFieldConditions.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.Security) || isAll) { ds.Tables.Add(Userods.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(UserGroups.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(GroupPermissions.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(UserGroupAttaches.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.Sheets) || isAll) { ds.Tables.Add(SheetDefs.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(SheetFieldDefs.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.SigMessages) || isAll) { ds.Tables.Add(SigElementDefs.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(SigButDefs.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.Sites) || isAll) { ds.Tables.Add(Sites.GetTableFromCache(doRefreshServerCache)); if (PrefC.IsODHQ) { ds.Tables.Add(SiteLinks.GetTableFromCache(doRefreshServerCache)); } } if (listITypes.Contains(InvalidType.SmsBlockPhones) || isAll) { ds.Tables.Add(SmsBlockPhones.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.SmsPhones) || isAll) { ds.Tables.Add(SmsPhones.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.Sops) || isAll) //InvalidType.Sops is currently never used 11/14/2014 { ds.Tables.Add(Sops.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.StateAbbrs) || isAll) { ds.Tables.Add(StateAbbrs.GetTableFromCache(doRefreshServerCache)); } //InvalidTypes.Tasks not handled here. if (listITypes.Contains(InvalidType.TimeCardRules) || isAll) { ds.Tables.Add(TimeCardRules.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.ToolBut) || isAll) { ds.Tables.Add(ToolButItems.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.UserClinics) || isAll) { ds.Tables.Add(UserClinics.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.UserQueries) || isAll) { ds.Tables.Add(UserQueries.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.Vaccines) || isAll) { ds.Tables.Add(VaccineDefs.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(DrugManufacturers.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(DrugUnits.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.Views) || isAll) { ds.Tables.Add(ApptViews.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(ApptViewItems.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(AppointmentRules.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(ProcApptColors.GetTableFromCache(doRefreshServerCache)); } if (listITypes.Contains(InvalidType.Wiki) || isAll) { ds.Tables.Add(WikiListHeaderWidths.GetTableFromCache(doRefreshServerCache)); ds.Tables.Add(WikiPages.RefreshCache()); } if (listITypes.Contains(InvalidType.ZipCodes) || isAll) { ds.Tables.Add(ZipCodes.GetTableFromCache(doRefreshServerCache)); } Logger.LogToPath("", LogPath.Signals, LogPhase.End); return(ds); }
///<summary>only if ClientWeb</summary> public static void FillCache(DataSet ds, params InvalidType[] arrayITypes) { List <InvalidType> listITypes = arrayITypes.ToList(); bool isAll = false; if (listITypes.Contains(InvalidType.AllLocal)) { isAll = true; } //All Internal OD Tables that are cached go here if (PrefC.IsODHQ) { if (listITypes.Contains(InvalidType.JobPermission) || isAll) { ds.Tables.Add(JobPermissions.RefreshCache()); } if (listITypes.Contains(InvalidType.PhoneComps) || isAll) { PhoneComps.FillCacheFromTable(ds.Tables["PhoneComp"]); } } if (listITypes.Contains(InvalidType.AccountingAutoPays) || isAll) { AccountingAutoPays.FillCacheFromTable(ds.Tables["AccountingAutoPay"]); } //if(listITypes.Contains(InvalidType.AlertItems) || isAll) {//THIS IS NOT CACHED. But is used to make server run the alert logic in OpenDentalService. // AlertSubs.FillCache(ds.Tables["AlertItem"]); //} if (listITypes.Contains(InvalidType.AlertCategories) || isAll) { AlertCategories.FillCacheFromTable(ds.Tables["AlertCategory"]); } if (listITypes.Contains(InvalidType.AlertCategoryLinks) || isAll) { AlertCategoryLinks.FillCacheFromTable(ds.Tables["AlertCategoryLink"]); } if (listITypes.Contains(InvalidType.AppointmentTypes) || isAll) { AppointmentTypes.FillCacheFromTable(ds.Tables["AppointmentType"]); } if (listITypes.Contains(InvalidType.AutoCodes) || isAll) { AutoCodes.FillCacheFromTable(ds.Tables["AutoCode"]); AutoCodeItems.FillCacheFromTable(ds.Tables["AutoCodeItem"]); AutoCodeConds.FillCacheFromTable(ds.Tables["AutoCodeCond"]); } if (listITypes.Contains(InvalidType.Automation) || isAll) { Automations.FillCacheFromTable(ds.Tables["Automation"]); } if (listITypes.Contains(InvalidType.AutoNotes) || isAll) { AutoNotes.FillCacheFromTable(ds.Tables["AutoNote"]); AutoNoteControls.FillCacheFromTable(ds.Tables["AutoNoteControl"]); } if (listITypes.Contains(InvalidType.Carriers) || isAll) { Carriers.FillCacheFromTable(ds.Tables["Carrier"]); //run on startup, after telephone reformat, after list edit. } if (listITypes.Contains(InvalidType.ClaimForms) || isAll) { ClaimFormItems.FillCacheFromTable(ds.Tables["ClaimFormItem"]); ClaimForms.FillCacheFromTable(ds.Tables["ClaimForm"]); } if (listITypes.Contains(InvalidType.ClearHouses) || isAll) { Clearinghouses.FillCacheFromTable(ds.Tables["Clearinghouse"]); } if (listITypes.Contains(InvalidType.ClinicErxs) || isAll) { ClinicErxs.FillCacheFromTable(ds.Tables["ClinicErx"]); } if (listITypes.Contains(InvalidType.ClinicPrefs) || isAll) { ClinicPrefs.FillCacheFromTable(ds.Tables["ClinicPref"]); } if (listITypes.Contains(InvalidType.Computers) || isAll) { Computers.FillCacheFromTable(ds.Tables["Computer"]); Printers.FillCacheFromTable(ds.Tables["Printer"]); } if (listITypes.Contains(InvalidType.Defs) || isAll) { Defs.FillCacheFromTable(ds.Tables["Def"]); } if (listITypes.Contains(InvalidType.DentalSchools) || isAll) { SchoolClasses.FillCacheFromTable(ds.Tables["SchoolClass"]); SchoolCourses.FillCacheFromTable(ds.Tables["SchoolCourse"]); } if (listITypes.Contains(InvalidType.DictCustoms) || isAll) { DictCustoms.FillCacheFromTable(ds.Tables["DictCustom"]); } if (listITypes.Contains(InvalidType.Diseases) || isAll) { DiseaseDefs.FillCacheFromTable(ds.Tables["DiseaseDef"]); ICD9s.FillCacheFromTable(ds.Tables["ICD9"]); } if (listITypes.Contains(InvalidType.DisplayFields) || isAll) { DisplayFields.FillCacheFromTable(ds.Tables["DisplayField"]); } if (listITypes.Contains(InvalidType.DisplayReports) || isAll) { DisplayReports.FillCacheFromTable(ds.Tables["DisplayReport"]); } if (listITypes.Contains(InvalidType.Ebills) || isAll) { Ebills.FillCacheFromTable(ds.Tables["Ebill"]); } if (listITypes.Contains(InvalidType.ElectIDs) || isAll) { ElectIDs.FillCacheFromTable(ds.Tables["ElectID"]); } if (listITypes.Contains(InvalidType.Email) || isAll) { EmailAddresses.FillCacheFromTable(ds.Tables["EmailAddress"]); EmailTemplates.FillCacheFromTable(ds.Tables["EmailTemplate"]); } if (listITypes.Contains(InvalidType.Employees) || isAll) { Employees.FillCacheFromTable(ds.Tables["Employee"]); PayPeriods.FillCacheFromTable(ds.Tables["PayPeriod"]); } if (listITypes.Contains(InvalidType.Employers) || isAll) { Employers.FillCacheFromTable(ds.Tables["Employer"]); } if (listITypes.Contains(InvalidType.Fees) || isAll) { Fees.FillCacheFromTable(ds.Tables["Fee"]); } if (listITypes.Contains(InvalidType.FeeScheds) || isAll) { FeeScheds.FillCacheFromTable(ds.Tables["FeeSched"]); } if (listITypes.Contains(InvalidType.HL7Defs) || isAll) { HL7Defs.FillCacheFromTable(ds.Tables["HL7Def"]); HL7DefMessages.FillCacheFromTable(ds.Tables["HL7DefMessage"]); HL7DefSegments.FillCacheFromTable(ds.Tables["HL7DefSegment"]); HL7DefFields.FillCacheFromTable(ds.Tables["HL7DefField"]); } if (listITypes.Contains(InvalidType.InsCats) || isAll) { CovCats.FillCacheFromTable(ds.Tables["CovCat"]); CovSpans.FillCacheFromTable(ds.Tables["CovSpan"]); } if (listITypes.Contains(InvalidType.InsFilingCodes) || isAll) { InsFilingCodes.FillCacheFromTable(ds.Tables["InsFilingCode"]); InsFilingCodeSubtypes.FillCacheFromTable(ds.Tables["InsFilingCodeSubtype"]); } if (listITypes.Contains(InvalidType.Languages) || isAll) { Lans.FillCacheFromTable(ds.Tables["Language"]); } if (listITypes.Contains(InvalidType.Letters) || isAll) { Letters.FillCacheFromTable(ds.Tables["Letter"]); } if (listITypes.Contains(InvalidType.LetterMerge) || isAll) { LetterMergeFields.FillCacheFromTable(ds.Tables["LetterMergeField"]); LetterMerges.FillCacheFromTable(ds.Tables["LetterMerge"]); } if (listITypes.Contains(InvalidType.Medications) || isAll) { Medications.FillCacheFromTable(ds.Tables["Medication"]); } if (listITypes.Contains(InvalidType.Operatories) || isAll) { Operatories.FillCacheFromTable(ds.Tables["Operatory"]); } if (listITypes.Contains(InvalidType.OrthoChartTabs) || isAll) { OrthoChartTabs.FillCacheFromTable(ds.Tables["OrthoChartTab"]); OrthoChartTabLinks.FillCacheFromTable(ds.Tables["OrthoChartTabLink"]); } if (listITypes.Contains(InvalidType.PatFields) || isAll) { PatFieldDefs.FillCacheFromTable(ds.Tables["PatFieldDef"]); ApptFieldDefs.FillCacheFromTable(ds.Tables["ApptFieldDef"]); } if (listITypes.Contains(InvalidType.Pharmacies) || isAll) { Pharmacies.FillCacheFromTable(ds.Tables["Pharmacy"]); } if (listITypes.Contains(InvalidType.Prefs) || isAll) { Prefs.FillCacheFromTable(ds.Tables["Pref"]); } if (listITypes.Contains(InvalidType.ProcButtons) || isAll) { ProcButtons.FillCacheFromTable(ds.Tables["ProcButton"]); ProcButtonItems.FillCacheFromTable(ds.Tables["ProcButtonItem"]); } if (listITypes.Contains(InvalidType.ProcCodes) || isAll) { ProcedureCodes.FillCacheFromTable(ds.Tables["ProcedureCode"]); ProcCodeNotes.FillCacheFromTable(ds.Tables["ProcCodeNote"]); } if (listITypes.Contains(InvalidType.Programs) || isAll) { Programs.FillCacheFromTable(ds.Tables["Program"]); ProgramProperties.FillCacheFromTable(ds.Tables["ProgramProperty"]); } if (listITypes.Contains(InvalidType.ProviderErxs) || isAll) { ProviderErxs.FillCacheFromTable(ds.Tables["ProviderErx"]); } if (listITypes.Contains(InvalidType.ProviderIdents) || isAll) { ProviderIdents.FillCacheFromTable(ds.Tables["ProviderIdent"]); } if (listITypes.Contains(InvalidType.Providers) || isAll) { Providers.FillCacheFromTable(ds.Tables["Provider"]); //Refresh the clinics as well because InvalidType.Providers has a comment that says "also includes clinics". Also, there currently isn't an itype for Clinics. Clinics.FillCacheFromTable(ds.Tables["clinic"]); //Case must match the table name in Clinics.RefrechCache(). } if (listITypes.Contains(InvalidType.QuickPaste) || isAll) { QuickPasteNotes.FillCacheFromTable(ds.Tables["QuickPasteNote"]); QuickPasteCats.FillCacheFromTable(ds.Tables["QuickPasteCat"]); } if (listITypes.Contains(InvalidType.RecallTypes) || isAll) { RecallTypes.FillCacheFromTable(ds.Tables["RecallType"]); RecallTriggers.FillCacheFromTable(ds.Tables["RecallTrigger"]); } if (listITypes.Contains(InvalidType.ReplicationServers) || isAll) { ReplicationServers.FillCacheFromTable(ds.Tables["ReplicationServer"]); } //if(itypes.Contains(InvalidType.RequiredFields) || isAll) { // RequiredFields.FillCache(ds.Tables["RequiredField"]); //} if (listITypes.Contains(InvalidType.Security) || isAll) { Userods.FillCacheFromTable(ds.Tables["Userod"]); UserGroups.FillCacheFromTable(ds.Tables["UserGroup"]); UserGroupAttaches.FillCacheFromTable(ds.Tables["UserGroupAttach"]); } if (listITypes.Contains(InvalidType.Sheets) || isAll) { SheetDefs.FillCacheFromTable(ds.Tables["SheetDef"]); SheetFieldDefs.FillCacheFromTable(ds.Tables["SheetFieldDef"]); } if (listITypes.Contains(InvalidType.SigMessages) || isAll) { SigElementDefs.FillCacheFromTable(ds.Tables["SigElementDef"]); SigButDefs.FillCacheFromTable(ds.Tables["SigButDef"]); } if (listITypes.Contains(InvalidType.Sites) || isAll) { Sites.FillCacheFromTable(ds.Tables["Site"]); if (PrefC.IsODHQ) { SiteLinks.FillCacheFromTable(ds.Tables["SiteLink"]); } } if (listITypes.Contains(InvalidType.SmsBlockPhones) || isAll) { SmsBlockPhones.FillCacheFromTable(ds.Tables["SmsBlockPhone"]); } if (listITypes.Contains(InvalidType.SmsPhones) || isAll) { SmsPhones.FillCacheFromTable(ds.Tables["SmsPhone"]); } if (listITypes.Contains(InvalidType.Sops) || isAll) { Sops.FillCacheFromTable(ds.Tables["Sop"]); } if (listITypes.Contains(InvalidType.StateAbbrs) || isAll) { StateAbbrs.FillCacheFromTable(ds.Tables["StateAbbr"]); } if (listITypes.Contains(InvalidType.TimeCardRules) || isAll) { TimeCardRules.FillCacheFromTable(ds.Tables["TimeCardRule"]); } //InvalidTypes.Tasks not handled here. if (listITypes.Contains(InvalidType.ToolBut) || isAll) { ToolButItems.FillCacheFromTable(ds.Tables["ToolButItem"]); } if (listITypes.Contains(InvalidType.UserClinics) || isAll) { UserClinics.FillCacheFromTable(ds.Tables["UserClinic"]); } if (listITypes.Contains(InvalidType.UserQueries) || isAll) { UserQueries.FillCacheFromTable(ds.Tables["UserQuery"]); } if (listITypes.Contains(InvalidType.Vaccines) || isAll) { VaccineDefs.FillCacheFromTable(ds.Tables["VaccineDef"]); DrugManufacturers.FillCacheFromTable(ds.Tables["DrugManufacturer"]); DrugUnits.FillCacheFromTable(ds.Tables["DrugUnit"]); } if (listITypes.Contains(InvalidType.Views) || isAll) { ApptViews.FillCacheFromTable(ds.Tables["ApptView"]); ApptViewItems.FillCacheFromTable(ds.Tables["ApptViewItem"]); AppointmentRules.FillCacheFromTable(ds.Tables["AppointmentRule"]); ProcApptColors.FillCacheFromTable(ds.Tables["ProcApptColor"]); } if (listITypes.Contains(InvalidType.Wiki) || isAll) { WikiListHeaderWidths.FillCacheFromTable(ds.Tables["WikiListHeaderWidth"]); WikiPages.FillCache(ds.Tables["WikiPage"]); } if (listITypes.Contains(InvalidType.ZipCodes) || isAll) { ZipCodes.FillCacheFromTable(ds.Tables["ZipCode"]); } }
///<summary>Used to check if user has permission to access the report. Pass in a list of DisplayReports to avoid a call to the db.</summary> public static bool HasReportPermission(string reportName, Userod user, List <DisplayReport> listReports = null) { //No need to check RemotingRole; no call to db. if (!Security.IsAuthorized(Permissions.Reports, true)) { return(false); } DisplayReport report = (listReports ?? DisplayReports.GetAll(false)).FirstOrDefault(x => x.InternalName == reportName); if (report == null) //Report is probably hidden. { return(false); } List <GroupPermission> listReportPermissions = GroupPermissions.GetPermsForReports(); if (listReportPermissions.Exists(x => x.FKey == report.DisplayReportNum && Userods.IsInUserGroup(user.UserNum, x.UserGroupNum))) { return(true); } return(false); }
private static List <TreatPlanPresenterEntry> GetListTreatPlanPresenterEntries(List <long> listClinicNums, bool isFirstPresenter, bool isPresenter , DateTime dateStart, DateTime dateEnd) { //No need to check RemotingRole; private method. List <Procedure> listProcsComplete = ReportsComplex.RunFuncOnReportServer(() => Procedures.GetCompletedForDateRangeLimited(dateStart, dateEnd, listClinicNums)); List <ProcTP> listProcTPs = ReportsComplex.RunFuncOnReportServer(() => ProcTPs.GetForProcs(listProcsComplete.Select(x => x.ProcNum).ToList())); List <Procedure> listTreatPlanProcs = listProcsComplete.Where(x => listProcTPs.Select(y => y.ProcNumOrig).Contains(x.ProcNum)).ToList(); List <TreatPlan> listSavedTreatPlans = ReportsComplex.RunFuncOnReportServer(() => TreatPlans.GetFromProcTPs(listProcTPs)); // attached proctps to treatment plans. List <ClaimProc> listClaimProcs = ReportsComplex.RunFuncOnReportServer(() => ClaimProcs.GetForProcsLimited(listTreatPlanProcs.Select(x => x.ProcNum).ToList(), ClaimProcStatus.Received, ClaimProcStatus.Supplemental, ClaimProcStatus.CapComplete, ClaimProcStatus.NotReceived)); List <Adjustment> listAdjustments = ReportsComplex.RunFuncOnReportServer(() => Adjustments.GetForProcs(listTreatPlanProcs.Select(x => x.ProcNum).ToList())); List <Userod> listUserods = ReportsComplex.RunFuncOnReportServer(() => Userods.GetAll()); List <TreatPlanPresenterEntry> listTreatPlanPresenterEntries = new List <TreatPlanPresenterEntry>(); List <ProcedureCode> listProcCodes = ProcedureCodes.GetCodesForCodeNums(listTreatPlanProcs.Select(x => x.CodeNum).ToList()); foreach (Procedure procCur in listTreatPlanProcs) { double grossProd = procCur.ProcFeeTotal; double writeOffs = listClaimProcs.Where(x => x.ProcNum == procCur.ProcNum) .Where(x => x.Status == ClaimProcStatus.CapComplete) .Sum(x => x.WriteOff); grossProd -= writeOffs; writeOffs = listClaimProcs.Where(x => x.ProcNum == procCur.ProcNum) .Where(x => x.Status == ClaimProcStatus.NotReceived || x.Status == ClaimProcStatus.Received || x.Status == ClaimProcStatus.Supplemental) .Sum(x => x.WriteOff); double adjustments = listAdjustments.Where(x => x.ProcNum == procCur.ProcNum).Sum(x => x.AdjAmt); double netProd = grossProd - writeOffs + adjustments; TreatPlan treatPlanCur; if (isFirstPresenter) { treatPlanCur = listSavedTreatPlans.Where(x => x.ListProcTPs.Any(y => y.ProcNumOrig == procCur.ProcNum)).OrderBy(x => x.DateTP).First(); } else //radioLastPresented { treatPlanCur = listSavedTreatPlans.Where(x => x.ListProcTPs.Any(y => y.ProcNumOrig == procCur.ProcNum)).OrderByDescending(x => x.DateTP).First(); } Userod userPresenter; if (isPresenter) { userPresenter = listUserods.FirstOrDefault(x => x.UserNum == treatPlanCur.UserNumPresenter); } else //radioEntryUser { userPresenter = listUserods.FirstOrDefault(x => x.UserNum == treatPlanCur.SecUserNumEntry); } ProcedureCode procCode = listProcCodes.First(x => x.CodeNum == procCur.CodeNum); listTreatPlanPresenterEntries.Add(new TreatPlanPresenterEntry() { Presenter = userPresenter == null?"":userPresenter.UserName, DatePresented = treatPlanCur.DateTP, DateCompleted = procCur.ProcDate, ProcDescript = procCode.Descript, GrossProd = grossProd, Adjustments = adjustments, WriteOffs = writeOffs, NetProd = netProd, UserNumPresenter = userPresenter == null?0:userPresenter.UserNum, PresentedClinic = procCur.ClinicNum }); } return(listTreatPlanPresenterEntries); }
///<summary>Checks dependencies first. Throws exception if can't delete.</summary> public static void Delete(Clinic clinic) { if (RemotingClient.RemotingRole == RemotingRole.ClientWeb) { Meth.GetVoid(MethodBase.GetCurrentMethod(), clinic); return; } //Check FK dependencies. #region Patients string command = "SELECT LName,FName FROM patient WHERE ClinicNum =" + POut.Long(clinic.ClinicNum); DataTable table = Db.GetTable(command); if (table.Rows.Count > 0) { string pats = ""; for (int i = 0; i < table.Rows.Count; i++) { pats += "\r"; if (i == 15) { pats += Lans.g("Clinics", "And") + " " + (table.Rows.Count - i) + " " + Lans.g("Clinics", "others"); break; } pats += table.Rows[i]["LName"].ToString() + ", " + table.Rows[i]["FName"].ToString(); } throw new Exception(Lans.g("Clinics", "Cannot delete clinic because it is in use by the following patients:") + pats); } #endregion #region Payments command = "SELECT patient.LName,patient.FName FROM patient,payment " + "WHERE payment.ClinicNum =" + POut.Long(clinic.ClinicNum) + " AND patient.PatNum=payment.PatNum"; table = Db.GetTable(command); if (table.Rows.Count > 0) { string pats = ""; for (int i = 0; i < table.Rows.Count; i++) { pats += "\r"; if (i == 15) { pats += Lans.g("Clinics", "And") + " " + (table.Rows.Count - i) + " " + Lans.g("Clinics", "others"); break; } pats += table.Rows[i]["LName"].ToString() + ", " + table.Rows[i]["FName"].ToString(); } throw new Exception(Lans.g("Clinics", "Cannot delete clinic because the following patients have payments using it:") + pats); } #endregion #region ClaimPayments command = "SELECT patient.LName,patient.FName FROM patient,claimproc,claimpayment " + "WHERE claimpayment.ClinicNum =" + POut.Long(clinic.ClinicNum) + " AND patient.PatNum=claimproc.PatNum" + " AND claimproc.ClaimPaymentNum=claimpayment.ClaimPaymentNum " + "GROUP BY patient.LName,patient.FName,claimpayment.ClaimPaymentNum"; table = Db.GetTable(command); if (table.Rows.Count > 0) { string pats = ""; for (int i = 0; i < table.Rows.Count; i++) { pats += "\r"; if (i == 15) { pats += Lans.g("Clinics", "And") + " " + (table.Rows.Count - i) + " " + Lans.g("Clinics", "others"); break; } pats += table.Rows[i]["LName"].ToString() + ", " + table.Rows[i]["FName"].ToString(); } throw new Exception(Lans.g("Clinics", "Cannot delete clinic because the following patients have claim payments using it:") + pats); } #endregion #region Appointments command = "SELECT patient.LName,patient.FName FROM patient,appointment " + "WHERE appointment.ClinicNum =" + POut.Long(clinic.ClinicNum) + " AND patient.PatNum=appointment.PatNum"; table = Db.GetTable(command); if (table.Rows.Count > 0) { string pats = ""; for (int i = 0; i < table.Rows.Count; i++) { pats += "\r"; if (i == 15) { pats += Lans.g("Clinics", "And") + " " + (table.Rows.Count - i) + " " + Lans.g("Clinics", "others"); break; } pats += table.Rows[i]["LName"].ToString() + ", " + table.Rows[i]["FName"].ToString(); } throw new Exception(Lans.g("Clinics", "Cannot delete clinic because the following patients have appointments using it:") + pats); } #endregion #region Procedures //reassign procedure.ClinicNum=0 if the procs are status D. command = "SELECT ProcNum FROM procedurelog WHERE ProcStatus=" + POut.Int((int)ProcStat.D) + " AND ClinicNum=" + POut.Long(clinic.ClinicNum); List <long> listProcNums = Db.GetListLong(command); if (listProcNums.Count > 0) { command = "UPDATE procedurelog SET ClinicNum=0 WHERE ProcNum IN (" + string.Join(",", listProcNums.Select(x => POut.Long(x))) + ")"; Db.NonQ(command); } command = "SELECT patient.LName,patient.FName FROM patient,procedurelog " + "WHERE procedurelog.ClinicNum =" + POut.Long(clinic.ClinicNum) + " AND patient.PatNum=procedurelog.PatNum"; table = Db.GetTable(command); if (table.Rows.Count > 0) { string pats = ""; for (int i = 0; i < table.Rows.Count; i++) { pats += "\r"; if (i == 15) { pats += Lans.g("Clinics", "And") + " " + (table.Rows.Count - i) + " " + Lans.g("Clinics", "others"); break; } pats += table.Rows[i]["LName"].ToString() + ", " + table.Rows[i]["FName"].ToString(); } throw new Exception(Lans.g("Clinics", "Cannot delete clinic because the following patients have procedures using it:") + pats); } #endregion #region Operatories command = "SELECT OpName FROM operatory " + "WHERE ClinicNum =" + POut.Long(clinic.ClinicNum); table = Db.GetTable(command); if (table.Rows.Count > 0) { string ops = ""; for (int i = 0; i < table.Rows.Count; i++) { ops += "\r"; if (i == 15) { ops += Lans.g("Clinics", "And") + " " + (table.Rows.Count - i) + " " + Lans.g("Clinics", "others"); break; } ops += table.Rows[i]["OpName"].ToString(); } throw new Exception(Lans.g("Clinics", "Cannot delete clinic because the following operatories are using it:") + ops); } #endregion #region Userod command = "SELECT UserName FROM userod " + "WHERE ClinicNum =" + POut.Long(clinic.ClinicNum); table = Db.GetTable(command); if (table.Rows.Count > 0) { string userNames = ""; for (int i = 0; i < table.Rows.Count; i++) { userNames += "\r"; if (i == 15) { userNames += Lans.g("Clinics", "And") + " " + (table.Rows.Count - i) + " " + Lans.g("Clinics", "others"); break; } userNames += table.Rows[i]["UserName"].ToString(); } throw new Exception(Lans.g("Clinics", "Cannot delete clinic because the following Open Dental users are using it:") + userNames); } #endregion #region AlertSub command = "SELECT DISTINCT UserNum FROM AlertSub " + "WHERE ClinicNum =" + POut.Long(clinic.ClinicNum); table = Db.GetTable(command); if (table.Rows.Count > 0) { List <string> listUsers = new List <string>(); for (int i = 0; i < table.Rows.Count; i++) { long userNum = PIn.Long(table.Rows[i]["UserNum"].ToString()); Userod user = Userods.GetUser(userNum); if (user == null) //Should not happen. { continue; } listUsers.Add(user.UserName); } throw new Exception(Lans.g("Clinics", "Cannot delete clinic because the following Open Dental users are subscribed to it:") + "\r" + String.Join("\r", listUsers.OrderBy(x => x).ToArray())); } #endregion #region UserClinics command = "SELECT userod.UserName FROM userclinic INNER JOIN userod ON userclinic.UserNum=userod.UserNum " + "WHERE userclinic.ClinicNum=" + POut.Long(clinic.ClinicNum); table = Db.GetTable(command); if (table.Rows.Count > 0) { string users = ""; for (int i = 0; i < table.Rows.Count; i++) { if (i > 0) { users += ","; } users += table.Rows[i][0].ToString(); } throw new Exception( Lans.g("Clinics", "Cannot delete clinic because the following users are restricted to this clinic in security setup:") + " " + users); } #endregion //End checking for dependencies. //Clinic is not being used, OK to delete. //Delete clinic specific program properties. command = "DELETE FROM programproperty WHERE ClinicNum=" + POut.Long(clinic.ClinicNum) + " AND ClinicNum!=0"; //just in case a programming error tries to delete an invalid clinic. Db.NonQ(command); Crud.ClinicCrud.Delete(clinic.ClinicNum); }
public bool IsInUserGroup(long userGroupNum) { return(Userods.IsInUserGroup(this.UserNum, userGroupNum)); }
///<summary>If not using clinics then supply an empty list of clinicNums.</summary> public static DataTable GetTreatPlanPresentationStatistics(DateTime dateStart, DateTime dateEnd, bool isFirstPresented, bool hasAllClinics , bool hasClinicsEnabled, bool isPresenter, bool isGross, bool hasAllUsers, List <long> listUserNums, List <long> listClinicNums) { if (RemotingClient.RemotingRole == RemotingRole.ClientWeb) { return(Meth.GetTable(MethodBase.GetCurrentMethod(), dateStart, dateEnd, isFirstPresented, hasAllClinics, hasClinicsEnabled, isPresenter, isGross , hasAllUsers, listUserNums, listClinicNums)); } List <ProcTP> listProcTPsAll = ReportsComplex.RunFuncOnReportServer(() => ProcTPs.GetAllLim()); List <TreatPlan> listSavedTreatPlans = ReportsComplex.RunFuncOnReportServer(() => TreatPlans.GetAllSavedLim()); List <ProcTpTreatPlan> listProcTPTreatPlans = new List <ProcTpTreatPlan>(); listProcTPsAll.ForEach(x => { listProcTPTreatPlans.Add(new ProcTpTreatPlan() { TreatPlanCur = listSavedTreatPlans.First(y => y.TreatPlanNum == x.TreatPlanNum), ProcTPCur = x }); }); //get one entry per procedure with their first/last date of presentation based on radio buttons. if (isFirstPresented) { listProcTPTreatPlans = listProcTPTreatPlans .OrderBy(x => x.ProcTPCur.ProcNumOrig) .ThenBy(x => x.TreatPlanCur.DateTP) .ThenBy(x => x.TreatPlanCur.TreatPlanNum) .GroupBy(x => x.ProcTPCur.ProcNumOrig) .Select(x => x.First()) .ToList(); } else { listProcTPTreatPlans = listProcTPTreatPlans .OrderBy(x => x.ProcTPCur.ProcNumOrig) .ThenByDescending(x => x.TreatPlanCur.DateTP) .ThenBy(x => x.TreatPlanCur.TreatPlanNum) .GroupBy(x => x.ProcTPCur.ProcNumOrig) .Select(x => x.First()) .ToList(); } //get rid of any entries that are outside the range selected. listProcTPTreatPlans = listProcTPTreatPlans.Where(x => x.TreatPlanCur.DateTP.Date >= dateStart && x.TreatPlanCur.DateTP.Date <= dateEnd).ToList(); //Get the associated procedures, claimprocs, adjustments, users, appointments. List <Procedure> listProcsForTreatPlans = ReportsComplex.RunFuncOnReportServer(() => Procedures.GetForProcTPs(listProcTPTreatPlans.Select(x => x.ProcTPCur).ToList(), ProcStat.C, ProcStat.TP)); if (hasClinicsEnabled && !hasAllClinics) { listProcsForTreatPlans = listProcsForTreatPlans.FindAll(x => listClinicNums.Contains(x.ClinicNum)); } List <ClaimProc> listClaimProcs = ReportsComplex.RunFuncOnReportServer(() => ClaimProcs.GetForProcsLimited(listProcsForTreatPlans.Select(x => x.ProcNum).ToList(), ClaimProcStatus.CapComplete, ClaimProcStatus.NotReceived, ClaimProcStatus.Received, ClaimProcStatus.Supplemental, ClaimProcStatus.Estimate)); List <Adjustment> listAdjustments = ReportsComplex.RunFuncOnReportServer(() => Adjustments.GetForProcs(listProcsForTreatPlans.Select(x => x.ProcNum).ToList())); List <Userod> listUserods = ReportsComplex.RunFuncOnReportServer(() => Userods.GetAll()); List <TreatPlanPresenterEntry> listTreatPlanPresenterEntries = new List <TreatPlanPresenterEntry>(); List <ProcedureCode> listProcCodes = ReportsComplex.RunFuncOnReportServer(() => ProcedureCodes.GetCodesForCodeNums(listProcsForTreatPlans.Select(x => x.CodeNum).ToList())); List <Appointment> listApts = ReportsComplex.RunFuncOnReportServer(() => Appointments.GetMultApts(listProcsForTreatPlans.Select(x => x.AptNum).ToList())); double amt = listProcsForTreatPlans.Sum(x => x.ProcFee); foreach (Procedure procCur in listProcsForTreatPlans) { double grossProd = procCur.ProcFeeTotal; double writeOffs = listClaimProcs.Where(x => x.ProcNum == procCur.ProcNum) .Where(x => x.Status == ClaimProcStatus.CapComplete) .Sum(x => x.WriteOff); grossProd -= writeOffs; if (procCur.ProcStatus == ProcStat.C) { writeOffs += listClaimProcs.Where(x => x.ProcNum == procCur.ProcNum) .Where(x => x.Status.In(ClaimProcStatus.NotReceived, ClaimProcStatus.Received, ClaimProcStatus.Supplemental)) .Sum(x => x.WriteOff); } else { foreach (ClaimProc claimProcCur in listClaimProcs.Where(x => x.ProcNum == procCur.ProcNum).Where(x => x.Status == ClaimProcStatus.Estimate)) { if (claimProcCur.WriteOffEstOverride == -1) { if (claimProcCur.WriteOffEst != -1) { writeOffs += claimProcCur.WriteOffEst; } } else { writeOffs += claimProcCur.WriteOffEstOverride; } } //writeOffs += listClaimProcs.Where(x => x.ProcNum == procCur.ProcNum) // .Where(x => x.Status == ClaimProcStatus.Estimate) // .Sum(x => x.WriteOffEstOverride == -1 ? (x.WriteOffEst == -1 ? 0 : x.WriteOffEst) : x.WriteOffEstOverride); //Allen won't let me commit this nested ternary :( } double adjustments = listAdjustments.Where(x => x.ProcNum == procCur.ProcNum).Sum(x => x.AdjAmt); double netProd = grossProd - writeOffs + adjustments; TreatPlan treatPlanCur = listProcTPTreatPlans.Where(x => x.ProcTPCur.ProcNumOrig == procCur.ProcNum).First().TreatPlanCur; Userod userPresenter; if (isPresenter) { userPresenter = listUserods.FirstOrDefault(x => x.UserNum == treatPlanCur.UserNumPresenter); } else //radioEntryUser { userPresenter = listUserods.FirstOrDefault(x => x.UserNum == treatPlanCur.SecUserNumEntry); } ProcedureCode procCode = listProcCodes.First(x => x.CodeNum == procCur.CodeNum); Appointment aptCur = listApts.FirstOrDefault(x => x.AptNum == procCur.AptNum); listTreatPlanPresenterEntries.Add(new TreatPlanPresenterEntry() { Presenter = userPresenter == null ? "" : userPresenter.UserName, DatePresented = treatPlanCur.DateTP, DateCompleted = procCur.ProcDate, ProcDescript = procCode.Descript, GrossProd = grossProd, Adjustments = adjustments, WriteOffs = writeOffs, NetProd = netProd, UserNumPresenter = userPresenter == null?0:userPresenter.UserNum, PresentedClinic = procCur.ClinicNum, ProcStatus = procCur.ProcStatus, TreatPlanNum = treatPlanCur.TreatPlanNum, AptNum = procCur.AptNum, AptStatus = aptCur == null?ApptStatus.None:aptCur.AptStatus }); } DataTable table = new DataTable(); table.Columns.Add("Presenter"); table.Columns.Add("# of Plans"); table.Columns.Add("# of Procs"); table.Columns.Add("# of ProcsSched"); table.Columns.Add("# of ProcsComp"); if (isGross) { table.Columns.Add("GrossTPAmt"); table.Columns.Add("GrossSchedAmt"); table.Columns.Add("GrossCompAmt"); } else { table.Columns.Add("NetTpAmt"); table.Columns.Add("NetSchedAmt"); table.Columns.Add("NetCompAmt"); } if (!hasAllUsers) { listTreatPlanPresenterEntries = listTreatPlanPresenterEntries.Where(x => listUserNums.Contains(x.UserNumPresenter)).ToList(); } listTreatPlanPresenterEntries = listTreatPlanPresenterEntries.OrderBy(x => x.Presenter).ToList(); listTreatPlanPresenterEntries .GroupBy(x => x.Presenter).ToList().ForEach(x => { DataRow row = table.NewRow(); row["Presenter"] = x.First().Presenter == "" ? "None" : x.First().Presenter; row["# of Plans"] = x.GroupBy(y => y.TreatPlanNum).Count(); row["# of Procs"] = x.Count(); row["# of ProcsSched"] = x.Count(y => y.ProcStatus == ProcStat.TP && y.AptNum != 0 && y.AptStatus == ApptStatus.Scheduled); row["# of ProcsComp"] = x.Count(y => y.ProcStatus == ProcStat.C); if (isGross) { row["GrossTpAmt"] = x.Sum(y => y.GrossProd); row["GrossSchedAmt"] = x.Where(y => y.ProcStatus == ProcStat.TP && y.AptNum != 0 && y.AptStatus == ApptStatus.Scheduled).Sum(y => y.GrossProd); row["GrossCompAmt"] = x.Where(y => y.ProcStatus == ProcStat.C).Sum(y => y.GrossProd); } else { row["NetTpAmt"] = x.Sum(y => y.NetProd); row["NetSchedAmt"] = x.Where(y => y.ProcStatus == ProcStat.TP && y.AptNum != 0 && y.AptStatus == ApptStatus.Scheduled).Sum(y => y.NetProd); row["NetCompAmt"] = x.Where(y => y.ProcStatus == ProcStat.C).Sum(y => y.NetProd); } table.Rows.Add(row); }); //DataTable table=ReportsComplex.RunFuncOnReportServer(() => ReportsComplex.GetTable(query)); return(table); }
///<summary>only if ClientWeb</summary> public static void FillCache(DataSet ds, string itypesStr) { List <int> itypes = new List <int>(); string[] strArray = itypesStr.Split(','); for (int i = 0; i < strArray.Length; i++) { itypes.Add(PIn.Int(strArray[i])); } bool isAll = false; if (itypes.Contains((int)InvalidType.AllLocal)) { isAll = true; } if (itypes.Contains((int)InvalidType.AccountingAutoPays) || isAll) { AccountingAutoPays.FillCache(ds.Tables["AccountingAutoPay"]); } if (itypes.Contains((int)InvalidType.AutoCodes) || isAll) { AutoCodes.FillCache(ds.Tables["AutoCode"]); AutoCodeItems.FillCache(ds.Tables["AutoCodeItem"]); AutoCodeConds.FillCache(ds.Tables["AutoCodeCond"]); } if (itypes.Contains((int)InvalidType.Automation) || isAll) { Automations.FillCache(ds.Tables["Automation"]); } if (itypes.Contains((int)InvalidType.AutoNotes) || isAll) { AutoNotes.FillCache(ds.Tables["AutoNote"]); AutoNoteControls.FillCache(ds.Tables["AutoNoteControl"]); } if (itypes.Contains((int)InvalidType.Carriers) || isAll) { Carriers.FillCache(ds.Tables["Carrier"]); //run on startup, after telephone reformat, after list edit. } if (itypes.Contains((int)InvalidType.ClaimForms) || isAll) { ClaimFormItems.FillCache(ds.Tables["ClaimFormItem"]); ClaimForms.FillCache(ds.Tables["ClaimForm"]); } if (itypes.Contains((int)InvalidType.ClearHouses) || isAll) { Clearinghouses.FillCache(ds.Tables["Clearinghouse"]); //kh wants to add an EasyHideClearHouses to disable this } if (itypes.Contains((int)InvalidType.Computers) || isAll) { Computers.FillCache(ds.Tables["Computer"]); Printers.FillCache(ds.Tables["Printer"]); } if (itypes.Contains((int)InvalidType.Defs) || isAll) { Defs.FillCache(ds.Tables["Def"]); } if (itypes.Contains((int)InvalidType.DentalSchools) || isAll) { SchoolClasses.FillCache(ds.Tables["SchoolClass"]); SchoolCourses.FillCache(ds.Tables["SchoolCourse"]); } if (itypes.Contains((int)InvalidType.DictCustoms) || isAll) { DictCustoms.FillCache(ds.Tables["DictCustom"]); } if (itypes.Contains((int)InvalidType.Diseases) || isAll) { DiseaseDefs.FillCache(ds.Tables["DiseaseDef"]); ICD9s.FillCache(ds.Tables["ICD9"]); } if (itypes.Contains((int)InvalidType.DisplayFields) || isAll) { DisplayFields.FillCache(ds.Tables["DisplayField"]); } if (itypes.Contains((int)InvalidType.ElectIDs) || isAll) { ElectIDs.FillCache(ds.Tables["ElectID"]); } if (itypes.Contains((int)InvalidType.Email) || isAll) { EmailAddresses.FillCache(ds.Tables["EmailAddress"]); EmailTemplates.FillCache(ds.Tables["EmailTemplate"]); } if (itypes.Contains((int)InvalidType.Employees) || isAll) { Employees.FillCache(ds.Tables["Employee"]); PayPeriods.FillCache(ds.Tables["PayPeriod"]); } if (itypes.Contains((int)InvalidType.Employers) || isAll) { Employers.FillCache(ds.Tables["Employer"]); } if (itypes.Contains((int)InvalidType.Fees) || isAll) { Fees.FillCache(ds.Tables["Fee"]); } if (itypes.Contains((int)InvalidType.FeeScheds) || isAll) { FeeScheds.FillCache(ds.Tables["FeeSched"]); } if (itypes.Contains((int)InvalidType.HL7Defs) || isAll) { HL7Defs.FillCache(ds.Tables["HL7Def"]); HL7DefMessages.FillCache(ds.Tables["HL7DefMessage"]); HL7DefSegments.FillCache(ds.Tables["HL7DefSegment"]); HL7DefFields.FillCache(ds.Tables["HL7DefField"]); } if (itypes.Contains((int)InvalidType.InsCats) || isAll) { CovCats.FillCache(ds.Tables["CovCat"]); CovSpans.FillCache(ds.Tables["CovSpan"]); } if (itypes.Contains((int)InvalidType.InsFilingCodes) || isAll) { InsFilingCodes.FillCache(ds.Tables["InsFilingCode"]); InsFilingCodeSubtypes.FillCache(ds.Tables["InsFilingCodeSubtype"]); } if (itypes.Contains((int)InvalidType.Languages) || isAll) { Lans.FillCache(ds.Tables["Language"]); } if (itypes.Contains((int)InvalidType.Letters) || isAll) { Letters.FillCache(ds.Tables["Letter"]); } if (itypes.Contains((int)InvalidType.LetterMerge) || isAll) { LetterMergeFields.FillCache(ds.Tables["LetterMergeField"]); LetterMerges.FillCache(ds.Tables["LetterMerge"]); } if (itypes.Contains((int)InvalidType.Operatories) || isAll) { Operatories.FillCache(ds.Tables["Operatory"]); } if (itypes.Contains((int)InvalidType.PatFields) || isAll) { PatFieldDefs.FillCache(ds.Tables["PatFieldDef"]); ApptFieldDefs.FillCache(ds.Tables["ApptFieldDef"]); } if (itypes.Contains((int)InvalidType.Pharmacies) || isAll) { Pharmacies.FillCache(ds.Tables["Pharmacy"]); } if (itypes.Contains((int)InvalidType.Prefs) || isAll) { Prefs.FillCache(ds.Tables["Pref"]); } if (itypes.Contains((int)InvalidType.ProcButtons) || isAll) { ProcButtons.FillCache(ds.Tables["ProcButton"]); ProcButtonItems.FillCache(ds.Tables["ProcButtonItem"]); } if (itypes.Contains((int)InvalidType.ProcCodes) || isAll) { ProcedureCodes.FillCache(ds.Tables["ProcedureCode"]); ProcCodeNotes.FillCache(ds.Tables["ProcCodeNote"]); } if (itypes.Contains((int)InvalidType.Programs) || isAll) { Programs.FillCache(ds.Tables["Program"]); ProgramProperties.FillCache(ds.Tables["ProgramProperty"]); } if (itypes.Contains((int)InvalidType.ProviderIdents) || isAll) { ProviderIdents.FillCache(ds.Tables["ProviderIdent"]); } if (itypes.Contains((int)InvalidType.Providers) || isAll) { Providers.FillCache(ds.Tables["Provider"]); } if (itypes.Contains((int)InvalidType.QuickPaste) || isAll) { QuickPasteNotes.FillCache(ds.Tables["QuickPasteNote"]); QuickPasteCats.FillCache(ds.Tables["QuickPasteCat"]); } if (itypes.Contains((int)InvalidType.RecallTypes) || isAll) { RecallTypes.FillCache(ds.Tables["RecallType"]); RecallTriggers.FillCache(ds.Tables["RecallTrigger"]); } if (itypes.Contains((int)InvalidType.ReplicationServers) || isAll) { ReplicationServers.FillCache(ds.Tables["ReplicationServer"]); } if (itypes.Contains((int)InvalidType.Security) || isAll) { Userods.FillCache(ds.Tables["Userod"]); UserGroups.FillCache(ds.Tables["UserGroup"]); } if (itypes.Contains((int)InvalidType.Sheets) || isAll) { SheetDefs.FillCache(ds.Tables["SheetDef"]); SheetFieldDefs.FillCache(ds.Tables["SheetFieldDef"]); } if (itypes.Contains((int)InvalidType.Signals) || isAll) { SigElementDefs.FillCache(ds.Tables["SigElementDef"]); SigButDefs.FillCache(ds.Tables["SigButDef"]); //includes SigButDefElements.Refresh() } if (itypes.Contains((int)InvalidType.Sites) || isAll) { Sites.FillCache(ds.Tables["Site"]); } if (itypes.Contains((int)InvalidType.Sops) || isAll) { Sops.FillCache(ds.Tables["Sop"]); } if (itypes.Contains((int)InvalidType.TimeCardRules) || isAll) { TimeCardRules.FillCache(ds.Tables["TimeCardRule"]); } //InvalidTypes.Tasks not handled here. if (itypes.Contains((int)InvalidType.ToolBut) || isAll) { ToolButItems.FillCache(ds.Tables["ToolButItem"]); } if (itypes.Contains((int)InvalidType.Vaccines) || isAll) { VaccineDefs.FillCache(ds.Tables["VaccineDef"]); DrugManufacturers.FillCache(ds.Tables["DrugManufacturer"]); DrugUnits.FillCache(ds.Tables["DrugUnit"]); } if (itypes.Contains((int)InvalidType.Views) || isAll) { ApptViews.FillCache(ds.Tables["ApptView"]); ApptViewItems.FillCache(ds.Tables["ApptViewItem"]); AppointmentRules.FillCache(ds.Tables["AppointmentRule"]); ProcApptColors.FillCache(ds.Tables["ProcApptColor"]); } if (itypes.Contains((int)InvalidType.Wiki) || isAll) { WikiListHeaderWidths.FillCache(ds.Tables["WikiListHeaderWidth"]); WikiPages.FillCache(ds.Tables["WikiPage"]); } if (itypes.Contains((int)InvalidType.ZipCodes) || isAll) { ZipCodes.FillCache(ds.Tables["ZipCode"]); } }
///<summary>If ClientWeb, then this method is instead run on the server, and the result passed back to the client. And since it's ClientWeb, FillCache will be run on the client.</summary> public static DataSet GetCacheDs(string itypesStr) { if (RemotingClient.RemotingRole == RemotingRole.ClientWeb) { return(Meth.GetDS(MethodBase.GetCurrentMethod(), itypesStr)); } //so this part below only happens if direct or server------------------------------------------------ List <int> itypes = new List <int>(); string[] strArray = itypesStr.Split(','); for (int i = 0; i < strArray.Length; i++) { itypes.Add(PIn.Int(strArray[i])); } bool isAll = false; if (itypes.Contains((int)InvalidType.AllLocal)) { isAll = true; } DataSet ds = new DataSet(); if (itypes.Contains((int)InvalidType.AccountingAutoPays) || isAll) { ds.Tables.Add(AccountingAutoPays.RefreshCache()); } if (itypes.Contains((int)InvalidType.AutoCodes) || isAll) { ds.Tables.Add(AutoCodes.RefreshCache()); ds.Tables.Add(AutoCodeItems.RefreshCache()); ds.Tables.Add(AutoCodeConds.RefreshCache()); } if (itypes.Contains((int)InvalidType.Automation) || isAll) { ds.Tables.Add(Automations.RefreshCache()); } if (itypes.Contains((int)InvalidType.AutoNotes) || isAll) { ds.Tables.Add(AutoNotes.RefreshCache()); ds.Tables.Add(AutoNoteControls.RefreshCache()); } if (itypes.Contains((int)InvalidType.Carriers) || isAll) { ds.Tables.Add(Carriers.RefreshCache()); //run on startup, after telephone reformat, after list edit. } if (itypes.Contains((int)InvalidType.ClaimForms) || isAll) { ds.Tables.Add(ClaimFormItems.RefreshCache()); ds.Tables.Add(ClaimForms.RefreshCache()); } if (itypes.Contains((int)InvalidType.ClearHouses) || isAll) { ds.Tables.Add(Clearinghouses.RefreshCache()); //kh wants to add an EasyHideClearHouses to disable this } if (itypes.Contains((int)InvalidType.Computers) || isAll) { ds.Tables.Add(Computers.RefreshCache()); ds.Tables.Add(Printers.RefreshCache()); } if (itypes.Contains((int)InvalidType.Defs) || isAll) { ds.Tables.Add(Defs.RefreshCache()); } if (itypes.Contains((int)InvalidType.DentalSchools) || isAll) { ds.Tables.Add(SchoolClasses.RefreshCache()); ds.Tables.Add(SchoolCourses.RefreshCache()); } if (itypes.Contains((int)InvalidType.DictCustoms) || isAll) { ds.Tables.Add(DictCustoms.RefreshCache()); } if (itypes.Contains((int)InvalidType.Diseases) || isAll) { ds.Tables.Add(DiseaseDefs.RefreshCache()); ds.Tables.Add(ICD9s.RefreshCache()); } if (itypes.Contains((int)InvalidType.DisplayFields) || isAll) { ds.Tables.Add(DisplayFields.RefreshCache()); } if (itypes.Contains((int)InvalidType.ElectIDs) || isAll) { ds.Tables.Add(ElectIDs.RefreshCache()); } if (itypes.Contains((int)InvalidType.Email) || isAll) { ds.Tables.Add(EmailAddresses.RefreshCache()); ds.Tables.Add(EmailTemplates.RefreshCache()); } if (itypes.Contains((int)InvalidType.Employees) || isAll) { ds.Tables.Add(Employees.RefreshCache()); ds.Tables.Add(PayPeriods.RefreshCache()); } if (itypes.Contains((int)InvalidType.Employers) || isAll) { ds.Tables.Add(Employers.RefreshCache()); } if (itypes.Contains((int)InvalidType.Fees) || isAll) { ds.Tables.Add(Fees.RefreshCache()); } if (itypes.Contains((int)InvalidType.FeeScheds) || isAll) { ds.Tables.Add(FeeScheds.RefreshCache()); } if (itypes.Contains((int)InvalidType.HL7Defs) || isAll) { ds.Tables.Add(HL7Defs.RefreshCache()); ds.Tables.Add(HL7DefMessages.RefreshCache()); ds.Tables.Add(HL7DefSegments.RefreshCache()); ds.Tables.Add(HL7DefFields.RefreshCache()); } if (itypes.Contains((int)InvalidType.InsCats) || isAll) { ds.Tables.Add(CovCats.RefreshCache()); ds.Tables.Add(CovSpans.RefreshCache()); } if (itypes.Contains((int)InvalidType.InsFilingCodes) || isAll) { ds.Tables.Add(InsFilingCodes.RefreshCache()); ds.Tables.Add(InsFilingCodeSubtypes.RefreshCache()); } if (itypes.Contains((int)InvalidType.Languages) || isAll) { if (CultureInfo.CurrentCulture.Name != "en-US") { ds.Tables.Add(Lans.RefreshCache()); } } if (itypes.Contains((int)InvalidType.Letters) || isAll) { ds.Tables.Add(Letters.RefreshCache()); } if (itypes.Contains((int)InvalidType.LetterMerge) || isAll) { ds.Tables.Add(LetterMergeFields.RefreshCache()); ds.Tables.Add(LetterMerges.RefreshCache()); } if (itypes.Contains((int)InvalidType.Operatories) || isAll) { ds.Tables.Add(Operatories.RefreshCache()); } if (itypes.Contains((int)InvalidType.PatFields) || isAll) { ds.Tables.Add(PatFieldDefs.RefreshCache()); ds.Tables.Add(ApptFieldDefs.RefreshCache()); } if (itypes.Contains((int)InvalidType.Pharmacies) || isAll) { ds.Tables.Add(Pharmacies.RefreshCache()); } if (itypes.Contains((int)InvalidType.Prefs) || isAll) { ds.Tables.Add(Prefs.RefreshCache()); } if (itypes.Contains((int)InvalidType.ProcButtons) || isAll) { ds.Tables.Add(ProcButtons.RefreshCache()); ds.Tables.Add(ProcButtonItems.RefreshCache()); } if (itypes.Contains((int)InvalidType.ProcCodes) || isAll) { ds.Tables.Add(ProcedureCodes.RefreshCache()); ds.Tables.Add(ProcCodeNotes.RefreshCache()); } if (itypes.Contains((int)InvalidType.Programs) || isAll) { ds.Tables.Add(Programs.RefreshCache()); ds.Tables.Add(ProgramProperties.RefreshCache()); } if (itypes.Contains((int)InvalidType.ProviderIdents) || isAll) { ds.Tables.Add(ProviderIdents.RefreshCache()); } if (itypes.Contains((int)InvalidType.Providers) || isAll) { ds.Tables.Add(Providers.RefreshCache()); } if (itypes.Contains((int)InvalidType.QuickPaste) || isAll) { ds.Tables.Add(QuickPasteNotes.RefreshCache()); ds.Tables.Add(QuickPasteCats.RefreshCache()); } if (itypes.Contains((int)InvalidType.RecallTypes) || isAll) { ds.Tables.Add(RecallTypes.RefreshCache()); ds.Tables.Add(RecallTriggers.RefreshCache()); } if (itypes.Contains((int)InvalidType.ReplicationServers) || isAll) { ds.Tables.Add(ReplicationServers.RefreshCache()); } if (itypes.Contains((int)InvalidType.Security) || isAll) { ds.Tables.Add(Userods.RefreshCache()); ds.Tables.Add(UserGroups.RefreshCache()); } if (itypes.Contains((int)InvalidType.Sheets) || isAll) { ds.Tables.Add(SheetDefs.RefreshCache()); ds.Tables.Add(SheetFieldDefs.RefreshCache()); } if (itypes.Contains((int)InvalidType.Signals) || isAll) { ds.Tables.Add(SigElementDefs.RefreshCache()); ds.Tables.Add(SigButDefs.RefreshCache()); //includes SigButDefElements.Refresh() } if (itypes.Contains((int)InvalidType.Sites) || isAll) { ds.Tables.Add(Sites.RefreshCache()); } if (itypes.Contains((int)InvalidType.Sops) || isAll) { ds.Tables.Add(Sops.RefreshCache()); } //InvalidTypes.Tasks not handled here. if (itypes.Contains((int)InvalidType.TimeCardRules) || isAll) { ds.Tables.Add(TimeCardRules.RefreshCache()); } if (itypes.Contains((int)InvalidType.ToolBut) || isAll) { ds.Tables.Add(ToolButItems.RefreshCache()); } if (itypes.Contains((int)InvalidType.Vaccines) || isAll) { ds.Tables.Add(VaccineDefs.RefreshCache()); ds.Tables.Add(DrugManufacturers.RefreshCache()); ds.Tables.Add(DrugUnits.RefreshCache()); } if (itypes.Contains((int)InvalidType.Views) || isAll) { ds.Tables.Add(ApptViews.RefreshCache()); ds.Tables.Add(ApptViewItems.RefreshCache()); ds.Tables.Add(AppointmentRules.RefreshCache()); ds.Tables.Add(ProcApptColors.RefreshCache()); } if (itypes.Contains((int)InvalidType.Wiki) || isAll) { ds.Tables.Add(WikiListHeaderWidths.RefreshCache()); ds.Tables.Add(WikiPages.RefreshCache()); } if (itypes.Contains((int)InvalidType.ZipCodes) || isAll) { ds.Tables.Add(ZipCodes.RefreshCache()); } return(ds); }
///<summary>Pass in a serialized dto. It returns a dto which must be deserialized by the client. ///Set serverMapPath to the root directory of the OpenDentalServerConfig.xml. Typically Server.MapPath(".") from a web service. ///Optional parameter because it is not necessary for Unit Tests (mock server).</summary> public static string ProcessDto(string dtoString, string serverMapPath = "") { #if DEBUG //System.Threading.Thread.Sleep(100);//to test slowness issues with web service. #endif DataTransferObject dto = DataTransferObject.Deserialize(dtoString); try { string[] methNameComps = GetComponentsFromDtoMeth(dto.MethodName); if (methNameComps.Length == 3 && methNameComps[2].ToLower() == "hashpassword") { return(GetHashPassword(dto)); } //Always attempt to set the database connection settings from the config file if they haven't been set yet. //We use to ONLY load in database settings when Security.LogInWeb was called but that is not good enough now that we have more services. //E.g. We do not want to manually call "Security.LogInWeb" from the CEMT when all we want is a single preference value. if (string.IsNullOrEmpty(DataConnection.GetServerName()) && string.IsNullOrEmpty(DataConnection.GetConnectionString())) { RemotingClient.RemotingRole = RemotingRole.ServerWeb; //the application virtual path is usually /OpenDentalServer, but may be different if hosting multiple databases on one IIS server string configFilePath = ""; if (!string.IsNullOrWhiteSpace(HostingEnvironment.ApplicationVirtualPath) && HostingEnvironment.ApplicationVirtualPath.Length > 1) { //There can be multiple config files within a physical path that is shared by multiple IIS ASP.NET applications. //In order for the same physical path to host multiple applications, they each need a unique config file for db connection settings. //Each application will have a unique ApplicationVirtualPath which we will use to identify the corresponding config.xml. configFilePath = ODFileUtils.CombinePaths(serverMapPath, HostingEnvironment.ApplicationVirtualPath.Trim('/') + "Config.xml"); } if (string.IsNullOrWhiteSpace(configFilePath) || !File.Exists(configFilePath)) //returns false if the file doesn't exist, user doesn't have permission for file, path is blank or null { //either configFilePath not set or file doesn't exist, default to OpenDentalServerConfig.xml configFilePath = ODFileUtils.CombinePaths(serverMapPath, "OpenDentalServerConfig.xml"); } Userods.LoadDatabaseInfoFromFile(configFilePath); } //Set Security.CurUser so that queries can be run against the db as if it were this user. Security.CurUser = Userods.CheckUserAndPassword(dto.Credentials.Username , dto.Credentials.Password , Programs.IsEnabled(ProgramName.eClinicalWorks)); Security.PasswordTyped = dto.Credentials.Password; Type type = dto.GetType(); #region DtoGetTable if (type == typeof(DtoGetTable)) { DtoGetTable dtoGetTable = (DtoGetTable)dto; string[] fullNameComponents = GetComponentsFromDtoMeth(dtoGetTable.MethodName); string assemblyName = fullNameComponents[0]; //OpenDentBusiness or else a plugin name string className = fullNameComponents[1]; string methodName = fullNameComponents[2]; Type classType = null; Assembly ass = Plugins.GetAssembly(assemblyName); if (ass == null) { classType = Type.GetType(assemblyName //actually, the namespace which we require to be same as assembly by convention + "." + className + "," + assemblyName); } else //plugin was found { classType = ass.GetType(assemblyName //actually, the namespace which we require to be same as assembly by convention + "." + className); } DtoObject[] parameters = dtoGetTable.Params; Type[] paramTypes = DtoObject.GenerateTypes(parameters, assemblyName); MethodInfo methodInfo = classType.GetMethod(methodName, paramTypes); if (methodInfo == null) { throw new ApplicationException("Method not found with " + parameters.Length.ToString() + " parameters: " + dtoGetTable.MethodName); } object[] paramObjs = DtoObject.GenerateObjects(parameters); DataTable dt = (DataTable)methodInfo.Invoke(null, paramObjs); String response = XmlConverter.TableToXml(dt); return(response); } #endregion #region DtoGetTableLow else if (type == typeof(DtoGetTableLow)) { DtoGetTableLow dtoGetTableLow = (DtoGetTableLow)dto; DtoObject[] parameters = dtoGetTableLow.Params; object[] paramObjs = DtoObject.GenerateObjects(parameters); DataTable dt = Reports.GetTable((string)paramObjs[0]); String response = XmlConverter.TableToXml(dt); return(response); } #endregion #region DtoGetDS else if (type == typeof(DtoGetDS)) { DtoGetDS dtoGetDS = (DtoGetDS)dto; string[] fullNameComponents = GetComponentsFromDtoMeth(dtoGetDS.MethodName); string assemblyName = fullNameComponents[0]; //OpenDentBusiness or else a plugin name string className = fullNameComponents[1]; string methodName = fullNameComponents[2]; Type classType = null; Assembly ass = Plugins.GetAssembly(assemblyName); if (ass == null) { classType = Type.GetType(assemblyName //actually, the namespace which we require to be same as assembly by convention + "." + className + "," + assemblyName); } else //plugin was found { classType = ass.GetType(assemblyName //actually, the namespace which we require to be same as assembly by convention + "." + className); } DtoObject[] parameters = dtoGetDS.Params; Type[] paramTypes = DtoObject.GenerateTypes(parameters, assemblyName); MethodInfo methodInfo = classType.GetMethod(methodName, paramTypes); if (methodInfo == null) { throw new ApplicationException("Method not found with " + parameters.Length.ToString() + " parameters: " + dtoGetDS.MethodName); } object[] paramObjs = DtoObject.GenerateObjects(parameters); DataSet ds = (DataSet)methodInfo.Invoke(null, paramObjs); String response = XmlConverter.DsToXml(ds); return(response); } #endregion #region DtoGetSerializableDictionary else if (type == typeof(DtoGetSerializableDictionary)) { DtoGetSerializableDictionary dtoGetSD = (DtoGetSerializableDictionary)dto; string[] fullNameComponents = GetComponentsFromDtoMeth(dtoGetSD.MethodName); string assemblyName = fullNameComponents[0]; //OpenDentBusiness or else a plugin name string className = fullNameComponents[1]; string methodName = fullNameComponents[2]; Type classType = null; Assembly ass = Plugins.GetAssembly(assemblyName); if (ass == null) { classType = Type.GetType(assemblyName //actually, the namespace which we require to be same as assembly by convention + "." + className + "," + assemblyName); } else //plugin was found { classType = ass.GetType(assemblyName //actually, the namespace which we require to be same as assembly by convention + "." + className); } DtoObject[] parameters = dtoGetSD.Params; Type[] paramTypes = DtoObject.GenerateTypes(parameters, assemblyName); MethodInfo methodInfo = classType.GetMethod(methodName, paramTypes); if (methodInfo == null) { throw new ApplicationException("Method not found with " + parameters.Length.ToString() + " parameters: " + dtoGetSD.MethodName); } object[] paramObjs = DtoObject.GenerateObjects(parameters); Object objResult = methodInfo.Invoke(null, paramObjs); Type returnType = methodInfo.ReturnType; return(XmlConverter.Serialize(returnType, objResult)); } #endregion #region DtoGetLong else if (type == typeof(DtoGetLong)) { DtoGetLong dtoGetLong = (DtoGetLong)dto; string[] fullNameComponents = GetComponentsFromDtoMeth(dtoGetLong.MethodName); string assemblyName = fullNameComponents[0]; //OpenDentBusiness or else a plugin name string className = fullNameComponents[1]; string methodName = fullNameComponents[2]; Type classType = null; Assembly ass = Plugins.GetAssembly(assemblyName); if (ass == null) { classType = Type.GetType(assemblyName //actually, the namespace which we require to be same as assembly by convention + "." + className + "," + assemblyName); } else //plugin was found { classType = ass.GetType(assemblyName //actually, the namespace which we require to be same as assembly by convention + "." + className); } DtoObject[] parameters = dtoGetLong.Params; Type[] paramTypes = DtoObject.GenerateTypes(parameters, assemblyName); MethodInfo methodInfo = classType.GetMethod(methodName, paramTypes); if (methodInfo == null) { throw new ApplicationException("Method not found with " + parameters.Length.ToString() + " parameters: " + dtoGetLong.MethodName); } object[] paramObjs = DtoObject.GenerateObjects(parameters); long longResult = (long)methodInfo.Invoke(null, paramObjs); return(longResult.ToString()); } #endregion #region DtoGetInt else if (type == typeof(DtoGetInt)) { DtoGetInt dtoGetInt = (DtoGetInt)dto; string[] fullNameComponents = GetComponentsFromDtoMeth(dtoGetInt.MethodName); string assemblyName = fullNameComponents[0]; //OpenDentBusiness or else a plugin name string className = fullNameComponents[1]; string methodName = fullNameComponents[2]; Type classType = null; Assembly ass = Plugins.GetAssembly(assemblyName); if (ass == null) { classType = Type.GetType(assemblyName //actually, the namespace which we require to be same as assembly by convention + "." + className + "," + assemblyName); } else //plugin was found { classType = ass.GetType(assemblyName //actually, the namespace which we require to be same as assembly by convention + "." + className); } DtoObject[] parameters = dtoGetInt.Params; Type[] paramTypes = DtoObject.GenerateTypes(parameters, assemblyName); MethodInfo methodInfo = classType.GetMethod(methodName, paramTypes); if (methodInfo == null) { throw new ApplicationException("Method not found with " + parameters.Length.ToString() + " parameters: " + dtoGetInt.MethodName); } object[] paramObjs = DtoObject.GenerateObjects(parameters); int intResult = (int)methodInfo.Invoke(null, paramObjs); return(intResult.ToString()); } #endregion #region DtoGetDouble else if (type == typeof(DtoGetDouble)) { DtoGetDouble dtoGetDouble = (DtoGetDouble)dto; string[] fullNameComponents = GetComponentsFromDtoMeth(dtoGetDouble.MethodName); string assemblyName = fullNameComponents[0]; //OpenDentBusiness or else a plugin name string className = fullNameComponents[1]; string methodName = fullNameComponents[2]; Type classType = null; Assembly ass = Plugins.GetAssembly(assemblyName); if (ass == null) { classType = Type.GetType(assemblyName //actually, the namespace which we require to be same as assembly by convention + "." + className + "," + assemblyName); } else //plugin was found { classType = ass.GetType(assemblyName //actually, the namespace which we require to be same as assembly by convention + "." + className); } DtoObject[] parameters = dtoGetDouble.Params; Type[] paramTypes = DtoObject.GenerateTypes(parameters, assemblyName); MethodInfo methodInfo = classType.GetMethod(methodName, paramTypes); if (methodInfo == null) { throw new ApplicationException("Method not found with " + parameters.Length.ToString() + " parameters: " + dtoGetDouble.MethodName); } object[] paramObjs = DtoObject.GenerateObjects(parameters); double doubleResult = (double)methodInfo.Invoke(null, paramObjs); return(doubleResult.ToString()); } #endregion #region DtoGetVoid else if (type == typeof(DtoGetVoid)) { DtoGetVoid dtoGetVoid = (DtoGetVoid)dto; string[] fullNameComponents = GetComponentsFromDtoMeth(dtoGetVoid.MethodName); string assemblyName = fullNameComponents[0]; //OpenDentBusiness or else a plugin name string className = fullNameComponents[1]; string methodName = fullNameComponents[2]; Type classType = null; Assembly ass = Plugins.GetAssembly(assemblyName); if (ass == null) { classType = Type.GetType(assemblyName //actually, the namespace which we require to be same as assembly by convention + "." + className + "," + assemblyName); } else //plugin was found { classType = ass.GetType(assemblyName //actually, the namespace which we require to be same as assembly by convention + "." + className); } DtoObject[] parameters = dtoGetVoid.Params; Type[] paramTypes = DtoObject.GenerateTypes(parameters, assemblyName); MethodInfo methodInfo = classType.GetMethod(methodName, paramTypes); if (methodInfo == null) { throw new ApplicationException("Method not found with " + parameters.Length.ToString() + " parameters: " + dtoGetVoid.MethodName); } object[] paramObjs = DtoObject.GenerateObjects(parameters); methodInfo.Invoke(null, paramObjs); return("0"); } #endregion #region DtoGetObject else if (type == typeof(DtoGetObject)) { DtoGetObject dtoGetObject = (DtoGetObject)dto; string[] fullNameComponents = GetComponentsFromDtoMeth(dtoGetObject.MethodName); string assemblyName = fullNameComponents[0]; //OpenDentBusiness or else a plugin name string className = fullNameComponents[1]; string methodName = fullNameComponents[2]; //if(className != "Security" || methodName != "LogInWeb") {//because credentials will be checked inside that method // Userods.CheckCredentials(dtoGetObject.Credentials);//will throw exception if fails. //} Type classType = null; Assembly ass = Plugins.GetAssembly(assemblyName); //if(className!="Security" || methodName!="LogInWeb") {//Do this for everything except Security.LogInWeb, because Plugins.GetAssembly will fail in that case. // ass=Plugins.GetAssembly(assemblyName); //} if (ass == null) { classType = Type.GetType(assemblyName //actually, the namespace which we require to be same as assembly by convention + "." + className + "," + assemblyName); } else //plugin was found { classType = ass.GetType(assemblyName //actually, the namespace which we require to be same as assembly by convention + "." + className); } DtoObject[] parameters = dtoGetObject.Params; Type[] paramTypes = DtoObject.GenerateTypes(parameters, assemblyName); MethodInfo methodInfo = classType.GetMethod(methodName, paramTypes); if (methodInfo == null) { throw new ApplicationException("Method not found with " + parameters.Length.ToString() + " parameters: " + dtoGetObject.MethodName); } if (className == "Security" && methodName == "LogInWeb") { parameters[2] = new DtoObject(serverMapPath, typeof(string)); //because we can't access this variable from within OpenDentBusiness. RemotingClient.RemotingRole = RemotingRole.ServerWeb; } object[] paramObjs = DtoObject.GenerateObjects(parameters); Object objResult = methodInfo.Invoke(null, paramObjs); Type returnType = methodInfo.ReturnType; if (returnType.IsInterface) { objResult = new DtoObject(objResult, objResult?.GetType() ?? returnType); returnType = typeof(DtoObject); } return(XmlConverter.Serialize(returnType, objResult)); } #endregion #region DtoGetString else if (type == typeof(DtoGetString)) { DtoGetString dtoGetString = (DtoGetString)dto; string[] fullNameComponents = GetComponentsFromDtoMeth(dtoGetString.MethodName); string assemblyName = fullNameComponents[0]; //OpenDentBusiness or else a plugin name string className = fullNameComponents[1]; string methodName = fullNameComponents[2]; Type classType = null; Assembly ass = Plugins.GetAssembly(assemblyName); if (ass == null) { classType = Type.GetType(assemblyName //actually, the namespace which we require to be same as assembly by convention + "." + className + "," + assemblyName); } else //plugin was found { classType = ass.GetType(assemblyName //actually, the namespace which we require to be same as assembly by convention + "." + className); } DtoObject[] parameters = dtoGetString.Params; Type[] paramTypes = DtoObject.GenerateTypes(parameters, assemblyName); MethodInfo methodInfo = classType.GetMethod(methodName, paramTypes); if (methodInfo == null) { throw new ApplicationException("Method not found with " + parameters.Length.ToString() + " parameters: " + dtoGetString.MethodName); } object[] paramObjs = DtoObject.GenerateObjects(parameters); string strResult = (string)methodInfo.Invoke(null, paramObjs); strResult = XmlConverter.XmlEscape(strResult); return(strResult); } #endregion #region DtoGetBool else if (type == typeof(DtoGetBool)) { DtoGetBool dtoGetBool = (DtoGetBool)dto; string[] fullNameComponents = GetComponentsFromDtoMeth(dtoGetBool.MethodName); string assemblyName = fullNameComponents[0]; //OpenDentBusiness or else a plugin name string className = fullNameComponents[1]; string methodName = fullNameComponents[2]; Type classType = null; Assembly ass = Plugins.GetAssembly(assemblyName); if (ass == null) { classType = Type.GetType(assemblyName //actually, the namespace which we require to be same as assembly by convention + "." + className + "," + assemblyName); } else //plugin was found { classType = ass.GetType(assemblyName //actually, the namespace which we require to be same as assembly by convention + "." + className); } DtoObject[] parameters = dtoGetBool.Params; Type[] paramTypes = DtoObject.GenerateTypes(parameters, assemblyName); MethodInfo methodInfo = classType.GetMethod(methodName, paramTypes); if (methodInfo == null) { throw new ApplicationException("Method not found with " + parameters.Length.ToString() + " parameters: " + dtoGetBool.MethodName); } object[] paramObjs = DtoObject.GenerateObjects(parameters); bool boolResult = (bool)methodInfo.Invoke(null, paramObjs); return(boolResult.ToString()); } #endregion else { throw new NotSupportedException("Dto type not supported: " + type.FullName); } } catch (Exception e) { DtoException exception = new DtoException(); exception.ExceptionType = e.GetType().BaseType.Name; //Since the exception was down converted to a regular exception, we need the BaseType. if (e.InnerException == null) { exception.Message = e.Message; } else { exception.Message = e.InnerException.Message; } return(exception.Serialize()); } }
//<summary>Obsolete</summary> //public static void ResetPassword(){ //FIXME:UPDATE-MULTIPLE-TABLES /*string command="UPDATE userod,grouppermissions SET userod.Password='' " +"WHERE grouppermissions.UserGroupNum=userod.UserGroupNum " +"AND grouppermissions.PermType=24"; * Db.NonQ(command); */ //Code updated to be compatible with Oracle as well as MySQL. /* * string command="SELECT userod.UserNum FROM userod,grouppermissions " +"WHERE grouppermissions.UserGroupNum=userod.UserGroupNum " +"AND grouppermissions.PermType=24"; * DataTable table=Db.GetTable(command); * if(table.Rows.Count==0){ * throw new ApplicationException("No admin exists."); * } * command="UPDATE userod SET Password='' WHERE UserNum="+POut.PString(table.Rows[0][0].ToString()); * Db.NonQ(command); * }*/ ///<summary>RemotingRole has not yet been set to ClientWeb, but it will if this succeeds. Will throw an exception if server cannot validate username and password. configPath will be empty from a workstation and filled from the server. If Ecw, odpass will actually be the hash.</summary> public static Userod LogInWeb(string oduser, string odpass, string configPath, string clientVersionStr, bool usingEcw) { //Very unusual method. Remoting role can't be checked, but is implied by the presence of a value in configPath. if (configPath != "") //RemotingRole.ServerWeb { Userods.LoadDatabaseInfoFromFile(ODFileUtils.CombinePaths(configPath, "OpenDentalServerConfig.xml")); //ODFileUtils.CombinePaths( // ,"OpenDentalServerConfig.xml")); //Path.GetDirectoryName(Application.ExecutablePath),"OpenDentalServerConfig.xml")); //Application.StartupPath,"OpenDentalServerConfig.xml")); //Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),"OpenDentalServerConfig.xml")); //Environment.CurrentDirectory,"OpenDentalServerConfig.xml")); //Then, check username and password Userod user = Userods.CheckUserAndPassword(oduser, odpass, usingEcw); #if DEBUG //if(oduser=="Admin"){ // user=Userods.GetUserByName("Admin",usingEcw);//without checking password. Makes debugging faster. //} #endif if (user == null) { throw new Exception("Invalid username or password."); } string command = "SELECT ValueString FROM preference WHERE PrefName='ProgramVersion'"; string dbVersionStr = Db.GetScalar(command); string serverVersionStr = Assembly.GetAssembly(typeof(Db)).GetName().Version.ToString(4); #if DEBUG if (Assembly.GetAssembly(typeof(Db)).GetName().Version.Build == 0) { command = "SELECT ValueString FROM preference WHERE PrefName='DataBaseVersion'"; //Using this during debug in the head makes it open fast with less fiddling. dbVersionStr = Db.GetScalar(command); } #endif if (dbVersionStr != serverVersionStr) { throw new Exception("Version mismatch. Server:" + serverVersionStr + " Database:" + dbVersionStr); } Version clientVersion = new Version(clientVersionStr); Version serverVersion = new Version(serverVersionStr); if (clientVersion > serverVersion) { throw new Exception("Version mismatch. Client:" + clientVersionStr + " Server:" + serverVersionStr); } //if clientVersion == serverVersion, than we need do nothing. //if clientVersion < serverVersion, than an update will later be triggered. //Security.CurUser=user;//we're on the server, so this is meaningless return(user); //return 0;//meaningless } else { //Because RemotingRole has not been set, and because CurUser has not been set, //this particular method is more verbose than most and does not use Meth. //It's not a good example of the standard way of doing things. DtoGetObject dto = new DtoGetObject(); dto.Credentials = new Credentials(); dto.Credentials.Username = oduser; dto.Credentials.Password = odpass; //Userods.EncryptPassword(password); dto.MethodName = "Security.LogInWeb"; dto.ObjectType = typeof(Userod).FullName; object[] parameters = new object[] { oduser, odpass, configPath, clientVersionStr, usingEcw }; Type[] objTypes = new Type[] { typeof(string), typeof(string), typeof(string), typeof(string), typeof(bool) }; dto.Params = DtoObject.ConstructArray(parameters, objTypes); return(RemotingClient.ProcessGetObject <Userod>(dto)); //can throw exception } }
///<summary>Throws an exception to display to the user if anything goes wrong.</summary> public static void TryToConnect(CentralConnection centralConnection, DatabaseType dbType, string connectionString = "", bool noShowOnStartup = false , List <string> listAdminCompNames = null, bool isCommandLineArgs = false) { if (!string.IsNullOrEmpty(centralConnection.ServiceURI)) { LoadMiddleTierProxySettings(); string originalURI = RemotingClient.ServerURI; RemotingClient.ServerURI = centralConnection.ServiceURI; bool useEcwAlgorithm = centralConnection.WebServiceIsEcw; RemotingRole originalRole = RemotingClient.RemotingRole; RemotingClient.RemotingRole = RemotingRole.ClientWeb; try { string password = centralConnection.OdPassword; if (useEcwAlgorithm) { //Userods.HashPassword explicitly goes over to middle tier in order to use it's MD5 algorithm. //It doesn't matter what Security.CurUser is when it is null because we are technically trying to set it for the first time. //It cannot be null before invoking HashPassword because middle needs it to NOT be null when creating the credentials for DtoGetString. if (Security.CurUser == null) { Security.CurUser = new Userod(); } password = Userods.HashPassword(password, true); } string username = centralConnection.OdUser; #if DEBUG if (username == "") { username = "******"; password = "******"; } #endif //ecw requires hash, but non-ecw requires actual password Security.CurUser = Security.LogInWeb(username, password, "", Application.ProductVersion, useEcwAlgorithm); Security.PasswordTyped = password; //for ecw, this is already encrypted. } catch (Exception ex) { RemotingClient.ServerURI = originalURI; RemotingClient.RemotingRole = originalRole; throw ex; } } else { DataConnection.DBtype = dbType; DataConnection dcon = new DataConnection(); if (connectionString.Length > 0) { dcon.SetDb(connectionString, "", DataConnection.DBtype); } else { //Password could be plain text password from the Password field of the config file, the decrypted password from the MySQLPassHash field //of the config file, or password entered by the user and can be blank (empty string) in all cases dcon.SetDb(centralConnection.ServerName, centralConnection.DatabaseName, centralConnection.MySqlUser , centralConnection.MySqlPassword, "", "", DataConnection.DBtype); } //a direct connection does not utilize lower privileges. RemotingClient.RemotingRole = RemotingRole.ClientDirect; } TrySaveConnectionSettings(centralConnection, dbType, connectionString, noShowOnStartup, listAdminCompNames, isCommandLineArgs); }
public static string GetChangesDescription(TaskHist taskCur, TaskHist taskNext) { if (taskCur.Descript.StartsWith("This task was cut from task list ") || taskCur.Descript.StartsWith("This task was copied from task ")) { return(taskCur.Descript); } if (taskCur.DateTimeEntry == DateTime.MinValue) { return(Lans.g("TaskHists", "New task.")); } StringBuilder strb = new StringBuilder(); strb.Append(""); if (taskNext.TaskListNum != taskCur.TaskListNum) { string descOne = Lans.g("TaskHists", "(DELETED)"); string descTwo = Lans.g("TaskHists", "(DELETED)"); TaskList taskList = TaskLists.GetOne(taskCur.TaskListNum); if (taskList != null) { descOne = taskList.Descript; } taskList = TaskLists.GetOne(taskNext.TaskListNum); if (taskList != null) { descTwo = taskList.Descript; } strb.Append(Lans.g("TaskHists", "Task list changed from") + " " + descOne + " " + Lans.g("TaskHists", "to") + " " + descTwo + ".\r\n"); } if (taskNext.ObjectType != taskCur.ObjectType) { strb.Append(Lans.g("TaskHists", "Task attachment changed from") + " " + taskCur.ObjectType.ToString() + " " + Lans.g("TaskHists", "to") + " " + taskNext.ObjectType.ToString() + ".\r\n"); } if (taskNext.KeyNum != taskCur.KeyNum) { strb.Append(Lans.g("TaskHists", "Task account attachment changed.") + "\r\n"); } if (taskNext.Descript != taskCur.Descript && !taskNext.Descript.StartsWith("This task was cut from task list ") && !taskNext.Descript.StartsWith("This task was copied from task ")) { //We change the description of a task when it is cut/copied. //This prevents the history grid from showing a description changed when it wasn't changed by the user. strb.Append(Lans.g("TaskHists", "Task description changed.") + "\r\n"); } if (taskNext.TaskStatus != taskCur.TaskStatus) { strb.Append(Lans.g("TaskHists", "Task status changed from") + " " + taskCur.TaskStatus.ToString() + " " + Lans.g("TaskHists", "to") + " " + taskNext.TaskStatus.ToString() + ".\r\n"); } if (taskNext.DateTimeEntry != taskCur.DateTimeEntry) { strb.Append(Lans.g("TaskHists", "Task date added changed from") + " " + taskCur.DateTimeEntry.ToString() + " " + Lans.g("TaskHists", "to") + " " + taskNext.DateTimeEntry.ToString() + ".\r\n"); } if (taskNext.UserNum != taskCur.UserNum) { strb.Append(Lans.g("TaskHists", "Task author changed from ") + Userods.GetUser(taskCur.UserNum).UserName + " " + Lans.g("TaskHists", "to") + " " + Userods.GetUser(taskNext.UserNum).UserName + ".\r\n"); } if (taskNext.DateTimeFinished != taskCur.DateTimeFinished) { strb.Append(Lans.g("TaskHists", "Task date finished changed from") + " " + taskCur.DateTimeFinished.ToString() + " " + Lans.g("TaskHists", "to") + " " + taskNext.DateTimeFinished.ToString() + ".\r\n"); } if (taskNext.PriorityDefNum != taskCur.PriorityDefNum) { strb.Append(Lans.g("TaskHists", "Task priority changed from") + " " + Defs.GetDef(DefCat.TaskPriorities, taskCur.PriorityDefNum).ItemName + " " + Lans.g("TaskHists", "to") + " " + Defs.GetDef(DefCat.TaskPriorities, taskNext.PriorityDefNum).ItemName + ".\r\n"); } if (taskCur.IsNoteChange) //Using taskOld because the notes changed from the old one to the new one. { strb.Append(Lans.g("TaskHists", "Task notes changed.")); } return(strb.ToString()); }
///<summary>Pass in a serialized dto. It returns a dto which must be deserialized by the client. ///Set serverMapPath to the root directory of the OpenDentalServerConfig.xml. Typically Server.MapPath(".") from a web service. ///Optional parameter because it is not necessary for Unit Tests (mock server).</summary> public static string ProcessDto(string dtoString, string serverMapPath = "") { try { #region Normalize DateTime if (!_isMiddleTierInitialized) { //If this fails, the exception will throw and be serialized and sent to the client. ODInitialize.Initialize(); //Because Security._curUserT is a thread static field, we need to make sure that any new threads that are spawned have that field set. ODThread.AddInitializeHandler <Userod>(() => Security.CurUser.Copy(), user => Security.CurUser = user); //Same thing for PasswordTyped. ODThread.AddInitializeHandler <string>(() => Security.PasswordTyped, password => Security.PasswordTyped = password); //Ditto for CurComputerName ODThread.AddInitializeHandler <string>(() => Security.CurComputerName, computerName => Security.CurComputerName = computerName); //Calling CDT.Class1.Decrypt will cause CDT to verify the assembly and then save the encryption key. This needs to be done here because //if we later call CDT.Class1.Decrypt inside a thread, we won't we able to find OpenDentalServer.dll in the call stack. ODException.SwallowAnyException(() => CDT.Class1.Decrypt("odv2e$fakeciphertext", out _)); _isMiddleTierInitialized = true; } #endregion #region Initialize Database Connection //Always attempt to set the database connection settings from the config file if they haven't been set yet. //We use to ONLY load in database settings when Security.LogInWeb was called but that is not good enough now that we have more services. //E.g. We do not want to manually call "Security.LogInWeb" from the CEMT when all we want is a single preference value. if (string.IsNullOrEmpty(DataConnection.GetServerName()) && string.IsNullOrEmpty(DataConnection.GetConnectionString())) { RemotingClient.RemotingRole = RemotingRole.ServerWeb; //the application virtual path is usually /OpenDentalServer, but may be different if hosting multiple databases on one IIS server string configFilePath = ""; if (!string.IsNullOrWhiteSpace(HostingEnvironment.ApplicationVirtualPath) && HostingEnvironment.ApplicationVirtualPath.Length > 1) { //There can be multiple config files within a physical path that is shared by multiple IIS ASP.NET applications. //In order for the same physical path to host multiple applications, they each need a unique config file for db connection settings. //Each application will have a unique ApplicationVirtualPath which we will use to identify the corresponding config.xml. configFilePath = ODFileUtils.CombinePaths(serverMapPath, HostingEnvironment.ApplicationVirtualPath.Trim('/') + "Config.xml"); } if (string.IsNullOrWhiteSpace(configFilePath) || !File.Exists(configFilePath)) //returns false if the file doesn't exist, user doesn't have permission for file, path is blank or null { //either configFilePath not set or file doesn't exist, default to OpenDentalServerConfig.xml configFilePath = ODFileUtils.CombinePaths(serverMapPath, "OpenDentalServerConfig.xml"); } Userods.LoadDatabaseInfoFromFile(configFilePath); } #endregion DataTransferObject dto = DataTransferObject.Deserialize(dtoString); DtoInformation dtoInformation = new DtoInformation(dto); if (dtoInformation.FullNameComponents.Length == 3 && dtoInformation.FullNameComponents[2].ToLower() == "hashpassword") { return(dtoInformation.GetHashPassword()); } //Set Security.CurUser so that queries can be run against the db as if it were this user. Security.CurUser = Userods.CheckUserAndPassword(dto.Credentials.Username, dto.Credentials.Password , Programs.UsingEcwTightOrFullMode()); Security.PasswordTyped = dto.Credentials.Password; //Set the computer name so securitylog entries use the client's computer name instead of the middle tier server name //Older clients might not include ComputerName in the dto, so we need to make sure it's not null. Security.CurComputerName = dto.ComputerName ?? ""; Type type = dto.GetType(); #region DtoGetTable if (type == typeof(DtoGetTable)) { DataTable dt = (DataTable)dtoInformation.MethodInfo.Invoke(null, dtoInformation.ParamObjs); return(XmlConverter.TableToXml(dt)); } #endregion #region DtoGetTableLow else if (type == typeof(DtoGetTableLow)) { DataTable dt = Reports.GetTable((string)dtoInformation.ParamObjs[0]); return(XmlConverter.TableToXml(dt)); } #endregion #region DtoGetDS else if (type == typeof(DtoGetDS)) { DataSet ds = (DataSet)dtoInformation.MethodInfo.Invoke(null, dtoInformation.ParamObjs); return(XmlConverter.DsToXml(ds)); } #endregion #region DtoGetSerializableDictionary else if (type == typeof(DtoGetSerializableDictionary)) { Object objResult = dtoInformation.MethodInfo.Invoke(null, dtoInformation.ParamObjs); Type returnType = dtoInformation.MethodInfo.ReturnType; return(XmlConverterSerializer.Serialize(returnType, objResult)); } #endregion #region DtoGetLong else if (type == typeof(DtoGetLong)) { long longResult = (long)dtoInformation.MethodInfo.Invoke(null, dtoInformation.ParamObjs); return(longResult.ToString()); } #endregion #region DtoGetInt else if (type == typeof(DtoGetInt)) { int intResult = (int)dtoInformation.MethodInfo.Invoke(null, dtoInformation.ParamObjs); return(intResult.ToString()); } #endregion #region DtoGetDouble else if (type == typeof(DtoGetDouble)) { double doubleResult = (double)dtoInformation.MethodInfo.Invoke(null, dtoInformation.ParamObjs); return(doubleResult.ToString()); } #endregion #region DtoGetVoid else if (type == typeof(DtoGetVoid)) { dtoInformation.MethodInfo.Invoke(null, dtoInformation.ParamObjs); return("0"); } #endregion #region DtoGetObject else if (type == typeof(DtoGetObject)) { if (dtoInformation.ClassName == "Security" && dtoInformation.MethodName == "LogInWeb") { dtoInformation.Parameters[2] = new DtoObject(serverMapPath, typeof(string)); //because we can't access this variable from within OpenDentBusiness. RemotingClient.RemotingRole = RemotingRole.ServerWeb; //We just changed the number of parameters so we need to regenerate ParamObjs. dtoInformation.ParamObjs = DtoObject.GenerateObjects(dtoInformation.Parameters); } Object objResult = dtoInformation.MethodInfo.Invoke(null, dtoInformation.ParamObjs); Type returnType = dtoInformation.MethodInfo.ReturnType; if (returnType.IsInterface) { objResult = new DtoObject(objResult, objResult?.GetType() ?? returnType); returnType = typeof(DtoObject); } return(XmlConverterSerializer.Serialize(returnType, objResult)); } #endregion #region DtoGetString else if (type == typeof(DtoGetString)) { string strResult = (string)dtoInformation.MethodInfo.Invoke(null, dtoInformation.ParamObjs); return(XmlConverter.XmlEscape(strResult)); } #endregion #region DtoGetBool else if (type == typeof(DtoGetBool)) { bool boolResult = (bool)dtoInformation.MethodInfo.Invoke(null, dtoInformation.ParamObjs); return(boolResult.ToString()); } #endregion else { throw new NotSupportedException("Dto type not supported: " + type.FullName); } } catch (Exception e) { DtoException exception = new DtoException(); if (e.InnerException == null) { exception = GetDtoException(e); } else { exception = GetDtoException(e.InnerException); } return(exception.Serialize()); } }