HEX
Server: Apache/2.4.41 (Ubuntu)
System: Linux ip-172-31-42-149 5.15.0-1084-aws #91~20.04.1-Ubuntu SMP Fri May 2 07:00:04 UTC 2025 aarch64
User: ubuntu (1000)
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/vhost/disk-apps/teamdemo.sports-crowd.com/app/Http/Controllers/AcademyStateController.php
<?php

namespace App\Http\Controllers;

use App\User;
use App\AcademyParameter;
use App\AcademySchedulesCoach;
use App\AcademyState;
use App\AcademyStateFlow;
use App\AcademyStateUser;
use App\AcademyUser;
use App\Module;
use DataTables;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\PushNotificationController;

class AcademyStateController extends Controller
{
    public function index()
    {
        return view('academy.states.list');
    }

    public function indexAdd()
    {
        $states = AcademyState::select('id', 'name')
            ->where('active', true)
            ->whereNotIn('id', function ($query) {
                $query->select('academy_state_condition_id')->from('academy_states')->whereNotNull('academy_state_condition_id');
            })
            ->get();
        $allStates = AcademyState::all();
        $options = AcademyParameter::select('value')->where('key', 'app_components')->first()->value;
        return view('academy.states.create', compact('states', 'options', 'allStates'));
    }

    public function indexEdit($id)
    {
        $academyState = AcademyState::findOrFail($id);
        $states = AcademyState::select('id', 'name')
            ->where('active', true)
            ->whereNotIn('id', function ($query) {
                $query->select('academy_state_condition_id')->from('academy_states')->whereNotNull('academy_state_condition_id');
            })
            ->orWhere('id', $academyState->academy_state_condition_id)
            ->get();
        $allStates = AcademyState::where('id', '!=', $id)->get();
        $academyStatePos = AcademyStateFlow::where('id_academy_state_pre', $id)->first();
        $options = AcademyParameter::select('value')->where('key', 'app_components')->first()->value;
        return view('academy.states.edit', compact('states', 'academyState', 'options', 'allStates', 'academyStatePos'));
    }

    public function tableFilter()
    {
        $obj = AcademyState::select(
            'academy_states.id',
            'academy_states.name',
            'academy_states.color',
            'academy_states.confirmation_required',
            'academy_states.validate_payments',
            'academy_states.academy_state_condition_id',
            'academyStateFlows.name AS condition_next_state',
            'academy_states.app_components',
            'academy_states.created_at',
            'academy_states.active'
        )
            ->with('academy_state_condition')
            ->leftjoin('academy_state_flows', 'academy_state_flows.id_academy_state_pre', '=', 'academy_states.id')
            ->leftjoin('academy_states AS academyStateFlows', 'academyStateFlows.id', '=', 'academy_state_flows.id_academy_state_pos');

        return DataTables::of($obj)
            ->addColumn('actions', function ($obj) {
                return '
                    <i class="fa fa-pencil iconMini" onClick="clickEdit(' . $obj->id . ')" data-id="' . $obj->id . '" data-toggle="tooltip" data-placement="bottom" title="Editar" style="cursor:pointer;"></i>
                    <i class="fa fa-trash iconMini" onClick="clickDelete(' . $obj->id . ')" data-id="' . $obj->id . '" data-toggle="tooltip" data-placement="bottom" title="Eliminar" style="cursor:pointer;"></i>
                ';
            })
            ->editColumn('active', function ($obj) {
                if ($obj->active == 0) {
                    return '<div class="switch"><label><div class="checkbox checbox-switch switch-success"> <label> ' . __('messages.no') . ' <input type="checkbox" onChange="chk(' . $obj->id . ')" data-id="' . $obj->id . '" id="Checkactive' . $obj->id . '" name="Checkactivo" /> <span></span>' . __('messages.yes') . ' </label></div> </label> </div>';
                } else {
                    return '<div class="switch"><label> <div class="checkbox checbox-switch switch-success"> <label>   ' . __('messages.no') . ' <input type="checkbox" onChange="chk(' . $obj->id . ')" data-id="' . $obj->id . '" id="Checkactive' . $obj->id . '" name="Checkactivo" checked="" />
                        <span></span> ' . __('messages.yes') . ' </label> </div>  </label> </div>';
                }
            })
            ->editColumn('created_at', function ($obj) {
                return \Carbon\Carbon::parse($obj->created_at)->format('Y-m-d h:i:s A');
            })
            ->rawColumns(['actions', 'active'])
            ->make(true);
    }

