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

namespace App\Http\Controllers;

use DataTables;
use App\AcademyDiscount;
use App\AcademyLocationDiscount;
use App\AcademyLocationUser;
use App\Services\AcademyLocationsService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;

class AcademyDiscountController extends Controller
{
    private $types = [];
    private $views = [];

    public function __construct()
    {
        // TIPOS DE PAGO QUE APLICA
        $this->types[] = (object) [
            'name' => 'Todos',
            'value' => 'all'
        ];
        $this->types[] = (object) [
            'name' => 'Inscripción',
            'value' => 'enrollment'
        ];
        $this->types[] = (object) [
            'name' => 'Mensualidad',
            'value' => 'monthly'
        ];

        // DONDE SE VA A VISUALIZAR EL DESCUENTO
        $this->views[] = (object) [
            'name' => 'Todos',
            'value' => 'all'
        ];
        $this->views[] = (object) [
            'name' => 'Web',
            'value' => 'web'
        ];
        $this->views[] = (object) [
            'name' => 'App',
            'value' => 'app'
        ];

        // ACADEMIA DONDE SE VA A VISUALIZAR EL DESCUENTO
        $this->views[] = (object) [
            'name' => 'Niños',
            'value' => 'children'
        ];
        $this->views[] = (object) [
            'name' => 'adultos',
            'value' => 'adult'
        ];
    }

    public function index()
    {
        $academyLocationsService = new AcademyLocationsService;
        $showFranchises = $academyLocationsService->showFranchises();
        return view('academy.discounts.list', compact('showFranchises'));
    }

    public function indexAdd()
    {
        $types = $this->types;
        $views = $this->views;
        return view('academy.discounts.create', compact('types', 'views'));
    }

    public function indexEdit($id)
    {
        $object = AcademyDiscount::findOrFail($id);
        $types = $this->types;
        $views = $this->views;
        return view('academy.discounts.edit', compact('object', 'types', 'views'));
    }

    public function tableFilter()
    {
        $obj = AcademyDiscount::select(
            'academy_discounts.id',
            'academy_discounts.name',
            'academy_discounts.discount',
            'academy_discounts.availability',
            'academy_discounts.view_on',
            'academy_discounts.type_academy',
            'academy_discounts.active',
            'academy_discounts.created_at',
            DB::raw('GROUP_CONCAT(DISTINCT(academy_locations.name) SEPARATOR ", ") AS locations')
        )->leftjoin('academy_location_discounts', 'academy_location_discounts.academy_discount_id', '=', 'academy_discounts.id')
            ->leftjoin('academy_locations', 'academy_locations.id', '=', 'academy_location_discounts.academy_location_id');

        $academyLocationsService = new AcademyLocationsService;
        if (!$academyLocationsService->validateAuthorizedLocations()) {
            $authorizedLocations = $academyLocationsService->getAuthorizedLocations();
            $obj = $obj->where(function ($query) use ($authorizedLocations) {
                $query->whereIn('academy_location_discounts.academy_location_id', $authorizedLocations); //->orWhereNull('academy_location_discounts.academy_location_id');
            });
        }

        $obj = $obj->groupBy(
            'academy_discounts.id',
            'academy_discounts.name',
            'academy_discounts.discount',
            'academy_discounts.availability',
            'academy_discounts.view_on',
            'academy_discounts.type_academy',
            'academy_discounts.active',
            'academy_discounts.created_at'
        )->orderBy('academy_discounts.id', 'DESC');

        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('availability', function ($obj) {
                if ($obj->availability) {
                    $object = collect($this->types)->where('value', $obj->availability)->first();
                    if ($object)
                        return $object->name;
                }
                return '';
            })
            ->editColumn('view_on', function ($obj) {
                if ($obj->view_on) {
                    $object = collect($this->views)->where('value', $obj->view_on)->first();
                    if ($object)
                        return $object->name;
                }
                return '';
            })
            ->editColumn('created_at', function ($obj) {
                return \Carbon\Carbon::parse($obj->created_at)->format('Y-m-d h:i:s A');
            })
            ->editColumn('locations', function ($obj) {
                if ($obj->locations) {
                    $locations = explode(',', $obj->locations);
                    $data = '';
                    foreach ($locations as $location) {
                        $data .= ('<li>' . $location . '</li>');
                    }
                    return $data;
                }
                return '';
            })
            ->rawColumns(['actions', 'active', 'locations'])
            ->make(true);
    }

