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

namespace App\Http\Controllers;

use App\AcademyCategoriesSchedule;
use App\AcademyCategory;
use App\AcademyLocation;
use App\AcademySchedule;
use DataTables;
use App\AcademyTournament;
use App\AcademyTournamentCategory;
use App\AcademyTournamentErp;
use App\AcademyTournamentFee;
use App\AcademyTournamentTag;
use App\Core\CorporateIdentity\Application\CorporateIdentityService;
use App\Parameter;
use App\Services\AcademyLocationsService;
use App\Tag;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;

class AcademyTournamentController extends Controller
{
    private $util;
    private $types = ['', 'TORNEO LOCAL', 'TORNEO NACIONAL', 'TORNEO INTERNACIONAL', 'OTRO'];

    public function __construct()
    {
        $this->util = new UtilController();
    }

    public function index($type_academy = 'children')
    {
        $syncERP = Parameter::select('sync_siesa')->first()->sync_siesa;
        $types = $this->types;

        $corporateIdentity = CorporateIdentityService::get();
        return view('academy.tournaments.list', compact('type_academy', 'syncERP', 'types', 'corporateIdentity'));
    }

    public function indexAdd($type_academy)
    {
        $syncERP = Parameter::select('sync_siesa')->first()->sync_siesa;
        $types = $this->types;
        $multiselectItems = Tag::select('id', 'name')->where('active', true)->get();
        $locations = $this->getLocations();
        $categories = $this->getCategories();
        $schedules = $this->getSchedules();
        $enableFranchises = $this->enableFranchises();
        return view('academy.tournaments.create', compact('type_academy', 'syncERP', 'types', 'multiselectItems', 'locations', 'categories', 'schedules', 'enableFranchises'));
    }

    public function indexEdit($id)
    {
        $object = AcademyTournament::with('academy_tournament_erp', 'academy_tournament_fees')->findOrFail($id);
        $syncERP = Parameter::select('sync_siesa')->first()->sync_siesa;
        $types = $this->types;
        $multiselectItems = Tag::select('id', 'name')->where('active', true)->get();
        $locations = $this->getLocations();
        $categories = $this->getCategories();
        $schedules = $this->getSchedules();
        $enableFranchises = $this->enableFranchises();
        $multiselectValues = AcademyTournamentTag::select('tag_id')->where('academy_tournament_id', $id)->get();
        $academyTournamentLocations = AcademyTournamentCategory::select('academy_categories.academy_location_id')
            ->join('academy_categories', 'academy_categories.id', '=', 'academy_tournament_categories.academy_category_id')
            ->where('academy_tournament_id', $id)
            ->pluck('academy_categories.academy_location_id')
            ->toArray();
        $academyTournamentCategories = AcademyTournamentCategory::select('academy_category_id')
            ->where('academy_tournament_id', $id)
            ->pluck('academy_category_id')
            ->toArray();
        $rawSchedules = AcademyTournamentCategory::select(DB::raw('DISTINCT academy_schedules'))
            ->where('academy_tournament_id', $id)
            ->pluck('academy_schedules')
            ->toArray();

        $academyTournamentSchedules = [];
        foreach ($rawSchedules as $sched) {
            if ($sched === null) continue;
            if (is_array($sched)) {
                $academyTournamentSchedules = array_merge($academyTournamentSchedules, array_filter($sched));
            } else {
                $ids = explode(',', $sched);
                $academyTournamentSchedules = array_merge($academyTournamentSchedules, array_filter($ids));
            }
        }

        //dd($academyTournamentSchedules);
        return view('academy.tournaments.edit', compact('object', 'syncERP', 'types', 'multiselectItems', 'locations', 'categories', 'schedules', 'enableFranchises', 'multiselectValues', 'academyTournamentLocations', 'academyTournamentCategories', 'academyTournamentSchedules'));
    }

