HEX
Server: Apache/2.4.41 (Ubuntu)
System: Linux ip-172-31-42-149 5.15.0-1084-aws #91~20.04.1-Ubuntu SMP Fri May 2 07:00:04 UTC 2025 aarch64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/vhost/disk-apps/qas.sports-crowd.com/app/Http/Controllers/RouteController.php
<?php

namespace App\Http\Controllers;

use DB;
use App\User;
use App\Order;
use Datatables;
use GuzzleHttp;
use App\Sucursal;
use Carbon\Carbon;
use App\PlanningRoute;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\PushNotificationController;

class RouteController extends Controller
{
    private $routeXLApiRoute;
    private $client;
    private $auth;

    public function __construct()
    {
        $this->routeXLApiRoute = 'https://api.routexl.com/v2/';
        $this->client = new GuzzleHttp\Client();
        $this->auth = [config('route_xl.user'), config('route_xl.pass')];
    }

    public function index()
    {
        $pending_orders = Order::where('order_state_id', 1)->with('address')->with('transferences.sucursal.address')->get();
        $active_deliveries = User::where('rol_id', 3)->where('active', true)->whereNotIn('id', function ($query) {
            $query->select('delivery_id')
                ->from('planning_routes')
                ->where('is_finished', '=', false);
        })->get();
        $sucursals = Sucursal::where('active', true)->with('address')->get();
        return view('route_assistant.route_planning')
            ->with('orders', $pending_orders)
            ->with('deliveries', $active_deliveries)
            ->with('sucursals', $sucursals);
    }

    public function historyRoutes()
    {
        return view('route_assistant.all_routes');
    }

    public function makeTour(Request $request)
    {

        $locations = $request->locations;
        $rounds = isset($request->rounds) ? $request->rounds : '1';
        $type = isset($request->type) ? $request->type : 'bike';

        return response($this->RouteXLMakeRoute($locations, $rounds, $type), 200)
            ->header('Content-Type', 'application/json');
    }

    public function assignPlan(Request $request)
    {
        $routes = $request->routes;
        $deliveries = $request->deliveries;
        $currentDeliveryRoute = 0;
        $route = array();
        $isFreelance = false;
        $home = $this->getHome();

        foreach ($routes as $route) {
            if ($deliveries[$currentDeliveryRoute]["id"] == "free") {
                $isFreelance = true;
            }

            // El siguiente for son todos los pedidos de una ruta para asignar a un mensajero.
            foreach ($route as $point) {
                if ($point['name'] == "home") // Se salta, ya que al momento de generar la ruta se agregan punto inicial y final.
                {
                    continue;
                }

                // Asignar dirección de sucursal.
                $codeOrder = $point['name']; // Code equivalente
                $delivery_id = $deliveries[$currentDeliveryRoute]["id"];

                $this->assignOrderToDelivery($codeOrder, $delivery_id);
            }

            // Guardar ruta.
            $this->storeRoute($route, $delivery_id, $home);
            $currentDeliveryRoute++;
        }
        // Debe ser transacción y debo guardar los datos de la ruta en una tabla. Fin

        return array('r' => 200, 'm' => 'Se ha almacenado y notificado la ruta a los repartidores.');
    }

    public function getRoutes()
    {
        $obj = $obj = DB::table('planning_routes');

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

    public function getRoute($id)
    {
        $obj = PlanningRoute::find($id);

        return view('route_assistant.view')
            ->with('route', $obj);
    }

    public function getHome()
    {
        return Auth::user()->userInfo->sucursal->address;
    }

    public function storeRoute($route, $delivery, $home)
    {
        $obj = new PlanningRoute;

        $obj->route = json_encode($route);
        $obj->home_address_id = $home->id;
        $obj->delivery_id = $delivery;

        $obj->save();

        // Notificar al repartidor.
        $pns_id = User::find($delivery)->pns_id;
        if ($pns_id) {
            $push = new PushNotificationController;
            $push->sendToUser("El administrador te ha asignado una ruta", $pns_id, null, null, null, null, 'D');
        }
    }

    public function assignOrderToDelivery($code, $delivery)
    {
        $order = Order::where('code', $code)->first();
        $order->delivery_man_id = $delivery;
        $order->accepted_delivery_man_id = $delivery;
        $order->order_state_id = 2; // Aceptado
        $order->accepted_date = Carbon::now();
        $order->update();
    }

    private function RouteXLMakeRoute($locations, $rounds, $type)
    {
        $response = $this->client->post($this->routeXLApiRoute . 'tour', [
            'headers' => ['Content-type' => 'application/x-www-form-urlencoded'],
            'auth' => $this->auth,
            'form_params' => [
                'locations' => $locations,
                'parameters[rounds]' => $rounds,
                'parameters[type]' => $type,
            ],
        ]);

        return $response->getBody();
    }

    // API Methods
    public function getRouteOfDelivery(Request $request)
    {
        $planning = PlanningRoute::where('delivery_id', Auth::user()->id)
            ->where('is_finished', false)->first();
        if (!$planning) {
            return array('r' => false, 'm' => 'Actualmente no tienes ninguna ruta asignada.');
        }
        $sucursal = Sucursal::find($planning->home_address_id);
        $orders = json_decode($planning->route);
        $ordersResponse = array();
        $order = null;

        foreach ($orders as $o) {
            if ($o->name != 'home') {
                $order = Order::where('code', $o->name)->with('address')->first();
                $ordersResponse[] = array('name' => $o->name, 'lat' => floatVal($o->lat), 'lng' => floatVal($o->lng), 'arrival' => $o->arrival, 'distance' => $o->distance, 'order' => $order);
            } else {
                $ordersResponse[] = array('name' => $o->name, 'lat' => floatVal($o->lat), 'lng' => floatVal($o->lng), 'arrival' => $o->arrival, 'distance' => $o->distance, 'order' => null);
            }
        }

        return array('is_finished' => $planning->is_finished, 'route' => $ordersResponse, 'home' => $sucursal);
    }

    public function changeOrderStateRoute(Request $request)
    {
        $order = Order::find($request->order_id);
        $order->order_state_id = $request->order_state;
        $order->update();

        return array('r' => true, 'd' => $order->order_state_id);
    }

    public function backOrderStateRoute(Request $request)
    {
        $order = Order::find($request->order_id);
        $order->order_state_id = $order->order_state_id - 1;
        $order->update();
        return array('r' => true, 'd' => $order->order_state_id);
    }

    public function finishMyRoute(Request $request)
    {
        foreach ($request->orders as $orderItem) {
            if ($orderItem["order"] != null) {
                $order = Order::where("id", $orderItem["order"]["id"])->first();
                $order->order_state_id = 5;
                $order->finished_delivery_man_date = Carbon::now();
                $order->deliver_delivery_man_id = Auth::user()->id;
                $order->update();
            }
        }
        $route = PlanningRoute::where('delivery_id', Auth::user()->id, 'is_finished', false)->first();
        $route->is_finished = true;
        $route->update();

        return array('r' => true);
    }
}