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

namespace App\Http\Controllers;

use App\Rol;
use App\Tag;
use App\City;
use App\User;
use DateTime;
use App\Order;
use App\Ticket;
use App\Address;
use App\Core\Customer\CustomerTableService;
use App\Core\Ticket\TicketTypesEnum;
use App\Core\User\Application\UserService;
use App\UserTag;
use App\Discount;
use App\Sucursal;
use App\Parameter;
use Carbon\Carbon;
use App\MatchEvent;
use App\TicketMain;
use App\PreSubscriber;
use App\CourierCompany;
use App\DataPolicy;
use App\DataPolicyClient;
use App\UserInformation;
use App\TicketUserBlock;
use App\DiscountOrderUser;
use App\DocumentType;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
use App\Http\Controllers\AddressController;
use App\Http\Controllers\TicketsController;
use App\Http\Controllers\Exports\FansExport;
use App\Http\Controllers\Exports\ReportClients;
use App\Http\Controllers\MassiveFansController;
use App\Http\Controllers\Api\TicketApiController;
use App\Http\Controllers\Imports\SubscribersImport;
use App\Http\Controllers\Imports\UserSegmentationImport;
use App\Http\Controllers\Imports\UserSegmentationTemplate;
use App\Http\Controllers\Exports\ClientsExport;
use App\Http\Controllers\Imports\ClientImport;
use App\Http\Controllers\Imports\ClientTemplate;
use App\TermClient;
use Exception;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Maatwebsite\Excel\Facades\Excel;
use Yajra\DataTables\Facades\DataTables;
use App\Jobs\Clients\GenerateClientExportJob;
use Illuminate\Support\Facades\Cache;

class UserController extends Controller
{
    private $__ADMINROLES = [];

    private $util;

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

    public function indexClient()
    {
        $multiselectItems = Tag::select('id', 'name')->where('active', true)->get();
        return view('users.clients',  compact('multiselectItems'));
    }

    public function indexDelivery()
    {
        $deliveryMan = User::orderBy('first_name', 'ASC')->where("rol_id", 3)->get();
        $sucursals = Sucursal::where('active', 1)->get();
        return view('users.deliveryMan')
            ->with('deliveryMan', $deliveryMan)
            ->with('sucursals', $sucursals);
    }

    public function indexAdmin()
    {
        return view('users.admins');
    }

    public function indexSubscriber()
    {
        return view('users.preSubscribers');
    }

    public function tableFilterSubscriber()
    {
        $obj = PreSubscriber::with('seat');

        return Datatables::of($obj)
            ->addColumn('actions', function ($obj) {
                return '<i class="fa fa-trash iconMini" onClick="clickDeletePreSubscriber(' . $obj->id . ')" data-id="' . $obj->id . '"  title="Eliminar"></i>';
            })
            ->rawColumns(['actions'])
            ->make(true);
    }

    public function indexAddClient()
    {
        $cities = City::where('active', 1)->orderBy('name', 'ASC')->get();
        $multiselectItems = Tag::select('id', 'name')->where('active', true)->get();
        return view('users.addClients', compact(
            'cities',
            'multiselectItems'
        ));
    }

    public function indexAddDelivery()
    {
        $sucursals = Sucursal::where('active', 1)->orderBy('name', 'ASC')->get();
        $courier = CourierCompany::all();
        return view('users.addDeliveryMan', compact(
            'sucursals',
            'courier'
        ));
    }
    public function indexAddAdmin()
    {
        $sucursals = Sucursal::where('active', 1)->orderBy('name', 'ASC')->get();
        $rols = Rol::select('id', 'name')->whereIn('id', ($this->__ADMINROLES))->orderBy('name', 'ASC')->get();
        $tags = Tag::select('id', 'name')->where('active', true)->get();
        return view('users.addAdmin', compact(
            'sucursals',
            'rols',
            'tags'
        ));
    }

    public function indexEditClient($id)
    {
        $client = User::find($id);
        $directions = Address::where('user_id', $id)->get();
        $cities = City::where('active', 1)->orderBy('name', 'ASC')->get();
        $multiselectItems = Tag::select('id', 'name')->where('active', true)->get();
        $userTags = UserTag::select('tag_id')->where('user_id', $id)->whereNull('academy_user_id')->get();

        return view('users.editClients', compact(
            'client',
            'directions',
            'multiselectItems',
            'userTags',
            'cities'
        ));
    }

    public function indexEditDeliveryMan($id)
    {
        $deliveryM = User::find($id);
        $info = UserInformation::where('user_id', $id)->first();
        $sucursals = Sucursal::where('active', 1)->orderBy('name', 'ASC')->get();
        $courier = CourierCompany::all();
        return view('users.editDeliveryMan')->with('deliveryM', $deliveryM)->with('info', $info)->with('sucursals', $sucursals)->with('courier', $courier);
    }

    public function indexEditAdmin($id)
    {
        $admin = User::find($id);
        $info = UserInformation::where('user_id', $admin->id)->first();
        $sucursals = Sucursal::where('active', 1)->orderBy('name', 'ASC')->get();
        $rols = Rol::select('id', 'name')->orderBy('name', 'ASC')->get();
        $tags = Tag::select('id', 'name')->where('active', true)->get();
        $assignedTags = UserTag::where('user_id', $id)->pluck('tag_id')->toArray();

        return view('users.editAdmin', compact(
            'admin',
            'info',
            'sucursals',
            'rols',
            'tags',
            'assignedTags'
        ));
    }

    public function createUserResponsibleAcademy(Request $request)
    {
        $user = $this->createClient($request, $is_ticket = false, $validateByDocument = false);
        return $user;
    }

    // TODO: check if is_ticket is a semantic variable
    public function createClient(Request $request, $is_ticket = false, $validateByDocument = true)
    {
        $is_ticket = filter_var($is_ticket, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) ?? false;
        $validateByDocument = filter_var($validateByDocument, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) ?? true;

        $password = $request["password"] != null ? $request["password"] : base64_encode(random_bytes(4));
        $data = array(
            'rol'           => $this->__CLIENT_ROL,
            'accountInfo'   => [
                'name'         => $request->input('first_name'),
                'lastName'     => $request->input('last_name'),
                'cellPhone'    => $request->input('phone'),
                'dialCode'     => $request->input('dial_code', null),
                'countryCode'  => $request->input('country_code', null),
                'email'        => $request->input('email'),
                'password'     => $password,
                'document'     => $request->input('document'),
                'document_type_id' => $request->input('document_type_id', null),
            ]
        );

        $userDocument = null;
        if ($request["document"]) {
            $userDocument = User::where("document", $request["document"])
                ->whereNull('deleted_at')
                ->first();
        }

        // Valido si existe un usuario con el mismo documento y no esta eliminado
        if ($userDocument && $validateByDocument) {
            if ($userDocument) {
                $this->addTags($userDocument, $request["tags"]);
                $this->updateCreateAddress($is_ticket, $request, $userDocument->id);
                return array(
                    'r' => true,
                    'm' => trans('messages.controller_client_tag2'),
                    'd' => $userDocument,
                    'oldUser' => true
                );
            }
        }

        $userEmail = User::where("email", "=", $request["email"])
            ->whereNull('deleted_at')
            ->first();

        // Valido si existe un usuario con el mismo email y no esta eliminado.
        if ($userEmail) {
            $this->addTags($userEmail, $request["tags"]);
            $this->updateCreateAddress($is_ticket, $request, $userEmail->id);
            return array(
                'r' => true,
                'm' => trans('messages.controller_client_tag3'),
                'd' => $userEmail,
                'oldUser' => true
            );
        }

        $remoteUser = $this->signupFromAdminSale($data, $validateByDocument);
        if ($remoteUser->status == "document_already_exists" && $userDocument) {
            return array('r' => true, 'm' => 'Usuario existe', 'd' => $userDocument);
        } else if ($remoteUser->status != "success") {
            return array('r' => false);
        }

        $logObj = $remoteUser;
        $user = User::where("email", "=", $request["email"])->first();
        $this->addTags($user, $request["tags"]);
        if ($request['document_type']) {
            $documentType = DocumentType::where('name', 'like', '%' . $request['document_type'] . '%')->first();
            if ($documentType) {
                $user->document_type_id = $documentType->id;
                $user->update();
            }
        }

        if (Auth::user()) {
            $this->registerLog(Auth::user()->id, 'Creó cliente', json_encode($logObj), "Create", $this->getModule($request));
        }

        $this->updateCreateAddress($is_ticket, $request, $remoteUser->user->id);
        if (config('app.notify_create_user') == 'true') {
            $newUsers[] = [
                'user'              => $remoteUser->user,
                'password'          => $password,       // Contraseña sin codificar
            ];
            $userService = new UserService();
            $userService->dispatchNewUserProcesses($newUsers, 'mails.user.new-client');
        }
        return array(
            'r' => true,
            'd' => $remoteUser->user,
            'm' => trans('messages.controller_client_tag1'),
            'status'   => 'success'
        );
    }

