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