File: /var/www/informe-admision/app/Http/Controllers/ReportsController.php
<?php
namespace App\Http\Controllers;
use App\Exports\AdmissionsReportExport;
use App\Exports\AppointmentsReportExport;
use App\Http\Controllers\Controller;
use App\Models\Admission;
use App\Models\Appointment;
use App\Models\Family;
use App\Models\Level;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
class ReportsController extends Controller
{
public function __construct()
{
$this->middleware('auth.users')->except('logout');
$this->middleware('auth.users:LIST_REPORTS_ADMISSIONS')->only(['admissions']);
$this->middleware('auth.users:EXPORT_REPORTS_ADMISSIONS')->only(['admissions_export']);
$this->middleware('auth.users:LIST_REPORTS_APPOINTMENTS')->only(['appointments']);
$this->middleware('auth.users:EXPORT_REPORTS_APPOINTMENTS')->only(['appointments_export']);
}
public function admissions(Request $request)
{
$sidenav = 'reports';
$sidenav_item = 'reports_admissions';
$title = 'Reporte de Postulaciones';
$title_table = 'Listado de Postulaciones';
$filters = $this->parseFilters($request);
$list_data = $this->buildQuery($filters)->orderBy('id', 'desc')->get();
$has_records = Admission::where('deleted', false)->exists();
#DATOS PARA LOS SELECTORES DE FILTRO
$families = Family::where('deleted', false)
->orderBy('name', 'asc')
->get();
$years = Admission::where('deleted', false)
->whereNotNull('year')
->distinct()
->orderBy('year', 'desc')
->pluck('year');
$levels = Level::where('deleted', false)
->where('status', 1)
->orderBy('order', 'asc')
->get();
return view('admin.reports.reports_admissions', compact(
'title',
'sidenav',
'sidenav_item',
'title_table',
'list_data',
'families',
'years',
'levels',
'filters',
'has_records'
));
}
public function admissions_export(Request $request)
{
$filters = $this->parseFilters($request);
$list = $this->buildQuery($filters)->orderBy('id', 'desc')->get();
$filename = 'reporte_postulaciones_' . date('Y_m_d_His') . '.xlsx';
return Excel::download(new AdmissionsReportExport($list), $filename);
}
#PARSEA Y NORMALIZA LOS FILTROS RECIBIDOS DEL REQUEST
private function parseFilters(Request $request)
{
return [
'year' => $request->filter_year,
'family_id' => $request->filter_family,
'status' => $request->filter_status,
'level' => $request->filter_level,
'rut' => trim($request->filter_rut),
'name' => trim($request->filter_name),
];
}
#CONSTRUYE EL QUERY DE ADMISSIONS APLICANDO LOS FILTROS PARSEADOS
private function buildQuery(array $filters)
{
$query = Admission::with(['family', 'level', 'dataUploadsDetails'])
->where('deleted', false);
if (!empty($filters['year'])) {
$query->where('year', $filters['year']);
}
if (!empty($filters['family_id'])) {
$query->where('family_id', $filters['family_id']);
}
if (!empty($filters['status'])) {
$query->where('status', $filters['status']);
}
if (!empty($filters['level'])) {
$query->where('level_id', $filters['level']);
}
if (!empty($filters['rut'])) {
$rut = strUpper(str_replace('.', '', $filters['rut']));
$query->whereHas('dataUploadsDetails', function ($q) use ($rut) {
$q->where('applicant_rut', 'like', '%' . $rut . '%');
});
}
if (!empty($filters['name'])) {
$name = $filters['name'];
$query->whereHas('dataUploadsDetails', function ($q) use ($name) {
$q->where(function ($sub) use ($name) {
$sub->where('applicant_names', 'like', '%' . $name . '%')
->orWhere('applicant_father_lastname', 'like', '%' . $name . '%')
->orWhere('applicant_mother_lastname', 'like', '%' . $name . '%');
});
});
}
return $query;
}
#***************************************************#
#*************** REPORTE DE CITAS ******************#
#***************************************************#
public function appointments(Request $request)
{
$sidenav = 'reports';
$sidenav_item = 'reports_appointments';
$title = 'Reporte de Citas y Pagos';
$title_table = 'Listado de Citas';
$filters = $this->parseAppointmentFilters($request);
$list_data = $this->buildAppointmentQuery($filters)->orderBy('appointments.id', 'desc')->get();
$has_records = Appointment::exists();
return view('admin.reports.reports_appointments', compact(
'title',
'sidenav',
'sidenav_item',
'title_table',
'list_data',
'filters',
'has_records'
));
}
public function appointments_export(Request $request)
{
$filters = $this->parseAppointmentFilters($request);
$list = $this->buildAppointmentQuery($filters)->orderBy('appointments.id', 'desc')->get();
$filename = 'reporte_citas_pagos_' . date('Y_m_d_His') . '.xlsx';
return Excel::download(new AppointmentsReportExport($list), $filename);
}
private function parseAppointmentFilters(Request $request)
{
return [
'status' => $request->has('filter_status') ? $request->filter_status : 'paid',
'code' => trim($request->filter_code),
'date_from' => $request->filter_date_from,
'date_to' => $request->filter_date_to,
'rut' => trim($request->filter_rut),
'name' => trim($request->filter_name),
];
}
private function buildAppointmentQuery(array $filters)
{
$query = Appointment::with(['successPayment'])->withCount('payments');
if (!empty($filters['status'])) {
$query->where('status', $filters['status']);
}
if (!empty($filters['code'])) {
$query->where('code', 'like', '%' . $filters['code'] . '%');
}
if (!empty($filters['date_from'])) {
$query->whereDate('created_at', '>=', $filters['date_from']);
}
if (!empty($filters['date_to'])) {
$query->whereDate('created_at', '<=', $filters['date_to']);
}
if (!empty($filters['rut'])) {
$rut = str_replace('.', '', $filters['rut']);
$query->where('form_data', 'like', '%' . $rut . '%');
}
if (!empty($filters['name'])) {
$query->where('form_data', 'like', '%' . $filters['name'] . '%');
}
return $query;
}
}