%PDF- %PDF-
Mini Shell

Mini Shell

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

Zerion Mini Shell 1.0