File: /var/www/vhost/disk-apps/agile-selling-wpb/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 = [env('ROUTE_XL_USER', ''), env('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);
}
}