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; }
function get_tat_data_per_test_per_lab_dir($test_type_id, $lab_config_id, $date_from, $date_to, $include_pending) { global $DEFAULT_PENDING_TAT; # Default TAT value for pending tests (in days) $lab_config = LabConfig::getById($lab_config_id); date_default_timezone_set('UTC'); $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(); $cc = 1; //$percentile_tofind = 90; //$percentile_count = array(); //$goal_val = array(); # Return {week=>[avg tat, percentile tat, goal tat, [overdue specimen_ids], [pending specimen_ids]]} echo "!" . $date_to . "!"; $from_e = explode('-', $date_from); $to_e = explode('-', $date_to); $start_ts = mktime(1, 1, 1, $from_e[1], $from_e[2], $from_e[0]); $end_ts = mktime(1, 1, 1, $to_e[1], $to_e[2], $to_e[0]); $week_start_ts = date("W", $start_ts); $year_start_ts = date("Y", $start_ts); $startingWeek = week_to_date2($week_start_ts, $year_start_ts); $week_end_ts = date("W", $end_ts); $year_end_ts = date("Y", $end_ts); $endingWeek = week_to_date2($week_end_ts, $year_end_ts); $weekDiff = mktime(1, 1, 1, 1, 1, 2000) - mktime(1, 1, 1, 1, 10, 2000); $wc = 0; $currentWeek = $startingWeek; $currentTS = $startingWeek; echo "sTS=" . $startingWeek; echo "cTS=" . $endingWeek; while ($currentWeek != $endingWeek) { $wc++; $currentTS = $currentTS + $weekDiff; $week_currentTS = date("W", $currentTS); $year_currentTS = date("Y", $currentTS); $currentWeek = week_to_date2($week_currentTS, $year_currentTS); $progression_count[$currentWeek] = 0; $progression_val[$currentWeek] = 0; $wc++; } echo "WC=" . $wc; 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_date2($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 ($date_diff < 0) { $date_diff = 0; } //if(!isset($progression_val[$week_ts])) { if ($progression_val[$week_ts] == 0) { //$progression_val[$week_ts] = array(); $progression_val[$week_ts] = $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] += $date_diff; //$percentile_count[$week_ts][] = $date_diff; $progression_count[$week_ts] += 1; //$formattedValue = round($value[0],2); //$formattedDate = bcmul($key,1000); //ksort($stat_list); } } 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_date2($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] = $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 { if ($date_diff > 0) { $progression_val[$week_ts] += $date_diff; } //$percentile_count[$week_ts][] = $date_diff; $progression_count[$week_ts] += 1; } # Add to list of TAT pending specimens } } $rstat = array(); $wa = 7; $wc = 0; foreach ($progression_val as $key => $value) { # Find average value $progression_val[$key] = $value / $progression_count[$key]; # Convert from sec timestamp to days $progression_val[$key] = $progression_val[$key] / (60 * 60 * 24); $rstat[$cc][1] = round($progression_val[$key], 2); $rstat[$cc][0] = date('d M Y', $key); //ksort($stat_list); $cc++; # Determine percentile value //$progression_val[$key][1] = getPercentile2($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]]} //foreach($progression_val as ) return $rstat; }