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/sigedo-dev.allup.com.co/app/Http/Controllers/UserdocumentsController.php
<?php

namespace App\Http\Controllers;

use DB;
use App\User;
use App\Covenant;
use App\Filetype;
use Carbon\Carbon;
use App\Filestatus;
use App\Userdocument;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Storage;
use App\Events\ViewFileUser;
use App\Http\Controllers\NotificationsController;

class UserdocumentsController extends Controller
{
    public $file_extensions = ['JPEG','JPG','PNG','BMP','GIF','TIFF','TIF','PDF','XPS'];
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index($user_id)
    {
        abort_unless(\Gate::allows('userdocument_access'), 403);
        $user = User::select('id','name','last_name')->with('roles')->findOrFail($user_id);
        $documentupload = DB::table('userdocuments AS ud')
                    ->leftJoin('filetypes AS ft', 'ud.filetype_id', '=', 'ft.id')
                    ->leftJoin('filestatuses AS fs', 'ud.filestatus_id', '=', 'fs.id')
                    ->select(
                        'ud.id AS userdocument_id',
                        'user_id',
                        'filetype_id',
                        'observations',
                        'expedition_date',
                        'expiration_date',
                        'review_date',
                        'ft.name AS ft_name',
                        'fs.name AS fs_name',
                        'fs.id AS fs_id',
                    )->where('user_id', $user_id);

        $userdocuments = DB::table('filetype_role AS fr')
                    ->leftJoinSub($documentupload, 'documentupload', function ($join){
                        $join->on('fr.filetype_id', '=', 'documentupload.filetype_id');
                    })
                    ->leftJoin('filetypes AS ft', 'fr.filetype_id', '=', 'ft.id')
                    ->where('fr.role_id', $user->roles[0]->id)
                    ->orderBy('fs_id', 'asc')
                    ->get();
        return view('userdocuments.list', compact('userdocuments','user'));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create($user_id,$filetype_id = 0)
    {
        abort_unless(\Gate::allows('userdocument_create'), 403);
        $user_detail = User::select('id','name','last_name')->with('roles')->findOrFail($user_id);
        $filetypes = Filetype::where('active', true)
                            ->whereHas('roles', function (Builder $query) use($user_detail) {
                                $query->where('role_id', $user_detail->roles[0]->id);
                            })->get();

        $list_documents_upload = Userdocument::where('user_id', $user_id)->with('filetype')->get();
        $filestatuses = Filestatus::where([['id', '!=', 1],['active', true]])->get();
        return view('userdocuments.create', compact('filetypes','user_id','user_detail','filetype_id','filestatuses','list_documents_upload'));
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request, $user_id)
    {
        abort_unless(\Gate::allows('userdocument_create'), 403);
        $exists = Userdocument::where([
                                    ['user_id', $user_id],
                                    ['filetype_id', $request->input('filetype_id')],
                                ])->first();
        if (!$exists) {
            $filestatus_id = $request->input('filestatus_id');
            $observations = $request->input('observations');
            if ($data = Userdocument::create(array_slice($request->all(), 4))) {
                if($request->input('already_exists') == true){
                    $reference = Userdocument::select('filepath')->where('id', $request->input('document_upload_id'))->first();
                    $data->filepath = $reference->filepath;
                    $data->save();
                }
                if($filestatus_id != null){
                    $this->updateUserDocumentStatus($data->id,$filestatus_id,$observations);
                }
                $this->registerLogData(json_encode($request->all()), $data->id, 23, 1, Auth::user()->id);
                return response(array("status" => true, "type" => "success", "title" => "", "message" => __('created_successfully'), "data" => $data->id));
            } else {
                return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('error_creating'), "data" => null));
            }
        }else{
            return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('already_exists_userdocuments')));
        }
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $user_id
     * @return \Illuminate\Http\Response
     */
    public function show($user_id)
    {
        abort_unless(\Gate::allows('userdocument_show'), 403);
        return redirect()->back();
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $user_id
     * @return \Illuminate\Http\Response
     */
    public function edit($user_id,$userdocument_id)
    {
        abort_unless(\Gate::allows('userdocument_edit'), 403);
        $userdocument = Userdocument::with('user')->findOrFail($userdocument_id);
        $user_detail = User::select('id','name','last_name')->with('roles')->findOrFail($user_id);
        $filetypes = Filetype::where('active', true)
                            ->whereHas('roles', function (Builder $query) use($user_detail) {
                                $query->where('role_id', $user_detail->roles[0]->id);
                            })->get();
        $list_documents_upload = Userdocument::where('user_id', $user_id)->with('filetype')->get();
        $filestatuses = Filestatus::where([['id', '!=', 1],['active', true]])->get();
        return view('userdocuments.edit', compact('userdocument','filetypes','filestatuses','list_documents_upload'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $user_id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $user_id, $userdocument_id)
    {
        abort_unless(\Gate::allows('userdocument_edit'), 403);
        $exists = Userdocument::where([
                                    ['id', '!=', $userdocument_id],
                                    ['user_id', $user_id],
                                    ['filetype_id', $request->input('filetype_id')],
                                ])->first();
        if (!$exists) {
            $filestatus_id = $request->input('filestatus_id');
            $observations = $request->input('observations');
            if (Userdocument::where('id', $userdocument_id)->update(array_slice($request->all(), 5))) {
                if($request->input('already_exists') == true){
                    $data = Userdocument::select('id','filepath')->where('id', $userdocument_id)->first();
                    $reference = Userdocument::select('filepath')->where('id', $request->input('document_upload_id'))->first();
                    $data->filepath = $reference->filepath;
                    $data->save();
                }
                if($filestatus_id == null){
                    $this->updateUserDocumentStatus($userdocument_id,2,$observations);
                }else{
                    $this->updateUserDocumentStatus($userdocument_id,$filestatus_id,$observations);
                }
                $this->registerLogData(json_encode(array_slice($request->all(), 3)), $userdocument_id, 23, 3, Auth::user()->id);
                return response(array("status" => true, "type" => "success", "title" => "", "message" => __('updated_successfully'), "data" => null));
            } else {
                return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('error_updating'), "data" => null));
            }
        }else{
            return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('already_exists_userdocuments')));
        }
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $user_id
     * @return \Illuminate\Http\Response
     */
    public function destroy($userdocument_id)
    {
        abort_unless(\Gate::allows('userdocument_destroy'), 403);
        DB::beginTransaction();
        try {
            $userdocument = Userdocument::findOrFail($userdocument_id);
            if ($userdocument->delete()) {
                $this->registerLogData('', $userdocument_id, 23, 4, Auth::user()->id);
                DB::commit();
                return response(array("status" => true, "type" => "success", "title" => "", "message" => __('deleted_successfully'), "data" => null));
            } else {
                DB::rollback();
                return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('error_removing'), "data" => null));
            }
        } catch (\Illuminate\Database\QueryException $e) {
            DB::rollback();
            return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('delete_relation_data'), "data" => null));
        }
    }

    public function updateUserDocumentStatus($userdocument_id,$filestatus_id,$observations)
    {
        try {
            if(\Gate::allows('document_access')){
                Userdocument::where('id', $userdocument_id)->update([
                    'filestatus_id' => $filestatus_id,
                    'observations' => $observations,
                    'user_approve_id' => Auth::user()->id,
                    'review_date' => Carbon::now(),
                ]);
            }else{
                Userdocument::where('id', $userdocument_id)->update(['filestatus_id' => $filestatus_id]);
            }
            return response(array("status" => true, "type" => "success", "title" => "", "message" => __('updated_successfully'), "data" => null));
        } catch (\Throwable $th) {
            return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('error_updating'), "data" => null));
        }
    }

    public function changeStatusApprove($userdocument_id)
    {
        return $this->updateUserDocumentStatus($userdocument_id,3,null);
    }

    public function getCode()
    {
        return time() . rand(1, 9) . rand(1, 5);
    }

    /**
     * @param file documento que se va a cargar
     * @param folder el documento del usuario, para acceso a la carpeta del usuario
     * @param name id para el nombre del archivo
     */
    public function uploadFile(Request $request)
    {
        try {
            $extension = $request->file('fileUser')->getClientOriginalExtension();
            $exists = array_search(strtolower($extension), array_map('strtolower', $this->file_extensions));
            if($exists !== false){
                $user = User::select('document')->where('id', $request->user_id)->first();
                $route = $user->document.'/'.$this->getCode().".".$extension;
                Storage::put(env('S3_DOCUMENTS_PATH').$route, fopen($request->file('fileUser'), 'r+'), 'public');

                Userdocument::where('id', $request->userdocument_id)->update(['filepath' => $route]);
                return response(array("status" => true, "type" => "success", "title" => "", "message" => __('success_upload'), "data" => null));
            }
            Userdocument::where('id', $request->userdocument_id)->delete();
            return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('error_extension'), "data" => null));
        } catch (\Exception $e) {
            return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('error_upload_file'), "data" => $e->getMessage()));
        }
    }

    public function downloadFile($userdocument_id)
    {
        try {
            $document = Userdocument::select('filepath')->where('id', $userdocument_id)->first();
            if($document->filepath != null){
                return Storage::download(env('S3_DOCUMENTS_PATH') . $document->filepath);
            }
            return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('error_file'), "data" => $e->getMessage()));
        } catch (\Exception $e) {
            return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('error_file'), "data" => $e->getMessage()));
        }
    }

    public function viewFile($userdocument_id)
    {
        try {
            $document = Userdocument::select('filepath')->where('id', $userdocument_id)->first();
            if($document->filepath != null){
                return redirect(env('AWS_URL') . 'documents/' . $document->filepath);
            }
            return response(__('error_file'));
        } catch (\Exception $e) {
            return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('error_file'), "data" => $e->getMessage()));
        }
    }

    public function validityDocuments()
    {
        try {
            $documents = Userdocument::where([['expiration_date', '<=', Carbon::now()],['filestatus_id', '!=', '5'],['filestatus_id', '!=', '6']])->get();
            foreach ($documents as $key => $document) {
                $document->filestatus_id = 5;
                $document->update();
            }
            return true;
        } catch (\Throwable $th) {
            return;
        }
    }

    public function covenantsValidity6MonthsBefore()
    {
        try {
            $convenats = Covenant::where('active', true)->get();
            $listConvenants = " ";
            foreach ($convenats as $key => $convenat) {
                $current = explode("-", $convenat->term_end);
                $date1 = Carbon::createMidnightDate($current[0], $current[1], $current[2]);
                $now = Carbon::now();
                $now = $now->toDateString();
                $current2 = explode("-", $now);
                $date1 = Carbon::createMidnightDate($current[0], $current[1], $current[2]);
                $date2 = Carbon::createMidnightDate($current2[0], $current2[1], $current2[2]);
                if($date1->diffInMonths($date2) <= 6){
                    $listConvenants = $listConvenants . $convenat->name. ", ";
                }
            }
            return substr($listConvenants, 0, -2);
        } catch (\Throwable $th) {
            return;
        }
    }

    public function validityCovenants()
    {
        try {
            $covenants = Covenant::where([['term_end', '<=', Carbon::now()],['active', true]])->get();
            foreach ($covenants as $key => $covenant) {
                $covenant->active = false;
                $covenant->update();
            }
            return true;
        } catch (\Throwable $th) {
            return;
        }
    }

    public function validityCommitments()
    {
        try {
            $userdocuments = Userdocument::where([['filestatus_id', 4],['commitment_date', '<=', Carbon::now()]])->get();
            foreach ($userdocuments as $key => $document) {
                $document->filestatus_id = 5;
                $document->update();
            }
            return true;
        } catch (\Throwable $th) {
            return;
        }
    }

    // Get information of expired documents
    public function expiredDocumentsNoti()
    {
        $expired_docs = Userdocument::where('filestatus_id', '5')->with('filetype', 'user')->get();
        foreach($expired_docs as $key => $expired){
            $notification = new NotificationsController();
            $notification->sendNotificationExpired($expired->user->email,$expired->filetype->name);
        }
        return;
    }

    public function sendProcess($process_id)
    {
        switch ($process_id) {
            case '1':
                return $this->validityDocuments();
                break;
            case '2':
                $listConvenants = $this->covenantsValidity6MonthsBefore();
                $noti = new NotificationsController();
                return $noti->sendNotification(1,$listConvenants);
                break;
            case '3':
                return $this->validityCovenants();
                break;
            case '4':
                return $this->validityCommitments();
                break;
            // New proccess
            case '5':
                return $this->expiredDocumentsNoti();
                break;
            default:
                break;
        }
    }
}