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

namespace App\Http\Controllers\Api;

use App\City;
use App\Comment;
use App\Events\NewOrderEvent;
use App\Http\Controllers\Controller;
use App\Http\Controllers\OrderController;
use App\Http\Controllers\PushNotificationController;
use App\LineBusiness;
use App\PointSale;
use App\Order;
use App\OrderProduct;
use App\OrderType;
use App\PaymentType;
use App\SalesChannel;
use App\Sucursal;
use App\Transfer;
use App\Parameter;
use App\Product;
use App\ProductAttribute;
use App\User;
use QrCode;
use Lang;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Mail\TransferMail;
use Illuminate\Support\Facades\Mail;

class OrderApiController extends Controller
{

    public function getOrder(Request $request)
    {
        $order = new OrderController($request);
        return $order->getOrder($request->id);
    }

    public function updateState(Request $request)
    {
        $order = new OrderController($request);
        $idUser = Auth::user()->id;
        return $order->updateState($request["id"], $request["id_state"], $idUser);
    }

    public function saveComment(Request $request)
    {
        $order = Order::find($request["id"]);
        $order->comment = $request["comment"];
        $order->save();
        return array('r' => true);
    }


    public function updateNumberPackage(Request $request)
    {
        $order = new OrderController($request);
        return $order->updateNumberPackage($request["id"], $request["id_state"],$request["number_Package"]);
    }

    public function getAllOrders()
    {
        $id_deliveryMan = Auth::user()->id;
        $orders = Order::where('delivery_man_id', $id_deliveryMan)->with('client', 'admin', 'deliveryMan', 'sucursal', 'orderState', 'paymentType', 'orderType', 'boShippingType' , 'sucursalOrigin', 'comment', 'address', 'point_sale', 'currentSucursal')->orderBy('creation_date', 'desc')->get();
        return $orders->toArray();
    }

