//<summary>Keeps track of current server time so that user cannot bypass security by altering workstation clock. Sometimes we compare to nowDate, but sometimes, we're just interested in the date of the adjustment.</summary> //private DateTime nowDate; ///<summary></summary> public FormAdjust(Patient patCur,Adjustment adjustmentCur) { InitializeComponent(); PatCur=patCur; AdjustmentCur=adjustmentCur; Lan.F(this); }
///<summary></summary> public static long Insert(Adjustment adj) { if(RemotingClient.RemotingRole==RemotingRole.ClientWeb) { adj.AdjNum=Meth.GetLong(MethodBase.GetCurrentMethod(),adj); return adj.AdjNum; } return Crud.AdjustmentCrud.Insert(adj); }
///<summary>This will soon be eliminated or changed to only allow deleting on same day as EntryDate.</summary> public static void Delete(Adjustment adj){ if(RemotingClient.RemotingRole==RemotingRole.ClientWeb) { Meth.GetVoid(MethodBase.GetCurrentMethod(),adj); return; } Crud.AdjustmentCrud.Delete(adj.AdjNum); }
///<summary>Used from ContrAccount and ProcEdit to display and calculate adjustments attached to procs.</summary> public static double GetTotForProc(long procNum,Adjustment[] List) { //No need to check RemotingRole; no call to db. double retVal=0; for(int i=0;i<List.Length;i++){ if(List[i].ProcNum==procNum){ retVal+=List[i].AdjAmt; } } return retVal; }
///<summary>Loops through the supplied list of adjustments and returns an ArrayList of adjustments for the given proc.</summary> public static ArrayList GetForProc(long procNum,Adjustment[] List) { //No need to check RemotingRole; no call to db. ArrayList retVal=new ArrayList(); for(int i=0;i<List.Length;i++){ if(List[i].ProcNum==procNum){ retVal.Add(List[i]); } } return retVal; }
private void AddBillingCharge(long PatNum,DateTime date,string BillingChargeAmount,long PriProv) { Adjustment AdjustmentCur = new Adjustment(); AdjustmentCur.PatNum = PatNum; //AdjustmentCur.DateEntry=PIn.PDate(textDate.Text);//automatically handled AdjustmentCur.AdjDate = date; AdjustmentCur.ProcDate = date; AdjustmentCur.AdjType = PrefC.GetLong(PrefName.BillingChargeAdjustmentType); AdjustmentCur.AdjNote = "";//"Billing Charge"; AdjustmentCur.AdjAmt = PIn.Double(BillingChargeAmount); AdjustmentCur.ProvNum = PriProv; Adjustments.Insert(AdjustmentCur); }
///<summary>Called from butOK_Click and butPin_Click</summary> private bool UpdateToDB(){ DateTime dateTimeAskedToArrive=DateTime.MinValue; if(textTimeAskedToArrive.Text!=""){ try{ dateTimeAskedToArrive=AptCur.AptDateTime.Date+DateTime.Parse(textTimeAskedToArrive.Text).TimeOfDay; } catch{ MsgBox.Show(this,"Time Asked To Arrive invalid."); return false; } } DateTime dateTimeArrived=AptCur.AptDateTime.Date; if(textTimeArrived.Text!=""){ try{ dateTimeArrived=AptCur.AptDateTime.Date+DateTime.Parse(textTimeArrived.Text).TimeOfDay; } catch{ MsgBox.Show(this,"Time Arrived invalid."); return false; } } DateTime dateTimeSeated=AptCur.AptDateTime.Date; if(textTimeSeated.Text!=""){ try{ dateTimeSeated=AptCur.AptDateTime.Date+DateTime.Parse(textTimeSeated.Text).TimeOfDay; } catch{ MsgBox.Show(this,"Time Seated invalid."); return false; } } DateTime dateTimeDismissed=AptCur.AptDateTime.Date; if(textTimeDismissed.Text!=""){ try{ dateTimeDismissed=AptCur.AptDateTime.Date+DateTime.Parse(textTimeDismissed.Text).TimeOfDay; } catch{ MsgBox.Show(this,"Time Arrived invalid."); return false; } } //This change was just slightly too risky to make to 6.9, so 7.0 only if(AptCur.AptStatus!=ApptStatus.Complete//was not originally complete && AptCur.AptStatus!=ApptStatus.PtNote && AptCur.AptStatus!=ApptStatus.PtNoteCompleted && comboStatus.SelectedIndex==1 //making it complete && AptCur.AptDateTime.Date > DateTime.Today)//and future appt { MsgBox.Show(this,"Not allowed to set complete future appointments."); return false; } string aptPattern=Appointments.ConvertPatternTo5(strBTime.ToString()); //Only run appt overlap check if editing an appt from the chart module and eCW program link not enabled. if(IsInChartModule && !Programs.UsingEcwTightOrFullMode()) { List<Appointment> apptList=Appointments.GetForPeriodList(AptCur.AptDateTime,AptCur.AptDateTime); if(DoesOverlap(aptPattern,apptList)) { MsgBox.Show(this,"Appointment is too long and would overlap another appointment. Automatically shortened to fit."); do { aptPattern=aptPattern.Substring(0,aptPattern.Length-1); if(aptPattern.Length==1) { break; } } while(DoesOverlap(aptPattern,apptList)); } } if(AptCur.AptStatus == ApptStatus.Planned) { ; } else if(comboStatus.SelectedIndex==-1) { AptCur.AptStatus=ApptStatus.Scheduled; } else if (AptCur.AptStatus == ApptStatus.PtNote | AptCur.AptStatus == ApptStatus.PtNoteCompleted){ AptCur.AptStatus = (ApptStatus)comboStatus.SelectedIndex + 7; } else { AptCur.AptStatus=(ApptStatus)comboStatus.SelectedIndex+1; } //set procs complete was moved further down //convert from current increment into 5 minute increment //MessageBox.Show(strBTime.ToString()); AptCur.Pattern=aptPattern; if(comboUnschedStatus.SelectedIndex==0){//none AptCur.UnschedStatus=0; } else{ AptCur.UnschedStatus=DefC.Short[(int)DefCat.RecallUnschedStatus][comboUnschedStatus.SelectedIndex-1].DefNum; } if(comboConfirmed.SelectedIndex!=-1){ AptCur.Confirmed=DefC.Short[(int)DefCat.ApptConfirmed][comboConfirmed.SelectedIndex].DefNum; } AptCur.TimeLocked=checkTimeLocked.Checked; AptCur.ColorOverride=butColor.BackColor; AptCur.Note=textNote.Text; if(comboClinic.SelectedIndex==0) {//none AptCur.ClinicNum=0; } else { AptCur.ClinicNum=Clinics.List[comboClinic.SelectedIndex-1].ClinicNum; } //there should always be a non-hidden primary provider for an appt. if(comboProvNum.SelectedIndex==-1) { AptCur.ProvNum=ProviderC.ListShort[0].ProvNum; } else { AptCur.ProvNum=ProviderC.ListShort[comboProvNum.SelectedIndex].ProvNum; } if(comboProvHyg.SelectedIndex==0) {//none AptCur.ProvHyg=0; } else { AptCur.ProvHyg=ProviderC.ListShort[comboProvHyg.SelectedIndex-1].ProvNum; } AptCur.IsHygiene=checkIsHygiene.Checked; if(comboAssistant.SelectedIndex==0) {//none AptCur.Assistant=0; } else { AptCur.Assistant=Employees.ListShort[comboAssistant.SelectedIndex-1].EmployeeNum; } AptCur.IsNewPatient=checkIsNewPatient.Checked; AptCur.DateTimeAskedToArrive=dateTimeAskedToArrive; AptCur.DateTimeArrived=dateTimeArrived; AptCur.DateTimeSeated=dateTimeSeated; AptCur.DateTimeDismissed=dateTimeDismissed; //AptCur.InsPlan1 and InsPlan2 already handled //The ApptProcDescript region is also in FormProcEdit.SaveAndClose() and FormDatabaseMaintenance.butApptProcs_Click() Make any changes there as well. #region ApptProcDescript AptCur.ProcDescript=""; AptCur.ProcsColored=""; for(int i=0;i<gridProc.SelectedIndices.Length;i++) { string procDescOne=""; string procCode=DS.Tables["Procedure"].Rows[gridProc.SelectedIndices[i]]["ProcCode"].ToString(); if(i>0){ AptCur.ProcDescript+=", "; } switch(DS.Tables["Procedure"].Rows[gridProc.SelectedIndices[i]]["TreatArea"].ToString()) { case "1"://TreatmentArea.Surf: procDescOne+="#"+Tooth.GetToothLabel(DS.Tables["Procedure"].Rows[gridProc.SelectedIndices[i]]["ToothNum"].ToString())+"-" +DS.Tables["Procedure"].Rows[gridProc.SelectedIndices[i]]["Surf"].ToString()+"-";//""#12-MOD-" break; case "2"://TreatmentArea.Tooth: procDescOne+="#"+Tooth.GetToothLabel(DS.Tables["Procedure"].Rows[gridProc.SelectedIndices[i]]["ToothNum"].ToString())+"-";//"#12-" break; default://area 3 or 0 (mouth) break; case "4"://TreatmentArea.Quad: procDescOne+=DS.Tables["Procedure"].Rows[gridProc.SelectedIndices[i]]["Surf"].ToString()+"-";//"UL-" break; case "5"://TreatmentArea.Sextant: procDescOne+="S"+DS.Tables["Procedure"].Rows[gridProc.SelectedIndices[i]]["Surf"].ToString()+"-";//"S2-" break; case "6"://TreatmentArea.Arch: procDescOne+=DS.Tables["Procedure"].Rows[gridProc.SelectedIndices[i]]["Surf"].ToString()+"-";//"U-" break; case "7"://TreatmentArea.ToothRange: //strLine+=table.Rows[j][13].ToString()+" ";//don't show range break; } procDescOne+=DS.Tables["Procedure"].Rows[gridProc.SelectedIndices[i]]["AbbrDesc"].ToString(); AptCur.ProcDescript+=procDescOne; //Color and previous date are determined by ProcApptColor object ProcApptColor pac=ProcApptColors.GetMatch(procCode); System.Drawing.Color pColor=System.Drawing.Color.Black; string prevDateString=""; if(pac!=null){ pColor=pac.ColorText; if(pac.ShowPreviousDate) { prevDateString=Procedures.GetRecentProcDateString(AptCur.PatNum,AptCur.AptDateTime,pac.CodeRange); if(prevDateString!="") { prevDateString=" ("+prevDateString+")"; } } } AptCur.ProcsColored+="<span color=\""+pColor.ToArgb().ToString()+"\">"+procDescOne+prevDateString+"</span>"; } #endregion bool isPlanned=AptCur.AptStatus==ApptStatus.Planned; try { Appointments.Update(AptCur,AptOld); //Appointments.UpdateAttached(AptCur.AptNum,procNums,isPlanned); } catch(ApplicationException ex) { MessageBox.Show(ex.Message); return false; } //if appointment is marked complete and any procedures are not, //then set the remaining procedures complete if(AptCur.AptStatus==ApptStatus.Complete) { bool allProcsComplete=true; for(int i=0;i<gridProc.SelectedIndices.Length;i++){ if(DS.Tables["Procedure"].Rows[gridProc.SelectedIndices[i]]["ProcStatus"].ToString()!="2") {//Complete allProcsComplete=false; break; } } if(!allProcsComplete) { if(!Security.IsAuthorized(Permissions.ProcComplCreate,AptCur.AptDateTime)) { return false; } List <PatPlan> PatPlanList=PatPlans.Refresh(AptCur.PatNum); ProcedureL.SetCompleteInAppt(AptCur,PlanList,PatPlanList,pat.SiteNum,pat.Age,SubList); SecurityLogs.MakeLogEntry(Permissions.ProcComplCreate,pat.PatNum, AptCur.AptDateTime.ToShortDateString()+", "+AptCur.ProcDescript+", Procedures automatically set complete due to appt being set complete",0); } } else{ Procedures.SetProvidersInAppointment(AptCur,Procedures.GetProcsForSingle(AptCur.AptNum,false)); } //Do the appointment "break" automation for appointments that were just broken. if(AptCur.AptStatus==ApptStatus.Broken && AptOld.AptStatus!=ApptStatus.Broken) { SecurityLogs.MakeLogEntry(Permissions.AppointmentMove,pat.PatNum,AptCur.ProcDescript+", "+AptCur.AptDateTime.ToString() +", Broken by changing the Status in the Edit Appointment window.",AptCur.AptNum); if(PrefC.GetBool(PrefName.BrokenApptCommLogNotAdjustment)) { Commlog CommlogCur=new Commlog(); CommlogCur.PatNum=pat.PatNum; CommlogCur.CommDateTime=DateTime.Now; CommlogCur.CommType=Commlogs.GetTypeAuto(CommItemTypeAuto.APPT); CommlogCur.Note=Lan.g(this,"Appt BROKEN for ")+AptCur.ProcDescript+" "+AptCur.AptDateTime.ToString(); CommlogCur.Mode_=CommItemMode.None; CommlogCur.UserNum=Security.CurUser.UserNum; FormCommItem FormCI=new FormCommItem(CommlogCur); FormCI.IsNew=true; FormCI.ShowDialog(); } else { Adjustment AdjustmentCur=new Adjustment(); AdjustmentCur.DateEntry=DateTime.Today; AdjustmentCur.AdjDate=DateTime.Today; AdjustmentCur.ProcDate=DateTime.Today; AdjustmentCur.ProvNum=AptCur.ProvNum; AdjustmentCur.PatNum=pat.PatNum; AdjustmentCur.AdjType=PrefC.GetLong(PrefName.BrokenAppointmentAdjustmentType); AdjustmentCur.ClinicNum=pat.ClinicNum; FormAdjust FormA=new FormAdjust(pat,AdjustmentCur); FormA.IsNew=true; FormA.ShowDialog(); } AutomationL.Trigger(AutomationTrigger.BreakAppointment,null,pat.PatNum); } return true; }
private void OnBreak_Click() { if(!PrefC.GetBool(PrefName.BrokenApptCommLogNotAdjustment) && PrefC.GetLong(PrefName.BrokenAppointmentAdjustmentType)==0) { MsgBox.Show(this,"Broken appointment adjustment type is not setup yet. Please go to Setup | Modules to fix this."); return; } int thisI=GetIndex(ContrApptSingle.SelectedAptNum); if(thisI==-1) {//selected appt is on a different day MsgBox.Show(this,"Please select an appointment first."); return; } Appointment apt = Appointments.GetOneApt(ContrApptSingle.SelectedAptNum); Patient pat=Patients.GetPat(PIn.Long(ContrApptSingle3[thisI].DataRoww["PatNum"].ToString())); if(!Security.IsAuthorized(Permissions.AppointmentEdit)) { return; } if(apt.AptStatus == ApptStatus.PtNote || apt.AptStatus == ApptStatus.PtNoteCompleted) { MsgBox.Show(this,"Only appointments may be broken, not notes."); return; } if(PrefC.GetBool(PrefName.BrokenApptCommLogNotAdjustment)) { if(!MsgBox.Show(this,true,"Break appointment?")) { return; } } Appointments.SetAptStatus(ContrApptSingle.SelectedAptNum,ApptStatus.Broken); SecurityLogs.MakeLogEntry(Permissions.AppointmentMove,pat.PatNum, ContrApptSingle3[thisI].DataRoww["procs"].ToString()+", "+ContrApptSingle3[thisI].DataRoww["AptDateTime"].ToString()+", Broken from the Appts module.", PIn.Long(ContrApptSingle3[thisI].DataRoww["AptNum"].ToString())); long provNum=PIn.Long(ContrApptSingle3[thisI].DataRoww["ProvNum"].ToString());//remember before ModuleSelected ModuleSelected(pat.PatNum); SetInvalid(); if(PrefC.GetBool(PrefName.BrokenApptCommLogNotAdjustment)) { Commlog CommlogCur=new Commlog(); CommlogCur.PatNum=pat.PatNum; CommlogCur.CommDateTime=DateTime.Now; CommlogCur.CommType=Commlogs.GetTypeAuto(CommItemTypeAuto.APPT); CommlogCur.Note=Lan.g(this,"Appt BROKEN for ")+apt.ProcDescript+" "+apt.AptDateTime.ToString(); CommlogCur.Mode_=CommItemMode.None; CommlogCur.UserNum=Security.CurUser.UserNum; FormCommItem FormCI=new FormCommItem(CommlogCur); FormCI.IsNew=true; FormCI.ShowDialog(); } else { Adjustment AdjustmentCur=new Adjustment(); AdjustmentCur.DateEntry=DateTime.Today; AdjustmentCur.AdjDate=DateTime.Today; AdjustmentCur.ProcDate=DateTime.Today; AdjustmentCur.ProvNum=provNum; AdjustmentCur.PatNum=pat.PatNum; AdjustmentCur.AdjType=PrefC.GetLong(PrefName.BrokenAppointmentAdjustmentType); AdjustmentCur.ClinicNum=pat.ClinicNum; FormAdjust FormA=new FormAdjust(pat,AdjustmentCur); FormA.IsNew=true; FormA.ShowDialog(); } AutomationL.Trigger(AutomationTrigger.BreakAppointment,null,pat.PatNum); Recalls.SynchScheduledApptFull(apt.PatNum); }
private void AddFinanceCharge(long PatNum,DateTime date,string APR,double OverallBalance,long PriProv) { InstallmentPlan installPlan=InstallmentPlans.GetOneForFam(PatNum); if(installPlan!=null) {//Patient has an installment plan so use that APR instead. APR=installPlan.APR.ToString(); } Adjustment AdjustmentCur = new Adjustment(); AdjustmentCur.PatNum = PatNum; //AdjustmentCur.DateEntry=PIn.PDate(textDate.Text);//automatically handled AdjustmentCur.AdjDate = date; AdjustmentCur.ProcDate = date; AdjustmentCur.AdjType = PrefC.GetLong(PrefName.FinanceChargeAdjustmentType); AdjustmentCur.AdjNote = "";//"Finance Charge"; AdjustmentCur.AdjAmt = Math.Round(((PIn.Double(APR) * .01d / 12d) * OverallBalance),2); AdjustmentCur.ProvNum = PriProv; Adjustments.Insert(AdjustmentCur); }
private void butAddAdjust_Click(object sender, System.EventArgs e) { if(ProcCur.ProcStatus!=ProcStat.C){ MsgBox.Show(this,"Adjustments may only be added to completed procedures."); return; } Adjustment adj=new Adjustment(); adj.PatNum=PatCur.PatNum; adj.ProvNum=ProcCur.ProvNum; adj.DateEntry=DateTime.Today;//but will get overwritten to server date adj.AdjDate=DateTime.Today; adj.ProcDate=ProcCur.ProcDate; adj.ProcNum=ProcCur.ProcNum; adj.ClinicNum=ProcCur.ClinicNum; FormAdjust FormA=new FormAdjust(PatCur,adj); FormA.IsNew=true; FormA.ShowDialog(); FillAdj(); }
///<summary>Called from butOK_Click and butPin_Click</summary> private bool UpdateToDB(){ DateTime dateTimeAskedToArrive=DateTime.MinValue; if((AptOld.AptStatus==ApptStatus.Complete && comboStatus.SelectedIndex!=1) || (AptOld.AptStatus==ApptStatus.Broken && comboStatus.SelectedIndex!=4)) //Un-completing or un-breaking the appt. We must use selectedindex due to AptCur gets updated later UpdateDB() { //If the insurance plans have changed since this appt was completed, warn the user that the historical data will be neutralized. List<PatPlan> listPatPlans=PatPlans.Refresh(pat.PatNum); InsSub sub1=InsSubs.GetSub(PatPlans.GetInsSubNum(listPatPlans,PatPlans.GetOrdinal(PriSecMed.Primary,listPatPlans,PlanList,SubList)),SubList); InsSub sub2=InsSubs.GetSub(PatPlans.GetInsSubNum(listPatPlans,PatPlans.GetOrdinal(PriSecMed.Secondary,listPatPlans,PlanList,SubList)),SubList); if(sub1.PlanNum!=AptCur.InsPlan1 || sub2.PlanNum!=AptCur.InsPlan2) { if(!MsgBox.Show(this,MsgBoxButtons.OKCancel,"The current insurance plans for this patient are different than the plans associated to this appointment. They will be updated to the patient's current insurance plans. Continue?")) { return false; } //Update the ins plans associated to this appointment so that they're the most accurate at this time. AptCur.InsPlan1=sub1.PlanNum; AptCur.InsPlan2=sub2.PlanNum; } } if(textTimeAskedToArrive.Text!=""){ try{ dateTimeAskedToArrive=AptCur.AptDateTime.Date+DateTime.Parse(textTimeAskedToArrive.Text).TimeOfDay; } catch{ MsgBox.Show(this,"Time Asked To Arrive invalid."); return false; } } DateTime dateTimeArrived=AptCur.AptDateTime.Date; if(textTimeArrived.Text!=""){ try{ dateTimeArrived=AptCur.AptDateTime.Date+DateTime.Parse(textTimeArrived.Text).TimeOfDay; } catch{ MsgBox.Show(this,"Time Arrived invalid."); return false; } } DateTime dateTimeSeated=AptCur.AptDateTime.Date; if(textTimeSeated.Text!=""){ try{ dateTimeSeated=AptCur.AptDateTime.Date+DateTime.Parse(textTimeSeated.Text).TimeOfDay; } catch{ MsgBox.Show(this,"Time Seated invalid."); return false; } } DateTime dateTimeDismissed=AptCur.AptDateTime.Date; if(textTimeDismissed.Text!=""){ try{ dateTimeDismissed=AptCur.AptDateTime.Date+DateTime.Parse(textTimeDismissed.Text).TimeOfDay; } catch{ MsgBox.Show(this,"Time Arrived invalid."); return false; } } //This change was just slightly too risky to make to 6.9, so 7.0 only if(AptCur.AptStatus!=ApptStatus.Complete//was not originally complete && AptCur.AptStatus!=ApptStatus.PtNote && AptCur.AptStatus!=ApptStatus.PtNoteCompleted && comboStatus.SelectedIndex==1 //making it complete && AptCur.AptDateTime.Date > DateTime.Today)//and future appt { MsgBox.Show(this,"Not allowed to set complete future appointments."); return false; } string aptPattern=Appointments.ConvertPatternTo5(strBTime.ToString()); //Only run appt overlap check if editing an appt not in unscheduled list and in chart module and eCW program link not enabled. if((IsInChartModule || IsInViewPatAppts) && !Programs.UsingEcwTightOrFullMode() && AptCur.AptStatus!=ApptStatus.UnschedList) { //==Travis 04/06/2015: This call was added on 04/23/2014 and backported to 14.1. It is not storing the return value and does not look to be // doing anything so it has been commented out. //Appointments.RefreshPeriod(AptCur.AptDateTime,AptCur.AptDateTime); List<Appointment> apptList=Appointments.GetForPeriodList(AptCur.AptDateTime,AptCur.AptDateTime); if(DoesOverlap(aptPattern,apptList)) { MsgBox.Show(this,"Appointment is too long and would overlap another appointment. Automatically shortened to fit."); do { aptPattern=aptPattern.Substring(0,aptPattern.Length-1); if(aptPattern.Length==1) { break; } } while(DoesOverlap(aptPattern,apptList)); } } if(AptCur.AptStatus == ApptStatus.Planned) { ; } else if(comboStatus.SelectedIndex==-1) { AptCur.AptStatus=ApptStatus.Scheduled; } else if (AptCur.AptStatus == ApptStatus.PtNote | AptCur.AptStatus == ApptStatus.PtNoteCompleted){ AptCur.AptStatus = (ApptStatus)comboStatus.SelectedIndex + 7; } else { AptCur.AptStatus=(ApptStatus)comboStatus.SelectedIndex+1; } //set procs complete was moved further down //convert from current increment into 5 minute increment //MessageBox.Show(strBTime.ToString()); AptCur.Pattern=aptPattern; if(comboUnschedStatus.SelectedIndex==0){//none AptCur.UnschedStatus=0; } else{ AptCur.UnschedStatus=DefC.Short[(int)DefCat.RecallUnschedStatus][comboUnschedStatus.SelectedIndex-1].DefNum; } if(comboConfirmed.SelectedIndex!=-1){ AptCur.Confirmed=DefC.Short[(int)DefCat.ApptConfirmed][comboConfirmed.SelectedIndex].DefNum; } AptCur.TimeLocked=checkTimeLocked.Checked; AptCur.ColorOverride=butColor.BackColor; AptCur.Note=textNote.Text; if(comboClinic.SelectedIndex==0) {//none AptCur.ClinicNum=0; } else { AptCur.ClinicNum=Clinics.List[comboClinic.SelectedIndex-1].ClinicNum; } //there should always be a non-hidden primary provider for an appt. if(comboProvNum.SelectedIndex==-1) { AptCur.ProvNum=ProviderC.ListShort[0].ProvNum; } else { AptCur.ProvNum=ProviderC.ListShort[comboProvNum.SelectedIndex].ProvNum; } if(comboProvHyg.SelectedIndex==0) {//none AptCur.ProvHyg=0; } else { AptCur.ProvHyg=ProviderC.ListShort[comboProvHyg.SelectedIndex-1].ProvNum; } AptCur.IsHygiene=checkIsHygiene.Checked; if(comboAssistant.SelectedIndex==0) {//none AptCur.Assistant=0; } else { AptCur.Assistant=Employees.ListShort[comboAssistant.SelectedIndex-1].EmployeeNum; } AptCur.IsNewPatient=checkIsNewPatient.Checked; AptCur.DateTimeAskedToArrive=dateTimeAskedToArrive; AptCur.DateTimeArrived=dateTimeArrived; AptCur.DateTimeSeated=dateTimeSeated; AptCur.DateTimeDismissed=dateTimeDismissed; //AptCur.InsPlan1 and InsPlan2 already handled //The ApptProcDescript region is also in FormProcEdit.SaveAndClose() and FormDatabaseMaintenance.butApptProcs_Click() Make any changes there as well. #region ApptProcDescript AptCur.ProcDescript=""; AptCur.ProcsColored=""; for(int i=0;i<gridProc.SelectedIndices.Length;i++) { string procDescOne=""; string procCode=DS.Tables["Procedure"].Rows[gridProc.SelectedIndices[i]]["ProcCode"].ToString(); if(i>0){ AptCur.ProcDescript+=", "; } switch(DS.Tables["Procedure"].Rows[gridProc.SelectedIndices[i]]["TreatArea"].ToString()) { case "1"://TreatmentArea.Surf: procDescOne+="#"+Tooth.GetToothLabel(DS.Tables["Procedure"].Rows[gridProc.SelectedIndices[i]]["ToothNum"].ToString())+"-" +DS.Tables["Procedure"].Rows[gridProc.SelectedIndices[i]]["Surf"].ToString()+"-";//""#12-MOD-" break; case "2"://TreatmentArea.Tooth: procDescOne+="#"+Tooth.GetToothLabel(DS.Tables["Procedure"].Rows[gridProc.SelectedIndices[i]]["ToothNum"].ToString())+"-";//"#12-" break; default://area 3 or 0 (mouth) break; case "4"://TreatmentArea.Quad: procDescOne+=DS.Tables["Procedure"].Rows[gridProc.SelectedIndices[i]]["Surf"].ToString()+"-";//"UL-" break; case "5"://TreatmentArea.Sextant: procDescOne+="S"+DS.Tables["Procedure"].Rows[gridProc.SelectedIndices[i]]["Surf"].ToString()+"-";//"S2-" break; case "6"://TreatmentArea.Arch: procDescOne+=DS.Tables["Procedure"].Rows[gridProc.SelectedIndices[i]]["Surf"].ToString()+"-";//"U-" break; case "7"://TreatmentArea.ToothRange: //strLine+=table.Rows[j][13].ToString()+" ";//don't show range break; } procDescOne+=DS.Tables["Procedure"].Rows[gridProc.SelectedIndices[i]]["AbbrDesc"].ToString(); AptCur.ProcDescript+=procDescOne; //Color and previous date are determined by ProcApptColor object ProcApptColor pac=ProcApptColors.GetMatch(procCode); System.Drawing.Color pColor=System.Drawing.Color.Black; string prevDateString=""; if(pac!=null){ pColor=pac.ColorText; if(pac.ShowPreviousDate) { prevDateString=Procedures.GetRecentProcDateString(AptCur.PatNum,AptCur.AptDateTime,pac.CodeRange); if(prevDateString!="") { prevDateString=" ("+prevDateString+")"; } } } AptCur.ProcsColored+="<span color=\""+pColor.ToArgb().ToString()+"\">"+procDescOne+prevDateString+"</span>"; } #endregion bool isPlanned=AptCur.AptStatus==ApptStatus.Planned; if(comboApptType.SelectedIndex==0) {//0 index = none. AptCur.AppointmentTypeNum=0; } else { AptCur.AppointmentTypeNum=_listAppointmentType[comboApptType.SelectedIndex-1].AppointmentTypeNum; } try { Appointments.Update(AptCur,AptOld); //Appointments.UpdateAttached(AptCur.AptNum,procNums,isPlanned); } catch(ApplicationException ex) { MessageBox.Show(ex.Message); return false; } //if appointment is marked complete and any procedures are not, //then set the remaining procedures complete if(AptCur.AptStatus==ApptStatus.Complete) { bool allProcsComplete=true; for(int i=0;i<gridProc.SelectedIndices.Length;i++){ if(DS.Tables["Procedure"].Rows[gridProc.SelectedIndices[i]]["ProcStatus"].ToString()!="2") {//Complete allProcsComplete=false; break; } } if(!allProcsComplete) { if(!Security.IsAuthorized(Permissions.ProcComplCreate,AptCur.AptDateTime)) { return false; } List <PatPlan> PatPlanList=PatPlans.Refresh(AptCur.PatNum); ProcedureL.SetCompleteInAppt(AptCur,PlanList,PatPlanList,pat.SiteNum,pat.Age,SubList); SecurityLogs.MakeLogEntry(Permissions.AppointmentEdit,pat.PatNum, AptCur.AptDateTime.ToShortDateString()+", "+AptCur.ProcDescript+", Procedures automatically set complete due to appt being set complete",AptCur.AptNum); } } else{ Procedures.SetProvidersInAppointment(AptCur,Procedures.GetProcsForSingle(AptCur.AptNum,false)); } //Do the appointment "break" automation for appointments that were just broken. if(AptCur.AptStatus==ApptStatus.Broken && AptOld.AptStatus!=ApptStatus.Broken) { SecurityLogs.MakeLogEntry(Permissions.AppointmentMove,pat.PatNum,AptCur.ProcDescript+", "+AptCur.AptDateTime.ToString() +", Broken by changing the Status in the Edit Appointment window.",AptCur.AptNum); //If there is an existing HL7 def enabled, send a SIU message if there is an outbound SIU message defined if(HL7Defs.IsExistingHL7Enabled()) { //S15 - Appt Cancellation event MessageHL7 messageHL7=MessageConstructor.GenerateSIU(pat,fam.GetPatient(pat.Guarantor),EventTypeHL7.S15,AptCur); //Will be null if there is no outbound SIU message defined, so do nothing if(messageHL7!=null) { HL7Msg hl7Msg=new HL7Msg(); hl7Msg.AptNum=AptCur.AptNum; hl7Msg.HL7Status=HL7MessageStatus.OutPending;//it will be marked outSent by the HL7 service. hl7Msg.MsgText=messageHL7.ToString(); hl7Msg.PatNum=pat.PatNum; HL7Msgs.Insert(hl7Msg); #if DEBUG MessageBox.Show(this,messageHL7.ToString()); #endif } } ProcedureCode procCodeBrokenApt=ProcedureCodes.GetProcCode("D9986"); if(procCodeBrokenApt.CodeNum!=0) {//ADA proc code D9986 exists Procedure procedureCur=new Procedure(); procedureCur.PatNum=pat.PatNum; procedureCur.ProvNum=AptCur.ProvNum; procedureCur.ProcFee=0; procedureCur.CodeNum=procCodeBrokenApt.CodeNum; procedureCur.ProcDate=DateTime.Today; procedureCur.DateEntryC=DateTime.Now; procedureCur.ProcStatus=ProcStat.C; procedureCur.ClinicNum=pat.ClinicNum; procedureCur.Note=Lan.g(this,"Appt BROKEN for ")+AptCur.ProcDescript+" "+AptCur.AptDateTime.ToString(); Procedures.Insert(procedureCur); //Now make a claimproc if the patient has insurance. We do this now for consistency because a claimproc could get created in the future. List<InsSub> listInsSubs=InsSubs.RefreshForFam(Patients.GetFamily(pat.PatNum)); List<InsPlan> listInsPlans=InsPlans.RefreshForSubList(listInsSubs); List<PatPlan> listPatPlans=PatPlans.Refresh(pat.PatNum); List<Benefit> listBenefits=Benefits.Refresh(listPatPlans,listInsSubs); List<ClaimProc> listClaimProcsForProc=ClaimProcs.RefreshForProc(procedureCur.ProcNum); Procedures.ComputeEstimates(procedureCur,pat.PatNum,listClaimProcsForProc,false,listInsPlans,listPatPlans,listBenefits,pat.Age,listInsSubs); FormProcEdit FormP=new FormProcEdit(procedureCur,pat,Patients.GetFamily(pat.PatNum)); FormP.IsNew=false; FormP.ShowDialog(); if(PrefC.GetBool(PrefName.BrokenApptCommLogWithProcedure)) { Commlog CommlogCur=new Commlog(); CommlogCur.PatNum=pat.PatNum; CommlogCur.CommDateTime=DateTime.Now; CommlogCur.CommType=Commlogs.GetTypeAuto(CommItemTypeAuto.APPT); CommlogCur.Note=Lan.g(this,"Appt BROKEN for ")+AptCur.ProcDescript+" "+AptCur.AptDateTime.ToString(); CommlogCur.Mode_=CommItemMode.None; CommlogCur.UserNum=Security.CurUser.UserNum; FormCommItem FormCI=new FormCommItem(CommlogCur); FormCI.IsNew=true; FormCI.ShowDialog(); } } else {//No D9986 present if(PrefC.GetBool(PrefName.BrokenApptCommLogNotAdjustment)) { Commlog CommlogCur=new Commlog(); CommlogCur.PatNum=pat.PatNum; CommlogCur.CommDateTime=DateTime.Now; CommlogCur.CommType=Commlogs.GetTypeAuto(CommItemTypeAuto.APPT); CommlogCur.Note=Lan.g(this,"Appt BROKEN for ")+AptCur.ProcDescript+" "+AptCur.AptDateTime.ToString(); CommlogCur.Mode_=CommItemMode.None; CommlogCur.UserNum=Security.CurUser.UserNum; FormCommItem FormCI=new FormCommItem(CommlogCur); FormCI.IsNew=true; FormCI.ShowDialog(); } else { Adjustment AdjustmentCur=new Adjustment(); AdjustmentCur.DateEntry=DateTime.Today; AdjustmentCur.AdjDate=DateTime.Today; AdjustmentCur.ProcDate=DateTime.Today; AdjustmentCur.ProvNum=AptCur.ProvNum; AdjustmentCur.PatNum=pat.PatNum; AdjustmentCur.AdjType=PrefC.GetLong(PrefName.BrokenAppointmentAdjustmentType); AdjustmentCur.ClinicNum=pat.ClinicNum; FormAdjust FormA=new FormAdjust(pat,AdjustmentCur); FormA.IsNew=true; FormA.ShowDialog(); } } AutomationL.Trigger(AutomationTrigger.BreakAppointment,null,pat.PatNum); } return true; }
///<summary>Turns negative adjustments positive.</summary> public AccountEntry(Adjustment adjustment) { Tag=adjustment; Date=adjustment.AdjDate; PriKey=adjustment.AdjNum; AmountOriginal=adjustment.AdjAmt; AmountStart=AmountOriginal; AmountEnd=AmountOriginal; ProvNum=adjustment.ProvNum; ClinicNum=adjustment.ClinicNum; PatNum=adjustment.PatNum; }
private void toolBarButAdj_Click() { Adjustment AdjustmentCur=new Adjustment(); AdjustmentCur.DateEntry=DateTime.Today;//cannot be changed. Handled automatically AdjustmentCur.AdjDate=DateTime.Today; AdjustmentCur.ProcDate=DateTime.Today; AdjustmentCur.ProvNum=PatCur.PriProv; AdjustmentCur.PatNum=PatCur.PatNum; AdjustmentCur.ClinicNum=PatCur.ClinicNum; FormAdjust FormAdjust2=new FormAdjust(PatCur,AdjustmentCur); FormAdjust2.IsNew=true; FormAdjust2.ShowDialog(); //Shared.ComputeBalances(); ModuleSelected(PatCur.PatNum); }
///<summary>Creates a new discount adjustment for the given procedure.</summary> public static void CreateAdjustmentForDiscount(Procedure procedure) { //No need to check RemotingRole; no call to db. Adjustment AdjustmentCur=new Adjustment(); AdjustmentCur.DateEntry=DateTime.Today; AdjustmentCur.AdjDate=DateTime.Today; AdjustmentCur.ProcDate=procedure.ProcDate; AdjustmentCur.ProvNum=procedure.ProvNum; AdjustmentCur.PatNum=procedure.PatNum; AdjustmentCur.AdjType=PrefC.GetLong(PrefName.TreatPlanDiscountAdjustmentType); AdjustmentCur.ClinicNum=procedure.ClinicNum; AdjustmentCur.AdjAmt=-procedure.Discount;//Discount must be negative here. AdjustmentCur.ProcNum=procedure.ProcNum; Adjustments.Insert(AdjustmentCur); }
private void AddFinanceCharge(long PatNum,DateTime date,string APR,double OverallBalance,long PriProv) { Adjustment AdjustmentCur = new Adjustment(); AdjustmentCur.PatNum = PatNum; //AdjustmentCur.DateEntry=PIn.PDate(textDate.Text);//automatically handled AdjustmentCur.AdjDate = date; AdjustmentCur.ProcDate = date; AdjustmentCur.AdjType = PrefC.GetLong(PrefName.FinanceChargeAdjustmentType); AdjustmentCur.AdjNote = "";//"Finance Charge"; AdjustmentCur.AdjAmt = Math.Round(((PIn.Double(APR) * .01d / 12d) * OverallBalance),2); AdjustmentCur.ProvNum = PriProv; Adjustments.Insert(AdjustmentCur); }
private void OnBreak_Click() { if(!PrefC.GetBool(PrefName.BrokenApptCommLogNotAdjustment) && PrefC.GetLong(PrefName.BrokenAppointmentAdjustmentType)==0) { MsgBox.Show(this,"Broken appointment adjustment type is not setup yet. Please go to Setup | Modules to fix this."); return; } int thisI=GetIndex(ContrApptSingle.SelectedAptNum); if(thisI==-1) {//selected appt is on a different day MsgBox.Show(this,"Please select an appointment first."); return; } Appointment apt = Appointments.GetOneApt(ContrApptSingle.SelectedAptNum); Patient pat=Patients.GetPat(PIn.Long(ContrApptSingle3[thisI].DataRoww["PatNum"].ToString())); if(!Security.IsAuthorized(Permissions.AppointmentEdit)) { return; } if(apt.AptStatus == ApptStatus.PtNote || apt.AptStatus == ApptStatus.PtNoteCompleted) { MsgBox.Show(this,"Only appointments may be broken, not notes."); return; } if(PrefC.GetBool(PrefName.BrokenApptCommLogNotAdjustment)) { if(!MsgBox.Show(this,true,"Break appointment?")) { return; } } Appointments.SetAptStatus(ContrApptSingle.SelectedAptNum,ApptStatus.Broken); SecurityLogs.MakeLogEntry(Permissions.AppointmentMove,pat.PatNum, ContrApptSingle3[thisI].DataRoww["procs"].ToString()+", "+ContrApptSingle3[thisI].DataRoww["AptDateTime"].ToString()+", Broken from the Appts module.", PIn.Long(ContrApptSingle3[thisI].DataRoww["AptNum"].ToString())); //If there is an existing HL7 def enabled, send a SIU message if there is an outbound SIU message defined if(HL7Defs.IsExistingHL7Enabled()) { //S15 - Appt Cancellation event MessageHL7 messageHL7=MessageConstructor.GenerateSIU(pat,Patients.GetPat(pat.Guarantor),EventTypeHL7.S15,apt); //Will be null if there is no outbound SIU message defined, so do nothing if(messageHL7!=null) { HL7Msg hl7Msg=new HL7Msg(); hl7Msg.AptNum=apt.AptNum; hl7Msg.HL7Status=HL7MessageStatus.OutPending;//it will be marked outSent by the HL7 service. hl7Msg.MsgText=messageHL7.ToString(); hl7Msg.PatNum=pat.PatNum; HL7Msgs.Insert(hl7Msg); #if DEBUG MessageBox.Show(this,messageHL7.ToString()); #endif } } long provNum=PIn.Long(ContrApptSingle3[thisI].DataRoww["ProvNum"].ToString());//remember before ModuleSelected ProcedureCode procCodeBrokenApt=ProcedureCodes.GetProcCode("D9986"); if(procCodeBrokenApt.CodeNum!=0) {//ADA proc code D9986 exists Procedure procedureCur=new Procedure(); procedureCur.PatNum=pat.PatNum; procedureCur.ProvNum=provNum; procedureCur.ProcFee=0; procedureCur.CodeNum=procCodeBrokenApt.CodeNum; procedureCur.ProcDate=DateTime.Today; procedureCur.DateEntryC=DateTime.Now; procedureCur.ProcStatus=ProcStat.C; procedureCur.ClinicNum=pat.ClinicNum; procedureCur.Note=Lan.g(this,"Appt BROKEN for ")+apt.ProcDescript+" "+apt.AptDateTime.ToString(); Procedures.Insert(procedureCur); //Now make a claimproc if the patient has insurance. We do this now for consistency because a claimproc could get created in the future. List<InsSub> listInsSubs=InsSubs.RefreshForFam(Patients.GetFamily(pat.PatNum)); List<InsPlan> listInsPlans=InsPlans.RefreshForSubList(listInsSubs); List<PatPlan> listPatPlans=PatPlans.Refresh(pat.PatNum); List<Benefit> listBenefits=Benefits.Refresh(listPatPlans,listInsSubs); List<ClaimProc> listClaimProcsForProc=ClaimProcs.RefreshForProc(procedureCur.ProcNum); Procedures.ComputeEstimates(procedureCur,pat.PatNum,listClaimProcsForProc,false,listInsPlans,listPatPlans,listBenefits,pat.Age,listInsSubs); FormProcEdit formP=new FormProcEdit(procedureCur,pat,Patients.GetFamily(pat.PatNum)); formP.IsNew=false; formP.ShowDialog(); if(PrefC.GetBool(PrefName.BrokenApptCommLogWithProcedure)) { Commlog CommlogCur=new Commlog(); CommlogCur.PatNum=pat.PatNum; CommlogCur.CommDateTime=DateTime.Now; CommlogCur.CommType=Commlogs.GetTypeAuto(CommItemTypeAuto.APPT); CommlogCur.Note=Lan.g(this,"Appt BROKEN for ")+apt.ProcDescript+" "+apt.AptDateTime.ToString(); CommlogCur.Mode_=CommItemMode.None; CommlogCur.UserNum=Security.CurUser.UserNum; FormCommItem FormCI=new FormCommItem(CommlogCur); FormCI.IsNew=true; FormCI.ShowDialog(); } } else {//No D9986 present if(PrefC.GetBool(PrefName.BrokenApptCommLogNotAdjustment)) { Commlog CommlogCur=new Commlog(); CommlogCur.PatNum=pat.PatNum; CommlogCur.CommDateTime=DateTime.Now; CommlogCur.CommType=Commlogs.GetTypeAuto(CommItemTypeAuto.APPT); CommlogCur.Note=Lan.g(this,"Appt BROKEN for ")+apt.ProcDescript+" "+apt.AptDateTime.ToString(); CommlogCur.Mode_=CommItemMode.None; CommlogCur.UserNum=Security.CurUser.UserNum; FormCommItem FormCI=new FormCommItem(CommlogCur); FormCI.IsNew=true; FormCI.ShowDialog(); } else { Adjustment AdjustmentCur=new Adjustment(); AdjustmentCur.DateEntry=DateTime.Today; AdjustmentCur.AdjDate=DateTime.Today; AdjustmentCur.ProcDate=DateTime.Today; AdjustmentCur.ProvNum=provNum; AdjustmentCur.PatNum=pat.PatNum; AdjustmentCur.AdjType=PrefC.GetLong(PrefName.BrokenAppointmentAdjustmentType); AdjustmentCur.ClinicNum=pat.ClinicNum; FormAdjust FormA=new FormAdjust(pat,AdjustmentCur); FormA.IsNew=true; FormA.ShowDialog(); } } ModuleSelected(pat.PatNum);//Must be ran after the "D9986" break logic due to the addition of a completed procedure. SetInvalid(); AutomationL.Trigger(AutomationTrigger.BreakAppointment,null,pat.PatNum); Recalls.SynchScheduledApptFull(apt.PatNum); }