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);
}
}