Пример #1
0
 public static function getTatDailyProgressionStats($lab_config, $test_type_id, $date_from, $date_to, $include_pending = false)
 {
     # Calculates weekly progression of TAT values for a given test type and time period
     global $DEFAULT_PENDING_TAT;
     # Default TAT value for pending tests (in days)
     $saved_db = DbUtil::switchToLabConfig($lab_config->id);
     $resultset = get_completed_tests_by_type($test_type_id, $date_from, $date_to);
     # {resultentry_ts, specimen_id, date_collected_ts}
     $progression_val = array();
     $progression_count = array();
     $percentile_tofind = 90;
     $percentile_count = array();
     $goal_val = array();
     # Return {day=>[avg tat, percentile tat, goal tat, [overdue specimen_ids], [pending specimen_ids]]}
     foreach ($resultset as $record) {
         $date_collected = $record['date_collected'];
         $date_ts = $record['ts'];
         $date_diff = $date_ts - $date_collected;
         $day_ts = $date_collected;
         $day_ts_datetime = date("Y-m-d H:i:s", $day_ts);
         if (!isset($progression_val[$day_ts])) {
             $progression_val[$day_ts] = array();
             $progression_val[$day_ts][0] = $date_diff;
             $percentile_count[$day_ts] = array();
             $percentile_count[$day_ts][] = $date_diff;
             $progression_count[$day_ts] = 1;
             $goal_tat[$day_ts] = $lab_config->getGoalTatValue($test_type_id, $day_ts_datetime);
             $progression_val[$day_ts][3] = array();
             $progression_val[$day_ts][4] = array();
         } else {
             $progression_val[$day_ts][0] += $date_diff;
             $percentile_count[$day_ts][] = $date_diff;
             $progression_count[$day_ts] += 1;
         }
         if ($date_diff / (60 * 60 * 24) > $goal_tat[$day_ts]) {
             # Add to list of TAT exceeded specimens
             $progression_val[$day_ts][3][] = $record['specimen_id'];
         }
     }
     if ($include_pending == true) {
         $pending_tat_value = $lab_config->getPendingTatValue();
         # in hours
         # Update the above list {day=>[avg tat, percentile tat, goal tat, [overdue specimen_ids], [pending specimen_ids]]}
         # For pending tests in this time duration
         $resultset_pending = get_pendingtat_tests_by_type($test_type_id, $date_from, $date_to);
         $num_pending = count($resultset_pending);
         foreach ($resultset_pending as $record) {
             $date_collected = $record['date_collected'];
             $date_ts = $record['ts'];
             $date_diff = $pending_tat_value * 60 * 60;
             $day_ts = $date_collected;
             $day_ts_datetime = date("Y-m-d H:i:s", $day_ts);
             if (!isset($progression_val[$day_ts])) {
                 $progression_val[$day_ts] = array();
                 $progression_val[$day_ts][0] = $date_diff;
                 $percentile_count[$day_ts] = array();
                 $percentile_count[$day_ts][] = $date_diff;
                 $progression_count[$day_ts] = 1;
                 $goal_tat[$day_ts] = $lab_config->getGoalTatValue($test_type_id, $day_ts_datetime);
                 $progression_val[$day_ts][3] = array();
                 $progression_val[$day_ts][4] = array();
             } else {
                 $progression_val[$day_ts][0] += $date_diff;
                 $percentile_count[$day_ts][] = $date_diff;
                 $progression_count[$day_ts] += 1;
             }
             # Add to list of TAT pending specimens
             $progression_val[$day_ts][4][] = $record['specimen_id'];
         }
     }
     foreach ($progression_val as $key => $value) {
         # Find average value
         $progression_val[$key][0] = $value[0] / $progression_count[$key];
         # Convert from sec timestamp to days
         $progression_val[$key][0] = $progression_val[$key][0] / (60 * 60 * 24);
         # Determine percentile value
         $progression_val[$key][1] = StatsLib::getPercentile($percentile_count[$key], $percentile_tofind);
         # Convert from sec timestamp to days
         $progression_val[$key][1] = $progression_val[$key][1] / (60 * 60 * 24);
         $progression_val[$key][2] = $goal_tat[$key];
     }
     DbUtil::switchRestore($saved_db);
     # Return {week=>[avg tat, percentile tat, goal tat, [overdue specimen_ids], [pending specimen_ids]]}
     return $progression_val;
 }