%PDF- %PDF-
| Direktori : /home/vacivi36/core/app/Http/Controllers/ |
| Current File : /home/vacivi36/core/app/Http/Controllers/DashboardController.php |
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\VaccineApplication;
use App\Models\Vaccine;
class DashboardController extends Controller
{
public function getVaccineStatusByCampaign(Request $request)
{
$companyId = $request->input('company_id');
$from = $request->input('from');
$to = $request->input('to');
$campaignId = $request->input('campaign_id'); // Novo filtro por campaign_id
$vaccinesData = Vaccine::with(['vaccineApplications.schedule.patient', 'campaign'])
->when($campaignId, function ($query) use ($campaignId) {
return $query->where('campaign_id', $campaignId);
})
->get()
->filter(function ($vaccine) use ($companyId, $from, $to) {
$applications = $vaccine->vaccineApplications;
if ($companyId) {
$applications = $applications->filter(function ($application) use ($companyId) {
return $application->schedule
&& $application->schedule->patient
&& $application->schedule->patient->company_id == $companyId;
});
}
// Filtro por intervalo de datas do campo application_date
if ($from && $to) {
$applications = $applications->filter(function ($application) use ($from, $to) {
$applicationDate = $application->application_date;
return $applicationDate >= $from && $applicationDate <= $to;
});
}
// Associar aplicações filtradas de volta ao vaccine para uso posterior
$vaccine->filteredApplications = $applications;
return $applications->isNotEmpty(); // Retorna apenas vacinas com aplicações após os filtros
})
->groupBy('campaign_id')
->mapWithKeys(function ($group) {
// Tratamento para caso a campanha não exista
$campaign = $group->first()->campaign;
$campaignName = $campaign ? $campaign->name : 'Sem Campanha';
return [
$campaignName => [
'quantity_vaccine_applied' => $group->sum(function ($vaccine) {
return $vaccine->filteredApplications->where('is_applied', 1)->count();
}),
'quantity_vaccine_not_applied' => $group->sum(function ($vaccine) {
return $vaccine->filteredApplications->where('is_applied', 0)->count();
}),
'quantity_vaccine_pending' => $group->sum(function ($vaccine) {
return $vaccine->filteredApplications->whereNull('is_applied')->count();
}),
]
];
});
return response()->json($vaccinesData);
}
public function getVaccineSummaryByCompany(Request $request)
{
$companyId = $request->input('company_id');
$from = $request->input('from');
$to = $request->input('to');
$campaignId = $request->input('campaign_id'); // Novo filtro por campaign_id
$query = VaccineApplication::whereHas('schedule.patient', function ($query) use ($companyId) {
if ($companyId) {
$query->where('company_id', $companyId);
}
});
// Filtro por intervalo de datas do campo application_date
if ($from && $to) {
$query->whereBetween('application_date', [$from, $to]);
}
// Filtro por campaign_id
if ($campaignId) {
$query->whereHas('vaccine', function ($query) use ($campaignId) {
$query->where('campaign_id', $campaignId);
});
}
// Otimização da query para evitar múltiplos clones
$results = $query->selectRaw('
SUM(CASE WHEN is_applied = 1 THEN 1 ELSE 0 END) as applied,
SUM(CASE WHEN is_applied = 0 THEN 1 ELSE 0 END) as not_applied,
SUM(CASE WHEN is_applied IS NULL THEN 1 ELSE 0 END) as pending,
COUNT(*) as total
')->first();
return response()->json([
'total_vaccines_applied' => (int)$results->applied,
'total_vaccines_not_applied' => (int)$results->not_applied,
'total_pending_vaccines' => (int)$results->pending,
'total_all_vaccines' => (int)$results->total,
]);
}
}