    public function create(Request $request)
    {
        try {
            if (AcademyState::where([['name', $request->input('name')], ['active', true]])->first()) {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.already_exists', ['name' => $request->input('name')]), "data" => null));
            }
            $academyStatePosId = $request->input('academy_state_pos_id');
            $data = $request->except(['academy_state_pos_id']);
            if ($model = AcademyState::create($data)) {
                if ($academyStatePosId) {
                    AcademyStateFlow::updateOrCreate([
                        'id_academy_state_pre' => $model->id,
                        'id_academy_state_pos' => $academyStatePosId
                    ]);
                }
                $this->registerLog(Auth::user()->id, 'Crear estado academia', json_encode($request->all()), "Create", $this->getModule($request));
                return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.created_successfully'), "data" => $model->id));
            } else {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_creating'), "data" => null));
            }
        } catch (\Exception $e) {
            return response(
                array(
                    "r" => false,
                    "type" => "error",
                    "title" => "Oops...",
                    "m" => __($e->getMessage()),
                    "data" => null
                )
            );
        }
    }

    public function update(Request $request, $id)
    {
        try {
            if (AcademyState::where([['id', '!=', $id], ['name', $request->input('name')], ['active', true]])->first()) {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.already_exists', ['name' => $request->input('name')]), "data" => null));
            }
            $academyStatePosId = $request->input('academy_state_pos_id');
            $data = $request->except(['academy_state_pos_id']);
            if (AcademyState::where('id', $id)->update($data)) {
                AcademyStateFlow::where('id_academy_state_pre', $id)->delete();
                if ($academyStatePosId) {
                    AcademyStateFlow::updateOrCreate([
                        'id_academy_state_pre' => $id,
                        'id_academy_state_pos' => $academyStatePosId
                    ]);
                }
                $this->registerLog(Auth::user()->id, 'Editar estado academia', json_encode($request->all()), "Update", $this->getModule($request));
                return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.updated_successfully'), "data" => $id));
            } else {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_updating'), "data" => null));
            }
        } catch (\Exception $e) {
            return response(
                array(
                    "r" => false,
                    "type" => "error",
                    "title" => "Oops...",
                    "m" => __($e->getMessage()),
                    "data" => null
                )
            );
        }
    }

    public function delete(Request $request, $id)
    {
        try {
            $state = AcademyState::find($id);
            if (AcademyState::where('id', $id)->delete()) {
                $this->registerLog(Auth::user()->id, 'Eliminar estado academia', json_encode($state), "Delete", $this->getModule($request));
                return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.deleted_successfully'), "data" => null));
            } else {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_removing'), "data" => null));
            }
        } catch (\Illuminate\Database\QueryException $e) {
            return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.delete_relation_data'), "data" => null));
        }
    }

    public function activate(Request $request)
    {
        try {
            $id = $request['id'];
            $state = $request['state'];

            $academyState = AcademyState::find($id);
            $academyState->active = $state;
            $academyState->update();

            $this->registerLog(Auth::user()->id, 'Activar/Desactivar estado academia', json_encode($academyState), "Update", $this->getModule($request));
            return array('r' => true, 'd' => null, 'm' => __('messages.updated_successfully'));
        } catch (\Throwable $th) {
            return array('r' => false, 'd' => null, 'm' => __('messages.error_updating'));
        }
    }

    public function confirmReview(Request $request)
    {
        return $this->assignStateAcademy($request->input('id'), $request->input('confirmReview'));
    }