    public function signupFromAdminSale(array $request, $validateByDocument = true)
    {
        if ($validateByDocument) {
            $userCopy = User::where("document", $request["accountInfo"]["document"])
                ->whereNotNull('document')
                ->first();

            // TODO: remove duplicated query to users table
            if (isset($userCopy->id)) {
                $user = new User();
                $userN = $user->where('document', $request["accountInfo"]["document"])->first();
                if (isset($userN->id)) {
                    return (object) ['r' => true, 'status' => 'document_already_exists'];
                } else {
                    $userTerms = TermClient::where("user_id", $userCopy->id)->first();
                    return $this->createDataPolicy($userCopy, $userTerms);
                }
            }
        }
        return $this->createUser($request, $request["rol"]);
    }

    public function createUser($request, $rol)
    {
        $user               = new User();
        $user->first_name   = $request["accountInfo"]["name"];
        $user->last_name    = $request["accountInfo"]["lastName"];
        $user->phone        = $request["accountInfo"]["cellPhone"] ?? null;
        $user->email        = $request["accountInfo"]["email"];
        $user->dial_code    = $request["accountInfo"]["dialCode"] ?? null;
        $user->country_code = $request["accountInfo"]["countryCode"] ?? null;
        $user->password     = Hash::make($request["accountInfo"]["password"]);
        if (isset($request["accountInfo"]["document"])) {
            $user->document = $request["accountInfo"]["document"];
        }
        if (isset($request["accountInfo"]["document_type_id"])) {
            $user->document_type_id = $request["accountInfo"]["document_type_id"];
        }
        $user->rol_id = $rol;
        $isSubscriber = null;
        if (isset($isSubscriber))
            $user->is_subscriber = $isSubscriber;
        $user->save();

        $termId = null;

        if ($user->id) {
            $termConditionController = new TermConditionController();
            $bodyTerm   = $termConditionController->getTermsActive();

            if ($bodyTerm) {
                $termId = $bodyTerm->id;
            }

            $userTerms              = new TermClient();
            $userTerms->accepted    = 1;
            $userTerms->term_id     = $termId;
            $userTerms->user_id     = $user->id;
            $userTerms->save();

            $userInformation                        = new UserInformation();
            $userInformation->is_initial            = 1;
            $userInformation->is_tutorial_viewed    = 1;
            $userInformation->is_habeas_data_viewed = 1;
            $userInformation->user_id               = $user->id;

            if (in_array($rol, [$this->__MESSENGER_ROL]) && isset($request["accountInfo"])) {
                $userInformation->plate                 = $request["accountInfo"]["plate"];
                $userInformation->courier_company_id    = $request["accountInfo"]["courier_company_id"];
                $userInformation->sucursal_id           = $request["accountInfo"]["sucursal_id"];
            }

            $userInformation->save();
        }

        return $this->createDataPolicy($user, $userTerms);
    }

    public function createDataPolicy($userCopy, $userTermsCopy)
    {
        $user       = $userCopy;
        $policy     = DataPolicy::where('active', 1)->first();

        if (!$policy) {
            if ($userCopy) {
                return (object) ['r' => true, 'status' => 'document_already_exists'];
            } else {
                return (object) ['r' => false, 'status' => 'error'];
            }
        }

        $policyId   = $policy->id;
        $dataPolicyController = new DataPolicyController();
        $bodyPolicy   = $dataPolicyController->getActivePolicy();
        if ($bodyPolicy && isset($bodyPolicy->activePolicy)) {
            $policyId = $bodyPolicy->activePolicy->id;
        }
        $dataPolicy                 = new DataPolicyClient();
        $dataPolicy->accepted       = $userTermsCopy->accepted;
        $dataPolicy->data_policy_id = $policyId;
        $dataPolicy->user_id        = $user->id;
        $dataPolicy->created_at     = $userTermsCopy->created_at;
        $dataPolicy->updated_at     = $userTermsCopy->updated_at;
        $dataPolicy->save();

        return (object) ['r' => true, 'status' => 'success', 'user' => $user, 'm' => trans('messages.controller_client_tag1')];
    }

    private function updateCreateAddress($createUpdate, $request, $userId)
    {
        if (!$createUpdate && $request["direction"]) {
            Address::updateOrCreate(['user_id' => $userId, 'direction' => $request["direction"]], [
                'direction' => $request['direction'],
                'district' => $request["district"],
                'user_id' => $userId,
                'active' => true,
                'indications' => $request["indications"],
                'lat' => $request["lat"],
                'long' => $request["long"],
                'city_id' => $request["city_id"]
            ]);
        }
    }

    public function addTags($user, $tagsIdArray)
    {
        if (!$user) {
            return;
        } else if (!$tagsIdArray) {
            $tagsIdArray = [];
        }

        UserTag::where('user_id', $user->id)->whereNull('academy_user_id')->delete();
        foreach ($tagsIdArray as $tagId) {
            UserTag::updateOrCreate(
                ['tag_id' => $tagId, 'user_id' => $user->id, 'academy_user_id' => null],
                ['tag_id' => $tagId, 'user_id' => $user->id, 'academy_user_id' => null]
            );
        }
    }

    public function createDeliveryMan(Request $request)
    {
        $parameters = Parameter::select('id', 'db_city', 'db_name')->first();
        $data = array(
            'rol'           => $this->__MESSENGER_ROL,
            'accountInfo'   => array(
                'name'                  => $request["first_name"],
                'lastName'              => $request["last_name"],
                'cellPhone'             => $request["phone"],
                'email'                 => $request["email"],
                'password'              => $request["password"],
                'document'              => $request["document"],
                'courier_company_id'    => $request["courier_company_id"],
                'sucursal_id'           => $request["sucursal_id"],
                'plate'                 => $request["plate"],
            ),
        );

        $r = User::where("document", $request["document"])->first();
        $email = User::where("email", "=", $request["email"])->withTrashed()->first();

        // Valido si existe un usaurio con el mismo documento
        if ($r) {
            return array('r' => false, 'm' => trans('messages.controller_deliveryMan_tag2'));
        }

        // Valido si existe un usuario con el mismo email.
        if ($email) {
            if ($email->email == $request["email"]) {
                if ($email->deleted_at != null) {
                    return array('r' => true, 'm' => trans('messages.controller_deliveryMan_tag7'), 'id' => $email->id);
                } else {
                    return array('r' => false, 'm' => trans('messages.controller_deliveryMan_tag3'));
                }
            }
        }

        $remoteUser = $this->signupFromAdminSale($data);

        $logObj = $remoteUser;
        $this->registerLog(Auth::user()->id, 'Creó mensajero', json_encode($logObj), "Create", $this->getModule($request));

        if ($remoteUser->status != "success") {
            return array('r' => false);
        }

        return array('r' => true, 'm' => trans('messages.controller_deliveryMan_tag1'), 'd' => $remoteUser->user->id);
    }

