/** * Test filter of a selected rule on a selected patient * * @param integer $patient_id pid of selected patient. * @param string $rule id(string) of selected rule * @param string $dateTarget target date (format Y-m-d H:i:s). If blank then will test with current date as target. * @return boolean/string if pass filter then TRUE; if excluded then 'EXCLUDED'; if not pass filter then FALSE */ function test_filter($patient_id, $rule, $dateTarget) { // Set date to current if not set $dateTarget = $dateTarget ? $dateTarget : date('Y-m-d H:i:s'); // Collect patient information $patientData = getPatientData($patient_id, "sex, DATE_FORMAT(DOB,'%Y %m %d') as DOB_TS"); // // ----------------- INCLUSIONS ----------------- // // -------- Age Filter (inclusion) ------------ // Calculate patient age in years and months $patientAgeYears = convertDobtoAgeYearDecimal($patientData['DOB_TS'], $dateTarget); $patientAgeMonths = convertDobtoAgeMonthDecimal($patientData['DOB_TS'], $dateTarget); // Min age (year) Filter (assume that there in not more than one of each) $filter = resolve_filter_sql($rule, 'filt_age_min'); if (!empty($filter)) { $row = $filter[0]; if ($row['method_detail'] == "year") { if ($row['value'] && $row['value'] > $patientAgeYears) { return false; } } if ($row['method_detail'] == "month") { if ($row['value'] && $row['value'] > $patientAgeMonths) { return false; } } } // Max age (year) Filter (assume that there in not more than one of each) $filter = resolve_filter_sql($rule, 'filt_age_max'); if (!empty($filter)) { $row = $filter[0]; if ($row['method_detail'] == "year") { if ($row['value'] && $row['value'] < $patientAgeYears) { return false; } } if ($row['method_detail'] == "month") { if ($row['value'] && $row['value'] < $patientAgeMonths) { return false; } } } // -------- Gender Filter (inclusion) --------- // Gender Filter (assume that there in not more than one of each) $filter = resolve_filter_sql($rule, 'filt_sex'); if (!empty($filter)) { $row = $filter[0]; if ($row['value'] && $row['value'] != $patientData['sex']) { return false; } } // -------- Database Filter (inclusion) ------ // Database Filter $filter = resolve_filter_sql($rule, 'filt_database'); if (!empty($filter) && !database_check($patient_id, $filter, '', $dateTarget)) { return false; } // -------- Lists Filter (inclusion) ---- // Set up lists filter, which is fully customizable and currently includes diagnoses, meds, // surgeries and allergies. $filter = resolve_filter_sql($rule, 'filt_lists'); if (!empty($filter) && !lists_check($patient_id, $filter, $dateTarget)) { return false; } // -------- Procedure (labs,imaging,test,procedures,etc) Filter (inlcusion) ---- // Procedure Target (includes) (may need to include an interval in the future) $filter = resolve_filter_sql($rule, 'filt_proc'); if (!empty($filter) && !procedure_check($patient_id, $filter, '', $dateTarget)) { return false; } // // ----------------- EXCLUSIONS ----------------- // // -------- Lists Filter (EXCLUSION) ---- // Set up lists EXCLUSION filter, which is fully customizable and currently includes diagnoses, meds, // surgeries and allergies. $filter = resolve_filter_sql($rule, 'filt_lists', 0); if (!empty($filter) && lists_check($patient_id, $filter, $dateTarget)) { return "EXCLUDED"; } // Passed all filters, so return true. return true; }
private function rule_htn_bp_measure_cqm() { $rule_id = $this->rule['id']; $dateTarget = $this->dateTarget; $patientData = $this->patientData; // Calculate measurement period $tempDateArray = explode("-", $dateTarget); $tempYear = $tempDateArray[0]; $begin_measurement = $tempDateArray[0] . "-01-01 00:00:00"; $end_measurement = $tempDateArray[0] . "-12-31 23:59:59"; // Collect results $total_pat = 0; $pass_filt = 0; $exclude_filt = 0; $pass_targ = 0; $perc = 0; foreach ($patientData as $rowPatient) { // increment total patients counter $total_pat++; // get patient id $patient_id = $this->get_patient_id($rowPatient); // filter for age greater than 18 // utilize the convertDobtoAgeYearDecimal() function from library/clinical_rules.php if (convertDobtoAgeYearDecimal($this->get_DOB($patient_id), $begin_measurement) < 18) { continue; } // filter for diagnosis of HTN // utlize the exist_lists_item() function from library/clinical_rules.php if (!(exist_lists_item($patient_id, 'medical_problem', 'CUSTOM::HTN', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::401.0', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::401.1', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::401.9', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::402.00', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::402.01', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::402.10', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::402.11', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::402.90', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::402.91', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::403.00', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::403.01', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::403.10', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::403.11', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::403.90', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::403.91', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::404.00', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::404.01', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::404.02', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::404.03', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::404.10', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::404.11', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::404.12', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::404.13', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::404.90', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::404.91', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::404.92', $end_measurement) || exist_lists_item($patient_id, 'medical_problem', 'ICD9::404.93', $end_measurement))) { continue; } // filter for 2 specified encounters // make a function for this and wrap in the encounter titles if (!($this->exist_encounter($patient_id, 'enc_outpatient', $begin_measurement, $end_measurement, 2) || $this->exist_encounter($patient_id, 'enc_nurs_fac', $begin_measurement, $end_measurement, 2))) { continue; } // Filter has been passed $pass_filt++; // See if BP has been done within the measurement period (on a day of a specified encounter) $query = "SELECT form_vitals.bps, form_vitals.bpd " . "FROM `form_vitals` " . "LEFT JOIN `form_encounter` " . "ON ( DATE(form_vitals.date) = DATE(form_encounter.date)) " . "LEFT JOIN `enc_category_map` " . "ON (enc_category_map.main_cat_id = form_encounter.pc_catid) " . "WHERE form_vitals.pid = ?" . "AND form_vitals.bps IS NOT NULL " . "AND form_vitals.bpd IS NOT NULL " . "AND form_vitals.date >= ? " . "AND form_vitals.date <= ? " . "AND ( enc_category_map.rule_enc_id = 'enc_outpatient' OR enc_category_map.rule_enc_id = 'enc_nurs_fac' )"; $res = sqlStatement($query, array($patient_id, $begin_measurement, $end_measurement)); $number = sqlNumRows($res); if ($number < 1) { continue; } error_log("passed target", 0); // Target has been passed $pass_targ++; } // Calculate Percentage (use calculate_percentage() function from library/clinical_rules.php $perc = calculate_percentage($pass_filt, $exclude_filt, $pass_targ); // Set results $this->set_result($rule_id, $total_pat, $pass_filt, $exclude_filt, $pass_targ, $perc); }