File: /var/www/vhost/disk-apps/qas.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 = str_contains($nextStateAcademy->app_components, 'Botón') ? '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]
);
}
}