    public function tableFilter($types = null, $from_term = null, $to_term = null, $from_date = null, $to_date = null, $type_academy, $categories = null)
    {
        DB::statement("SET sql_mode = ''");
        $obj = AcademyTournament::select(
            'academy_tournaments.id',
            'academy_tournaments.name',
            'academy_tournaments.description',
            'academy_tournaments.type',
            'academy_tournaments.image',
            'price',
            'discount',
            DB::raw('IFNULL(payment_installments,"NO") AS payment_installments'),
            'academy_tournaments.enable_price_payment_installments',
            'academy_tournaments.enable_percentage_payment_installments',
            DB::raw('GROUP_CONCAT(DISTINCT(tags.name)) AS segmentation'),
            'payday_limit',
            'start_date',
            'end_date',
            'academy_tournaments.created_at',
            'academy_tournaments.active',
            DB::raw('GROUP_CONCAT(DISTINCT(CONCAT(academy_categories.name, " (' . config('app.location') . ': ", academy_locations.name, ")"))) AS categories'),
            'academy_tournament_erps.registration_service_item_code',
            'academy_tournament_erps.cost_center',
        )
            ->leftjoin('academy_tournament_tags', 'academy_tournament_tags.academy_tournament_id', '=', 'academy_tournaments.id')
            ->leftjoin('tags', function ($join) {
                $join->on('tags.id', '=', 'academy_tournament_tags.tag_id')->where('tags.active', 1);
            })
            ->leftjoin('academy_tournament_categories', 'academy_tournament_categories.academy_tournament_id', '=', 'academy_tournaments.id')
            ->leftjoin('academy_categories', 'academy_categories.id', '=', 'academy_tournament_categories.academy_category_id')
            ->leftjoin('academy_locations', 'academy_locations.id', '=', 'academy_categories.academy_location_id')
            ->leftjoin('academy_tournament_erps', 'academy_tournament_erps.id', '=', 'academy_tournaments.academy_tournament_erp_id')
            ->where('academy_tournaments.type_academy', $type_academy)
            ->groupBy('academy_tournaments.id');
        DB::statement("SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'");

        $academyLocationsService = new AcademyLocationsService;
        if (!$academyLocationsService->validateAuthorizedLocations()) {
            $authorizedLocations = $academyLocationsService->getAuthorizedLocations();
            $obj->whereIn('academy_categories.academy_location_id', $authorizedLocations);
        }
        $categories = (!empty($categories) && !is_array($categories)) ? explode(',', $categories) : $categories;
        $categories = array_filter($categories, fn($v) => $v !== null && $v !== '' && $v !== 'null');

        if (!empty($categories)) {
            $obj->whereIn('academy_categories.id', $categories);
        }

        if ($types && $types != 'null') {
            $types = explode(',', $types);
            $obj->whereIn('academy_tournaments.type', $types);
        }
        if ($from_term && $from_term != 'null') {
            $obj->whereDate('academy_tournaments.created_at', '>=', $from_term);
        }
        if ($to_term && $to_term != 'null') {
            $obj->whereDate('academy_tournaments.created_at', '<=', $to_term);
        }
        if ($from_date && $from_date != 'null') {
            $obj->whereDate('academy_tournaments.start_date', '>=', $from_date);
        }
        if ($to_date && $to_date != 'null') {
            $obj->whereDate('academy_tournaments.end_date', '<=', $to_date);
        }

        return DataTables::of($obj)
            ->addColumn('actions', function ($obj) {
                return '
                    <i class="fa fa-pencil iconMini" onClick="clickEdit(' . $obj->id . ')" data-id="' . $obj->id . '" title="Editar"></i>
                    <i class="fa fa-trash iconMini" onClick="clickDelete(' . $obj->id . ')" data-id="' . $obj->id . '" title="Eliminar"></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('image', function ($obj) {
                return $obj->image ? $this->util->generateImageColumn($obj->image, $obj->name, $obj->id) : $this->util->generateEmptyImageColumn();
            })
            ->editColumn('payday_limit', function ($obj) {
                return \Carbon\Carbon::parse($obj->payday_limit)->format('Y-m-d h:i:s A');
            })
            ->editColumn('start_date', function ($obj) {
                return \Carbon\Carbon::parse($obj->start_date)->format('Y-m-d h:i:s A');
            })
            ->editColumn('end_date', function ($obj) {
                return \Carbon\Carbon::parse($obj->end_date)->format('Y-m-d h:i:s A');
            })
            ->editColumn('created_at', function ($obj) {
                return \Carbon\Carbon::parse($obj->created_at)->format('Y-m-d h:i:s A');
            })
            ->rawColumns(['actions', 'active', 'image'])
            ->make(true);
    }

    public function create(Request $request)
    {
        try {
            $tournament = AcademyTournament::where('name', $request->input('name'))
                ->where('active', true)
                ->where('type_academy', $request->input('type_academy') ?? 'children')
                ->first();
            if ($tournament) {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.already_exists', ['name' => $request->input('name')]), "data" => null));
            }

            $enableFranchises = $this->enableFranchises();
            if ($enableFranchises && !$request->input('categories')) {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.categories_required'), "data" => null));
            } else if ($request->input('locations') && !$request->input('categories')) {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.categories_required'), "data" => null));
            }

            $tags = $request["tags"];
            $request->request->remove('tags');
            $fees = $request["fees"];
            $request->request->remove('fees');

            $data = $request->except(['generalMultiselect', 'tags', 'categories', 'registration_service_item_code', 'cost_center', 'academy_tournament_fees']);
            if ($model = AcademyTournament::create($data)) {
                if ($tags != null) {
                    foreach ($tags as $tagId) {
                        AcademyTournamentTag::create([
                            'tag_id'                => $tagId,
                            'academy_tournament_id' => $model->id
                        ]);
                    }
                }
                if ($request->input('categories')) {
                    $locations = $request->input('locations') && $request->input('locations')[0] ? $request->input('locations') : null;
                    $categories = $request->input('categories');
                    if ($request->input('categories') && !$request->input('categories')[0]) {
                        $categories = AcademyCategory::select('id')->when($locations, function ($query) use ($locations) {
                            return $query->whereIn('academy_location_id', $locations);
                        })
                            ->where('active', true)
                            ->pluck('id')->toArray();
                    }
                    foreach ($categories as $categoryId) {
                        $schedules = $request->input('schedules') && $request->input('schedules')[0] ? AcademyCategoriesSchedule::where('academy_category_id', $categoryId)->whereIn('academy_schedule_id', $request->input('schedules'))->pluck('academy_schedule_id')->toArray() : null;
                        $data = new AcademyTournamentCategory();
                        $data->academy_tournament_id = $model->id;
                        $data->academy_category_id = $categoryId;
                        $data->academy_schedules = $schedules ? implode(',', $schedules) : null;
                        $data->save();
                    }
                }
                if ($request->input('registration_service_item_code') || $request->input('cost_center')) {
                    $erp = AcademyTournamentErp::updateOrCreate([
                        'registration_service_item_code'    => $request->input('registration_service_item_code'),
                        'cost_center'                       => $request->input('cost_center'),
                    ]);
                    $model->update(['academy_tournament_erp_id' => $erp->id]);
                }
                if ($fees != null) {
                    $enablePrice = $request["enable_price_payment_installments"];
                    $enablePercentage = $request["enable_percentage_payment_installments"];
                    foreach ($fees as $index => $fee) {
                        AcademyTournamentFee::create([
                            'fee'                   => ($index + 1),
                            'price_discount'        => $enablePrice ? $fee : 0,
                            'discount'              => $enablePercentage ? $fee : 0,
                            'academy_tournament_id' => $model->id
                        ]);
                    }
                }
                $this->registerLog(Auth::user()->id, 'Crear torneo 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 {
            $request['id'] = $id;
            $tournament = AcademyTournament::where('academy_tournaments.id', '!=', $id)
                ->where('name', $request->input('name'))
                ->where('active', true)
                ->where('type_academy', $request->input('type_academy') ?? 'children')
                ->first();
            if ($tournament) {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.already_exists', ['name' => $request->input('name')]), "data" => null));
            }

            $enableFranchises = $this->enableFranchises();
            if ($enableFranchises && !$request->input('categories')) {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.categories_required'), "data" => null));
            } else if ($request->input('locations') && !$request->input('categories')) {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.categories_required'), "data" => null));
            }

            $tags = $request["tags"];
            $request->request->remove('tags');
            $fees = $request["fees"];
            $request->request->remove('fees');

            $data = $request->except(['generalMultiselect', 'tags', 'registration_service_item_code', 'cost_center', 'academy_tournament_fees', 'locations', 'categories', 'schedules']);
            if (AcademyTournament::where('id', $id)->update($data)) {
                AcademyTournamentTag::where('academy_tournament_id', $id)->delete();
                if ($tags != null) {
                    foreach ($tags as $tagId) {
                        AcademyTournamentTag::create([
                            'tag_id'                => $tagId,
                            'academy_tournament_id' => $id
                        ]);
                    }
                }
                AcademyTournamentCategory::where('academy_tournament_id', $id)->delete();
                if ($request->input('categories')) {
                    $locations = $request->input('locations') && $request->input('locations')[0] ? $request->input('locations') : null;
                    $categories = $request->input('categories');
                    if ($request->input('categories') && !$request->input('categories')[0]) {
                        $categories = AcademyCategory::select('id')->when($locations, function ($query) use ($locations) {
                            return $query->whereIn('academy_location_id', $locations);
                        })
                            ->where('active', true)
                            ->pluck('id')->toArray();
                    }
                    foreach ($categories as $categoryId) {
                        $schedules = $request->input('schedules') && $request->input('schedules')[0] ? AcademyCategoriesSchedule::where('academy_category_id', $categoryId)->whereIn('academy_schedule_id', $request->input('schedules'))->pluck('academy_schedule_id')->toArray() : null;
                        $data = new AcademyTournamentCategory();
                        $data->academy_tournament_id = $id;
                        $data->academy_category_id = $categoryId;
                        $data->academy_schedules = $schedules ? implode(',', $schedules) : null;
                        $data->save();
                    }
                }
                if ($request->input('registration_service_item_code') || $request->input('cost_center')) {
                    $erp = AcademyTournamentErp::select('academy_tournament_erps.*')->join('academy_tournaments', 'academy_tournaments.academy_tournament_erp_id', '=', 'academy_tournament_erps.id')
                        ->where('academy_tournaments.id', $id)->first();
                    if (!$erp) {
                        $erp = AcademyTournamentErp::create([
                            'registration_service_item_code'    => $request->input('registration_service_item_code'),
                            'cost_center'                       => $request->input('cost_center'),
                        ]);
                        AcademyTournament::where('id', $id)->update(['academy_tournament_erp_id' => $erp->id]);
                    } else {
                        $erp->update([
                            'registration_service_item_code'    => $request->input('registration_service_item_code'),
                            'cost_center'                       => $request->input('cost_center'),
                        ]);
                    }
                }
                AcademyTournamentFee::where('academy_tournament_id', $id)->delete();
                if ($fees != null) {
                    $enablePrice = $request["enable_price_payment_installments"];
                    $enablePercentage = $request["enable_percentage_payment_installments"];
                    foreach ($fees as $index => $fee) {
                        AcademyTournamentFee::create([
                            'fee'                   => ($index + 1),
                            'price_discount'        => $enablePrice ? $fee : 0,
                            'discount'              => $enablePercentage ? $fee : 0,
                            'academy_tournament_id' => $id
                        ]);
                    }
                }
                $this->registerLog(Auth::user()->id, 'Editar torneo academia', json_encode($request->all()), "Update", $this->getModule($request));
                return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.created_successfully'), "data" => $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 delete(Request $request, $id)
    {
        try {
            $tournament = AcademyTournament::find($id);
            AcademyTournamentCategory::where('academy_tournament_id', $id)->delete();
            if (AcademyTournament::where('id', $id)->delete()) {
                $this->registerLog(Auth::user()->id, 'Eliminar torneo academia', json_encode($tournament), "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'];

            $tournament = AcademyTournament::find($id);
            $tournament->active = $state;
            $tournament->update();

            $this->registerLog(Auth::user()->id, 'Activar/Desactivar torneo academia', json_encode($tournament), "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 saveImage(Request $request)
    {
        try {
            $extension = $request->file('image')->getClientOriginalExtension();
            $filenametostore = $request->id . '.' . $extension;

            Storage::disk('s3')->put(config('s3.academy') . '/academy_tournaments/' . $filenametostore, fopen($request->file('image'), 'r+'), 'public');

            $url = config('filesystems.disks.s3.url') . '/academy/academy_tournaments/' . $filenametostore;
            AcademyTournament::where('id', $request->id)->update(['image' => $url]);
            $this->cleanTicketFiles();

            return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.updated_successfully'), "data" => null));
        } catch (\Throwable $th) {
            return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_updating'), "data" => $th->getMessage()));
        }
    }

    private function getLocations()
    {
        $locations = AcademyLocation::select('id', 'name')
            ->where('active', true)
            ->orderBy('name', 'ASC');

        $academyLocationsService = new AcademyLocationsService;
        if (!$academyLocationsService->validateAuthorizedLocations()) {
            $authorizedLocations = $academyLocationsService->getAuthorizedLocations();
            $locations = $locations->whereIn('id', $authorizedLocations);
        }

        return $locations->get();
    }

    private function getCategories()
    {
        $categories = AcademyCategory::select('academy_categories.id', 'academy_categories.name', 'academy_categories.academy_location_id')
            ->with('academy_location')
            ->where('academy_categories.active', true)
            ->whereNotNull('academy_categories.academy_location_id')
            ->orderBy('academy_categories.name', 'ASC');

        $academyLocationsService = new AcademyLocationsService;
        if (!$academyLocationsService->validateAuthorizedLocations()) {
            $authorizedLocations = $academyLocationsService->getAuthorizedLocations();
            $categories = $categories->join('academy_locations', 'academy_locations.id', '=', 'academy_categories.academy_location_id')
                ->whereIn('academy_locations.id', $authorizedLocations);
        }

        return $categories->get();
    }

    private function getSchedules()
    {
        $schedules = AcademySchedule::select('academy_schedules.id', 'academy_schedules.name')
            ->with('academy_categories_schedules')
            ->where('academy_schedules.active', true)
            ->orderBy('academy_schedules.name', 'ASC');

        $academyLocationsService = new AcademyLocationsService;
        if (!$academyLocationsService->validateAuthorizedLocations()) {
            $authorizedLocations = $academyLocationsService->getAuthorizedLocations();
            $schedules = $schedules->join('academy_categories_schedules', 'academy_categories_schedules.academy_schedule_id', '=', 'academy_schedules.id')
                ->join('academy_categories', 'academy_categories.id', '=', 'academy_categories_schedules.academy_category_id')
                ->join('academy_locations', 'academy_locations.id', '=', 'academy_categories.academy_location_id')
                ->whereIn('academy_locations.id', $authorizedLocations);
        }

        $schedules = $schedules->get();

        foreach ($schedules as $schedule) {
            $schedule->categories = $schedule->academy_categories_schedules->pluck('academy_category_id')->toArray();
        }

        return $schedules;
    }

    private function enableFranchises()
    {
        $academyLocationsService = new AcademyLocationsService;
        return $academyLocationsService->enableFranchises() == 'true';
    }
}