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/agile-selling-wpb/app/Http/Controllers/UserController.php
<?php

namespace App\Http\Controllers;

use App\Address;
use App\BoEmployeeInformation;
use App\BoPriceList;
use App\BoSalesPerson;
use App\City;
use App\CourierCompany;
use App\Discount;
use App\DiscountOrderUser;
use App\Http\Controllers\AddressController;
use App\Order;
use App\Parameter;
use App\Rol;
use App\Sucursal;
use App\User;
use App\UserInformation;
use Datatables;
use DateTime;
use DB;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
use \Excel;
use Illuminate\Database\Eloquent\Builder;
use App\Http\Controllers\Exports\ReportClients;
use App\Http\Controllers\Exports\ReportClientsNever;
use App\Http\Controllers\Exports\ReportClientsFifteen;

class UserController extends Controller
{
    public function __construct(Request $request)
    {
        $this->middleware('auth');
        // $this->middleware(function ($request, $next) {
        //     $this->user = Auth::user();
        //     if (Auth::user()->rol->id == 1 || Auth::user()->rol->id == 6) {
        //         $this->changeDbDefault($request);
        //     }
        //     return $next($request);
        // });
    }

    public function indexClient()
    {
        $clients = User::orderBy('first_name', 'ASC')->where("rol_id", 4)->get();
        return view('users.clients')->with('clients', $clients);
    }

    public function indexDelivery()
    {
        $sucursal = Auth::user()->userInfo->sucursal->id;
        // $rol = Auth::user()->rol->id;
        // if ($rol == 1 || $rol == 6) {
            $deliveryMan = User::orderBy('first_name', 'ASC')->where("rol_id", 3)->get();
        // } else {
        //     $deliveryMan = User::where("rol_id", 3)
        //     ->whereHas('userInfo', function (Builder $query) use ($sucursal) {
        //         $query->where('sucursal_id', $sucursal);
        //     })
        //     ->orderBy('first_name', 'ASC')->get();
        // }
        $sucursals = Sucursal::where('active', 1)->get();
        return view('users.deliveryMan')
            ->with('deliveryMan', $deliveryMan)
            ->with('sucursals', $sucursals);
    }

    public function indexAdmin()
    {
        // $rol = Auth::user()->rol->id;
        // if ($rol == 1 || $rol == 6) {
            $admins = User::where('rol_id', '!=', 3)->orWhere('rol_id', '!=', 4)->orderBy('first_name', 'ASC')->get();
            $rols = Rol::all();
            $sucursals = Sucursal::where('active', 1)->get();
            return view('users.admins')->with('admins', $admins)->with('rols', $rols)->with('sucursals', $sucursals);
        // } else {
        //     return redirect()->back();
        // }
    }

    public function indexAddClient()
    {
        $cities = City::where('active', 1)->get();
        $parameters = Parameter::first();

        $return = view('users.addClients')->with('cities', $cities)->with('parameters', $parameters);
        if($parameters->b1_activate){
            $price_lists = BoPriceList::all();
            $return->with('price_lists', $price_lists);
        }
        return $return;
    }

    public function indexAddDelivery()
    {
        $sucursals = Sucursal::where('active', 1)->get();
        $courier = CourierCompany::all();
        return view('users.addDeliveryMan')->with('sucursals', $sucursals)->with('courier', $courier);
    }
    public function indexAddAdmin()
    {
        $sucursals = Sucursal::where('active', 1)->get();
        $rols = Rol::where('id', '!=', 3)->orWhere('id', '!=', 4)->get();
        $bo_sales_persons = BoSalesPerson::where('active', true)->get();
        return view('users.addAdmin')->with('sucursals', $sucursals)->with('rols', $rols)->with('bo_sales_persons', $bo_sales_persons);
    }

    public function indexEditClient($id)
    {
        $client = User::find($id);
        $directions = Address::where('user_id', $id)->get();
        $cities = City::where('active', 1)->get();
        $parameters = Parameter::first();

        $return = view('users.editClients')->with('client', $client)->with('directions', $directions)->with('cities', $cities)->with('parameters', $parameters);

        if($parameters->b1_activate){
            $price_lists = BoPriceList::all();
            $return->with('price_lists', $price_lists);
        }

        return $return;
    }