    public function assignStateAcademy($academyUser, $confirmReview = false)
    {
        if (is_string($academyUser) || is_integer($academyUser))
            $academyUser = AcademyUser::with('academy_state')->where('id', intval($academyUser))->first();

        $authUserId = Auth::user() ? Auth::user()->id : $academyUser->user_id;

        if (!$academyUser->academy_state_id) {
            $stateFlowMainAcademy = AcademyStateFlow::whereNull('id_academy_state_pre')->first();
            if ($stateFlowMainAcademy) {
                $stateMainAcademy = AcademyState::where('id', $stateFlowMainAcademy->id_academy_state_pos)->first();
            }
            if ($stateMainAcademy) {
                if ($stateMainAcademy->confirmation_required) {
                    $academyUser->academy_state_id = $stateMainAcademy->id;
                    $this->updateAcademyStateUser(
                        $academyUser->id,
                        $academyUser->academy_state_id,
                        $stateMainAcademy->confirmation_required,
                        $authUserId
                    );
                    $academyUser->review_state = 'PENDIENTE';
                    $academyUser->update();
                } else {
                    $nextStateAcademyFlow = AcademyStateFlow::where('id_academy_state_pre', $stateMainAcademy->id)->first();
                    $nextStateAcademy = AcademyState::where('id', $nextStateAcademyFlow->id_academy_state_pos)->first();

                    if ($nextStateAcademy) {
                        $academyUser->academy_state_id = $nextStateAcademy->id;
                        $this->updateAcademyStateUser(
                            $academyUser->id,
                            $academyUser->academy_state_id,
                            $stateMainAcademy->confirmation_required,
                            $authUserId
                        );
                        $academyUser->review_state = 'SIN DATOS';
                        $academyUser->update();
                        $this->sendNotificationAppStatusChange($academyUser->user_id, $this->replaceWildcardsMessage($this->getParametersMessage('change_status_message'), $stateMainAcademy->name, $academyUser->student_name . ' ' . $academyUser->student_last_name, $nextStateAcademy->name, config('app.name')));
                    }
                }
            }
        } else if ($confirmReview) {
            $nextStateAcademyFlow = AcademyStateFlow::where('id_academy_state_pre', $academyUser->academy_state_id)->first();
            if ($nextStateAcademyFlow)
                $nextStateAcademy = AcademyState::where('id', $nextStateAcademyFlow->id_academy_state_pos)->first();
            else
                $nextStateAcademy = AcademyState::where('academy_state_condition_id', $academyUser->academy_state_id)->first();
            if ($nextStateAcademy) {
                $this->sendNotificationAppStatusChange($academyUser->user_id, $this->replaceWildcardsMessage($this->getParametersMessage('change_status_message'), $academyUser->academy_state->name, $academyUser->student_name . ' ' . $academyUser->student_last_name, $nextStateAcademy->name, config('app.name')));
                $academyUser->academy_state_id = $nextStateAcademy->id;
                $this->updateAcademyStateUser($academyUser->id, $academyUser->academy_state_id, true,  $authUserId);
                $academyUser->review_state = str_contains($nextStateAcademy->app_components, 'Botón') ? 'SIN DATOS' : 'PENDIENTE';
                $academyUser->update();
                $this->validateCreateEnrollmentPayment($academyUser);
                $module = Module::where('route', 'academy')->first();
                $this->registerLog($authUserId, 'Confirmar revisión', json_encode($academyUser), "Update", $module->id);
                return array('r' => true, 'm' => $this->replaceWildcardsMessage($this->getParametersMessage('confirm_revision_message'), $academyUser->academy_state->name, $academyUser->student_name . ' ' . $academyUser->student_last_name, $nextStateAcademy->name, config('app.name')));
            } else {
                $academyUser->review_state = 'CONFIRMADA';
                $academyUser->active = true;
                $academyUser->update();
            }
        } else if (!$academyUser->academy_state->confirmation_required) {
            $nextStateAcademyFlow = AcademyStateFlow::where('id_academy_state_pre', $academyUser->academy_state_id)->first();
            if ($nextStateAcademyFlow)
                $nextStateAcademy = AcademyState::where('id', $nextStateAcademyFlow->id_academy_state_pos)->first();
            else
                $nextStateAcademy = AcademyState::where('academy_state_condition_id', $academyUser->academy_state_id)->first();

            if ($nextStateAcademy) {
                $this->sendNotificationAppStatusChange($academyUser->user_id, $this->replaceWildcardsMessage($this->getParametersMessage('change_status_message'), $academyUser->academy_state->name, $academyUser->student_name . ' ' . $academyUser->student_last_name, $nextStateAcademy->name, config('app.name')));
                $academyUser->academy_state_id = $nextStateAcademy->id;
                $this->updateAcademyStateUser($academyUser->id, $academyUser->academy_state_id, true, $authUserId);
                $reviewState = !$nextStateAcademy->confirmation_required ? 'SIN DATOS' : 'PENDIENTE';
                $enrolledAcademyState = 'Matriculado';
                if ($nextStateAcademy->name == $enrolledAcademyState) {
                    $reviewState = 'CONFIRMADA';
                    $this->createNotificationToConfirmEnrollment($academyUser->id);
                }
                $academyUser->review_state = $reviewState;
                $academyUser->update();
            } else {
                $academyUser->review_state = 'CONFIRMADA';
                $academyUser->active = true;
                $academyUser->update();
            }
        } else {
            $academyUser->review_state = 'PENDIENTE';
            $academyUser->update();
        }
        $this->validateCreateEnrollmentPayment($academyUser);
        return $academyUser;
    }

