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/comfama.sports-crowd.com/app/Http/Controllers/AcademyStateController.php
<?php

namespace App\Http\Controllers;

use App\User;
use App\AcademyParameter;
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)) {
                if ($academyStatePosId) {
                    AcademyStateFlow::where('id_academy_state_pre', $id)->delete();
                    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) {
                $this->updateAcademyStateUser(
                    $academyUser->id,
                    $stateMainAcademy->id,
                    !$stateMainAcademy->confirmation_required,
                    $authUserId
                );

                if ($stateMainAcademy->confirmation_required) {
                    $academyUser->academy_state_id = $stateMainAcademy->id;
                    $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;
                        $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();
            $this->updateAcademyStateUser($academyUser->id, $academyUser->academy_state_id, true,  $authUserId);
            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;
                $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();
            $this->updateAcademyStateUser($academyUser->id, $academyUser->academy_state_id, true, $authUserId);
            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;
                $reviewState = str_contains($nextStateAcademy->app_components, 'Botón') ? 'SIN DATOS' : 'PENDIENTE';
                $enrolledAcademyState = 'Matriculado';
                if ($nextStateAcademy->name == $enrolledAcademyState) {
                    $reviewState = 'CONFIRMADA';
                }
                $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)
    {
        $user = User::select('pns_id')->where('id', $userId)->first();
        if ($user && $user->pns_id) {
            $push = new PushNotificationController();
            $push->sendToUser($message, $user->pns_id, null, null, null, null, 'U');
        }
    }

    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'
            );
        }
    }
}