    public function indexEditDeliveryMan($id)
    {
        $deliveryM = User::find($id);
        $info = UserInformation::where('user_id', $id)->first();
        $sucursals = Sucursal::where('active', 1)->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)->get();
        $rols = Rol::where('id', '!=', 3)->orWhere('id', '!=', 4)->get();
        $bo_sales_persons = BoSalesPerson::where('active', true)->get();
        return view('users.editAdmin')->with('admin', $admin)->with('sucursals', $sucursals)->with('rols', $rols)->with('info', $info)->with('bo_sales_persons', $bo_sales_persons);
    }

    public function createClient(Request $request, $is_ticket = false)
    {
        $parameters = Parameter::where('id', 1)->first();
        $accountInfo = array(
            'rol' => 4, // Rol para cliente
            'name_database' => $parameters->db_name,
            'accountInfo' => array(
                'name' => $request["first_name"],
                'lastName' => $request["last_name"],
                'cellPhone' => $request["phone"],
                'email' => $request["email"],
                'password' => $request["password"],
                'identificationCard' => $request["document"],
            ),
        );

        $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_client_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_client_tag3'));
            }
        }

        // Peticion a Central para crear el "Cliente"
        $client = new \GuzzleHttp\Client([
            'base_uri' => env('CENTRAL_URL'),
            'defaults' => [
                'exceptions' => false,
            ],
        ]);
        $responseGuzzle = $client->post('/api/user/signup/admin', [
            \GuzzleHttp\RequestOptions::JSON => $accountInfo,
            'headers' => [
                'Accept' => 'application/json',
            ],
        ]);

        $body = (string) $responseGuzzle->getBody();
        $remoteUser = json_decode($body);

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

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

        // Actualizar campos nuevos create client
        if($parameters->b1_activate){
            $userToUpd = User::find($remoteUser->user->id);
            $userToUpd->bo_price_list_id = $request["bo_price_list_id"];
            $userToUpd->update();
        }

        if(!$is_ticket){
            $address = new AddressController;
            $idAddress = $address->create("", $request["direction"], $request["district"], $request["indications"], $request["lat"], $request["long"], $request["city_id"], $remoteUser->user->id);

            if ($idAddress == true) {
                return array('r' => true, 'm' => trans('messages.controller_client_tag1'), 'id' => $remoteUser->user->id);
            } else {
                $user = User::find($remoteUser->user->id);
                $userInfo = UserInformation::where('user_id', $user->id)->first();
                $userInfo->forceDelete();
                $user->forceDelete();

                $client = new \GuzzleHttp\Client([
                    'base_uri' => env('CENTRAL_URL'),
                    'defaults' => [
                        'exceptions' => false,
                    ],
                ]);
                $responseGuzzle = $client->get('/api/user/delete/signup/admin/' . $remoteUser->user->id, [
                    'headers' => [
                        'Accept' => 'application/json',
                    ],
                ]);

                $body = (string) $responseGuzzle->getBody();
                return array('r' => false);
            }
        }

        return array('r' => true,'d'=> $remoteUser->user);
    }

    public function createDeliveryMan(Request $request)
    {
        $parameters = Parameter::where('id', 1)->select('id', 'db_city', 'db_name')->first();
        $accountInfo = array(
            'rol' => 3, // Rol para mensajero
            'name_database' => $parameters->db_name,
            'accountInfo' => array(
                'name' => $request["first_name"],
                'lastName' => $request["last_name"],
                'cellPhone' => $request["phone"],
                'email' => $request["email"],
                'password' => $request["password"],
                'identificationCard' => $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'));
                }
            }
        }

        // Peticion a Central para crear el "Mensajero"
        $client = new \GuzzleHttp\Client([
            'base_uri' => env('CENTRAL_URL'),
            'defaults' => [
                'exceptions' => false,
            ],
        ]);
        $responseGuzzle = $client->post('/api/user/signup/admin', [
            \GuzzleHttp\RequestOptions::JSON => $accountInfo,
            'headers' => [
                'Accept' => 'application/json',
            ],
        ]);

        $body = (string) $responseGuzzle->getBody();
        $remoteUser = json_decode($body);

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

        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::where('id', 1)->select('id', 'db_city', 'db_name')->first();
        $accountInfo = array(
            'rol' => $request["rol_id"], // Rol para cliente
            'name_database' => $parameters->db_name,
            'accountInfo' => array(
                'name' => $request["first_name"],
                'lastName' => $request["last_name"],
                'cellPhone' => $request["phone"],
                'email' => $request["email"],
                'password' => $request["password"],
                'identificationCard' => $request["document"],
                'courier_company_id' => null,
                'sucursal_id' => $request["sucursal_id"],
                'plate' => null,
                'bo_sales_people_id' => $request["bo_sales_people_id"]
            ),
        );

        //$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'));
            }
        }

        // Peticion a Central para crear el "Cliente"
        $client = new \GuzzleHttp\Client([
            'base_uri' => env('CENTRAL_URL'),
            'defaults' => [
                'exceptions' => false,
            ],
        ]);
        $responseGuzzle = $client->post('/api/user/signup/admin', [
            \GuzzleHttp\RequestOptions::JSON => $accountInfo,
            'headers' => [
                'Accept' => 'application/json',
            ],
        ]);

        $body = (string) $responseGuzzle->getBody();
        $remoteUser = json_decode($body);

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

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

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

    public function updateClient(Request $request)
    {
        $user = User::find($request["id"]);
        $logObj = $user;
        $user->first_name = $request["first_name"];
        $user->last_name = $request["last_name"];
        $user->phone = $request["phone"];
        $user->email = $request["email"];
        $user->popup_active = $request["popup_active"];
        $user->popup_text = $request["popup_text"];
        $user->required_po = $request["required_po"];
        $user->bo_price_list_id = $request["bo_price_list_id"] ? $request["bo_price_list_id"] : null;
        if(isset($request["password"])){
            $user->password = \Hash::make($request["password"]) ;
        }
        $user->document = $request["document"];
        $user->rol_id = 4;
        $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 $key => $direction) {
            if ($direction->id == $idAddress) {
                $direction->last_used = 1;
            } else {
                $direction->last_used = 0;
            }

            $direction->update();
        }

        $user->update();
        //log
        $this->registerLog(Auth::user()->id, 'Se modifico la información del cliente', json_encode($logObj) , "update", 5);
        return array('r' => true, 'm' => trans('messages.controller_client_tag4'));

        // if ($request["document"] == null && $request["email"] == null) {

        //     $user->update();
        //     //log
        //     $this->registerLog(Auth::user()->id, 'Se modifico la información del cliente', json_encode($logObj)
        //         , "update", 5);
        //     return array('r' => true, 'm' => trans('messages.controller_client_tag4'));
        // }

        // if ($request["document"] != null && $request["email"] == null) {

        //     $user->update();
        //     // Log
        //     $this->registerLog(Auth::user()->id, 'Se modifico la información del cliente', json_encode($logObj)
        //         , "update", 5);

        //     return array('r' => true, 'm' => trans('messages.controller_client_tag4'));
        // }
        // if ($request["document"] == null && $request["email"] != null) {

        //     $user->update();
        //     // Log
        //     $this->registerLog(Auth::user()->id, 'Se modifico la información del cliente', json_encode($logObj)
        //         , "update", 5);

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

        // $r = User::where([['id', '!=', $request["id"]],["document", $user->document]])->get();
        // $email = User::where([['id', '!=', $request["id"]],["email", "=", $user->email]])->first();

        // if (count($r) > 0) {
        //     if (($r[0]->id) == ($request["id"])) {

        //         if ($email) {
        //             if ($email->id == $user->id) {

        //                 $user->update();
        //                 // Log
        //                 $this->registerLog(Auth::user()->id, 'Se modifico la información del cliente', json_encode($logObj), "update", 5);
        //                 return array('r' => true, 'm' => trans('messages.controller_client_tag4'));
        //             } else {
        //                 return array('r' => false, 'm' => trans('messages.controller_client_tag3'));
        //             }
        //         } else {

        //             $user->update();
        //             // Log
        //             $this->registerLog(Auth::user()->id, 'Se modifico la información del cliente', json_encode($logObj), "update", 5);
        //             return array('r' => true, 'm' => trans('messages.controller_client_tag4'));

        //         }

        //     } else {
        //         return array('r' => false, 'm' => trans('messages.controller_client_tag2'));
        //     }
        // } else {
        //     if ($email) {
        //         if ($email->id == $user->id) {

        //             $user->update();
        //             // Log
        //             $this->registerLog(Auth::user()->id, 'Se modifico la información del cliente', json_encode($logObj), "update", 5);
        //             return array('r' => true, 'm' => trans('messages.controller_client_tag4'));
        //         } else {
        //             return array('r' => false);
        //         }
        //     } else {
        //         $user->update();
        //         // Log
        //         $this->registerLog(Auth::user()->id, 'Se modifico la información del cliente', json_encode($logObj), "update", 5);
        //         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"]);

            $userC = new User();
            $userC->setConnection('main-db');

            $userUpdate = $userC->where('id', $user->id)->first();
            $userUpdate->password = \Hash::make($request["password"]);
            $userUpdate->save();
        }

        $r = User::where("document", "=", $user->document)->get();
        $email = User::where("email", "=", $user->email)->get();

        if (count($r) > 0) {
            if (($r[0]->id) == ($request["id"])) {

                if (count($email) > 0) {
                    if ($email[0]->id == $user->id) {
                        $user->update();
                        $this->updateInfoDelivery($request["plate"], $request["id"], $request["courier_company_id"], $request["sucursal_id"]);
                        // Log
                        return array('r' => true, 'm' => trans('messages.controller_deliveryMan_tag4'));
                    } else {
                        return array('r' => false, 'm' => trans('messages.controller_deliveryMan_tag3'));
                    }
                } else {
                    $user->update();
                    $this->updateInfoDelivery($request["plate"], $request["id"], $request["courier_company_id"], $request["sucursal_id"]);
                    // Log
                    return array('r' => true, 'm' => trans('messages.controller_deliveryMan_tag4'));
                }

            } else {
                return array('r' => false, 'm' => trans('messages.controller_deliveryMan_tag2'));
            }
        } else {
            if (count($email) > 0) {
                if ($email[0]->id == $user->id) {

                    $user->update();
                    $this->updateInfoDelivery($request["plate"], $request["id"], $request["courier_company_id"], $request["sucursal_id"]);
                    return array('r' => true, 'm' => trans('messages.controller_deliveryMan_tag4'));
                } else {
                    return array('r' => false, 'm' => trans('messages.controller_deliveryMan_tag3'));
                }
            } else {
                $user->update();
                $this->updateInfoDelivery($request["plate"], $request["id"], $request["courier_company_id"], $request["sucursal_id"]);
                return array('r' => true, 'm' => trans('messages.controller_deliveryMan_tag4'));
            }
        }

    }

    public function updateAdmin(Request $request)
    {
        // dd($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"];
        $user->bo_sales_people_id = $request["bo_sales_people_id"] ? $request["bo_sales_people_id"] : null;
        if (!empty($request["password"])) {
            $user->password = \Hash::make($request["password"]);
        }

        $r = User::where("document", "=", $user->document)->get();
        $email = User::where("email", "=", $user->email)->get();

        if (count($r) > 0) {
            //if (($r[0]->id) == ($request["id"])) {

                if (count($email) > 0) {
                    if ($email[0]->id == $user->id) {
                        $user->update();
                        $info = UserInformation::where('user_id', $request["id"])->first();
                        $info->sucursal_id = $request["sucursal_id"];
                        $info->update();

                        // Log
                        return array('r' => true, 'm' => trans('messages.controller_admin_tag4'));
                    } else {
                        return array('r' => false, 'm' => trans('messages.controller_admin_tag3'));
                    }
                } else {
                    $user->update();
                    $info = UserInformation::where('user_id', $request["id"])->first();
                    $info->sucursal_id = $request["sucursal_id"];
                    $info->update();
                    // Log
                    return array('r' => true, 'm' => trans('messages.controller_admin_tag4'));
                }

            //} else {
              //  return array('r' => false, 'm' => trans('messages.controller_admin_tag2'));
            //}
        } else {
            if (count($email) > 0) {
                if ($email[0]->id == $user->id) {

                    $user->update();
                    $info = UserInformation::where('user_id', $request["id"])->first();
                    $info->sucursal_id = $request["sucursal_id"];
                    $info->update();
                    return array('r' => true, 'm' => trans('messages.controller_deliveryMan_tag4'));
                } else {
                    return array('r' => false, 'm' => trans('messages.controller_deliveryMan_tag3'));
                }
            } else {
                $user->update();
                $info = UserInformation::where('user_id', $request["id"])->first();
                $info->sucursal_id = $request["sucursal_id"];
                $info->update();
                return array('r' => true, 'm' => trans('messages.controller_deliveryMan_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::with('boPriceList')->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 = env('AWS_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", 6);
        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)
    {
        $id = $request['id'];

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

    }

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

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

    }

    public function tableFilterClient()
    {
        $obj = $obj = DB::table('users')
            ->select('users.id', 'users.first_name', 'users.last_name', 'users.email', 'users.active')->where('users.rol_id', 4);

        return Datatables::of($obj)
            ->addColumn('actions', function ($obj) {
                if(Auth::user()->rol_id == 1 || Auth::user()->rol_id == 2){
                    return '<i class="fa fa-eye iconMini " onClick="clickInfoClient(' . $obj->id . ')" name="btnEditar" 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>';
                }elseif (Auth::user()->rol_id == 7 || Auth::user()->rol_id == 8) {
                    return '<i class="fa fa-eye iconMini " onClick="clickInfoClient(' . $obj->id . ')" name="btnEditar" data-id="' . $obj->id . '"  title="Información"></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="chkClient(' . $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="chkClient(' . $obj->id . ')" data-id="' . $obj->id . '" id="Checkactive' . $obj->id . '" name="Checkactivo" checked="" />                <span></span> Si </label> </div>  </label> </div>';
                }
            })
            ->rawColumns(['active', 'actions'])
            ->make(true);
    }

    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')->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="Modificar"></i> <i class="fa fa-trash iconMini " onClick="clickDeleteDeliveryMan(' . $obj->id . ')" data-id="' . $obj->id . '"  title="Borrar"></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>';

                }

            })
            ->rawColumns(['active', 'actions', 'multiple_session', 'online'])
            ->make(true);
    }

    public function tableFilterAdmins()
    {

        $obj = $obj = DB::table('users')
            ->join('rols', 'rols.id', '=', 'users.rol_id')
            ->select('users.id', 'users.first_name', 'users.last_name', 'users.email', 'users.active', 'rols.name as rol')
            ->orWhere(function ($query) {
                $query->orWhere('users.rol_id', 1);
                $query->orWhere('users.rol_id', 2);
                $query->orWhere('users.rol_id', 7);
                $query->orWhere('users.rol_id', 8);
                $query->orWhere('users.rol_id', 9);
                $query->orWhere('users.rol_id', 10);
                $query->orWhere('users.rol_id', 11);
                $query->orWhere('users.rol_id', 12);
            })->whereNull('users.deleted_at');

        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="Modificar"></i> <i class="fa fa-trash iconMini " onClick="clickDeleteAdmins(' . $obj->id . ')" data-id="' . $obj->id . '"  title="Borrar"></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>';

                }

            })
            ->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::all();
        $parameters = $parameters->last();
        $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,

            ];
        }
        // dd($results);
        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 autocompleteMail(Request $request)
    {
        $term = $request->input('term');
        $results = array();

        $queries = DB::table('users')
            ->where('email', 'LIKE', '%' . $term . '%')
            ->where('rol_id', 4)
            ->take(5)->get();
        $parameters = Parameter::all();
        $parameters = $parameters->last();
        $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),

            ];
        }
// dd($results);
        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(env('S3_DELIVERYMAN_PATH') . $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", 3);
        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(env('S3_DELIVERYMAN_PATH') . $image);

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

        Storage::disk('s3')->put(env('S3_DELIVERYMAN_PATH') . $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", 3);

        return array('r' => true, 'm' => trans('messages.controller_deliveryMan_tag9'), 'file' => env('AWS_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 ReportClientsNever, trans('messages.controller_deliveryMan_tag10').'.xlsx');
    }

    public function reportClientFifteen()
    {
        return Excel::download(new ReportClientsFifteen, 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 = "")
    {
        try {
            if($document && $document != ""){
                return User::select('id','first_name','last_name','document','phone','email')->where('document', $document)->first();
            }else if($email && $email != ""){
                $user = User::select('id','first_name','last_name','document','phone','email')->where('email', $email)->first();
                if($user){
                    $user->first_name = $first_name;
                    $user->last_name = $last_name;
                    $user->document = $document ? $document : "";
                    $user->phone = $phone ? $phone : "";
                    $user->update();
                    return $user;
                }
            }
            return null;
        } catch (\Throwable $th) {
            return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_creating'), "data" => $th->getMessage()));
        }
    }
}