    public function createAdmin(Request $request)
    {
        $parameters = Parameter::select('id', 'db_city', 'db_name')->first();
        $data = array(
            'rol'           => $request["rol_id"], // Rol para cliente
            'accountInfo'   => array(
                'name'                  => $request["first_name"],
                'lastName'              => $request["last_name"],
                'cellPhone'             => $request["phone"],
                'email'                 => $request["email"],
                'password'              => $request["password"],
                'document'              => $request["document"],
                'courier_company_id'    => null,
                'sucursal_id'           => $request["sucursal_id"],
                'plate'                 => null,
            ),
        );

        $r = User::where("document", $request["document"])->first();
        $email = User::where("email", "=", $request["email"])->first();

        // Valido si existe un usaurio con el mismo documento
        if ($r) {
            return array('r' => false, 'm' => trans('messages.controller_admin_tag2'));
        }

        // Valido si existe un usuario con el mismo email.
        if ($email) {
            if ($email->email == $request["email"]) {
                return array('r' => false, 'm' => trans('messages.controller_admin_tag3'));
            }
        }

        $remoteUser = $this->signupFromAdminSale($data);

        if ($remoteUser->status != "success") {
            return array('r' => false);
        }

        $this->addTags($remoteUser->user, $request["tags"]);

        $logObj = $remoteUser;
        $this->registerLog(Auth::user()->id, 'Creó admin', json_encode($logObj), "Create", $this->getModule($request));

        return array('r' => true, 'm' => trans('messages.controller_admin_tag1'));
    }

    public function updateClient(Request $request)
    {
        $user               = User::find($request["id"]);
        $user->first_name   = $request["first_name"];
        $user->last_name    = $request["last_name"];
        $user->phone        = $request["phone"];
        $user->email        = $request["email"];
        if (isset($request["password"]) && !empty($request["password"])) {
            $user->password = Hash::make($request["password"]);
        }
        $user->document     = $request["document"];
        $user->rol_id       = 4;
        $user->is_subscriber = $request["is_subscriber"];
        $user->update();

        $idAddress = $request["direction_used"];
        // add direction
        if ($request["direction"] != null) {
            $address = new AddressController;
            $idAddress = $address->create("", $request["direction"], $request["district"], $request["indications"], $request["lat"], $request["long"], $request["city_id"], $user->id);
        }
        $directions = Address::where('user_id', $user->id)->get();
        foreach ($directions as $direction) {
            if ($direction->id == $idAddress) {
                $direction->last_used = 1;
            } else {
                $direction->last_used = 0;
            }
            $direction->update();
        }

        $this->addTags($user, $request["tags"]);
        $this->registerLog(Auth::user()->id, 'Se modifico la información del cliente', json_encode($user), "update", $this->getModule($request));
        return array('r' => true, 'm' => trans('messages.controller_client_tag4'));
    }

    public function updateDeliveryMan(Request $request)
    {
        $user = User::find($request["id"]);
        $user->first_name = $request["first_name"];
        $user->document = $request["document"];
        $user->last_name = $request["last_name"];
        $user->phone = $request["phone"];
        $user->email = $request["email"];

        if (!empty($request["password"])) {
            $user->password = Hash::make($request["password"]);
        }

        $user->update();
        $this->updateInfoDelivery($request["plate"], $request["id"], $request["courier_company_id"], $request["sucursal_id"]);

        $this->registerLog(Auth::user()->id, 'Se modifico la información del mensajero', json_encode($user), "update", $this->getModule($request));
        return array('r' => true, 'm' => trans('messages.controller_deliveryMan_tag4'));
    }

    public function updateAdmin(Request $request)
    {
        $user = User::find($request["id"]);
        $user->first_name = $request["first_name"];
        $user->document = $request["document"];
        $user->last_name = $request["last_name"];
        $user->phone = $request["phone"];
        $user->email = $request["email"];
        $user->rol_id = $request["rol_id"];
        if (!empty($request["password"])) {
            $user->password = Hash::make($request["password"]);
        }

        $user->update();

        $info = UserInformation::where('user_id', $request["id"])->first();
        $info->sucursal_id = $request["sucursal_id"];
        $info->update();

        $this->addTags($user, $request["tags"]);
        $this->registerLog(Auth::user()->id, 'Se modifico la información del administrador', json_encode($user), "update", $this->getModule($request));
        return array('r' => true, 'm' => trans('messages.controller_admin_tag4'));
    }

    public function updateInfoDelivery($plate, $id, $courier, $sucursal)
    {
        $info = UserInformation::where('user_id', $id)->first();
        $info->plate = $plate;
        $info->courier_company_id = $courier;
        $info->sucursal_id = $sucursal;
        $info->update();
        return true;
    }

    public function getClient(Request $request)
    {
        $id = $request["id"];
        $client = User::find($id);

        return $client->toArray();
    }

    public function getDeliveryMan(Request $request)
    {
        $id = $request["id"];
        $u = User::find($id);
        $i = UserInformation::where('user_id', $u->id)->first();
        $i->courier_company_id = $i->company->name;
        if ($i->photo != null) {
            $img = config('filesystems.disks.s3.url') . "/deliveryman/" . $i->photo;
        } else {
            $img = 'img/user.png';
        }

        return array('r' => true, 'u' => $u->toArray(), 'i' => $i->toArray(), 'img' => $img);
    }

    public function getAdmin(Request $request)
    {
        $id = $request["id"];
        $u = User::find($id);
        $i = UserInformation::where('user_id', $u->id)->first();
        $i->sucursal_id = $i->sucursal->name;
        return array('r' => true, 'u' => $u->toArray(), 'i' => $i->toArray());
    }

    public function activateClient(Request $request)
    {
        $id = $request['id'];
        $state = $request['state'];

        $user = User::find($id);
        $logObj = $user;
        $user->active = $state;
        $user->update();
        // Log
        $this->registerLog(Auth::user()->id, 'Actualizó campo active de cliente', json_encode($logObj), "Update", $this->getModule($request));
        return array('r' => true, 'm' => trans('messages.controller_client_tag4'));
    }

    public function activateDeliveryMan(Request $request)
    {
        $id = $request['id'];
        $state = $request['state'];

        $user = User::find($id);
        $logObj = $user;
        $user->active = $state;
        $user->update();
        // Log
        $this->registerLog(
            Auth::user()->id,
            'Actualizó campo active de mensajero',
            json_encode($logObj),
            "Update",
            6
        );
        return array('r' => true, 'm' => trans('messages.controller_deliveryMan_tag4'));
    }

    public function onlineDeliveryMan(Request $request)
    {
        $id = $request['id'];
        $state = $request['state'];

        $user = User::find($id);
        $logObj = $user;
        $user->online = $state;
        $user->update();
        // Log
        $this->registerLog(
            Auth::user()->id,
            'Actualizó campo online de mensajero',
            json_encode($logObj),
            "Update",
            6
        );
        return array('r' => true, 'm' => trans('messages.controller_deliveryMan_tag4'));
    }

