HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux Bradford-Sitios 6.14.0-1017-azure #17~24.04.1-Ubuntu SMP Mon Dec 1 20:10:50 UTC 2025 x86_64
User: www-data (33)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
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;
    }
}