/**
 * 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;
}
Example #2
0
 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);
 }