%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
]);
}
}