%PDF- %PDF-
Direktori : /home/vacivi36/core/app/Http/Controllers/ |
Current File : /home/vacivi36/core/app/Http/Controllers/VaccineApplicationController.php |
<?php namespace App\Http\Controllers; use App\Models\VaccineApplication; use Illuminate\Http\Request; class VaccineApplicationController extends Controller { /** * Exibir uma aplicação específica de vacina. */ public function show($id) { $application = VaccineApplication::with('vaccine', 'schedule.patient')->findOrFail($id); return response()->json($application); } /** * Atualizar uma aplicação de vacina específica. */ public function update(Request $request, $id) { $application = VaccineApplication::findOrFail($id); $application->vaccine_id = $request->vaccine_id; $application->user_id = $request->user_id; $application->application_date = $request->application_date; $application->dose_number = $request->dose_number; $application->notes = $request->notes; $application->reason = $request->reason; if ($request->has('reason')) { $application->reason = $request->reason; } if ($request->has('is_applied')) { $application->is_applied = $request->is_applied; } $update = $application->save(); if ($update) { return response()->json(['status' => 'success', 'message' => 'Aplicação de vacina atualizada com sucesso!'], 200); } else { return response()->json(['status' => 'error', 'message' => 'Erro ao atualizar aplicação de vacina.'], 500); } } /** * Remover uma aplicação de vacina específica. */ public function destroy($id) { $application = VaccineApplication::findOrFail($id); $application->delete(); return response()->json(['message' => 'Aplicação de vacina excluída com sucesso!']); } public function reportResumeApplication(Request $request) { // Obtendo os parâmetros do request $company_id = $request->input('company_id'); $campaign_id = $request->input('campaign_id'); $from = $request->input('from'); $to = $request->input('to'); $is_applied = $request->input('is_applied'); // Fazendo a consulta com os filtros necessários $query = \DB::table('vaccine_applications') ->join('schedules', 'vaccine_applications.schedule_id', '=', 'schedules.id') ->join('patients', 'schedules.patient_id', '=', 'patients.id') ->join('vaccines', 'vaccine_applications.vaccine_id', '=', 'vaccines.id') ->join('campaigns', 'vaccines.campaign_id', '=', 'campaigns.id') ->whereBetween('vaccine_applications.application_date', [$from, $to]); // Filtro pelo intervalo de datas // Filtro opcional para company_id if ($company_id !== null && $company_id !== '') { $query->where('patients.company_id', '=', $company_id); } // Filtro opcional para campaign_id if ($campaign_id !== null && $campaign_id !== '') { $query->where('campaigns.id', '=', $campaign_id); } // Aplica o filtro is_applied de acordo com os valores enviados if ($is_applied !== null && $is_applied !== '') { if ($is_applied == 2) { $query->whereNull('vaccine_applications.is_applied'); } else { $query->where('vaccine_applications.is_applied', '=', $is_applied); } } $applications = $query->select( 'patients.name as patient_name', 'patients.cpf as patient_cpf', 'vaccine_applications.application_date', 'campaigns.name as campaign', 'vaccines.name as vaccine', 'vaccine_applications.dose_number', 'vaccine_applications.is_applied' )->get(); return response()->json($applications); } public function reportDetailedApplication(Request $request) { $company_id = $request->input('company_id'); $campaign_id = $request->input('campaign_id'); $patient_id = $request->input('patient_id'); // Novo parâmetro $from = $request->input('from'); $to = $request->input('to'); // Contagem direta de vacinas com diferentes valores de is_applied usando uma subconsulta separada $totalCounts = \DB::table('vaccine_applications') ->join('schedules', 'vaccine_applications.schedule_id', '=', 'schedules.id') ->when($company_id, function ($query, $company_id) { return $query->join('patients', 'schedules.patient_id', '=', 'patients.id') ->where('patients.company_id', $company_id); }) ->when($campaign_id, function ($query, $campaign_id) { return $query->join('vaccines', 'vaccine_applications.vaccine_id', '=', 'vaccines.id') ->where('vaccines.campaign_id', $campaign_id); }) ->when($patient_id, function ($query, $patient_id) { return $query->where('schedules.patient_id', $patient_id); }) ->when($from, function ($query, $from) { return $query->whereDate('vaccine_applications.application_date', '>=', $from); }) ->when($to, function ($query, $to) { return $query->whereDate('vaccine_applications.application_date', '<=', $to); }) ->select( \DB::raw('COUNT(CASE WHEN vaccine_applications.is_applied = 1 THEN 1 ELSE NULL END) as total_vaccines_applied'), \DB::raw('COUNT(CASE WHEN vaccine_applications.is_applied = 0 THEN 1 ELSE NULL END) as total_vaccines_not_applied'), \DB::raw('COUNT(CASE WHEN vaccine_applications.is_applied IS NULL THEN 1 ELSE NULL END) as total_vaccines_pending'), \DB::raw('COUNT(*) as total_vaccines') ) ->first(); // Consulta principal para pacientes sem contar duplicação $patients = \DB::table('patients') ->join('companies', 'patients.company_id', '=', 'companies.id') ->join('schedules', 'patients.id', '=', 'schedules.patient_id') ->select( 'patients.id as patient_id', 'patients.name as patient_name', 'patients.cpf as patient_cpf', 'patients.address as patient_address', 'patients.city as patient_city', 'companies.name as company_name', 'companies.cnpj as company_cnpj', 'companies.address as company_address', 'companies.phone as company_phone' ) ->when($company_id, function ($query, $company_id) { return $query->where('patients.company_id', $company_id); }) ->when($patient_id, function ($query, $patient_id) { // Filtro por patient_id return $query->where('patients.id', $patient_id); }) ->groupBy( 'patients.id', 'patients.name', 'patients.cpf', 'patients.address', 'patients.city', 'companies.name', 'companies.cnpj', 'companies.address', 'companies.phone' ) ->get(); // Para obter os detalhes das vacinas para cada paciente sem duplicação $detailedData = $patients->map(function ($patient) use ($company_id, $campaign_id, $from, $to, $patient_id) { $vaccines = \DB::table('vaccine_applications') ->join('schedules', 'vaccine_applications.schedule_id', '=', 'schedules.id') ->leftJoin('vaccines', 'vaccine_applications.vaccine_id', '=', 'vaccines.id') ->leftJoin('campaigns', 'vaccines.campaign_id', '=', 'campaigns.id') ->select( 'vaccines.name', 'vaccines.batch', 'campaigns.name as campaign_name', 'vaccine_applications.application_date', 'vaccine_applications.dose_number', 'vaccine_applications.is_applied', 'vaccine_applications.reason' ) ->where('schedules.patient_id', $patient->patient_id) ->when($campaign_id, function ($query, $campaign_id) { return $query->where('vaccines.campaign_id', $campaign_id); }) ->when($from, function ($query, $from) { return $query->whereDate('vaccine_applications.application_date', '>=', $from); }) ->when($to, function ($query, $to) { return $query->whereDate('vaccine_applications.application_date', '<=', $to); }) ->get(); $patient->vaccines = $vaccines; return $patient; }); return response()->json([ 'summary_company_vaccines' => $totalCounts, 'company_patients' => $detailedData ]); } }