    public function create(Request $request)
    {
        try {
            $academyLocationUserIds = AcademyLocationUser::select('academy_location_id')
                ->where('user_id', Auth::user()->id)
                ->pluck('academy_location_id'); 
            
            $academyDiscountIds = AcademyDiscount::select('id')
                ->where([
                    ['name', $request->input('name')],
                    ['active', true]
                ])
                ->pluck('id'); 
            $existingLocationDiscount = AcademyLocationDiscount::whereIn('academy_location_id', $academyLocationUserIds)
                ->whereIn('academy_discount_id', $academyDiscountIds)
                ->exists(); 

            if ($existingLocationDiscount) {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.already_exists', ['name' => $request->input('name')]), "data" => null));
            }
            
            if ($model = AcademyDiscount::create($request->all())) {
                $academyLocationsService = new AcademyLocationsService;
                if (!$academyLocationsService->validateAuthorizedLocations()) {
                    $authorizedLocations = $academyLocationsService->getAuthorizedLocations();
                    foreach ($authorizedLocations as $location) {
                        $data = new AcademyLocationDiscount;
                        $data->academy_location_id = $location;
                        $data->academy_discount_id = $model->id;
                        $data->save();
                    }
                }

                $this->registerLog(Auth::user()->id, 'Crear descuento 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;

            $academyLocationUserIds = AcademyLocationUser::select('academy_location_id')
                ->where('user_id', Auth::user()->id)
                ->pluck('academy_location_id'); 
            
            $academyDiscountIds = AcademyDiscount::select('id')
                ->where([
                    ['name', $request->input('name')],
                    ['active', true]
                ])
                ->pluck('id'); 

            $existingLocationDiscount = AcademyLocationDiscount::whereIn('academy_location_id', $academyLocationUserIds)
                ->whereIn('academy_discount_id', $academyDiscountIds)
                ->where('academy_discount_id', '!=', $id)
                ->exists(); 

            if ($existingLocationDiscount) {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.already_exists', ['name' => $request->input('name')]), "data" => null));
            }
            if (AcademyDiscount::where('id', $id)->update($request->all())) {
                $academyLocationsService = new AcademyLocationsService;
                if (!$academyLocationsService->validateAuthorizedLocations()) {
                    AcademyLocationDiscount::where('academy_discount_id', $id)->delete();
                    $authorizedLocations = $academyLocationsService->getAuthorizedLocations();
                    foreach ($authorizedLocations as $location) {
                        $data = new AcademyLocationDiscount;
                        $data->academy_location_id = $location;
                        $data->academy_discount_id = $id;
                        $data->save();
                    }
                }

                $this->registerLog(Auth::user()->id, 'Editar descuento 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 {
            $discount = AcademyDiscount::find($id);
            if (AcademyLocationDiscount::where('academy_discount_id', $id)->delete() && AcademyDiscount::where('id', $id)->delete()) {
                $this->registerLog(Auth::user()->id, 'Eliminó descuento academia', json_encode($discount), "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'];

            $discount = AcademyDiscount::find($id);
            $discount->active = $state;
            $discount->update();

            $this->registerLog(Auth::user()->id, 'Activar/Desactivar descuento academia', json_encode($discount), "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 validateStudentDiscounts($academyUserId, $type)
    {
        // Consulta para obtener los descuentos del alumno
        $query = DB::table('academy_discounts as ad')
            ->select(DB::raw('SUM(ad.discount) as discount'))
            ->join('academy_users_discounts as aud', 'aud.academy_discount_id', '=', 'ad.id')
            ->where('ad.active', true)
            ->whereIn('ad.availability', ['all', $type])
            ->where('aud.academy_user_id', $academyUserId)
            ->first();
        $discount = $query->discount ?? 0;
        if ($discount > 100) {
            $discount = 100;
        }
        return $discount;
    }
}