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; }