%PDF- %PDF-
Direktori : /home2/vacivi36/core/app/Http/Controllers/ |
Current File : //home2/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, ]); } }