    public function activateAdmin(Request $request)
    {
        $id = $request['id'];
        $state = $request['state'];

        $user = User::find($id);
        $logObj = $user;
        $user->active = $state;
        $user->update();
        // Log
        $this->registerLog(
            Auth::user()->id,
            'Actualizó campo active de administrador',
            json_encode($logObj),
            "Update",
            6
        );
        return array('r' => true, 'm' => trans('messages.controller_admin_tag4'));
    }

    public function multipleSession(Request $request)
    {
        $id = $request['id'];
        $state = $request['state'];

        $user = User::find($id);
        $logObj = $user;
        $user->multiple_session = $state;
        $user->update();
        // Log
        $this->registerLog(
            Auth::user()->id,
            'Actualizó campo sesion multiple de mensajero',
            json_encode($logObj),
            "Update",
            6
        );
        return array('r' => true, 'm' => trans('messages.controller_deliveryMan_tag5'));
    }

    public function deleteDeliveryMan(Request $request)
    {
        $userId = $request['id'];
        $logObj = User::find($userId);
        $this->deleteUser($userId);

        // Log
        $this->registerLog(Auth::user()->id, 'Elimino mensajero', json_encode($logObj), "Delete", $this->getModule($request));
        return array('r' => true, 'm' => trans('messages.controller_deliveryMan_tag6'));
    }

    public function deleteAdmin(Request $request)
    {
        $userId = $request['id'];
        $logObj = User::find($userId);
        $this->deleteUser($userId);

        // Log
        $this->registerLog(Auth::user()->id, 'Elimino administrador', json_encode($logObj), "Delete", $this->getModule($request));
        return array('r' => true, 'm' => trans('messages.controller_admin_tag6'));
    }

    public function tableFilterClient(Request $request, CustomerTableService $customerTableService)
    {
        $count = $customerTableService->getTableCount($request);
        $obj = $customerTableService->getTableQuery($request);
        $dataTable  = DataTables::of($obj)->setTotalRecords($count);
        $this->tableFilterClientCustomColumns($dataTable);

        $response = $dataTable->make(true);
        $data = $response->getData();
        $data = json_decode(json_encode($data), true);
        $queries = DB::getQueryLog();
        $newQueries = [];
        foreach ($queries as $query) {
            if (!is_string($query['query'])) {
                $query['query'] = $query['query']->getValue();
            }

            if (str_contains($query['query'], 'select') && str_contains($query['query'], 'group by')) {
                $newQueries[] = $query;
            }
        }

        $data['queries'] = $newQueries;
        return $data;
    }

