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/AcademyDocumentController.php
<?php

namespace App\Http\Controllers;

use DataTables;
use App\AcademyDocument;
use App\AcademyDocumentUser;
use App\AcademyLocation;
use App\AcademyUser;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;

class AcademyDocumentController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index($type_academy = 'children')
    {
        return view('academy.document.list')
            ->with('type_academy', $type_academy);
    }


    public function indexAdd($type_academy)
    {
        $locations = AcademyLocation::select('id', 'name')->where('active', 1)->get()->toArray();
        array_unshift($locations, [
            'id'    => null,
            'name'  => 'Todos'
        ]);
        return view('academy.document.create', compact('type_academy', 'locations'));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create(Request $request)
    {
        try {
            if (AcademyDocument::where([['name', $request->input('name')], ['type_academy', $request->input('type_academy')], ['active', true]])->first()) {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.already_exists', ['name' => $request->input('name')]), "data" => null));
            }
            if ($model = AcademyDocument::create($request->except('link'))) {
                $this->registerLog(Auth::user()->id, 'Crear documento academia', json_encode($request->all()), "Create", $this->getModule($request));
                return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.academy_users.tag54'), "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 saveDocument(Request $request)
    {
        try {
            $extension = $request->file('document')->getClientOriginalExtension();
            $filenametostore = 'document' . $request->id . '.' . $extension;

            Storage::disk('s3')->put(config('s3.academy_documents') . $filenametostore, fopen($request->file('document'), 'r+'), 'public');
            $url = config('filesystems.disks.s3.url') . '/academy/academy_documents/' . $filenametostore;

            $document = AcademyDocument::find($request->id);
            $document->link = $url;
            $document->update();

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

    public function tableFilter($type_academy)
    {
        $obj = AcademyDocument::select(
            'id',
            'name',
            'link',
            'required',
            'order',
            'type_person',
            'active',
            'external_form_link',
            'external_form_id',
            'external_form_exclusive',
            'only_attempt',
            'single_attempt_alert',
            'created_at',
            'removable'
        )->where('type_academy', $type_academy);

        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"  style="cursor:pointer;"></i>
            ';
            })
            ->editColumn('created_at', function ($obj) {
                return \Carbon\Carbon::parse($obj->created_at)->format('Y-m-d h:i:s A');
            })
            ->editColumn('required', function ($obj) {
                if ($obj->required == 0) {
                    return '<div class="switch"><label><div class="checkbox checbox-switch switch-success"> <label> ' . __('messages.no') . ' <input type="checkbox" onChange="chkRequired(' . $obj->id . ')" data-id="' . $obj->id . '" id="Checkrequired' . $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="chkRequired(' . $obj->id . ')" data-id="' . $obj->id . '" id="Checkrequired' . $obj->id . '" name="Checkactivo" checked="" />
                    <span></span> ' . __('messages.yes') . ' </label> </div>  </label> </div>';
                }
            })
            ->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('removable', function ($obj) {
                if ($obj->removable == 0) {
                    return '<div class="switch"><label><div class="checkbox checbox-switch switch-success"> <label> ' . __('messages.no') . ' <input type="checkbox" onChange="chkRemovable(' . $obj->id . ')" data-id="' . $obj->id . '" id="chkRemovable' . $obj->id . '" name="chkRemovable" /> <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="chkRemovable(' . $obj->id . ')" data-id="' . $obj->id . '" id="chkRemovable' . $obj->id . '" name="chkRemovable" checked="" />
                    <span></span> ' . __('messages.yes') . ' </label> </div>  </label> </div>';
                }
            })
            ->editColumn('external_form_exclusive', function ($obj) {
                return $obj->external_form_exclusive ? 'SI' : 'NO';
            })
            ->editColumn('only_attempt', function ($obj) {
                return $obj->only_attempt ? 'SI' : 'NO';
            })
            ->rawColumns(['actions', 'required', 'active', 'removable'])
            ->make(true);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        $infoDocument = AcademyDocument::findOrFail($id);
        $locations = AcademyLocation::select('id', 'name')->where('active', 1)->get()->toArray();
        array_unshift($locations, [
            'id'    => null,
            'name'  => 'Todos'
        ]);
        return view('academy.document.edit', compact('infoDocument', 'locations'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        try {
            if (AcademyDocument::where([['id', '!=', $id], ['name', $request->input('name')], ['type_academy', $request->input('type_academy')], ['active', true]])->first()) {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.already_exists', ['name' => $request->input('name')]), "data" => null));
            }
            if (AcademyDocument::where('id', $id)->update($request->all())) {
                $this->registerLog(Auth::user()->id, 'Editar documento academia', json_encode($request->all()), "Create", $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
                )
            );
        }
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function delete(Request $request, $id)
    {
        try {
            $document = AcademyDocument::find($id);
            if (AcademyDocument::where('id', $id)->delete()) {
                if ($document->link) {
                    $this->deleteStorageDocument($document->link);
                }
                $this->registerLog(Auth::user()->id, 'Eliminar documento academia', json_encode($document), "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 required(Request $request)
    {
        try {
            $id = $request['id'];
            $required = $request['state'];
            $document = AcademyDocument::find($id);
            $document->required = $required;
            $document->update();

            $this->registerLog(Auth::user()->id, 'Activar/Desactivar requerido documento academia', json_encode($document), "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 removable(Request $request)
    {
        try {
            $id = $request['id'];
            $document = AcademyDocument::find($id);
            $document->removable = $request['state'];
            $document->update();

            $this->registerLog(Auth::user()->id, 'Activar/Desactivar eliminable documento academia', json_encode($document), "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 activate(Request $request)
    {
        try {
            $id = $request['id'];
            $state = $request['state'];
            $document = AcademyDocument::find($id);
            $document->active = $state;
            $document->update();

            $this->registerLog(Auth::user()->id, 'Activar/Desactivar documento academia', json_encode($document), "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 getDocuments($userId, $type_academy, $externalFormExclusive = null, $showDocumentInProcess = false)
    {
        $userId = intval($userId);
        if ($userId == 0) {
            $userId = Auth::user()->id;
            $academyUser = AcademyUser::select('id')->where('user_id', $userId)->whereNull('deleted_at')->first();
            if ($academyUser)
                $userId = $academyUser->id;
        }
        $academyUser = AcademyUser::with('academy_category')->find($userId);
        $personType = $academyUser->type_person == 'JURIDICAL_PERSON' ? 'JURIDIC_PERSON' : 'NATURAL_PERSON';
        $academyLocationId = $academyUser->academy_category->academy_location_id ?? $academyUser->academy_location_id;

        return AcademyDocument::select(
            'academy_documents.id',
            'academy_documents.name',
            'academy_documents.link as template_link',
            'academy_documents.required',
            $showDocumentInProcess ? DB::raw('IF(academy_document_users.link != "pending", academy_document_users.link, null) as link') : DB::raw('IF(academy_document_users.link != "pending" AND academy_document_users.link NOT LIKE "%zapsign%", academy_document_users.link, null) as link'),
            'academy_documents.external_form_link',
            'academy_documents.external_form_id',
            'academy_documents.only_attempt',
            'academy_documents.single_attempt_alert',
            'academy_documents.enable_autocomplete',
            'academy_documents.enable_guardian_information',
            'academy_documents.removable',
            'academy_documents.enable_view_only',
        )
            ->leftJoin('academy_document_users', function ($join) use ($userId) {
                $join->on('academy_documents.id', '=', 'academy_document_users.academy_document_id');
                $join->where('academy_document_users.academy_user_id', $userId);
            })
            ->where('academy_documents.active', true)
            ->where('academy_documents.type_academy', $type_academy)
            ->when($externalFormExclusive, function ($q) use ($externalFormExclusive) {
                $q->where('academy_documents.external_form_exclusive', $externalFormExclusive == 'yes' ? 1 : 0);
            })
            ->when($userId, function ($q) use ($userId) {
                $q->where(function ($q1) use ($userId) {
                    $q1->where('academy_document_users.academy_user_id', $userId)
                        ->orWhereNull('academy_document_users.academy_user_id');
                });
            })
            ->when($personType, function ($q) use ($personType) {
                $q->where(function ($q1) use ($personType) {
                    $q1->where('academy_documents.type_person', 'ALL')
                        ->orWhere('academy_documents.type_person', $personType);
                });
            })
            ->when($academyLocationId, function ($q) use ($academyLocationId) {
                $q->where(function ($q1) use ($academyLocationId) {
                    $q1->where('academy_documents.academy_location_id', $academyLocationId)
                        ->orWhereNull('academy_documents.academy_location_id');
                });
            })
            ->orderBy('academy_documents.order', 'ASC')
            ->get();
    }

    public function uploadUserAcademyDocument(Request $request)
    {
        $file = $request['file'];
        $academyUserId = intval($request['userId']);
        if ($academyUserId == 0) {
            $userId = Auth::user()->id;
            $academyUser = AcademyUser::select('id')->where('user_id', $userId)->whereNull('deleted_at')->first();
            if ($academyUser)
                $academyUserId = $academyUser->id;
        }
        $academyDocumentId = $request['documentId'];

        $extension = explode('/', mime_content_type($file))[1];
        $filenametostore = 'document' .  $academyUserId . '_' . $academyDocumentId . '.' . $extension;

        list($baseType, $file) = explode(';', $file);
        list(, $file) = explode(',', $file);
        $file = base64_decode($file);

        $this->deleteStorageDocument($filenametostore);
        Storage::disk('s3')->put(config('s3.academy_documents') . $filenametostore, $file, 'public');
        $url = config('filesystems.disks.s3.url') . '/academy/academy_documents/' . $filenametostore;

        $data = [
            'academy_user_id'       => $academyUserId,
            'academy_document_id'   => $academyDocumentId,
            'link'                  => $url,
        ];

        AcademyDocumentUser::updateOrCreate(
            [
                'academy_user_id'       => $academyUserId,
                'academy_document_id'   => $academyDocumentId
            ],
            $data
        );

        return array('r' => true, 'm' => __('messages.academy_document.document_uploaded_successfully'));
    }

    public function uploadPendingUserAcademyDocument(Request $request)
    {
        $academyUserId = intval($request['academyUserId']);
        if ($academyUserId == 0) {
            $userId = Auth::user()->id;
            $academyUser = AcademyUser::select('id')->where('user_id', $userId)->whereNull('deleted_at')->first();
            if ($academyUser)
                $academyUserId = $academyUser->id;
        }
        $academyDocumentId = $request['documentId'];
        if ($academyDocumentUser = AcademyDocumentUser::where('academy_user_id', $academyUserId)->where('academy_document_id', $academyDocumentId)->first()) {
            if ($academyDocumentUser->link != 'pending') {
                if (!str_contains($academyDocumentUser->link, '.pdf')) {
                    return array('r' => true, 'm' => __('messages.academy_document.document_pending_uploaded'));
                } else {
                    return array('r' => false, 'm' => __('messages.academy_document.document_already_uploaded'));
                }
            } else {
                if (Carbon::now()->subMinutes(1)->greaterThan($academyDocumentUser->updated_at)) {
                    return array('r' => true, 'm' => __('messages.academy_document.document_pending_uploaded'), 'updated_at' => $academyDocumentUser->updated_at);
                } else {
                    return array('r' => false, 'm' => __('messages.academy_document.document_pending_uploaded'), 'updated_at' => $academyDocumentUser->updated_at);
                }
            }
        }
        $link = $request['link'];

        $data = [
            'academy_user_id'       => $academyUserId,
            'academy_document_id'   => $academyDocumentId,
            'link'                  => $link,
        ];

        AcademyDocumentUser::updateOrCreate(
            [
                'academy_user_id'       => $academyUserId,
                'academy_document_id'   => $academyDocumentId
            ],
            $data
        );

        return array('r' => true, 'm' => __('messages.academy_document.document_pending_uploaded'));
    }

    public function uploadUserAcademyDocumentExternal($parameters)
    {
        $academyUser = AcademyUser::select('id')->where('identification', $parameters->identification)->whereNull('deleted_at')->first();
        if ($academyUser)
            $academyUserId = $academyUser->id;
        else
            return;

        $academyDocument = AcademyDocument::select('id')->where('external_form_id', 'LIKE', '%' . $parameters->external_form_id . '%')->first();
        if ($academyDocument)
            $academyDocumentId = $academyDocument->id;
        else
            return;

        $extension = $parameters->extension ?? 'pdf';
        $filenametostore = 'document' .  $academyUserId . '_' . $academyDocumentId . '.' . $extension;
        $file = $parameters->file;
        $file = base64_decode($file);

        $this->deleteStorageDocument($filenametostore);
        Storage::disk('s3')->put(config('s3.academy_documents') . $filenametostore, $file, 'public');
        $url = config('filesystems.disks.s3.url') . '/academy/academy_documents/' . $filenametostore;

        $data = [
            'academy_user_id'       => $academyUserId,
            'academy_document_id'   => $academyDocumentId,
            'link'                  => $url,
        ];

        AcademyDocumentUser::updateOrCreate(
            [
                'academy_user_id'       => $academyUserId,
                'academy_document_id'   => $academyDocumentId
            ],
            $data
        );

        return array('r' => true, 'm' => __('messages.academy_document.document_uploaded_successfully'));
    }

    public function deleteDocument(Request $request, $documentId, $academyUserId, $obligatory = true)
    {
        $documentValid = AcademyDocument::find($documentId);
        if (!$documentValid || (!$obligatory && $documentValid->only_attempt)) {
            return array('r' => false, 'm' => __('messages.academy_document.document_delete_error'));
        }

        $document = AcademyDocumentUser::with('academy_user', 'academy_document')
            ->where('academy_user_id', $academyUserId)
            ->where('academy_document_id', $documentId)
            ->first();
        if (!$document) {
            return array('r' => false, 'm' => __('messages.academy_document.document_not_found'));
        }

        // Validacion para el caso de documentos diferentes a la plantilla
        if ($documentValid->link != $document->link) {
            $this->deleteStorageDocument($document->link);
        }
        $document->delete();
        $this->registerLog(Auth::user()->id, 'Eliminar documento deportista academia', json_encode($document), "Delete", $this->getModule($request));
        return array('r' => true, 'm' => __('messages.academy_document.document_deleted_successfully'));
    }

    public function deleteStorageDocument($link)
    {
        $fileName = basename($link);
        if (Storage::disk('s3')->exists(config('s3.academy_documents') . $fileName)) {
            Storage::disk('s3')->delete(config('s3.academy_documents') . $fileName);
        }
    }
}