示例#1
0
		public void FormEncounters_Load(object sender,EventArgs e) {
			_patCur=Patients.GetPat(_encCur.PatNum);
			this.Text+=" - "+_patCur.GetNameLF();
			textDateEnc.Text=_encCur.DateEncounter.ToShortDateString();
			_provNumSelected=_encCur.ProvNum;
			comboProv.Items.Clear();
			for(int i=0;i<ProviderC.ListShort.Count;i++) {
				comboProv.Items.Add(ProviderC.ListShort[i].GetLongDesc());//Only visible provs added to combobox.
				if(ProviderC.ListShort[i].ProvNum==_encCur.ProvNum) {
					comboProv.SelectedIndex=i;//Sets combo text too.
				}
			}
			if(_provNumSelected==0) {//Is new
				comboProv.SelectedIndex=0;
				_provNumSelected=ProviderC.ListShort[0].ProvNum;
			}
			if(comboProv.SelectedIndex==-1) {//The provider exists but is hidden
				comboProv.Text=Providers.GetLongDesc(_provNumSelected);//Appends "(hidden)" to the end of the long description.
			}
			textNote.Text=_encCur.Note;
			textCodeValue.Text=_encCur.CodeValue;
			textCodeSystem.Text=_encCur.CodeSystem;
			//to get description, first determine which table the code is from.  Encounter is only allowed to be a CDT, CPT, HCPCS, and SNOMEDCT.  Will be null if new encounter.
			switch(_encCur.CodeSystem) {
				case "CDT":
					textCodeDescript.Text=ProcedureCodes.GetProcCode(_encCur.CodeValue).Descript;
					break;
				case "CPT":
					Cpt cptCur=Cpts.GetByCode(_encCur.CodeValue);
					if(cptCur!=null) {
						textCodeDescript.Text=cptCur.Description;
					}
					break;
				case "HCPCS":
					Hcpcs hCur=Hcpcses.GetByCode(_encCur.CodeValue);
					if(hCur!=null) {
						textCodeDescript.Text=hCur.DescriptionShort;
					}
					break;
				case "SNOMEDCT":
					Snomed sCur=Snomeds.GetByCode(_encCur.CodeValue);
					if(sCur!=null) {
						textCodeDescript.Text=sCur.Description;
					}
					break;
				case null:
					textCodeDescript.Text="";
					break;
				default:
					MsgBox.Show(this,"Error: Unknown code system");
					break;
			}
		}
示例#2
0
 public static string GetSubmissionDescription(Patient patCur, BugSubmission sub)
 {
     return("Caller Name and #: " + patCur.GetNameLF() + " (work) " + patCur.WkPhone + "\r\n"
            + "Quick desc: " + sub.ExceptionMessageText + "\r\n"
            + "OD version: " + sub.TryGetPrefValue(PrefName.ProgramVersion, "0.0.0.0") + "\r\n"
            + "Windows version: " + sub.Info.WindowsVersion + "\r\n"
            + "Comps affected: " + sub.Info.CompName + "\r\n"
            + "Database name: " + sub.Info.DatabaseName + "\r\n"
            + "Example PatNum: " + sub.Info.PatientNumCur + "\r\n"
            + "Details: " + "\r\n"
            + "Duplicable?: " + "\r\n"
            + "Steps to duplicate: " + "\r\n"
            + "Exception:  " + sub.ExceptionStackTrace);
 }
示例#3
0
        ///<summary>Gets all voice mails.</summary>
        public static List <VoiceMail> GetAll(bool includeNonDbColumns = true, bool includeDeleted = false)
        {
            if (RemotingClient.RemotingRole == RemotingRole.ClientWeb)
            {
                return(Meth.GetObject <List <VoiceMail> >(MethodBase.GetCurrentMethod(), includeNonDbColumns, includeDeleted));
            }
            string command;

            if (!includeNonDbColumns)
            {
                command = "SELECT * FROM voicemail ";
                if (!includeDeleted)
                {
                    command += "WHERE StatusVM != " + POut.Int((int)VoiceMailStatus.Deleted);
                }
                return(Crud.VoiceMailCrud.SelectMany(command));
            }
            command = @"SELECT voicemail.*,
				COALESCE(userod.UserName,'') UserName,
				COALESCE(patient.LName,'') LName,
				COALESCE(patient.FName,'') FName,
				COALESCE(patient.MiddleI,'') MiddleI,
				COALESCE(patient.Preferred,'') Preferred
				FROM voicemail
				LEFT JOIN userod ON userod.UserNum=voicemail.UserNum
				LEFT JOIN patient ON patient.PatNum=voicemail.PatNum "                ;
            if (!includeDeleted)
            {
                command += "WHERE StatusVM != " + POut.Int((int)VoiceMailStatus.Deleted);
            }
            DataTable        table          = Db.GetTable(command);
            List <VoiceMail> listVoiceMails = Crud.VoiceMailCrud.TableToList(table);

            for (int i = 0; i < table.Rows.Count; i++)
            {
                listVoiceMails[i].UserName = PIn.String(table.Rows[i]["UserName"].ToString());
                Patient patient = new Patient()
                {
                    LName     = PIn.String(table.Rows[i]["LName"].ToString()),
                    FName     = PIn.String(table.Rows[i]["FName"].ToString()),
                    Preferred = PIn.String(table.Rows[i]["Preferred"].ToString()),
                    MiddleI   = PIn.String(table.Rows[i]["MiddleI"].ToString())
                };
                patient.LName = string.IsNullOrEmpty(patient.LName) ? Lans.g("VoiceMails", "(Multiple)") : patient.LName;
                listVoiceMails[i].PatientName = patient.GetNameLF();
            }
            return(listVoiceMails);
        }
示例#4
0
		private void FormScreenPatEdit_Load(object sender,EventArgs e) {
			if(IsNew) {
				ScreenPatCur.SheetNum=PrefC.GetLong(PrefName.PublicHealthScreeningSheet);
			}
			PatCur=Patients.GetPat(ScreenPatCur.PatNum);
			if(PatCur!=null) {
				textPatient.Text=PatCur.GetNameLF();
			}
			if(ScreenGroupCur!=null) {
				textScreenGroup.Text=ScreenGroupCur.Description;
			}
			ExamSheetDefCur=SheetDefs.GetSheetDef(ScreenPatCur.SheetNum);
			if(ExamSheetDefCur!=null) {
				textSheet.Text=ExamSheetDefCur.Description;
			}
		}
示例#5
0
        ///<summary>Updates the claim to the database.</summary>
        public static UpdateData UpdateClaim(Claim ClaimCur, List <ClaimValCodeLog> listClaimValCodes, ClaimCondCodeLog claimCondCodeLog,
                                             List <Procedure> listProcsToUpdatePlaceOfService, Patient pat, bool doMakeSecLog, Permissions permissionToLog)
        {
            if (RemotingClient.RemotingRole == RemotingRole.ClientWeb)
            {
                return(Meth.GetObject <UpdateData>(MethodBase.GetCurrentMethod(), ClaimCur, listClaimValCodes, claimCondCodeLog, listProcsToUpdatePlaceOfService,
                                                   pat, doMakeSecLog, permissionToLog));
            }
            UpdateData data = new UpdateData();

            Claims.Update(ClaimCur);
            if (listClaimValCodes != null)
            {
                ClaimValCodeLogs.UpdateList(listClaimValCodes);
            }
            if (claimCondCodeLog != null)
            {
                if (claimCondCodeLog.IsNew)
                {
                    ClaimCondCodeLogs.Insert(claimCondCodeLog);
                }
                else
                {
                    ClaimCondCodeLogs.Update(claimCondCodeLog);
                }
            }
            foreach (Procedure proc in listProcsToUpdatePlaceOfService)
            {
                Procedure oldProc = proc.Copy();
                proc.PlaceService = ClaimCur.PlaceService;
                Procedures.Update(proc, oldProc);
            }
            if (doMakeSecLog)
            {
                SecurityLogs.MakeLogEntry(permissionToLog, ClaimCur.PatNum,
                                          pat.GetNameLF() + ", Date of service: " + ClaimCur.DateService.ToShortDateString());
            }
            data.ListSendQueueItems = Claims.GetQueueList(ClaimCur.ClaimNum, ClaimCur.ClinicNum, 0);
            return(data);
        }
示例#6
0
 private void listFamily_Click(object sender,EventArgs e)
 {
     //Changes the patient to whoever was clicked in the list
     long oldPatNum=PatCur.PatNum;
     long newPatNum=FamCur.ListPats[listFamily.SelectedIndices[0]].PatNum;
     if(newPatNum==oldPatNum){
         return;
     }
     PatCur=FamCur.GetPatient(newPatNum);
     Text=Lan.g(this,"Appointments for")+" "+PatCur.GetNameLF();
     textApptModNote.Text=PatCur.ApptModNote;
     Filltb();
     CheckStatus();
 }
示例#7
0
 public static DataTable GetPeriodWaitingRoomTable()
 {
     if(RemotingClient.RemotingRole==RemotingRole.ClientWeb) {
         return Meth.GetTable(MethodBase.GetCurrentMethod());
     }
     //DateTime dateStart=PIn.PDate(strDateStart);
     //DateTime dateEnd=PIn.PDate(strDateEnd);
     DataConnection dcon=new DataConnection();
     DataTable table=new DataTable("WaitingRoom");
     DataRow row;
     //columns that start with lowercase are altered for display rather than being raw data.
     table.Columns.Add("patName");
     table.Columns.Add("waitTime");
     string command="SELECT DateTimeArrived,DateTimeSeated,LName,FName,Preferred,"+DbHelper.Now()+" dateTimeNow "
         +"FROM appointment,patient "
         +"WHERE appointment.PatNum=patient.PatNum "
         +"AND "+DbHelper.DateColumn("AptDateTime")+" = "+POut.Date(DateTime.Now)+" "
         +"AND DateTimeArrived > "+POut.Date(DateTime.Now)+" "//midnight earlier today
         +"AND DateTimeArrived < "+DbHelper.Now()+" "
         +"AND "+DbHelper.DateColumn("DateTimeArrived")+"="+DbHelper.DateColumn("AptDateTime")+" ";//prevents people from getting "stuck" in waiting room.
     if(DataConnection.DBtype==DatabaseType.Oracle) {
         command+="AND TO_NUMBER(TO_CHAR(DateTimeSeated,'SSSSS')) = 0 ";
     }
     else{
         command+="AND TIME(DateTimeSeated) = 0 ";
     }
     command+="AND AptStatus IN ("+POut.Int((int)ApptStatus.Complete)+","
                                                              +POut.Int((int)ApptStatus.Scheduled)+","
                                                              +POut.Int((int)ApptStatus.ASAP)+") "//None of the other statuses
         +"ORDER BY AptDateTime";
     DataTable raw=dcon.GetTable(command);
     TimeSpan timeArrived;
     //DateTime timeSeated;
     DateTime waitTime;
     Patient pat;
     DateTime dateTimeNow;
     //int minutes;
     for(int i=0;i<raw.Rows.Count;i++) {
         row=table.NewRow();
         pat=new Patient();
         pat.LName=raw.Rows[i]["LName"].ToString();
         pat.FName=raw.Rows[i]["FName"].ToString();
         pat.Preferred=raw.Rows[i]["Preferred"].ToString();
         row["patName"]=pat.GetNameLF();
         dateTimeNow=PIn.DateT(raw.Rows[i]["dateTimeNow"].ToString());
         timeArrived=(PIn.DateT(raw.Rows[i]["DateTimeArrived"].ToString())).TimeOfDay;
         waitTime=dateTimeNow-timeArrived;
         row["waitTime"]=waitTime.ToString("H:mm:ss");
         //minutes=waitTime.Minutes;
         //if(waitTime.Hours>0){
         //	row["waitTime"]+=waitTime.Hours.ToString()+"h ";
             //minutes-=60*waitTime.Hours;
         //}
         //row["waitTime"]+=waitTime.Minutes.ToString()+"m";
         table.Rows.Add(row);
     }
     return table;
 }
示例#8
0
文件: Patients.cs 项目: nampn/ODental
        ///<summary>This is only used in the Billing dialog</summary>
        public static List<PatAging> GetAgingList(string age,DateTime lastStatement,List<long> billingNums,bool excludeAddr,
			bool excludeNeg,double excludeLessThan,bool excludeInactive,bool includeChanged,bool excludeInsPending,
			bool excludeIfUnsentProcs,bool ignoreInPerson,long clinicNum)
        {
            if(RemotingClient.RemotingRole==RemotingRole.ClientWeb) {
                return Meth.GetObject<List<PatAging>>(MethodBase.GetCurrentMethod(),age,lastStatement,billingNums,excludeAddr,excludeNeg,excludeLessThan,excludeInactive,includeChanged,excludeInsPending,excludeIfUnsentProcs,ignoreInPerson,clinicNum);
            }
            string command="";
            if(includeChanged){
                command+=@"DROP TABLE IF EXISTS templastproc;
                    CREATE TABLE templastproc(
                    Guarantor bigint unsigned NOT NULL,
                    LastProc date NOT NULL,
                    PRIMARY KEY (Guarantor));
                    INSERT INTO templastproc
                    SELECT patient.Guarantor,MAX(ProcDate)
                    FROM procedurelog,patient
                    WHERE patient.PatNum=procedurelog.PatNum
                    AND procedurelog.ProcStatus=2
                    AND procedurelog.ProcFee>0
                    GROUP BY patient.Guarantor;

                    DROP TABLE IF EXISTS templastpay;
                    CREATE TABLE templastpay(
                    Guarantor bigint unsigned NOT NULL,
                    LastPay date NOT NULL,
                    PRIMARY KEY (Guarantor));
                    INSERT INTO templastpay
                    SELECT patient.Guarantor,MAX(DateCP)
                    FROM claimproc,patient
                    WHERE claimproc.PatNum=patient.PatNum
                    AND claimproc.InsPayAmt>0
                    GROUP BY patient.Guarantor;";
            }
            if(excludeInsPending) {
                command+=@"DROP TABLE IF EXISTS tempclaimspending;
                    CREATE TABLE tempclaimspending(
                    Guarantor bigint unsigned NOT NULL,
                    PendingClaimCount int NOT NULL,
                    PRIMARY KEY (Guarantor));
                    INSERT INTO tempclaimspending
                    SELECT patient.Guarantor,COUNT(*)
                    FROM claim,patient
                    WHERE claim.PatNum=patient.PatNum
                    AND (ClaimStatus='U' OR ClaimStatus='H' OR ClaimStatus='W' OR ClaimStatus='S')
                    AND (ClaimType='P' OR ClaimType='S' OR ClaimType='Other')
                    GROUP BY patient.Guarantor;";
            }
            if(excludeIfUnsentProcs) {
                command+=@"DROP TABLE IF EXISTS tempunsentprocs;
                    CREATE TABLE tempunsentprocs(
                    Guarantor bigint unsigned NOT NULL,
                    UnsentProcCount int NOT NULL,
                    PRIMARY KEY (Guarantor));
                    INSERT INTO tempunsentprocs
                    SELECT patient.Guarantor,COUNT(*)
                    FROM patient,procedurecode,procedurelog,claimproc
                    WHERE claimproc.procnum=procedurelog.procnum
                    AND patient.PatNum=procedurelog.PatNum
                    AND procedurelog.CodeNum=procedurecode.CodeNum
                    AND claimproc.NoBillIns=0
                    AND procedurelog.ProcFee>0
                    AND claimproc.Status=6
                    AND procedurelog.procstatus=2
                    GROUP BY patient.Guarantor;";
            }
            command+="SELECT patient.PatNum,Bal_0_30,Bal_31_60,Bal_61_90,BalOver90,BalTotal,BillingType,"
                +"InsEst,LName,FName,MiddleI,PayPlanDue,Preferred, "
                +"IFNULL(MAX(statement.DateSent),'0001-01-01') AS LastStatement ";
            if(includeChanged){
                command+=",IFNULL(templastproc.LastProc,'0001-01-01') AS LastChange,"
                    +"IFNULL(templastpay.LastPay,'0001-01-01') AS LastPayment ";
            }
            if(excludeInsPending){
                command+=",IFNULL(tempclaimspending.PendingClaimCount,'0') AS ClaimCount ";
            }
            if(excludeIfUnsentProcs) {
                command+=",IFNULL(tempunsentprocs.UnsentProcCount,'0') AS unsentProcCount_ ";
            }
            command+=
                "FROM patient "//actually only gets guarantors since others are 0.
                +"LEFT JOIN statement ON patient.PatNum=statement.PatNum ";
            if(ignoreInPerson) {
                command+="AND statement.Mode_ != 1 ";
            }
            if(includeChanged){
                command+="LEFT JOIN templastproc ON patient.PatNum=templastproc.Guarantor "
                    +"LEFT JOIN templastpay ON patient.PatNum=templastpay.Guarantor ";
            }
            if(excludeInsPending){
                command+="LEFT JOIN tempclaimspending ON patient.PatNum=tempclaimspending.Guarantor ";
            }
            if(excludeIfUnsentProcs) {
                command+="LEFT JOIN tempunsentprocs ON patient.PatNum=tempunsentprocs.Guarantor ";
            }
            command+="WHERE ";
            if(excludeInactive){
                command+="(patstatus != '2') AND ";
            }
            if(PrefC.GetBool(PrefName.BalancesDontSubtractIns)) {
                command+="(BalTotal";
            }
            else {
                command+="(BalTotal - InsEst";
            }
            command+=" > '"+POut.Double(excludeLessThan+.005)+"'"//add half a penny for rounding error
                +" OR PayPlanDue > 0";
            if(!excludeNeg){
                if(PrefC.GetBool(PrefName.BalancesDontSubtractIns)) {
                    command+=" OR BalTotal < '-.005')";
                }
                else {
                    command+=" OR BalTotal - InsEst < '-.005')";
                }
            }
            else{
                command+=")";
            }
            switch(age){
                //where is age 0. Is it missing because no restriction
                case "30":
                    command+=" AND (Bal_31_60 > '0' OR Bal_61_90 > '0' OR BalOver90 > '0' OR PayPlanDue > 0)";
                    break;
                case "60":
                    command+=" AND (Bal_61_90 > '0' OR BalOver90 > '0' OR PayPlanDue > 0)";
                    break;
                case "90":
                    command+=" AND (BalOver90 > '0' OR PayPlanDue > 0)";
                    break;
            }
            //if billingNums.Count==0, then we'll include all billing types
            for(int i=0;i<billingNums.Count;i++){
                if(i==0){
                    command+=" AND (billingtype = '";
                }
                else{
                    command+=" OR billingtype = '";
                }
                command+=POut.Long(billingNums[i])+"'";
                    //DefC.Short[(int)DefCat.BillingTypes][billingIndices[i]].DefNum.ToString()+"'";
                if(i==billingNums.Count-1){
                    command+=")";
                }
            }
            if(excludeAddr){
                command+=" AND (zip !='')";
            }
            if(clinicNum>0) {
                command+=" AND patient.ClinicNum="+clinicNum+" ";
            }
            command+=" GROUP BY patient.PatNum,Bal_0_30,Bal_31_60,Bal_61_90,BalOver90,BalTotal,BillingType,"
                +"InsEst,LName,FName,MiddleI,PayPlanDue,Preferred "
                +"HAVING (LastStatement < "+POut.Date(lastStatement.AddDays(1))+" ";//<midnight of lastStatement date
                //+"OR PayPlanDue>0 ";we don't have a great way to trigger due to a payplancharge yet
            if(includeChanged){
                command+=
                     "OR LastChange > LastStatement "//eg '2005-10-25' > '2005-10-24 15:00:00'
                    +"OR LastPayment > LastStatement) ";
            }
            else{
                command+=") ";
            }
            if(excludeInsPending){
                command+="AND ClaimCount=0 ";
            }
            if(excludeIfUnsentProcs) {
                command+="AND unsentProcCount_=0 ";
            }
            command+="ORDER BY LName,FName";
            //Debug.WriteLine(command);
            DataTable table=Db.GetTable(command);
            List<PatAging> agingList=new List<PatAging>();
            PatAging patage;
            Patient pat;
            for(int i=0;i<table.Rows.Count;i++){
                patage=new PatAging();
                patage.PatNum   = PIn.Long   (table.Rows[i]["PatNum"].ToString());
                patage.Bal_0_30 = PIn.Double(table.Rows[i]["Bal_0_30"].ToString());
                patage.Bal_31_60= PIn.Double(table.Rows[i]["Bal_31_60"].ToString());
                patage.Bal_61_90= PIn.Double(table.Rows[i]["Bal_61_90"].ToString());
                patage.BalOver90= PIn.Double(table.Rows[i]["BalOver90"].ToString());
                patage.BalTotal = PIn.Double(table.Rows[i]["BalTotal"].ToString());
                patage.InsEst   = PIn.Double(table.Rows[i]["InsEst"].ToString());
                pat=new Patient();
                pat.LName=PIn.String(table.Rows[i]["LName"].ToString());
                pat.FName=PIn.String(table.Rows[i]["FName"].ToString());
                pat.MiddleI=PIn.String(table.Rows[i]["MiddleI"].ToString());
                pat.Preferred=PIn.String(table.Rows[i]["Preferred"].ToString());
                patage.PatName=pat.GetNameLF();
                patage.AmountDue=patage.BalTotal-patage.InsEst;
                patage.DateLastStatement=PIn.Date(table.Rows[i]["LastStatement"].ToString());
                patage.BillingType=PIn.Long(table.Rows[i]["BillingType"].ToString());
                patage.PayPlanDue =PIn.Double(table.Rows[i]["PayPlanDue"].ToString());
                //if(excludeInsPending && patage.InsEst>0){
                    //don't add
                //}
                //else{
                agingList.Add(patage);
                //}
            }
            //PatAging[] retVal=new PatAging[agingList.Count];
            //for(int i=0;i<retVal.Length;i++){
            //	retVal[i]=agingList[i];
            //}
            if(includeChanged){
                command="DROP TABLE IF EXISTS templastproc";
                Db.NonQ(command);
                command="DROP TABLE IF EXISTS templastpay";
                Db.NonQ(command);
            }
            if(excludeInsPending){
                command="DROP TABLE IF EXISTS tempclaimspending";
                Db.NonQ(command);
            }
            if(excludeIfUnsentProcs){
                command="DROP TABLE IF EXISTS tempunsentprocs";
                Db.NonQ(command);
            }
            return agingList;
        }
示例#9
0
        ///<summary>If not using clinics then supply an empty list of clinicNums.</summary>
        public static DataSet GetPayPlanTable(DateTime dateStart, DateTime dateEnd, List <long> listProvNums, List <long> listClinicNums,
                                              bool hasAllProvs, DisplayPayPlanType displayPayPlanType, bool hideCompletedPlans, bool showFamilyBalance, bool hasDateRange, bool isPayPlanV2)
        {
            if (RemotingClient.RemotingRole == RemotingRole.ClientWeb)
            {
                return(Meth.GetDS(MethodBase.GetCurrentMethod(), dateStart, dateEnd, listProvNums, listClinicNums, hasAllProvs, displayPayPlanType,
                                  hideCompletedPlans, showFamilyBalance, hasDateRange, isPayPlanV2));
            }
            string whereProv = "";

            if (!hasAllProvs)
            {
                whereProv += " AND payplancharge.ProvNum IN(";
                for (int i = 0; i < listProvNums.Count; i++)
                {
                    if (i > 0)
                    {
                        whereProv += ",";
                    }
                    whereProv += POut.Long(listProvNums[i]);
                }
                whereProv += ") ";
            }
            string whereClin         = "";
            bool   hasClinicsEnabled = ReportsComplex.RunFuncOnReportServer(() => Prefs.HasClinicsEnabledNoCache);

            if (hasClinicsEnabled)             //Using clinics
            {
                whereClin += " AND payplancharge.ClinicNum IN(";
                for (int i = 0; i < listClinicNums.Count; i++)
                {
                    if (i > 0)
                    {
                        whereClin += ",";
                    }
                    whereClin += POut.Long(listClinicNums[i]);
                }
                whereClin += ") ";
            }
            DataSet   ds    = new DataSet();
            DataTable table = new DataTable("Clinic");

            table.Columns.Add("provider");
            table.Columns.Add("guarantor");
            table.Columns.Add("ins");
            table.Columns.Add("princ");
            table.Columns.Add("accumInt");
            table.Columns.Add("paid");
            table.Columns.Add("balance");
            table.Columns.Add("due");
            if (isPayPlanV2)
            {
                table.Columns.Add("notDue");
            }
            table.Columns.Add("famBal");
            table.Columns.Add("clinicName");
            DataTable tableTotals = new DataTable("Total");

            tableTotals.Columns.Add("clinicName");
            tableTotals.Columns.Add("princ");
            tableTotals.Columns.Add("accumInt");
            tableTotals.Columns.Add("paid");
            tableTotals.Columns.Add("balance");
            tableTotals.Columns.Add("due");
            if (isPayPlanV2)
            {
                tableTotals.Columns.Add("notDue");
            }
            tableTotals.Columns.Add("famBal");
            DataRow row;
            string  datesql = "CURDATE()";         //This is used to find out how much people owe currently and has nothing to do with the selected range

            if (DataConnection.DBtype == DatabaseType.Oracle)
            {
                datesql = "(SELECT CURRENT_DATE FROM dual)";
            }
            List <long> listHiddenUnearnedDefNums = ReportsComplex.RunFuncOnReportServer(() =>
                                                                                         Defs.GetDefsNoCache(DefCat.PaySplitUnearnedType).FindAll(x => !string.IsNullOrEmpty(x.ItemValue)).Select(x => x.DefNum).ToList()
                                                                                         );
            string command = "SELECT FName,LName,MiddleI,PlanNum,Preferred,PlanNum, "
                             + "COALESCE((SELECT SUM(Principal+Interest) FROM payplancharge WHERE payplancharge.PayPlanNum=payplan.PayPlanNum "
                             + "AND payplancharge.ChargeType=" + POut.Int((int)PayPlanChargeType.Debit) + " "//for v1, debits are the only ChargeType.
                             + "AND ChargeDate <= " + datesql + @"),0) '_accumDue', ";

            command += "COALESCE((SELECT SUM(Interest) FROM payplancharge WHERE payplancharge.PayPlanNum=payplan.PayPlanNum "
                       + "AND payplancharge.ChargeType=" + POut.Int((int)PayPlanChargeType.Debit) + " "    //for v1, debits are the only ChargeType.
                       + "AND ChargeDate <= " + datesql + @"),0) '_accumInt', ";
            command += $@"COALESCE((SELECT SUM(SplitAmt) FROM paysplit WHERE paysplit.PayPlanNum=payplan.PayPlanNum ";
            if (listHiddenUnearnedDefNums.Count > 0)
            {
                command += $"AND paysplit.UnearnedType NOT IN ({string.Join(",",listHiddenUnearnedDefNums)}) ";
            }
            command += @"AND paysplit.PayPlanNum!=0),0) '_paid', 
					COALESCE((SELECT SUM(InsPayAmt) FROM claimproc WHERE claimproc.PayPlanNum=payplan.PayPlanNum 
					AND claimproc.Status IN("
                       + POut.Int((int)ClaimProcStatus.Received) + ","
                       + POut.Int((int)ClaimProcStatus.Supplemental) + ","
                       + POut.Int((int)ClaimProcStatus.CapClaim)
                       + ") AND claimproc.PayPlanNum!=0),0) '_insPaid', ";
            command += "COALESCE(CASE "
                       //When pay plan isn't dynamic, all charges are already created, so we can sum principal from them to get plans total principal.
                       + "WHEN payplan.IsDynamic=0 THEN "
                       + "(SELECT SUM(Principal) FROM payplancharge "
                       //for v1, debits are the only ChargeType.
                       + "WHERE payplancharge.PayPlanNum=payplan.PayPlanNum AND payplancharge.ChargeType=" + POut.Int((int)PayPlanChargeType.Debit) + ") "
                       //When pay plan is dynamic, we will get it from dppprincipal, a table constructed to calculate total principal for dynamic pay plans.
                       + "WHEN payplan.IsDynamic=1 THEN dppprincipal.TotalPrincipal ELSE 0 END,0)'_principal', "
                       + "COALESCE((SELECT SUM(Principal) FROM payplancharge WHERE payplancharge.PayPlanNum=payplan.PayPlanNum "
                       + "AND payplancharge.ChargeType=" + POut.Int((int)PayPlanChargeType.Credit) + "),0) '_credits', "    //for v1, will always be 0.
                       + "COALESCE((SELECT SUM(Principal) FROM payplancharge WHERE payplancharge.PayPlanNum=payplan.PayPlanNum "
                       + "AND payplancharge.ChargeType=" + POut.Int((int)PayPlanChargeType.Credit) + " AND ChargeDate > " + datesql + "),0) '_notDue', "
                       + "patient.PatNum PatNum, "
                       + "payplancharge.ProvNum ProvNum ";
            if (hasClinicsEnabled)
            {
                command += ", payplancharge.ClinicNum ClinicNum ";
            }
            //In order to determine if the patient has completely paid off their payment plan we need to get the total amount of interest as of today.
            //Then, after the query has run, we'll add the interest up until today with the total principal for the entire payment plan.
            //For this reason, we cannot use _accumDue which only gets the principle up until today and not the entire payment plan principle.
            command += ",COALESCE((SELECT SUM(Interest) FROM payplancharge WHERE payplancharge.PayPlanNum=payplan.PayPlanNum "
                       + "AND payplancharge.ChargeType=" + POut.Int((int)PayPlanChargeType.Debit) + " "            //for v1, debits are the only ChargeType.
                       + "AND ChargeDate <= " + datesql + @"),0) '_interest' "
                       + "FROM payplan "
                       + "LEFT JOIN patient ON patient.PatNum=payplan.Guarantor "
                       + "LEFT JOIN payplancharge ON payplan.PayPlanNum=payplancharge.PayPlanNum "
                       + "LEFT JOIN "
                                                                                               //construct dppprincipal (dynamic payment plan principal) table
                       + "(SELECT payplanlink.PayPlanNum,"
                                                                                               //Sum total production linked to dynamic pay plan for all linked adjustments and procedures
                       + "ROUND(SUM(CASE "
                       + "WHEN payplanlink.AmountOverride!=0 THEN payplanlink.AmountOverride " //If override isn't zero, use it in sum
                       + "ELSE (CASE "                                                         //Otherwise, use adjustment amount or total proc fee for linked production
                       + "WHEN payplanlink.LinkType=" + POut.Int((int)PayPlanLinkType.Adjustment) + " THEN adjustment.AdjAmt "
                       + "WHEN payplanlink.LinkType=" + POut.Int((int)PayPlanLinkType.Procedure) + " "
                       + "THEN procedurelog.ProcFee*GREATEST(1,procedurelog.BaseUnits+procedurelog.UnitQty) "
                       + "ELSE 0 END)"
                       //Factor in non-payplan pay splits, adjustments to procedures, and insurance estimates, payments, writeoffs, and estimated writeoffs
                       + "-COALESCE(sumsplit.SumSplit,0)+COALESCE(sumprocadj.SumProcAdj,0)-COALESCE(sumins.SumIns,0) "
                       + "END),2) AS 'TotalPrincipal' "
                       + "FROM payplanlink "
                       + "LEFT JOIN adjustment ON adjustment.AdjNum=payplanlink.FKey AND payplanlink.LinkType=" + POut.Int((int)PayPlanLinkType.Adjustment) + " "
                       + "LEFT JOIN procedurelog ON procedurelog.ProcNum=payplanlink.FKey AND payplanlink.LinkType=" + POut.Int((int)PayPlanLinkType.Procedure) + " "
                       + "LEFT JOIN "                        //Table to sum all paysplits made to linked production outside of pay plan.
                       + "(SELECT paysplit.ProcNum,paysplit.AdjNum,SUM(paysplit.SplitAmt) AS 'SumSplit' "
                       + "FROM paysplit WHERE paysplit.PayPlanNum=0 AND paysplit.PayPlanChargeNum=0 GROUP BY paysplit.ProcNum,paysplit.AdjNum) "
                       + "AS sumsplit ON (payplanlink.FKey=sumsplit.ProcNum AND sumsplit.ProcNum!=0 AND payplanlink.LinkType=" + POut.Int((int)PayPlanLinkType.Procedure) + ") OR "
                       + "(payplanlink.FKey=sumsplit.AdjNum AND sumsplit.AdjNum!=0 AND payplanlink.LinkType=" + POut.Int((int)PayPlanLinkType.Adjustment) + ") "
                       + "LEFT JOIN "                        //Table to sum all adjustments made to linked procedures.
                       + "(SELECT adjustment.ProcNum, SUM(adjustment.AdjAmt) AS 'SumProcAdj' FROM adjustment GROUP BY adjustment.ProcNum) "
                       + "AS sumprocadj ON sumprocadj.ProcNum=procedurelog.ProcNum AND payplanlink.LinkType=" + POut.Int((int)PayPlanLinkType.Procedure) + " "
                       + "LEFT JOIN "                        //Table to sum all ins estimates, ins payments, estimated writeoffs, and writeoffs to linked procedures.
                       + "(SELECT claimproc.ProcNum, SUM(CASE "
                       + "WHEN claimproc.Status IN (" + string.Join(",", ClaimProcs.GetInsPaidStatuses().Select(x => POut.Int((int)x))) + ") "
                       + "THEN claimproc.InsPayAmt+claimproc.WriteOff "
                       + "WHEN claimproc.Status IN (" + string.Join(",", ClaimProcs.GetEstimatedStatuses().Select(x => POut.Int((int)x))) + ") "
                       + "THEN claimproc.InsPayEst+(CASE "
                       + "WHEN claimproc.WriteOffEstOverride!=-1 THEN claimproc.WriteOffEstOverride "
                       + "WHEN claimproc.WriteOffEst!=-1 THEN claimproc.WriteOffEst "
                       + "ELSE 0 END) "
                       + "ELSE 0 END) AS 'SumIns' "
                       + "FROM claimproc GROUP BY claimproc.ProcNum) AS sumins "
                       + "ON procedurelog.ProcNum=sumins.ProcNum AND payplanlink.LinkType=" + POut.Int((int)PayPlanLinkType.Procedure) + " "
                                        //Grouped by PayPlanNum so that we can sum total principal for each dynamic pay plan.
                       + "GROUP BY PayPlanLink.PayPlanNum) AS dppprincipal ON dppprincipal.PayPlanNum=PayPlan.PayPlanNum AND PayPlan.IsDynamic=1 "
                       + "WHERE TRUE "; //Always include true, so that the WHERE clause may always be present.
            if (hasDateRange)
            {
                command += "AND payplan.PayPlanDate >= " + POut.Date(dateStart) + " "
                           + "AND payplan.PayPlanDate <= " + POut.Date(dateEnd) + " ";
            }
            command += whereProv
                       + whereClin;
            if (displayPayPlanType == DisplayPayPlanType.Insurance)
            {
                command += "AND payplan.PlanNum!=0 ";
            }
            else if (displayPayPlanType == DisplayPayPlanType.Patient)
            {
                command += "AND payplan.PlanNum=0 ";
            }
            else if (displayPayPlanType == DisplayPayPlanType.Both)
            {
                //Do not filter the query at all which will show both insurance and patient payment plan types.
            }
            if (hideCompletedPlans)
            {
                command += "AND payplan.IsClosed=0 ";
            }
            command += "GROUP BY FName,LName,MiddleI,Preferred,payplan.PayPlanNum ";
            if (hasClinicsEnabled)
            {
                command += "ORDER BY ClinicNum,LName,FName";
            }
            else
            {
                command += "ORDER BY LName,FName";
            }
            DataTable       raw       = ReportsComplex.RunFuncOnReportServer(() => ReportsComplex.GetTable(command));
            List <Provider> listProvs = ReportsComplex.RunFuncOnReportServer(() => Providers.GetAll());
            //DateTime payplanDate;
            Patient pat;
            double  princ;
            double  paid;
            double  interest;
            double  accumDue;
            double  notDue;
            decimal famBal        = 0;
            double  princTot      = 0;
            double  paidTot       = 0;
            double  interestTot   = 0;
            double  balanceTot    = 0;
            double  accumDueTot   = 0;
            double  notDueTot     = 0;
            decimal famBalTot     = 0;
            string  clinicAbbrOld = "";

            for (int i = 0; i < raw.Rows.Count; i++)
            {
                princ    = PIn.Double(raw.Rows[i]["_principal"].ToString());
                interest = PIn.Double(raw.Rows[i]["_accumInt"].ToString());
                if (raw.Rows[i]["PlanNum"].ToString() == "0")               //pat payplan
                {
                    paid = PIn.Double(raw.Rows[i]["_paid"].ToString());
                }
                else                  //ins payplan
                {
                    paid = PIn.Double(raw.Rows[i]["_insPaid"].ToString());
                }
                accumDue = PIn.Double(raw.Rows[i]["_accumDue"].ToString());
                notDue   = PIn.Double(raw.Rows[i]["_notDue"].ToString());
                row      = table.NewRow();
                //payplanDate=PIn.PDate(raw.Rows[i]["PayPlanDate"].ToString());
                //row["date"]=raw.Rows[i]["PayPlanDate"].ToString();//payplanDate.ToShortDateString();
                pat              = new Patient();
                pat.LName        = raw.Rows[i]["LName"].ToString();
                pat.FName        = raw.Rows[i]["FName"].ToString();
                pat.MiddleI      = raw.Rows[i]["MiddleI"].ToString();
                pat.Preferred    = raw.Rows[i]["Preferred"].ToString();
                row["provider"]  = Providers.GetLName(PIn.Long(raw.Rows[i]["ProvNum"].ToString()), listProvs);
                row["guarantor"] = pat.GetNameLF();
                if (raw.Rows[i]["PlanNum"].ToString() == "0")
                {
                    row["ins"] = "";
                }
                else
                {
                    row["ins"] = "X";
                }
                row["princ"]    = princ.ToString("f");
                row["accumInt"] = interest.ToString("f");
                row["paid"]     = paid.ToString("f");
                row["balance"]  = (princ + interest - paid).ToString("f");
                row["due"]      = (accumDue - paid).ToString("f");
                if (isPayPlanV2)
                {
                    row["notDue"] = ((princ + interest - paid) - (accumDue - paid)).ToString("f");
                }
                if (showFamilyBalance)
                {
                    Family famCur = ReportsComplex.RunFuncOnReportServer(() => Patients.GetFamily(PIn.Long(raw.Rows[i]["PatNum"].ToString())));
                    famBal        = (decimal)famCur.ListPats[0].BalTotal;
                    row["famBal"] = (famBal - (decimal)famCur.ListPats[0].InsEst).ToString("F");
                }
                if (hasClinicsEnabled)                 //Using clinics
                {
                    List <Clinic> listClinics = ReportsComplex.RunFuncOnReportServer(() => Clinics.GetClinicsNoCache());
                    string        clinicAbbr  = Clinics.GetAbbr(PIn.Long(raw.Rows[i]["ClinicNum"].ToString()), listClinics);
                    clinicAbbr = (clinicAbbr == "")?Lans.g("FormRpPayPlans", "Unassigned"):clinicAbbr;
                    if (!String.IsNullOrEmpty(clinicAbbrOld) && clinicAbbr != clinicAbbrOld)                   //Reset all the total values
                    {
                        DataRow rowTot = tableTotals.NewRow();
                        rowTot["clinicName"] = clinicAbbrOld;
                        rowTot["princ"]      = princTot.ToString();
                        rowTot["accumInt"]   = interestTot.ToString();
                        rowTot["paid"]       = paidTot.ToString();
                        rowTot["balance"]    = balanceTot.ToString();
                        rowTot["due"]        = accumDueTot.ToString();
                        if (isPayPlanV2)
                        {
                            rowTot["notDue"] = notDueTot.ToString();
                        }
                        rowTot["famBal"] = famBalTot.ToString();
                        tableTotals.Rows.Add(rowTot);
                        princTot    = 0;
                        paidTot     = 0;
                        interestTot = 0;
                        accumDueTot = 0;
                        balanceTot  = 0;
                        notDueTot   = 0;
                        famBalTot   = 0;
                    }
                    row["clinicName"] = clinicAbbr;
                    clinicAbbrOld     = clinicAbbr;
                    princTot         += princ;
                    paidTot          += paid;
                    interestTot      += interest;
                    accumDueTot      += (accumDue - paid);
                    balanceTot       += (princ + interest - paid);
                    notDueTot        += ((princ + interest - paid) - (accumDue - paid));
                    famBalTot        += famBal;
                    if (i == raw.Rows.Count - 1)
                    {
                        DataRow rowTot = tableTotals.NewRow();
                        rowTot["clinicName"] = clinicAbbrOld;
                        rowTot["princ"]      = princTot.ToString();
                        rowTot["accumInt"]   = interestTot.ToString();
                        rowTot["paid"]       = paidTot.ToString();
                        rowTot["balance"]    = balanceTot.ToString();
                        rowTot["due"]        = accumDueTot.ToString();
                        if (isPayPlanV2)
                        {
                            rowTot["notDue"] = notDueTot.ToString();
                        }
                        rowTot["famBal"] = famBalTot.ToString();
                        tableTotals.Rows.Add(rowTot);
                    }
                }
                table.Rows.Add(row);
            }
            ds.Tables.Add(table);
            ds.Tables.Add(tableTotals);
            return(ds);
        }
示例#10
0
        ///<summary>If not using clinics then supply an empty list of clinicNums. dateStart and dateEnd can be MinVal/MaxVal to indicate "forever".</summary>
        public static DataTable GetActivePatientTable(DateTime dateStart, DateTime dateEnd, List <long> listProvNums, List <long> listClinicNums, List <long> listBillingTypes, bool hasAllProvs, bool hasAllClinics, bool hasAllBilling)
        {
            if (RemotingClient.RemotingRole == RemotingRole.ClientWeb)
            {
                return(Meth.GetTable(MethodBase.GetCurrentMethod(), dateStart, dateEnd, listProvNums, listClinicNums, listBillingTypes, hasAllProvs, hasAllClinics, hasAllBilling));
            }
            bool            hasClinicsEnabled = ReportsComplex.RunFuncOnReportServer(() => Prefs.HasClinicsEnabledNoCache);
            List <Provider> listProvs         = ReportsComplex.RunFuncOnReportServer(() => Providers.GetAll());
            List <Def>      listDefs          = ReportsComplex.RunFuncOnReportServer(() => Defs.GetDefsNoCache(DefCat.BillingTypes));
            List <Clinic>   listClinics       = ReportsComplex.RunFuncOnReportServer(() => Clinics.GetClinicsNoCache());
            DataTable       table             = new DataTable();

            table.Columns.Add("name");
            table.Columns.Add("priProv");
            table.Columns.Add("Address");
            table.Columns.Add("Address2");
            table.Columns.Add("City");
            table.Columns.Add("State");
            table.Columns.Add("Zip");
            table.Columns.Add("carrier");
            table.Columns.Add("HmPhone");
            table.Columns.Add("WkPhone");
            table.Columns.Add("WirelessPhone");
            table.Columns.Add("billingType");
            table.Columns.Add("secProv");
            table.Columns.Add("clinic");
            DataRow row;
            string  command = @"
				SELECT patient.PatNum,patient.LName,patient.FName,patient.MiddleI,patient.Preferred,carrier.CarrierName,patient.BillingType,patient.PriProv,patient.SecProv,
							patient.HmPhone,patient.WkPhone,patient.WirelessPhone,patient.Address,patient.Address2,patient.City,patient.State,patient.Zip,patient.ClinicNum,provider.Abbr
				FROM procedurelog 
				INNER JOIN patient ON patient.PatNum=procedurelog.PatNum AND PatStatus="                 + POut.Int((int)PatientStatus.Patient) + @"
				LEFT JOIN patplan ON patplan.PatNum=patient.PatNum AND patplan.Ordinal=1
				LEFT JOIN inssub ON inssub.InsSubNum=patplan.InsSubNum
				LEFT JOIN insplan ON insplan.PlanNum=inssub.PlanNum
				LEFT JOIN carrier ON carrier.CarrierNum=insplan.CarrierNum
				LEFT JOIN provider ON provider.ProvNum=patient.PriProv 
				WHERE procedurelog.ProcStatus="                 + POut.Int((int)ProcStat.C) + @"
					AND procedurelog.ProcDate BETWEEN "                     + POut.DateT(dateStart) + @" AND " + POut.DateT(dateEnd);

            if (!hasAllProvs)
            {
                command += @" AND (patient.PriProv IN(" + String.Join(",", listProvNums) + ") OR patient.SecProv IN(" + String.Join(",", listProvNums) + ")) ";
            }
            if (listClinicNums.Count > 0)
            {
                command += "AND patient.ClinicNum IN(" + String.Join(",", listClinicNums) + ") ";
            }
            command += "AND patient.BillingType IN(" + String.Join(",", listBillingTypes) + ") ";
            if (DataConnection.DBtype == DatabaseType.MySql)
            {
                command += "GROUP BY patient.PatNum";
            }
            else              //Oracle
            {
                command += @"GROUP BY patient.PatNum,patient.LName,patient.FName,patient.MiddleI,patient.Preferred,carrier.CarrierName
					,patient.BillingType,patient.PriProv,patient.SecProv,patient.HmPhone,patient.WkPhone,patient.WirelessPhone
					,patient.Address,patient.Address2,patient.City,patient.State,patient.Zip,patient.ClinicNum"                    ;
            }
            if (!hasClinicsEnabled)
            {
                command += " ORDER BY provider.Abbr,patient.LName,patient.FName";
            }
            else              //Using clinics
            {
                command += " ORDER BY patient.ClinicNum,provider.Abbr,patient.LName,patient.FName";
            }
            DataTable raw = ReportsComplex.RunFuncOnReportServer(() => ReportsComplex.GetTable(command));
            Patient   pat;

            for (int i = 0; i < raw.Rows.Count; i++)
            {
                Def billingType = listDefs.FirstOrDefault(x => x.DefNum == PIn.Long(raw.Rows[i]["BillingType"].ToString()));
                row                  = table.NewRow();
                pat                  = new Patient();
                pat.LName            = raw.Rows[i]["LName"].ToString();
                pat.FName            = raw.Rows[i]["FName"].ToString();
                pat.MiddleI          = raw.Rows[i]["MiddleI"].ToString();
                pat.Preferred        = raw.Rows[i]["Preferred"].ToString();
                row["name"]          = pat.GetNameLF();
                row["priProv"]       = Providers.GetAbbr(PIn.Long(raw.Rows[i]["PriProv"].ToString()));
                row["Address"]       = raw.Rows[i]["Address"].ToString();
                row["Address2"]      = raw.Rows[i]["Address2"].ToString();
                row["City"]          = raw.Rows[i]["City"].ToString();
                row["State"]         = raw.Rows[i]["State"].ToString();
                row["Zip"]           = raw.Rows[i]["Zip"].ToString();
                row["Carrier"]       = raw.Rows[i]["CarrierName"].ToString();
                row["HmPhone"]       = raw.Rows[i]["HmPhone"].ToString();
                row["WkPhone"]       = raw.Rows[i]["WkPhone"].ToString();
                row["WirelessPhone"] = raw.Rows[i]["WirelessPhone"].ToString();
                row["billingType"]   = (billingType == null) ? "" : billingType.ItemValue;
                row["secProv"]       = Providers.GetLName(PIn.Long(raw.Rows[i]["SecProv"].ToString()), listProvs);
                if (hasClinicsEnabled)                 //Using clinics
                {
                    string clinicDesc = Clinics.GetDesc(PIn.Long(raw.Rows[i]["ClinicNum"].ToString()), listClinics);
                    row["clinic"] = (clinicDesc == "")?Lans.g("FormRpPayPlans", "Unassigned"):clinicDesc;
                }
                table.Rows.Add(row);
            }
            return(table);
        }
示例#11
0
 private void FormPopupEdit_Load(object sender,EventArgs e)
 {
     Pat=Patients.GetPat(PopupCur.PatNum);
     textPatient.Text=Pat.GetNameLF();
     comboPopupLevel.Items.Add(Lan.g("enumEnumPopupFamily",Enum.GetNames(typeof(EnumPopupLevel))[0]));//Patient
     comboPopupLevel.Items.Add(Lan.g("enumEnumPopupFamily",Enum.GetNames(typeof(EnumPopupLevel))[1]));//Family
     if(Pat.SuperFamily!=0) {
         comboPopupLevel.Items.Add(Lan.g("enumEnumPopupFamily",Enum.GetNames(typeof(EnumPopupLevel))[2]));//SuperFamily
     }
     comboPopupLevel.SelectedIndex=(int)PopupCur.PopupLevel;
     checkIsDisabled.Checked=PopupCur.IsDisabled;
     textDescription.Text=PopupCur.Description;
 }
示例#12
0
 //private void butAddPt_Click(object sender, System.EventArgs e) {
 private void ToolButAdd_Click()
 {
     Patient tempPat=new Patient();
     tempPat.LName      =PatCur.LName;
     tempPat.PatStatus  =PatientStatus.Patient;
     tempPat.Address    =PatCur.Address;
     tempPat.Address2   =PatCur.Address2;
     tempPat.City       =PatCur.City;
     tempPat.State      =PatCur.State;
     tempPat.Zip        =PatCur.Zip;
     tempPat.HmPhone    =PatCur.HmPhone;
     tempPat.Guarantor  =PatCur.Guarantor;
     tempPat.CreditType =PatCur.CreditType;
     tempPat.PriProv    =PatCur.PriProv;
     tempPat.SecProv    =PatCur.SecProv;
     tempPat.FeeSched   =PatCur.FeeSched;
     tempPat.BillingType=PatCur.BillingType;
     tempPat.AddrNote   =PatCur.AddrNote;
     tempPat.ClinicNum  =PatCur.ClinicNum;//this is probably better in case they don't have user.ClinicNums set.
     //tempPat.ClinicNum  =Security.CurUser.ClinicNum;
     if(Patients.GetPat(tempPat.Guarantor).SuperFamily!=0) {
         tempPat.SuperFamily=PatCur.SuperFamily;
     }
     Patients.Insert(tempPat,false);
     FormPatientEdit FormPE=new FormPatientEdit(tempPat,FamCur);
     FormPE.IsNew=true;
     FormPE.ShowDialog();
     if(FormPE.DialogResult==DialogResult.OK){
         OnPatientSelected(tempPat.PatNum,tempPat.GetNameLF(),tempPat.Email!="",tempPat.ChartNumber);
         ModuleSelected(tempPat.PatNum);
     }
     else{
         ModuleSelected(PatCur.PatNum);
     }
 }
示例#13
0
		public static DataTable GetTableMu2(EhrMeasureType mtype,DateTime dateStart,DateTime dateEnd,long provNum) {
			if(RemotingClient.RemotingRole==RemotingRole.ClientWeb) {
				return Meth.GetTable(MethodBase.GetCurrentMethod(),mtype,dateStart,dateEnd,provNum);
			}
			string command="";
			DataTable tableRaw=new DataTable();
			command="SELECT GROUP_CONCAT(provider.ProvNum) FROM provider WHERE provider.EhrKey="
				+"(SELECT pv.EhrKey FROM provider pv WHERE pv.ProvNum="+POut.Long(provNum)+")";
			string provs=Db.GetScalar(command);
			string[] tempProv=provs.Split(',');
			string provOID="";
			for(int oi=0;oi<tempProv.Length;oi++) {
				provOID=provOID+tempProv[oi];
				if(oi<tempProv.Length-1) {
					provOID+=",";
				}
			}	
			command="SELECT GROUP_CONCAT(provider.NationalProvID) FROM provider WHERE provider.EhrKey="
				+"(SELECT pv.EhrKey FROM provider pv WHERE pv.ProvNum="+POut.Long(provNum)+")";
			string provNPIs=Db.GetScalar(command);
			//Some measures use a temp table.  Create a random number to tack onto the end of the temp table name to avoid possible table collisions.
			Random rnd=new Random();
			string rndStr=rnd.Next(1000000).ToString();
			switch(mtype) {
				#region CPOE_MedOrdersOnly
				case EhrMeasureType.CPOE_MedOrdersOnly:
					command="SELECT patient.LName, patient.FName, medPat.* "
						+"FROM medicationpat as medPat "
						+"INNER JOIN patient ON patient.PatNum=medPat.PatNum "
						+"LEFT JOIN ehrmeasureevent as eme ON medPat.MedicationPatNum=eme.FKey "
						+"AND eme.EventType="+POut.Int((int)EhrMeasureEventType.CPOE_MedOrdered)+" "
						+"WHERE medPat.ProvNum IN("+POut.String(provs)+") "
						+"AND medPat.DateStart BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd);
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region CPOE_LabOrdersOnly
				case EhrMeasureType.CPOE_LabOrdersOnly:
					command="SELECT patient.PatNum,patient.LName,patient.FName,ehrlab.IsCpoe,STR_TO_DATE(ehrlab.ObservationDateTimeStart,'%Y%m%d') AS ObservationDateTimeStart "
						+"FROM ehrlab "
						+"INNER JOIN patient ON ehrlab.PatNum=patient.PatNum "
						+"WHERE (CASE WHEN ehrlab.OrderingProviderIdentifierTypeCode='NPI' THEN ehrlab.OrderingProviderID IN("+POut.String(provNPIs)+") " //When the lab is using a NPI number to determine provider.
							+"WHEN ehrlab.OrderingProviderIdentifierTypeCode='PRN' THEN ( " //When the lab is using provider number to determine provider.
								+"CASE WHEN ehrlab.OrderingProviderAssigningAuthorityUniversalID=( " //If the AssigningAuthority is OpenDental.
									+"SELECT IDRoot FROM oidinternal WHERE IDType='Provider' GROUP BY IDType "
								+") THEN ehrlab.OrderingProviderID IN('"+POut.String(provOID)+"') END) " //Use the ProvNum to determine provider.
							+"ELSE FALSE END) " //If the AssigningAuthority is not OpenDental, we have no way to tell who the provider is.
						+"AND ehrlab.ObservationDateTimeStart BETWEEN DATE_FORMAT("+POut.Date(dateStart)+",'%Y%m%d') AND DATE_FORMAT("+POut.Date(dateEnd)+",'%Y%m%d') "
						+"AND (CASE WHEN ehrlab.UsiCodeSystemName='LN' THEN ehrlab.UsiID WHEN ehrlab.UsiCodeSystemNameAlt='LN' THEN ehrlab.UsiIDAlt ELSE '' END) "
							+"NOT IN (SELECT LoincCode FROM loinc WHERE loinc.ClassType LIKE '%rad%')";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region CPOE_RadiologyOrdersOnly
				case EhrMeasureType.CPOE_RadiologyOrdersOnly:
					command="SELECT patient.PatNum,patient.LName,patient.FName,ehrlab.IsCpoe,STR_TO_DATE(ehrlab.ObservationDateTimeStart,'%Y%m%d') AS ObservationDateTimeStart, "
						+"(CASE WHEN ehrlab.UsiCodeSystemName='LN' THEN ehrlab.UsiID WHEN ehrlab.UsiCodeSystemNameAlt='LN' THEN ehrlab.UsiIDAlt ELSE '' END) AS LoincCode "
						+"FROM ehrlab "
						+"INNER JOIN patient ON ehrlab.PatNum=patient.PatNum "
						+"WHERE (CASE WHEN ehrlab.OrderingProviderIdentifierTypeCode='NPI' THEN ehrlab.OrderingProviderID IN("+POut.String(provNPIs)+") " //When the lab is using a NPI number to determine provider.
							+"WHEN ehrlab.OrderingProviderIdentifierTypeCode='PRN' THEN ( " //When the lab is using provider number to determine provider.
								+"CASE WHEN ehrlab.OrderingProviderAssigningAuthorityUniversalID=( " //If the AssigningAuthority is OpenDental.
									+"SELECT IDRoot FROM oidinternal WHERE IDType='Provider' GROUP BY IDType "
								+") THEN ehrlab.OrderingProviderID IN('"+POut.String(provOID)+"') END) " //Use the ProvNum to determine provider.
							+"ELSE FALSE END) " //If the AssigningAuthority is not OpenDental, we have no way to tell who the provider is.
						+"AND ehrlab.ObservationDateTimeStart BETWEEN DATE_FORMAT("+POut.Date(dateStart)+",'%Y%m%d') AND DATE_FORMAT("+POut.Date(dateEnd)+",'%Y%m%d') "
						+"AND (CASE WHEN ehrlab.UsiCodeSystemName='LN' THEN ehrlab.UsiID WHEN ehrlab.UsiCodeSystemNameAlt='LN' THEN ehrlab.UsiIDAlt ELSE '' END) "
							+"IN (SELECT LoincCode FROM loinc WHERE loinc.ClassType LIKE '%rad%')";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region Rx
				case EhrMeasureType.Rx:
					command="SELECT patient.PatNum,LName,FName,SendStatus,RxDate "
						+"FROM rxpat,patient "
						+"WHERE rxpat.PatNum=patient.PatNum "
						+"AND IsControlled = 0 "
						//+"AND rxpat.ProvNum="+POut.Long(provNum)+" "
						+"AND rxpat.ProvNum IN("+POut.String(provs)+")	"
						+"AND RxDate >= "+POut.Date(dateStart)+" "
						+"AND RxDate <= "+POut.Date(dateEnd);
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region Demographics
				case EhrMeasureType.Demographics:
					//command="SELECT patient.PatNum,LName,FName,Birthdate,Gender,Race,Language "
					//	+"FROM patient "
					//	+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
					//	+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
					//	+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
					//	+"GROUP BY patient.PatNum";
					//tableRaw=Db.GetTable(command);
					command="SELECT patient.PatNum,LName,FName,Birthdate,Gender,Language,COALESCE(race.HasRace,0) AS HasRace,COALESCE(ethnicity.HasEthnicity,0) AS HasEthnicity "
						+"FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
						+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
						+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"LEFT JOIN(SELECT PatNum, 1 AS HasRace FROM patientrace "
						+"WHERE patientrace.Race IN( "
						+POut.Int((int)PatRace.AfricanAmerican)+","
						+POut.Int((int)PatRace.AmericanIndian)+","
						+POut.Int((int)PatRace.Asian)+","
						+POut.Int((int)PatRace.DeclinedToSpecifyRace)+","
						+POut.Int((int)PatRace.HawaiiOrPacIsland)+","
						+POut.Int((int)PatRace.Other)+","
						+POut.Int((int)PatRace.White)+" "
						+") GROUP BY PatNum "
						+") AS race ON race.PatNum=patient.PatNum "
						+"LEFT JOIN(SELECT PatNum, 1 AS HasEthnicity FROM patientrace "
						+"WHERE patientrace.Race IN( "
						+POut.Int((int)PatRace.Hispanic)+","
						+POut.Int((int)PatRace.NotHispanic)+","
						+POut.Int((int)PatRace.DeclinedToSpecifyEthnicity)+" "
						+") GROUP BY PatNum "
						+") AS ethnicity ON ethnicity.PatNum=patient.PatNum "
						+"GROUP BY patient.PatNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region VitalSigns
				case EhrMeasureType.VitalSigns:
					command="SELECT A.*,COALESCE(hwCount.Count,0) AS hwCount,"
						+"(CASE WHEN A.Birthdate <= (A.LastVisitInDateRange-INTERVAL 3 YEAR) ";//BP count only if 3 and older at time of last visit in date range
					command+="THEN COALESCE(bpCount.Count,0) ELSE 1 END) AS bpCount "
						+"FROM (SELECT patient.PatNum,LName,FName,Birthdate,MAX(procedurelog.ProcDate) AS LastVisitInDateRange "
						+"FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
						+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
						+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"GROUP BY patient.PatNum) A "
						+"LEFT JOIN (SELECT PatNum,COUNT(*) AS 'Count' FROM vitalsign	WHERE Height>0 AND Weight>0 GROUP BY PatNum) hwCount ON hwCount.PatNum=A.PatNum "
						+"LEFT JOIN (SELECT PatNum,COUNT(*) AS 'Count' FROM vitalsign WHERE BpSystolic>0 AND BpDiastolic>0 GROUP BY PatNum) bpCount ON bpCount.PatNum=A.PatNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region VitalSignsBMIOnly
				case EhrMeasureType.VitalSignsBMIOnly:
					command="SELECT A.*,COALESCE(hwCount.Count,0) AS hwCount "
						+"FROM (SELECT patient.PatNum,LName,FName FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
						+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
						+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"GROUP BY patient.PatNum) A "
						+"LEFT JOIN (SELECT PatNum,COUNT(*) AS 'Count' FROM vitalsign	WHERE Height>0 AND Weight>0 GROUP BY PatNum) hwCount ON hwCount.PatNum=A.PatNum ";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region VitalSignsBPOnly
				case EhrMeasureType.VitalSignsBPOnly:
					command="SELECT patient.PatNum,LName,FName,Birthdate,COUNT(DISTINCT VitalsignNum) AS bpcount "
						+"FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum "
						+"AND procedurelog.ProcStatus=2	AND procedurelog.ProvNum IN("+POut.String(provs)+") "
						+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"LEFT JOIN vitalsign ON vitalsign.PatNum=patient.PatNum AND BpSystolic!=0 AND BpDiastolic!=0 "
						+"GROUP BY patient.PatNum "
						+"HAVING Birthdate<=MAX(ProcDate)-INTERVAL 3 YEAR ";//only include in results if over 3 yrs old at date of last visit
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region Smoking
				case EhrMeasureType.Smoking:
					command="SELECT patient.PatNum,LName,FName,SmokingSnoMed FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
						+"AND procedurelog.ProvNum IN("+POut.String(provs)+") "
						+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"AND patient.Birthdate <= "+POut.Date(DateTime.Today.AddYears(-13))+" "//13 and older
						+"GROUP BY patient.PatNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region ElectronicCopyAccess
				case EhrMeasureType.ElectronicCopyAccess:
					command="SELECT patient.PatNum,patient.LName,patient.FName,OnlineAccess.dateProvided,MIN(procedurelog.ProcDate) as leastRecentDate "
						+"FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
						+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
						+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"LEFT JOIN (SELECT ehrmeasureevent.PatNum, ehrmeasureevent.DateTEvent as dateProvided FROM ehrmeasureevent "
						+"WHERE EventType="+POut.Int((int)EhrMeasureEventType.OnlineAccessProvided)+") "
						+"OnlineAccess ON patient.PatNum=OnlineAccess.PatNum "
						+"GROUP BY patient.PatNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region ElectronicCopy
				case EhrMeasureType.ElectronicCopy:
					command="SELECT patient.PatNum,patient.LName,patient.FName,OnlineAccess.dateRequested,MIN(procedurelog.ProcDate) as leastRecentDate "
						+"FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
						+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
						+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"LEFT JOIN (SELECT ehrmeasureevent.PatNum, MIN(ehrmeasureevent.DateTEvent) as dateRequested FROM ehrmeasureevent "
						+"WHERE EventType="+POut.Int((int)EhrMeasureEventType.ElectronicCopyRequested)+" "
						+"GROUP BY patnum) "
						+"OnlineAccess ON patient.PatNum=OnlineAccess.PatNum "
						+"GROUP BY patient.PatNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region ClinicalSummaries
				case EhrMeasureType.ClinicalSummaries:
					command="SELECT patient.PatNum,LName,FName,MIN(ClinSum.summaryProvided) as summaryProvided,procedurelog.ProcDate as procDate "
						+"FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
						+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
						+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"LEFT JOIN (SELECT ehrmeasureevent.PatNum, ehrmeasureevent.DateTEvent as summaryProvided FROM ehrmeasureevent "
						+"WHERE EventType="+POut.Int((int)EhrMeasureEventType.ClinicalSummaryProvidedToPt)+") "
					  +"ClinSum ON patient.PatNum=ClinSum.PatNum "
						+"GROUP BY procedurelog.ProcNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region Lab
				case EhrMeasureType.Lab:
					command="SELECT 1 AS IsOldLab,patient.PatNum,LName,FName,DateTimeOrder,COALESCE(panels.Count,0) AS ResultCount FROM patient "
						+"INNER JOIN medicalorder ON patient.PatNum=medicalorder.PatNum "
							+"AND MedOrderType="+POut.Int((int)MedicalOrderType.Laboratory)+" "
							+"AND medicalorder.ProvNum IN("+POut.String(provs)+") "
							+"AND DATE(DateTimeOrder) BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"LEFT JOIN (SELECT MedicalOrderNum,COUNT(*) AS 'Count' FROM labpanel GROUP BY MedicalOrderNum "
						+") panels ON panels.MedicalOrderNum=medicalorder.MedicalOrderNum "
						+"UNION ALL "
						+"SELECT 0 AS IsOldLab,patient.PatNum,LName,FName,STR_TO_DATE(ObservationDateTimeStart,'%Y%m%d') AS DateTimeOrder,COALESCE(ehrlabs.Count,0) AS ResultCount FROM patient "
						+"INNER JOIN ehrlab ON patient.PatNum=ehrlab.PatNum "
						+"LEFT JOIN (SELECT EhrLabNum, COUNT(*) AS 'Count' FROM ehrlabresult "
							+"WHERE ehrlabresult.ValueType='NM' OR ehrlabresult.ValueType='SN' "
							+"OR ehrlabresult.ObservationValueCodedElementID IN ("+_snomedLabResult+") "
							+"OR ehrlabresult.ObservationValueCodedElementIDAlt IN ("+_snomedLabResult+") "
							+"GROUP BY EhrLabNum "
						+") ehrlabs ON ehrlab.EhrLabNum=ehrlabs.EhrLabNum "
						+"WHERE (CASE WHEN ehrlab.OrderingProviderIdentifierTypeCode='NPI' THEN ehrlab.OrderingProviderID IN("+POut.String(provNPIs)+") " //When the lab is using a NPI number to determine provider.
							+"WHEN ehrlab.OrderingProviderIdentifierTypeCode='PRN' THEN ( " //When the lab is using provider number to determine provider.
								+"CASE WHEN ehrlab.OrderingProviderAssigningAuthorityUniversalID=( " //If the AssigningAuthority is OpenDental.
									+"SELECT IDRoot FROM oidinternal WHERE IDType='Provider' GROUP BY IDType "
								+") THEN ehrlab.OrderingProviderID IN('"+POut.String(provOID)+"') END) " //Use the ProvNum to determine provider.
							+"ELSE FALSE END) " //If the AssigningAuthority is not OpenDental, we have no way to tell who the provider is.
						+"AND ehrlab.ObservationDateTimeStart BETWEEN DATE_FORMAT("+POut.Date(dateStart)+",'%Y%m%d') AND DATE_FORMAT("+POut.Date(dateEnd)+",'%Y%m%d') "
						+"AND (CASE WHEN ehrlab.UsiCodeSystemName='LN' THEN ehrlab.UsiID WHEN ehrlab.UsiCodeSystemNameAlt='LN' THEN ehrlab.UsiIDAlt ELSE '' END) "
							+"NOT IN (SELECT LoincCode FROM loinc WHERE loinc.ClassType LIKE '%rad%')"; //Not sure if we need this since rad labs shouldnt be set to numeric results
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region Reminders
				case EhrMeasureType.Reminders:
					command="SELECT patient.PatNum,LName,FName,COALESCE(reminderCount.Count,0) AS reminderCount FROM patient "
						+"INNER JOIN(SELECT PatNum FROM ( "
						+"SELECT PatNum, ProcDate FROM procedurelog WHERE ProcStatus=2 "
						+"AND ProcDate>"+POut.Date(dateStart)+"-INTERVAL 2 YEAR "
						+"AND ProcDate<"+POut.Date(dateStart)+" GROUP BY PatNum,ProcDate) uniqueprocdates "
						+"GROUP BY uniqueprocdates.PatNum HAVING COUNT(*)>1) procscomplete ON procscomplete.PatNum=patient.PatNum "
						+"LEFT JOIN (SELECT ehrmeasureevent.PatNum,COUNT(*) AS 'Count' FROM ehrmeasureevent "
						+"WHERE EventType="+POut.Int((int)EhrMeasureEventType.ReminderSent)+" "
						+"AND DATE(ehrmeasureevent.DateTEvent) BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"GROUP BY ehrmeasureevent.PatNum) reminderCount ON reminderCount.PatNum=patient.PatNum "
						+"WHERE patient.Birthdate > '1880-01-01' "//a birthdate is entered
						+"AND patient.PatStatus="+POut.Int((int)PatientStatus.Patient)+" "
						+"AND patient.PriProv IN("+POut.String(provs)+") "
						+"GROUP BY patient.PatNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region Education
				case EhrMeasureType.Education:
					command="SELECT A.*,COALESCE(edCount.Count,0) AS edCount "
						+"FROM (SELECT patient.PatNum,LName,FName	FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
						+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
						+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"GROUP BY patient.PatNum) A "
						+"LEFT JOIN (SELECT PatNum,COUNT(*) AS 'Count' FROM ehrmeasureevent "
						+"WHERE EventType="+POut.Int((int)EhrMeasureEventType.EducationProvided)+" "
						+"GROUP BY PatNum) edCount ON edCount.PatNum=A.PatNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region MedReconcile
				case EhrMeasureType.MedReconcile:
					command="SELECT ptsRefCnt.*,COALESCE(RecCount,0) AS ReconcileCount "
						+"FROM (SELECT ptsSeen.*,COUNT(DISTINCT refattach.RefAttachNum) AS RefCount "
							+"FROM (SELECT patient.PatNum,LName,FName FROM patient "
								+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum "
								+"AND ProcStatus=2 AND ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
								+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
								+"GROUP BY patient.PatNum) ptsSeen "
							+"INNER JOIN refattach ON ptsSeen.PatNum=refattach.PatNum "
							+"AND RefDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
							+"AND IsFrom=1 AND IsTransitionOfCare=1 "
							+"GROUP BY ptsSeen.PatNum) ptsRefCnt "
						+"LEFT JOIN (SELECT ehrmeasureevent.PatNum,COUNT(*) AS RecCount FROM ehrmeasureevent "
							+"WHERE EventType="+POut.Int((int)EhrMeasureEventType.MedicationReconcile)+" "
							+"AND DATE(ehrmeasureevent.DateTEvent) BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
							+"GROUP BY ehrmeasureevent.PatNum) ptsRecCount ON ptsRefCnt.PatNum=ptsRecCount.PatNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region SummaryOfCare
				case EhrMeasureType.SummaryOfCare:
					command="SELECT patient.PatNum,patient.LName,patient.FName,refattach.RefDate, "
						+"referral.FName AS RefFName,referral.LName AS RefLName,SUM(CASE WHEN ISNULL(socevent.FKey) THEN 0 ELSE 1 END) AS SOCSent "
						+"FROM refattach "
						+"INNER JOIN referral ON referral.ReferralNum=refattach.ReferralNum "
						+"INNER JOIN patient ON patient.PatNum=refattach.PatNum "
						+"LEFT JOIN ( "
							+"SELECT ehrmeasureevent.FKey "
							+"FROM ehrmeasureevent "
							+"WHERE EventType="+POut.Int((int)EhrMeasureEventType.SummaryOfCareProvidedToDr)+" "
							+"AND DATE(ehrmeasureevent.DateTEvent) BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+") socevent ON socevent.FKey=refattach.RefAttachNum "
						+"WHERE RefDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"AND IsFrom=0 AND IsTransitionOfCare=1 "
						+"AND refattach.ProvNum IN("+POut.String(provs)+") "
						+"GROUP BY refattach.RefAttachNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region SummaryOfCareElectronic
				case EhrMeasureType.SummaryOfCareElectronic:
					command="SELECT patient.PatNum,patient.LName,patient.FName,refattach.RefDate, "
						+"referral.FName AS RefFName,referral.LName AS RefLName,SUM(CASE WHEN ISNULL(socevent.FKey) THEN 0 ELSE 1 END) AS ElecSOCSent "
						+"FROM refattach "
						+"INNER JOIN referral ON referral.ReferralNum=refattach.ReferralNum "
						+"INNER JOIN patient ON patient.PatNum=refattach.PatNum "
						+"LEFT JOIN ( "
							+"SELECT ehrmeasureevent.FKey "
							+"FROM ehrmeasureevent "
							+"WHERE EventType="+POut.Int((int)EhrMeasureEventType.SummaryOfCareProvidedToDrElectronic)+" "
							+"AND DATE(ehrmeasureevent.DateTEvent) BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+") socevent ON socevent.FKey=refattach.RefAttachNum "
						+"WHERE RefDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"AND IsFrom=0 AND IsTransitionOfCare=1 "
						+"AND refattach.ProvNum IN("+POut.String(provs)+") "
						+"GROUP BY refattach.RefAttachNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region SecureMessaging
				case EhrMeasureType.SecureMessaging:
					command="SELECT A.*,secureMessageRead " 
						+"FROM (SELECT patient.PatNum,LName,FName, procedurelog.ProcDate as procDate "
						+"FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
						+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
						+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" GROUP BY procedurelog.PatNum) A "
						+"LEFT JOIN (SELECT ehrmeasureevent.PatNum, ehrmeasureevent.DateTEvent as secureMessageRead FROM ehrmeasureevent "
						+"WHERE EventType="+POut.Int((int)EhrMeasureEventType.SecureMessageFromPat)+" GROUP BY ehrmeasureevent.PatNum) "
						+"SecureMessage ON a.PatNum=SecureMessage.PatNum "
						+"";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region FamilyHistory
				case EhrMeasureType.FamilyHistory:
					command="SELECT * FROM (SELECT patient.PatNum,LName,FName, procedurelog.ProcDate as procDate "
						+"FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
						+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
						+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"GROUP BY patient.PatNum) AS UniquePatsAndProcs "
						+"LEFT JOIN familyhealth ON UniquePatsAndProcs.PatNum=familyhealth.PatNum "
						+"GROUP BY UniquePatsAndProcs.PatNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region ElectricNote
				case EhrMeasureType.ElectronicNote:
					command="SELECT uniquepatseen.*,notes.NumNotes "
						+"FROM ( "
							+"SELECT patient.PatNum,LName,FName "
							+"FROM patient "
							+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum "
								+"AND procedurelog.ProcStatus=2 "
								+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
								+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
							+"GROUP BY patient.PatNum "
						+") AS uniquepatseen "
						+"LEFT JOIN ( "
							+"SELECT procedurelog.PatNum, SUM((CASE WHEN ISNULL(procnotesigned.ProcNoteNum) THEN 0 ELSE 1 END)) AS NumNotes "
							+"FROM procedurelog "
							+"LEFT JOIN ( "
								+"SELECT procnote.PatNum,procnote.ProcNum, procnote.ProcNoteNum "
								+"FROM procnote "
								+"INNER JOIN ( "
									+"SELECT ProcNum,MAX(EntryDateTime) AS NewestNoteDateTime "
									+"FROM procnote "
									+"GROUP BY ProcNum "
								+") newestnote ON newestnote.ProcNum=procNote.ProcNum AND newestnote.NewestNoteDateTime=procnote.EntryDateTime "
								+"WHERE Signature!='' AND Note!='' "
								+"GROUP BY PatNum,ProcNum,EntryDateTime "
							+") procnotesigned ON procedurelog.PatNum=procnotesigned.PatNum "
							+"WHERE procedurelog.ProcStatus!="+POut.Int((int)ProcStat.D)+" "
							+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
							+"GROUP BY procedurelog.PatNum "
						+") notes ON notes.PatNum=uniquepatseen.PatNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region LabImages
				case EhrMeasureType.LabImages:
					command="SELECT labsTable.PatNum,labsTable.LName,labsTable.FName,labImage.DocNum,STR_TO_DATE(ObservationDateTimeStart,'%Y%m%d') AS ObservationDateTimeStart FROM ( "
							+"SELECT patient.PatNum,patient.LName,patient.FName,ehrlab.ObservationDateTimeStart,ehrlab.EhrLabNum "
							+"FROM ehrlab "						
							+"INNER JOIN patient ON ehrlab.PatNum=Patient.PatNum "
							+"WHERE (CASE WHEN ehrlab.OrderingProviderIdentifierTypeCode='NPI' THEN ehrlab.OrderingProviderID IN("+POut.String(provNPIs)+") " //When the lab is using a NPI number to determine provider.
								+"WHEN ehrlab.OrderingProviderIdentifierTypeCode='PRN' THEN ( " //When the lab is using provider number to determine provider.
								+"CASE WHEN ehrlab.OrderingProviderAssigningAuthorityUniversalID=( " //If the AssigningAuthority is OpenDental.
									+"SELECT IDRoot FROM oidinternal WHERE IDType='Provider' GROUP BY IDType "
								+") THEN ehrlab.OrderingProviderID IN('"+POut.String(provOID)+"') END) " //Use the ProvNum to determine provider.
							+"ELSE FALSE END) " //If the AssigningAuthority is not OpenDental, we have no way to tell who the provider is.
							+"AND ehrlab.ObservationDateTimeStart BETWEEN DATE_FORMAT("+POut.Date(dateStart)+",'%Y%m%d') AND DATE_FORMAT("+POut.Date(dateEnd)+",'%Y%m%d') "
						+") as labsTable "
						+"INNER JOIN (SELECT DISTINCT EhrLabNum,DocNum FROM ehrlabimage) AS labImage ON labsTable.EhrLabNum=labImage.EhrLabNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				//default:
					//throw new ApplicationException("Type not found: "+mtype.ToString());
			}
			//PatNum, PatientName, Explanation, and Met (X).
			DataTable table=new DataTable("audit");
			DataRow row;
			table.Columns.Add("PatNum");
			table.Columns.Add("patientName");
			table.Columns.Add("explanation");
			table.Columns.Add("met");//X or empty
			List<DataRow> rows=new List<DataRow>();
			Patient pat;
			string explanation;
			for(int i=0;i<tableRaw.Rows.Count;i++) {
				row=table.NewRow();
				row["PatNum"]=tableRaw.Rows[i]["PatNum"].ToString();
				pat=new Patient();
				pat.LName=tableRaw.Rows[i]["LName"].ToString();
				pat.FName=tableRaw.Rows[i]["FName"].ToString();
				pat.Preferred="";
				row["patientName"]=pat.GetNameLF();
				row["met"]="";
				explanation="";
				switch(mtype) {
					#region CPOE_MedOrdersOnly
					case EhrMeasureType.CPOE_MedOrdersOnly:
						DateTime medOrderStartDate=PIn.Date(tableRaw.Rows[i]["DateStart"].ToString());
						explanation="Medication order: "+tableRaw.Rows[i]["MedDescript"].ToString()+", start date: "+medOrderStartDate.ToShortDateString()+".";
						if(tableRaw.Rows[i]["IsCpoe"].ToString()=="1") {
							row["met"]="X";
						}
						break;
					#endregion
					#region CPOE_LabOrdersOnly
					case EhrMeasureType.CPOE_LabOrdersOnly:
						DateTime labOrderStartDate=PIn.DateT(tableRaw.Rows[i]["ObservationDateTimeStart"].ToString());
						bool labIsCpoe=PIn.Bool(tableRaw.Rows[i]["IsCpoe"].ToString());
						explanation="Laboratory order: "+labOrderStartDate.ToShortDateString()+" ";
						if(labIsCpoe) {
							row["met"]="X";
							explanation+=" is Cpoe";
						}
						else {
							explanation+=" is not Cpoe";
						}
						break;
					#endregion
					#region CPOE_RadiologyOrdersOnly
					case EhrMeasureType.CPOE_RadiologyOrdersOnly:
						DateTime radOrderStartDate=PIn.DateT(tableRaw.Rows[i]["ObservationDateTimeStart"].ToString());
						bool radIsCpoe=PIn.Bool(tableRaw.Rows[i]["IsCpoe"].ToString());
						explanation="Radiology order: "+radOrderStartDate.ToShortDateString()+" ";
						if(radIsCpoe) {
							row["met"]="X";
							explanation+=" is Cpoe";
						}
						else {
							explanation+=" is not Cpoe";
						}
						break;
					#endregion
					#region Rx
					case EhrMeasureType.Rx:
						RxSendStatus sendStatus=(RxSendStatus)PIn.Int(tableRaw.Rows[i]["SendStatus"].ToString());
						DateTime rxDate=PIn.Date(tableRaw.Rows[i]["rxDate"].ToString());
						if(sendStatus==RxSendStatus.SentElect) {
							explanation=rxDate.ToShortDateString()+" Rx sent electronically.";
							row["met"]="X";
						}
						else {
							explanation=rxDate.ToShortDateString()+" Rx not sent electronically.";
						}
						break;
					#endregion
					#region Demographics
					case EhrMeasureType.Demographics:
						if(PIn.Date(tableRaw.Rows[i]["Birthdate"].ToString()).Year<1880) {
							explanation+="birthdate";//missing
						}
						if(tableRaw.Rows[i]["Language"].ToString()=="") {
							if(explanation!="") {
								explanation+=", ";
							}
							explanation+="language";
						}
						if(PIn.Int(tableRaw.Rows[i]["Gender"].ToString())==(int)PatientGender.Unknown) {
							if(explanation!="") {
								explanation+=", ";
							}
							explanation+="gender";
						}
						//if(PatientRaces.GetForPatient(PIn.Long(row["PatNum"].ToString())).Count==0) {
						//	if(explanation!="") {
						//		explanation+=", ";
						//	}
						//	explanation+="race, ethnicity";
						//}
						if(PIn.Int(tableRaw.Rows[i]["HasRace"].ToString())==0) {
							if(explanation!="") {
								explanation+=", ";
							}
							explanation+="race";
						}
						if(PIn.Int(tableRaw.Rows[i]["HasEthnicity"].ToString())==0) {
							if(explanation!="") {
								explanation+=", ";
							}
							explanation+="ethnicity";
						}
						if(explanation=="") {
							explanation="All demographic elements recorded";
							row["met"]="X";
						}
						else {
							explanation="Missing: "+explanation;
						}
						break;
					#endregion
					#region VitalSigns
					case EhrMeasureType.VitalSigns:
						if(tableRaw.Rows[i]["hwCount"].ToString()=="0") {
							explanation+="height, weight";
						}
						if(tableRaw.Rows[i]["bpCount"].ToString()=="0") {
							if(explanation!="") {
								explanation+=", ";
							}
							explanation+="blood pressure";
						}
						if(explanation=="") {
							explanation="Vital signs entered";
							row["met"]="X";
						}
						else {
							explanation="Missing: "+explanation;
						}
						break;
					#endregion
					#region VitalSignsBMIOnly
					case EhrMeasureType.VitalSignsBMIOnly:
						if(tableRaw.Rows[i]["hwCount"].ToString()=="0") {
							explanation+="height, weight";
						}
						if(explanation=="") {
							explanation="Vital signs entered";
							row["met"]="X";
						}
						else {
							explanation="Missing: "+explanation;
						}
						break;
					#endregion
					#region VitalSignsBPOnly
					case EhrMeasureType.VitalSignsBPOnly:
						if(tableRaw.Rows[i]["bpCount"].ToString()=="0") {
							explanation="Missing: blood pressure";
						}
						else {
							explanation="Vital signs entered";
							row["met"]="X";
						}
						break;
					#endregion
					#region Smoking
					case EhrMeasureType.Smoking:
						string smokeSnoMed=tableRaw.Rows[i]["SmokingSnoMed"].ToString();
						if(smokeSnoMed=="") {//None
							explanation+="Smoking status not entered.";
						}
						else {
							explanation="Smoking status entered.";
							row["met"]="X";
						}
						break;
					#endregion
					#region ElectronicCopyAccess
					case EhrMeasureType.ElectronicCopyAccess:
						DateTime visitDate=PIn.Date(tableRaw.Rows[i]["leastRecentDate"].ToString());
						DateTime deadlineDate=PIn.Date(tableRaw.Rows[i]["leastRecentDate"].ToString());
						DateTime providedDate=PIn.Date(tableRaw.Rows[i]["dateProvided"].ToString());
						deadlineDate=deadlineDate.AddDays(4);
						if(visitDate.DayOfWeek>DayOfWeek.Tuesday) {
							deadlineDate=deadlineDate.AddDays(2);
						}
						if(providedDate<=deadlineDate && providedDate.Year>1880) {
							explanation="Online access provided before "+deadlineDate.ToShortDateString();
							row["met"]="X";
						}
						else {
							explanation=visitDate.ToShortDateString()+" no online access provided";
						}
						break;
					#endregion
					#region ElectronicCopy
					case EhrMeasureType.ElectronicCopy:
						DateTime visitDate2=PIn.Date(tableRaw.Rows[i]["leastRecentDate"].ToString());
						DateTime dateRequested=PIn.Date(tableRaw.Rows[i]["dateRequested"].ToString());
						if(dateRequested<visitDate2) {
							explanation=visitDate2.ToShortDateString()+" no requests after this date.";
						}
						else {
							explanation=visitDate2.ToShortDateString()+" requests after this date";
							row["met"]="X";
						}
						break;
					#endregion
					#region ClinicalSummaries
					case EhrMeasureType.ClinicalSummaries:
						DateTime procDate=PIn.Date(tableRaw.Rows[i]["procDate"].ToString());
						DateTime deadlineDateClinSum=procDate.AddDays(1);
						if(procDate.DayOfWeek==DayOfWeek.Friday) {
							deadlineDateClinSum=deadlineDateClinSum.AddDays(2);
						}
						DateTime summaryProvidedDate=PIn.Date(tableRaw.Rows[i]["summaryProvided"].ToString());
						if(summaryProvidedDate==DateTime.MinValue) {
							explanation=procDate.ToShortDateString()+" no summary provided to patient";
						}
						else if(summaryProvidedDate<=deadlineDateClinSum) {
							explanation=procDate.ToShortDateString()+" summary provided to patient";
							row["met"]="X";
						}
						else {
							explanation=procDate.ToShortDateString()+" summary provided to patient after more than one buisness day";
						}
						break;
					#endregion
					#region Lab
					case EhrMeasureType.Lab:
						int resultCount=PIn.Int(tableRaw.Rows[i]["ResultCount"].ToString());
						bool isOldLab=PIn.Bool(tableRaw.Rows[i]["IsOldLab"].ToString());
						DateTime dateOrder=PIn.Date(tableRaw.Rows[i]["DateTimeOrder"].ToString());
						if(resultCount==0) {
							explanation+=dateOrder.ToShortDateString()+" results not attached.";
							explanation+=isOldLab?" (2011 edition)":"";
						}
						else {
							explanation=dateOrder.ToShortDateString()+" results attached.";
							explanation+=isOldLab?" (2011 edition)":"";
							row["met"]="X";
						}
						break;
					#endregion
					#region Reminders
					case EhrMeasureType.Reminders:
						if(tableRaw.Rows[i]["reminderCount"].ToString()=="0") {
							explanation="No reminders sent";
						}
						else {
							explanation="Reminders sent";
							row["met"]="X";
						}
						break;
					#endregion
					#region Education
					case EhrMeasureType.Education:
						if(tableRaw.Rows[i]["edCount"].ToString()=="0") {
							explanation="No education resources";
						}
						else {
							explanation="Education resources provided";
							row["met"]="X";
						}
						break;
					#endregion
					#region MedReconcile
					case EhrMeasureType.MedReconcile:
						int refCount=PIn.Int(tableRaw.Rows[i]["RefCount"].ToString());//this will always be greater than zero
						int reconcileCount=PIn.Int(tableRaw.Rows[i]["ReconcileCount"].ToString());
						if(reconcileCount<refCount) {
							explanation="Transitions of Care:"+refCount.ToString()+", Reconciles:"+reconcileCount.ToString();
						}
						else {
							explanation="Reconciles performed for each transition of care.";
							row["met"]="X";
						}
						break;
					#endregion
					#region SummaryOfCare
					case EhrMeasureType.SummaryOfCare:
						int socSent=PIn.Int(tableRaw.Rows[i]["SOCSent"].ToString());
						DateTime refDate=PIn.DateT(tableRaw.Rows[i]["RefDate"].ToString());
						string refLName=PIn.String(tableRaw.Rows[i]["RefLName"].ToString());
						string refFName=PIn.String(tableRaw.Rows[i]["RefFName"].ToString());
						if(socSent<1) {
							explanation="Referral on: "+refDate.ToShortDateString()+" to "+refLName+", "+refFName+" not sent summary of care.";
						}
						else {
							explanation="Referral on: "+refDate.ToShortDateString()+" to "+refLName+", "+refFName+" sent summary of care.";
							row["met"]="X";
						}
						break;
					#endregion
					#region SummaryOfCareElectronic
					case EhrMeasureType.SummaryOfCareElectronic:
						int elecSOCSent=PIn.Int(tableRaw.Rows[i]["ElecSOCSent"].ToString());
						DateTime elecRefDate=PIn.DateT(tableRaw.Rows[i]["RefDate"].ToString());
						string elecRefLName=PIn.String(tableRaw.Rows[i]["RefLName"].ToString());
						string elecRefFName=PIn.String(tableRaw.Rows[i]["RefFName"].ToString());
						if(elecSOCSent<1) {
							explanation="Referral on: "+elecRefDate.ToShortDateString()+" to "+elecRefLName+", "+elecRefFName+" not sent electronic summary of care.";
						}
						else {
							explanation="Referral on: "+elecRefDate.ToShortDateString()+" to "+elecRefLName+", "+elecRefFName+" sent electronic summary of care.";
							row["met"]="X";
						}
						break;
					#endregion
					#region SecureMessaging
					case EhrMeasureType.SecureMessaging:
						if(PIn.DateT(tableRaw.Rows[i]["secureMessageRead"].ToString()).Year>1880) {
							row["met"]="X";
						}
						break;
					#endregion
					#region FamilyHistory
					case EhrMeasureType.FamilyHistory:
						if(PIn.Long(tableRaw.Rows[i]["FamilyHealthNum"].ToString())>0) {
							row["met"]="X";
						}
						break;
					#endregion
					#region ElectricNote
					case EhrMeasureType.ElectronicNote:
						if(PIn.Long(tableRaw.Rows[i]["NumNotes"].ToString())>0) {
							row["met"]="X";
						}
						break;
					#endregion
					#region LabImages
					case EhrMeasureType.LabImages:
						DateTime labImageStartDate=PIn.Date(tableRaw.Rows[i]["ObservationDateTimeStart"].ToString());
						long docNum=PIn.Long(tableRaw.Rows[i]["DocNum"].ToString());
						explanation="Laboratory order: "+labImageStartDate.ToShortDateString()+" ";
						if(docNum>0) {
							row["met"]="X";
							explanation+=" image attached.";
						}
						else {
							explanation+=" image not attached.";
						}
						break;
					#endregion
					//default:
						//throw new ApplicationException("Type not found: "+mtype.ToString());
				}
				row["explanation"]=explanation;
				rows.Add(row);
			}
			for(int i=0;i<rows.Count;i++) {
				table.Rows.Add(rows[i]);
			}
			return table;
		}
示例#14
0
 private void butReport_Click(object sender, System.EventArgs e)
 {
     //if(errorProvider1.GetError(textDateFrom) != ""
     //	|| errorProvider1.GetError(textDateTo) != "")
     //{
     //	MsgBox.Show(this,"Please fix data entry errors first.");
     //	return;
     //}
     //DateTime dateFrom=PIn.PDate(textDateFrom.Text);
     //DateTime dateTo=PIn.PDate(textDateTo.Text);
     //if(dateTo < dateFrom)
     //{
     //	MsgBox.Show(this,"To date cannot be before From date.");
     //	return;
     //}
     ReportLikeCrystal report=new ReportLikeCrystal();
     report.ReportName=Lan.g(this,"PaymentPlans");
     report.AddTitle(Lan.g(this,"Payment Plans"));
     report.AddSubTitle(PrefC.GetString(PrefName.PracticeTitle));
     report.AddSubTitle(DateTime.Today.ToShortDateString());
     DataTable table=new DataTable();
     //table.Columns.Add("date");
     table.Columns.Add("guarantor");
     table.Columns.Add("ins");
     table.Columns.Add("princ");
     table.Columns.Add("paid");
     table.Columns.Add("due");
     table.Columns.Add("dueTen");
     DataRow row;
     string datesql="CURDATE()";
     if(DataConnection.DBtype==DatabaseType.Oracle){
         datesql="(SELECT CURRENT_DATE FROM dual)";
     }
     string command=@"SELECT FName,LName,MiddleI,PlanNum,Preferred,
         (SELECT SUM(Principal+Interest) FROM payplancharge WHERE payplancharge.PayPlanNum=payplan.PayPlanNum
         AND ChargeDate <= "+datesql+@") ""_accumDue"",
         (SELECT SUM(Principal+Interest) FROM payplancharge WHERE payplancharge.PayPlanNum=payplan.PayPlanNum
         AND ChargeDate <= "+DbHelper.DateAddDay(datesql,POut.Long(PrefC.GetLong(PrefName.PayPlansBillInAdvanceDays)))+@") ""_dueTen"",
         (SELECT SUM(SplitAmt) FROM paysplit WHERE paysplit.PayPlanNum=payplan.PayPlanNum) ""_paid"",
         (SELECT SUM(Principal) FROM payplancharge WHERE payplancharge.PayPlanNum=payplan.PayPlanNum) ""_principal""
         FROM payplan
         LEFT JOIN patient ON patient.PatNum=payplan.Guarantor "
         //WHERE SUBSTRING(Birthdate,6,5) >= '"+dateFrom.ToString("MM-dd")+"' "
         //+"AND SUBSTRING(Birthdate,6,5) <= '"+dateTo.ToString("MM-dd")+"' "
         +"GROUP BY FName,LName,MiddleI,Preferred,payplan.PayPlanNum ORDER BY LName,FName";
     DataTable raw=Reports.GetTable(command);
     //DateTime payplanDate;
     Patient pat;
     double princ;
     double paid;
     double accumDue;
     double dueTen;
     for(int i=0;i<raw.Rows.Count;i++){
         princ=PIn.Double(raw.Rows[i]["_principal"].ToString());
         paid=PIn.Double(raw.Rows[i]["_paid"].ToString());
         accumDue=PIn.Double(raw.Rows[i]["_accumDue"].ToString());
         dueTen=PIn.Double(raw.Rows[i]["_dueTen"].ToString());
         row=table.NewRow();
         //payplanDate=PIn.PDate(raw.Rows[i]["PayPlanDate"].ToString());
         //row["date"]=raw.Rows[i]["PayPlanDate"].ToString();//payplanDate.ToShortDateString();
         pat=new Patient();
         pat.LName=raw.Rows[i]["LName"].ToString();
         pat.FName=raw.Rows[i]["FName"].ToString();
         pat.MiddleI=raw.Rows[i]["MiddleI"].ToString();
         pat.Preferred=raw.Rows[i]["Preferred"].ToString();
         row["guarantor"]=pat.GetNameLF();
         if(raw.Rows[i]["PlanNum"].ToString()=="0"){
             row["ins"]="";
         }
         else{
             row["ins"]="X";
         }
         row["princ"]=princ.ToString("f");
         row["paid"]=paid.ToString("f");
         row["due"]=(accumDue-paid).ToString("f");
         row["dueTen"]=(dueTen-paid).ToString("f");
         table.Rows.Add(row);
     }
     report.ReportTable=table;
     //report.AddColumn("Date",90,FieldValueType.Date);
     report.AddColumn("Guarantor",160,FieldValueType.String);
     report.AddColumn("Ins",40,FieldValueType.String);
     report.GetLastRO(ReportObjectKind.TextObject).TextAlign=ContentAlignment.MiddleCenter;
     report.GetLastRO(ReportObjectKind.FieldObject).TextAlign=ContentAlignment.MiddleCenter;
     report.AddColumn("Princ",100,FieldValueType.String);
     report.GetLastRO(ReportObjectKind.TextObject).TextAlign=ContentAlignment.MiddleRight;
     report.GetLastRO(ReportObjectKind.FieldObject).TextAlign=ContentAlignment.MiddleRight;
     report.AddColumn("Paid",100,FieldValueType.String);
     report.GetLastRO(ReportObjectKind.TextObject).TextAlign=ContentAlignment.MiddleRight;
     report.GetLastRO(ReportObjectKind.FieldObject).TextAlign=ContentAlignment.MiddleRight;
     report.AddColumn("Due Now",100,FieldValueType.String);
     report.GetLastRO(ReportObjectKind.TextObject).TextAlign=ContentAlignment.MiddleRight;
     report.GetLastRO(ReportObjectKind.FieldObject).TextAlign=ContentAlignment.MiddleRight;
     report.AddColumn("Due in "+PrefC.GetLong(PrefName.PayPlansBillInAdvanceDays).ToString()
         +" Days",100,FieldValueType.String);
     report.GetLastRO(ReportObjectKind.TextObject).TextAlign=ContentAlignment.MiddleRight;
     report.GetLastRO(ReportObjectKind.FieldObject).TextAlign=ContentAlignment.MiddleRight;
     //report.GetLastRO(ReportObjectKind.FieldObject).FormatString="d";
     report.AddPageNum();
     //report.SubmitQuery();
     //report.ReportTable=Patients.GetBirthdayList(dateFrom,dateTo);
     //if(!report.SubmitQuery()){
     //	return;
     //}
     FormReportLikeCrystal FormR=new FormReportLikeCrystal(report);
     FormR.ShowDialog();
     DialogResult=DialogResult.OK;
 }
示例#15
0
 ///<summary>Pat can be null sometimes.  For example, in deposit slip.</summary>
 private static void FillFieldsInStaticText(Sheet sheet,Patient pat)
 {
     string fldval="";
     string address="";
     string apptsAllFuture="";
     string birthdate="";
     string carrierName="";
     string carrierAddress="";
     string carrierCityStZip="";
     string subscriberId="";
     string subscriberNameFL="";
     string insAnnualMax="";
     string insDeductible="";
     string insDeductibleUsed="";
     string insPending="";
     string insPercentages="";
     string insPlanGroupNumber="";
     string insPlanGroupName="";
     string insPlanNote="";
     string insSubNote="";
     string insRemaining="";
     string insUsed="";
     string carrier2Name="";
     string subscriber2NameFL="";
     string ins2AnnualMax="";
     string ins2Deductible="";
     string ins2DeductibleUsed="";
     string ins2Pending="";
     string ins2Percentages="";
     string ins2Remaining="";
     string ins2Used="";
     string clinicDescription="";
     string clinicAddress="";
     string clinicCityStZip="";
     string phone="";
     string clinicPhone="";
     string plannedAppointmentInfo="";
     string dateFirstVisit="";
     string treatmentPlanProcs="";
     string dateOfLastSavedTP="";
     string tpResponsPartyAddress="";
     string tpResponsPartyCityStZip="";
     string tpResponsPartyNameFL="";
     string dateRecallDue="";
     string recallInterval="";
     string nextSchedApptDateT="";
     string dateTimeLastAppt="";
     string nextSchedApptsFam="";
     string serviceNote="";
     string insFreqBW="";
     string insFreqExams="";
     string insFreqPanoFMX="";
     string insType=""; //(ppo, etc)
     string referredFrom=""; //(just one)
     string referredTo=""; //(typically Drs. could be multiline. Include date)
     string dateLastBW="";
     string dateLastExam="";
     string dateLastPanoFMX="";
     string dateLastProphy="";
     string genderHeShe="";
     string genderheshe="";
     string genderHimHer="";
     string genderhimher="";
     string genderHimselfHerself="";
     string genderhimselfherself="";
     string genderHisHer="";
     string genderhisher="";
     string genderHisHers="";
     string genderhishers="";
     string guarantorNameF="";
     string guarantorNameFL="";
     string guarantorNameL="";
     string guarantorNamePref="";
     string guarantorNameLF="";
     Family fam=null;
     Provider priProv=null;
     if(pat!=null) {
         switch(pat.Gender) {
             case PatientGender.Male:
                 genderHeShe="He";
                 genderheshe="he";
                 genderHimHer="Him";
                 genderhimher="him";
                 genderHimselfHerself="Himself";
                 genderhimselfherself="Herself";
                 genderHisHer="His";
                 genderhisher="his";
                 genderHisHers="His";
                 genderhishers="his";
                 break;
             case PatientGender.Female:
                 genderHeShe="She";
                 genderheshe="she";
                 genderHimHer="Her";
                 genderhimher="her";
                 genderHimselfHerself="Herself";
                 genderhimselfherself="herself";
                 genderHisHer="Her";
                 genderhisher="her";
                 genderHisHers="Hers";
                 genderhishers="hers";
                 break;
             case PatientGender.Unknown:
                 genderHeShe="The patient";
                 genderheshe="the patient";
                 genderHimHer="The patient";
                 genderhimher="the patient";
                 genderHimselfHerself="The patient";
                 genderhimselfherself="the patient";
                 genderHisHer="The patient's";
                 genderhisher="the patient's";
                 genderHisHers="The patient's";
                 genderhishers="the patient's";
                 break;
         }
         Patient guar=Patients.GetPat(pat.Guarantor);
         if(guar!=null) {
             guarantorNameF=guar.FName;
             guarantorNameFL=guar.GetNameFL();
             guarantorNameL=guar.LName;
             guarantorNameLF=guar.GetNameLF();
             guarantorNamePref=guar.Preferred;
         }
         address=pat.Address;
         if(pat.Address2!="") {
             address+=", "+pat.Address2;
         }
         birthdate=pat.Birthdate.ToShortDateString();
         if(pat.Birthdate.Year<1880) {
             birthdate="";
         }
         dateFirstVisit=pat.DateFirstVisit.ToShortDateString();
         if(pat.DateFirstVisit.Year<1880) {
             dateFirstVisit="";
         }
         fam=Patients.GetFamily(pat.PatNum);
         List<Procedure> procsList=null;
         if(Sheets.ContainsStaticField(sheet,"treatmentPlanProcs") || Sheets.ContainsStaticField(sheet,"plannedAppointmentInfo")) {
             procsList=Procedures.Refresh(pat.PatNum);
             if(Sheets.ContainsStaticField(sheet,"treatmentPlanProcs")) {
                 for(int i=0;i<procsList.Count;i++) {
                     if(procsList[i].ProcStatus!=ProcStat.TP) {
                         continue;
                     }
                     if(treatmentPlanProcs!="") {
                         treatmentPlanProcs+="\r\n";
                     }
                     treatmentPlanProcs+=ProcedureCodes.GetStringProcCode(procsList[i].CodeNum)+", "
                     +Procedures.GetDescription(procsList[i])+", "
                     +procsList[i].ProcFee.ToString("c");
                 }
             }
         }
         serviceNote=PatientNotes.Refresh(pat.PatNum,pat.Guarantor).Service;
         List<RefAttach> RefAttachList=RefAttaches.Refresh(pat.PatNum);
         Referral tempReferralFrom = Referrals.GetReferralForPat(pat.PatNum);
         if(Referrals.GetReferralForPat(pat.PatNum)!=null) {
             if(tempReferralFrom.IsDoctor) {
                 referredFrom+=tempReferralFrom.FName+" "+tempReferralFrom.LName+" "+tempReferralFrom.Title+" : "+tempReferralFrom.Specialty.ToString();
             }
             else {
                 referredFrom+=tempReferralFrom.FName+" "+tempReferralFrom.LName;
             }
         }
         for(int i=0;i<RefAttachList.Count;i++) {
             if(RefAttachList[i].IsFrom) {
                 continue;
             }
             Referral tempRef = Referrals.GetReferral(RefAttachList[i].ReferralNum);
             if(tempRef.IsDoctor) {
                 referredTo+=tempRef.FName+" "+tempRef.LName+" "+tempRef.Title+" : "+tempRef.Specialty.ToString()+" "+RefAttachList[i].RefDate.ToShortDateString()+"\r\n";
             }
             else {
                 referredTo+=tempRef.FName+" "+tempRef.LName+" "+RefAttachList[i].RefDate.ToShortDateString()+"\r\n";
             }
         }
         //Insurance-------------------------------------------------------------------------------------------------------------------
         List<PatPlan> patPlanList=PatPlans.Refresh(pat.PatNum);
         long subNum=PatPlans.GetInsSubNum(patPlanList,1);
         long patPlanNum=PatPlans.GetPatPlanNum(subNum,patPlanList);
         List<InsSub> subList=InsSubs.RefreshForFam(fam);
         List<InsPlan> planList=InsPlans.RefreshForSubList(subList);
         InsSub sub=InsSubs.GetSub(subNum,subList);
         InsPlan plan=null;
         if(sub!=null) {
             plan=InsPlans.GetPlan(sub.PlanNum,planList);
             insSubNote=sub.SubscNote;
         }
         Carrier carrier=null;
         List<Benefit> benefitList=Benefits.Refresh(patPlanList,subList);
         List<ClaimProcHist> histList=ClaimProcs.GetHistList(pat.PatNum,benefitList,patPlanList,planList,DateTime.Today,subList);
         double doubAnnualMax;
         double doubDeductible;
         double doubDeductibleUsed;
         double doubPending;
         double doubRemain;
         double doubUsed;
         if(plan!=null) {
             insPlanGroupName=plan.GroupName;
             insPlanGroupNumber=plan.GroupNum;
             insPlanNote=plan.PlanNote;
             carrier=Carriers.GetCarrier(plan.CarrierNum);
             carrierName=carrier.CarrierName;
             carrierAddress=carrier.Address;
             if(carrier.Address2!="") {
                 carrierAddress+=", "+carrier.Address2;
             }
             carrierCityStZip=carrier.City+", "+carrier.State+"  "+carrier.Zip;
             subscriberId=sub.SubscriberID;
             subscriberNameFL=Patients.GetLim(sub.Subscriber).GetNameFL();
             doubAnnualMax=Benefits.GetAnnualMaxDisplay(benefitList,plan.PlanNum,patPlanNum,false);
             doubRemain=-1;
             if(doubAnnualMax!=-1) {
                 insAnnualMax=doubAnnualMax.ToString("c");
                 doubRemain=doubAnnualMax;
             }
             doubDeductible=Benefits.GetDeductGeneralDisplay(benefitList,plan.PlanNum,patPlanNum,BenefitCoverageLevel.Individual);
             if(doubDeductible!=-1) {
                 insDeductible=doubDeductible.ToString("c");
             }
             doubDeductibleUsed=InsPlans.GetDedUsedDisplay(histList,DateTime.Today,plan.PlanNum,patPlanNum,-1,planList,BenefitCoverageLevel.Individual,pat.PatNum);
             if(doubDeductibleUsed!=-1) {
                 insDeductibleUsed=doubDeductibleUsed.ToString("c");
             }
             doubPending=InsPlans.GetPendingDisplay(histList,DateTime.Today,plan,patPlanNum,-1,pat.PatNum,subNum);
             if(doubPending!=-1) {
                 insPending=doubPending.ToString("c");
                 if(doubRemain!=-1) {
                     doubRemain-=doubPending;
                 }
             }
             doubUsed=InsPlans.GetInsUsedDisplay(histList,DateTime.Today,plan.PlanNum,patPlanNum,-1,planList,benefitList,pat.PatNum,subNum);
             if(doubUsed!=-1) {
                 insUsed=doubUsed.ToString("c");
                 if(doubRemain!=-1) {
                     doubRemain-=doubUsed;
                 }
             }
             if(doubRemain!=-1) {
                 insRemaining=doubRemain.ToString("c");
             }
             for(int j=0;j<benefitList.Count;j++) {
                 if(benefitList[j].PlanNum != plan.PlanNum) {
                     continue;
                 }
                 if(benefitList[j].BenefitType != InsBenefitType.CoInsurance) {
                     continue;
                 }
                 if(insPercentages!="") {
                     insPercentages+=",  ";
                 }
                 insPercentages+=CovCats.GetDesc(benefitList[j].CovCatNum)+" "+benefitList[j].Percent.ToString()+"%";
             }
             insFreqBW=Benefits.GetFrequencyDisplay(FrequencyType.BW,benefitList);
             insFreqExams=Benefits.GetFrequencyDisplay(FrequencyType.Exam,benefitList);
             insFreqPanoFMX=Benefits.GetFrequencyDisplay(FrequencyType.PanoFMX,benefitList);
             switch(plan.PlanType) {//(ppo, etc)
                 case "p":
                     insType="PPO Percentage";
                     break;
                 case "f":
                     insType="Medicaid or Flat Copay";
                     break;
                 case "c":
                     insType="Capitation";
                     break;
                 case "":
                     insType="Category Percentage";
                     break;
             }
         }
         subNum=PatPlans.GetInsSubNum(patPlanList,2);
         patPlanNum=PatPlans.GetPatPlanNum(subNum,patPlanList);
         sub=InsSubs.GetSub(subNum,subList);
         if(sub!=null) {
             plan=InsPlans.GetPlan(sub.PlanNum,planList);
         }
         if(plan!=null) {
             carrier=Carriers.GetCarrier(plan.CarrierNum);
             carrier2Name=carrier.CarrierName;
             //carrierAddress=carrier.Address;
             //if(carrier.Address2!="") {
             //	carrierAddress+=", "+carrier.Address2;
             //}
             //carrierCityStZip=carrier.City+", "+carrier.State+"  "+carrier.Zip;
             //subscriberId=plan.SubscriberID;
             subscriber2NameFL=Patients.GetLim(sub.Subscriber).GetNameFL();
             doubAnnualMax=Benefits.GetAnnualMaxDisplay(benefitList,plan.PlanNum,patPlanNum,false);
             doubRemain=-1;
             if(doubAnnualMax!=-1) {
                 ins2AnnualMax=doubAnnualMax.ToString("c");
                 doubRemain=doubAnnualMax;
             }
             doubDeductible=Benefits.GetDeductGeneralDisplay(benefitList,plan.PlanNum,patPlanNum,BenefitCoverageLevel.Individual);
             if(doubDeductible!=-1) {
                 ins2Deductible=doubDeductible.ToString("c");
             }
             doubDeductibleUsed=InsPlans.GetDedUsedDisplay(histList,DateTime.Today,plan.PlanNum,patPlanNum,-1,planList,BenefitCoverageLevel.Individual,pat.PatNum);
             if(doubDeductibleUsed!=-1) {
                 ins2DeductibleUsed=doubDeductibleUsed.ToString("c");
             }
             doubPending=InsPlans.GetPendingDisplay(histList,DateTime.Today,plan,patPlanNum,-1,pat.PatNum,subNum);
             if(doubPending!=-1) {
                 ins2Pending=doubPending.ToString("c");
                 if(doubRemain!=-1) {
                     doubRemain-=doubPending;
                 }
             }
             doubUsed=InsPlans.GetInsUsedDisplay(histList,DateTime.Today,plan.PlanNum,patPlanNum,-1,planList,benefitList,pat.PatNum,subNum);
             if(doubUsed!=-1) {
                 ins2Used=doubUsed.ToString("c");
                 if(doubRemain!=-1) {
                     doubRemain-=doubUsed;
                 }
             }
             if(doubRemain!=-1) {
                 ins2Remaining=doubRemain.ToString("c");
             }
             for(int j=0;j<benefitList.Count;j++) {
                 if(benefitList[j].PlanNum != plan.PlanNum) {
                     continue;
                 }
                 if(benefitList[j].BenefitType != InsBenefitType.CoInsurance) {
                     continue;
                 }
                 if(ins2Percentages!="") {
                     ins2Percentages+=",  ";
                 }
                 ins2Percentages+=CovCats.GetDesc(benefitList[j].CovCatNum)+" "+benefitList[j].Percent.ToString()+"%";
             }
         }
         //Treatment plan-----------------------------------------------------------------------------------------------------------
         TreatPlan[] treatPlanList=TreatPlans.Refresh(pat.PatNum);
         TreatPlan treatPlan=null;
         if(treatPlanList.Length>0) {
             treatPlan=treatPlanList[treatPlanList.Length-1].Copy();
             dateOfLastSavedTP=treatPlan.DateTP.ToShortDateString();
             Patient patRespParty=Patients.GetPat(treatPlan.ResponsParty);
             if(patRespParty!=null) {
                 tpResponsPartyAddress=patRespParty.Address;
                 if(patRespParty.Address2!="") {
                     tpResponsPartyAddress+=", "+patRespParty.Address2;
                 }
                 tpResponsPartyCityStZip=patRespParty.City+", "+patRespParty.State+"  "+patRespParty.Zip;
                 tpResponsPartyNameFL=patRespParty.GetNameFL();
             }
         }
         //Procedure Log-------------------------------------------------------------------------------------------------------------
         List<Procedure> proceduresList=Procedures.Refresh(pat.PatNum);
         DateTime dBW=DateTime.MinValue;
         DateTime dExam=DateTime.MinValue;
         DateTime dPanoFMX=DateTime.MinValue;
         DateTime dProphy=DateTime.MinValue;
         for(int i=0;i<proceduresList.Count;i++) {
             Procedure proc = proceduresList[i];//cache Proc to speed up process
             if(proc.ProcStatus!=ProcStat.C
             && proc.ProcStatus!=ProcStat.EC
             && proc.ProcStatus!=ProcStat.EO) {
                 continue;//only look at completed or existing procedures
             }
             if((proc.CodeNum==ProcedureCodes.GetCodeNum("D0210")//intraoral - complete series (including bitewings)
             ||proc.CodeNum==ProcedureCodes.GetCodeNum("D0270")//bitewing - single film
             ||proc.CodeNum==ProcedureCodes.GetCodeNum("D0272")//bitewings - two films
             ||proc.CodeNum==ProcedureCodes.GetCodeNum("D0274")//bitewings - four films
             ||proc.CodeNum==ProcedureCodes.GetCodeNum("D0277")//vertical bitewings - 7 to 8 films
             ||proc.CodeNum==ProcedureCodes.GetCodeNum("D0273"))//bitewings - three films
             && proc.ProcDate>dBW) //newest
         {
                 dBW=proc.ProcDate;
                 dateLastBW=proc.ProcDate.ToShortDateString();
             }
             if((proc.CodeNum==ProcedureCodes.GetCodeNum("D0120")//periodic oral evaluation - established patient
             ||proc.CodeNum==ProcedureCodes.GetCodeNum("D0140")//limited oral evaluation - problem focused
             ||proc.CodeNum==ProcedureCodes.GetCodeNum("D0150")//comprehensive oral evaluation - new or established patient
             ||proc.CodeNum==ProcedureCodes.GetCodeNum("D0160"))//detailed and extensive oral evaluation - problem focused, by report
             && proc.ProcDate>dExam) //newest
         {
                 dExam=proc.ProcDate;
                 dateLastExam=proc.ProcDate.ToShortDateString();
             }
             if((proc.CodeNum==ProcedureCodes.GetCodeNum("D0210")//intraoral - complete series (including bitewings)
             ||proc.CodeNum==ProcedureCodes.GetCodeNum("D0330"))//panoramic film
             && proc.ProcDate>dPanoFMX) //newest
         {
                 dPanoFMX=proc.ProcDate;
                 dateLastPanoFMX=proc.ProcDate.ToShortDateString();
             }
             if((proc.CodeNum==ProcedureCodes.GetCodeNum("D1110")//prophylaxis - adult
             ||proc.CodeNum==ProcedureCodes.GetCodeNum("D1120")//prophylaxis - child
             ||proc.CodeNum==ProcedureCodes.GetCodeNum("D1201")//Topical Fluoride Including Prophy-Child
             ||proc.CodeNum==ProcedureCodes.GetCodeNum("D1205"))//Topical Fluoride Including Prophy-Adult
             && proc.ProcDate>dProphy) //newest
         {
                 dProphy=proc.ProcDate;
                 dateLastProphy=proc.ProcDate.ToShortDateString(); ;
             }
         }
         //Recall--------------------------------------------------------------------------------------------------------------------
         Recall recall=Recalls.GetRecallProphyOrPerio(pat.PatNum);
         if(recall!=null) {
             if(recall.DateDue.Year>1880) {
                 dateRecallDue=recall.DateDue.ToShortDateString();
             }
             recallInterval=recall.RecallInterval.ToString();
         }
         //Appointments--------------------------------------------------------------------------------------------------------------
         List<Appointment> apptList=Appointments.GetListForPat(pat.PatNum);
         List<Appointment> apptFutureList=Appointments.GetFutureSchedApts(pat.PatNum);
         for(int i=0;i<apptList.Count;i++) {
             if(apptList[i].AptStatus != ApptStatus.Scheduled
             && apptList[i].AptStatus != ApptStatus.Complete
             && apptList[i].AptStatus != ApptStatus.None
             && apptList[i].AptStatus != ApptStatus.ASAP) {
                 continue;
             }
             if(apptList[i].AptDateTime < DateTime.Now) {
                 //this will happen repeatedly up until the most recent.
                 dateTimeLastAppt=apptList[i].AptDateTime.ToShortDateString()+"  "+apptList[i].AptDateTime.ToShortTimeString();
             }
             else {//after now
                 if(nextSchedApptDateT=="") {//only the first one found
                     nextSchedApptDateT=apptList[i].AptDateTime.ToShortDateString()+"  "+apptList[i].AptDateTime.ToShortTimeString();
                     break;//we're done with the list now.
                 }
             }
         }
         for(int i=0;i<apptFutureList.Count;i++) {//cannot be combined in loop above because of the break in the loop.
             apptsAllFuture+=apptFutureList[i].AptDateTime.ToShortDateString()+" "+apptFutureList[i].AptDateTime.ToShortTimeString()+" : "+apptFutureList[i].ProcDescript+"\r\n";
         }
         for(int i=0;i<fam.ListPats.Length;i++) {
             List<Appointment> futAptsList=Appointments.GetFutureSchedApts(fam.ListPats[i].PatNum);
             if(futAptsList.Count>0) {//just gets one future appt for each person
                 nextSchedApptsFam+=fam.ListPats[i].FName+": "+futAptsList[0].AptDateTime.ToShortDateString()+" "+futAptsList[0].AptDateTime.ToShortTimeString()+" : "+futAptsList[0].ProcDescript+"\r\n";
             }
         }
         if(Sheets.ContainsStaticField(sheet,"plannedAppointmentInfo")) {
             PlannedAppt plannedAppt=PlannedAppts.GetOneOrderedByItemOrder(pat.PatNum);
             for(int i=0;i<apptList.Count;i++) {
                 if(plannedAppt!=null && apptList[i].AptNum==plannedAppt.AptNum) {
                     plannedAppointmentInfo="Procedures: ";
                     plannedAppointmentInfo+=apptList[i].ProcDescript+"\r\n";
                     int minutesTotal=apptList[i].Pattern.Length*5;
                     int hours=minutesTotal/60;//automatically rounds down
                     int minutes=minutesTotal-hours*60;
                     plannedAppointmentInfo+="Appt Length: ";
                     if(hours>0) {
                         plannedAppointmentInfo+=hours.ToString()+" hours, ";
                     }
                     plannedAppointmentInfo+=minutes.ToString()+" min\r\n";
                     if(Programs.UsingOrion) {
                         DateTime newDateSched=new DateTime();
                         for(int p=0;p<procsList.Count;p++) {
                             if(procsList[p].PlannedAptNum==apptList[i].AptNum) {
                                 OrionProc op=OrionProcs.GetOneByProcNum(procsList[p].ProcNum);
                                 if(op!=null && op.DateScheduleBy.Year>1880) {
                                     if(newDateSched.Year<1880) {
                                         newDateSched=op.DateScheduleBy;
                                     }
                                     else {
                                         if(op.DateScheduleBy<newDateSched) {
                                             newDateSched=op.DateScheduleBy;
                                         }
                                     }
                                 }
                             }
                         }
                         if(newDateSched.Year>1880) {
                             plannedAppointmentInfo+="Schedule by: "+newDateSched.ToShortDateString();
                         }
                         else {
                             plannedAppointmentInfo+="No schedule by date.";
                         }
                     }
                 }
             }
         }
         priProv=Providers.GetProv(Patients.GetProvNum(pat));//guaranteed to work
         //Clinic-------------------------------------------------------------------------------------------------------------
         Clinic clinic=Clinics.GetClinic(pat.ClinicNum);
         if(clinic==null) {
             clinicDescription=PrefC.GetString(PrefName.PracticeTitle);
             clinicAddress=PrefC.GetString(PrefName.PracticeAddress);
             if(PrefC.GetString(PrefName.PracticeAddress2)!="") {
                 clinicAddress+=", "+PrefC.GetString(PrefName.PracticeAddress2);
             }
             clinicCityStZip=PrefC.GetString(PrefName.PracticeCity)+", "+PrefC.GetString(PrefName.PracticeST)+"  "+PrefC.GetString(PrefName.PracticeZip);
             phone=PrefC.GetString(PrefName.PracticePhone);
         }
         else {
             clinicDescription=clinic.Description;
             clinicAddress=clinic.Address;
             if(clinic.Address2!="") {
                 clinicAddress+=", "+clinic.Address2;
             }
             clinicCityStZip=clinic.City+", "+clinic.State+"  "+clinic.Zip;
             phone=clinic.Phone;
         }
         if(phone.Length==10 && System.Globalization.CultureInfo.CurrentCulture.Name=="en-US") {
             clinicPhone="("+phone.Substring(0,3)+")"+phone.Substring(3,3)+"-"+phone.Substring(6);
         }
         else {
             clinicPhone=phone;
         }
     }//End of if(pat!=null)
     //Fill fields---------------------------------------------------------------------------------------------------------
     foreach(SheetField field in sheet.SheetFields) {
         if(field.FieldType!=SheetFieldType.StaticText) {
             continue;
         }
         fldval=field.FieldValue;
         if(pat!=null) {
             fldval=fldval.Replace("[address]",address);
             fldval=fldval.Replace("[apptsAllFuture]",apptsAllFuture.TrimEnd());
             fldval=fldval.Replace("[age]",Patients.AgeToString(pat.Age));
             fldval=fldval.Replace("[balTotal]",fam.ListPats[0].BalTotal.ToString("c"));
             fldval=fldval.Replace("[bal_0_30]",fam.ListPats[0].Bal_0_30.ToString("c"));
             fldval=fldval.Replace("[bal_31_60]",fam.ListPats[0].Bal_31_60.ToString("c"));
             fldval=fldval.Replace("[bal_61_90]",fam.ListPats[0].Bal_61_90.ToString("c"));
             fldval=fldval.Replace("[balOver90]",fam.ListPats[0].BalOver90.ToString("c"));
             fldval=fldval.Replace("[balInsEst]",fam.ListPats[0].InsEst.ToString("c"));
             fldval=fldval.Replace("[balTotalMinusInsEst]",(fam.ListPats[0].BalTotal-fam.ListPats[0].InsEst).ToString("c"));
             fldval=fldval.Replace("[BillingType]",DefC.GetName(DefCat.BillingTypes,pat.BillingType));
             fldval=fldval.Replace("[Birthdate]",birthdate);
             fldval=fldval.Replace("[carrierName]",carrierName);
             fldval=fldval.Replace("[carrier2Name]",carrier2Name);
             fldval=fldval.Replace("[ChartNumber]",pat.ChartNumber);
             fldval=fldval.Replace("[carrierAddress]",carrierAddress);
             fldval=fldval.Replace("[carrierCityStZip]",carrierCityStZip);
             fldval=fldval.Replace("[cityStateZip]",pat.City+", "+pat.State+"  "+pat.Zip);
             fldval=fldval.Replace("[clinicDescription]",clinicDescription);
             fldval=fldval.Replace("[clinicAddress]",clinicAddress);
             fldval=fldval.Replace("[clinicCityStZip]",clinicCityStZip);
             fldval=fldval.Replace("[clinicPhone]",clinicPhone);
             fldval=fldval.Replace("[DateFirstVisit]",dateFirstVisit);
             fldval=fldval.Replace("[dateLastBW]",dateLastBW);
             fldval=fldval.Replace("[dateLastExam]",dateLastExam);
             fldval=fldval.Replace("[dateLastPanoFMX]",dateLastPanoFMX);
             fldval=fldval.Replace("[dateLastProphy]",dateLastProphy);
             fldval=fldval.Replace("[dateOfLastSavedTP]",dateOfLastSavedTP);
             fldval=fldval.Replace("[dateRecallDue]",dateRecallDue);
             fldval=fldval.Replace("[dateTimeLastAppt]",dateTimeLastAppt);
             fldval=fldval.Replace("[Email]",pat.Email);
             fldval=fldval.Replace("[famFinUrgNote]",fam.ListPats[0].FamFinUrgNote);
             fldval=fldval.Replace("[guarantorNameF]",guarantorNameF);
             fldval=fldval.Replace("[guarantorNameFL]",guarantorNameFL);
             fldval=fldval.Replace("[guarantorNameL]",guarantorNameL);
             fldval=fldval.Replace("[guarantorNamePref]",guarantorNamePref);
             fldval=fldval.Replace("[guarantorNameLF]",guarantorNameLF);
             fldval=fldval.Replace("[gender]",Lan.g("enumPatientGender",pat.Gender.ToString()));
             fldval=fldval.Replace("[genderHeShe]",genderHeShe);
             fldval=fldval.Replace("[genderheshe]",genderheshe);
             fldval=fldval.Replace("[genderHimHer]",genderHimHer);
             fldval=fldval.Replace("[genderhimher]",genderhimher);
             fldval=fldval.Replace("[genderHimselfHerself]",genderHimselfHerself);
             fldval=fldval.Replace("[genderhimselfherself]",genderhimselfherself);
             fldval=fldval.Replace("[genderHisHer]",genderHisHer);
             fldval=fldval.Replace("[genderhisher]",genderhisher);
             fldval=fldval.Replace("[genderHisHers]",genderHisHers);
             fldval=fldval.Replace("[genderhishers]",genderhishers);
             fldval=fldval.Replace("[guarantorNameFL]",fam.ListPats[0].GetNameFL());
             fldval=fldval.Replace("[HmPhone]",StripPhoneBeyondSpace(pat.HmPhone));
             fldval=fldval.Replace("[insAnnualMax]",insAnnualMax);
             fldval=fldval.Replace("[insDeductible]",insDeductible);
             fldval=fldval.Replace("[insDeductibleUsed]",insDeductibleUsed);
             fldval=fldval.Replace("[insFreqBW]",insFreqBW.TrimEnd());
             fldval=fldval.Replace("[insFreqExams]",insFreqExams.TrimEnd());
             fldval=fldval.Replace("[insFreqPanoFMX]",insFreqPanoFMX.TrimEnd());
             fldval=fldval.Replace("[insPending]",insPending);
             fldval=fldval.Replace("[insPercentages]",insPercentages);
             fldval=fldval.Replace("[insPlanGroupNumber]",insPlanGroupNumber);
             fldval=fldval.Replace("[insPlanGroupName]",insPlanGroupName);
             fldval=fldval.Replace("[insPlanNote]",insPlanNote);
             fldval=fldval.Replace("[insType]",insType);
             fldval=fldval.Replace("[insSubNote]",insSubNote);
             fldval=fldval.Replace("[insRemaining]",insRemaining);
             fldval=fldval.Replace("[insUsed]",insUsed);
             fldval=fldval.Replace("[ins2AnnualMax]",ins2AnnualMax);
             fldval=fldval.Replace("[ins2Deductible]",ins2Deductible);
             fldval=fldval.Replace("[ins2DeductibleUsed]",ins2DeductibleUsed);
             fldval=fldval.Replace("[ins2Pending]",ins2Pending);
             fldval=fldval.Replace("[ins2Percentages]",ins2Percentages);
             fldval=fldval.Replace("[ins2Remaining]",ins2Remaining);
             fldval=fldval.Replace("[ins2Used]",ins2Used);
             fldval=fldval.Replace("[MedUrgNote]",pat.MedUrgNote);
             fldval=fldval.Replace("[nameF]",pat.FName);
             fldval=fldval.Replace("[nameFL]",pat.GetNameFL());
             fldval=fldval.Replace("[nameFLFormal]",pat.GetNameFLFormal());
             fldval=fldval.Replace("[nameL]",pat.LName);
             fldval=fldval.Replace("[nameLF]",pat.GetNameLF());
             fldval=fldval.Replace("[nameMI]",pat.MiddleI);
             fldval=fldval.Replace("[namePref]",pat.Preferred);
             fldval=fldval.Replace("[nextSchedApptDateT]",nextSchedApptDateT);
             fldval=fldval.Replace("[nextSchedApptsFam]",nextSchedApptsFam.TrimEnd());
             fldval=fldval.Replace("[PatNum]",pat.PatNum.ToString());
             fldval=fldval.Replace("[plannedAppointmentInfo]",plannedAppointmentInfo);
             fldval=fldval.Replace("[priProvNameFormal]",priProv.GetFormalName());
             fldval=fldval.Replace("[recallInterval]",recallInterval);
             fldval=fldval.Replace("[referredFrom]",referredFrom);
             fldval=fldval.Replace("[referredTo]",referredTo.TrimEnd());
             fldval=fldval.Replace("[salutation]",pat.GetSalutation());
             fldval=fldval.Replace("[serviceNote]",serviceNote);
             fldval=fldval.Replace("[siteDescription]",Sites.GetDescription(pat.SiteNum));
             fldval=fldval.Replace("[subscriberID]",subscriberId);
             fldval=fldval.Replace("[subscriberNameFL]",subscriberNameFL);
             fldval=fldval.Replace("[subscriber2NameFL]",subscriber2NameFL);
             fldval=fldval.Replace("[timeNow]",DateTime.Now.ToShortTimeString());
             fldval=fldval.Replace("[tpResponsPartyAddress]",tpResponsPartyAddress);
             fldval=fldval.Replace("[tpResponsPartyCityStZip]",tpResponsPartyCityStZip);
             fldval=fldval.Replace("[tpResponsPartyNameFL]",tpResponsPartyNameFL);
             fldval=fldval.Replace("[treatmentPlanProcs]",treatmentPlanProcs);
             fldval=fldval.Replace("[WirelessPhone]",StripPhoneBeyondSpace(pat.WirelessPhone));
             fldval=fldval.Replace("[WkPhone]",StripPhoneBeyondSpace(pat.WkPhone));
         }
         fldval=fldval.Replace("[dateToday]",DateTime.Today.ToShortDateString());
         fldval=fldval.Replace("[practiceTitle]",PrefC.GetString(PrefName.PracticeTitle));
         field.FieldValue=fldval;
     }
 }
示例#16
0
		private void FormApptEdit_Load(object sender, System.EventArgs e){
			if(IsNew){
				if(!Security.IsAuthorized(Permissions.AppointmentCreate)){
					DialogResult=DialogResult.Cancel;
					return;
				}
			}
			else{
				if(!Security.IsAuthorized(Permissions.AppointmentEdit)){
					butOK.Enabled=false;
					butDelete.Enabled=false;
					butPin.Enabled=false;
					tbProc.Enabled=false;
				}
			}
			fam=Patients.GetFamily(AptCur.PatNum);
			pat=fam.GetPatient(AptCur.PatNum);
			PlanList=InsPlans.Refresh(fam);
			PatPlanList=PatPlans.Refresh(AptCur.PatNum);
			//CovPats.Refresh(PlanList,PatPlanList);
			if(PrefB.GetBool("EasyHideDentalSchools")){
				groupDentalSchools.Visible=false;
			}
			if(PrefB.GetBool("EasyNoClinics")){
				labelClinic.Visible=false;
				comboClinic.Visible=false;
			}
			if(!PinIsVisible)
				butPin.Visible=false;
			if(AptCur.AptStatus==ApptStatus.Planned){
				Text=Lan.g(this,"Edit Planned Appointment")+" - "+pat.GetNameLF();
				labelStatus.Visible=false;
				comboStatus.Visible=false;
				butDelete.Visible=false;
			}
			else{
				Text=Lan.g(this,"Edit Appointment")+" - "+pat.GetNameLF();
				comboStatus.Items.Add(Lan.g("enumApptStatus","Scheduled"));
				comboStatus.Items.Add(Lan.g("enumApptStatus","Complete"));
				comboStatus.Items.Add(Lan.g("enumApptStatus","UnschedList"));
				comboStatus.Items.Add(Lan.g("enumApptStatus","ASAP"));
				comboStatus.Items.Add(Lan.g("enumApptStatus","Broken"));
				comboStatus.SelectedIndex=(int)AptCur.AptStatus-1;
			}
			if(IsNew){
				//for this, the appointment has to be created somewhere else first.
				//It might only be temporary, and will be deleted if Cancel is clicked.
				//AptCur=new Appointment();//handled  previously
				//Appointments.SaveApt();
				if(AptCur.Confirmed==0)
					AptCur.Confirmed=DefB.Short[(int)DefCat.ApptConfirmed][0].DefNum;
				if(AptCur.ProvNum==0)
					AptCur.ProvNum=Providers.List[0].ProvNum;
			}
			//for(int i=1;i<Enum.GetNames(typeof(ApptStatus)).Length;i++){//none status is not displayed
			//	listStatus.Items.Add(Enum.GetNames(typeof(ApptStatus))[i]);
			//}
			//convert time pattern from 5 to current increment.
			strBTime=new StringBuilder();
			for(int i=0;i<AptCur.Pattern.Length;i++){
				strBTime.Append(AptCur.Pattern.Substring(i,1));
				i++;
				if(PrefB.GetInt("AppointmentTimeIncrement")==15){
					i++;
				}
			}
			comboUnschedStatus.Items.Add(Lan.g(this,"none"));
			comboUnschedStatus.SelectedIndex=0;
			for(int i=0;i<DefB.Short[(int)DefCat.RecallUnschedStatus].Length;i++){
				comboUnschedStatus.Items.Add(DefB.Short[(int)DefCat.RecallUnschedStatus][i].ItemName);
				if(DefB.Short[(int)DefCat.RecallUnschedStatus][i].DefNum==AptCur.UnschedStatus)
					comboUnschedStatus.SelectedIndex=i+1;
			}
			for(int i=0;i<DefB.Short[(int)DefCat.ApptConfirmed].Length;i++){
				comboConfirmed.Items.Add(DefB.Short[(int)DefCat.ApptConfirmed][i].ItemName);
				if(DefB.Short[(int)DefCat.ApptConfirmed][i].DefNum==AptCur.Confirmed)
					comboConfirmed.SelectedIndex=i;
			}
			textAddTime.MinVal=-1200;
			textAddTime.MaxVal=1200;
			textAddTime.Text=POut.PInt(AptCur.AddTime*PIn.PInt(((Pref)PrefB.HList["AppointmentTimeIncrement"]).ValueString));
			textNote.Text=AptCur.Note;
			for(int i=0;i<DefB.Short[(int)DefCat.ApptProcsQuickAdd].Length;i++){
				listQuickAdd.Items.Add(DefB.Short[(int)DefCat.ApptProcsQuickAdd][i].ItemName);
			}
			//SchoolClassNum must be filled before provider
			comboSchoolClass.Items.Add(Lan.g(this,"none"));
			for(int i=0;i<SchoolClasses.List.Length;i++){
				comboSchoolClass.Items.Add(SchoolClasses.List[i].GradYear.ToString()+"-"+SchoolClasses.List[i].Descript);
			}
			comboClinic.Items.Add(Lan.g(this,"none"));
			comboClinic.SelectedIndex=0;
			for(int i=0;i<Clinics.List.Length;i++){
				comboClinic.Items.Add(Clinics.List[i].Description);
				if(Clinics.List[i].ClinicNum==AptCur.ClinicNum)
					comboClinic.SelectedIndex=i+1;
			}
			for(int i=0;i<Providers.List.Length;i++){
				comboProvNum.Items.Add(Providers.List[i].Abbr);
				if(Providers.List[i].ProvNum==AptCur.ProvNum)
					comboProvNum.SelectedIndex=i;
			}
			comboProvHyg.Items.Add(Lan.g(this,"none"));
			comboProvHyg.SelectedIndex=0;
			for(int i=0;i<Providers.List.Length;i++){
				comboProvHyg.Items.Add(Providers.List[i].Abbr);
				if(Providers.List[i].ProvNum==AptCur.ProvHyg)
					comboProvHyg.SelectedIndex=i+1;
			}
			checkIsHygiene.Checked=AptCur.IsHygiene;
			comboAssistant.Items.Add(Lan.g(this,"none"));
			comboAssistant.SelectedIndex=0;
			for(int i=0;i<Employees.ListShort.Length;i++){
				comboAssistant.Items.Add(Employees.ListShort[i].FName);
				if(Employees.ListShort[i].EmployeeNum==AptCur.Assistant)
					comboAssistant.SelectedIndex=i+1;
			}
			string[] enumLab=Enum.GetNames(typeof(LabCaseOld));
			for(int i=0;i<enumLab.Length;i++){
				comboLab.Items.Add(Lan.g("enumLab",enumLab[i]));
			}
			comboLab.SelectedIndex=(int)AptCur.Lab;
			comboInstructor.Items.Add(Lan.g(this,"none"));
			comboInstructor.SelectedIndex=0;
			for(int i=0;i<Instructors.List.Length;i++){
				comboInstructor.Items.Add(Instructors.List[i].LName+", "+Instructors.List[i].FName+", "+Instructors.List[i].Suffix);
				if(Instructors.List[i].InstructorNum==AptCur.InstructorNum)
					comboInstructor.SelectedIndex=i+1;
			}
			//SchoolClassNum was filled earlier.  Now selected:
			comboSchoolClass.SelectedIndex=0;
			for(int i=0;i<SchoolClasses.List.Length;i++){
				if(SchoolClasses.List[i].SchoolClassNum==AptCur.SchoolClassNum)
					comboSchoolClass.SelectedIndex=i+1;
			}
			comboSchoolCourse.Items.Add(Lan.g(this,"none"));
			comboSchoolCourse.SelectedIndex=0;
			for(int i=0;i<SchoolCourses.List.Length;i++){
				comboSchoolCourse.Items.Add(SchoolCourses.List[i].CourseID+"  "+SchoolCourses.List[i].Descript);
				if(SchoolCourses.List[i].SchoolCourseNum==AptCur.SchoolCourseNum)
					comboSchoolCourse.SelectedIndex=i+1;
			}
			textGradePoint.Text=AptCur.GradePoint.ToString();
			//IsNewPatient is set well before opening this form.
			checkIsNewPatient.Checked=AptCur.IsNewPatient;
			textHmPhone.Text=pat.HmPhone;
			textWkPhone.Text=pat.WkPhone;
			textWirelessPhone.Text=pat.WirelessPhone;
			textAddrNote.Text=pat.AddrNote;
			textCreditType.Text=pat.CreditType;
			textBillingType.Text=DefB.GetName(DefCat.BillingTypes,pat.BillingType);
			textBalance.Text=pat.EstBalance.ToString("F");
			textFamilyBal.Text=fam.List[0].BalTotal.ToString("F");
			if(ContrApptSheet.MinPerIncr==10){
				tbTime.TopBorder[0,6]=Color.Black;
				tbTime.TopBorder[0,12]=Color.Black;
				tbTime.TopBorder[0,18]=Color.Black;
				tbTime.TopBorder[0,24]=Color.Black;
				tbTime.TopBorder[0,30]=Color.Black;
				tbTime.TopBorder[0,36]=Color.Black;
			}
			else{
				tbTime.TopBorder[0,4]=Color.Black;
				tbTime.TopBorder[0,8]=Color.Black;
				tbTime.TopBorder[0,12]=Color.Black;
				tbTime.TopBorder[0,16]=Color.Black;
				tbTime.TopBorder[0,20]=Color.Black;
				tbTime.TopBorder[0,24]=Color.Black;
				tbTime.TopBorder[0,28]=Color.Black;
				tbTime.TopBorder[0,32]=Color.Black;
				tbTime.TopBorder[0,36]=Color.Black;
			}
			FillProcedures();
			FillTime();
			FillComm();
		}
示例#17
0
文件: PatientL.cs 项目: mnisl/OD
		///<summary>Accepts null for pat and 0 for clinicNum.</summary>
		public static string GetMainTitle(Patient pat,long clinicNum) {
			string retVal=PrefC.GetString(PrefName.MainWindowTitle);
			object[] parameters = { retVal };
			Plugins.HookAddCode(null,"PatientL.GetMainTitle_beginning",parameters);
			retVal = (string)parameters[0];
			if(!PrefC.GetBool(PrefName.EasyNoClinics) && clinicNum>0) {
				if(retVal!="") {
					retVal+=" - Clinic: ";
				}
				retVal+=Clinics.GetDesc(clinicNum);
			}
			if(Security.CurUser!=null){
				retVal+=" {"+Security.CurUser.UserName+"}";
			}
			if(pat==null || pat.PatNum==0 || pat.PatNum==-1){
				return retVal;
			}
			retVal+=" - "+pat.GetNameLF();
			if(PrefC.GetLong(PrefName.ShowIDinTitleBar)==1) {
				retVal+=" - "+pat.PatNum.ToString();
			}
			else if(PrefC.GetLong(PrefName.ShowIDinTitleBar)==2) {
				retVal+=" - "+pat.ChartNumber;
			}
			else if(PrefC.GetLong(PrefName.ShowIDinTitleBar)==3) {
				if(pat.Birthdate.Year>1880) {
					retVal+=" - "+pat.Birthdate.ToShortDateString();
				}
			}
			if(pat.SiteNum!=0){
				retVal+=" - "+Sites.GetDescription(pat.SiteNum);
			}
			return retVal;
		}
示例#18
0
        ///<summary>For orderBy, use 0 for BillingType and 1 for PatientName.</summary>
        public static DataTable GetBilling(bool isSent, int orderBy, DateTime dateFrom, DateTime dateTo, long clinicNum)
        {
            if (RemotingClient.RemotingRole == RemotingRole.ClientWeb)
            {
                return(Meth.GetTable(MethodBase.GetCurrentMethod(), isSent, orderBy, dateFrom, dateTo, clinicNum));
            }
            DataTable table = new DataTable();
            DataRow   row;

            //columns that start with lowercase are altered for display rather than being raw data.
            table.Columns.Add("amountDue");
            table.Columns.Add("balTotal");
            table.Columns.Add("billingType");
            table.Columns.Add("insEst");
            table.Columns.Add("IsSent");
            table.Columns.Add("lastStatement");
            table.Columns.Add("mode");
            table.Columns.Add("name");
            table.Columns.Add("PatNum");
            table.Columns.Add("payPlanDue");
            table.Columns.Add("StatementNum");
            List <DataRow> rows    = new List <DataRow>();
            string         command = "SELECT BalTotal,BillingType,FName,InsEst,statement.IsSent,"
                                     + "IFNULL(MAX(s2.DateSent)," + POut.Date(DateTime.MinValue) + ") LastStatement,"
                                     + "LName,MiddleI,statement.Mode_,PayPlanDue,Preferred,"
                                     + "statement.PatNum,statement.StatementNum "
                                     + "FROM statement "
                                     + "LEFT JOIN patient ON statement.PatNum=patient.PatNum "
                                     + "LEFT JOIN statement s2 ON s2.PatNum=patient.PatNum "
                                     + "AND s2.IsSent=1 ";

            if (PrefC.GetBool(PrefName.BillingIgnoreInPerson))
            {
                command += "AND s2.Mode_ !=1 ";
            }
            if (orderBy == 0)          //BillingType
            {
                command += "LEFT JOIN definition ON patient.BillingType=definition.DefNum ";
            }
            command += "WHERE statement.IsSent=" + POut.Bool(isSent) + " ";
            //if(dateFrom.Year>1800){
            command += "AND statement.DateSent>=" + POut.Date(dateFrom) + " ";      //greater than midnight this morning
            //}
            //if(dateFrom.Year>1800){
            command += "AND statement.DateSent<" + POut.Date(dateTo.AddDays(1)) + " ";      //less than midnight tonight
            //}
            if (clinicNum > 0)
            {
                command += "AND patient.ClinicNum=" + clinicNum + " ";
            }
            command += "GROUP BY BalTotal,BillingType,FName,InsEst,statement.IsSent,"
                       + "LName,MiddleI,statement.Mode_,PayPlanDue,Preferred,"
                       + "statement.PatNum,statement.StatementNum ";
            if (orderBy == 0)          //BillingType
            {
                command += "ORDER BY definition.ItemOrder,LName,FName,MiddleI,PayPlanDue";
            }
            else
            {
                command += "ORDER BY LName,FName";
            }
            DataTable     rawTable = Db.GetTable(command);
            Patient       pat;
            StatementMode mode;
            double        balTotal;
            double        insEst;
            double        payPlanDue;
            DateTime      lastStatement;

            for (int i = 0; i < rawTable.Rows.Count; i++)
            {
                row                = table.NewRow();
                balTotal           = PIn.Double(rawTable.Rows[i]["BalTotal"].ToString());
                insEst             = PIn.Double(rawTable.Rows[i]["InsEst"].ToString());
                payPlanDue         = PIn.Double(rawTable.Rows[i]["PayPlanDue"].ToString());
                row["amountDue"]   = (balTotal - insEst).ToString("F");
                row["balTotal"]    = balTotal.ToString("F");;
                row["billingType"] = DefC.GetName(DefCat.BillingTypes, PIn.Long(rawTable.Rows[i]["BillingType"].ToString()));
                if (insEst == 0)
                {
                    row["insEst"] = "";
                }
                else
                {
                    row["insEst"] = insEst.ToString("F");
                }
                row["IsSent"] = rawTable.Rows[i]["IsSent"].ToString();
                lastStatement = PIn.Date(rawTable.Rows[i]["LastStatement"].ToString());
                if (lastStatement.Year < 1880)
                {
                    row["lastStatement"] = "";
                }
                else
                {
                    row["lastStatement"] = lastStatement.ToShortDateString();
                }
                mode          = (StatementMode)PIn.Long(rawTable.Rows[i]["Mode_"].ToString());
                row["mode"]   = Lans.g("enumStatementMode", mode.ToString());
                pat           = new Patient();
                pat.LName     = rawTable.Rows[i]["LName"].ToString();
                pat.FName     = rawTable.Rows[i]["FName"].ToString();
                pat.Preferred = rawTable.Rows[i]["Preferred"].ToString();
                pat.MiddleI   = rawTable.Rows[i]["MiddleI"].ToString();
                row["name"]   = pat.GetNameLF();
                row["PatNum"] = rawTable.Rows[i]["PatNum"].ToString();
                if (payPlanDue == 0)
                {
                    row["payPlanDue"] = "";
                }
                else
                {
                    row["payPlanDue"] = payPlanDue.ToString("F");
                }
                row["StatementNum"] = rawTable.Rows[i]["StatementNum"].ToString();
                rows.Add(row);
            }
            for (int i = 0; i < rows.Count; i++)
            {
                table.Rows.Add(rows[i]);
            }
            return(table);
        }
示例#19
0
		///<summary>For orderBy, use 0 for BillingType and 1 for PatientName.</summary>
		public static DataTable GetBilling(bool isSent,int orderBy,DateTime dateFrom,DateTime dateTo,long clinicNum){
			if(RemotingClient.RemotingRole==RemotingRole.ClientWeb) {
				return Meth.GetTable(MethodBase.GetCurrentMethod(),isSent,orderBy,dateFrom,dateTo,clinicNum);
			}
			DataTable table=new DataTable();
			DataRow row;
			//columns that start with lowercase are altered for display rather than being raw data.
			table.Columns.Add("amountDue");
			table.Columns.Add("balTotal");
			table.Columns.Add("billingType");
			table.Columns.Add("insEst");
			table.Columns.Add("IsSent");
			table.Columns.Add("lastStatement");
			table.Columns.Add("mode");
			table.Columns.Add("name");
			table.Columns.Add("PatNum");
			table.Columns.Add("payPlanDue");
			table.Columns.Add("StatementNum");
			List<DataRow> rows=new List<DataRow>();
			string command="SELECT BalTotal,BillingType,FName,InsEst,statement.IsSent,"
				+"IFNULL(MAX(s2.DateSent),"+POut.Date(DateTime.MinValue)+") LastStatement,"
				+"LName,MiddleI,statement.Mode_,PayPlanDue,Preferred,"
				+"statement.PatNum,statement.StatementNum "
				+"FROM statement "
				+"LEFT JOIN patient ON statement.PatNum=patient.PatNum "
				+"LEFT JOIN statement s2 ON s2.PatNum=patient.PatNum "
				+"AND s2.IsSent=1 ";
			if(PrefC.GetBool(PrefName.BillingIgnoreInPerson)) {
				command+="AND s2.Mode_ !=1 ";
			}
			if(orderBy==0){//BillingType
				command+="LEFT JOIN definition ON patient.BillingType=definition.DefNum ";
			}
			command+="WHERE statement.IsSent="+POut.Bool(isSent)+" ";
			//if(dateFrom.Year>1800){
			command+="AND statement.DateSent>="+POut.Date(dateFrom)+" ";//greater than midnight this morning
			//}
			//if(dateFrom.Year>1800){
			command+="AND statement.DateSent<"+POut.Date(dateTo.AddDays(1))+" ";//less than midnight tonight
			//}
			if(clinicNum>0) {
				command+="AND patient.ClinicNum="+clinicNum+" ";
			}
			command+="GROUP BY BalTotal,BillingType,FName,InsEst,statement.IsSent,"
				+"LName,MiddleI,statement.Mode_,PayPlanDue,Preferred,"
				+"statement.PatNum,statement.StatementNum "; 
			if(orderBy==0){//BillingType
				command+="ORDER BY definition.ItemOrder,LName,FName,MiddleI,PayPlanDue";
			}
			else{
				command+="ORDER BY LName,FName";
			}
			DataTable rawTable=Db.GetTable(command);
			Patient pat;
			StatementMode mode;
			double balTotal;
			double insEst;
			double payPlanDue;
			DateTime lastStatement;
			for(int i=0;i<rawTable.Rows.Count;i++){
				row=table.NewRow();
				balTotal=PIn.Double(rawTable.Rows[i]["BalTotal"].ToString());
				insEst=PIn.Double(rawTable.Rows[i]["InsEst"].ToString());
				payPlanDue=PIn.Double(rawTable.Rows[i]["PayPlanDue"].ToString());
				row["amountDue"]=(balTotal-insEst).ToString("F");
				row["balTotal"]=balTotal.ToString("F");;
				row["billingType"]=DefC.GetName(DefCat.BillingTypes,PIn.Long(rawTable.Rows[i]["BillingType"].ToString()));
				if(insEst==0){
					row["insEst"]="";
				}
				else{
					row["insEst"]=insEst.ToString("F");
				}
				row["IsSent"]=rawTable.Rows[i]["IsSent"].ToString();
				lastStatement=PIn.Date(rawTable.Rows[i]["LastStatement"].ToString());
				if(lastStatement.Year<1880){
					row["lastStatement"]="";
				}
				else{
					row["lastStatement"]=lastStatement.ToShortDateString();
				}
				mode=(StatementMode)PIn.Long(rawTable.Rows[i]["Mode_"].ToString());
				row["mode"]=Lans.g("enumStatementMode",mode.ToString());
				pat=new Patient();
				pat.LName=rawTable.Rows[i]["LName"].ToString();
				pat.FName=rawTable.Rows[i]["FName"].ToString();
				pat.Preferred=rawTable.Rows[i]["Preferred"].ToString();
				pat.MiddleI=rawTable.Rows[i]["MiddleI"].ToString();
				row["name"]=pat.GetNameLF();
				row["PatNum"]=rawTable.Rows[i]["PatNum"].ToString();
				if(payPlanDue==0){
					row["payPlanDue"]="";
				}
				else{
					row["payPlanDue"]=payPlanDue.ToString("F");
				}
				row["StatementNum"]=rawTable.Rows[i]["StatementNum"].ToString();
				rows.Add(row);
			}
			for(int i=0;i<rows.Count;i++) {
				table.Rows.Add(rows[i]);
			}
			return table;
		}
示例#20
0
 private static void FillFieldsForLabelAppointment(Sheet sheet,Appointment appt,Patient pat)
 {
     foreach(SheetField field in sheet.SheetFields) {
         switch(field.FieldName) {
             case "nameFL":
                 field.FieldValue=pat.GetNameFirstOrPrefL();
                 break;
             case "nameLF":
                 field.FieldValue=pat.GetNameLF();
                 break;
             case "weekdayDateTime":
                 field.FieldValue=appt.AptDateTime.ToString("ddd")+"   "
                     +appt.AptDateTime.ToShortDateString()+"  "
                     +appt.AptDateTime.ToShortTimeString();//  h:mm tt");
                 break;
             case "length":
                 int minutesTotal=appt.Pattern.Length*5;
                 int hours=minutesTotal/60;//automatically rounds down
                 int minutes=minutesTotal-hours*60;
                 field.FieldValue="";
                 if(hours>0){
                     field.FieldValue=hours.ToString()+" hours, ";
                 }
                 field.FieldValue+=minutes.ToString()+" min";
                 break;
         }
     }
 }
示例#21
0
 public static DataTable GetTable(EhrMeasureType mtype,DateTime dateStart,DateTime dateEnd,long provNum)
 {
     if(RemotingClient.RemotingRole==RemotingRole.ClientWeb) {
         return Meth.GetTable(MethodBase.GetCurrentMethod(),mtype,dateStart,dateEnd,provNum);
     }
     string command="";
     DataTable tableRaw=new DataTable();
     switch(mtype) {
         case EhrMeasureType.ProblemList:
             command="SELECT PatNum,LName,FName, "
                 +"(SELECT COUNT(*) FROM disease WHERE PatNum=patient.PatNum AND DiseaseDefNum="
                     +POut.Long(PrefC.GetLong(PrefName.ProblemsIndicateNone))+") AS problemsNone, "
                 +"(SELECT COUNT(*) FROM disease WHERE PatNum=patient.PatNum) AS problemsAll "
                 +"FROM patient "
                 +"WHERE EXISTS(SELECT * FROM procedurelog WHERE patient.PatNum=procedurelog.PatNum "
                 +"AND procedurelog.ProcStatus=2 "//complete
                 +"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
                 +"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
                 +"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+")";
             tableRaw=Db.GetTable(command);
             break;
         case EhrMeasureType.MedicationList:
             command="SELECT PatNum,LName,FName, "
                 +"(SELECT COUNT(*) FROM medicationpat WHERE PatNum=patient.PatNum AND MedicationNum="
                     +POut.Long(PrefC.GetLong(PrefName.MedicationsIndicateNone))+") AS medsNone, "
                 +"(SELECT COUNT(*) FROM medicationpat WHERE PatNum=patient.PatNum) AS medsAll "
                 +"FROM patient "
                 +"WHERE EXISTS(SELECT * FROM procedurelog WHERE patient.PatNum=procedurelog.PatNum "
                 +"AND procedurelog.ProcStatus=2 "//complete
                 +"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
                 +"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
                 +"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+")";
             tableRaw=Db.GetTable(command);
             break;
         case EhrMeasureType.AllergyList:
             command="SELECT PatNum,LName,FName, "
                 +"(SELECT COUNT(*) FROM allergy WHERE PatNum=patient.PatNum AND AllergyDefNum="
                     +POut.Long(PrefC.GetLong(PrefName.AllergiesIndicateNone))+") AS allergiesNone, "
                 +"(SELECT COUNT(*) FROM allergy WHERE PatNum=patient.PatNum) AS allergiesAll "
                 +"FROM patient "
                 +"WHERE EXISTS(SELECT * FROM procedurelog WHERE patient.PatNum=procedurelog.PatNum "
                 +"AND procedurelog.ProcStatus=2 "//complete
                 +"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
                 +"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
                 +"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+")";
             tableRaw=Db.GetTable(command);
             break;
         case EhrMeasureType.Demographics:
             //language, gender, race, ethnicity, and birthdate
             command="SELECT PatNum,LName,FName,Birthdate,Gender,Race,Language "
                 +"FROM patient "
                 +"WHERE EXISTS(SELECT * FROM procedurelog WHERE patient.PatNum=procedurelog.PatNum "
                 +"AND procedurelog.ProcStatus=2 "//complete
                 +"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
                 +"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
                 +"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+")";
             tableRaw=Db.GetTable(command);
             break;
         case EhrMeasureType.Education:
             command="SELECT PatNum,LName,FName, "
                 +"(SELECT COUNT(*) FROM ehrmeasureevent WHERE PatNum=patient.PatNum AND EventType="+POut.Int((int)EhrMeasureEventType.EducationProvided)+") AS edCount "
                 +"FROM patient "
                 +"WHERE EXISTS(SELECT * FROM procedurelog WHERE patient.PatNum=procedurelog.PatNum "
                 +"AND procedurelog.ProcStatus=2 "//complete
                 +"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
                 +"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
                 +"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+")";
             tableRaw=Db.GetTable(command);
             break;
         case EhrMeasureType.TimelyAccess:
             //denominator is patients
             command="DROP TABLE IF EXISTS tempehrmeasure";
             Db.NonQ(command);
             command=@"CREATE TABLE tempehrmeasure (
                 PatNum bigint NOT NULL auto_increment PRIMARY KEY,
                 LName varchar(255) NOT NULL,
                 FName varchar(255) NOT NULL,
                 lastVisitDate date NOT NULL,
                 deadlineDate date NOT NULL,
                 accessProvided tinyint NOT NULL
                 ) DEFAULT CHARSET=utf8";
             Db.NonQ(command);
             //get all patients who have been seen during the period, along with the most recent visit date during the period
             command="INSERT INTO tempehrmeasure (PatNum,LName,FName,lastVisitDate) SELECT patient.PatNum,LName,FName, "
                 +"MAX(procedurelog.ProcDate) "
                 +"FROM patient,procedurelog "
                 +"WHERE patient.PatNum=procedurelog.PatNum "
                 +"AND procedurelog.ProcStatus=2 "//complete
                 +"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
                 +"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
                 +"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+" "
                 +"GROUP BY patient.PatNum";
             tableRaw=Db.GetTable(command);
             //calculate the deadlineDate
             command="UPDATE tempehrmeasure "
                 +"SET deadlineDate = ADDDATE(lastVisitDate, INTERVAL 4 DAY)";
             Db.NonQ(command);
             command="UPDATE tempehrmeasure "
                 +"SET deadlineDate = ADDDate(lastVisitDate, INTERVAL 2 DAY) "//add 2 more days for weekend
                 +"WHERE DAYOFWEEK(lastVisitDate) IN(3,4,5,6)";//tues, wed, thur, fri
             Db.NonQ(command);
             //date provided could be any date before deadline date if there was more than one visit
             command="UPDATE tempehrmeasure,ehrmeasureevent SET accessProvided = 1 "
                 +"WHERE ehrmeasureevent.PatNum=tempehrmeasure.PatNum "
                 +"AND EventType="+POut.Int((int)EhrMeasureEventType.OnlineAccessProvided)+" "
                 +"AND DATE(ehrmeasureevent.DateTEvent) <= deadlineDate";
             Db.NonQ(command);
             command="SELECT * FROM tempehrmeasure";
             tableRaw=Db.GetTable(command);
             command="DROP TABLE IF EXISTS tempehrmeasure";
             Db.NonQ(command);
             break;
         case EhrMeasureType.ProvOrderEntry:
             command="SELECT PatNum,LName,FName, "
                 +"(SELECT COUNT(*) FROM medicationpat mp2 WHERE mp2.PatNum=patient.PatNum "
                 +"AND mp2.PatNote != '' AND mp2.DateStart > "+POut.Date(new DateTime(1880,1,1))+") AS countOrders "
                 +"FROM patient "
                 +"WHERE EXISTS(SELECT * FROM procedurelog WHERE patient.PatNum=procedurelog.PatNum "//at least one procedure in the period
                 +"AND procedurelog.ProcStatus=2 "//complete
                 +"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
                 +"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
                 +"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+") "
                 +"AND EXISTS(SELECT * FROM medicationpat WHERE medicationpat.PatNum=patient.PatNum)";//at least one medication
             tableRaw=Db.GetTable(command);
             break;
         case EhrMeasureType.Rx:
             command="SELECT patient.PatNum,LName,FName,SendStatus,RxDate "
                 +"FROM rxpat,patient "
                 +"WHERE rxpat.PatNum=patient.PatNum "
                 +"AND IsControlled = 0 "
                 +"AND rxpat.ProvNum="+POut.Long(provNum)+" "
                 +"AND RxDate >= "+POut.Date(dateStart)+" "
                 +"AND RxDate <= "+POut.Date(dateEnd);
             tableRaw=Db.GetTable(command);
             break;
         case EhrMeasureType.VitalSigns:
             command="SELECT PatNum,LName,FName, "
                 +"(SELECT COUNT(*) FROM vitalsign WHERE vitalsign.PatNum=patient.PatNum AND Height>0 AND Weight>0) AS hwCount, "
                 +"(SELECT COUNT(*) FROM vitalsign WHERE vitalsign.PatNum=patient.PatNum AND BpSystolic>0 AND BpDiastolic>0) AS bpCount "
                 +"FROM patient "
                 +"WHERE EXISTS(SELECT * FROM procedurelog WHERE patient.PatNum=procedurelog.PatNum "
                 +"AND procedurelog.ProcStatus=2 "//complete
                 +"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
                 +"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
                 +"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+") "
                 +"AND patient.Birthdate <= "+POut.Date(DateTime.Today.AddYears(-2));//2 and older
             tableRaw=Db.GetTable(command);
             break;
         case EhrMeasureType.Smoking:
             command="SELECT PatNum,LName,FName,SmokeStatus "
                 +"FROM patient "
                 +"WHERE EXISTS(SELECT * FROM procedurelog WHERE patient.PatNum=procedurelog.PatNum "
                 +"AND procedurelog.ProcStatus=2 "//complete
                 +"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
                 +"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
                 +"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+") "
                 +"AND patient.Birthdate <= "+POut.Date(DateTime.Today.AddYears(-13));//13 and older
             tableRaw=Db.GetTable(command);
             break;
         case EhrMeasureType.Lab:
             command="SELECT patient.PatNum,LName,FName,DateTimeOrder, "
                 +"(SELECT COUNT(*) FROM labpanel WHERE labpanel.MedicalOrderNum=medicalorder.MedicalOrderNum) AS panelCount "
                 +"FROM medicalorder,patient "
                 +"WHERE medicalorder.PatNum=patient.PatNum "
                 +"AND MedOrderType="+POut.Int((int)MedicalOrderType.Laboratory)+" "
                 +"AND medicalorder.ProvNum="+POut.Long(provNum)+" "
                 +"AND DATE(DateTimeOrder) >= "+POut.Date(dateStart)+" "
                 +"AND DATE(DateTimeOrder) <= "+POut.Date(dateEnd);
             tableRaw=Db.GetTable(command);
             break;
         case EhrMeasureType.ElectronicCopy:
             command="DROP TABLE IF EXISTS tempehrmeasure";
             Db.NonQ(command);
             command=@"CREATE TABLE tempehrmeasure (
                 TempEhrMeasureNum bigint NOT NULL auto_increment PRIMARY KEY,
                 PatNum bigint NOT NULL,
                 LName varchar(255) NOT NULL,
                 FName varchar(255) NOT NULL,
                 dateRequested date NOT NULL,
                 dateDeadline date NOT NULL,
                 copyProvided tinyint NOT NULL,
                 INDEX(PatNum)
                 ) DEFAULT CHARSET=utf8";
             Db.NonQ(command);
             command="INSERT INTO tempehrmeasure (PatNum,LName,FName,dateRequested) SELECT patient.PatNum,LName,FName,DATE(DateTEvent) "
                 +"FROM ehrmeasureevent,patient "
                 +"WHERE patient.PatNum=ehrmeasureevent.PatNum "
                 +"AND EventType="+POut.Int((int)EhrMeasureEventType.ElectronicCopyRequested)+" "
                 +"AND DATE(DateTEvent) >= "+POut.Date(dateStart)+" "
                 +"AND DATE(DateTEvent) <= "+POut.Date(dateEnd)+" "
                 +"AND patient.PriProv="+POut.Long(provNum);
             Db.NonQ(command);
             command="UPDATE tempehrmeasure "
                 +"SET dateDeadline = ADDDATE(dateRequested, INTERVAL 3 DAY)";
             Db.NonQ(command);
             command="UPDATE tempehrmeasure "
                 +"SET dateDeadline = ADDDate(dateDeadline, INTERVAL 2 DAY) "//add 2 more days for weekend
                 +"WHERE DAYOFWEEK(dateRequested) IN(4,5,6)";//wed, thur, fri
             Db.NonQ(command);
             command="UPDATE tempehrmeasure,ehrmeasureevent SET copyProvided = 1 "
                 +"WHERE ehrmeasureevent.PatNum=tempehrmeasure.PatNum AND EventType="+POut.Int((int)EhrMeasureEventType.ElectronicCopyProvidedToPt)+" "
                 +"AND DATE(ehrmeasureevent.DateTEvent) >= dateRequested "
                 +"AND DATE(ehrmeasureevent.DateTEvent) <= dateDeadline";
             Db.NonQ(command);
             command="SELECT * FROM tempehrmeasure";
             tableRaw=Db.GetTable(command);
             command="DROP TABLE IF EXISTS tempehrmeasure";
             Db.NonQ(command);
             break;
         case EhrMeasureType.ClinicalSummaries:
             command="DROP TABLE IF EXISTS tempehrmeasure";
             Db.NonQ(command);
             command=@"CREATE TABLE tempehrmeasure (
                 TempEhrMeasureNum bigint NOT NULL auto_increment PRIMARY KEY,
                 PatNum bigint NOT NULL,
                 LName varchar(255) NOT NULL,
                 FName varchar(255) NOT NULL,
                 visitDate date NOT NULL,
                 deadlineDate date NOT NULL,
                 summaryProvided tinyint NOT NULL,
                 INDEX(PatNum)
                 ) DEFAULT CHARSET=utf8";
             Db.NonQ(command);
             command="INSERT INTO tempehrmeasure (PatNum,LName,FName,visitDate) SELECT patient.PatNum,LName,FName,ProcDate "
                 +"FROM procedurelog "
                 +"LEFT JOIN patient ON patient.PatNum=procedurelog.PatNum "
                 +"WHERE ProcDate >= "+POut.Date(dateStart)+" "
                 +"AND ProcDate <= "+POut.Date(dateEnd)+" "
                 +"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
                 +"GROUP BY procedurelog.PatNum,ProcDate";
             Db.NonQ(command);
             command="UPDATE tempehrmeasure "
                 +"SET deadlineDate = ADDDATE(visitDate, INTERVAL 3 DAY)";
             Db.NonQ(command);
             command="UPDATE tempehrmeasure "
                 +"SET DeadlineDate = ADDDate(deadlineDate, INTERVAL 2 DAY) "//add 2 more days for weekend
                 +"WHERE DAYOFWEEK(visitDate) IN(4,5,6)";//wed, thur, fri
             Db.NonQ(command);
             command="UPDATE tempehrmeasure,ehrmeasureevent SET summaryProvided = 1 "
                 +"WHERE ehrmeasureevent.PatNum=tempehrmeasure.PatNum AND EventType="+POut.Int((int)EhrMeasureEventType.ClinicalSummaryProvidedToPt)+" "
                 +"AND DATE(ehrmeasureevent.DateTEvent) >= visitDate "
                 +"AND DATE(ehrmeasureevent.DateTEvent) <= deadlineDate";
             Db.NonQ(command);
             command="SELECT * FROM tempehrmeasure";
             tableRaw=Db.GetTable(command);
             command="DROP TABLE IF EXISTS tempehrmeasure";
             Db.NonQ(command);
             break;
         case EhrMeasureType.Reminders:
             command="SELECT PatNum,LName,FName, "
                 +"(SELECT COUNT(*) FROM ehrmeasureevent WHERE PatNum=patient.PatNum AND EventType="+POut.Int((int)EhrMeasureEventType.ReminderSent)+" "
                 +"AND DATE(ehrmeasureevent.DateTEvent) >= "+POut.Date(dateStart)+" "
                 +"AND DATE(ehrmeasureevent.DateTEvent) <= "+POut.Date(dateEnd)+" "
                 +") AS reminderCount "
                 +"FROM patient "
                 +"WHERE patient.Birthdate > '1880-01-01' "//a birthdate is entered
                 +"AND (patient.Birthdate > "+POut.Date(DateTime.Today.AddYears(-6))+" "//5 years or younger
                 +"OR patient.Birthdate <= "+POut.Date(DateTime.Today.AddYears(-65))+") "//65+
                 +"AND patient.PatStatus="+POut.Int((int)PatientStatus.Patient)+" "
                 +"AND patient.PriProv="+POut.Long(provNum);
             tableRaw=Db.GetTable(command);
             break;
         case EhrMeasureType.MedReconcile:
             command="DROP TABLE IF EXISTS tempehrmeasure";
             Db.NonQ(command);
             command=@"CREATE TABLE tempehrmeasure (
                 PatNum bigint NOT NULL PRIMARY KEY,
                 LName varchar(255) NOT NULL,
                 FName varchar(255) NOT NULL,
                 RefCount int NOT NULL,
                 ReconcileCount int NOT NULL
                 ) DEFAULT CHARSET=utf8";
             Db.NonQ(command);
             command="INSERT INTO tempehrmeasure (PatNum,LName,FName,RefCount) SELECT patient.PatNum,LName,FName,COUNT(*) "
                 +"FROM refattach,patient "
                 +"WHERE patient.PatNum=refattach.PatNum "
                 +"AND patient.PriProv="+POut.Long(provNum)+" "
                 +"AND RefDate >= "+POut.Date(dateStart)+" "
                 +"AND RefDate <= "+POut.Date(dateEnd)+" "
                 +"AND IsFrom=1 AND IsTransitionOfCare=1 "
                 +"GROUP BY refattach.PatNum";
             Db.NonQ(command);
             command="UPDATE tempehrmeasure "
                 +"SET ReconcileCount = (SELECT COUNT(*) FROM ehrmeasureevent "
                 +"WHERE ehrmeasureevent.PatNum=tempehrmeasure.PatNum AND EventType="+POut.Int((int)EhrMeasureEventType.MedicationReconcile)+" "
                 +"AND DATE(ehrmeasureevent.DateTEvent) >= "+POut.Date(dateStart)+" "
                 +"AND DATE(ehrmeasureevent.DateTEvent) <= "+POut.Date(dateEnd)+")";
             Db.NonQ(command);
             command="SELECT * FROM tempehrmeasure";
             tableRaw=Db.GetTable(command);
             command="DROP TABLE IF EXISTS tempehrmeasure";
             Db.NonQ(command);
             break;
         case EhrMeasureType.SummaryOfCare:
             command="DROP TABLE IF EXISTS tempehrmeasure";
             Db.NonQ(command);
             command=@"CREATE TABLE tempehrmeasure (
                 PatNum bigint NOT NULL PRIMARY KEY,
                 LName varchar(255) NOT NULL,
                 FName varchar(255) NOT NULL,
                 RefCount int NOT NULL,
                 CcdCount int NOT NULL
                 ) DEFAULT CHARSET=utf8";
             Db.NonQ(command);
             command="INSERT INTO tempehrmeasure (PatNum,LName,FName,RefCount) SELECT patient.PatNum,LName,FName,COUNT(*) "
                 +"FROM refattach,patient "
                 +"WHERE patient.PatNum=refattach.PatNum "
                 +"AND patient.PriProv="+POut.Long(provNum)+" "
                 +"AND RefDate >= "+POut.Date(dateStart)+" "
                 +"AND RefDate <= "+POut.Date(dateEnd)+" "
                 +"AND IsFrom=0 AND IsTransitionOfCare=1 "
                 +"GROUP BY refattach.PatNum";
             Db.NonQ(command);
             command="UPDATE tempehrmeasure "
                 +"SET CcdCount = (SELECT COUNT(*) FROM ehrmeasureevent "
                 +"WHERE ehrmeasureevent.PatNum=tempehrmeasure.PatNum AND EventType="+POut.Int((int)EhrMeasureEventType.SummaryOfCareProvidedToDr)+" "
                 +"AND DATE(ehrmeasureevent.DateTEvent) >= "+POut.Date(dateStart)+" "
                 +"AND DATE(ehrmeasureevent.DateTEvent) <= "+POut.Date(dateEnd)+")";
             Db.NonQ(command);
             command="SELECT * FROM tempehrmeasure";
             tableRaw=Db.GetTable(command);
             command="DROP TABLE IF EXISTS tempehrmeasure";
             Db.NonQ(command);
             break;
         default:
             throw new ApplicationException("Type not found: "+mtype.ToString());
     }
     //PatNum, PatientName, Explanation, and Met (X).
     DataTable table=new DataTable("audit");
     DataRow row;
     table.Columns.Add("PatNum");
     table.Columns.Add("patientName");
     table.Columns.Add("explanation");
     table.Columns.Add("met");//X or empty
     List<DataRow> rows=new List<DataRow>();
     Patient pat;
     string explanation;
     for(int i=0;i<tableRaw.Rows.Count;i++) {
         row=table.NewRow();
         row["PatNum"]=tableRaw.Rows[i]["PatNum"].ToString();
         pat=new Patient();
         pat.LName=tableRaw.Rows[i]["LName"].ToString();
         pat.FName=tableRaw.Rows[i]["FName"].ToString();
         pat.Preferred="";
         row["patientName"]=pat.GetNameLF();
         row["met"]="";
         explanation="";
         switch(mtype) {
             case EhrMeasureType.ProblemList:
                 if(tableRaw.Rows[i]["problemsNone"].ToString()!="0") {
                     explanation="Problems indicated 'None'";
                     row["met"]="X";
                 }
                 else if(tableRaw.Rows[i]["problemsAll"].ToString()!="0") {
                     explanation="Problems entered: "+tableRaw.Rows[i]["problemsAll"].ToString();
                     row["met"]="X";
                 }
                 else{
                     explanation="No Problems entered";
                 }
                 break;
             case EhrMeasureType.MedicationList:
                 if(tableRaw.Rows[i]["medsNone"].ToString()!="0") {
                     explanation="Medications indicated 'None'";
                     row["met"]="X";
                 }
                 else if(tableRaw.Rows[i]["medsAll"].ToString()!="0") {
                     explanation="Medications entered: "+tableRaw.Rows[i]["medsAll"].ToString();
                     row["met"]="X";
                 }
                 else {
                     explanation="No Medications entered";
                 }
                 break;
             case EhrMeasureType.AllergyList:
                 if(tableRaw.Rows[i]["allergiesNone"].ToString()!="0") {
                     explanation="Allergies indicated 'None'";
                     row["met"]="X";
                 }
                 else if(tableRaw.Rows[i]["allergiesAll"].ToString()!="0") {
                     explanation="Allergies entered: "+tableRaw.Rows[i]["allergiesAll"].ToString();
                     row["met"]="X";
                 }
                 else {
                     explanation="No Allergies entered";
                 }
                 break;
             case EhrMeasureType.Demographics:
                 if(PIn.Date(tableRaw.Rows[i]["Birthdate"].ToString()).Year<1880) {
                     explanation+="birthdate";//missing
                 }
                 if(tableRaw.Rows[i]["Language"].ToString()=="") {
                     if(explanation!="") {
                         explanation+=", ";
                     }
                     explanation+="language";
                 }
                 if(PIn.Int(tableRaw.Rows[i]["Gender"].ToString())==(int)PatientGender.Unknown) {
                     if(explanation!="") {
                         explanation+=", ";
                     }
                     explanation+="gender";
                 }
                 if(tableRaw.Rows[i]["Race"].ToString()=="0") {
                     if(explanation!="") {
                         explanation+=", ";
                     }
                     explanation+="race, ethnicity";
                 }
                 if(explanation=="") {
                     explanation="All demographic elements recorded";
                     row["met"]="X";
                 }
                 else {
                     explanation="Missing: "+explanation;
                 }
                 break;
             case EhrMeasureType.Education:
                 if(tableRaw.Rows[i]["edCount"].ToString()=="0") {
                     explanation="No education resources";
                 }
                 else {
                     explanation="Education resources provided";
                     row["met"]="X";
                 }
                 break;
             case EhrMeasureType.TimelyAccess:
                 DateTime lastVisitDate=PIn.Date(tableRaw.Rows[i]["lastVisitDate"].ToString());
                 DateTime deadlineDate=PIn.Date(tableRaw.Rows[i]["deadlineDate"].ToString());
                 if(tableRaw.Rows[i]["accessProvided"].ToString()=="0") {
                     explanation=lastVisitDate.ToShortDateString()+" no online access provided";
                 }
                 else {
                     explanation="Online access provided before "+deadlineDate.ToShortDateString();
                     row["met"]="X";
                 }
                 break;
             case EhrMeasureType.ProvOrderEntry:
                 if(tableRaw.Rows[i]["countOrders"].ToString()=="0") {
                     explanation="No medication order through CPOE";
                 }
                 else {
                     explanation="Medication order in CPOE";
                     row["met"]="X";
                 }
                 break;
             case EhrMeasureType.Rx:
                 RxSendStatus sendStatus=(RxSendStatus)PIn.Int(tableRaw.Rows[i]["SendStatus"].ToString());
                 DateTime rxDate=PIn.Date(tableRaw.Rows[i]["rxDate"].ToString());
                 if(sendStatus==RxSendStatus.SentElect) {
                     explanation=rxDate.ToShortDateString()+" Rx sent electronically.";
                     row["met"]="X";
                 }
                 else {
                     explanation=rxDate.ToShortDateString()+" Rx not sent electronically.";
                 }
                 break;
             case EhrMeasureType.VitalSigns:
                 if(tableRaw.Rows[i]["hwCount"].ToString()=="0") {
                     explanation+="height, weight";
                 }
                 if(tableRaw.Rows[i]["bpCount"].ToString()=="0") {
                     if(explanation!="") {
                         explanation+=", ";
                     }
                     explanation+="blood pressure";
                 }
                 if(explanation=="") {
                     explanation="Vital signs entered";
                     row["met"]="X";
                 }
                 else {
                     explanation="Missing: "+explanation;
                 }
                 break;
             case EhrMeasureType.Smoking:
                 SmokingStatus smokeStatus=(SmokingStatus)PIn.Int(tableRaw.Rows[i]["SmokeStatus"].ToString());
                 if(smokeStatus==SmokingStatus.UnknownIfEver_Recode9) {
                     explanation+="Smoking status not entered.";
                 }
                 else{
                     explanation="Smoking status entered.";
                     row["met"]="X";
                 }
                 break;
             case EhrMeasureType.Lab:
                 int panelCount=PIn.Int(tableRaw.Rows[i]["panelCount"].ToString());
                 DateTime dateOrder=PIn.Date(tableRaw.Rows[i]["DateTimeOrder"].ToString());
                 if(panelCount==0) {
                     explanation+=dateOrder.ToShortDateString()+" results not attached.";
                 }
                 else {
                     explanation=dateOrder.ToShortDateString()+" results attached.";
                     row["met"]="X";
                 }
                 break;
             case EhrMeasureType.ElectronicCopy:
                 DateTime dateRequested=PIn.Date(tableRaw.Rows[i]["dateRequested"].ToString());
                 if(tableRaw.Rows[i]["copyProvided"].ToString()=="0") {
                     explanation=dateRequested.ToShortDateString()+" no copy provided to patient";
                 }
                 else {
                     explanation=dateRequested.ToShortDateString()+" copy provided to patient";
                     row["met"]="X";
                 }
                 break;
             case EhrMeasureType.ClinicalSummaries:
                 DateTime visitDate=PIn.Date(tableRaw.Rows[i]["visitDate"].ToString());
                 if(tableRaw.Rows[i]["summaryProvided"].ToString()=="0") {
                     explanation=visitDate.ToShortDateString()+" no summary provided to patient";
                 }
                 else {
                     explanation=visitDate.ToShortDateString()+" summary provided to patient";
                     row["met"]="X";
                 }
                 break;
             case EhrMeasureType.Reminders:
                 if(tableRaw.Rows[i]["reminderCount"].ToString()=="0") {
                     explanation="No reminders sent";
                 }
                 else {
                     explanation="Reminders sent";
                     row["met"]="X";
                 }
                 break;
             case EhrMeasureType.MedReconcile:
                 int refCount=PIn.Int(tableRaw.Rows[i]["RefCount"].ToString());//this will always be greater than zero
                 int reconcileCount=PIn.Int(tableRaw.Rows[i]["ReconcileCount"].ToString());
                 if(reconcileCount<refCount) {
                     explanation="Transitions of Care:"+refCount.ToString()+", Reconciles:"+reconcileCount.ToString();
                 }
                 else {
                     explanation="Reconciles performed for each transition of care.";
                     row["met"]="X";
                 }
                 break;
             case EhrMeasureType.SummaryOfCare:
                 int refCount2=PIn.Int(tableRaw.Rows[i]["RefCount"].ToString());//this will always be greater than zero
                 int ccdCount=PIn.Int(tableRaw.Rows[i]["CcdCount"].ToString());
                 if(ccdCount<refCount2) {
                     explanation="Transitions of Care:"+refCount2.ToString()+", Summaries provided:"+ccdCount.ToString();
                 }
                 else {
                     explanation="Summaries provided for each transition of care.";
                     row["met"]="X";
                 }
                 break;
             default:
                 throw new ApplicationException("Type not found: "+mtype.ToString());
         }
         row["explanation"]=explanation;
         rows.Add(row);
     }
     for(int i=0;i<rows.Count;i++) {
         table.Rows.Add(rows[i]);
     }
     return table;
 }
示例#22
0
		public static DataTable GetTable(QualityType qtype,DateTime dateStart,DateTime dateEnd,long provNum) {
			if(RemotingClient.RemotingRole==RemotingRole.ClientWeb) {
				return Meth.GetTable(MethodBase.GetCurrentMethod(),qtype,dateStart,dateEnd,provNum);
			}
			//these queries only work for mysql
			string command="";
			DataTable tableRaw=new DataTable();
			switch(qtype) {
				#region WeightOver65
				case QualityType.WeightOver65:
					//WeightOver65-------------------------------------------------------------------------------------------------------------------
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					command=@"CREATE TABLE tempehrquality (
						PatNum bigint NOT NULL PRIMARY KEY,
						LName varchar(255) NOT NULL,
						FName varchar(255) NOT NULL,
						DateVisit date NOT NULL DEFAULT '0001-01-01',
						Height float NOT NULL,
						Weight float NOT NULL,
						HasFollowupPlan tinyint NOT NULL,
						IsIneligible tinyint NOT NULL,
						Documentation varchar(255) NOT NULL
						) DEFAULT CHARSET=utf8";
					Db.NonQ(command);
					command="INSERT INTO tempehrquality (PatNum,LName,FName,DateVisit) SELECT patient.PatNum,LName,FName,"
						+"MAX(ProcDate) "//on the first pass, all we can obtain is the date of the visit
						+"FROM patient "
						+"INNER JOIN procedurelog "//because we want to restrict to only results with procedurelog
						+"ON Patient.PatNum=procedurelog.PatNum "
						+"AND procedurelog.ProcStatus=2 "//complete
						+"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
						+"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
						+"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+" "
						+"WHERE Birthdate > '1880-01-01' AND Birthdate <= "+POut.Date(DateTime.Today.AddYears(-65))+" "//65 or older
						+"GROUP BY patient.PatNum";//there will frequently be multiple procedurelog events
					Db.NonQ(command);
					//now, find BMIs within 6 months of each visit date. No logic for picking one of multiple BMIs.
					command="UPDATE tempehrquality,vitalsign "
						+"SET tempehrquality.Height=vitalsign.Height, "
						+"tempehrquality.Weight=vitalsign.Weight, "//we could also easily get the BMI date if we wanted.
						+"tempehrquality.HasFollowupPlan=vitalsign.HasFollowupPlan, "
						+"tempehrquality.IsIneligible=vitalsign.IsIneligible, "
						+"tempehrquality.Documentation=vitalsign.Documentation "
						+"WHERE tempehrquality.PatNum=vitalsign.PatNum "
						+"AND vitalsign.DateTaken <= tempehrquality.DateVisit "
						+"AND vitalsign.DateTaken >= DATE_SUB(tempehrquality.DateVisit,INTERVAL 6 MONTH)";
					Db.NonQ(command);
					command="SELECT * FROM tempehrquality";
					tableRaw=Db.GetTable(command);
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					break;
				#endregion
				#region WeightAdult
				case QualityType.WeightAdult:
					//WeightAdult---------------------------------------------------------------------------------------------------------------------
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					command=@"CREATE TABLE tempehrquality (
						PatNum bigint NOT NULL PRIMARY KEY,
						LName varchar(255) NOT NULL,
						FName varchar(255) NOT NULL,
						DateVisit date NOT NULL DEFAULT '0001-01-01',
						Height float NOT NULL,
						Weight float NOT NULL,
						HasFollowupPlan tinyint NOT NULL,
						IsIneligible tinyint NOT NULL,
						Documentation varchar(255) NOT NULL
						) DEFAULT CHARSET=utf8";
					Db.NonQ(command);
					command="INSERT INTO tempehrquality (PatNum,LName,FName,DateVisit) SELECT patient.PatNum,LName,FName,"
						+"MAX(ProcDate) "//on the first pass, all we can obtain is the date of the visit
						+"FROM patient "
						+"INNER JOIN procedurelog "//because we want to restrict to only results with procedurelog
						+"ON Patient.PatNum=procedurelog.PatNum "
						+"AND procedurelog.ProcStatus=2 "//complete
						+"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
						+"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
						+"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+" "
						+"WHERE Birthdate <= "+POut.Date(DateTime.Today.AddYears(-18))+" "//18+
						+"AND Birthdate > "+POut.Date(DateTime.Today.AddYears(-65))+" "//less than 65
						+"GROUP BY patient.PatNum";//there will frequently be multiple procedurelog events
					Db.NonQ(command);
					//now, find BMIs within 6 months of each visit date. No logic for picking one of multiple BMIs.
					command="UPDATE tempehrquality,vitalsign "
						+"SET tempehrquality.Height=vitalsign.Height, "
						+"tempehrquality.Weight=vitalsign.Weight, "
						+"tempehrquality.HasFollowupPlan=vitalsign.HasFollowupPlan, "
						+"tempehrquality.IsIneligible=vitalsign.IsIneligible, "
						+"tempehrquality.Documentation=vitalsign.Documentation "
						+"WHERE tempehrquality.PatNum=vitalsign.PatNum "
						+"AND vitalsign.DateTaken <= tempehrquality.DateVisit "
						+"AND vitalsign.DateTaken >= DATE_SUB(tempehrquality.DateVisit,INTERVAL 6 MONTH)";
					Db.NonQ(command);
					command="SELECT * FROM tempehrquality";
					tableRaw=Db.GetTable(command);
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					break;
				#endregion
				#region Hypertension
				case QualityType.Hypertension:
					//Hypertension---------------------------------------------------------------------------------------------------------------------
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					command=@"CREATE TABLE tempehrquality (
						PatNum bigint NOT NULL PRIMARY KEY,
						LName varchar(255) NOT NULL,
						FName varchar(255) NOT NULL,
						DateVisit date NOT NULL DEFAULT '0001-01-01',
						VisitCount int NOT NULL,
						Icd9Code varchar(255) NOT NULL,
						DateBpEntered date NOT NULL DEFAULT '0001-01-01'
						) DEFAULT CHARSET=utf8";
					Db.NonQ(command);
					command="INSERT INTO tempehrquality (PatNum,LName,FName,DateVisit,VisitCount,Icd9Code) "
						+"SELECT patient.PatNum,LName,FName,"
						+"MAX(ProcDate), "// most recent visit
						+"COUNT(DISTINCT ProcDate),diseasedef.ICD9Code "
						+"FROM patient "
						+"INNER JOIN procedurelog "
						+"ON Patient.PatNum=procedurelog.PatNum "
						+"AND procedurelog.ProcStatus=2 "//complete
						+"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
						+"LEFT JOIN disease ON disease.PatNum=patient.PatNum "
						+"AND disease.DiseaseDefNum IN (SELECT DiseaseDefNum FROM diseasedef WHERE ICD9Code REGEXP '^40[1-4]') "//starts with 401 through 404
						//+"LEFT JOIN icd9 ON icd9.ICD9Num=disease.ICD9Num "
						+"LEFT JOIN diseasedef ON diseasedef.DiseaseDefNum=disease.DiseaseDefNum "
						//+"AND icd9.ICD9Code REGEXP '^40[1-4]' "//starts with 401 through 404
						+"WHERE Birthdate <= "+POut.Date(DateTime.Today.AddYears(-18))+" "//18+
						+"GROUP BY patient.PatNum";
					Db.NonQ(command);
					//now, find BMIs in measurement period.
					command="UPDATE tempehrquality,vitalsign "
						+"SET tempehrquality.DateBpEntered=vitalsign.DateTaken "
						+"WHERE tempehrquality.PatNum=vitalsign.PatNum "
						+"AND vitalsign.BpSystolic != 0 "
						+"AND vitalsign.BpDiastolic != 0 "
						+"AND vitalsign.DateTaken >= "+POut.Date(dateStart)+" "
						+"AND vitalsign.DateTaken <= "+POut.Date(dateEnd);
					Db.NonQ(command);
					command="SELECT * FROM tempehrquality";
					tableRaw=Db.GetTable(command);
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					break;
				#endregion
				#region TobaccoUse
				case QualityType.TobaccoUse:
					//TobaccoUse---------------------------------------------------------------------------------------------------------------------
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					command=@"CREATE TABLE tempehrquality (
						PatNum bigint NOT NULL PRIMARY KEY,
						LName varchar(255) NOT NULL,
						FName varchar(255) NOT NULL,
						DateVisit date NOT NULL DEFAULT '0001-01-01',
						VisitCount int NOT NULL,
						DateAssessment date NOT NULL DEFAULT '0001-01-01'
						) DEFAULT CHARSET=utf8";
					Db.NonQ(command);
					command="INSERT INTO tempehrquality (PatNum,LName,FName,DateVisit,VisitCount) "
						+"SELECT patient.PatNum,LName,FName,"
						+"MAX(ProcDate), "// most recent visit
						+"COUNT(DISTINCT ProcDate) "
						+"FROM patient "
						+"INNER JOIN procedurelog "
						+"ON Patient.PatNum=procedurelog.PatNum "
						+"AND procedurelog.ProcStatus=2 "//complete
						+"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
						+"WHERE Birthdate <= "+POut.Date(DateTime.Today.AddYears(-18))+" "//18+
						+"GROUP BY patient.PatNum";
					Db.NonQ(command);
					//now, find most recent tobacco assessment date.  We will check later that it is within 2 years of last exam.
					command="UPDATE tempehrquality "//,ehrmeasureevent "
						+"SET tempehrquality.DateAssessment=(SELECT MAX(DATE(ehrmeasureevent.DateTEvent)) "
						+"FROM ehrmeasureevent "
						+"WHERE tempehrquality.PatNum=ehrmeasureevent.PatNum "
						+"AND ehrmeasureevent.EventType="+POut.Int((int)EhrMeasureEventType.TobaccoUseAssessed)+")";
					Db.NonQ(command);
					command="UPDATE tempehrquality SET DateAssessment='0001-01-01' WHERE DateAssessment='0000-00-00'";
					Db.NonQ(command);
					command="SELECT * FROM tempehrquality";
					tableRaw=Db.GetTable(command);
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					break;
				#endregion
				#region TobaccoCessation
				case QualityType.TobaccoCessation:
					//TobaccoCessation----------------------------------------------------------------------------------------------------------------
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					command=@"CREATE TABLE tempehrquality (
						PatNum bigint NOT NULL PRIMARY KEY,
						LName varchar(255) NOT NULL,
						FName varchar(255) NOT NULL,
						DateVisit date NOT NULL DEFAULT '0001-01-01',
						DateAssessment date NOT NULL DEFAULT '0001-01-01',
						DateCessation date NOT NULL DEFAULT '0001-01-01',
						Documentation varchar(255) NOT NULL
						) DEFAULT CHARSET=utf8";
					Db.NonQ(command);
					command="INSERT INTO tempehrquality (PatNum,LName,FName,DateVisit) "
						+"SELECT patient.PatNum,LName,FName,"
						+"MAX(ProcDate) "// most recent visit
						+"FROM patient "
						+"INNER JOIN procedurelog "
						+"ON Patient.PatNum=procedurelog.PatNum "
						+"AND procedurelog.ProcStatus=2 "//complete
						+"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
						+"WHERE Birthdate <= "+POut.Date(DateTime.Today.AddYears(-18))+" "//18+
						+"AND patient.SmokingSnoMed IN('"+POut.String(SmokingSnoMed._449868002.ToString().Substring(1))+"','"
						+POut.String(SmokingSnoMed._428041000124106.ToString().Substring(1))+"','"
						+POut.String(SmokingSnoMed._428061000124105.ToString().Substring(1))+"','"
						+POut.String(SmokingSnoMed._428071000124103.ToString().Substring(1))+"') "//CurrentEveryDay,CurrentSomeDay,LightSmoker,HeavySmoker
						+"GROUP BY patient.PatNum";
					Db.NonQ(command);
					//find most recent tobacco assessment date.
					command="UPDATE tempehrquality "
						+"SET tempehrquality.DateAssessment=(SELECT MAX(DATE(ehrmeasureevent.DateTEvent)) "
						+"FROM ehrmeasureevent "
						+"WHERE tempehrquality.PatNum=ehrmeasureevent.PatNum "
						+"AND ehrmeasureevent.EventType="+POut.Int((int)EhrMeasureEventType.TobaccoUseAssessed)+")";
					Db.NonQ(command);
					command="UPDATE tempehrquality SET DateAssessment='0001-01-01' WHERE DateAssessment='0000-00-00'";
					Db.NonQ(command);
					//find most recent tobacco cessation date.
					command="UPDATE tempehrquality "
						+"SET tempehrquality.DateCessation=(SELECT MAX(DATE(ehrmeasureevent.DateTEvent)) "
						+"FROM ehrmeasureevent "
						+"WHERE tempehrquality.PatNum=ehrmeasureevent.PatNum "
						+"AND ehrmeasureevent.EventType="+POut.Int((int)EhrMeasureEventType.TobaccoCessation)+")";
					Db.NonQ(command);
					command="UPDATE tempehrquality SET DateCessation='0001-01-01' WHERE DateCessation='0000-00-00'";
					Db.NonQ(command);
					//Pull the documentation based on date
					command="UPDATE tempehrquality "
						+"SET Documentation=(SELECT ehrmeasureevent.MoreInfo "
						+"FROM ehrmeasureevent "
						+"WHERE tempehrquality.PatNum=ehrmeasureevent.PatNum "
						+"AND ehrmeasureevent.EventType="+POut.Int((int)EhrMeasureEventType.TobaccoCessation)+" "
						+"AND DATE(ehrmeasureevent.DateTEvent)=tempehrquality.DateCessation) "
						+"WHERE DateCessation > '1880-01-01'";
					Db.NonQ(command);
					command="SELECT * FROM tempehrquality";
					tableRaw=Db.GetTable(command);
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					break;
				#endregion
				#region InfluenzaAdult
				case QualityType.InfluenzaAdult:
					//InfluenzaAdult----------------------------------------------------------------------------------------------------------------
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					command=@"CREATE TABLE tempehrquality (
						PatNum bigint NOT NULL PRIMARY KEY,
						LName varchar(255) NOT NULL,
						FName varchar(255) NOT NULL,
						DateVaccine date NOT NULL,
						NotGiven tinyint NOT NULL,
						Documentation varchar(255) NOT NULL
						) DEFAULT CHARSET=utf8";
					Db.NonQ(command);
					command="INSERT INTO tempehrquality (PatNum,LName,FName) SELECT patient.PatNum,LName,FName "
						+"FROM patient "
						+"INNER JOIN procedurelog "
						+"ON Patient.PatNum=procedurelog.PatNum "
						+"AND procedurelog.ProcStatus=2 "//complete
						+"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
						+"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
						+"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+" "
						+"WHERE Birthdate > '1880-01-01' AND Birthdate <= "+POut.Date(DateTime.Today.AddYears(-50))+" "//50 or older
						+"GROUP BY patient.PatNum";
					Db.NonQ(command);
					//find most recent vaccine date
					command="UPDATE tempehrquality "
						+"SET tempehrquality.DateVaccine=(SELECT MAX(DATE(vaccinepat.DateTimeStart)) "
						+"FROM vaccinepat,vaccinedef "
						+"WHERE vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"AND tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND vaccinedef.CVXCode IN('135','15'))";
					Db.NonQ(command);
					command="UPDATE tempehrquality SET DateVaccine='0001-01-01' WHERE DateVaccine='0000-00-00'";
					Db.NonQ(command);
					//pull documentation on vaccine exclusions based on date.
					command="UPDATE tempehrquality,vaccinepat,vaccinedef "
						+"SET Documentation=Note, "
						+"tempehrquality.NotGiven=vaccinepat.NotGiven "
						+"WHERE tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"AND DATE(vaccinepat.DateTimeStart)=tempehrquality.DateVaccine "
						+"AND vaccinedef.CVXCode IN('135','15')";
					Db.NonQ(command);
					command="SELECT * FROM tempehrquality";
					tableRaw=Db.GetTable(command);
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					break;
				#endregion
				#region WeightChild_1
				case QualityType.WeightChild_1_1:
				case QualityType.WeightChild_1_2:
				case QualityType.WeightChild_1_3:
					//WeightChild_1-----------------------------------------------------------------------------------------------------------------
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					command=@"CREATE TABLE tempehrquality (
						PatNum bigint NOT NULL PRIMARY KEY,
						LName varchar(255) NOT NULL,
						FName varchar(255) NOT NULL,
						IsPregnant tinyint NOT NULL,
						HasBMI tinyint NOT NULL,
						ChildGotNutrition tinyint NOT NULL,
						ChildGotPhysCouns tinyint NOT NULL				
						) DEFAULT CHARSET=utf8";
					Db.NonQ(command);
					command="INSERT INTO tempehrquality (PatNum,LName,FName) SELECT patient.PatNum,LName,FName "
						+"FROM patient "
						+"INNER JOIN procedurelog "
						+"ON Patient.PatNum=procedurelog.PatNum "
						+"AND procedurelog.ProcStatus=2 "//complete
						+"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
						+"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
						+"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+" "
						+"WHERE Birthdate <= "+POut.Date(DateTime.Today.AddYears(-2))+" "//2+
						+"AND Birthdate > "+POut.Date(DateTime.Today.AddYears(-17))+" "//less than 17
						+"GROUP BY patient.PatNum";//there will frequently be multiple procedurelog events
					Db.NonQ(command);
					//find any BMIs within the period that indicate pregnancy
					command="UPDATE tempehrquality,vitalsign "
						+"SET tempehrquality.IsPregnant=1 "
						+"WHERE tempehrquality.PatNum=vitalsign.PatNum "
						+"AND vitalsign.DateTaken >= "+POut.Date(dateStart)+" "
						+"AND vitalsign.DateTaken <= "+POut.Date(dateEnd)+" "
						+"AND vitalsign.IsIneligible=1";
					Db.NonQ(command);
					//find any BMIs within the period with a valid BMI
					command="UPDATE tempehrquality,vitalsign "
						+"SET tempehrquality.HasBMI=1 "
						+"WHERE tempehrquality.PatNum=vitalsign.PatNum "
						+"AND vitalsign.DateTaken >= "+POut.Date(dateStart)+" "
						+"AND vitalsign.DateTaken <= "+POut.Date(dateEnd)+" "
						+"AND vitalsign.Height > 0 "
						+"AND vitalsign.Weight > 0";
					Db.NonQ(command);
					//find any BMIs within the period that indicate ChildGotNutrition
					command="UPDATE tempehrquality,vitalsign "
						+"SET tempehrquality.ChildGotNutrition=1 "
						+"WHERE tempehrquality.PatNum=vitalsign.PatNum "
						+"AND vitalsign.DateTaken >= "+POut.Date(dateStart)+" "
						+"AND vitalsign.DateTaken <= "+POut.Date(dateEnd)+" "
						+"AND vitalsign.ChildGotNutrition=1";
					Db.NonQ(command);
					//find any BMIs within the period that indicate ChildGotPhysCouns
					command="UPDATE tempehrquality,vitalsign "
						+"SET tempehrquality.ChildGotPhysCouns=1 "
						+"WHERE tempehrquality.PatNum=vitalsign.PatNum "
						+"AND vitalsign.DateTaken >= "+POut.Date(dateStart)+" "
						+"AND vitalsign.DateTaken <= "+POut.Date(dateEnd)+" "
						+"AND vitalsign.ChildGotPhysCouns=1";
					Db.NonQ(command);
					command="SELECT * FROM tempehrquality";
					tableRaw=Db.GetTable(command);
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					break;
				#endregion
				#region WeightChild_2
				case QualityType.WeightChild_2_1:
				case QualityType.WeightChild_2_2:
				case QualityType.WeightChild_2_3:
					//WeightChild_2-----------------------------------------------------------------------------------------------------------------
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					command=@"CREATE TABLE tempehrquality (
						PatNum bigint NOT NULL PRIMARY KEY,
						LName varchar(255) NOT NULL,
						FName varchar(255) NOT NULL,
						IsPregnant tinyint NOT NULL,
						HasBMI tinyint NOT NULL,
						ChildGotNutrition tinyint NOT NULL,
						ChildGotPhysCouns tinyint NOT NULL				
						) DEFAULT CHARSET=utf8";
					Db.NonQ(command);
					command="INSERT INTO tempehrquality (PatNum,LName,FName) SELECT patient.PatNum,LName,FName "
						+"FROM patient "
						+"INNER JOIN procedurelog "
						+"ON Patient.PatNum=procedurelog.PatNum "
						+"AND procedurelog.ProcStatus=2 "//complete
						+"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
						+"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
						+"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+" "
						+"WHERE Birthdate <= "+POut.Date(DateTime.Today.AddYears(-2))+" "//2+
						+"AND Birthdate > "+POut.Date(DateTime.Today.AddYears(-11))+" "//less than 11
						+"GROUP BY patient.PatNum";//there will frequently be multiple procedurelog events
					Db.NonQ(command);
					//find any BMIs within the period that indicate pregnancy
					command="UPDATE tempehrquality,vitalsign "
						+"SET tempehrquality.IsPregnant=1 "
						+"WHERE tempehrquality.PatNum=vitalsign.PatNum "
						+"AND vitalsign.DateTaken >= "+POut.Date(dateStart)+" "
						+"AND vitalsign.DateTaken <= "+POut.Date(dateEnd)+" "
						+"AND vitalsign.IsIneligible=1";
					Db.NonQ(command);
					//find any BMIs within the period with a valid BMI
					command="UPDATE tempehrquality,vitalsign "
						+"SET tempehrquality.HasBMI=1 "
						+"WHERE tempehrquality.PatNum=vitalsign.PatNum "
						+"AND vitalsign.DateTaken >= "+POut.Date(dateStart)+" "
						+"AND vitalsign.DateTaken <= "+POut.Date(dateEnd)+" "
						+"AND vitalsign.Height > 0 "
						+"AND vitalsign.Weight > 0";
					Db.NonQ(command);
					//find any BMIs within the period that indicate ChildGotNutrition
					command="UPDATE tempehrquality,vitalsign "
						+"SET tempehrquality.ChildGotNutrition=1 "
						+"WHERE tempehrquality.PatNum=vitalsign.PatNum "
						+"AND vitalsign.DateTaken >= "+POut.Date(dateStart)+" "
						+"AND vitalsign.DateTaken <= "+POut.Date(dateEnd)+" "
						+"AND vitalsign.ChildGotNutrition=1";
					Db.NonQ(command);
					//find any BMIs within the period that indicate ChildGotPhysCouns
					command="UPDATE tempehrquality,vitalsign "
						+"SET tempehrquality.ChildGotPhysCouns=1 "
						+"WHERE tempehrquality.PatNum=vitalsign.PatNum "
						+"AND vitalsign.DateTaken >= "+POut.Date(dateStart)+" "
						+"AND vitalsign.DateTaken <= "+POut.Date(dateEnd)+" "
						+"AND vitalsign.ChildGotPhysCouns=1";
					Db.NonQ(command);
					command="SELECT * FROM tempehrquality";
					tableRaw=Db.GetTable(command);
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					break;
				#endregion
				#region WeightChild_3
				case QualityType.WeightChild_3_1:
				case QualityType.WeightChild_3_2:
				case QualityType.WeightChild_3_3:
					//WeightChild_3-----------------------------------------------------------------------------------------------------------------
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					command=@"CREATE TABLE tempehrquality (
						PatNum bigint NOT NULL PRIMARY KEY,
						LName varchar(255) NOT NULL,
						FName varchar(255) NOT NULL,
						IsPregnant tinyint NOT NULL,
						HasBMI tinyint NOT NULL,
						ChildGotNutrition tinyint NOT NULL,
						ChildGotPhysCouns tinyint NOT NULL			
						) DEFAULT CHARSET=utf8";
					Db.NonQ(command);
					command="INSERT INTO tempehrquality (PatNum,LName,FName) SELECT patient.PatNum,LName,FName "
						+"FROM patient "
						+"INNER JOIN procedurelog "
						+"ON Patient.PatNum=procedurelog.PatNum "
						+"AND procedurelog.ProcStatus=2 "//complete
						+"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
						+"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
						+"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+" "
						+"WHERE Birthdate <= "+POut.Date(DateTime.Today.AddYears(-11))+" "//11+
						+"AND Birthdate > "+POut.Date(DateTime.Today.AddYears(-17))+" "//less than 17
						+"GROUP BY patient.PatNum";//there will frequently be multiple procedurelog events
					Db.NonQ(command);
					//find any BMIs within the period that indicate pregnancy
					command="UPDATE tempehrquality,vitalsign "
						+"SET tempehrquality.IsPregnant=1 "
						+"WHERE tempehrquality.PatNum=vitalsign.PatNum "
						+"AND vitalsign.DateTaken >= "+POut.Date(dateStart)+" "
						+"AND vitalsign.DateTaken <= "+POut.Date(dateEnd)+" "
						+"AND vitalsign.IsIneligible=1";
					Db.NonQ(command);
					//find any BMIs within the period with a valid BMI
					command="UPDATE tempehrquality,vitalsign "
						+"SET tempehrquality.HasBMI=1 "
						+"WHERE tempehrquality.PatNum=vitalsign.PatNum "
						+"AND vitalsign.DateTaken >= "+POut.Date(dateStart)+" "
						+"AND vitalsign.DateTaken <= "+POut.Date(dateEnd)+" "
						+"AND vitalsign.Height > 0 "
						+"AND vitalsign.Weight > 0";
					Db.NonQ(command);
					//find any BMIs within the period that indicate ChildGotNutrition
					command="UPDATE tempehrquality,vitalsign "
						+"SET tempehrquality.ChildGotNutrition=1 "
						+"WHERE tempehrquality.PatNum=vitalsign.PatNum "
						+"AND vitalsign.DateTaken >= "+POut.Date(dateStart)+" "
						+"AND vitalsign.DateTaken <= "+POut.Date(dateEnd)+" "
						+"AND vitalsign.ChildGotNutrition=1";
					Db.NonQ(command);
					//find any BMIs within the period that indicate ChildGotPhysCouns
					command="UPDATE tempehrquality,vitalsign "
						+"SET tempehrquality.ChildGotPhysCouns=1 "
						+"WHERE tempehrquality.PatNum=vitalsign.PatNum "
						+"AND vitalsign.DateTaken >= "+POut.Date(dateStart)+" "
						+"AND vitalsign.DateTaken <= "+POut.Date(dateEnd)+" "
						+"AND vitalsign.ChildGotPhysCouns=1";
					Db.NonQ(command);
					command="SELECT * FROM tempehrquality";
					tableRaw=Db.GetTable(command);
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					break;
				#endregion
				#region ImmunizeChild
				case QualityType.ImmunizeChild_1:
				case QualityType.ImmunizeChild_2:
				case QualityType.ImmunizeChild_3:
				case QualityType.ImmunizeChild_4:
				case QualityType.ImmunizeChild_5:
				case QualityType.ImmunizeChild_6:
				case QualityType.ImmunizeChild_7:
				case QualityType.ImmunizeChild_8:
				case QualityType.ImmunizeChild_9:
				case QualityType.ImmunizeChild_10:
				case QualityType.ImmunizeChild_11:
				case QualityType.ImmunizeChild_12:
					//ImmunizeChild----------------------------------------------------------------------------------------------------------------
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					command=@"CREATE TABLE tempehrquality (
						PatNum bigint NOT NULL PRIMARY KEY,
						LName varchar(255) NOT NULL,
						FName varchar(255) NOT NULL,
						Birthdate date NOT NULL,
						Count1 tinyint NOT NULL,
						NotGiven1 tinyint NOT NULL,
						Documentation1 varchar(255) NOT NULL,
						Count2 tinyint NOT NULL,
						NotGiven2 tinyint NOT NULL,
						Documentation2 varchar(255) NOT NULL,
						Count3 tinyint NOT NULL,
						NotGiven3 tinyint NOT NULL,
						Documentation3 varchar(255) NOT NULL,
						Count3a tinyint NOT NULL,
						NotGiven3a tinyint NOT NULL,
						Documentation3a varchar(255) NOT NULL,
						Count3b tinyint NOT NULL,
						NotGiven3b tinyint NOT NULL,
						Documentation3b varchar(255) NOT NULL,
						Count3c tinyint NOT NULL,
						NotGiven3c tinyint NOT NULL,
						Documentation3c varchar(255) NOT NULL,
						Count4 tinyint NOT NULL,
						NotGiven4 tinyint NOT NULL,
						Documentation4 varchar(255) NOT NULL,
						Count5 tinyint NOT NULL,
						NotGiven5 tinyint NOT NULL,
						Documentation5 varchar(255) NOT NULL,
						Count6 tinyint NOT NULL,
						NotGiven6 tinyint NOT NULL,
						Documentation6 varchar(255) NOT NULL,
						Count7 tinyint NOT NULL,
						NotGiven7 tinyint NOT NULL,
						Documentation7 varchar(255) NOT NULL,
						Count8 tinyint NOT NULL,
						NotGiven8 tinyint NOT NULL,
						Documentation8 varchar(255) NOT NULL,
						Count9 tinyint NOT NULL,
						NotGiven9 tinyint NOT NULL,
						Documentation9 varchar(255) NOT NULL,
						Count10 tinyint NOT NULL,
						NotGiven10 tinyint NOT NULL,
						Documentation10 varchar(255) NOT NULL
						) DEFAULT CHARSET=utf8";
					Db.NonQ(command);
					command="INSERT INTO tempehrquality (PatNum,LName,FName,Birthdate) SELECT patient.PatNum,LName,FName,Birthdate "
						+"FROM patient "
						+"INNER JOIN procedurelog "
						+"ON Patient.PatNum=procedurelog.PatNum "
						+"AND procedurelog.ProcStatus=2 "//complete
						+"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
						+"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
						+"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+" "
						+"WHERE DATE_ADD(Birthdate,INTERVAL 2 YEAR) >= "+POut.Date(dateStart)+" "//second birthdate is in meas period
						+"AND DATE_ADD(Birthdate,INTERVAL 2 YEAR) <= "+POut.Date(dateEnd)+" "
						+"GROUP BY patient.PatNum";
					Db.NonQ(command);
					#region DTaP
					//Count1, DTaP
					command="UPDATE tempehrquality "
						+"SET Count1=(SELECT COUNT(DISTINCT VaccinePatNum) FROM vaccinepat "
						+"LEFT JOIN vaccinedef ON vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"WHERE tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=0 "
						+"AND DATE(DateTimeStart) >= DATE_ADD(tempehrquality.Birthdate,INTERVAL 42 DAY) "
						+"AND DATE(DateTimeStart) < DATE_ADD(tempehrquality.Birthdate,INTERVAL 2 YEAR) "
						+"AND vaccinedef.CVXCode IN('110','120','20','50'))";
					Db.NonQ(command);
					command="UPDATE tempehrquality,vaccinepat,vaccinedef "
						+"SET NotGiven1=1,Documentation1=Note "
						+"WHERE vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"AND tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=1 "
						+"AND vaccinedef.CVXCode IN('110','120','20','50')";
					Db.NonQ(command);
					#endregion
					#region IPV
					//Count2, IPV
					command="UPDATE tempehrquality "
						+"SET Count2=(SELECT COUNT(DISTINCT VaccinePatNum) FROM vaccinepat "
						+"LEFT JOIN vaccinedef ON vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"WHERE tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=0 "
						+"AND DATE(DateTimeStart) >= DATE_ADD(tempehrquality.Birthdate,INTERVAL 42 DAY) "
						+"AND DATE(DateTimeStart) < DATE_ADD(tempehrquality.Birthdate,INTERVAL 2 YEAR) "
						+"AND vaccinedef.CVXCode IN('10','120'))";
					Db.NonQ(command);
					command="UPDATE tempehrquality,vaccinepat,vaccinedef "
						+"SET NotGiven2=1,Documentation2=Note "
						+"WHERE vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"AND tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=1 "
						+"AND vaccinedef.CVXCode IN('10','120')";
					Db.NonQ(command);
					#endregion
					#region MMR
					//Count3, MMR
					command="UPDATE tempehrquality "
						+"SET Count3=(SELECT COUNT(DISTINCT VaccinePatNum) FROM vaccinepat "
						+"LEFT JOIN vaccinedef ON vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"WHERE tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=0 "
						+"AND DATE(DateTimeStart) < DATE_ADD(tempehrquality.Birthdate,INTERVAL 2 YEAR) "
						+"AND vaccinedef.CVXCode IN('03','94'))";
					Db.NonQ(command);
					command="UPDATE tempehrquality,vaccinepat,vaccinedef "
						+"SET NotGiven3=1,Documentation3=Note "
						+"WHERE vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"AND tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=1 "
						+"AND vaccinedef.CVXCode IN('03','94')";
					Db.NonQ(command);
					#endregion
					#region measles
					//Count3a, measles
					command="UPDATE tempehrquality "
						+"SET Count3a=(SELECT COUNT(DISTINCT VaccinePatNum) FROM vaccinepat "
						+"LEFT JOIN vaccinedef ON vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"WHERE tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=0 "
						+"AND DATE(DateTimeStart) < DATE_ADD(tempehrquality.Birthdate,INTERVAL 2 YEAR) "
						+"AND vaccinedef.CVXCode IN('05'))";
					Db.NonQ(command);
					command="UPDATE tempehrquality,vaccinepat,vaccinedef "
						+"SET NotGiven3a=1,Documentation3a=Note "
						+"WHERE vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"AND tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=1 "
						+"AND vaccinedef.CVXCode IN('05')";
					Db.NonQ(command);
					#endregion
					#region mumps
					//Count3b, mumps
					command="UPDATE tempehrquality "
						+"SET Count3b=(SELECT COUNT(DISTINCT VaccinePatNum) FROM vaccinepat "
						+"LEFT JOIN vaccinedef ON vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"WHERE tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=0 "
						+"AND DATE(DateTimeStart) < DATE_ADD(tempehrquality.Birthdate,INTERVAL 2 YEAR) "
						+"AND vaccinedef.CVXCode IN('07'))";
					Db.NonQ(command);
					command="UPDATE tempehrquality,vaccinepat,vaccinedef "
						+"SET NotGiven3b=1,Documentation3b=Note "
						+"WHERE vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"AND tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=1 "
						+"AND vaccinedef.CVXCode IN('07')";
					Db.NonQ(command);
					#endregion
					#region rubella
					//Count3c, rubella
					command="UPDATE tempehrquality "
						+"SET Count3c=(SELECT COUNT(DISTINCT VaccinePatNum) FROM vaccinepat "
						+"LEFT JOIN vaccinedef ON vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"WHERE tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=0 "
						+"AND DATE(DateTimeStart) < DATE_ADD(tempehrquality.Birthdate,INTERVAL 2 YEAR) "
						+"AND vaccinedef.CVXCode IN('06'))";
					Db.NonQ(command);
					command="UPDATE tempehrquality,vaccinepat,vaccinedef "
						+"SET NotGiven3c=1,Documentation3c=Note "
						+"WHERE vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"AND tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=1 "
						+"AND vaccinedef.CVXCode IN('06')";
					Db.NonQ(command);
					#endregion
					#region HiB
					//Count4, HiB
					command="UPDATE tempehrquality "
						+"SET Count4=(SELECT COUNT(DISTINCT VaccinePatNum) FROM vaccinepat "
						+"LEFT JOIN vaccinedef ON vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"WHERE tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=0 "
						+"AND DATE(DateTimeStart) >= DATE_ADD(tempehrquality.Birthdate,INTERVAL 42 DAY) "
						+"AND DATE(DateTimeStart) < DATE_ADD(tempehrquality.Birthdate,INTERVAL 2 YEAR) "
						+"AND vaccinedef.CVXCode IN('120','46','47','48','49','50','51'))";
					Db.NonQ(command);
					command="UPDATE tempehrquality,vaccinepat,vaccinedef "
						+"SET NotGiven4=1,Documentation4=Note "
						+"WHERE vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"AND tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=1 "
						+"AND vaccinedef.CVXCode IN('120','46','47','48','49','50','51')";
					Db.NonQ(command);
					#endregion
					#region HepB
					//Count5, HepB
					command="UPDATE tempehrquality "
						+"SET Count5=(SELECT COUNT(DISTINCT VaccinePatNum) FROM vaccinepat "
						+"LEFT JOIN vaccinedef ON vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"WHERE tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=0 "
						+"AND DATE(DateTimeStart) < DATE_ADD(tempehrquality.Birthdate,INTERVAL 2 YEAR) "
						+"AND vaccinedef.CVXCode IN('08','110','44','51'))";
					Db.NonQ(command);
					command="UPDATE tempehrquality,vaccinepat,vaccinedef "
						+"SET NotGiven5=1,Documentation5=Note "
						+"WHERE vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"AND tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=1 "
						+"AND vaccinedef.CVXCode IN('08','110','44','51')";
					Db.NonQ(command);
					#endregion
					#region VZV
					//Count6, VZV
					command="UPDATE tempehrquality "
						+"SET Count6=(SELECT COUNT(DISTINCT VaccinePatNum) FROM vaccinepat "
						+"LEFT JOIN vaccinedef ON vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"WHERE tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=0 "
						+"AND DATE(DateTimeStart) < DATE_ADD(tempehrquality.Birthdate,INTERVAL 2 YEAR) "
						+"AND vaccinedef.CVXCode IN('21','94'))";
					Db.NonQ(command);
					command="UPDATE tempehrquality,vaccinepat,vaccinedef "
						+"SET NotGiven6=1,Documentation6=Note "
						+"WHERE vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"AND tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=1 "
						+"AND vaccinedef.CVXCode IN('21','94')";
					Db.NonQ(command);
					#endregion
					#region pneumococcal
					//Count7, pneumococcal
					command="UPDATE tempehrquality "
						+"SET Count7=(SELECT COUNT(DISTINCT VaccinePatNum) FROM vaccinepat "
						+"LEFT JOIN vaccinedef ON vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"WHERE tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=0 "
						+"AND DATE(DateTimeStart) >= DATE_ADD(tempehrquality.Birthdate,INTERVAL 42 DAY) "
						+"AND DATE(DateTimeStart) < DATE_ADD(tempehrquality.Birthdate,INTERVAL 2 YEAR) "
						+"AND vaccinedef.CVXCode IN('100','133'))";
					Db.NonQ(command);
					command="UPDATE tempehrquality,vaccinepat,vaccinedef "
						+"SET NotGiven7=1,Documentation7=Note "
						+"WHERE vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"AND tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=1 "
						+"AND vaccinedef.CVXCode IN('100','133')";
					Db.NonQ(command);
					#endregion
					#region HepA
					//Count8, HepA
					command="UPDATE tempehrquality "
						+"SET Count8=(SELECT COUNT(DISTINCT VaccinePatNum) FROM vaccinepat "
						+"LEFT JOIN vaccinedef ON vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"WHERE tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=0 "
						+"AND DATE(DateTimeStart) < DATE_ADD(tempehrquality.Birthdate,INTERVAL 2 YEAR) "
						+"AND vaccinedef.CVXCode IN('83'))";
					Db.NonQ(command);
					command="UPDATE tempehrquality,vaccinepat,vaccinedef "
						+"SET NotGiven8=1,Documentation8=Note "
						+"WHERE vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"AND tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=1 "
						+"AND vaccinedef.CVXCode IN('83')";
					Db.NonQ(command);
					#endregion
					#region rotavirus
					//Count9, rotavirus
					command="UPDATE tempehrquality "
						+"SET Count9=(SELECT COUNT(DISTINCT VaccinePatNum) FROM vaccinepat "
						+"LEFT JOIN vaccinedef ON vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"WHERE tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=0 "
						+"AND DATE(DateTimeStart) >= DATE_ADD(tempehrquality.Birthdate,INTERVAL 42 DAY) "
						+"AND DATE(DateTimeStart) < DATE_ADD(tempehrquality.Birthdate,INTERVAL 2 YEAR) "
						+"AND vaccinedef.CVXCode IN('116','119'))";
					Db.NonQ(command);
					command="UPDATE tempehrquality,vaccinepat,vaccinedef "
						+"SET NotGiven9=1,Documentation9=Note "
						+"WHERE vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"AND tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=1 "
						+"AND vaccinedef.CVXCode IN('116','119')";
					Db.NonQ(command);
					#endregion
					#region influenza
					//Count10, influenza
					command="UPDATE tempehrquality "
						+"SET Count10=(SELECT COUNT(DISTINCT VaccinePatNum) FROM vaccinepat "
						+"LEFT JOIN vaccinedef ON vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"WHERE tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=0 "
						+"AND DATE(DateTimeStart) >= DATE_ADD(tempehrquality.Birthdate,INTERVAL 180 DAY) "
						+"AND DATE(DateTimeStart) < DATE_ADD(tempehrquality.Birthdate,INTERVAL 2 YEAR) "
						+"AND vaccinedef.CVXCode IN('135','15'))";
					Db.NonQ(command);
					command="UPDATE tempehrquality,vaccinepat,vaccinedef "
						+"SET NotGiven10=1,Documentation10=Note "
						+"WHERE vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"AND tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND NotGiven=1 "
						+"AND vaccinedef.CVXCode IN('135','15')";
					Db.NonQ(command);
					#endregion
					command="SELECT * FROM tempehrquality";
					tableRaw=Db.GetTable(command);
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					break;
				#endregion
				#region Pneumonia
				case QualityType.Pneumonia:
					//Pneumonia----------------------------------------------------------------------------------------------------------------
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					command=@"CREATE TABLE tempehrquality (
						PatNum bigint NOT NULL PRIMARY KEY,
						LName varchar(255) NOT NULL,
						FName varchar(255) NOT NULL,
						DateVaccine date NOT NULL
						) DEFAULT CHARSET=utf8";
					Db.NonQ(command);
					command="INSERT INTO tempehrquality (PatNum,LName,FName) SELECT patient.PatNum,LName,FName "
						+"FROM patient "
						+"INNER JOIN procedurelog "
						+"ON Patient.PatNum=procedurelog.PatNum "
						+"AND procedurelog.ProcStatus=2 "//complete
						+"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
						+"AND procedurelog.ProcDate >= "+POut.Date(dateEnd.AddYears(-1))+" "
						+"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+" "
						+"WHERE Birthdate > '1880-01-01' AND Birthdate <= "+POut.Date(dateStart.AddYears(-65))+" "//65 or older as of dateEnd
						+"GROUP BY patient.PatNum";
					Db.NonQ(command);
					//find most recent vaccine date
					command="UPDATE tempehrquality "
						+"SET tempehrquality.DateVaccine=(SELECT MAX(DATE(vaccinepat.DateTimeStart)) "
						+"FROM vaccinepat,vaccinedef "
						+"WHERE vaccinepat.VaccineDefNum=vaccinedef.VaccineDefNum "
						+"AND tempehrquality.PatNum=vaccinepat.PatNum "
						+"AND vaccinepat.NotGiven=0 "
						+"AND vaccinedef.CVXCode IN('33','100','133'))";
					Db.NonQ(command);
					command="UPDATE tempehrquality SET DateVaccine='0001-01-01' WHERE DateVaccine='0000-00-00'";
					Db.NonQ(command);
					command="SELECT * FROM tempehrquality";
					tableRaw=Db.GetTable(command);
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					break;
				#endregion
				#region DiabetesBloodPressure
				case QualityType.DiabetesBloodPressure:
					//DiabetesBloodPressure-------------------------------------------------------------------------------------------------------
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					command=@"CREATE TABLE tempehrquality (
						PatNum bigint NOT NULL PRIMARY KEY,
						LName varchar(255) NOT NULL,
						FName varchar(255) NOT NULL,
						HasMedication tinyint NOT NULL,
						HasDiagnosisDiabetes tinyint NOT NULL,
						DateBP date NOT NULL,
						Systolic int NOT NULL,
						Diastolic int NOT NULL,
						HasDiagnosisPolycystic tinyint NOT NULL,
						HasDiagnosisAcuteDiabetes tinyint NOT NULL
						) DEFAULT CHARSET=utf8";
					Db.NonQ(command);
					command="INSERT INTO tempehrquality (PatNum,LName,FName) SELECT patient.PatNum,LName,FName "
						+"FROM patient "
						+"INNER JOIN procedurelog "
						+"ON Patient.PatNum=procedurelog.PatNum "
						+"AND procedurelog.ProcStatus=2 "//complete
						+"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
						+"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
						+"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+" "
						+"WHERE Birthdate <= "+POut.Date(dateStart.AddYears(-17))+" "
						+"AND Birthdate >= "+POut.Date(dateStart.AddYears(-74))+" "//17-74 before dateStart
						+"GROUP BY patient.PatNum";
					Db.NonQ(command);
					//Medication
					command="UPDATE tempehrquality "
						+"SET HasMedication = 1 "
						+"WHERE (SELECT COUNT(*) "
						+"FROM medicationpat "
						+"WHERE medicationpat.PatNum=tempehrquality.PatNum "
						+"AND medicationpat.RxCui IN(199149, 199150, 200132, 205329, 205330, 205331, 401938,"//alph-glucosidas
						+"200256, 200257, 200258, 311919, 314142, 389139, 861035, 861039, 861042, 861044, 861787, 861790,"//amylin analogs
						+"744863 , 847910 , 847915,"//antidiabetic
						+"602544, 602549, 602550, 647237, 647239, 706895, 706896, 861731, 861736, 861740, 861743, 861748, 861753, 861760, 861763, 861769, 861783, 861787, 861790, 861795, 861806, 861816, 861819, 861822,"//antidiabetic combos
						+"665033, 665038, 665042, 860975, 860978, 860981, 860984, 860996, 860999, 861004, 861007, 861010, 861021, 861025, 861731, 861736, 861740, 861743, 861748, 861753, 861760, 861763, 861769, 861783, 861787, 861790, 861795, 861806, 861816, 861819, 861822,"//Biguanides
						+"205314, 237527, 242120, 242916, 242917, 259111, 260265, 283394, 311040, 311041, 311053, 311054, 311055, 311056, 311057, 311058, 311059, 311060, 311061, 314038, 317800, 351297, 358349, 484322, 485210, 544614, 763002, 763007, 763013, 763014, 833159, 847191, 847207, 847211, 847230, 847239, 847252, 847259, 847263, 847416,"//insulin
						+"200256, 200257, 200258, 311919, 314142, 389139,"//meglitinides
						+"105374, 153842, 197306, 197307, 197495, 197496, 197737, 198291, 198292, 198293, 198294, 199245, 199246, 199247, 199825, 199984, 199985, 200065, 252960, 310488, 310489, 310490, 310534, 310536, 310537, 310539, 312440, 312441, 312859, 312860, 312861, 313418, 313419, 314000, 314006, 315107, 315239, 317573, 379804, 389137, 602544, 602549, 602550, 647237, 647239, 706895, 706896, 757710, 757712, 844809, 844824, 844827, 861731, 861736, 861740, 861743, 861748, 861753, 861760, 861763, 861783, 861795, 861806, 861816, 861822,"//Sulfonylureas
						+"312440, 312441, 312859, 312860, 312861, 317573) "//Thiazolidinediones
						+"AND (DateStop >= "+POut.Date(dateEnd.AddYears(-2))+" "//med active <= 2 years before or simultaneous to end date
						+"OR DateStop < '1880-01-01') "//or still active
						+") > 0";
					Db.NonQ(command);
					//HasDiagnosisDiabetes
					command="UPDATE tempehrquality "
						+"SET HasDiagnosisDiabetes = 1 "
						+"WHERE (SELECT COUNT(*) "
						+"FROM disease,diseasedef "
						+"WHERE disease.DiseaseDefNum=diseasedef.DiseaseDefNum "
						+"AND disease.PatNum=tempehrquality.PatNum "
						+"AND (diseasedef.ICD9Code LIKE '250%' "
						+"OR diseasedef.ICD9Code LIKE '357.2' "
						+"OR diseasedef.ICD9Code LIKE '362.0%' "
						+"OR diseasedef.ICD9Code LIKE '366.41' "
						+"OR diseasedef.ICD9Code LIKE '648.0%') "
						+"AND (disease.DateStart <= "+POut.Date(dateEnd)+" "//if there is a start date, it can't be after the period end.
						+"OR disease.DateStart < '1880-01-01') "//no startdate
						+"AND (disease.DateStop >= "+POut.Date(dateEnd.AddYears(-2))+" "//if there's a datestop, it can't have stopped more than 2 years ago.
							//Specs say: diagnosis active <= 2 years before or simultaneous to end date
						+"OR disease.DateStop < '1880-01-01') "//or still active
						+") > 0";
					Db.NonQ(command);
					//DateBP
					command="UPDATE tempehrquality "
						+"SET tempehrquality.DateBP=(SELECT MAX(vitalsign.DateTaken) "
						+"FROM vitalsign "
						+"WHERE tempehrquality.PatNum=vitalsign.PatNum "
						+"AND vitalsign.BpSystolic != 0 "
						+"AND vitalsign.BpDiastolic != 0 "
						+"GROUP BY vitalsign.PatNum)";
					Db.NonQ(command);
					command="UPDATE tempehrquality SET DateBP='0001-01-01' WHERE DateBP='0000-00-00'";
					Db.NonQ(command);
					//Systolic and diastolic
					command="UPDATE tempehrquality,vitalsign "
						+"SET Systolic=BpSystolic, "
						+"Diastolic=BpDiastolic "
						+"WHERE tempehrquality.PatNum=vitalsign.PatNum "
						+"AND tempehrquality.DateBP=vitalsign.DateTaken";
					Db.NonQ(command);
					//HasDiagnosisPolycystic
					command="UPDATE tempehrquality "
						+"SET HasDiagnosisPolycystic = 1 "
						+"WHERE (SELECT COUNT(*) "
						+"FROM disease,diseasedef "
						+"WHERE disease.DiseaseDefNum=diseasedef.DiseaseDefNum "
						+"AND disease.PatNum=tempehrquality.PatNum "
						+"AND diseasedef.ICD9Code = '256.4' "
						+"AND (disease.DateStart <= "+POut.Date(dateEnd)+" "//if there's a datestart, it can't be after period end
						+"OR disease.DateStart < '1880-01-01') "
						//no restrictions on datestop.  It could still be active or could have stopped before or after the period end.
						+") > 0";
					Db.NonQ(command);
					//HasDiagnosisAcuteDiabetes
					command="UPDATE tempehrquality "
						+"SET HasDiagnosisAcuteDiabetes = 1 "
						+"WHERE (SELECT COUNT(*) "
						+"FROM disease,diseasedef "
						+"WHERE disease.DiseaseDefNum=diseasedef.DiseaseDefNum "
						+"AND disease.PatNum=tempehrquality.PatNum "
						+"AND (diseasedef.ICD9Code LIKE '249%' OR diseasedef.ICD9Code='251.8' OR diseasedef.ICD9Code='962.0' "//steroid induced
						+"OR diseasedef.ICD9Code LIKE '648.8%') "//gestational
						+"AND (disease.DateStart <= "+POut.Date(dateEnd)+" "//if there's a datestart, it can't be after period end
						+"OR disease.DateStart < '1880-01-01') "
						//no restrictions on datestop.  It could still be active or could have stopped before or after the period end.
						+") > 0";
					Db.NonQ(command);
					command="SELECT * FROM tempehrquality";
					tableRaw=Db.GetTable(command);
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					break;
				#endregion
				#region BloodPressureManage
				case QualityType.BloodPressureManage:
					//DiabetesBloodPressure-------------------------------------------------------------------------------------------------------
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					command=@"CREATE TABLE tempehrquality (
						PatNum bigint NOT NULL PRIMARY KEY,
						LName varchar(255) NOT NULL,
						FName varchar(255) NOT NULL,
						HasDiagnosisHypertension tinyint NOT NULL,
						HasProcedureESRD tinyint NOT NULL,
						HasDiagnosisPregnancy tinyint NOT NULL,
						HasDiagnosisESRD tinyint NOT NULL,
						DateBP date NOT NULL,
						Systolic int NOT NULL,
						Diastolic int NOT NULL
						) DEFAULT CHARSET=utf8";
					Db.NonQ(command);
					command="INSERT INTO tempehrquality (PatNum,LName,FName) SELECT patient.PatNum,LName,FName "
						+"FROM patient "
						+"INNER JOIN procedurelog "
						+"ON Patient.PatNum=procedurelog.PatNum "
						+"AND procedurelog.ProcStatus=2 "//complete
						+"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
						+"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
						+"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+" "
						+"WHERE Birthdate <= "+POut.Date(dateStart.AddYears(-17))+" "
						+"AND Birthdate >= "+POut.Date(dateStart.AddYears(-74))+" "//17-74 before dateStart
						+"GROUP BY patient.PatNum";
					Db.NonQ(command);
					//HasDiagnosisHypertension
					command="UPDATE tempehrquality "
						+"SET HasDiagnosisHypertension = 1 "
						+"WHERE (SELECT COUNT(*) "
						+"FROM disease,diseasedef "
						+"WHERE disease.DiseaseDefNum=diseasedef.DiseaseDefNum "
						+"AND disease.PatNum=tempehrquality.PatNum "
						+"AND diseasedef.ICD9Code LIKE '401%' "
						+"AND (disease.DateStart <= "+POut.Date(dateStart.AddMonths(6))+" "//if there is a start date, it can't be after this point
						+"OR disease.DateStart < '1880-01-01') "//no startdate
						//no restrictions on datestop.  It could still be active or could have stopped before or after the period end.
						+") > 0";
					Db.NonQ(command);
					command="DELETE FROM tempehrquality WHERE HasDiagnosisHypertension=0";//for speed
					Db.NonQ(command);
					//HasProcedureESRD
					command="UPDATE tempehrquality "
						+"SET HasProcedureESRD = 1 "
						+"WHERE (SELECT COUNT(*) "
						+"FROM procedurelog,procedurecode "
						+"WHERE procedurelog.CodeNum=procedurecode.CodeNum "
						+"AND procedurelog.PatNum=tempehrquality.PatNum "
						+"AND procedurecode.ProcCode IN ('36145','36147','36148','36800', '36810','36815','36818','36819','36820', '36821','36831', '36832', '36833', '50300', '50320','50340','50360','50365','50370', '50380','90920','90921','90924','90925', '90935','90937', '90940','90945', '90947', '90957', '90958','90959','90960','90961','90962','90965','90966','90969','90970','90989','90993','90997','90999','99512') "//ESRD
						+"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
						+"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+" "
						+") > 0";
					Db.NonQ(command);
					//HasDiagnosisPregnancy
					command="UPDATE tempehrquality "
						+"SET HasDiagnosisPregnancy = 1 "
						+"WHERE (SELECT COUNT(*) "
						+"FROM disease,diseasedef "
						+"WHERE disease.DiseaseDefNum=diseasedef.DiseaseDefNum "
						+"AND disease.PatNum=tempehrquality.PatNum "
						+"AND (diseasedef.ICD9Code LIKE '63%' "
						+"OR diseasedef.ICD9Code LIKE '64%' "
						+"OR diseasedef.ICD9Code LIKE '65%' "
						+"OR diseasedef.ICD9Code LIKE '66%' "
						+"OR diseasedef.ICD9Code LIKE '67%' "
						+"OR diseasedef.ICD9Code LIKE 'V22%' "
						+"OR diseasedef.ICD9Code LIKE 'V23%' "
						+"OR diseasedef.ICD9Code LIKE 'V28%') "
						//active during the period
						+"AND (disease.DateStart <= "+POut.Date(dateEnd)+" "//if there is a start date, it can't be after the period end.
						+"OR disease.DateStart < '1880-01-01') "//no startdate
						+"AND (disease.DateStop >= "+POut.Date(dateStart)+" "//if there's a datestop, it can't have stopped before the period.
						+"OR disease.DateStop < '1880-01-01') "//or still active
						+") > 0";
					Db.NonQ(command);
					//HasDiagnosisESRD
					command="UPDATE tempehrquality "
						+"SET HasDiagnosisESRD = 1 "
						+"WHERE (SELECT COUNT(*) "
						+"FROM disease,diseasedef "
						+"WHERE disease.DiseaseDefNum=diseasedef.DiseaseDefNum "
						+"AND disease.PatNum=tempehrquality.PatNum "
						+"AND (diseasedef.ICD9Code LIKE '38.95' "
						+"OR diseasedef.ICD9Code LIKE '39%' "
						+"OR diseasedef.ICD9Code LIKE '54.98' "
						+"OR diseasedef.ICD9Code LIKE '55.6%' "
						+"OR diseasedef.ICD9Code LIKE '585%' "
						+"OR diseasedef.ICD9Code LIKE 'V42.0%' "
						+"OR diseasedef.ICD9Code LIKE 'V45.1%' "
						+"OR diseasedef.ICD9Code LIKE 'V56%') "
						//active during the period
						+"AND (disease.DateStart <= "+POut.Date(dateEnd)+" "
						+"OR disease.DateStart < '1880-01-01') "
						+"AND (disease.DateStop >= "+POut.Date(dateStart)+" "
						+"OR disease.DateStop < '1880-01-01') "
						+") > 0";
					Db.NonQ(command);
					//DateBP
					command="UPDATE tempehrquality "
						+"SET tempehrquality.DateBP=(SELECT MAX(vitalsign.DateTaken) "
						+"FROM vitalsign "
						+"WHERE tempehrquality.PatNum=vitalsign.PatNum "
						+"AND vitalsign.BpSystolic != 0 "
						+"AND vitalsign.BpDiastolic != 0 "
						+"GROUP BY vitalsign.PatNum)";
					Db.NonQ(command);
					command="UPDATE tempehrquality SET DateBP='0001-01-01' WHERE DateBP='0000-00-00'";
					Db.NonQ(command);
					//Systolic and diastolic
					command="UPDATE tempehrquality,vitalsign "
						+"SET Systolic=BpSystolic, "
						+"Diastolic=BpDiastolic "
						+"WHERE tempehrquality.PatNum=vitalsign.PatNum "
						+"AND tempehrquality.DateBP=vitalsign.DateTaken";
					Db.NonQ(command);
					command="SELECT * FROM tempehrquality";
					tableRaw=Db.GetTable(command);
					command="DROP TABLE IF EXISTS tempehrquality";
					Db.NonQ(command);
					break;
				#endregion
				default:
					throw new ApplicationException("Type not found: "+qtype.ToString());
			}
			//PatNum, PatientName, Numerator(X), and Exclusion(X).
			DataTable table=new DataTable("audit");
			DataRow row;
			table.Columns.Add("PatNum");
			table.Columns.Add("patientName");
			table.Columns.Add("numerator");//X
			table.Columns.Add("exclusion");//X
			table.Columns.Add("explanation");
			List<DataRow> rows=new List<DataRow>();
			Patient pat;
			//string explanation;
			for(int i=0;i<tableRaw.Rows.Count;i++) {
				row=table.NewRow();
				row["PatNum"]=tableRaw.Rows[i]["PatNum"].ToString();
				pat=new Patient();
				pat.LName=tableRaw.Rows[i]["LName"].ToString();
				pat.FName=tableRaw.Rows[i]["FName"].ToString();
				pat.Preferred="";
				row["patientName"]=pat.GetNameLF();
				row["numerator"]="";
				row["exclusion"]="";
				row["explanation"]="";
				float weight=0;
				float height=0;
				float bmi=0;
				DateTime dateVisit;
				int visitCount;
				switch(qtype) {
					#region WeightOver65
					case QualityType.WeightOver65:
						//WeightOver65-----------------------------------------------------------------------------------------------------------------
						weight=PIn.Float(tableRaw.Rows[i]["Weight"].ToString());
						height=PIn.Float(tableRaw.Rows[i]["Height"].ToString());
						bmi=Vitalsigns.CalcBMI(weight,height);
						bool hasFollowupPlan=PIn.Bool(tableRaw.Rows[i]["HasFollowupPlan"].ToString());
						bool isIneligible=PIn.Bool(tableRaw.Rows[i]["IsIneligible"].ToString());
						string documentation=tableRaw.Rows[i]["Documentation"].ToString();
						if(bmi==0){
							row["explanation"]="No BMI";
						}
						else if(bmi < 22) {
							row["explanation"]="Underweight";
							if(hasFollowupPlan) {
								row["explanation"]+=", has followup plan: "+documentation;
								row["numerator"]="X";
							}
						}
						else if(bmi < 30) {
							row["numerator"]="X";
							row["explanation"]="Normal weight";
						}
						else {
							row["explanation"]="Overweight";
							if(hasFollowupPlan) {
								row["explanation"]+=", has followup plan: "+documentation;
								row["numerator"]="X";
							}
						}
						if(isIneligible) {
							row["exclusion"]="X";
							row["explanation"]+=", "+documentation;
						}
						break;
					#endregion
					#region WeightAdult
					case QualityType.WeightAdult:
						//WeightAdult-----------------------------------------------------------------------------------------------------------------
						weight=PIn.Float(tableRaw.Rows[i]["Weight"].ToString());
						height=PIn.Float(tableRaw.Rows[i]["Height"].ToString());
						bmi=Vitalsigns.CalcBMI(weight,height);
						hasFollowupPlan=PIn.Bool(tableRaw.Rows[i]["HasFollowupPlan"].ToString());
						isIneligible=PIn.Bool(tableRaw.Rows[i]["IsIneligible"].ToString());
						documentation=tableRaw.Rows[i]["Documentation"].ToString();
						if(bmi==0){
							row["explanation"]="No BMI";
						}
						else if(bmi < 18.5f) {
							row["explanation"]="Underweight";
							if(hasFollowupPlan) {
								row["explanation"]+=", has followup plan: "+documentation;
								row["numerator"]="X";
							}
						}
						else if(bmi < 25) {
							row["numerator"]="X";
							row["explanation"]="Normal weight";
						}
						else {
							row["explanation"]="Overweight";
							if(hasFollowupPlan) {
								row["explanation"]+=", has followup plan: "+documentation;
								row["numerator"]="X";
							}
						}
						if(isIneligible) {
							row["exclusion"]="X";
							row["explanation"]+=", "+documentation;
						}
						break;
					#endregion
					#region Hypertension
					case QualityType.Hypertension:
						//Hypertension---------------------------------------------------------------------------------------------------------------------
						dateVisit=PIn.Date(tableRaw.Rows[i]["DateVisit"].ToString());
						visitCount=PIn.Int(tableRaw.Rows[i]["VisitCount"].ToString());
						string icd9code=tableRaw.Rows[i]["Icd9Code"].ToString();
						DateTime datePbEntered=PIn.Date(tableRaw.Rows[i]["DateBpEntered"].ToString());
						if(dateVisit<dateStart || dateVisit>dateEnd) {//no visits in the measurement period
							continue;//don't add this row.  Not part of denominator.
						}
						if(visitCount<2) {
							continue;
						}
						if(icd9code=="") {
							continue;
						}
						if(datePbEntered.Year<1880) {//no bp entered
							row["explanation"]="No BP entered";
						}
						else {
							row["numerator"]="X";
							row["explanation"]="BP entered";
						}
						break;
					#endregion
					#region TobaccoUse
					case QualityType.TobaccoUse:
						//TobaccoUse---------------------------------------------------------------------------------------------------------------------
						dateVisit=PIn.Date(tableRaw.Rows[i]["DateVisit"].ToString());
						//visitCount=PIn.Int(tableRaw.Rows[i]["VisitCount"].ToString());
						DateTime dateAssessment=PIn.Date(tableRaw.Rows[i]["DateAssessment"].ToString());
						if(dateVisit<dateStart || dateVisit>dateEnd) {//no visits in the measurement period
							continue;//don't add this row.  Not part of denominator.
						}
						//if(visitCount<2) {//no, as explained in comments in GetDenominatorExplain().
						//	continue;
						//}
						if(dateAssessment.Year<1880) {
							row["explanation"]="No tobacco use entered.";
						}
						else if(dateAssessment < dateVisit.AddYears(-2)) {
							row["explanation"]="No tobacco use entered within timeframe.";
						}
						else{
							row["numerator"]="X";
							row["explanation"]="Tobacco use entered.";
						}
						break;
					#endregion
					#region TobaccoCessation
					case QualityType.TobaccoCessation:
						//TobaccoCessation----------------------------------------------------------------------------------------------------------------
						dateVisit=PIn.Date(tableRaw.Rows[i]["DateVisit"].ToString());
						dateAssessment=PIn.Date(tableRaw.Rows[i]["DateAssessment"].ToString());
						DateTime DateCessation=PIn.Date(tableRaw.Rows[i]["DateCessation"].ToString());
						documentation=tableRaw.Rows[i]["Documentation"].ToString();
						if(dateVisit<dateStart || dateVisit>dateEnd) {//no visits in the measurement period
							continue;//don't add this row.  Not part of denominator.
						}
						else if(dateAssessment < dateVisit.AddYears(-2)) {
							continue;//no assessment within 24 months, so not part of denominator.
						}
						else if(DateCessation.Year<1880) {
							row["explanation"]="No tobacco cessation entered.";
						}
						else if(DateCessation < dateVisit.AddYears(-2)) {
							row["explanation"]="No tobacco cessation entered within timeframe.";
						}
						else {
							row["numerator"]="X";
							row["explanation"]="Tobacco cessation: "+documentation;
						}
						break;
					#endregion
					#region InfluenzaAdult
					case QualityType.InfluenzaAdult:
						//InfluenzaAdult----------------------------------------------------------------------------------------------------------------
						DateTime DateVaccine=PIn.Date(tableRaw.Rows[i]["DateVaccine"].ToString());
						bool notGiven=PIn.Bool(tableRaw.Rows[i]["NotGiven"].ToString());
						documentation=tableRaw.Rows[i]["Documentation"].ToString();
						if(DateVaccine.Year<1880) {
							row["explanation"]="No influenza vaccine given";
						}
						else if(notGiven) {
							row["exclusion"]="X";
							row["explanation"]+="No influenza vaccine given, "+documentation;
						}
						else {
							row["numerator"]="X";
							row["explanation"]="Influenza vaccine given";
						}
						break;
					#endregion
					#region WeightChild_1_1
					case QualityType.WeightChild_1_1:
						//WeightChild_1_1----------------------------------------------------------------------------------------------------------------
						bool isPregnant=PIn.Bool(tableRaw.Rows[i]["IsPregnant"].ToString());
						bool hasBMI=PIn.Bool(tableRaw.Rows[i]["HasBMI"].ToString());
						if(isPregnant) {
							continue;
						}
						if(hasBMI) {
							row["numerator"]="X";
							row["explanation"]="BMI entered";
						}
						else {
							row["explanation"]="No BMI entered";
						}
						break;
					#endregion
					#region WeightChild_1_2
					case QualityType.WeightChild_1_2:
						//WeightChild_1_2----------------------------------------------------------------------------------------------------------------
						isPregnant=PIn.Bool(tableRaw.Rows[i]["IsPregnant"].ToString());
						bool ChildGotNutrition=PIn.Bool(tableRaw.Rows[i]["ChildGotNutrition"].ToString());
						if(isPregnant) {
							continue;
						}
						if(ChildGotNutrition) {
							row["numerator"]="X";
							row["explanation"]="Counseled for nutrition";
						}
						else {
							row["explanation"]="Not counseled for nutrition";
						}
						break;
					#endregion
					#region WeightChild_1_3
					case QualityType.WeightChild_1_3:
						//WeightChild_1_3----------------------------------------------------------------------------------------------------------------
						isPregnant=PIn.Bool(tableRaw.Rows[i]["IsPregnant"].ToString());
						bool ChildGotPhysCouns=PIn.Bool(tableRaw.Rows[i]["ChildGotPhysCouns"].ToString());
						if(isPregnant) {
							continue;
						}
						if(ChildGotPhysCouns) {
							row["numerator"]="X";
							row["explanation"]="Counseled for physical activity";
						}
						else {
							row["explanation"]="Not counseled for physical activity";
						}
						break;
					#endregion
					#region WeightChild_2_1
					case QualityType.WeightChild_2_1:
						//WeightChild_2_1----------------------------------------------------------------------------------------------------------------
						isPregnant=PIn.Bool(tableRaw.Rows[i]["IsPregnant"].ToString());
						hasBMI=PIn.Bool(tableRaw.Rows[i]["HasBMI"].ToString());
						if(isPregnant) {
							continue;
						}
						if(hasBMI) {
							row["numerator"]="X";
							row["explanation"]="BMI entered";
						}
						else {
							row["explanation"]="No BMI entered";
						}
						break;
					#endregion
					#region WeightChild_2_2
					case QualityType.WeightChild_2_2:
						//WeightChild_2_2----------------------------------------------------------------------------------------------------------------
						isPregnant=PIn.Bool(tableRaw.Rows[i]["IsPregnant"].ToString());
						ChildGotNutrition=PIn.Bool(tableRaw.Rows[i]["ChildGotNutrition"].ToString());
						if(isPregnant) {
							continue;
						}
						if(ChildGotNutrition) {
							row["numerator"]="X";
							row["explanation"]="Counseled for nutrition";
						}
						else {
							row["explanation"]="Not counseled for nutrition";
						}
						break;
					#endregion
					#region WeightChild_2_3
					case QualityType.WeightChild_2_3:
						//WeightChild_2_3----------------------------------------------------------------------------------------------------------------
						isPregnant=PIn.Bool(tableRaw.Rows[i]["IsPregnant"].ToString());
						ChildGotPhysCouns=PIn.Bool(tableRaw.Rows[i]["ChildGotPhysCouns"].ToString());
						if(isPregnant) {
							continue;
						}
						if(ChildGotPhysCouns) {
							row["numerator"]="X";
							row["explanation"]="Counseled for physical activity";
						}
						else {
							row["explanation"]="Not counseled for physical activity";
						}
						break;
					#endregion
					#region WeightChild_3_1
					case QualityType.WeightChild_3_1:
						//WeightChild_3_1----------------------------------------------------------------------------------------------------------------
						isPregnant=PIn.Bool(tableRaw.Rows[i]["IsPregnant"].ToString());
						hasBMI=PIn.Bool(tableRaw.Rows[i]["HasBMI"].ToString());
						if(isPregnant) {
							continue;
						}
						if(hasBMI) {
							row["numerator"]="X";
							row["explanation"]="BMI entered";
						}
						else {
							row["explanation"]="No BMI entered";
						}
						break;
					#endregion
					#region WeightChild_3_2
					case QualityType.WeightChild_3_2:
						//WeightChild_3_2----------------------------------------------------------------------------------------------------------------
						isPregnant=PIn.Bool(tableRaw.Rows[i]["IsPregnant"].ToString());
						ChildGotNutrition=PIn.Bool(tableRaw.Rows[i]["ChildGotNutrition"].ToString());
						if(isPregnant) {
							continue;
						}
						if(ChildGotNutrition) {
							row["numerator"]="X";
							row["explanation"]="Counseled for nutrition";
						}
						else {
							row["explanation"]="Not counseled for nutrition";
						}
						break;
					#endregion
					#region WeightChild_3_3
					case QualityType.WeightChild_3_3:
						//WeightChild_3_3----------------------------------------------------------------------------------------------------------------
						isPregnant=PIn.Bool(tableRaw.Rows[i]["IsPregnant"].ToString());
						ChildGotPhysCouns=PIn.Bool(tableRaw.Rows[i]["ChildGotPhysCouns"].ToString());
						if(isPregnant) {
							continue;
						}
						if(ChildGotPhysCouns) {
							row["numerator"]="X";
							row["explanation"]="Counseled for physical activity";
						}
						else {
							row["explanation"]="Not counseled for physical activity";
						}
						break;
					#endregion
					#region ImmunizeChild_1
					case QualityType.ImmunizeChild_1:
						//ImmunizeChild_1--------------------------------------------------------------------------------------------------------------
						int count=PIn.Int(tableRaw.Rows[i]["Count1"].ToString());
						notGiven=PIn.Bool(tableRaw.Rows[i]["NotGiven1"].ToString());
						documentation=PIn.String(tableRaw.Rows[i]["Documentation1"].ToString());
						if(notGiven) {
							row["exclusion"]="X";
							row["explanation"]+="No DTaP vaccine given, "+documentation;
						}
						else if(count>=4) {
							row["numerator"]="X";
							row["explanation"]="DTaP vaccinations: "+count.ToString();
						}
						else {
							row["explanation"]="DTaP vaccinations: "+count.ToString();
						}
						break;
					#endregion
					#region ImmunizeChild_2
					case QualityType.ImmunizeChild_2:
						//ImmunizeChild_2--------------------------------------------------------------------------------------------------------------
						count=PIn.Int(tableRaw.Rows[i]["Count2"].ToString());
						notGiven=PIn.Bool(tableRaw.Rows[i]["NotGiven2"].ToString());
						documentation=PIn.String(tableRaw.Rows[i]["Documentation2"].ToString());
						if(notGiven) {
							row["exclusion"]="X";
							row["explanation"]+="No IPV vaccine given, "+documentation;
						}
						else if(count>=3) {
							row["numerator"]="X";
							row["explanation"]="IPV vaccinations: "+count.ToString();
						}
						else {
							row["explanation"]="IPV vaccinations: "+count.ToString();
						}
						break;
					#endregion
					#region ImmunizeChild_3
					case QualityType.ImmunizeChild_3:
						//ImmunizeChild_3--------------------------------------------------------------------------------------------------------------
						count=PIn.Int(tableRaw.Rows[i]["Count3"].ToString());
						notGiven=PIn.Bool(tableRaw.Rows[i]["NotGiven3"].ToString());
						documentation=PIn.String(tableRaw.Rows[i]["Documentation3"].ToString());
						int count3a=PIn.Int(tableRaw.Rows[i]["Count3a"].ToString());
						bool notGiven3a=PIn.Bool(tableRaw.Rows[i]["NotGiven3a"].ToString());
						string documentation3a=PIn.String(tableRaw.Rows[i]["Documentation3a"].ToString());
						int count3b=PIn.Int(tableRaw.Rows[i]["Count3b"].ToString());
						bool notGiven3b=PIn.Bool(tableRaw.Rows[i]["NotGiven3b"].ToString());
						string documentation3b=PIn.String(tableRaw.Rows[i]["Documentation3b"].ToString());
						int count3c=PIn.Int(tableRaw.Rows[i]["Count3c"].ToString());
						bool notGiven3c=PIn.Bool(tableRaw.Rows[i]["NotGiven3c"].ToString());
						string documentation3c=PIn.String(tableRaw.Rows[i]["Documentation3c"].ToString());
						if(notGiven) {
							row["exclusion"]="X";
							row["explanation"]+="No MMR vaccine given, "+documentation;
						}
						else if(notGiven3a) {
							row["exclusion"]="X";
							row["explanation"]+="No measles vaccine given, "+documentation3a;
						}
						else if(notGiven3b) {
							row["exclusion"]="X";
							row["explanation"]+="No mumps vaccine given, "+documentation3b;
						}
						else if(notGiven3c) {
							row["exclusion"]="X";
							row["explanation"]+="No rubella vaccine given, "+documentation3c;
						}
						else if(count>=1) {
							row["numerator"]="X";
							row["explanation"]="MMR vaccinations: "+count.ToString();
						}
						else if(count3a>=1 && count3b>=1 && count3c>=1) {
							row["numerator"]="X";
							row["explanation"]="MMR individual vaccinations given.";
						}
						else {
							row["explanation"]="MMR vaccination not given";
						}
						break;
					#endregion
					#region ImmunizeChild_4
					case QualityType.ImmunizeChild_4:
						//ImmunizeChild_4--------------------------------------------------------------------------------------------------------------
						count=PIn.Int(tableRaw.Rows[i]["Count4"].ToString());
						notGiven=PIn.Bool(tableRaw.Rows[i]["NotGiven4"].ToString());
						documentation=PIn.String(tableRaw.Rows[i]["Documentation4"].ToString());
						if(notGiven) {
							row["exclusion"]="X";
							row["explanation"]+="No HiB vaccine given, "+documentation;
						}
						else if(count>=2) {
							row["numerator"]="X";
							row["explanation"]="HiB vaccinations: "+count.ToString();
						}
						else {
							row["explanation"]="HiB vaccinations: "+count.ToString();
						}
						break;
					#endregion
					#region ImmunizeChild_5
					case QualityType.ImmunizeChild_5:
						//ImmunizeChild_5--------------------------------------------------------------------------------------------------------------
						count=PIn.Int(tableRaw.Rows[i]["Count5"].ToString());
						notGiven=PIn.Bool(tableRaw.Rows[i]["NotGiven5"].ToString());
						documentation=PIn.String(tableRaw.Rows[i]["Documentation5"].ToString());
						if(notGiven) {
							row["exclusion"]="X";
							row["explanation"]+="No hepatitis B vaccine given, "+documentation;
						}
						else if(count>=3) {
							row["numerator"]="X";
							row["explanation"]="hepatitis B vaccinations: "+count.ToString();
						}
						else {
							row["explanation"]="hepatitis B vaccinations: "+count.ToString();
						}
						break;
					#endregion
					#region ImmunizeChild_6
					case QualityType.ImmunizeChild_6:
						//ImmunizeChild_6--------------------------------------------------------------------------------------------------------------
						count=PIn.Int(tableRaw.Rows[i]["Count6"].ToString());
						notGiven=PIn.Bool(tableRaw.Rows[i]["NotGiven6"].ToString());
						documentation=PIn.String(tableRaw.Rows[i]["Documentation6"].ToString());
						if(notGiven) {
							row["exclusion"]="X";
							row["explanation"]+="No VZV vaccine given, "+documentation;
						}
						else if(count>=1) {
							row["numerator"]="X";
							row["explanation"]="VZV vaccinations: "+count.ToString();
						}
						else {
							row["explanation"]="VZV vaccinations: "+count.ToString();
						}
						break;
					#endregion
					#region ImmunizeChild_7
					case QualityType.ImmunizeChild_7:
						//ImmunizeChild_7--------------------------------------------------------------------------------------------------------------
						count=PIn.Int(tableRaw.Rows[i]["Count7"].ToString());
						notGiven=PIn.Bool(tableRaw.Rows[i]["NotGiven7"].ToString());
						documentation=PIn.String(tableRaw.Rows[i]["Documentation7"].ToString());
						if(notGiven) {
							row["exclusion"]="X";
							row["explanation"]+="No pneumococcal vaccine given, "+documentation;
						}
						else if(count>=4) {
							row["numerator"]="X";
							row["explanation"]="pneumococcal vaccinations: "+count.ToString();
						}
						else {
							row["explanation"]="pneumococcal vaccinations: "+count.ToString();
						}
						break;
					#endregion
					#region ImmunizeChild_8
					case QualityType.ImmunizeChild_8:
						//ImmunizeChild_8--------------------------------------------------------------------------------------------------------------
						count=PIn.Int(tableRaw.Rows[i]["Count8"].ToString());
						notGiven=PIn.Bool(tableRaw.Rows[i]["NotGiven8"].ToString());
						documentation=PIn.String(tableRaw.Rows[i]["Documentation8"].ToString());
						if(notGiven) {
							row["exclusion"]="X";
							row["explanation"]+="No hepatitis A vaccine given, "+documentation;
						}
						else if(count>=2) {
							row["numerator"]="X";
							row["explanation"]="hepatitis A vaccinations: "+count.ToString();
						}
						else {
							row["explanation"]="hepatitis A vaccinations: "+count.ToString();
						}
						break;
					#endregion
					#region ImmunizeChild_9
					case QualityType.ImmunizeChild_9:
						//ImmunizeChild_9--------------------------------------------------------------------------------------------------------------
						count=PIn.Int(tableRaw.Rows[i]["Count9"].ToString());
						notGiven=PIn.Bool(tableRaw.Rows[i]["NotGiven9"].ToString());
						documentation=PIn.String(tableRaw.Rows[i]["Documentation9"].ToString());
						if(notGiven) {
							row["exclusion"]="X";
							row["explanation"]+="No rotavirus vaccine given, "+documentation;
						}
						else if(count>=2) {
							row["numerator"]="X";
							row["explanation"]="rotavirus vaccinations: "+count.ToString();
						}
						else {
							row["explanation"]="rotavirus vaccinations: "+count.ToString();
						}
						break;
					#endregion
					#region ImmunizeChild_10
					case QualityType.ImmunizeChild_10:
						//ImmunizeChild_10--------------------------------------------------------------------------------------------------------------
						count=PIn.Int(tableRaw.Rows[i]["Count10"].ToString());
						notGiven=PIn.Bool(tableRaw.Rows[i]["NotGiven10"].ToString());
						documentation=PIn.String(tableRaw.Rows[i]["Documentation10"].ToString());
						if(notGiven) {
							row["exclusion"]="X";
							row["explanation"]+="No influenza vaccine given, "+documentation;
						}
						else if(count>=2) {
							row["numerator"]="X";
							row["explanation"]="influenza vaccinations: "+count.ToString();
						}
						else {
							row["explanation"]="influenza vaccinations: "+count.ToString();
						}
						break;
					#endregion
					#region ImmunizeChild_11
					case QualityType.ImmunizeChild_11:
						int count1=PIn.Int(tableRaw.Rows[i]["Count1"].ToString());
						int count2=PIn.Int(tableRaw.Rows[i]["Count2"].ToString());
						int count3=PIn.Int(tableRaw.Rows[i]["Count3"].ToString());
						count3a=PIn.Int(tableRaw.Rows[i]["Count3a"].ToString());
						count3b=PIn.Int(tableRaw.Rows[i]["Count3b"].ToString());
						count3c=PIn.Int(tableRaw.Rows[i]["Count3c"].ToString());
						int count4=PIn.Int(tableRaw.Rows[i]["Count4"].ToString());
						int count5=PIn.Int(tableRaw.Rows[i]["Count5"].ToString());
						int count6=PIn.Int(tableRaw.Rows[i]["Count6"].ToString());
						bool notGiven1=PIn.Bool(tableRaw.Rows[i]["NotGiven1"].ToString());
						bool notGiven2=PIn.Bool(tableRaw.Rows[i]["NotGiven2"].ToString());
						bool notGiven3=PIn.Bool(tableRaw.Rows[i]["NotGiven3"].ToString());
						notGiven3a=PIn.Bool(tableRaw.Rows[i]["NotGiven3a"].ToString());
						notGiven3b=PIn.Bool(tableRaw.Rows[i]["NotGiven3b"].ToString());
						notGiven3c=PIn.Bool(tableRaw.Rows[i]["NotGiven3c"].ToString());
						bool notGiven4=PIn.Bool(tableRaw.Rows[i]["NotGiven4"].ToString());
						bool notGiven5=PIn.Bool(tableRaw.Rows[i]["NotGiven5"].ToString());
						bool notGiven6=PIn.Bool(tableRaw.Rows[i]["NotGiven6"].ToString());
						if(notGiven1 || notGiven2 || notGiven3 || notGiven3a || notGiven3b || notGiven3c || notGiven4 || notGiven5 || notGiven6) {
							row["exclusion"]="X";
							row["explanation"]+="Not given.";//too complicated to document.
						}
						else if(count1>=4 && count2>=3 
							&& (count3>=1 || (count3a>=1 && count3b>=1 && count3c>=1)) && count4>=2 && count5>=3 && count6>=1) {
							row["numerator"]="X";
							row["explanation"]="All vaccinations given.";
						}
						else {
							row["explanation"]="Missing vaccinations.";
						}
						break;
					#endregion
					#region ImmunizeChild_12
					case QualityType.ImmunizeChild_12:
						//ImmunizeChild_12--------------------------------------------------------------------------------------------------------------
						count1=PIn.Int(tableRaw.Rows[i]["Count1"].ToString());
						count2=PIn.Int(tableRaw.Rows[i]["Count2"].ToString());
						count3=PIn.Int(tableRaw.Rows[i]["Count3"].ToString());
						count3a=PIn.Int(tableRaw.Rows[i]["Count3a"].ToString());
						count3b=PIn.Int(tableRaw.Rows[i]["Count3b"].ToString());
						count3c=PIn.Int(tableRaw.Rows[i]["Count3c"].ToString());
						count4=PIn.Int(tableRaw.Rows[i]["Count4"].ToString());
						count5=PIn.Int(tableRaw.Rows[i]["Count5"].ToString());
						count6=PIn.Int(tableRaw.Rows[i]["Count6"].ToString());
						int count7=PIn.Int(tableRaw.Rows[i]["Count7"].ToString());
						notGiven1=PIn.Bool(tableRaw.Rows[i]["NotGiven1"].ToString());
						notGiven2=PIn.Bool(tableRaw.Rows[i]["NotGiven2"].ToString());
						notGiven3=PIn.Bool(tableRaw.Rows[i]["NotGiven3"].ToString());
						notGiven3a=PIn.Bool(tableRaw.Rows[i]["NotGiven3a"].ToString());
						notGiven3b=PIn.Bool(tableRaw.Rows[i]["NotGiven3b"].ToString());
						notGiven3c=PIn.Bool(tableRaw.Rows[i]["NotGiven3c"].ToString());
						notGiven4=PIn.Bool(tableRaw.Rows[i]["NotGiven4"].ToString());
						notGiven5=PIn.Bool(tableRaw.Rows[i]["NotGiven5"].ToString());
						notGiven6=PIn.Bool(tableRaw.Rows[i]["NotGiven6"].ToString());
						bool notGiven7=PIn.Bool(tableRaw.Rows[i]["NotGiven7"].ToString());
						if(notGiven1 || notGiven2 || notGiven3 || notGiven3a || notGiven3b || notGiven3c || notGiven4 || notGiven5 || notGiven6 || notGiven7) {
							row["exclusion"]="X";
							row["explanation"]+="Not given.";//too complicated to document.
						}
						else if(count1>=4 && count2>=3 
							&& (count3>=1 || (count3a>=1 && count3b>=1 && count3c>=1)) && count4>=2 && count5>=3 && count6>=1 && count7>=4) {
							row["numerator"]="X";
							row["explanation"]="All vaccinations given.";
						}
						else {
							row["explanation"]="Missing vaccinations.";
						}
						break;
					#endregion
					#region Pneumonia
					case QualityType.Pneumonia:
						//Pneumonia----------------------------------------------------------------------------------------------------------------
						DateVaccine=PIn.Date(tableRaw.Rows[i]["DateVaccine"].ToString());
						if(DateVaccine.Year<1880) {
							row["explanation"]="No pneumococcal vaccine given";
						}
						else {
							row["numerator"]="X";
							row["explanation"]="Pneumococcal vaccine given";
						}
						break;
					#endregion
					#region DiabetesBloodPressure
					case QualityType.DiabetesBloodPressure:
						//DiabetesBloodPressure---------------------------------------------------------------------------------------------------
						bool hasMedication=PIn.Bool(tableRaw.Rows[i]["HasMedication"].ToString());
						bool HasDiagnosisDiabetes=PIn.Bool(tableRaw.Rows[i]["HasDiagnosisDiabetes"].ToString());
						DateTime DateBP=PIn.Date(tableRaw.Rows[i]["DateBP"].ToString());
						int systolic=PIn.Int(tableRaw.Rows[i]["Systolic"].ToString());
						int diastolic=PIn.Int(tableRaw.Rows[i]["Diastolic"].ToString());
						bool HasDiagnosisPolycystic=PIn.Bool(tableRaw.Rows[i]["HasDiagnosisPolycystic"].ToString());
						bool HasDiagnosisAcuteDiabetes=PIn.Bool(tableRaw.Rows[i]["HasDiagnosisAcuteDiabetes"].ToString());
						if(!hasMedication && !HasDiagnosisDiabetes) {
							continue;//not part of denominator
						}
						if(HasDiagnosisPolycystic && !HasDiagnosisDiabetes) {
							row["exclusion"]="X";
							row["explanation"]+="polycystic ovaries";
						}
						else if(HasDiagnosisAcuteDiabetes && hasMedication && !HasDiagnosisDiabetes) {
							row["exclusion"]="X";
							row["explanation"]+="gestational or steroid induced diabetes";
						}
						else if(DateBP.Year<1880) {
							row["explanation"]="No BP entered";
						}
						else if(systolic < 90 && diastolic < 140) {
							row["numerator"]="X";
							row["explanation"]="Controlled blood pressure: "+systolic.ToString()+"/"+diastolic.ToString();
						}
						else {
							row["explanation"]="High blood pressure: "+systolic.ToString()+"/"+diastolic.ToString();
						}
						break;
					#endregion
					#region BloodPressureManage
					case QualityType.BloodPressureManage:
						//BloodPressureManage-------------------------------------------------------------------------------------------------------
						bool HasDiagnosisHypertension=PIn.Bool(tableRaw.Rows[i]["HasDiagnosisHypertension"].ToString());
						bool HasProcedureESRD=PIn.Bool(tableRaw.Rows[i]["HasProcedureESRD"].ToString());
						bool HasDiagnosisPregnancy=PIn.Bool(tableRaw.Rows[i]["HasDiagnosisPregnancy"].ToString());
						bool HasDiagnosisESRD=PIn.Bool(tableRaw.Rows[i]["HasDiagnosisESRD"].ToString());
						DateBP=PIn.Date(tableRaw.Rows[i]["DateBP"].ToString());
						systolic=PIn.Int(tableRaw.Rows[i]["Systolic"].ToString());
						diastolic=PIn.Int(tableRaw.Rows[i]["Diastolic"].ToString());
						if(!HasDiagnosisHypertension) {
							continue;//not part of denominator
						}
						if(HasProcedureESRD || HasDiagnosisPregnancy || HasDiagnosisESRD) {
							continue;//not part of denominator
						}
						if(DateBP.Year<1880) {
							row["explanation"]="No BP entered";
						}
						else if(systolic < 90 && diastolic < 140) {
							row["numerator"]="X";
							row["explanation"]="Controlled blood pressure: "+systolic.ToString()+"/"+diastolic.ToString();
						}
						else {
							row["explanation"]="High blood pressure: "+systolic.ToString()+"/"+diastolic.ToString();
						}
						break;
					#endregion
					default:
						throw new ApplicationException("Type not found: "+qtype.ToString());
				}
				rows.Add(row);
			}
			for(int i=0;i<rows.Count;i++) {
				table.Rows.Add(rows[i]);
			}
			return table;
		}
示例#23
0
 private static void FillFieldsForLabelPatient(Sheet sheet,Patient pat)
 {
     foreach(SheetField field in sheet.SheetFields){
         switch(field.FieldName){
             case "nameFL":
                 field.FieldValue=pat.GetNameFLFormal();
                 break;
             case "nameLF":
                 field.FieldValue=pat.GetNameLF();
                 break;
             case "address":
                 field.FieldValue=pat.Address;
                 if(pat.Address2!=""){
                     field.FieldValue+="\r\n"+pat.Address2;
                 }
                 break;
             case "cityStateZip":
                 field.FieldValue=pat.City+", "+pat.State+" "+pat.Zip;
                 break;
             case "ChartNumber":
                 field.FieldValue=pat.ChartNumber;
                 break;
             case "PatNum":
                 field.FieldValue=pat.PatNum.ToString();
                 break;
             case "dateTime.Today":
                 field.FieldValue=DateTime.Today.ToShortDateString();
                 break;
             case "birthdate":
                 //only a temporary workaround:
                 field.FieldValue="BD: "+pat.Birthdate.ToShortDateString();
                 break;
             case "priProvName":
                 field.FieldValue=Providers.GetLongDesc(pat.PriProv);
                 break;
             case "text":
                 field.FieldValue=GetParamByName(sheet,"text").ParamValue.ToString();
                 break;
         }
     }
 }
示例#24
0
		public static DataTable GetTable(EhrMeasureType mtype,DateTime dateStart,DateTime dateEnd,long provNum) {
			if(RemotingClient.RemotingRole==RemotingRole.ClientWeb) {
				return Meth.GetTable(MethodBase.GetCurrentMethod(),mtype,dateStart,dateEnd,provNum);
			}
			string command="";
			DataTable tableRaw=new DataTable();
			command="SELECT GROUP_CONCAT(provider.ProvNum) FROM provider WHERE provider.EhrKey="
				+"(SELECT pv.EhrKey FROM provider pv WHERE pv.ProvNum="+POut.Long(provNum)+")";
			string provs=Db.GetScalar(command);
			string[] tempProv=provs.Split(',');
			string provOID="";
			for(int oi=0;oi<tempProv.Length;oi++) {
				provOID=provOID+tempProv[oi];
				if(oi<tempProv.Length-1) {
					provOID+=",";
				}
			}
			command="SELECT GROUP_CONCAT(provider.NationalProvID) FROM provider WHERE provider.EhrKey="
				+"(SELECT pv.EhrKey FROM provider pv WHERE pv.ProvNum="+POut.Long(provNum)+")";
			string provNPIs=Db.GetScalar(command);
			//Some measures use a temp table.  Create a random number to tack onto the end of the temp table name to avoid possible table collisions.
			Random rnd=new Random();
			string rndStr=rnd.Next(1000000).ToString();
			switch(mtype) {
				#region ProblemList
				case EhrMeasureType.ProblemList:
					//Jordan's original query
					//command="SELECT PatNum,LName,FName, "
					//  +"(SELECT COUNT(*) FROM disease WHERE PatNum=patient.PatNum AND DiseaseDefNum="
					//    +POut.Long(PrefC.GetLong(PrefName.ProblemsIndicateNone))+") AS problemsNone, "
					//  +"(SELECT COUNT(*) FROM disease WHERE PatNum=patient.PatNum) AS problemsAll "
					//  +"FROM patient "
					//  +"WHERE EXISTS(SELECT * FROM procedurelog WHERE patient.PatNum=procedurelog.PatNum "
					//  +"AND procedurelog.ProcStatus=2 "//complete
					//  +"AND procedurelog.ProvNum IN("+POut.String(provs)+") "
					//  +"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
					//  +"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+")";
					//Query optimized to be faster by Cameron
					//command="SELECT A.*,COALESCE(problemsNone.Count,0) AS problemsNone,COALESCE(problemsAll.Count,0) AS problemsAll "
					//	+"FROM (SELECT patient.PatNum,LName,FName FROM patient "
					//	+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
					//	+"AND procedurelog.ProvNum IN("+POut.String(provs)+") "
					//	+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
					//	+"GROUP BY patient.PatNum) A "
					//	+"LEFT JOIN (SELECT PatNum,COUNT(*) AS 'Count' FROM disease WHERE DiseaseDefNum="+POut.Long(PrefC.GetLong(PrefName.ProblemsIndicateNone))+" "
					//	+"GROUP BY PatNum) problemsNone ON problemsNone.PatNum=A.PatNum "
					//	+"LEFT JOIN (SELECT PatNum,COUNT(*) AS 'Count' FROM disease GROUP BY PatNum) problemsAll ON problemsAll.PatNum=A.PatNum";
					//Query modified to count only problems with ICD9 or SNOMED code attached
					command="SELECT A.*,COALESCE(problemsNone.Count,0) AS problemsNone,COALESCE(problemsAll.Count,0) AS problemsAll "
						+"FROM (SELECT patient.PatNum,LName,FName FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
						+"AND procedurelog.ProvNum IN("+POut.String(provs)+") "
						+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"GROUP BY patient.PatNum) A "
						+"LEFT JOIN (SELECT PatNum,COUNT(*) AS 'Count' FROM disease WHERE DiseaseDefNum="+POut.Long(PrefC.GetLong(PrefName.ProblemsIndicateNone))+" "
						+"AND ProbStatus=0 GROUP BY PatNum) problemsNone ON problemsNone.PatNum=A.PatNum "
						+"LEFT JOIN (SELECT PatNum,COUNT(*) AS 'Count' FROM disease "
						+"INNER JOIN diseasedef ON disease.DiseaseDefNum=diseasedef.DiseaseDefNum "
						+"AND disease.DiseaseDefNum!="+POut.Long(PrefC.GetLong(PrefName.ProblemsIndicateNone))+" "
						+"WHERE (diseasedef.SnomedCode!='' OR diseasedef.ICD9Code!='') "
						+"GROUP BY PatNum) problemsAll ON problemsAll.PatNum=A.PatNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region MedicationList
				case EhrMeasureType.MedicationList:
					command="SELECT A.*,COALESCE(medsNone.Count,0) AS medsNone,COALESCE(medsAll.Count,0) AS medsAll "
						+"FROM (SELECT patient.PatNum,LName,FName	FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum	AND procedurelog.ProcStatus=2 "
						+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
						+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"GROUP BY patient.PatNum) A "
						+"LEFT JOIN (SELECT PatNum,COUNT(*) AS 'Count' FROM medicationpat "
						+"WHERE MedicationNum="+POut.Long(PrefC.GetLong(PrefName.MedicationsIndicateNone))+" "
						+"AND (YEAR(DateStop)<1880 OR DateStop>"+POut.Date(dateEnd)+") GROUP BY PatNum) medsNone ON medsNone.PatNum=A.PatNum "
						+"LEFT JOIN (SELECT PatNum,COUNT(*) AS 'Count' FROM medicationpat "
						+"WHERE MedicationNum!="+POut.Long(PrefC.GetLong(PrefName.MedicationsIndicateNone))+" "
						+"GROUP BY PatNum) medsAll ON medsAll.PatNum=A.PatNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region AllergyList
				case EhrMeasureType.AllergyList:
					//Jordan's original query
					//command="SELECT PatNum,LName,FName, "
					//  +"(SELECT COUNT(*) FROM allergy WHERE PatNum=patient.PatNum AND AllergyDefNum="
					//    +POut.Long(PrefC.GetLong(PrefName.AllergiesIndicateNone))+") AS allergiesNone, "
					//  +"(SELECT COUNT(*) FROM allergy WHERE PatNum=patient.PatNum) AS allergiesAll "
					//  +"FROM patient "
					//  +"WHERE EXISTS(SELECT * FROM procedurelog WHERE patient.PatNum=procedurelog.PatNum "
					//  +"AND procedurelog.ProcStatus=2 "//complete
					//  +"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
					//  +"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
					//  +"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+")";
					//Query optimized to be faster by Cameron
					command="SELECT A.*,COALESCE(allergiesNone.Count,0) AS allergiesNone,COALESCE(allergiesAll.Count,0) AS allergiesAll "
						+"FROM (SELECT patient.PatNum,LName,FName	FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum	AND procedurelog.ProcStatus=2 "
						+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
						+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"GROUP BY patient.PatNum) A "
						+"LEFT JOIN (SELECT PatNum,COUNT(*) AS 'Count' FROM allergy	"
						+"WHERE AllergyDefNum="+POut.Long(PrefC.GetLong(PrefName.AllergiesIndicateNone))+" AND StatusIsActive=1 "
						+"GROUP BY PatNum) allergiesNone ON allergiesNone.PatNum=A.PatNum "
						+"LEFT JOIN (SELECT PatNum,COUNT(*) AS 'Count' FROM allergy	"
						+"WHERE AllergyDefNum!="+POut.Long(PrefC.GetLong(PrefName.AllergiesIndicateNone))+" "
						+"GROUP BY PatNum) allergiesAll ON allergiesAll.PatNum=A.PatNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region Demographics
				case EhrMeasureType.Demographics:
					//language, gender, race, ethnicity, and birthdate
					//Jordan's original query
					//command="SELECT PatNum,LName,FName,Birthdate,Gender,Race,Language "
					//  +"FROM patient "
					//  +"WHERE EXISTS(SELECT * FROM procedurelog WHERE patient.PatNum=procedurelog.PatNum "
					//  +"AND procedurelog.ProcStatus=2 "//complete
					//  +"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
					//  +"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
					//  +"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+")";
					//Query optimized to be faster by Cameron
					//command="SELECT patient.PatNum,LName,FName,Birthdate,Gender,Race,Language "
					//	+"FROM patient "
					//	+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
					//	+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
					//	+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
					//	+"GROUP BY patient.PatNum";
					command="SELECT patient.PatNum,LName,FName,Birthdate,Gender,Language,COALESCE(race.HasRace,0) AS HasRace,COALESCE(ethnicity.HasEthnicity,0) AS HasEthnicity "
						+"FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
						+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
						+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"LEFT JOIN(SELECT PatNum, 1 AS HasRace FROM patientrace "
						+"WHERE patientrace.Race IN( "
						+POut.Int((int)PatRace.AfricanAmerican)+","
						+POut.Int((int)PatRace.AmericanIndian)+","
						+POut.Int((int)PatRace.Asian)+","
						+POut.Int((int)PatRace.DeclinedToSpecifyRace)+","
						+POut.Int((int)PatRace.HawaiiOrPacIsland)+","
						+POut.Int((int)PatRace.Other)+","
						+POut.Int((int)PatRace.White)+" "
						+") GROUP BY PatNum "
						+") AS race ON race.PatNum=patient.PatNum "
						+"LEFT JOIN(SELECT PatNum, 1 AS HasEthnicity FROM patientrace "
						+"WHERE patientrace.Race IN( "
						+POut.Int((int)PatRace.Hispanic)+","
						+POut.Int((int)PatRace.NotHispanic)+","
						+POut.Int((int)PatRace.DeclinedToSpecifyEthnicity)+" "
						+") GROUP BY PatNum "
						+") AS ethnicity ON ethnicity.PatNum=patient.PatNum "
						+"GROUP BY patient.PatNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region Education
				case EhrMeasureType.Education:
					//Jordan's original query
					//command="SELECT PatNum,LName,FName, "
					//  +"(SELECT COUNT(*) FROM ehrmeasureevent WHERE PatNum=patient.PatNum AND EventType="+POut.Int((int)EhrMeasureEventType.EducationProvided)+") AS edCount "
					//  +"FROM patient "
					//  +"WHERE EXISTS(SELECT * FROM procedurelog WHERE patient.PatNum=procedurelog.PatNum "
					//  +"AND procedurelog.ProcStatus=2 "//complete
					//  +"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
					//  +"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
					//  +"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+")";
					//Query optimized to be faster by Cameron
					command="SELECT A.*,COALESCE(edCount.Count,0) AS edCount "
						+"FROM (SELECT patient.PatNum,LName,FName	FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
						+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
						+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"GROUP BY patient.PatNum) A "
						+"LEFT JOIN (SELECT PatNum,COUNT(*) AS 'Count' FROM ehrmeasureevent "
						+"WHERE EventType="+POut.Int((int)EhrMeasureEventType.EducationProvided)+" "
						+"GROUP BY PatNum) edCount ON edCount.PatNum=A.PatNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region TimelyAccess
				case EhrMeasureType.TimelyAccess:
					//denominator is patients
					command="DROP TABLE IF EXISTS tempehrmeasure"+rndStr;
					Db.NonQ(command);
					command="CREATE TABLE tempehrmeasure"+rndStr+@" (
						PatNum bigint NOT NULL auto_increment PRIMARY KEY,
						LName varchar(255) NOT NULL,
						FName varchar(255) NOT NULL,
						lastVisitDate date NOT NULL,
						deadlineDate date NOT NULL,
						accessProvided tinyint NOT NULL
						) DEFAULT CHARSET=utf8";
					Db.NonQ(command);
					//get all patients who have been seen during the period, along with the most recent visit date during the period
					command="INSERT INTO tempehrmeasure"+rndStr+" (PatNum,LName,FName,lastVisitDate) SELECT patient.PatNum,LName,FName, "
						+"MAX(procedurelog.ProcDate) "
						+"FROM patient,procedurelog "
						+"WHERE patient.PatNum=procedurelog.PatNum "
						+"AND procedurelog.ProcStatus=2 "//complete
						//+"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
						+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
						+"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
						+"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+" "
						+"GROUP BY patient.PatNum";
					tableRaw=Db.GetTable(command);
					//calculate the deadlineDate
					command="UPDATE tempehrmeasure"+rndStr+" "
						+"SET deadlineDate = ADDDATE(lastVisitDate, INTERVAL 4 DAY)";
					Db.NonQ(command);
					command="UPDATE tempehrmeasure"+rndStr+" "
						+"SET deadlineDate = ADDDate(lastVisitDate, INTERVAL 2 DAY) "//add 2 more days for weekend
						+"WHERE DAYOFWEEK(lastVisitDate) IN(3,4,5,6)";//tues, wed, thur, fri
					Db.NonQ(command);
					//date provided could be any date before deadline date if there was more than one visit
					command="UPDATE tempehrmeasure"+rndStr+",ehrmeasureevent SET accessProvided = 1 "
						+"WHERE ehrmeasureevent.PatNum=tempehrmeasure"+rndStr+".PatNum "
						+"AND EventType="+POut.Int((int)EhrMeasureEventType.OnlineAccessProvided)+" "
						+"AND DATE(ehrmeasureevent.DateTEvent) <= deadlineDate";
					Db.NonQ(command);
					command="SELECT * FROM tempehrmeasure"+rndStr;
					tableRaw=Db.GetTable(command);
					command="DROP TABLE IF EXISTS tempehrmeasure"+rndStr;
					Db.NonQ(command);
					break;
				#endregion
				#region ProvOrderEntry
				case EhrMeasureType.ProvOrderEntry:
					//Jordan's original query
					//command="SELECT PatNum,LName,FName, "
					//  +"(SELECT COUNT(*) FROM medicationpat mp2 WHERE mp2.PatNum=patient.PatNum "
					//  +"AND mp2.PatNote != '' AND mp2.DateStart > "+POut.Date(new DateTime(1880,1,1))+") AS countOrders "
					//  +"FROM patient "
					//  +"WHERE EXISTS(SELECT * FROM procedurelog WHERE patient.PatNum=procedurelog.PatNum "//at least one procedure in the period
					//  +"AND procedurelog.ProcStatus=2 "//complete
					//  +"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
					//  +"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
					//  +"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+") "
					//  +"AND EXISTS(SELECT * FROM medicationpat WHERE medicationpat.PatNum=patient.PatNum)";//at least one medication
					//Query optimized to be faster by Cameron
					//command="SELECT A.*,COALESCE(countOrders.Count,0) AS countOrders "
					//	+"FROM (SELECT patient.PatNum,LName,FName FROM patient "
					//	+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
					//	+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
					//	+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
					//	+"INNER JOIN medicationpat ON medicationpat.PatNum=patient.PatNum "
					//	+"GROUP BY patient.PatNum) A "
					//	+"LEFT JOIN (SELECT PatNum,COUNT(*) AS 'Count' FROM medicationpat mp2 "
					//	+"WHERE mp2.PatNote!='' AND mp2.DateStart > "+POut.Date(new DateTime(1880,1,1))+" "
					//	+"GROUP BY PatNum) countOrders ON countOrders.PatNum=A.PatNum";
					//Now using IsCpoe flag instead of PatNote and DateStart to mark as an order
					command="SELECT allpats.*,COALESCE(CountCpoe.Count,0) AS CountCpoe "
						+"FROM (SELECT patient.PatNum,patient.LName,patient.FName FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
						+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
						+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"INNER JOIN medicationpat ON medicationpat.PatNum=patient.PatNum "
						+"AND MedicationNum!="+POut.Long(PrefC.GetLong(PrefName.MedicationsIndicateNone))+" "
						+"GROUP BY patient.PatNum) allpats "//allpats seen by provider in date range with medication in med list that is not the 'None' medication
						+"LEFT JOIN (SELECT medicationpat.PatNum,COUNT(*) AS 'Count' FROM medicationpat "
						+"WHERE medicationpat.IsCpoe=1 GROUP BY medicationpat.PatNum) CountCpoe ON CountCpoe.PatNum=allpats.PatNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region CPOE_MedOrdersOnly
				case EhrMeasureType.CPOE_MedOrdersOnly:
					//This optional alternate no longer counts patients with meds in med list, instead we will count the orders created by the Provider during the reporting period and what percentage are CPOE (meaning they were entered through NewCrop)
					command="SELECT patient.PatNum,patient.LName,patient.FName,medicationpat.MedicationPatNum,"
						+"COALESCE(medication.MedName,medicationpat.MedDescript) AS MedName,medicationpat.DateStart,"
						+"medicationpat.IsCpoe FROM patient "
						+"INNER JOIN medicationpat ON medicationpat.PatNum=patient.PatNum "
						+"AND medicationpat.ProvNum IN("+POut.String(provs)+")	"
						+"AND medicationpat.PatNote!='' "
						+"AND medicationpat.DateStart BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"LEFT JOIN medication ON medication.MedicationNum=medicationpat.MedicationNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region CPOE_PreviouslyOrdered
				case EhrMeasureType.CPOE_PreviouslyOrdered:
					//For details regarding this optional alternate see: https://questions.cms.gov/faq.php?id=5005&faqId=3257, summmary: If you prescribe more than 100 meds during the reporting period, maintain medication lists that include meds the Provider did not order, and orders meds for less than 30% of patients with meds in med list during the reporting period, then the denominator can be limited to only those patients for whom the Provider has previously ordered meds.
					command="SELECT allpatsprevordered.*,COALESCE(CountCpoe.Count,0) AS CountCpoe "
						+"FROM (SELECT patient.PatNum,patient.LName,patient.FName FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
						+"AND procedurelog.ProvNum IN("+POut.String(provs)+") "
						+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"INNER JOIN medicationpat ON medicationpat.PatNum=patient.PatNum "
						+"AND medicationpat.MedicationNum!="+POut.Long(PrefC.GetLong(PrefName.MedicationsIndicateNone))+" ";
					//this next join limits to only patients for whom the provider has previously ordered medications
					command+="INNER JOIN (SELECT PatNum FROM medicationpat "
						+"WHERE PatNote!='' AND DateStart > "+POut.Date(new DateTime(1880,1,1))+" "
						+"AND ProvNum IN("+POut.String(provs)+") GROUP BY PatNum) prevordered ON prevordered.PatNum=patient.PatNum "
						+"GROUP BY patient.PatNum) allpatsprevordered "
						+"LEFT JOIN (SELECT medicationpat.PatNum,COUNT(*) AS 'Count' FROM medicationpat "
						+"WHERE medicationpat.IsCpoe=1 GROUP BY PatNum) CountCpoe ON CountCpoe.PatNum=allpatsprevordered.PatNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region Rx
				case EhrMeasureType.Rx:
					command="SELECT patient.PatNum,LName,FName,SendStatus,RxDate "
						+"FROM rxpat,patient "
						+"WHERE rxpat.PatNum=patient.PatNum "
						+"AND IsControlled = 0 "
						//+"AND rxpat.ProvNum="+POut.Long(provNum)+" "
						+"AND rxpat.ProvNum IN("+POut.String(provs)+")	"
						+"AND RxDate >= "+POut.Date(dateStart)+" "
						+"AND RxDate <= "+POut.Date(dateEnd);
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region VitalSigns
				case EhrMeasureType.VitalSigns:
					//Jordan's original query
					//command="SELECT PatNum,LName,FName, "
					//  +"(SELECT COUNT(*) FROM vitalsign WHERE vitalsign.PatNum=patient.PatNum AND Height>0 AND Weight>0) AS hwCount, "
					//  +"(SELECT COUNT(*) FROM vitalsign WHERE vitalsign.PatNum=patient.PatNum AND BpSystolic>0 AND BpDiastolic>0) AS bpCount "
					//  +"FROM patient "
					//  +"WHERE EXISTS(SELECT * FROM procedurelog WHERE patient.PatNum=procedurelog.PatNum "
					//  +"AND procedurelog.ProcStatus=2 "//complete
					//  +"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
					//  +"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
					//  +"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+") "
					//  +"AND patient.Birthdate <= "+POut.Date(DateTime.Today.AddYears(-2));//2 and older
					//Query optimized to be faster by Cameron
					//command="SELECT A.*,COALESCE(hwCount.Count,0) AS hwCount,COALESCE(bpCount.Count,0) AS bpCount "
					//	+"FROM (SELECT patient.PatNum,LName,FName FROM patient "
					//	+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
					//	+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
					//	+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
					//	+"WHERE patient.Birthdate <= "+POut.Date(DateTime.Today.AddYears(-2))+" "//2 and older
					//	+"GROUP BY patient.PatNum) A "
					//	+"LEFT JOIN (SELECT PatNum,COUNT(*) AS 'Count' FROM vitalsign	WHERE Height>0 AND Weight>0 GROUP BY PatNum) hwCount ON hwCount.PatNum=A.PatNum "
					//	+"LEFT JOIN (SELECT PatNum,COUNT(*) AS 'Count' FROM vitalsign WHERE BpSystolic>0 AND BpDiastolic>0 GROUP BY PatNum) bpCount ON bpCount.PatNum=A.PatNum";
					//Query modified for new requirements (Optional 2013, Required 2014 and beyond).  BP 3 and older only, Height/Weight all ages
					command="SELECT A.*,COALESCE(hwCount.Count,0) AS hwCount,COALESCE(bpCount.Count,0) AS bpCount "
						+"FROM (SELECT patient.PatNum,LName,FName FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
						+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
						+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"WHERE patient.Birthdate <= "+POut.Date(DateTime.Today.AddYears(-2))+" "//2 and older
						+"GROUP BY patient.PatNum) A "
						+"LEFT JOIN (SELECT PatNum,COUNT(*) AS 'Count' FROM vitalsign	WHERE Height>0 AND Weight>0 GROUP BY PatNum) hwCount ON hwCount.PatNum=A.PatNum "
						+"LEFT JOIN (SELECT PatNum,COUNT(*) AS 'Count' FROM vitalsign WHERE BpSystolic>0 AND BpDiastolic>0 GROUP BY PatNum) bpCount ON bpCount.PatNum=A.PatNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region VitalSigns2014
				case EhrMeasureType.VitalSigns2014:
					command="SELECT A.*,COALESCE(hwCount.Count,0) AS hwCount,"
						+"(CASE WHEN A.Birthdate <= (A.LastVisitInDateRange-INTERVAL 3 YEAR) ";//BP count only if 3 and older at time of last visit in date range
					command+="THEN COALESCE(bpCount.Count,0) ELSE 1 END) AS bpCount "
						+"FROM (SELECT patient.PatNum,LName,FName,Birthdate,MAX(procedurelog.ProcDate) AS LastVisitInDateRange "
						+"FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
						+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
						+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"GROUP BY patient.PatNum) A "
						+"LEFT JOIN (SELECT PatNum,COUNT(*) AS 'Count' FROM vitalsign	WHERE Height>0 AND Weight>0 GROUP BY PatNum) hwCount ON hwCount.PatNum=A.PatNum "
						+"LEFT JOIN (SELECT PatNum,COUNT(*) AS 'Count' FROM vitalsign WHERE BpSystolic>0 AND BpDiastolic>0 GROUP BY PatNum) bpCount ON bpCount.PatNum=A.PatNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region VitalSignsBMIOnly
				case EhrMeasureType.VitalSignsBMIOnly:
					command="SELECT A.*,COALESCE(hwCount.Count,0) AS hwCount "
						+"FROM (SELECT patient.PatNum,LName,FName FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
						+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
						+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"GROUP BY patient.PatNum) A "
						+"LEFT JOIN (SELECT PatNum,COUNT(*) AS 'Count' FROM vitalsign	WHERE Height>0 AND Weight>0 GROUP BY PatNum) hwCount ON hwCount.PatNum=A.PatNum ";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region VitalSignsBPOnly
				case EhrMeasureType.VitalSignsBPOnly:
					command="SELECT patient.PatNum,LName,FName,Birthdate,COUNT(DISTINCT VitalsignNum) AS bpcount "
						+"FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum "
						+"AND procedurelog.ProcStatus=2	AND procedurelog.ProvNum IN("+POut.String(provs)+") "
						+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"LEFT JOIN vitalsign ON vitalsign.PatNum=patient.PatNum AND BpSystolic!=0 AND BpDiastolic!=0 "
						+"GROUP BY patient.PatNum "
						+"HAVING Birthdate<=MAX(ProcDate)-INTERVAL 3 YEAR ";//only include in results if over 3 yrs old at date of last visit
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region Smoking
				case EhrMeasureType.Smoking:
					//Jordan's original query
					//command="SELECT PatNum,LName,FName,SmokeStatus "
					//  +"FROM patient "
					//  +"WHERE EXISTS(SELECT * FROM procedurelog WHERE patient.PatNum=procedurelog.PatNum "
					//  +"AND procedurelog.ProcStatus=2 "//complete
					//  +"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
					//  +"AND procedurelog.ProcDate >= "+POut.Date(dateStart)+" "
					//  +"AND procedurelog.ProcDate <= "+POut.Date(dateEnd)+") "
					//  +"AND patient.Birthdate <= "+POut.Date(DateTime.Today.AddYears(-13));//13 and older
					//Query optimized to be faster by Cameron
					command="SELECT patient.PatNum,LName,FName,SmokingSnoMed FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum AND procedurelog.ProcStatus=2 "
						+"AND procedurelog.ProvNum IN("+POut.String(provs)+") "
						+"AND procedurelog.ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"WHERE patient.Birthdate <= "+POut.Date(DateTime.Today.AddYears(-13))+" "//13 and older
						+"GROUP BY patient.PatNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region Lab
				case EhrMeasureType.Lab:
					//Jordan's original query
					//command="SELECT patient.PatNum,LName,FName,DateTimeOrder, "
					//  +"(SELECT COUNT(*) FROM labpanel WHERE labpanel.MedicalOrderNum=medicalorder.MedicalOrderNum) AS panelCount "
					//  +"FROM medicalorder,patient "
					//  +"WHERE medicalorder.PatNum=patient.PatNum "
					//  +"AND MedOrderType="+POut.Int((int)MedicalOrderType.Laboratory)+" "
					//  +"AND medicalorder.ProvNum="+POut.Long(provNum)+" "
					//  +"AND DATE(DateTimeOrder) >= "+POut.Date(dateStart)+" "
					//  +"AND DATE(DateTimeOrder) <= "+POut.Date(dateEnd);
					//Query optimized to be faster by Cameron
					//TODO: Combine these queries to get old and new lab data
					command="SELECT 1 AS IsOldLab,patient.PatNum,LName,FName,DateTimeOrder,COALESCE(panels.Count,0) AS ResultCount FROM patient "
						+"INNER JOIN medicalorder ON patient.PatNum=medicalorder.PatNum "
							+"AND MedOrderType="+POut.Int((int)MedicalOrderType.Laboratory)+" "
							+"AND medicalorder.ProvNum IN("+POut.String(provs)+") "
							+"AND DATE(DateTimeOrder) BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"LEFT JOIN (SELECT MedicalOrderNum,COUNT(*) AS 'Count' FROM labpanel GROUP BY MedicalOrderNum "
						+") panels ON panels.MedicalOrderNum=medicalorder.MedicalOrderNum "
						+"UNION ALL "
						+"SELECT 0 AS IsOldLab,patient.PatNum,LName,FName,STR_TO_DATE(ObservationDateTimeStart,'%Y%m%d') AS DateTimeOrder,COALESCE(ehrlabs.Count,0) AS ResultCount FROM patient "
						+"INNER JOIN ehrlab ON patient.PatNum=ehrlab.PatNum "
						+"LEFT JOIN (SELECT EhrLabNum, COUNT(*) AS 'Count' FROM ehrlabresult "
							+"WHERE ehrlabresult.ValueType='NM' OR ehrlabresult.ValueType='SN' "
							+"OR ehrlabresult.ObservationValueCodedElementID IN ("+_snomedLabResult+") "
							+"OR ehrlabresult.ObservationValueCodedElementIDAlt IN ("+_snomedLabResult+") "
							+"GROUP BY EhrLabNum "
						+") ehrlabs ON ehrlab.EhrLabNum=ehrlabs.EhrLabNum "
						+"WHERE (CASE WHEN ehrlab.OrderingProviderIdentifierTypeCode='NPI' THEN ehrlab.OrderingProviderID IN("+POut.String(provNPIs)+") " //When the lab is using a NPI number to determine provider.
							+"WHEN ehrlab.OrderingProviderIdentifierTypeCode='PRN' THEN ( " //When the lab is using provider number to determine provider.
								+"CASE WHEN ehrlab.OrderingProviderAssigningAuthorityUniversalID=( " //If the AssigningAuthority is OpenDental.
									+"SELECT IDRoot FROM oidinternal WHERE IDType='Provider' GROUP BY IDType "
								+") THEN ehrlab.OrderingProviderID IN('"+POut.String(provOID)+"') END) " //Use the ProvNum to determine provider.
							+"ELSE FALSE END) " //If the AssigningAuthority is not OpenDental, we have no way to tell who the provider is.
						+"AND ehrlab.ObservationDateTimeStart BETWEEN DATE_FORMAT("+POut.Date(dateStart)+",'%Y%m%d') AND DATE_FORMAT("+POut.Date(dateEnd)+",'%Y%m%d') "
						+"AND (CASE WHEN ehrlab.UsiCodeSystemName='LN' THEN ehrlab.UsiID WHEN ehrlab.UsiCodeSystemNameAlt='LN' THEN ehrlab.UsiIDAlt ELSE '' END) "
							+"NOT IN (SELECT LoincCode FROM loinc WHERE loinc.ClassType LIKE '%rad%')";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region ElectronicCopy
				case EhrMeasureType.ElectronicCopy:
					command="DROP TABLE IF EXISTS tempehrmeasure"+rndStr;
					Db.NonQ(command);
					command="CREATE TABLE tempehrmeasure"+rndStr+@" (
						TempEhrMeasureNum bigint NOT NULL auto_increment PRIMARY KEY,
						PatNum bigint NOT NULL,
						LName varchar(255) NOT NULL,
						FName varchar(255) NOT NULL,
						dateRequested date NOT NULL,
						dateDeadline date NOT NULL,
						copyProvided tinyint NOT NULL,
						INDEX(PatNum)
						) DEFAULT CHARSET=utf8";
					Db.NonQ(command);
					command="INSERT INTO tempehrmeasure"+rndStr+" (PatNum,LName,FName,dateRequested) SELECT patient.PatNum,LName,FName,DATE(DateTEvent) "
						+"FROM ehrmeasureevent,patient "
						+"WHERE patient.PatNum=ehrmeasureevent.PatNum "
						+"AND EventType="+POut.Int((int)EhrMeasureEventType.ElectronicCopyRequested)+" "
						+"AND DATE(DateTEvent) >= "+POut.Date(dateStart)+" "
						+"AND DATE(DateTEvent) <= "+POut.Date(dateEnd)+" "
						//+"AND patient.PriProv="+POut.Long(provNum);
						+"AND patient.PriProv IN("+POut.String(provs)+")";
					Db.NonQ(command);
					command="UPDATE tempehrmeasure"+rndStr+" "
						+"SET dateDeadline = ADDDATE(dateRequested, INTERVAL 3 DAY)";
					Db.NonQ(command);
					command="UPDATE tempehrmeasure"+rndStr+" "
						+"SET dateDeadline = ADDDate(dateDeadline, INTERVAL 2 DAY) "//add 2 more days for weekend
						+"WHERE DAYOFWEEK(dateRequested) IN(4,5,6)";//wed, thur, fri
					Db.NonQ(command);
					command="UPDATE tempehrmeasure"+rndStr+",ehrmeasureevent SET copyProvided = 1 "
						+"WHERE ehrmeasureevent.PatNum=tempehrmeasure"+rndStr+".PatNum AND EventType="+POut.Int((int)EhrMeasureEventType.ElectronicCopyProvidedToPt)+" "
						+"AND DATE(ehrmeasureevent.DateTEvent) >= dateRequested "
						+"AND DATE(ehrmeasureevent.DateTEvent) <= dateDeadline";
					Db.NonQ(command);
					command="SELECT * FROM tempehrmeasure"+rndStr;
					tableRaw=Db.GetTable(command);
					command="DROP TABLE IF EXISTS tempehrmeasure"+rndStr;
					Db.NonQ(command);
					break;
				#endregion
				#region ClinicalSummaries
				case EhrMeasureType.ClinicalSummaries:
					command="DROP TABLE IF EXISTS tempehrmeasure"+rndStr;
					Db.NonQ(command);
					command="CREATE TABLE tempehrmeasure"+rndStr+@" (
						TempEhrMeasureNum bigint NOT NULL auto_increment PRIMARY KEY,
						PatNum bigint NOT NULL,
						LName varchar(255) NOT NULL,
						FName varchar(255) NOT NULL,
						visitDate date NOT NULL,
						deadlineDate date NOT NULL,
						summaryProvided tinyint NOT NULL,
						INDEX(PatNum)
						) DEFAULT CHARSET=utf8";
					Db.NonQ(command);
					command="INSERT INTO tempehrmeasure"+rndStr+" (PatNum,LName,FName,visitDate) SELECT patient.PatNum,LName,FName,ProcDate "
						+"FROM procedurelog "
						+"LEFT JOIN patient ON patient.PatNum=procedurelog.PatNum "
						+"WHERE ProcDate >= "+POut.Date(dateStart)+" "
						+"AND ProcDate <= "+POut.Date(dateEnd)+" "
						//+"AND procedurelog.ProvNum="+POut.Long(provNum)+" "
						+"AND procedurelog.ProvNum IN("+POut.String(provs)+") "
						+"AND procedurelog.ProcStatus="+POut.Int((int)ProcStat.C)+" "
						+"GROUP BY procedurelog.PatNum,ProcDate";
					Db.NonQ(command);
					command="UPDATE tempehrmeasure"+rndStr+" "
						+"SET deadlineDate = ADDDATE(visitDate, INTERVAL 3 DAY)";
					Db.NonQ(command);
					command="UPDATE tempehrmeasure"+rndStr+" "
						+"SET DeadlineDate = ADDDate(deadlineDate, INTERVAL 2 DAY) "//add 2 more days for weekend
						+"WHERE DAYOFWEEK(visitDate) IN(4,5,6)";//wed, thur, fri
					Db.NonQ(command);
					command="UPDATE tempehrmeasure"+rndStr+",ehrmeasureevent SET summaryProvided = 1 "
						+"WHERE ehrmeasureevent.PatNum=tempehrmeasure"+rndStr+".PatNum AND EventType="+POut.Int((int)EhrMeasureEventType.ClinicalSummaryProvidedToPt)+" "
						+"AND DATE(ehrmeasureevent.DateTEvent) >= visitDate "
						+"AND DATE(ehrmeasureevent.DateTEvent) <= deadlineDate";
					Db.NonQ(command);
					command="SELECT * FROM tempehrmeasure"+rndStr;
					tableRaw=Db.GetTable(command);
					command="DROP TABLE IF EXISTS tempehrmeasure"+rndStr;
					Db.NonQ(command);
					break;
				#endregion
				#region Reminders
				case EhrMeasureType.Reminders:
					//Jordan's original query
					//command="SELECT PatNum,LName,FName, "
					//  +"(SELECT COUNT(*) FROM ehrmeasureevent WHERE PatNum=patient.PatNum AND EventType="+POut.Int((int)EhrMeasureEventType.ReminderSent)+" "
					//  +"AND DATE(ehrmeasureevent.DateTEvent) >= "+POut.Date(dateStart)+" "
					//  +"AND DATE(ehrmeasureevent.DateTEvent) <= "+POut.Date(dateEnd)+" "
					//  +") AS reminderCount "
					//  +"FROM patient "
					//  +"WHERE patient.Birthdate > '1880-01-01' "//a birthdate is entered
					//  +"AND (patient.Birthdate > "+POut.Date(DateTime.Today.AddYears(-6))+" "//5 years or younger
					//  +"OR patient.Birthdate <= "+POut.Date(DateTime.Today.AddYears(-65))+") "//65+
					//  +"AND patient.PatStatus="+POut.Int((int)PatientStatus.Patient)+" "
					//  +"AND patient.PriProv="+POut.Long(provNum);
					//Query optimized to be faster by Cameron
					//command="SELECT patient.PatNum,LName,FName,COALESCE(reminderCount.Count,0) AS reminderCount FROM patient "
					//	+"LEFT JOIN (SELECT PatNum,COUNT(*) AS 'Count' FROM ehrmeasureevent "
					//	+"WHERE EventType="+POut.Int((int)EhrMeasureEventType.ReminderSent)+" "
					//	+"AND DATE(ehrmeasureevent.DateTEvent) BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
					//	+"GROUP BY PatNum) reminderCount ON reminderCount.PatNum=patient.PatNum "
					//	+"WHERE patient.Birthdate > '1880-01-01' "//a birthdate is entered
					//	+"AND (patient.Birthdate > "+POut.Date(DateTime.Today.AddYears(-6))+" "//5 years or younger
					//	+"OR patient.Birthdate <= "+POut.Date(DateTime.Today.AddYears(-65))+") "//65+
					//	+"AND patient.PatStatus="+POut.Int((int)PatientStatus.Patient)+" "
					//	+"AND patient.PriProv IN("+POut.String(provs)+")";
					//Query modified to only return patients that have been seen by any provider in the last 3 years based on dateStart of measurement period
					command="SELECT patient.PatNum,LName,FName,COALESCE(reminderCount.Count,0) AS reminderCount FROM patient "
						+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum "
						+"AND ProcStatus=2 AND ProcDate>"+POut.Date(dateStart)+"-INTERVAL 3 YEAR "
						+"LEFT JOIN (SELECT ehrmeasureevent.PatNum,COUNT(*) AS 'Count' FROM ehrmeasureevent "
						+"WHERE EventType="+POut.Int((int)EhrMeasureEventType.ReminderSent)+" "
						+"AND DATE(ehrmeasureevent.DateTEvent) BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"GROUP BY ehrmeasureevent.PatNum) reminderCount ON reminderCount.PatNum=patient.PatNum "
						+"WHERE patient.Birthdate > '1880-01-01' "//a birthdate is entered
						+"AND (patient.Birthdate > "+POut.Date(dateStart)+"-INTERVAL 5 YEAR "//5 years or younger as of start of measurement period
						+"OR patient.Birthdate <= "+POut.Date(dateStart)+"-INTERVAL 65 YEAR) "//65+ as of start of measurement period
						+"AND patient.PatStatus="+POut.Int((int)PatientStatus.Patient)+" "
						+"AND patient.PriProv IN("+POut.String(provs)+") "
						+"GROUP BY patient.PatNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region MedReconcile
				case EhrMeasureType.MedReconcile:
					//command="DROP TABLE IF EXISTS tempehrmeasure"+rndStr;
					//Db.NonQ(command);
					//command="CREATE TABLE tempehrmeasure"+rndStr+@" (
					//	PatNum bigint NOT NULL PRIMARY KEY,
					//	LName varchar(255) NOT NULL,
					//	FName varchar(255) NOT NULL,
					//	RefCount int NOT NULL,
					//	ReconcileCount int NOT NULL
					//	) DEFAULT CHARSET=utf8";
					//Db.NonQ(command);
					//command="INSERT INTO tempehrmeasure"+rndStr+" (PatNum,LName,FName,RefCount) SELECT patient.PatNum,LName,FName,COUNT(*) "
					//	+"FROM refattach,patient "
					//	+"WHERE patient.PatNum=refattach.PatNum "
					//	//+"AND patient.PriProv="+POut.Long(provNum)+" "
					//	+"AND patient.PriProv IN("+POut.String(provs)+") "
					//	+"AND RefDate >= "+POut.Date(dateStart)+" "
					//	+"AND RefDate <= "+POut.Date(dateEnd)+" "
					//	+"AND IsFrom=1 AND IsTransitionOfCare=1 "
					//	+"GROUP BY refattach.PatNum";
					//Db.NonQ(command);
					//command="UPDATE tempehrmeasure"+rndStr+" "
					//	+"SET ReconcileCount = (SELECT COUNT(*) FROM ehrmeasureevent "
					//	+"WHERE ehrmeasureevent.PatNum=tempehrmeasure"+rndStr+".PatNum AND EventType="+POut.Int((int)EhrMeasureEventType.MedicationReconcile)+" "
					//	+"AND DATE(ehrmeasureevent.DateTEvent) >= "+POut.Date(dateStart)+" "
					//	+"AND DATE(ehrmeasureevent.DateTEvent) <= "+POut.Date(dateEnd)+")";
					//Db.NonQ(command);
					//command="SELECT * FROM tempehrmeasure"+rndStr;
					//tableRaw=Db.GetTable(command);
					//command="DROP TABLE IF EXISTS tempehrmeasure"+rndStr;
					//Db.NonQ(command);
					//Reworked to only count patients seen by this provider in the date range
					command="SELECT ptsRefCnt.*,COALESCE(RecCount,0) AS ReconcileCount "
						+"FROM (SELECT ptsSeen.*,COUNT(DISTINCT refattach.RefAttachNum) AS RefCount "
							+"FROM (SELECT patient.PatNum,LName,FName FROM patient "
								+"INNER JOIN procedurelog ON procedurelog.PatNum=patient.PatNum "
								+"AND ProcStatus=2 AND ProcDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
								+"AND procedurelog.ProvNum IN("+POut.String(provs)+")	"
								+"GROUP BY patient.PatNum) ptsSeen "
							+"INNER JOIN refattach ON ptsSeen.PatNum=refattach.PatNum "
							+"AND RefDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
							+"AND IsFrom=1 AND IsTransitionOfCare=1 "
							+"GROUP BY ptsSeen.PatNum) ptsRefCnt "
						+"LEFT JOIN (SELECT ehrmeasureevent.PatNum,COUNT(*) AS RecCount FROM ehrmeasureevent "
							+"WHERE EventType="+POut.Int((int)EhrMeasureEventType.MedicationReconcile)+" "
							+"AND DATE(ehrmeasureevent.DateTEvent) BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
							+"GROUP BY ehrmeasureevent.PatNum) ptsRecCount ON ptsRefCnt.PatNum=ptsRecCount.PatNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				#region SummaryOfCare
				case EhrMeasureType.SummaryOfCare:
					//command="DROP TABLE IF EXISTS tempehrmeasure"+rndStr;
					//Db.NonQ(command);
					//command="CREATE TABLE tempehrmeasure"+rndStr+@" (
					//	PatNum bigint NOT NULL PRIMARY KEY,
					//	LName varchar(255) NOT NULL,
					//	FName varchar(255) NOT NULL,
					//	RefCount int NOT NULL,
					//	CcdCount int NOT NULL
					//	) DEFAULT CHARSET=utf8";
					//Db.NonQ(command);
					//command="INSERT INTO tempehrmeasure"+rndStr+" (PatNum,LName,FName,RefCount) SELECT patient.PatNum,LName,FName,COUNT(*) "
					//	+"FROM refattach,patient "
					//	+"WHERE patient.PatNum=refattach.PatNum "
					//	//+"AND patient.PriProv="+POut.Long(provNum)+" "
					//	+"AND patient.PriProv IN("+POut.String(provs)+") "
					//	+"AND RefDate >= "+POut.Date(dateStart)+" "
					//	+"AND RefDate <= "+POut.Date(dateEnd)+" "
					//	+"AND IsFrom=0 AND IsTransitionOfCare=1 "
					//	+"GROUP BY refattach.PatNum";
					//Db.NonQ(command);
					//command="UPDATE tempehrmeasure"+rndStr+" "
					//	+"SET CcdCount = (SELECT COUNT(*) FROM ehrmeasureevent "
					//	+"WHERE ehrmeasureevent.PatNum=tempehrmeasure"+rndStr+".PatNum AND EventType="+POut.Int((int)EhrMeasureEventType.SummaryOfCareProvidedToDr)+" "
					//	+"AND DATE(ehrmeasureevent.DateTEvent) >= "+POut.Date(dateStart)+" "
					//	+"AND DATE(ehrmeasureevent.DateTEvent) <= "+POut.Date(dateEnd)+")";
					//Db.NonQ(command);
					//command="SELECT * FROM tempehrmeasure"+rndStr;
					//tableRaw=Db.GetTable(command);
					//command="DROP TABLE IF EXISTS tempehrmeasure"+rndStr;
					//Db.NonQ(command);
					//Reworked to only count patients seen by this provider in the date range
					command="SELECT patient.PatNum,patient.LName,patient.FName,refattach.RefDate, "
						+"referral.FName AS RefFName,referral.LName AS RefLName,SUM(CASE WHEN ISNULL(socevent.FKey) THEN 0 ELSE 1 END) AS SOCSent "
						+"FROM refattach "
						+"INNER JOIN referral ON referral.ReferralNum=refattach.ReferralNum "
						+"INNER JOIN patient ON patient.PatNum=refattach.PatNum "
						+"LEFT JOIN ( "
							+"SELECT ehrmeasureevent.FKey "
							+"FROM ehrmeasureevent "
							+"WHERE EventType="+POut.Int((int)EhrMeasureEventType.SummaryOfCareProvidedToDr)+" "
							+"AND DATE(ehrmeasureevent.DateTEvent) BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+") socevent ON socevent.FKey=refattach.RefAttachNum "
						+"WHERE RefDate BETWEEN "+POut.Date(dateStart)+" AND "+POut.Date(dateEnd)+" "
						+"AND IsFrom=0 AND IsTransitionOfCare=1 "
						+"AND refattach.ProvNum IN("+POut.String(provs)+") "
						+"GROUP BY refattach.RefAttachNum";
					tableRaw=Db.GetTable(command);
					break;
				#endregion
				default:
					throw new ApplicationException("Type not found: "+mtype.ToString());
			}
			//PatNum, PatientName, Explanation, and Met (X).
			DataTable table=new DataTable("audit");
			DataRow row;
			table.Columns.Add("PatNum");
			table.Columns.Add("patientName");
			table.Columns.Add("explanation");
			table.Columns.Add("met");//X or empty
			List<DataRow> rows=new List<DataRow>();
			Patient pat;
			string explanation;
			for(int i=0;i<tableRaw.Rows.Count;i++) {
				row=table.NewRow();
				row["PatNum"]=tableRaw.Rows[i]["PatNum"].ToString();
				pat=new Patient();
				pat.LName=tableRaw.Rows[i]["LName"].ToString();
				pat.FName=tableRaw.Rows[i]["FName"].ToString();
				pat.Preferred="";
				row["patientName"]=pat.GetNameLF();
				row["met"]="";
				explanation="";
				switch(mtype) {
					#region ProblemList
					case EhrMeasureType.ProblemList:
						if(tableRaw.Rows[i]["problemsNone"].ToString()!="0") {
							explanation="Problems indicated 'None'.";
							row["met"]="X";
						}
						else if(tableRaw.Rows[i]["problemsAll"].ToString()!="0") {
							explanation="Problems entered: "+tableRaw.Rows[i]["problemsAll"].ToString();
							row["met"]="X";
						}
						else {
							//explanation="No Problems entered";
							explanation="No Problems entered with ICD-9 code or SNOMED code attached.";
						}
						break;
					#endregion
					#region MedicationList
					case EhrMeasureType.MedicationList:
						if(tableRaw.Rows[i]["medsNone"].ToString()!="0") {
							explanation="Medications indicated 'None'";
							row["met"]="X";
						}
						else if(tableRaw.Rows[i]["medsAll"].ToString()!="0") {
							explanation="Medications entered: "+tableRaw.Rows[i]["medsAll"].ToString();
							row["met"]="X";
						}
						else {
							explanation="No Medications entered";
						}
						break;
					#endregion
					#region AllergyList
					case EhrMeasureType.AllergyList:
						if(tableRaw.Rows[i]["allergiesNone"].ToString()!="0") {
							explanation="Allergies indicated 'None'";
							row["met"]="X";
						}
						else if(tableRaw.Rows[i]["allergiesAll"].ToString()!="0") {
							explanation="Allergies entered: "+tableRaw.Rows[i]["allergiesAll"].ToString();
							row["met"]="X";
						}
						else {
							explanation="No Allergies entered";
						}
						break;
					#endregion
					#region Demographics
					case EhrMeasureType.Demographics:
						if(PIn.Date(tableRaw.Rows[i]["Birthdate"].ToString()).Year<1880) {
							explanation+="birthdate";//missing
						}
						if(tableRaw.Rows[i]["Language"].ToString()=="") {
							if(explanation!="") {
								explanation+=", ";
							}
							explanation+="language";
						}
						if(PIn.Int(tableRaw.Rows[i]["Gender"].ToString())==(int)PatientGender.Unknown) {
							if(explanation!="") {
								explanation+=", ";
							}
							explanation+="gender";
						}
						//if(PatientRaces.GetForPatient(PIn.Long(row["PatNum"].ToString())).Count==0) {
						//	if(explanation!="") {
						//		explanation+=", ";
						//	}
						//	explanation+="race, ethnicity";
						//}
						if(PIn.Int(tableRaw.Rows[i]["HasRace"].ToString())==0) {
							if(explanation!="") {
								explanation+=", ";
							}
							explanation+="race";
						}
						if(PIn.Int(tableRaw.Rows[i]["HasEthnicity"].ToString())==0) {
							if(explanation!="") {
								explanation+=", ";
							}
							explanation+="ethnicity";
						}
						if(explanation=="") {
							explanation="All demographic elements recorded";
							row["met"]="X";
						}
						else {
							explanation="Missing: "+explanation;
						}
						break;
					#endregion
					#region Education
					case EhrMeasureType.Education:
						if(tableRaw.Rows[i]["edCount"].ToString()=="0") {
							explanation="No education resources";
						}
						else {
							explanation="Education resources provided";
							row["met"]="X";
						}
						break;
					#endregion
					#region TimelyAccess
					case EhrMeasureType.TimelyAccess:
						DateTime lastVisitDate=PIn.Date(tableRaw.Rows[i]["lastVisitDate"].ToString());
						DateTime deadlineDate=PIn.Date(tableRaw.Rows[i]["deadlineDate"].ToString());
						if(tableRaw.Rows[i]["accessProvided"].ToString()=="0") {
							explanation=lastVisitDate.ToShortDateString()+" no online access provided";
						}
						else {
							explanation="Online access provided before "+deadlineDate.ToShortDateString();
							row["met"]="X";
						}
						break;
					#endregion
					#region ProvOrderEntry
					case EhrMeasureType.ProvOrderEntry:
					case EhrMeasureType.CPOE_PreviouslyOrdered:
						if(tableRaw.Rows[i]["countCpoe"].ToString()=="0") {
							explanation="No medication order through CPOE";
						}
						else {
							explanation="Medication order in CPOE";
							row["met"]="X";
						}
						break;
					#endregion
					#region CPOE_MedOrdersOnly
					case EhrMeasureType.CPOE_MedOrdersOnly:
						DateTime medOrderStartDate=PIn.Date(tableRaw.Rows[i]["DateStart"].ToString());
						explanation="Medication order: "+tableRaw.Rows[i]["MedName"].ToString()+", start date: "+medOrderStartDate.ToShortDateString()+".";
						if(tableRaw.Rows[i]["IsCpoe"].ToString()=="1") {
							row["met"]="X";
						}
						break;
					#endregion
					#region Rx
					case EhrMeasureType.Rx:
						RxSendStatus sendStatus=(RxSendStatus)PIn.Int(tableRaw.Rows[i]["SendStatus"].ToString());
						DateTime rxDate=PIn.Date(tableRaw.Rows[i]["rxDate"].ToString());
						if(sendStatus==RxSendStatus.SentElect) {
							explanation=rxDate.ToShortDateString()+" Rx sent electronically.";
							row["met"]="X";
						}
						else {
							explanation=rxDate.ToShortDateString()+" Rx not sent electronically.";
						}
						break;
					#endregion
					#region VitalSigns
					case EhrMeasureType.VitalSigns:
						if(tableRaw.Rows[i]["hwCount"].ToString()=="0") {
							explanation+="height, weight";
						}
						if(tableRaw.Rows[i]["bpCount"].ToString()=="0") {
							if(explanation!="") {
								explanation+=", ";
							}
							explanation+="blood pressure";
						}
						if(explanation=="") {
							explanation="Vital signs entered";
							row["met"]="X";
						}
						else {
							explanation="Missing: "+explanation;
						}
						break;
					#endregion
					#region VitalSigns2014
					case EhrMeasureType.VitalSigns2014:
						if(tableRaw.Rows[i]["hwCount"].ToString()=="0") {
							explanation+="height, weight";
						}
						if(tableRaw.Rows[i]["bpCount"].ToString()=="0") {
							if(explanation!="") {
								explanation+=", ";
							}
							explanation+="blood pressure";
						}
						if(explanation=="") {
							explanation="Vital signs entered";
							row["met"]="X";
						}
						else {
							explanation="Missing: "+explanation;
						}
						break;
					#endregion
					#region VitalSignsBMIOnly
					case EhrMeasureType.VitalSignsBMIOnly:
						if(tableRaw.Rows[i]["hwCount"].ToString()=="0") {
							explanation+="height, weight";
						}
						if(explanation=="") {
							explanation="Vital signs entered";
							row["met"]="X";
						}
						else {
							explanation="Missing: "+explanation;
						}
						break;
					#endregion
					#region VitalSignsBPOnly
					case EhrMeasureType.VitalSignsBPOnly:
						if(tableRaw.Rows[i]["bpCount"].ToString()=="0") {
							explanation="Missing: blood pressure";
						}
						else {
							explanation="Vital signs entered";
							row["met"]="X";
						}
						break;
					#endregion
					#region Smoking
					case EhrMeasureType.Smoking:
						string smokeSnoMed=tableRaw.Rows[i]["SmokingSnoMed"].ToString();
						if(smokeSnoMed=="") {//None
							explanation+="Smoking status not entered.";
						}
						else{
							explanation="Smoking status entered.";
							row["met"]="X";
						}
						break;
					#endregion
					#region Lab
					case EhrMeasureType.Lab:
						int resultCount=PIn.Int(tableRaw.Rows[i]["ResultCount"].ToString());
						bool isOldLab=PIn.Bool(tableRaw.Rows[i]["IsOldLab"].ToString());
						DateTime dateOrder=PIn.Date(tableRaw.Rows[i]["DateTimeOrder"].ToString());
						if(resultCount==0) {
							explanation+=dateOrder.ToShortDateString()+" results not attached.";
							explanation+=isOldLab?" (2011 edition)":"";
						}
						else {
							explanation=dateOrder.ToShortDateString()+" results attached.";
							explanation+=isOldLab?" (2011 edition)":"";
							row["met"]="X";
						}
						break;
					#endregion
					#region ElectronicCopy
					case EhrMeasureType.ElectronicCopy:
						DateTime dateRequested=PIn.Date(tableRaw.Rows[i]["dateRequested"].ToString());
						if(tableRaw.Rows[i]["copyProvided"].ToString()=="0") {
							explanation=dateRequested.ToShortDateString()+" no copy provided to patient";
						}
						else {
							explanation=dateRequested.ToShortDateString()+" copy provided to patient";
							row["met"]="X";
						}
						break;
					#endregion
					#region ClinicalSummaries
					case EhrMeasureType.ClinicalSummaries:
						DateTime visitDate=PIn.Date(tableRaw.Rows[i]["visitDate"].ToString());
						if(tableRaw.Rows[i]["summaryProvided"].ToString()=="0") {
							explanation=visitDate.ToShortDateString()+" no summary provided to patient";
						}
						else {
							explanation=visitDate.ToShortDateString()+" summary provided to patient";
							row["met"]="X";
						}
						break;
					#endregion
					#region Reminders
					case EhrMeasureType.Reminders:
						if(tableRaw.Rows[i]["reminderCount"].ToString()=="0") {
							explanation="No reminders sent";
						}
						else {
							explanation="Reminders sent";
							row["met"]="X";
						}
						break;
					#endregion
					#region MedReconcile
					case EhrMeasureType.MedReconcile:
						int refCount=PIn.Int(tableRaw.Rows[i]["RefCount"].ToString());//this will always be greater than zero
						int reconcileCount=PIn.Int(tableRaw.Rows[i]["ReconcileCount"].ToString());
						if(reconcileCount<refCount) {
							explanation="Transitions of Care:"+refCount.ToString()+", Reconciles:"+reconcileCount.ToString();
						}
						else {
							explanation="Reconciles performed for each transition of care.";
							row["met"]="X";
						}
						break;
					#endregion
					#region SummaryOfCare
					case EhrMeasureType.SummaryOfCare:
						int socSent=PIn.Int(tableRaw.Rows[i]["SOCSent"].ToString());
						DateTime refDate=PIn.DateT(tableRaw.Rows[i]["RefDate"].ToString());
						string refLName=PIn.String(tableRaw.Rows[i]["RefLName"].ToString());
						string refFName=PIn.String(tableRaw.Rows[i]["RefFName"].ToString());
						if(socSent<1) {
							explanation="Referral on: "+refDate.ToShortDateString()+" to "+refLName+", "+refFName+" not sent summary of care.";
						}
						else {
							explanation="Referral on: "+refDate.ToShortDateString()+" to "+refLName+", "+refFName+" sent summary of care.";
							row["met"]="X";
						}
						break;
					#endregion
					default:
						throw new ApplicationException("Type not found: "+mtype.ToString());
				}
				row["explanation"]=explanation;
				rows.Add(row);
			}
			for(int i=0;i<rows.Count;i++) {
				table.Rows.Add(rows[i]);
			}
			return table;
		}
示例#25
0
        ///<summary>If not using clinics then supply an empty list of clinicNums.</summary>
        public static DataSet GetPayPlanTable(DateTime dateStart, DateTime dateEnd, List <long> listProvNums, List <long> listClinicNums,
                                              bool hasAllProvs, DisplayPayPlanType displayPayPlanType, bool hideCompletedPlans, bool showFamilyBalance, bool hasDateRange, bool isPayPlanV2)
        {
            if (RemotingClient.RemotingRole == RemotingRole.ClientWeb)
            {
                return(Meth.GetDS(MethodBase.GetCurrentMethod(), dateStart, dateEnd, listProvNums, listClinicNums, hasAllProvs, displayPayPlanType,
                                  hideCompletedPlans, showFamilyBalance, hasDateRange, isPayPlanV2));
            }
            string whereProv = "";

            if (!hasAllProvs)
            {
                whereProv += " AND payplancharge.ProvNum IN(";
                for (int i = 0; i < listProvNums.Count; i++)
                {
                    if (i > 0)
                    {
                        whereProv += ",";
                    }
                    whereProv += POut.Long(listProvNums[i]);
                }
                whereProv += ") ";
            }
            string whereClin         = "";
            bool   hasClinicsEnabled = ReportsComplex.RunFuncOnReportServer(() => (!Prefs.GetBoolNoCache(PrefName.EasyNoClinics)));

            if (hasClinicsEnabled)             //Using clinics
            {
                whereClin += " AND payplancharge.ClinicNum IN(";
                for (int i = 0; i < listClinicNums.Count; i++)
                {
                    if (i > 0)
                    {
                        whereClin += ",";
                    }
                    whereClin += POut.Long(listClinicNums[i]);
                }
                whereClin += ") ";
            }
            DataSet   ds    = new DataSet();
            DataTable table = new DataTable("Clinic");

            table.Columns.Add("provider");
            table.Columns.Add("guarantor");
            table.Columns.Add("ins");
            table.Columns.Add("princ");
            table.Columns.Add("accumInt");
            table.Columns.Add("paid");
            table.Columns.Add("balance");
            table.Columns.Add("due");
            if (isPayPlanV2)
            {
                table.Columns.Add("notDue");
            }
            table.Columns.Add("famBal");
            table.Columns.Add("clinicName");
            DataTable tableTotals = new DataTable("Total");

            tableTotals.Columns.Add("clinicName");
            tableTotals.Columns.Add("princ");
            tableTotals.Columns.Add("accumInt");
            tableTotals.Columns.Add("paid");
            tableTotals.Columns.Add("balance");
            tableTotals.Columns.Add("due");
            if (isPayPlanV2)
            {
                tableTotals.Columns.Add("notDue");
            }
            tableTotals.Columns.Add("famBal");
            DataRow row;
            string  datesql = "CURDATE()";         //This is used to find out how much people owe currently and has nothing to do with the selected range

            if (DataConnection.DBtype == DatabaseType.Oracle)
            {
                datesql = "(SELECT CURRENT_DATE FROM dual)";
            }
            //Oracle TODO:  Either put entire query without GROUP BY in SUBSELECT and then GROUP BY outside, or rewrite query to use joins instead of subselects.
            string command = "SELECT FName,LName,MiddleI,PlanNum,Preferred,PlanNum, "
                             + "COALESCE((SELECT SUM(Principal+Interest) FROM payplancharge WHERE payplancharge.PayPlanNum=payplan.PayPlanNum "
                             + "AND payplancharge.ChargeType=" + POut.Int((int)PayPlanChargeType.Debit) + " "//for v1, debits are the only ChargeType.
                             + "AND ChargeDate <= " + datesql + @"),0) '_accumDue', ";

            command += "COALESCE((SELECT SUM(Interest) FROM payplancharge WHERE payplancharge.PayPlanNum=payplan.PayPlanNum "
                       + "AND payplancharge.ChargeType=" + POut.Int((int)PayPlanChargeType.Debit) + " "    //for v1, debits are the only ChargeType.
                       + "AND ChargeDate <= " + datesql + @"),0) '_accumInt', ";
            command += "COALESCE((SELECT SUM(SplitAmt) FROM paysplit WHERE paysplit.PayPlanNum=payplan.PayPlanNum AND paysplit.PayPlanNum!=0),0) '_paid', ";
            command += "COALESCE((SELECT SUM(InsPayAmt) FROM claimproc WHERE claimproc.PayPlanNum=payplan.PayPlanNum "
                       + "AND claimproc.Status IN("
                       + POut.Int((int)ClaimProcStatus.Received) + ","
                       + POut.Int((int)ClaimProcStatus.Supplemental) + ","
                       + POut.Int((int)ClaimProcStatus.CapClaim)
                       + ") AND claimproc.PayPlanNum!=0),0) '_insPaid', ";
            command += "COALESCE((SELECT SUM(Principal) FROM payplancharge WHERE payplancharge.PayPlanNum=payplan.PayPlanNum "
                       + "AND payplancharge.ChargeType=" + POut.Int((int)PayPlanChargeType.Debit) + "),0) '_principal', "   //for v1, debits are the only ChargeType.
                       + "COALESCE((SELECT SUM(Principal) FROM payplancharge WHERE payplancharge.PayPlanNum=payplan.PayPlanNum "
                       + "AND payplancharge.ChargeType=" + POut.Int((int)PayPlanChargeType.Credit) + "),0) '_credits', "    //for v1, will always be 0.
                       + "COALESCE((SELECT SUM(Principal) FROM payplancharge WHERE payplancharge.PayPlanNum=payplan.PayPlanNum "
                       + "AND payplancharge.ChargeType=" + POut.Int((int)PayPlanChargeType.Credit) + " AND ChargeDate > " + datesql + "),0) '_notDue', "
                       + "patient.PatNum PatNum, "
                       + "payplancharge.ProvNum ProvNum ";
            if (hasClinicsEnabled)
            {
                command += ", payplancharge.ClinicNum ClinicNum ";
            }
            //In order to determine if the patient has completely paid off their payment plan we need to get the total amount of interest as of today.
            //Then, after the query has run, we'll add the interest up until today with the total principal for the entire payment plan.
            //For this reason, we cannot use _accumDue which only gets the principle up until today and not the entire payment plan principle.
            command += ",COALESCE((SELECT SUM(Interest) FROM payplancharge WHERE payplancharge.PayPlanNum=payplan.PayPlanNum "
                       + "AND payplancharge.ChargeType=" + POut.Int((int)PayPlanChargeType.Debit) + " "            //for v1, debits are the only ChargeType.
                       + "AND ChargeDate <= " + datesql + @"),0) '_interest' "
                       + "FROM payplan "
                       + "LEFT JOIN patient ON patient.PatNum=payplan.Guarantor "
                       + "LEFT JOIN payplancharge ON payplan.PayPlanNum=payplancharge.PayPlanNum "
                       + "WHERE TRUE ";        //Always include true, so that the WHERE clause may always be present.
            if (hasDateRange)
            {
                command += "AND payplan.PayPlanDate >= " + POut.Date(dateStart) + " "
                           + "AND payplan.PayPlanDate <= " + POut.Date(dateEnd) + " ";
            }
            command += whereProv
                       + whereClin;
            if (displayPayPlanType == DisplayPayPlanType.Insurance)
            {
                command += "AND payplan.PlanNum!=0 ";
            }
            else if (displayPayPlanType == DisplayPayPlanType.Patient)
            {
                command += "AND payplan.PlanNum=0 ";
            }
            else if (displayPayPlanType == DisplayPayPlanType.Both)
            {
                //Do not filter the query at all which will show both insurance and patient payment plan types.
            }
            if (hideCompletedPlans)
            {
                command += "AND payplan.IsClosed=0 ";
            }
            command += "GROUP BY FName,LName,MiddleI,Preferred,payplan.PayPlanNum ";
            if (hasClinicsEnabled)
            {
                command += "ORDER BY ClinicNum,LName,FName";
            }
            else
            {
                command += "ORDER BY LName,FName";
            }
            DataTable       raw       = ReportsComplex.RunFuncOnReportServer(() => ReportsComplex.GetTable(command));
            List <Provider> listProvs = ReportsComplex.RunFuncOnReportServer(() => Providers.GetAll());
            //DateTime payplanDate;
            Patient pat;
            double  princ;
            double  paid;
            double  interest;
            double  accumDue;
            double  notDue;
            decimal famBal        = 0;
            double  princTot      = 0;
            double  paidTot       = 0;
            double  interestTot   = 0;
            double  balanceTot    = 0;
            double  accumDueTot   = 0;
            double  notDueTot     = 0;
            decimal famBalTot     = 0;
            string  clinicDescOld = "";

            for (int i = 0; i < raw.Rows.Count; i++)
            {
                princ    = PIn.Double(raw.Rows[i]["_principal"].ToString());
                interest = PIn.Double(raw.Rows[i]["_accumInt"].ToString());
                if (raw.Rows[i]["PlanNum"].ToString() == "0")               //pat payplan
                {
                    paid = PIn.Double(raw.Rows[i]["_paid"].ToString());
                }
                else                  //ins payplan
                {
                    paid = PIn.Double(raw.Rows[i]["_insPaid"].ToString());
                }
                accumDue = PIn.Double(raw.Rows[i]["_accumDue"].ToString());
                notDue   = PIn.Double(raw.Rows[i]["_notDue"].ToString());
                row      = table.NewRow();
                //payplanDate=PIn.PDate(raw.Rows[i]["PayPlanDate"].ToString());
                //row["date"]=raw.Rows[i]["PayPlanDate"].ToString();//payplanDate.ToShortDateString();
                pat              = new Patient();
                pat.LName        = raw.Rows[i]["LName"].ToString();
                pat.FName        = raw.Rows[i]["FName"].ToString();
                pat.MiddleI      = raw.Rows[i]["MiddleI"].ToString();
                pat.Preferred    = raw.Rows[i]["Preferred"].ToString();
                row["provider"]  = Providers.GetLName(PIn.Long(raw.Rows[i]["ProvNum"].ToString()), listProvs);
                row["guarantor"] = pat.GetNameLF();
                if (raw.Rows[i]["PlanNum"].ToString() == "0")
                {
                    row["ins"] = "";
                }
                else
                {
                    row["ins"] = "X";
                }
                row["princ"]    = princ.ToString("f");
                row["accumInt"] = interest.ToString("f");
                row["paid"]     = paid.ToString("f");
                row["balance"]  = (princ + interest - paid).ToString("f");
                row["due"]      = (accumDue - paid).ToString("f");
                if (isPayPlanV2)
                {
                    row["notDue"] = ((princ + interest - paid) - (accumDue - paid)).ToString("f");
                }
                if (showFamilyBalance)
                {
                    Family famCur = ReportsComplex.RunFuncOnReportServer(() => Patients.GetFamily(PIn.Long(raw.Rows[i]["PatNum"].ToString())));
                    famBal        = (decimal)famCur.ListPats[0].BalTotal;
                    row["famBal"] = (famBal - (decimal)famCur.ListPats[0].InsEst).ToString("F");
                }
                if (hasClinicsEnabled)                 //Using clinics
                {
                    List <Clinic> listClinics = ReportsComplex.RunFuncOnReportServer(() => Clinics.GetClinicsNoCache());
                    string        clinicDesc  = Clinics.GetDesc(PIn.Long(raw.Rows[i]["ClinicNum"].ToString()), listClinics);
                    clinicDesc = (clinicDesc == "")?Lans.g("FormRpPayPlans", "Unassigned"):clinicDesc;
                    if (!String.IsNullOrEmpty(clinicDescOld) && clinicDesc != clinicDescOld)                   //Reset all the total values
                    {
                        DataRow rowTot = tableTotals.NewRow();
                        rowTot["clinicName"] = clinicDescOld;
                        rowTot["princ"]      = princTot.ToString();
                        rowTot["accumInt"]   = interestTot.ToString();
                        rowTot["paid"]       = paidTot.ToString();
                        rowTot["balance"]    = balanceTot.ToString();
                        rowTot["due"]        = accumDueTot.ToString();
                        if (isPayPlanV2)
                        {
                            rowTot["notDue"] = notDueTot.ToString();
                        }
                        rowTot["famBal"] = famBalTot.ToString();
                        tableTotals.Rows.Add(rowTot);
                        princTot    = 0;
                        paidTot     = 0;
                        interestTot = 0;
                        accumDueTot = 0;
                        balanceTot  = 0;
                        notDueTot   = 0;
                        famBalTot   = 0;
                    }
                    row["clinicName"] = clinicDesc;
                    clinicDescOld     = clinicDesc;
                    princTot         += princ;
                    paidTot          += paid;
                    interestTot      += interest;
                    accumDueTot      += (accumDue - paid);
                    balanceTot       += (princ + interest - paid);
                    notDueTot        += ((princ + interest - paid) - (accumDue - paid));
                    famBalTot        += famBal;
                    if (i == raw.Rows.Count - 1)
                    {
                        DataRow rowTot = tableTotals.NewRow();
                        rowTot["clinicName"] = clinicDescOld;
                        rowTot["princ"]      = princTot.ToString();
                        rowTot["accumInt"]   = interestTot.ToString();
                        rowTot["paid"]       = paidTot.ToString();
                        rowTot["balance"]    = balanceTot.ToString();
                        rowTot["due"]        = accumDueTot.ToString();
                        if (isPayPlanV2)
                        {
                            rowTot["notDue"] = notDueTot.ToString();
                        }
                        rowTot["famBal"] = famBalTot.ToString();
                        tableTotals.Rows.Add(rowTot);
                    }
                }
                table.Rows.Add(row);
            }
            ds.Tables.Add(table);
            ds.Tables.Add(tableTotals);
            return(ds);
        }
示例#26
0
		private void FormPopupEdit_Load(object sender,EventArgs e) {
			Pat=Patients.GetPat(PopupCur.PatNum);
			textPatient.Text=Pat.GetNameLF();
			if(PopupCur.IsNew) {//If popup is new User is the logged-in user and create date is now.
				butAudit.Visible=false;
				textUser.Text=Security.CurUser.UserName;
				textCreateDate.Text=DateTime.Now.ToShortDateString()+" "+DateTime.Now.ToShortTimeString();
			}
			else {
				if(PopupCur.UserNum!=0) {//This check is so that any old popups without a user will still display correctly.
					textUser.Text=Userods.GetUser(PopupCur.UserNum).UserName;
				}
				if(PopupAudit!=null) {//This checks if this window opened from FormPopupAudit
					textCreateDate.Text="";
					if(PopupAudit.DateTimeEntry.Year > 1880) {
						textCreateDate.Text=PopupAudit.DateTimeEntry.ToShortDateString()+" "+PopupAudit.DateTimeEntry.ToShortTimeString();//Sets the original creation date.
					}
					textEditDate.Text="";
					if(DateLastEdit.Year > 1880) {
						textEditDate.Text=DateLastEdit.ToShortDateString()+" "+DateLastEdit.ToShortTimeString();
					}
				}
				else {
					textCreateDate.Text="";
					if(PopupCur.DateTimeEntry.Year > 1880) {
						textCreateDate.Text=PopupCur.DateTimeEntry.ToShortDateString()+" "+PopupCur.DateTimeEntry.ToShortTimeString();//Sets the original creation date.
					}
					DateTime dateT=Popups.GetLastEditDateTimeForPopup(PopupCur.PopupNum);
					textEditDate.Text="";
					if(dateT.Year > 1880) {
						textEditDate.Text=dateT.ToShortDateString()+" "+dateT.ToShortTimeString();//Sets the Edit date to the entry date of the last popup change that was archived for this popup.
					}
				}
			}
			comboPopupLevel.Items.Add(Lan.g("enumEnumPopupFamily",Enum.GetNames(typeof(EnumPopupLevel))[0]));//Patient
			comboPopupLevel.Items.Add(Lan.g("enumEnumPopupFamily",Enum.GetNames(typeof(EnumPopupLevel))[1]));//Family
			if(Pat.SuperFamily!=0) {
				comboPopupLevel.Items.Add(Lan.g("enumEnumPopupFamily",Enum.GetNames(typeof(EnumPopupLevel))[2]));//SuperFamily
			}
			comboPopupLevel.SelectedIndex=(int)PopupCur.PopupLevel;
			checkIsDisabled.Checked=PopupCur.IsDisabled;
			textDescription.Text=PopupCur.Description;
			if(PopupCur.IsArchived) {
				butDelete.Enabled=false;
				butOK.Enabled=false;
				comboPopupLevel.Enabled=false;
				checkIsDisabled.Enabled=false;
				textDescription.ReadOnly=true;
				textPatient.ReadOnly=true;
			}
			if(PopupCur.PopupNumArchive!=0) {
				butAudit.Visible=false;
			}
		}
示例#27
0
文件: RpPayPlan.cs 项目: mnisl/OD
		///<summary>If not using clinics then supply an empty list of clinicNums.</summary>
		public static DataTable GetPayPlanTable(DateTime dateStart,DateTime dateEnd,List<long> listProvNums,List<long> listClinicNums,bool hasAllProvs,DisplayPayPlanType displayPayPlanType,bool hideCompletedPlans,bool showFamilyBalance) {
			if(RemotingClient.RemotingRole==RemotingRole.ClientWeb) {
				return Meth.GetTable(MethodBase.GetCurrentMethod(),dateStart,dateEnd,listProvNums,listClinicNums,hasAllProvs,displayPayPlanType,hideCompletedPlans,showFamilyBalance);
			}
			string whereProv="";
			if(!hasAllProvs) {
				whereProv+=" AND payplancharge.ProvNum IN(";
				for(int i=0;i<listProvNums.Count;i++) {
					if(i>0) {
						whereProv+=",";
					}
					whereProv+=POut.Long(listProvNums[i]);
				}
				whereProv+=") ";
			}
			string whereClin="";
			if(!PrefC.GetBool(PrefName.EasyNoClinics)) {//Using clinics
				whereClin+=" AND payplancharge.ClinicNum IN(";
				for(int i=0;i<listClinicNums.Count;i++) {
					if(i>0) {
						whereClin+=",";
					}
					whereClin+=POut.Long(listClinicNums[i]);
				}
				whereClin+=") ";
			}
			DataTable table=new DataTable();
			table.Columns.Add("provider");
			table.Columns.Add("guarantor");
			table.Columns.Add("ins");
			table.Columns.Add("princ");
			table.Columns.Add("paid");
			table.Columns.Add("due");
			table.Columns.Add("balance");
			table.Columns.Add("clinicname");
			DataRow row;
			string datesql="CURDATE()";//This is used to find out how much people owe currently and has nothing to do with the selected range
			if(DataConnection.DBtype==DatabaseType.Oracle) {
				datesql="(SELECT CURRENT_DATE FROM dual)";
			}
			//Oracle TODO:  Either put entire query without GROUP BY in SUBSELECT and then GROUP BY outside, or rewrite query to use joins instead of subselects.
			string command="SELECT FName,LName,MiddleI,PlanNum,Preferred,PlanNum, "
				+"COALESCE((SELECT SUM(Principal+Interest) FROM payplancharge WHERE payplancharge.PayPlanNum=payplan.PayPlanNum "
					+"AND ChargeDate <= "+datesql+@"),0) '_accumDue', ";
			command+="COALESCE((SELECT SUM(SplitAmt) FROM paysplit WHERE paysplit.PayPlanNum=payplan.PayPlanNum AND paysplit.PayPlanNum!=0),0) '_paid', ";
			command+="COALESCE((SELECT SUM(InsPayAmt) FROM claimproc WHERE claimproc.PayPlanNum=payplan.PayPlanNum "
					+"AND claimproc.Status IN("
					+POut.Int((int)ClaimProcStatus.Received)+","
					+POut.Int((int)ClaimProcStatus.Supplemental)+","
					+POut.Int((int)ClaimProcStatus.CapClaim)
					+") AND claimproc.PayPlanNum!=0),0) '_insPaid', ";
			command+="COALESCE((SELECT SUM(Principal) FROM payplancharge WHERE payplancharge.PayPlanNum=payplan.PayPlanNum),0) '_principal', "
				+"patient.PatNum PatNum, "
				+"payplancharge.ProvNum ProvNum";
			if(!PrefC.GetBool(PrefName.EasyNoClinics)) {
				command+=", payplancharge.ClinicNum ClinicNum";
			}
			command+=" FROM payplan "
				+"LEFT JOIN patient ON patient.PatNum=payplan.Guarantor "
				+"LEFT JOIN payplancharge ON payplan.PayPlanNum=payplancharge.PayPlanNum "
				+"WHERE payplan.PayPlanDate >= "+POut.Date(dateStart)+" "
				+"AND payplan.PayPlanDate <= "+POut.Date(dateEnd)+" "
				+whereProv
				+whereClin;
			if(displayPayPlanType==DisplayPayPlanType.Insurance) {
				command+="AND payplan.PlanNum!=0 ";
			}
			else if(displayPayPlanType==DisplayPayPlanType.Patient) {
				command+="AND payplan.PlanNum=0 ";
			}
			else if(displayPayPlanType==DisplayPayPlanType.Both) {
				//Do not filter the query at all which will show both insurance and patient payment plan types.
			}
			command+="GROUP BY FName,LName,MiddleI,Preferred,payplan.PayPlanNum ";
			if(!hideCompletedPlans) {
				command+="HAVING _paid+_insPaid < _principal ";
			}
			if(!PrefC.GetBool(PrefName.EasyNoClinics)) {
				command+="ORDER BY ClinicNum,LName,FName";
			}
			else {
				command+="ORDER BY LName,FName";
			}
			DataTable raw=ReportsComplex.GetTable(command);
			//DateTime payplanDate;
			Patient pat;
			double princ;
			double paid;
			double accumDue;
			for(int i=0;i<raw.Rows.Count;i++) {
				princ=PIn.Double(raw.Rows[i]["_principal"].ToString());
				if(raw.Rows[i]["PlanNum"].ToString()=="0") {//pat payplan
					paid=PIn.Double(raw.Rows[i]["_paid"].ToString());
				}
				else {//ins payplan
					paid=PIn.Double(raw.Rows[i]["_insPaid"].ToString());
				}
				accumDue=PIn.Double(raw.Rows[i]["_accumDue"].ToString());
				row=table.NewRow();
				//payplanDate=PIn.PDate(raw.Rows[i]["PayPlanDate"].ToString());
				//row["date"]=raw.Rows[i]["PayPlanDate"].ToString();//payplanDate.ToShortDateString();
				pat=new Patient();
				pat.LName=raw.Rows[i]["LName"].ToString();
				pat.FName=raw.Rows[i]["FName"].ToString();
				pat.MiddleI=raw.Rows[i]["MiddleI"].ToString();
				pat.Preferred=raw.Rows[i]["Preferred"].ToString();
				row["provider"]=Providers.GetLName(PIn.Long(raw.Rows[i]["ProvNum"].ToString()));
				row["guarantor"]=pat.GetNameLF();
				if(raw.Rows[i]["PlanNum"].ToString()=="0") {
					row["ins"]="";
				}
				else {
					row["ins"]="X";
				}
				row["princ"]=princ.ToString("f");
				row["paid"]=paid.ToString("f");
				row["due"]=(accumDue-paid).ToString("f");
				if(showFamilyBalance) {
					Family famCur=Patients.GetFamily(PIn.Long(raw.Rows[i]["PatNum"].ToString()));
					Decimal total=(decimal)famCur.ListPats[0].BalTotal;
					row["balance"]=(total - (decimal)famCur.ListPats[0].InsEst).ToString("F");
				}
				if(!PrefC.GetBool(PrefName.EasyNoClinics)) {//Using clinics
					string clinicDesc=Clinics.GetDesc(PIn.Long(raw.Rows[i]["ClinicNum"].ToString()));
					row["clinicname"]=(clinicDesc=="")?Lans.g("FormRpPayPlans","Unassigned"):clinicDesc;
				}
				table.Rows.Add(row);
			}
			return table;
		}