    public function tableFilterDeliveryMan()
    {
        $obj = $obj = DB::table('users')
            ->select('users.id', 'users.first_name', 'users.last_name', 'users.document', 'users.phone', 'users.active', 'users.multiple_session', 'users.online', 'users.created_at')
            ->where('users.rol_id', 3)->whereNull('users.deleted_at');

        return Datatables::of($obj)
            ->addColumn('actions', function ($obj) {
                return '<i class="fa fa-eye iconMini" onClick="clickInfoDeliveryMan(' . $obj->id . ')" name="btnEditar" data-id="' . $obj->id . '"  title="Información"></i>
                    <i class="fa fa-pencil iconMini" onClick="clickEditDeliveryMan(' . $obj->id . ')" data-id="' . $obj->id . '"  title="Editar"></i>
                    <i class="fa fa-trash iconMini" onClick="clickDeleteDeliveryMan(' . $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> No <input type="checkbox" onChange="chkDeliveryMan(' . $obj->id . ')" data-id="' . $obj->id . '" id="Checkactive' . $obj->id . '" name="Checkactivo" /> <span></span>Si </label></div> </label> </div>';
                } else {
                    return '<div class="switch"><label> <div class="checkbox checbox-switch switch-success"> <label>   No <input type="checkbox" onChange="chkDeliveryMan(' . $obj->id . ')" data-id="' . $obj->id . '" id="Checkactive' . $obj->id . '" name="Checkactivo" checked="" />
                        <span></span> Si </label> </div>  </label> </div>';
                }
            })
            ->editColumn('online', function ($obj) {
                if ($obj->active == 0) {
                    return '<div class="switch"><label><div class="checkbox checbox-switch switch-success"> <label> No <input type="checkbox" onChange="chkOnlineDelivery(' . $obj->id . ')" data-id="' . $obj->id . '" id="Checkonline' . $obj->id . '" name="Checkonline" /> <span></span>Si </label></div> </label> </div>';
                } else {
                    return '<div class="switch"><label> <div class="checkbox checbox-switch switch-success"> <label>   No <input type="checkbox" onChange="chkOnlineDelivery(' . $obj->id . ')" data-id="' . $obj->id . '" id="Checkonline' . $obj->id . '" name="Checkonline" checked="" />
                        <span></span> Si </label> </div>  </label> </div>';
                }
            })
            ->editColumn('multiple_session', function ($obj) {
                if ($obj->multiple_session == 0) {
                    return '<div class="switch"><label><div class="checkbox checbox-switch switch-success"> <label> No <input type="checkbox" onChange="chkMSDeliveryMan(' . $obj->id . ')" data-id="' . $obj->id . '" id="CheckMS' . $obj->id . '"  /> <span></span>Si </label></div> </label> </div>';
                } else {
                    return '<div class="switch"><label> <div class="checkbox checbox-switch switch-success"> <label>   No <input type="checkbox" onChange="chkMSDeliveryMan(' . $obj->id . ')" data-id="' . $obj->id . '" id="CheckMS' . $obj->id . '"  checked="" />
                        <span></span> Si </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(['active', 'actions', 'multiple_session', 'online'])
            ->make(true);
    }

    public function tableFilterAdmins()
    {
        DB::statement("SET sql_mode = ''");
        $obj = $obj = DB::table('users')
            ->select('users.id', 'users.first_name', 'users.last_name', 'users.email', 'users.active', 'rols.name as rol', DB::raw('GROUP_CONCAT(DISTINCT(tags.name)) AS segmentation'), 'users.created_at')
            ->join('rols', 'rols.id', '=', 'users.rol_id')
            ->leftjoin('user_tags', 'users.id', '=', 'user_tags.user_id')
            ->leftjoin('tags', function ($join) {
                $join->on('tags.id', '=', 'user_tags.tag_id')->where('tags.active', 1);
            })
            ->whereIn('rols.id', ($this->__ADMINROLES))
            ->whereNull('users.deleted_at')
            ->groupBy('users.id');
        DB::statement("SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'");

        return Datatables::of($obj)
            ->addColumn('actions', function ($obj) {
                return '<i class="fa fa-eye iconMini" onClick="clickInfoAdmins(' . $obj->id . ')" name="btnEditar" data-id="' . $obj->id . '"  title="Información"></i>
                    <i class="fa fa-pencil iconMini" onClick="clickEditAdmins(' . $obj->id . ')" data-id="' . $obj->id . '"  title="Editar"></i>
                    <i class="fa fa-trash iconMini" onClick="clickDeleteAdmins(' . $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> No <input type="checkbox" onChange="chkAdmins(' . $obj->id . ')" data-id="' . $obj->id . '" id="Checkactive' . $obj->id . '" name="Checkactivo" /> <span></span>Si </label></div> </label> </div>';
                } else {
                    return '<div class="switch"><label> <div class="checkbox checbox-switch switch-success"> <label>   No <input type="checkbox" onChange="chkAdmins(' . $obj->id . ')" data-id="' . $obj->id . '" id="Checkactive' . $obj->id . '" name="Checkactivo" checked="" />
                        <span></span> Si </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(['active', 'actions'])
            ->make(true);
    }

    public function getDirections($user_id)
    {
        $address = Address::where('user_id', $user_id)->get();
        return $address->toArray();
    }

    public function autocomplete(Request $request)
    {
        $term = $request->input('term');
        $results = array();

        $queries = DB::table('users')
            ->where('document', 'LIKE', '%' . $term . '%')
            ->where('rol_id', 4)
            ->take(5)->get();

        $parameters = Parameter::first();
        $current = new DateTime();
        $discounts = Discount::where('when_start', '<=', $current)->where('when_finish', '>=', $current)->where('active', 1)->get(); // se traen los descuentos que aun esten vigentes

        foreach ($queries as $query) {
            $client = User::find($query->id);
            //cliente referido
            $userInfo = UserInformation::where('user_id', $client->id)->select('referred_code', 'referred_finish_date')->first();
            $clientRefer = UserInformation::where('referred_user_code', $userInfo->referred_code)->first();
            $lastOrders = Order::where("client_id", $client->id)->with('orderProducts')->take(3)->get();
            if ($clientRefer) { // si alguien tiene el codigo del cliente se verifica que este tenga pedidos
                $orders = Order::where("client_id", $clientRefer->user_id)->first();
                if ($orders) { // si tiene pedidos se envia el id del referido para que luego de aplicar el desccuento se borre lo que este en el campo referred_user_code
                    $idRefered = $clientRefer->user_id;
                } else {
                    $idRefered = null;
                }
            } else {
                $idRefered = null;
            }

            $results[] = [
                'id' => $query->id,
                'value' => $query->document,
                'phone' => $query->phone,
                'directions' => $client->addresses,
                'document' => $query->document,
                'first_name' => $query->first_name,
                'last_name' => $query->last_name,
                'email' => $query->email,
                'created_at' => $query->created_at,
                'referred_user_code' => $userInfo->referred_user_code,
                'referred_finish_date' => $userInfo->referred_finish_date,
                'is_register_discount_active' => $parameters->is_register_discount_active,
                'register_discount_delivery' => $parameters->register_discount_delivery,
                'days_register_discount_delivery' => $parameters->days_register_discount_delivery,
                'clientRefer' => $idRefered,
                'discounts' => json_encode($discounts),
                'lastOrders' => $lastOrders,

            ];
        }
        return json_encode($results);
    }

    public function getAllDeliveryMan()
    {
        $deliveryMan = User::where('online', 1)->where('active', 1)->where('rol_id', 3)->get();
        return array('r' => true, 'm' => $deliveryMan);
    }

    public function recoverAccount(Request $request)
    {

        $user = User::where('id', $request['id'])->withTrashed()->first();
        $user->restore();

        return array('r' => true, 'm' => trans('messages.controller_deliveryMan_tag8'), 'id' => $request["id"]);
    }

    public function getClientDocument($document)
    {

        if (isset($document)) {

            $client = User::where('document', $document)->first();

            $direction = '';
            $district = '';
            $indications = '';
            $idDir = '';
            $lat = '';
            $long = '';

            if ($client) {

                if (count($client->addresses) > 0) {
                    $arrayDir = $client->addresses;

                    foreach ($arrayDir as $key => $dir) {
                        if ($dir->last_used == 1) {
                            $direction = $dir->direction;
                            $district = $dir->district;
                            $indications = $dir->indications;
                            $idDir = $dir->id;
                            $lat = $dir->lat;
                            $long = $dir->long;
                        }
                    }
                }

                return array(
                    'r' => true,
                    'client' => $client->toArray(),
                    'direction' => $direction,
                    'district' => $district,
                    'indications' => $indications,
                    'idDir' => $idDir,
                    'lat' => $lat,
                    'long' => $long,
                    'addresses' => $arrayDir->toArray()
                );
            } else {

                return array('respuesta' => false);
            }
        } else {

            return array('respuesta' => false);
        }
    }

    public function getAlbumOfYearUser($_id)
    {
        $client = User::where('id', $_id)->first();
        $yearAlbumNow = Carbon::now();
        $yearAlbum = $yearAlbumNow->format('d-m-Y');
        $arrYearAlbum['fecha_actual'] = $yearAlbum;
        $arrClient = array($client);

        $resultado = array_merge($arrClient, $arrYearAlbum);
        return response()->json($resultado);
    }

    public function autocompleteMail(Request $request)
    {
        $term = $request->input('term');
        $results = array();

        $queries = DB::table('users')
            ->where([['email', 'LIKE', '%' . $term . '%'], ['rol_id', 4]])
            ->whereNull('deleted_at')
            ->take(5)->get();
        $parameters = Parameter::first();
        $current = new DateTime();
        $discounts = Discount::where('when_start', '<=', $current)->where('when_finish', '>=', $current)->where('active', 1)->get(); // se traen los descuentos que aun esten vigentes
        foreach ($queries as $query) {
            $client = User::find($query->id);
            //cliente referido
            $userInfo = UserInformation::where('user_id', $client->id)->select('referred_code', 'referred_finish_date')->first();
            $clientRefer = UserInformation::where('referred_user_code', $userInfo->referred_code)->first();

            if ($clientRefer) { // si alguien tiene el codigo del cliente se verifica que este tenga pedidos
                $orders = Order::where("client_id", $clientRefer->user_id)->first();
                if ($orders) { // si tiene pedidos se envia el id del referido para que luego de aplicar el desccuento se borre lo que este en el campo referred_user_code
                    $idRefered = $clientRefer->user_id;
                } else {
                    $idRefered = null;
                }
            } else {
                $idRefered = null;
            }

            $results[] = [
                'id' => $query->id,
                'value' => $query->email,
                'phone' => $query->phone,
                'pns_id' => $query->pns_id,
                'directions' => $client->addresses,
                'document' => $query->document,
                'first_name' => $query->first_name,
                'last_name' => $query->last_name,
                'created_at' => $query->created_at,
                'referred_user_code' => $userInfo->referred_user_code,
                'referred_finish_date' => $userInfo->referred_finish_date,
                'is_register_discount_active' => $parameters->is_register_discount_active,
                'register_discount_delivery' => $parameters->register_discount_delivery,
                'days_register_discount_delivery' => $parameters->days_register_discount_delivery,
                'clientRefer' => $idRefered,
                'discounts' => json_encode($discounts),
            ];
        }
        return json_encode($results);
    }

    public function saveImage(Request $request)
    {
        $id = $request->id;
        $num_ram = rand(1, 999);
        $extension = $request->file('photo')->getClientOriginalExtension();
        $filenametostore = $num_ram . time() . '.' . $extension;

        Storage::disk('s3')->put(config('s3.deliveryman') . $filenametostore, fopen($request->file('photo'), 'r+'), 'public');

        $u = User::find($id);

        $userInfo = UserInformation::where('user_id', $u->id)->first();
        $userInfo->photo = $filenametostore;
        $logObject = $userInfo;
        $userInfo->update();

        $this->registerLog(Auth::user()->id, 'Guardó imagen mensajero', json_encode($logObject), "Create", $this->getModule($request));
        return array('r' => true, 'm' => trans('messages.controller_deliveryMan_tag1'));
    }

    public function updateImage(Request $request)
    {
        $id = $request->id;
        $u = User::find($id);
        $userInfo = UserInformation::where('user_id', $u->id)->first();
        $image = $userInfo->photo;

        Storage::disk('s3')->delete(config('s3.deliveryman') . $image);

        $num_ram = rand(1, 999);
        $extension = $request->file('photo')->getClientOriginalExtension();
        $filenametostore = $num_ram . time() . '.' . $extension;

        Storage::disk('s3')->put(config('s3.deliveryman') . $filenametostore, fopen($request->file('photo'), 'r+'), 'public');

        $logObject = $userInfo;

        $userInfo->photo = $filenametostore;
        $userInfo->update();

        $this->registerLog(Auth::user()->id, 'Actualizó  imagen mensajero', json_encode($logObject), "Update", $this->getModule($request));

        return array('r' => true, 'm' => trans('messages.controller_deliveryMan_tag9'), 'file' => config('filesystems.disks.s3.url') . '/deliveryman/' . $filenametostore);
    }

    public function fixPassword($init, $end)
    {
        $users = User::where('id', '>=', $init)->where('id', '<=', $end)->get();
        foreach ($users as $key => $user) {
            $user->password = Hash::make($user->password);
            $user->update();
        }

        return response()->json(200);
    }

    public function reportClientNever()
    {
        return Excel::download((new ReportClients)->withoutOrders(), trans('messages.controller_deliveryMan_tag10') . '.xlsx');
    }

    public function reportClientFifteen()
    {
        return Excel::download((new ReportClients)->withOrdersLastFifteenDays(), trans('messages.controller_deliveryMan_tag11') . '.xlsx');
    }

    public function reportClientAll()
    {
        return Excel::download(new ReportClients, trans('messages.controller_deliveryMan_tag12') . '.xlsx');
    }

    public function coupone($id, $code)
    {
        $discount = Discount::where('code_coupon', $code)->first();
        if ($discount) {
            if ($discount->is_multiple_redeem) {
                return array('r' => true, 'd' => $discount->toArray());
            } else {
                $discountOrder = DiscountOrderUser::where('discount_id', $discount->id)->get();
                if (count($discountOrder) >= $discount->max_winners) {
                    return array('r' => false, 'm' => trans('messages.controller_deliveryMan_tag15'));
                }
                $discountOrder = DiscountOrderUser::where('discount_id', $discount->id)->where('user_id', $id)->first();
                if ($discountOrder) {
                    return array('r' => false, 'm' => trans('messages.controller_deliveryMan_tag14'));
                } else {
                    return array('r' => true, 'd' => $discount->toArray());
                }
            }
        } else {
            return array('r' => false, 'm' => trans('messages.controller_deliveryMan_tag13'));
        }
    }

    public function searchUser($document, $email = "", $first_name = "", $last_name = "", $phone = "", $force = false)
    {
        try {
            $user = null;
            if ($document && $document != "" && !$force) {
                $user = User::select('id', 'first_name', 'last_name', 'document', 'phone', 'email')->where([['document', $document], ['active', true]])->orderBy('last_session', 'desc')->first();
            }

            if (!$user && $email && $email != "") {
                $user = User::select('id', 'first_name', 'last_name', 'document', 'phone', 'email')->where([['email', $email], ['active', true]])->orderBy('last_session', 'desc')->first();
                if ($user) {
                    if ($first_name)
                        $user->first_name = $first_name;
                    if ($last_name)
                        $user->last_name = $last_name;
                    if ($document)
                        $user->document = $document;
                    if ($phone)
                        $user->phone = $phone;
                    $user->update();
                }
            }

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

    public function importSubscribers(Request $request)
    {
        try {
            $file = new SubscribersImport;
            $file->request = $request;
            Excel::import($file, $request->archivo);
            return array('r' => true, 'd' => $file->answer, 'm' => trans('messages.screen_products_tag45') . ' ' . $file->edit['creados'] . ' creados.');
        } catch (\Exception $e) {
            $error = [
                'request'               => $request->all(),
                'message'               => $e->getMessage(),
                'getFile'               => $e->getFile(),
                'getLine'               => $e->getLine(),
            ];
            $util = new UtilController();
            $util->logFile(json_encode($error));
            return array('r' => false, 'd' => null, 'm' => trans('messages.screen_products_tag46') . $request->name_file . "  " . $e->getMessage());
        }
    }

    public function generateSubscribersCredit()
    {
        try {
            $is_subscriber = true;
            $userNotRegister = [];
            $listAbonos = PreSubscriber::where([['payment', false], ['is_credit', true]])->with('seat', 'seat.letter')->get();
            if (count($listAbonos) == 0) {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_validation_12'), "data" => null));
            }

            $match_event = DB::table('match_events')
                ->select('match_events.id', 'match_events.name', 'match_events.season_id')
                ->join('seasons', 'seasons.id', '=', 'match_events.season_id')
                ->where([['seasons.is_suscription', true], ['seasons.active', true]])
                ->where([['match_events.event_start', '>', Carbon::now()], ['match_events.active', true]])
                ->first();
            if (!$match_event) {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_validation_20'), "data" => null));
            }

            $ticketApiController = new TicketApiController();
            $ticketsController = new TicketsController();
            foreach ($listAbonos as $item) {
                $tickets_array = [];
                $user_abono = User::where('document', $item->document)->where('email', $item->email)->where('active', true)->orderBy('last_session', 'desc')->first();
                if (!$user_abono) {
                    $is_subscriber = false;
                    $userNotRegister[] = 'documento: ' . $item->document . ', correo: ' . $item->email;
                } else {
                    $seat = $item->seat;
                    $validateLockedChair = $this->validateSubscriberInfo($seat->id, $match_event->id);
                    if ($validateLockedChair) {
                        DB::rollback();
                        return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_validation_17'), "dataseat" => $seat->letter->name . $seat->code, "data" => null));
                    }

                    $data_ticket = array(
                        'seat'              => $seat,
                        'match_event_id'    => $match_event->id,
                        'ticket_type_id'    => TicketTypesEnum::SUBSCRIBER,
                        'match_event_price' => $item->price,
                        'zone_name'         => $item->seat->zone_id,
                        'price'             => $item->price,
                        'dataTicket'        => array(
                            'checkedCtrl' => true
                        ),
                    );
                    array_push($tickets_array, $data_ticket);
                    $request = new Request([
                        'tickets'       => $tickets_array,
                        'type_process'  => "block",
                        'amount'        => $item->price,
                        'ticket_type_id' => TicketTypesEnum::SUBSCRIBER,
                        'season_id'     => $match_event->season_id,
                    ]);

                    $data = $ticketApiController->createBlocks($request, $user_abono->id);
                    $response = json_decode($data->getContent());
                    if (!$response->r) {
                        return $data;
                        break;
                    }

                    $ticketsPending = TicketMain::findOrFail($response->data);
                    if (!$ticketsPending->ticket_user_blocks->isEmpty()) {
                        if (!$ticketsController->generateTickets($ticketsPending->ticket_user_blocks, $response->data)) {
                            return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_validation_14', ['seat' => $seat->letter->name . $seat->code]), "data" => null));
                        }
                        $ticketsPending->payment_state = "CONFIRMED";
                        $ticketsPending->payment_comment = "Abono tipo credito";
                        $ticketsPending->update();
                    }
                }
            }
            if ($is_subscriber == false) {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_validation_19'), "data" => $userNotRegister));
            }
            return response(array("r" => true, "type" => "success", "m" => __('messages.create_ticket'), "data" => null));
        } catch (\Throwable $th) {
            return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_global'), "data" => $th->getMessage()));
        }
    }

    public function generateSubscribersRandom()
    {
        try {
            $userNotRegister = [];
            $countProcess = 0;
            $listAbonos = PreSubscriber::where([['payment', false], ['is_credit', true]])->with('seat')->get();
            if (count($listAbonos) == 0) {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_validation_12'), "data" => null));
            }

            $match_event = MatchEvent::where('event_start', '>', Carbon::now())->orderBy('created_at', 'desc')->first();
            $ticketsController = new TicketsController();
            $massiveFansController = new MassiveFansController();

            foreach ($listAbonos as $item) {
                $user_abono = User::where([['document', $item->document], ['active', true]])->orderBy('active', 'desc')->first();
                if (!$user_abono) {
                    $userNotRegister[] = $item->document;
                } else {
                    $old_main = Ticket::where([['user_id', $user_abono->id], ['match_event_id', 24]])->first();
                    if (!$old_main) {
                        $userNotRegister[] = $item->document . "-noticket";
                    } else {
                        $seat_id = 0;

                        $seats = $massiveFansController->getSeatsAvailableFromLocationAndEvent(
                            [
                                'zone_id' => $item->seat->zone_id,
                                'quantity' => 1,
                                'match_event_id' => $match_event->id,
                            ]
                        );
                        if (!count($seats)) {
                            $seat_id = $item->seat_id;
                        } else {
                            $seat_id = $seats[0]->id;
                        }
                        $t = $ticketsController->createTicket(
                            [
                                'seat_id' => $seat_id,
                                'match_event_id' => $match_event->id,
                                'user_id' => $user_abono->id,
                                'ticket_type_id' => TicketTypesEnum::SUBSCRIBER,
                                'ticket_main_id' => $old_main->ticket_main_id,
                                'price' => $item->price,
                                'is_from_massive' => true
                            ]
                        );
                        if (!$t instanceof \Illuminate\Database\Eloquent\Model) {
                            if (array_key_exists('r', $t)) {
                                if ($t['r'] == false) {
                                    DB::rollback();
                                    return array('r' => false, 'd' => $t['data'], 'm' => $t['m']);
                                }
                            }
                        }
                        $countProcess++;
                        $item->delete();
                    }
                }
            }
            return response(array("r" => true, "type" => "error", "title" => "Oops...", "m" => __('messages.create_ticket') . " Numero total: " . $countProcess, "data" => $userNotRegister));
        } catch (\Throwable $th) {
            return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_global'), "data" => $th->getMessage()));
        }
    }

    public function deleteSubscribers()
    {
        try {
            PreSubscriber::truncate();
            return response(array("r" => true, "type" => "error", "title" => "Oops...", "m" => __('messages.deleted_successfully'), "data" => null));
        } catch (\Throwable $th) {
            return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_global'), "data" => $th->getMessage()));
        }
    }

    public function reportFansAll()
    {
        return Excel::download(new FansExport, trans('messages.subcategories_controller_tag13') . '.xlsx');
    }

    public function deleteClient(Request $request)
    {
        $userId = $request->userId;
        $logObj = User::find($userId);
        $this->deleteUser($userId);

        // Log
        $this->registerLog(Auth::user()->id, 'Elimino cliente', json_encode($logObj), "Delete", $this->getModule($request));
        return array('r' => true, 'm' => trans('messages.controller_other_users_tag1'));
    }

    public function getById($id)
    {
        return User::find($id);
    }

    //función para validar y generar exportación
    public function validateExport(Request $request, CustomerTableService $customerTableService)
    {
        $query = $customerTableService->getTableQuery($request);

        if (!$query->exists()) {
            return response()->json([
                'success' => false,
                'message' => 'No existen datos a exportar',
            ]);
        }

        $name = 'Clientes_' . date("Ymd_His") . '.xlsx';
        $userId = auth()->id();

        // Inicializar estado
        Cache::put("export_{$userId}_{$name}", [
            'status' => 'processing',
            'filename' => $name,
        ], now()->addHours(2));

        // Despachar job (con el namespace correcto)
        GenerateClientExportJob::dispatch(
            $request->all(),
            $name,
            $userId
        );

        return response()->json([
            'success' => true,
            'message' => 'El archivo se está generando',
            'filename' => $name,
            'processing' => true
        ]);
    }

    // Método checkExportStatus (sin cambios)
    public function checkExportStatus(Request $request)
    {
        $filename = $request->input('filename');
        $userId = auth()->id();
        $cacheKey = "export_{$userId}_{$filename}";

        $status = Cache::get($cacheKey);

        if (!$status) {
            return response()->json([
                'success' => false,
                'status' => 'not_found',
                'message' => 'Export no encontrado',
            ], 404);
        }

        return response()->json([
            'success' => true,
            'status' => $status['status'], // 'processing', 'completed', 'failed'
            'filename' => $status['filename'] ?? null,
            'url' => $status['url'] ?? null,
            'error' => $status['error'] ?? null,
        ]);
    }

    // Método para descargar
    public function downloadExport($filename)
    {
        $userId = auth()->id();
        $cacheKey = "export_{$userId}_{$filename}";
        $status = Cache::get($cacheKey);

        if (!$status || $status['status'] !== 'completed') {
            abort(404, 'Archivo no encontrado o aún en proceso');
        }

        $path = "public/{$filename}";

        if (!Storage::exists($path)) {
            abort(404, 'Archivo no encontrado');
        }

        return Storage::download($path);
    }


    public function export($name)
    {
        return $this->util->export($name);
    }

    public function templateImportSegmentation()
    {
        return Excel::download(new UserSegmentationTemplate, trans('messages.controller_client_tag5') . '.xlsx');
    }

    public function importSegmentation(Request $request)
    {
        try {
            $file = new UserSegmentationImport;
            $file->request = $request;
            Excel::import($file, $request->archivo);
            return array('r' => true, 'd' => $file->answer, 'm' => trans('messages.screen_products_tag45') . ' ' . $file->edit['creados'] . ' creados.');
        } catch (\Exception $e) {
            $error = [
                'request'               => $request->all(),
                'message'               => $e->getMessage(),
                'getFile'               => $e->getFile(),
                'getLine'               => $e->getLine(),
            ];
            $util = new UtilController();
            $util->logFile(json_encode($error));
            return array('r' => false, 'd' => null, 'm' => trans('messages.screen_products_tag46') . $request->name_file . "  " . $e->getMessage());
        }
    }

    public function template()
    {
        return Excel::download(new ClientTemplate, trans('messages.clients.import_file') . '.xlsx');
    }

    public function import(Request $request)
    {
        try {
            $file = new ClientImport;
            $file->request = $request;
            Excel::import($file, $request->archivo);
            return array('r' => true, 'd' => $file->answer, 'm' => trans('messages.clients.import_success') . ' ' . $file->edit['creados'] . ' cliente/s creado/s,' . ' ' . $file->edit['existen'] . ' cliente/s que ya existían.');
        } catch (\Exception $e) {
            $error = [
                'request'               => $request->all(),
                'message'               => $e->getMessage(),
                'getFile'               => $e->getFile(),
                'getLine'               => $e->getLine(),
            ];
            $util = new UtilController();
            $util->logFile(json_encode($error));
            return array('r' => false, 'm' => trans('messages.clients.import_error') . $request->name_file . "  " . $e->getMessage());
        }
    }

    function validateSubscriberInfo($seatId, $matchEventId)
    {
        return TicketUserBlock::where('seat_id', $seatId)->where('match_event_id', $matchEventId)->exists();
    }

    public function deletePreSubscriber(Request $request)
    {
        $preSubscriber = PreSubscriber::find($request->id);
        $logObj = $preSubscriber;
        $preSubscriber->delete();
        $this->registerLog(Auth::user()->id, 'Elimino PreSubscriber', json_encode($logObj), "Delete", $this->getModule($request));
        $data = array('r' => true, 'm' => trans('messages.subscribers.controller_delete_tag1'));
        return response()->json($data, 200);
    }

    public function correctUserRecords($email = null)
    {
        if (in_array(Auth::user()->rol->id, [$this->__SUPERADMIN_ROL])) {
            if ($email)
                $users = User::select('id', 'created_at')->where('email', $email)->withTrashed()->get();
            else
                $users = User::select('id', 'created_at')->withTrashed()->get();

            if (!count($users))
                return 'No existen usuarios a corregir';

            $userInformations = UserInformation::get();
            if ($email) {
                UserInformation::where('user_id', $users[0]->id)->delete();
            } else {
                UserInformation::truncate();
            }

            foreach ($users as $user) {
                $id = $user->id;
                $info = $userInformations->filter(function ($data) use ($id) {
                    return $data->user_id == $id;
                })->first();
                if (!$info) {
                    $info = new UserInformation();
                    $info->user_id = $id;
                    $info->is_initial = 1;
                    $info->is_tutorial_viewed = 1;
                    $info->is_habeas_data_viewed = 1;
                    $info->created_at = $user->created_at;
                    $info->save();
                } else {
                    $info->id = $id;
                    UserInformation::create($info->toArray());
                }
            }
            return 'Proceso ejecutado exitosamente: Total usuarios revisados => ' . count($users);
        }
        return 'Proceso no ejecutado por permisos';
    }

    public function deleteUser($userId)
    {
        $user = User::find($userId);
        if ($user) {
            TermClient::where('user_id', $userId)->delete();
            UserInformation::where('user_id', $userId)->delete();
            User::where('id', $userId)->delete();
        }
    }

    public function getByEmail($email)
    {
        return User::select('id', 'first_name', 'last_name', 'document', 'phone')->where('email', $email)->first();
    }

    public function getByDocument(Request $request)
    {
        $document = $request->input('document');
        $users = User::select('id', 'first_name', 'last_name', 'document', 'phone', 'email')
            ->where('document', $document)
            ->get();

        $obfuscatedUsers = $users->map(function ($user) {
            return [
                'id' => $user->id,
                'first_name' => $this->obfuscateValue((string) $user->first_name),
                'last_name' => $this->obfuscateValue((string) $user->last_name),
                'document' => $this->obfuscateValue((string) $user->document),
                'phone' => $this->obfuscateValue((string) $user->phone),
                'email' => $this->obfuscateEmail((string) $user->email),
            ];
        });

        return response()->json($obfuscatedUsers);
    }

    protected function obfuscateValue(string $value): string
    {
        $length = strlen($value);

        if ($length <= 4) {
            return str_repeat('*', $length);
        }

        return str_repeat('*', $length - 4) . substr($value, -4);
    }

    protected function obfuscateEmail(string $email): string
    {
        if (!str_contains($email, '@')) {
            return $this->obfuscateValue($email);
        }

        [$localPart, $domain] = explode('@', $email, 2);

        $obfuscatedLocal = $this->obfuscateValue($localPart);

        return $obfuscatedLocal . '@' . $domain;
    }


    private function tableFilterClientCustomColumns($dataTable)
    {
        $dataTable->addColumn('actions', function ($obj) {
            $cards = $obj->cards;

            if ($this->validateRolePermissions('user', 'administrator') || $this->validateRolePermissions('user', 'supervisor')) {
                $actions = '
                        <i class="fa fa-eye iconMini" onClick="clickInfoClient(' . $obj->id . ')" data-id="' . $obj->id . '"  title="Información"></i>
                        <i class="fa fa-pencil iconMini" onClick="clickEditClient(' . $obj->id . ')" data-id="' . $obj->id . '"  title="Editar"></i>
                        <i class="fa fa-trash iconMini" onClick="clickDeleteClient(' . $obj->id . ')" data-id="' . $obj->id . '"  title="Eliminar"></i>
                    ';
                if ($cards) {
                    $first_name = "'$obj->first_name'";
                    $last_name = "'$obj->last_name'";
                    $document = "'$obj->document'";
                    $documentType = "'$obj->documentTypeAlias'";
                    $userPhoto = $obj->userPhoto ? "'" . config('filesystems.disks.s3.url') . "/avatars/" . $obj->userPhoto . "'" : "null";
                    $actions .= '<i class="fa fa-id-card-o iconMini" onClick="loadCards(' . $obj->id . ', ' . $first_name . ', ' . $last_name . ', ' . $document . ', ' . $documentType . ', ' . $cards . ', ' . $userPhoto . ')" data-id="' . $obj->id . '" title="Carnés"></i>';
                }
                return $actions;
            } elseif ($this->validateRolePermissions('user', 'seller')) {
                return '<i class="fa fa-eye iconMini" onClick="clickInfoClient(' . $obj->id . ')" data-id="' . $obj->id . '"  title="Información"></i>';
            } else {
                return '';
            }
        })
            ->editColumn('active', function ($obj) {
                if ($this->validateRolePermissions('ticketing', 'administrator') || $this->validateRolePermissions('ticketing', 'supervisor')) {
                    if ($obj->active == 0) {
                        return '<div class="switch"><label><div class="checkbox checbox-switch switch-success"> <label> ' . __('messages.no') . ' <input type="checkbox" onChange="chkClient(' . $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="chkClient(' . $obj->id . ')" data-id="' . $obj->id . '" id="Checkactive' . $obj->id . '" name="Checkactivo" checked="" />
                        <span></span> ' . __('messages.yes') . ' </label> </div>  </label> </div>';
                    }
                } else {
                    return $obj->active == 1 ? 'SI' : 'NO';
                }
            })
            ->editColumn('last_session', function ($obj) {
                return \Carbon\Carbon::parse($obj->last_session)->format('Y-m-d');
            })
            ->editColumn('time_session', function ($obj) {
                return \Carbon\Carbon::parse($obj->time_session)->format('h:i:s A');
            })
            ->editColumn('sex', function ($obj) {
                return $this->util->getFullSexText($obj->sex);
            })
            ->rawColumns(['active', 'actions']);
    }

    public function registerNewUser(Request $request)
    {
        try {
            $validator = Validator::make($request->all(), [
                'first_name'        => 'required|string|max:255',
                'last_name'         => 'required|string|max:255',
                'email'             => 'required|email',
                'phone'             => 'nullable|string|max:20',
                'dial_code'         => 'nullable|string|max:5',
                'country_code'      => 'nullable|string|max:5',
                'document_type_id'  => 'nullable|exists:document_types,id',
                'document'          => 'required|string',
            ]);

            if ($validator->fails()) {
                return response()->json([
                    'success' => false,
                    'message' => 'Errores de validación',
                    'errors' => $validator->errors()
                ], 422);
            }

            $validated = $validator->validated();

            $userResponse = $this->createClient(new Request($validated), $is_ticket = false, $validateByDocument = false);
            if (!$userResponse['r']) {
                return response()->json([
                    'success' => false,
                    'message' => $userResponse['m'] ?? 'Error al registrar el usuario',
                ], 500);
            }

            $user = User::find($userResponse['d']->id);
            Auth::login($user);

            return response()->json([
                'success' => true,
                'message' => 'Usuario registrado exitosamente. Complete sus datos para continuar.',
            ], 200);
        } catch (Exception $e) {
            return response()->json([
                'success' => false,
                'message' => $e->getMessage() ?? 'Error al registrar el usuario',
            ], 500);
        }
    }
}