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/gestion-formularios.bdfschool/app/Http/Controllers/UsersController.php
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Models\Areas;
use App\Models\PersonalUsersInformation;
use App\Models\Profiles;
use App\Models\Users;
use App\Services\BrevoService\BrevoMailer;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class UsersController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth.users')->except('logout');
        $this->middleware('auth.users:LIST_PROFILES')->only(['index']);
        $this->middleware('auth.users:ADD_PROFILES')->only(['create', 'store']);
        $this->middleware('auth.users:EDIT_PROFILES')->only(['edit', 'update']);
        $this->middleware('auth.users:DEL_PROFILES')->only(['destroy']);
    }
    public function index()
    {
        $sidenav = 'users';
        $sidenav_item = 'users_list';
        $title = 'Gestión de Usuarios';
        $title_table = 'Listado de Usuarios';
        $list_data = Users::where('deleted', false)->where('id', '!=', 1)->get();
        return view('admin.users.users_list', compact(
            'title',
            'sidenav',
            'sidenav_item',
            'title_table',
            'list_data'
        ));
    }

    public function create()
    {
        $sidenav = 'users';
        $sidenav_item = 'users_new';
        $title = 'Nuevo Usuario';
        $title_form = 'Formulario de Registro de Usuario';
        $profiles_data = Profiles::where('deleted', false)->where('show_user', true)->where('status', true)->get();
        $areas_data = Areas::where('deleted', false)->where('status', true)->get();
        return view(
            'admin.users.users_new',
            compact(
                'title',
                'sidenav',
                'sidenav_item',
                'title_form',
                'profiles_data',
                'areas_data'
            )
        );
    }

    public function store(Request $request)
    {
        $this->validateData($request);

        if (!empty($request->rut)) {
            $this->validate($request, [
                'rut' => 'min:11|max:13',
            ], [
                'rut.min' => 'Rut debe tener Mínimo 11 Caracteres',
                'rut.max' => 'Rut debe tener Máximo 13 Caracteres',
            ]);
            $rut = trim($request->rut);
            $rut = str_replace('.', '', $rut);
            if (!validateRut($rut)) {
                return back()->with(['danger_message' => 'Rut posee formato inválido'])->with(['danger_message_title' => 'ERROR DE VALIDACIÓN'])->withInput();
            }

            $validate_rut = Users::where('rut', $rut)->where('deleted', false)->first();
            if (!empty($validate_rut)) {
                return back()->with(['danger_message' => 'Rut ya existe en nuestros registros'])->with(['danger_message_title' => 'ERROR DE VALIDACIÓN'])->withInput();
            }
        }

        $email = strLower($request->email);
        $validate_username = Users::where('username', $email)->where('deleted', false)->first();
        $validate_email = Users::where('username', $email)->where('deleted', false)->first();
        if (!empty($validate_username) || !empty($validate_email)) {
            return back()->with(['danger_message' => 'Correo electrónico ya existe en nuestros registros'])->with(['danger_message_title' => 'ERROR DE VALIDACIÓN'])->withInput();
        }

        $profile = Profiles::find($request->profile);
        $request->password = generateSecurePassword();
        $request->activation_token = getToken();

        $user_register = $this->createOrUpdate($request, '');
        if ($user_register > 0) {
            #ENVIO DE CREACIÓN DE CUENTA
            $email = strLower($request->email);
            try {
                BrevoMailer::send(
                    $email,
                    'Confirmación de Cuenta - Bradford School',
                    'templates_email.email_register_user',
                    [
                        'data' =>
                        [
                            'name' => $request->name,
                            'username' => $email,
                            'password' => $request->password,
                            'token' => $request->activation_token,
                            'type_account' => $profile ? $profile->profile : ''
                        ]
                    ],
                );
            } catch (Exception $e) {
                return redirect(route('users'))->with(['warning_message' => 'Usuario Creado Correctamente, pero ocurrió un problema al enviar correo'])->with(['warning_message_title' => 'GESTIÓN DE USUARIOS']);
            }
            return redirect(route('users'))->with(['success_message' => 'Usuario Creado Correctamente'])->with(['success_message_title' => 'GESTIÓN DE USUARIOS']);
        }
        return back()->with(['danger_message' => 'Ha Ocurrido un error al crear. Intente Nuevamente'])->with(['danger_message_title' => 'ERROR INTERNO'])->withInput();
    }

    public function edit($register_id)
    {
        $form_data = $this->validateExists($register_id);
        if (empty($form_data)) {
            return redirect(route('users'))->with(['danger_message' => 'Registro No existe o fue Eliminado'])->with(['danger_message_title' => 'ERROR DE VALIDACIÓN']);
        }

        $sidenav = 'users';
        $sidenav_item = 'users_list';
        $title = 'Editar Usuario';
        $title_form = 'Formulario de Edición de Usuario';
        $profiles_data = Profiles::where('deleted', false)->where('show_user', true)->where('status', true)->get();
        $areas_data = Areas::where('deleted', false)->where('status', true)->get();
        return view(
            'admin.users.users_edit',
            compact(
                'title',
                'sidenav',
                'sidenav_item',
                'title_form',
                'form_data',
                'profiles_data',
                'areas_data'
            )
        );
    }

    public function update(Request $request, $register_id)
    {
        $register_data = $this->validateExists($register_id);
        if (empty($register_data)) {
            return redirect(route('users'))->with(['danger_message' => 'Registro No existe o fue Eliminado'])->with(['danger_message_title' => 'ERROR DE VALIDACIÓN']);
        }
        $this->validateData($request);

        $rut = null;
        if (!empty($request->rut)) {
            $this->validate($request, [
                'rut' => 'min:11|max:13',
            ], [
                'rut.min' => 'Rut debe tener Mínimo 11 Caracteres',
                'rut.max' => 'Rut debe tener Máximo 13 Caracteres',
            ]);
            $rut = trim($request->rut);
            $rut = str_replace('.', '', $rut);
            if (!validateRut($rut)) {
                return back()->with(['danger_message' => 'Rut posee formato inválido'])->with(['danger_message_title' => 'ERROR DE VALIDACIÓN'])->withInput();
            }

            $validate_rut = Users::where('rut', $rut)->where('deleted', false)->where('id', '!=', $register_id)->first();
            if (!empty($validate_rut)) {
                return back()->with(['danger_message' => 'Rut ya existe en nuestros registros'])->with(['danger_message_title' => 'ERROR DE VALIDACIÓN'])->withInput();
            }
        }

        $email = strLower($request->email);
        $validate_username = Users::where('username', $email)->where('deleted', false)->where('id', '!=', $register_id)->first();
        $validate_email = Users::where('email', $email)->where('deleted', false)->where('id', '!=', $register_id)->first();
        if (!empty($validate_username) || !empty($validate_email)) {
            return back()->with(['danger_message' => 'Correo electrónico ya existe en nuestros registros'])->with(['danger_message_title' => 'ERROR DE VALIDACIÓN'])->withInput();
        }

        $register_data = $this->createOrUpdate($request, $register_data);
        if ($register_data > 0) {
            return redirect(route('users'))->with(['success_message' => 'Usuario Modificado Correctamente'])->with(['success_message_title' => 'GESTIÓN DE USUARIOS']);
        }
        return back()->with(['danger_message' => 'Ha Ocurrido un error al modificar. Intente Nuevamente'])->with(['danger_message_title' => 'ERROR INTERNO'])->withInput();
    }

    private function validateData(Request $request)
    {

        $this->validate($request, [
            'name' => 'required|min:3|max:100',
            'email' => 'required|email',
            'rut' => 'required',
            'area' => 'required',

        ], [
            'name.required' => 'Nombre completo Requerido',
            'name.min' => 'Nombre completo debe tener Mínimo 3 Caracteres',
            'name.max' => 'Nombre completo debe tener Máximo 100 Caracteres',

            'email.required' => 'Correo electrónico Requerido',
            'email.email' => ' Correo electrónico debe ser un correo válido',
            'rut.required' => 'Rut Requerido',
            'area.required' => 'Área Requerido',

        ]);
    }

    private function validateExists($register_id)
    {
        $error = false;
        if (!is_numeric($register_id)) {
            $error = true;
        }

        $register_data = [];
        if (!$error) {
            $register_data = Users::where('deleted', 0)->where('id', $register_id)->first();
            if (empty($register_data)) {
                $error = true;
            }
        }

        return $register_data;
    }

    private function createOrUpdate(Request $request, $register_data = '')
    {
        try {
            if (empty($register_data)) {
                $register_data = new Users();
                $register_data->username = strLower($request->email);
                $register_data->created_at =  ahoraServidor();
                $register_data->user_created = auth()->user()->id;
                $register_data->password = bcrypt($request->password);
                $register_data->activation_token = $request->activation_token;
                $register_data->validate_password = true;
            }
            $register_data->name =  $request->name;
            $register_data->email = strLower($request->email);
            $register_data->rut = str_replace('.', '', $request->rut);
            $register_data->status = isset($request->status) ? ($request->status == 1 ? true : false) : true;
            $register_data->is_head_of_area = isset($request->is_head_of_area) ? ($request->is_head_of_area == 1 ? true : false) : false;
            $register_data->notification_new_request = isset($request->notification_new_request) ? ($request->notification_new_request == 1 ? true : false) : false;
            $register_data->profile_id = (auth()->user()->id != 1 && $request->profile == 1 ? auth()->user()->profile_id : $request->profile);
            $register_data->area_id = $request->area;
            $register_data->updated_at =  ahoraServidor();
            $register_data->user_updated = auth()->user()->id;
            return $register_data->save() ? $register_data->id : 0;
        } catch (Exception $e) {
            return $e->getMessage();
        }
    }

    public function destroy(Request $request)
    {
        $this->validate($request, [
            'id_modal' => 'required',
        ], [
            'id_modal.required' => 'Id de registro Requerido',
        ]);

        $register_data = $this->validateExists($request->id_modal);
        if (empty($register_data)) {
            return redirect(route('users'))->with(['danger_message' => 'Registro No existe o fue Eliminado'])->with(['danger_message_title' => 'ERROR DE VALIDACIÓN']);
        }
        if ($register_data->id == auth()->user()->id) {
            return back()->with(['danger_message' => 'Lo sentimos. No se puede eliminar su propio usuario.'])->with(['danger_message_title' => 'ERROR DE VALIDACIÓN']);
        }


        $register_data->deleted = true;
        $register_data->deleted_at =  ahoraServidor();
        $register_data->user_deleted = auth()->user()->id;

        if ($register_data->save()) {
            return redirect(route('users'))->with(['success_message' => 'Usuario Eliminado Correctamente'])->with(['success_message_title' => 'GESTIÓN DE USUARIOS']);
        }
        return back()->with(['danger_message' => 'Ha Ocurrido un error al eliminar. Intente Nuevamente'])->with(['danger_message_title' => 'ERROR INTERNO']);
    }

    public function restore_password(Request $request)
    {
        $this->validate($request, [
            'id_modal_restore' => 'required',
        ], [
            'id_modal_restore.required' => 'Id de registro Requerido',
        ]);

        $register_data = $this->validateExists($request->id_modal_restore);
        if (empty($register_data)) {
            return redirect(route('users'))->with(['danger_message' => 'Registro No existe o fue Eliminado'])->with(['danger_message_title' => 'ERROR DE VALIDACIÓN']);
        }
        if ($register_data->id == auth()->user()->id) {
            return back()->with(['danger_message' => 'Lo sentimos. No se puede restablecer la contraseña de tu propio usuario.'])->with(['danger_message_title' => 'ERROR DE VALIDACIÓN']);
        }
        $password = generateSecurePassword();
        $register_data->password = bcrypt($password);;
        $register_data->validate_password = true;
        $register_data->updated_at =  ahoraServidor();
        $register_data->user_updated = auth()->user()->id;
        $register_data->connection_token = null;
        if ($register_data->save()) {
            #RESTABLECIMIENTO DE CONTRASEÑA
            $email = strLower($register_data->email);
            try {
                BrevoMailer::send(
                    $email,
                    'Restablecimiento de Contraseña - Bradford School',
                    'templates_email.email_restore_password_admin',
                    [
                        'data' =>
                        [
                            'user_restore' => auth()->user()->name,
                            'name' => $register_data->name,
                            'password' => $password
                        ]
                    ],
                );
            } catch (Exception $e) {
                return redirect(route('users'))->with(['warning_message' => 'Contraseña Restablecida Correctamente, pero ocurrió un problema al enviar correo.'])->with(['warning_message_title' => 'GESTIÓN DE USUARIOS']);
            }
            return redirect(route('users'))->with(['success_message' => 'Contraseña Restablecida Correctamente'])->with(['success_message_title' => 'GESTIÓN DE USUARIOS']);
        }
        return back()->with(['danger_message' => 'Ha Ocurrido un error al eliminar. Intente Nuevamente'])->with(['danger_message_title' => 'ERROR INTERNO']);
    }

    public function confirm_account(Request $request)
    {
        $this->validate($request, [
            'id_modal_confirm' => 'required',
        ], [
            'id_modal_confirm.required' => 'Id de registro Requerido',
        ]);

        $register_data = $this->validateExists($request->id_modal_confirm);
        if (empty($register_data)) {
            return redirect(route('users'))->with(['danger_message' => 'Registro No existe o fue Eliminado'])->with(['danger_message_title' => 'ERROR DE VALIDACIÓN']);
        }


        if ($register_data->account_confirmed) {
            return back()->with(['warning_message' => 'La cuenta del usuario ya está confirmada'])->with(['warning_message_title' => 'CUENTA YA CONFIRMADA']);
        }

        $register_data->account_confirmed = true;
        $register_data->user_confirmed = auth()->user()->id;
        $register_data->account_confirmed_at = ahoraServidor();
        $register_data->updated_at =  ahoraServidor();
        $register_data->user_updated = auth()->user()->id;
        if ($register_data->save()) {
            #ENVIO DE CONFIRMACIÓN DE CUENTA
            $email = strLower($register_data->email);
            try {
                 BrevoMailer::send(
                    $email,
                    'Cuenta Confirmada - Bradford School',
                    'templates_email.email_confirmation_account',
                        [
                            'data' =>
                            [
                                'name' => $register_data->name,
                            ]
                        ],
                );
            } catch (Exception $e) {
                return back()->with(['warning_message' => 'Su Cuenta ha sido confirmada exitosamente, pero no ha podido enviar el correo.'])->with(['warning_message_title' => 'CUENTA CONFIRMADA'])->withInput();
            }
            return redirect(route('login'))->with(
                [
                    'success_message' => 'Su Cuenta ha sido confirmada exitosamente',
                    'success_message_title' => 'CUENTA CONFIRMADA'
                ]
            );
        }

        if ($register_data->save()) {
            return redirect(route('users'))->with(['success_message' => 'Usuario Eliminado Correctamente'])->with(['success_message_title' => 'GESTIÓN DE USUARIOS']);
        }
        return back()->with(['danger_message' => 'Ha Ocurrido un error al eliminar. Intente Nuevamente'])->with(['danger_message_title' => 'ERROR INTERNO']);
    }
}