%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home2/vacivi36/core/app/Http/Controllers/
Upload File :
Create Path :
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,
        ]);
    }

}

Zerion Mini Shell 1.0