    public function updateAcademyStateUser($academyUserId, $academyStateId, $confirmation, $approvingUserId = null, $updated_at = null)
    {
        if (!$updated_at)
            $updated_at = \Carbon\Carbon::now();

        return AcademyStateUser::updateOrCreate(
            [
                'academy_user_id'       => $academyUserId,
                'academy_state_id'      => $academyStateId,
                'confirmation_finished' => $confirmation,
                'approving_user_id'     => $approvingUserId,
                'updated_at'            => $updated_at
            ]
        );
    }

    private function sendNotificationAppStatusChange($userId, $message)
    {
        $notificationsController = new NotificationsController();
        $notificationsController->createSystemNotification($message, $userId, null);
    }

    private function getParametersMessage($key)
    {
        return AcademyParameter::where('key', $key)->first()->value;
    }

    private function replaceWildcardsMessage($message, $state, $student, $newState, $appName)
    {
        if ($message) {
            $message = preg_replace('/:state/', $state, $message);
            $message = preg_replace('/:student/', $student, $message);
            $message = preg_replace('/:newState/', $newState, $message);
            $message = preg_replace('/:appName/', $appName, $message);
        }
        return $message;
    }

    private function validateCreateEnrollmentPayment($academyUser)
    {
        // Se guarda el estado de pagar inscripción, para validar si se envia a crear el pago de inscripción desde la confirmación de revisión
        $registrationPaymentState = AcademyState::find(5)->id;
        if ($registrationPaymentState && $academyUser->academy_state_id == $registrationPaymentState) {
            $academyPurchaseController = new AcademyPurchaseController;
            $academyPurchaseController->createEnrollmentPayment(
                $academyUser,
                0,
                'Inscripción'
            );
        }
    }

    public function createNotificationToConfirmEnrollment($academyUserId)
    {

        $academyUser = AcademyUser::with(['academy_state', 'academy_category', 'academy_location', 'academy_schedule'])
            ->where('id', intval($academyUserId))->first();

        $academyScheduleCoach = AcademySchedulesCoach::where('academy_schedule_id', $academyUser->academy_schedule_id)
            ->leftJoin('users', 'users.id', '=', 'academy_schedules_coaches.user_id')
            ->select('users.first_name', 'users.last_name')
            ->first();

        $academyParameterMessage = AcademyParameter::where('key', 'notify_enrollment_confirmation')->first();

        $userPnsId = User::where('id', $academyUser->user_id)->value('pns_id');

        $academyScheduleCoachName = '';
        if ($academyScheduleCoach) {
            $academyScheduleCoachName = $academyScheduleCoach->first_name . ' ' . $academyScheduleCoach->last_name;
        }

        $academyUserName = $academyUser->student_name . ' ' . $academyUser->student_last_name;
        $academyUserCategoryName = $academyUser->academy_category->name;
        $academyLocationName = $academyUser->academy_location->name;
        $academyScheduleName = $academyUser->academy_schedule->name ?? '';

        if ($academyParameterMessage) {
            $message = $academyParameterMessage->value;
            $message = str_replace('"student_name"', $academyUserName, $message);
            $message = str_replace('"category"', $academyUserCategoryName, $message);
            $message = str_replace('"location"', $academyLocationName, $message);
            $message = str_replace('"schedule"', $academyScheduleName, $message);
            $message = str_replace('"coach"', $academyScheduleCoachName, $message);
        } else {
            $message = "🔔Confirmación de matrícula: Estimado padre de familia, se informa que el alumno/a {$academyUserName} se encuentra oficialmente matriculado/a en la academia. Categoría asignada {$academyUserCategoryName}, Sede de entrenamiento {$academyLocationName}, Horario {$academyScheduleName}, entrenador {$academyScheduleCoachName}. ¡Bienvenidos!👏";
        }

        $push = new PushNotificationController;
        $push->sendToUser($message, $userPnsId, null, null, null, null, 'U');
    }

    public function getOrCreate($name, $color, $appComponents, $sectionPath)
    {
        return AcademyState::firstOrCreate(
            ['name' => $name],
            ['name' => $name, 'color' => $color, 'app_components' => $appComponents, 'section_path' => $sectionPath]
        );
    }
}