Beispiel #1
0
 public static function getTatWeeklyProgressionStats($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 {week=>[avg tat, percentile tat, goal tat, [overdue specimen_ids], [pending specimen_ids]]}
     foreach ($resultset as $record) {
         $date_collected = $record['date_collected'];
         $week_collected = date("W", $date_collected);
         $year_collected = date("Y", $date_collected);
         $week_ts = week_to_date($week_collected, $year_collected);
         $week_ts_datetime = date("Y-m-d H:i:s", $week_ts);
         $date_ts = $record['ts'];
         $date_diff = $date_ts - $date_collected;
         if (!isset($progression_val[$week_ts])) {
             $progression_val[$week_ts] = array();
             $progression_val[$week_ts][0] = $date_diff;
             $percentile_count[$week_ts] = array();
             $percentile_count[$week_ts][] = $date_diff;
             $progression_count[$week_ts] = 1;
             $goal_tat[$week_ts] = $lab_config->getGoalTatValue($test_type_id, $week_ts_datetime);
             $progression_val[$week_ts][3] = array();
             $progression_val[$week_ts][4] = array();
         } else {
             $progression_val[$week_ts][0] += $date_diff;
             $percentile_count[$week_ts][] = $date_diff;
             $progression_count[$week_ts] += 1;
         }
         if ($date_diff / (60 * 60 * 24) > $goal_tat[$week_ts]) {
             $progression_val[$week_ts][3][] = $record['specimen_id'];
         }
     }
     if ($include_pending === true) {
         $pending_tat_value = $lab_config->getPendingTatValue();
         # in hours
         # Update the above list {week=>[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'];
             $week_collected = date("W", $date_collected);
             $year_collected = date("Y", $date_collected);
             $week_ts = week_to_date($week_collected, $year_collected);
             $week_ts_datetime = date("Y-m-d H:i:s", $week_ts);
             $date_ts = $record['ts'];
             $date_diff = $pending_tat_value * 60 * 60;
             if (!isset($progression_val[$week_ts])) {
                 $progression_val[$week_ts] = array();
                 $progression_val[$week_ts][0] = $date_diff;
                 $percentile_count[$week_ts] = array();
                 $percentile_count[$week_ts][] = $date_diff;
                 $progression_count[$week_ts] = 1;
                 $goal_tat[$week_ts] = $lab_config->getGoalTatValue($test_type_id, $week_ts_datetime);
                 $progression_val[$week_ts][3] = array();
                 $progression_val[$week_ts][4] = array();
             } else {
                 $progression_val[$week_ts][0] += $date_diff;
                 $percentile_count[$week_ts][] = $date_diff;
                 $progression_count[$week_ts] += 1;
             }
             # Add to list of TAT pending specimens
             $progression_val[$week_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;
 }
 function createWeekRangeArray($sWeek, $sYear, $eWeek, $eYear)
 {
     $aryRange = array();
     $stime = strtotime(week_to_date($sYear, $sWeek));
     $etime = strtotime(week_to_date($eYear, $eWeek));
     if ($etime >= $stime) {
         array_push($aryRange, array('year' => $sYear, 'week' => $sWeek));
         // first entry
         while ($stime < $etime) {
             $sYear = date('Y', $stime);
             $sWeek = date('W', $stime);
             array_push($aryRange, array('year' => $sYear, 'week' => $sWeek));
             $stime += 86400 * 7;
             // add 24 hours
         }
     }
     return $aryRange;
 }