    public function asignDelivery(Request $request)
    {

        $order = Order::find($request["order_id"]);

        if ($order->order_state_id == 7) {
            return array('r' => false, 'm' => 'El pedido se encuentra cancelado, no es posible continuar con la operación.');
        } else {
            $order->delivery_man_id = $request['delivery_man_id'];

            $order->save();

            $delivaryMan = User::find($request['delivery_man_id']);
            if ($delivaryMan->pns_id != null) {
                $push = new PushNotificationController();
                $push->sendToUser('Nuevo pedido asignado', $delivaryMan->pns_id, null, null, null, null, 'D');
            }
            event(new NewOrderEvent($order->code, $order->id, $request["delivery_man_id"]));

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

    public function createOrder(Request $request)
    {
        $data = $request->data;
        $data['delivery_man_id'] = Auth::user()->id;
        $request->data = $data;
        $order = new OrderController($request);
        return $order->create($request);
    }

    public function createTransferOrder(Request $request)
    {
        $order = new OrderController($request);
        return $order->createTransferOrder($request["sucursals"], $request["productos"], $request["order_id"], $request["sucursal_id"], $request["code"]);
    }

    public function lazyLoadOrders($index, $resultsNumber)
    {
        $id_deliveryMan = Auth::user()->id;
        $orders = Order::where('delivery_man_id', $id_deliveryMan)
            ->with('client', 'admin', 'deliveryMan', 'sucursal', 'orderState', 'paymentType', 'orderType', 'boShippingType' , 'sucursalOrigin', 'comment', 'address.city', 'point_sale' ,'transferences', 'channel', 'line', 'currentSucursal')->orderBy('creation_date', 'desc')
            ->take($resultsNumber)
            ->skip($index)->get();

        return $orders->toArray();
    }

    public function pendingOrders(Request $request)
    {
        $user_id = Auth::user()->id;
        $orders = Order::where([
            ['client_id', $user_id],
            ['order_state_id', '<=', 5],
            ['order_type_id', 5]
        ])
            ->with('address','point_sale')
            ->orderBy('creation_date', 'desc')
            ->get();
        $data = array('status' => 'success', 'orders' => $orders);
        return response()->json($data, 200);
    }

    public function pendingOrderDetail(Request $request)
    {
        $order = Order::where('id', $request["order_id"])
            ->with(['orderState', 'deliveryMan', 'discountOrderUser', 'discountProductUsers'])
            ->first();
        if ($order) {
            $infoProducts = OrderProduct::where('order_id', $order->id)->with('products','orderProductAttributes')->with('products.brand','products.productImages')->get();
            $order->products = $infoProducts;

            $data = array('status' => 'success', 'order' => $order);
            return response()->json($data, 200);
        } else {
            $data = array('status' => 'error');
            return response()->json($data, 200);
        }
    }

    public function finishedOrders(Request $request)
    {
        $user_id = Auth::user()->id;
        $orders = Order::where([
            ['client_id', $user_id],
            ['order_state_id', '>=', 6],
            ['order_state_id', '<=', 7],
            ['order_type_id', 5]
        ])
            ->with('orderState')
            ->with('address','point_sale')
            ->with('deliveryMan')
            ->offset($request["offset"])
            ->take($request["take"])
            ->orderBy('creation_date', 'desc')
            ->get();
        foreach ($orders as $order) {
            $infoProducts = OrderProduct::where('order_id', $order->id)->with('products','orderProductAttributes')->with('products.brand','products.productImages','products.productAttributes')->get();
            $order->products = $infoProducts;
        }
        $data = array('status' => 'success', 'orders' => $orders);
        return response()->json($data, 200);
    }

    public function getAvailableOrders()
    {
        $free = Order::whereNull('delivery_man_id')
            ->where('order_state_id', 1)
            ->with('client', 'admin', 'deliveryMan', 'sucursal', 'orderState', 'paymentType', 'orderType', 'boShippingType' , 'sucursalOrigin', 'comment', 'address.city', 'point_sale' ,'transferences', 'channel', 'line', 'currentSucursal')
            ->orderBy('creation_date', 'desc')
            ->get();
        return $free->toArray();
    }

    public function getInProcess()
    {
        $idDeliveryMan = Auth::user()->id;
        $pending = Order::where('delivery_man_id', $idDeliveryMan)
            ->where('order_state_id', '!=', 5)
            ->where('order_state_id', '!=', 6)
            ->where('order_state_id', '!=', 7)
            ->with('client', 'admin', 'deliveryMan', 'sucursal', 'orderState', 'paymentType', 'orderType', 'boShippingType' , 'sucursalOrigin', 'comment', 'address.city', 'point_sale' ,'transferences', 'channel', 'line', 'currentSucursal')
            ->orderBy('creation_date', 'desc')
            ->get();

        return response()->json(['pending' => $pending]);
    }

    public function getCountOrders($delivery_id)
    {
        $available = Order::whereNull('delivery_man_id')->where('order_state_id', 1)->get()->count();
        $pending = Order::where('delivery_man_id', $delivery_id)
                    ->where('order_state_id', '!=', 5)
                    ->where('order_state_id', '!=', 6)
                    ->where('order_state_id', '!=', 7)
                    ->get()
                    ->count();
        return response()->json(['available' => $available, 'pending' => $pending]);
    }

    public function checkAvailable($orderId)
    {
        $order = Order::find($orderId);

        if ($order->delivery_man_id == null) {
            return array('r' => true);
        } else {
            return array('r' => false, 'tittle' => Lang::get('messages.warning'), 'message' => Lang::get('messages.order_taken'));
        }
    }

    public function setDeliveryMan(Request $request)
    {
        $idOrder = $request['idOrder'];
        $deliveryManId = Auth::user()->id;
        $order = Order::find($idOrder);
        $order->delivery_man_id = $deliveryManId;
        $order->accepted_delivery_man_id = $deliveryManId;
        $order->save();

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

    public function getDeliveryManInfo()
    {
        $id = Auth::user()->id;
        $user = User::where('id', $id)->with('userInfo')->get();
        return $user;
    }

    public function setDeliveryManOnline(Request $request)
    {

        $id = Auth::user()->id;
        $user = User::find($id);
        $user->online = $request['state'];
        $user->update();

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

    public function checkDeliveryManOnline()
    {

        $id = Auth::user()->id;
        $user = User::find($id);
        $online = $user->online;

        return array('r' => true, 'd' => $online);
    }

    public function setDateTransfer(Request $request)
    {

        $idTransfer = $request['idTransfer'];
        $deliveryManId = Auth::user()->id;
        $current = Carbon::now();
        $transfer = Transfer::find($idTransfer);
        $transfer->delivery_man_id = $deliveryManId;
        $transfer->collected_date = $current;
        $transfer->update();

        return array('r' => true, 'd' => $transfer);
    }

    public function checkDateTransfer($idTransfer)
    {

        $transfer = Transfer::find($idTransfer);
        if ($transfer->collected_date != null || $transfer->delivery_man_id != null) {
            $checked = 1;
            return array('r' => true, 'd' => $checked);
        } else {
            $checked = 0;
            return array('r' => true, 'd' => $checked);
        }
    }

    public function updateRating(Request $request)
    {
        $current = Carbon::now();
        $id = Auth::user()->id;
        $order = Order::find($request['orderId']);
        $order->finished_delivery_man_date = $current;

        $observation = $request['observation'];
        $client = $order->client_id;
        $comment = Comment::where('order_id', $request['orderId'])->first();

        if ($observation == 'SIN COMENTARIOS') {
            $observation = trans('messages.controller_api_rate_msg1');
        }

        if ($order->order_type_id == 5) {
            $order->cost_real = $request->price;
            $order->update();
        }

        $order->update();

        if (isset($comment)) {

            $comment->delivery_man_id = $id;
            $comment->qualification_delivery_man = $request['rate'];
            $comment->observation_delivery_man = $observation;
            $comment->update();

            return array('r' => true);
        } else {
            $comment = new Comment();
            $comment->order_id = $request['orderId'];
            $comment->delivery_man_id = $id;
            $comment->qualification_delivery_man = $request['rate'];
            $comment->observation_delivery_man = $observation;
            $comment->client_id = $client;
            $comment->save();

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

    public function createTransfer(Request $request)
    {
        $order = Order::find($request['orderId']);
        $current = Carbon::now();

        if ($order->order_state_id == 7) {

            return array('r' => false, 'm' => 'El pedido se encuentra cancelado, no es posible continuar con la operación.');
        } else {



            if (isset($order)) {
                $transfer = new Transfer();
                $transfer->order_id = $order->id;
                $transfer->sucursal_id = $request['sucursal'];
                $transfer->description = $request['description'];
                $transfer->creation_date = $current;
                $transfer->delivery_man_id = Auth::user()->id;
                $transfer->save();
                $logObj = $transfer;

                $this->registerLog(
                    Auth::user()->id,
                    'Creo transferencia',
                    json_encode($logObj),
                    "Create",
                    2
                );

                if ($transfer) {
                    $sucurOrigin = Sucursal::find(Auth::user()->userInfo->sucursal->id);
                    $sucur = Sucursal::find($transfer->sucursal_id);
                    $mail = new \stdClass();
                    $mail->products = (string) $request['description'];
                    $mail->destination = $sucur->name;
                    $mail->origin = $sucurOrigin->name;
                    $mail->order = $order->code;

                    // Mail::to($sucur->mail)->queue((new TransferMail($mail))->delay($i+1));
                    Mail::to($sucur->mail)->queue(new TransferMail($mail));
                }
            }

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

    public function ordersTypes()
    {

        $types = OrderType::where('active', 1)->where('id', '!=', 5)->get();
        return array('r' => true, 'd' => $types);
    }

    public function getAutomaticCode($id)
    {
        $type = OrderType::find($id);

        if ($type->code_generate) {

            switch ($id) {
                case 1:
                    $code = "V" . date("y") . date("m") . date("d") . date("H") . round(rand(1, 9) * date('i')) . date('s');

                    return array('r' => true, 'd' => $code, 'C' => 1);

                    break;
                case 2:
                    $code = "C" . dechex(date("y")) . dechex(date("m")) . dechex(date("d")) . dechex(date("H")) . dechex(date('i')) . dechex(date('s')) . round(rand(1, 9));
                    return array('r' => true, 'd' => $code, 'C' => 2);

                    break;
                case 3:
                    $code = "T" . dechex(date("y")) . dechex(date("m")) . dechex(date("d")) . dechex(date("H")) . dechex(date('i')) . dechex(date('s')) . round(rand(1, 9));
                    return array('r' => true, 'd' => $code, 'C' => 3);

                    break;
                case 4:
                    $code = "D" . dechex(date("y")) . dechex(date("m")) . dechex(date("d")) . dechex(date("H")) . dechex(date('i')) . dechex(date('s')) . round(rand(1, 9));
                    return array('r' => true, 'd' => $code, 'C' => 4);
                    break;

                default:

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

    public function getDataCreateOrder()
    {

        $sucursales = Sucursal::where('active', 1)->get();
        $businessLines = LineBusiness::where('active', 1)->get();
        $saleChannels = SalesChannel::where('active', 1)->get();
        $paymentType = PaymentType::where('active', 1)->get();

        $sucursales->toArray();
        $businessLines->toArray();
        $saleChannels->toArray();
        $paymentType->toArray();

        $result = array("S" => $sucursales, "BL" => $businessLines, "SC" => $saleChannels, "PT" => $paymentType);

        return array('r' => true, 'd' => $result);
    }

    public function verifyCode($code)
    {
        $order = Order::where('code', $code)->first();

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

    public function returnToState(Request $request)
    {

        $idUser = Auth::user()->id;
        $orderC = new OrderController($request);
        $order = Order::find($request['id']);

        if ($request['id_state'] == 3) {
            $order->collected_date = null;
            $order->collected_delivery_man_id = null;
            $order->update();
            return $orderC->updateState($request["id"], 2, $idUser);
        } else if ($request['id_state'] == 4) {
            $order->deliver_date = null;
            $order->deliver_delivery_man_id = null;
            $order->update();
            return $orderC->updateState($request["id"], 3, $idUser);
        } else if ($request['id_state'] == 5) {
            $order->finished_delivery_man_date = null;
            $order->update();
            return $orderC->updateState($request["id"], 4, $idUser);
        }
    }

    public function searchFilter($word)
    {
        $id = Auth::user()->id;
        $orders = Order::where('delivery_man_id', $id)
            ->with('client', 'admin', 'deliveryMan', 'sucursal', 'orderState', 'paymentType', 'orderType', 'boShippingType' , 'sucursalOrigin', 'comment', 'address.city', 'point_sale','transferences', 'channel', 'line', 'currentSucursal')
            ->where('code', 'LIKE', '%' . $word . '%')
            ->orWhereHas('client', function ($query) use ($word) {
                $query->where('first_name', 'LIKE', '%' . $word . '%')
                    ->orWhere('last_name', 'LIKE', '%' . $word . '%')
                    ->orWhere('phone', 'LIKE', '%' . $word . '%')
                    ->orWhere('document', 'LIKE', '%' . $word . '%');
            })
            ->orWhereHas('address.city', function ($q) use ($word) {
                $q->where('name', 'LIKE', '%' . $word . '%');
            })
            ->orderBy('creation_date', 'desc')
            ->take(10)->get();

        return $orders->toArray();
    }

    public function rating(Request $request)
    {
        $comment = Comment::where('order_id', $request["order_id"])->first();
        $user_id = Auth::user()->id;

        if ($comment) {
            $comment->client_id = $user_id;
            $comment->qualification_client = $request["rating"];
            $comment->observations_client = $request["commentary"];
            $comment->order_id = $request["order_id"];
            $comment->save();
        } else {
            $comment = new Comment();
            $comment->client_id = $user_id;
            $comment->qualification_client = $request["rating"];
            $comment->observations_client = $request["commentary"];
            $comment->order_id = $request["order_id"];
            $comment->save();
        }

        if ($comment) {
            $order = Order::find($request["order_id"]);
            $order->order_state_id = 6;
            $order->finished_client_date = Carbon::now();
            $order->update();

            $data = array('status' => 'success');
            return response()->json($data, 200);
        } else {
            $data = array('status' => 'error');
            return response()->json($data, 200);
        }
    }

    public function getCities()
    {

        $cities = City::where('active', true)->get();
        return array('r' => true, 'd' => $cities->toArray());
    }

    public function updateRecolectedProduct(Request $request)
    {
        $obj = OrderProduct::where('id', $request->order_product_id)->first();
        $obj->is_recolected = $request->state;
        $obj->update();
    }

    public function updateAvailableProduct(Request $request)
    {
        $objProduct = OrderProduct::where('id', $request->order_product_id)->first();
        $objOrder = Order::where('id', $objProduct->order_id)->with('discountOrderUser')->first();
        $objProduct->available = $request->state;

        $value = ($objProduct->price * $objProduct->quantity);

        if ($objProduct->available) {
            $objOrder->subtotal = $objOrder->subtotal + $value;
            $objOrder->total_price = $objOrder->total_price + $value;

            // se calcula nuevamente el valor de los descuentos basados en el nuevo subtotal
            if ($objOrder->discount_price) {
                $valueDiscount = 0;
                foreach ($objOrder->discountOrderUser as $discount) {
                    if ($discount->discount->price_discount && $discount->discount->discount_type_id != 1) {
                        $valueDiscount += $discount->discount->price_discount;
                    } elseif ($discount->discount->percentage_discount && $discount->discount->discount_type_id != 1) {
                        $valueDiscount += ((($objOrder->subtotal + $objOrder->cost_delivery) * $discount->discount->percentage_discount) / 100);
                    }
                }

                // se calcula la diferencia en el valor de la suma de los descuento para aplicarlo al valor total
                if ($objOrder->discount_price > $valueDiscount) {
                    $extraValue = $objOrder->discount_price - $valueDiscount;
                    $objOrder->total_price += $extraValue;
                } elseif ($valueDiscount > $objOrder->discount_price) {
                    $extraValue = $valueDiscount - $objOrder->discount_price;
                    $objOrder->total_price -= $extraValue;
                }
                $objOrder->discount_price = $valueDiscount;
            }
        } else {
            // Actualizar total_price y subtotal del pedido.
            $objOrder->subtotal = $objOrder->subtotal - $value;
            $objOrder->total_price = $objOrder->total_price - $value;

            // se calcula nuevamente el valor de los descuentos basados en el nuevo subtotal
            if ($objOrder->discount_price) {
                $valueDiscount = 0;
                foreach ($objOrder->discountOrderUser as $discount) {
                    if ($discount->discount->price_discount && $discount->discount->discount_type_id != 1) {
                        $valueDiscount += $discount->discount->price_discount;
                    } elseif ($discount->discount->percentage_discount && $discount->discount->discount_type_id != 1) {
                        $valueDiscount += ((($objOrder->subtotal + $objOrder->cost_delivery) * $discount->discount->percentage_discount) / 100);
                    }
                }

                // se calcula la diferencia en el valor de la suma de los descuento para aplicarlo al valor total
                if ($objOrder->discount_price > $valueDiscount) {
                    $extraValue = $objOrder->discount_price - $valueDiscount;
                    $objOrder->total_price += $extraValue;
                } elseif ($valueDiscount > $objOrder->discount_price) {
                    $extraValue = $valueDiscount - $objOrder->discount_price;
                    $objOrder->total_price -= $extraValue;
                }
                $objOrder->discount_price = $valueDiscount;
            }
        }

        $objOrder->save();
        $objProduct->update();

        return array('subtotal' => $objOrder->subtotal, 'total_price' => $objOrder->total_price);
    }

    public function filterStates(Request $request)
    {
        if($request['state'] == 4){
            $orders = Order::where('order_state_id', $request['state'])
            ->with('client', 'admin', 'deliveryMan', 'sucursal', 'orderState', 'paymentType', 'orderType', 'boShippingType' , 'sucursalOrigin', 'comment', 'address.city', 'point_sale' ,'transferences', 'channel', 'line', 'currentSucursal')
            ->orderBy('creation_date', 'desc')
            ->get();
        }else{
            $id = Auth::user()->id;
            $orders = Order::where('delivery_man_id', $id)
            ->where('order_state_id', $request['state'])
            ->with('client', 'admin', 'deliveryMan', 'sucursal', 'orderState', 'paymentType', 'orderType', 'boShippingType' , 'sucursalOrigin', 'comment', 'address.city', 'point_sale' ,'transferences', 'channel', 'line', 'currentSucursal')
            ->orderBy('creation_date', 'desc')
            ->get();
        }

        return array('r' => true, 'd' => $orders);
    }

    public function searchProductByPlu($plu)
    {
        $products = Product::where('plu', 'like', '%' . $plu . '%')
        ->where('active', 1)
        ->with('brand','productImages')
        ->has('subcategoryProduct')
        ->get();

        foreach ($products as $product) {
            $product->order_product_attributes = ProductAttribute::where('product_id', $product->id)->with('attribute')->get()->groupBy('attribute_id')->toArray();
        }
        $data = array('status' => 'success', 'products' => $products);
        return response()->json($data, 200);
    }

    public function changeProductOrder(Request $request)
    {
        $order = new OrderController($request);
        return $order->changeProductOrder($request);
    }

    public function getPointsSale()
    {
        try {
            $points = PointSale::where('active', true)->get();
            $data = array('status' => 'success', 'd' => $points);
            return response()->json($data, 200);
        } catch (\Throwable $th) {
            $data = array('status' => 'error', 'm' => $th->getMessage());
            return response()->json($data, 200);
        }
    }

    public function cancelOrder(Request $request,$order_id)
    {
        try {
            $user_id = Auth::user()->id;
            $order = new OrderController($request);
            return $order->updateState($order_id,7,$user_id);
        } catch (\Throwable $th) {
            $data = array('status' => 'error', 'm' => $th->getMessage());
            return response()->json($data, 200);
        }
    }

    // Print invoice IGT
    public function printOrder($order_id){
        $order = Order::where('id', $order_id)
            ->with('orderProducts', 'client', 'admin', 'deliveryMan', 'sucursal', 'orderState', 'paymentType', 'orderType', 'boShippingType' , 'sucursalOrigin', 'comment', 'address.city', 'point_sale' ,'transferences', 'channel', 'line', 'currentSucursal')
            ->first();

        $city_db = Parameter::first()->db_name;

        $codigoQR = QrCode::size(25)->generate(explode("/", $order->bo_invoice)[0]);

        return view('print_invoice.print_invoice')
            ->with('order', $order)
            ->with('codigoQR', $codigoQR)
            ->with('city_db', $city_db);
    }
}