finalized overview page
This commit is contained in:
@@ -8,6 +8,16 @@ use App\Models\CaseLabResult;
|
||||
|
||||
class DashboardService
|
||||
{
|
||||
private function totalTested($surveillanceId, $startYear, $startWeek, $endYear, $endWeek)
|
||||
{
|
||||
return SurveillanceCase::where('surveillance_id', $surveillanceId)
|
||||
->where(function ($q) use ($startYear, $startWeek, $endYear, $endWeek) {
|
||||
$q->whereRaw("(year_data > ? OR (year_data = ? AND week_data >= ?))", [$startYear, $startYear, $startWeek])
|
||||
->whereRaw("(year_data < ? OR (year_data = ? AND week_data <= ?))", [$endYear, $endYear, $endWeek]);
|
||||
})
|
||||
->distinct('lab_code')
|
||||
->count('lab_code');
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
@@ -56,9 +66,8 @@ class DashboardService
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public function sariSummaryFast($surveillanceId, $year, $week)
|
||||
public function programSummaryFast($surveillanceId, $year, $week)
|
||||
{
|
||||
|
||||
$row = SurveillanceCase::leftJoin(
|
||||
'case_lab_results',
|
||||
'surveillance_cases.lab_code',
|
||||
@@ -79,14 +88,20 @@ class DashboardService
|
||||
END) as overall_positive,
|
||||
|
||||
COUNT(DISTINCT CASE
|
||||
WHEN case_lab_results.indicator = 'SARI Influenza Test'
|
||||
AND case_lab_results.is_positive = 1
|
||||
WHEN case_lab_results.is_positive = 1
|
||||
AND (
|
||||
LOWER(case_lab_results.pathogen_name) LIKE '%influenza%'
|
||||
OR LOWER(case_lab_results.pathogen_name) LIKE '%influzena%'
|
||||
)
|
||||
THEN surveillance_cases.lab_code
|
||||
END) as influenza_positive,
|
||||
|
||||
COUNT(DISTINCT CASE
|
||||
WHEN case_lab_results.indicator = 'SARI Covid Test'
|
||||
AND case_lab_results.is_positive = 1
|
||||
WHEN case_lab_results.is_positive = 1
|
||||
AND (
|
||||
LOWER(case_lab_results.pathogen_name) LIKE '%covid%'
|
||||
OR LOWER(case_lab_results.pathogen_name) LIKE '%sars%'
|
||||
)
|
||||
THEN surveillance_cases.lab_code
|
||||
END) as covid_positive
|
||||
")
|
||||
@@ -103,29 +118,14 @@ class DashboardService
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
return [
|
||||
|
||||
'cases' => $row->total_cases,
|
||||
|
||||
'overall_rate' => round(
|
||||
($row->overall_positive / $row->total_cases) * 100
|
||||
,
|
||||
1
|
||||
),
|
||||
'overall_rate' => round(($row->overall_positive / $row->total_cases) * 100, 1),
|
||||
|
||||
'influenza_rate' => round(
|
||||
($row->influenza_positive / $row->total_cases) * 100
|
||||
,
|
||||
1
|
||||
),
|
||||
|
||||
'covid_rate' => round(
|
||||
($row->covid_positive / $row->total_cases) * 100
|
||||
,
|
||||
1
|
||||
),
|
||||
'influenza_rate' => round(($row->influenza_positive / $row->total_cases) * 100, 1),
|
||||
|
||||
'covid_rate' => round(($row->covid_positive / $row->total_cases) * 100, 1),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -148,9 +148,25 @@ class DashboardService
|
||||
$prevYear--;
|
||||
}
|
||||
|
||||
$current = $this->sariSummaryFast($surveillanceId, $endYear, $endWeek);
|
||||
$previous = $this->sariSummaryFast($surveillanceId, $prevYear, $prevWeek);
|
||||
$latest = SurveillanceCase::where('surveillance_id', $surveillanceId)
|
||||
->selectRaw("year_data, week_data")
|
||||
->orderByDesc('year_data')
|
||||
->orderByDesc('week_data')
|
||||
->first();
|
||||
|
||||
$year = $latest->year_data;
|
||||
$week = $latest->week_data;
|
||||
$current = $this->programSummaryFast($surveillanceId, $year, $week);
|
||||
$previous = $this->programSummaryFast($surveillanceId, $prevYear, $prevWeek);
|
||||
$prevWeek = $week - 1;
|
||||
$prevYear = $year;
|
||||
|
||||
if ($prevWeek <= 0) {
|
||||
$prevWeek = 52;
|
||||
$prevYear--;
|
||||
}
|
||||
|
||||
$previous = $this->programSummaryFast($surveillanceId, $prevYear, $prevWeek);
|
||||
|
||||
return [
|
||||
|
||||
@@ -195,7 +211,7 @@ class DashboardService
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public function aggregateAllPrograms($periodType, $startYear, $startWeek, $endYear, $endWeek)
|
||||
public function aggregateAllPrograms($startYear, $startWeek, $endYear, $endWeek)
|
||||
{
|
||||
|
||||
$data = SurveillanceCase::selectRaw("
|
||||
@@ -293,13 +309,34 @@ class DashboardService
|
||||
$endWeek
|
||||
),
|
||||
|
||||
'province_distribution' => $this->provinceCirclesProgram(
|
||||
'province_distribution' => $this->provinceProgram(
|
||||
$surveillanceId,
|
||||
$startYear,
|
||||
$startWeek,
|
||||
$endYear,
|
||||
$endWeek
|
||||
)
|
||||
),
|
||||
'virus_trend' => $this->virusTrend(
|
||||
$surveillanceId,
|
||||
$startYear,
|
||||
$startWeek,
|
||||
$endYear,
|
||||
$endWeek
|
||||
),
|
||||
'subtype_distribution' => $this->subtypeDistribution(
|
||||
$surveillanceId,
|
||||
$startYear,
|
||||
$startWeek,
|
||||
$endYear,
|
||||
$endWeek
|
||||
),
|
||||
'sentinel_sites' => $this->sentinelSites(
|
||||
$surveillanceId,
|
||||
$startYear,
|
||||
$startWeek,
|
||||
$endYear,
|
||||
$endWeek
|
||||
),
|
||||
|
||||
];
|
||||
|
||||
@@ -340,14 +377,46 @@ class DashboardService
|
||||
})
|
||||
|
||||
->selectRaw("
|
||||
surveillance_cases.year_data as year,
|
||||
surveillance_cases.week_data as period,
|
||||
COUNT(DISTINCT surveillance_cases.lab_code) as total_samples,
|
||||
surveillance_cases.year_data as year,
|
||||
surveillance_cases.week_data as period,
|
||||
|
||||
ROUND(
|
||||
SUM(CASE WHEN case_lab_results.is_positive = 1 THEN 1 ELSE 0 END)
|
||||
/ NULLIF(COUNT(*),0) * 100,1
|
||||
) as positivity_rate
|
||||
COUNT(DISTINCT surveillance_cases.lab_code) as total_samples,
|
||||
|
||||
-- Overall positivity rate
|
||||
ROUND(
|
||||
COUNT(DISTINCT CASE
|
||||
WHEN case_lab_results.is_positive = 1
|
||||
THEN surveillance_cases.lab_code
|
||||
END)
|
||||
/ NULLIF(COUNT(DISTINCT surveillance_cases.lab_code), 0) * 100
|
||||
,1) as positivity_rate,
|
||||
|
||||
-- Influenza positivity rate
|
||||
ROUND(
|
||||
COUNT(DISTINCT CASE
|
||||
WHEN case_lab_results.is_positive = 1
|
||||
AND (
|
||||
LOWER(case_lab_results.pathogen_name) LIKE '%influenza%'
|
||||
OR LOWER(case_lab_results.pathogen_name) LIKE '%influzena%'
|
||||
)
|
||||
THEN surveillance_cases.lab_code
|
||||
END)
|
||||
/ NULLIF(COUNT(DISTINCT surveillance_cases.lab_code), 0) * 100
|
||||
,1) as influenza_rate,
|
||||
|
||||
-- COVID positivity rate
|
||||
ROUND(
|
||||
COUNT(DISTINCT CASE
|
||||
WHEN case_lab_results.is_positive = 1
|
||||
AND (
|
||||
case_lab_results.pathogen_name = 'Positive'
|
||||
OR case_lab_results.pathogen_name = 'SARS-CoV-2'
|
||||
)
|
||||
AND case_lab_results.indicator LIKE '%Covid%'
|
||||
THEN surveillance_cases.lab_code
|
||||
END)
|
||||
/ NULLIF(COUNT(DISTINCT surveillance_cases.lab_code), 0) * 100
|
||||
,1) as covid_rate
|
||||
")
|
||||
|
||||
->groupBy(
|
||||
@@ -399,7 +468,49 @@ class DashboardService
|
||||
return $results;
|
||||
|
||||
}
|
||||
public function virusTrend($surveillanceId, $startYear, $startWeek, $endYear, $endWeek)
|
||||
{
|
||||
return CaseLabResult::join(
|
||||
'surveillance_cases',
|
||||
'case_lab_results.lab_code',
|
||||
'=',
|
||||
'surveillance_cases.lab_code'
|
||||
)
|
||||
|
||||
->where('surveillance_cases.surveillance_id', $surveillanceId)
|
||||
|
||||
->where(function ($q) use ($startYear, $startWeek, $endYear, $endWeek) {
|
||||
$q->whereRaw("(year_data > ? OR (year_data = ? AND week_data >= ?))", [$startYear, $startYear, $startWeek])
|
||||
->whereRaw("(year_data < ? OR (year_data = ? AND week_data <= ?))", [$endYear, $endYear, $endWeek]);
|
||||
})
|
||||
|
||||
->selectRaw("
|
||||
surveillance_cases.week_data as period,
|
||||
|
||||
COUNT(DISTINCT CASE
|
||||
WHEN case_lab_results.is_positive = 1
|
||||
AND (
|
||||
LOWER(case_lab_results.pathogen_name) LIKE '%influenza%'
|
||||
OR LOWER(case_lab_results.pathogen_name) LIKE '%influzena%'
|
||||
)
|
||||
THEN surveillance_cases.lab_code
|
||||
END) as influenza,
|
||||
|
||||
COUNT(DISTINCT CASE
|
||||
WHEN case_lab_results.is_positive = 1
|
||||
AND (
|
||||
case_lab_results.pathogen_name = 'Positive'
|
||||
OR case_lab_results.pathogen_name = 'SARS-CoV-2'
|
||||
)
|
||||
AND case_lab_results.indicator LIKE '%Covid%'
|
||||
THEN surveillance_cases.lab_code
|
||||
END) as covid
|
||||
")
|
||||
|
||||
->groupBy('surveillance_cases.week_data')
|
||||
->orderBy('surveillance_cases.week_data')
|
||||
->get();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@@ -407,14 +518,24 @@ class DashboardService
|
||||
| Province Distribution (Program)
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
public function provinceCirclesProgram($surveillanceId, $startYear, $startWeek, $endYear, $endWeek)
|
||||
public function provinceCircles($startYear, $startWeek, $endYear, $endWeek)
|
||||
{
|
||||
return SurveillanceCase::selectRaw(" surveillance_cases.site_province_name, surveillance_cases.surveillance_id, COUNT(*) as total ")->join('case_lab_results', 'surveillance_cases.lab_code', '=', 'case_lab_results.lab_code')->where('case_lab_results.is_positive', 1)->where(function ($q) use ($startYear, $startWeek, $endYear, $endWeek) {
|
||||
$q->whereRaw("(surveillance_cases.year_data > ? OR (surveillance_cases.year_data = ? AND surveillance_cases.week_data >= ?))", [$startYear, $startYear, $startWeek])->whereRaw("(surveillance_cases.year_data < ? OR (surveillance_cases.year_data = ? AND surveillance_cases.week_data <= ?))", [$endYear, $endYear, $endWeek]);
|
||||
})->groupBy('surveillance_cases.site_province_name', 'surveillance_cases.surveillance_id')->get();
|
||||
}
|
||||
public function provinceProgram($surveillanceId, $startYear, $startWeek, $endYear, $endWeek)
|
||||
{
|
||||
|
||||
return SurveillanceCase::selectRaw("
|
||||
surveillance_cases.site_province_name,
|
||||
COUNT(DISTINCT surveillance_cases.lab_code) as total
|
||||
")
|
||||
surveillance_cases.site_province_name,
|
||||
|
||||
COUNT(DISTINCT surveillance_cases.lab_code) as total,
|
||||
|
||||
COUNT(DISTINCT CASE
|
||||
WHEN case_lab_results.is_positive = 1
|
||||
THEN surveillance_cases.lab_code
|
||||
END) as positive
|
||||
")
|
||||
|
||||
->join(
|
||||
'case_lab_results',
|
||||
@@ -424,7 +545,6 @@ class DashboardService
|
||||
)
|
||||
|
||||
->where('surveillance_cases.surveillance_id', $surveillanceId)
|
||||
->where('case_lab_results.is_positive', 1)
|
||||
|
||||
->where(function ($q) use ($startYear, $startWeek, $endYear, $endWeek) {
|
||||
|
||||
@@ -442,10 +562,30 @@ class DashboardService
|
||||
|
||||
->groupBy('surveillance_cases.site_province_name')
|
||||
->get();
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| sentinel sites
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
public function sentinelSites($surveillanceId, $startYear, $startWeek, $endYear, $endWeek)
|
||||
{
|
||||
return SurveillanceCase::selectRaw("
|
||||
sentinel_site_name as name,
|
||||
COUNT(DISTINCT lab_code) as total
|
||||
")
|
||||
->where('surveillance_id', $surveillanceId)
|
||||
|
||||
->where(function ($q) use ($startYear, $startWeek, $endYear, $endWeek) {
|
||||
$q->whereRaw("(year_data > ? OR (year_data = ? AND week_data >= ?))", [$startYear, $startYear, $startWeek])
|
||||
->whereRaw("(year_data < ? OR (year_data = ? AND week_data <= ?))", [$endYear, $endYear, $endWeek]);
|
||||
})
|
||||
|
||||
->groupBy('sentinel_site_name')
|
||||
->orderByDesc('total') // nice for chart
|
||||
->get();
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
@@ -455,44 +595,84 @@ class DashboardService
|
||||
|
||||
public function pathogenDistribution($surveillanceId, $startYear, $startWeek, $endYear, $endWeek)
|
||||
{
|
||||
$total = $this->totalTested($surveillanceId, $startYear, $startWeek, $endYear, $endWeek);
|
||||
|
||||
return CaseLabResult::selectRaw("
|
||||
pathogen_name,
|
||||
COUNT(*) as total
|
||||
")
|
||||
$rows = CaseLabResult::join(
|
||||
'surveillance_cases',
|
||||
'case_lab_results.lab_code',
|
||||
'=',
|
||||
'surveillance_cases.lab_code'
|
||||
)
|
||||
->where('surveillance_cases.surveillance_id', $surveillanceId)
|
||||
|
||||
->join(
|
||||
'surveillance_cases',
|
||||
'case_lab_results.lab_code',
|
||||
'=',
|
||||
'surveillance_cases.lab_code'
|
||||
)
|
||||
->where(function ($q) use ($startYear, $startWeek, $endYear, $endWeek) {
|
||||
$q->whereRaw("(year_data > ? OR (year_data = ? AND week_data >= ?))", [$startYear, $startYear, $startWeek])
|
||||
->whereRaw("(year_data < ? OR (year_data = ? AND week_data <= ?))", [$endYear, $endYear, $endWeek]);
|
||||
})
|
||||
|
||||
->where('case_lab_results.is_positive', 1)
|
||||
|
||||
->selectRaw("
|
||||
CASE
|
||||
WHEN LOWER(case_lab_results.pathogen_name) LIKE '%influenza%'
|
||||
OR LOWER(case_lab_results.pathogen_name) LIKE '%influzena%'
|
||||
THEN 'Influenza'
|
||||
|
||||
WHEN case_lab_results.pathogen_name = 'Positive'
|
||||
AND case_lab_results.indicator LIKE '%Covid%'
|
||||
THEN 'SARS-CoV-2'
|
||||
|
||||
ELSE case_lab_results.pathogen_name
|
||||
END as pathogen,
|
||||
|
||||
COUNT(DISTINCT surveillance_cases.lab_code) as total
|
||||
")
|
||||
|
||||
->groupBy('pathogen')
|
||||
->havingRaw("pathogen IS NOT NULL AND pathogen != ''")
|
||||
->orderByDesc('total')
|
||||
->get();
|
||||
|
||||
return $rows->map(function ($r) use ($total) {
|
||||
$r->rate = $total > 0 ? round(($r->total / $total) * 100, 1) : 0;
|
||||
return $r;
|
||||
});
|
||||
}
|
||||
public function subtypeDistribution($surveillanceId, $startYear, $startWeek, $endYear, $endWeek)
|
||||
{
|
||||
$total = $this->totalTested($surveillanceId, $startYear, $startWeek, $endYear, $endWeek);
|
||||
|
||||
$rows = CaseLabResult::join(
|
||||
'surveillance_cases',
|
||||
'case_lab_results.lab_code',
|
||||
'=',
|
||||
'surveillance_cases.lab_code'
|
||||
)
|
||||
->where('surveillance_cases.surveillance_id', $surveillanceId)
|
||||
->where('case_lab_results.is_positive', 1)
|
||||
|
||||
->where(function ($q) use ($startYear, $startWeek, $endYear, $endWeek) {
|
||||
|
||||
$q->whereRaw(
|
||||
"(year_data > ? OR (year_data = ? AND week_data >= ?))",
|
||||
[$startYear, $startYear, $startWeek]
|
||||
)
|
||||
|
||||
->whereRaw(
|
||||
"(year_data < ? OR (year_data = ? AND week_data <= ?))",
|
||||
[$endYear, $endYear, $endWeek]
|
||||
);
|
||||
|
||||
$q->whereRaw("(year_data > ? OR (year_data = ? AND week_data >= ?))", [$startYear, $startYear, $startWeek])
|
||||
->whereRaw("(year_data < ? OR (year_data = ? AND week_data <= ?))", [$endYear, $endYear, $endWeek]);
|
||||
})
|
||||
|
||||
->groupBy('pathogen_name')
|
||||
->orderByDesc('total')
|
||||
->get();
|
||||
->selectRaw("
|
||||
subtype,
|
||||
COUNT(DISTINCT surveillance_cases.lab_code) as total
|
||||
")
|
||||
|
||||
->groupBy('subtype')
|
||||
->havingRaw("subtype IS NOT NULL AND subtype != 'Positive' AND subtype != ''")
|
||||
->orderByDesc('total')
|
||||
->get();
|
||||
|
||||
return $rows->map(function ($r) use ($total) {
|
||||
$r->rate = $total > 0 ? round(($r->total / $total) * 100, 1) : 0;
|
||||
return $r;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Age Distribution
|
||||
|
||||
Reference in New Issue
Block a user