You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					1156 lines
				
				51 KiB
			
		
		
			
		
	
	
					1156 lines
				
				51 KiB
			| 
								 
											2 years ago
										 
									 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace App\Http\Controllers\Admin;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use App\Models\Food;
							 | 
						||
| 
								 | 
							
								use App\Models\Zone;
							 | 
						||
| 
								 | 
							
								use App\Models\Order;
							 | 
						||
| 
								 | 
							
								use App\Models\Coupon;
							 | 
						||
| 
								 | 
							
								use App\Models\Category;
							 | 
						||
| 
								 | 
							
								use App\Models\DeliveryMan;
							 | 
						||
| 
								 | 
							
								use App\Models\OrderDetail;
							 | 
						||
| 
								 | 
							
								use App\Models\ItemCampaign;
							 | 
						||
| 
								 | 
							
								use Illuminate\Http\Request;
							 | 
						||
| 
								 | 
							
								use App\CentralLogics\Helpers;
							 | 
						||
| 
								 | 
							
								use App\Models\BusinessSetting;
							 | 
						||
| 
								 | 
							
								use App\Scopes\RestaurantScope;
							 | 
						||
| 
								 | 
							
								use App\CentralLogics\OrderLogic;
							 | 
						||
| 
								 | 
							
								use App\Models\DeliveryManWallet;
							 | 
						||
| 
								 | 
							
								use App\CentralLogics\CouponLogic;
							 | 
						||
| 
								 | 
							
								use Illuminate\Support\Facades\DB;
							 | 
						||
| 
								 | 
							
								use App\CentralLogics\CustomerLogic;
							 | 
						||
| 
								 | 
							
								use App\Http\Controllers\Controller;
							 | 
						||
| 
								 | 
							
								use App\Models\Refund;
							 | 
						||
| 
								 | 
							
								use App\Models\RefundReason;
							 | 
						||
| 
								 | 
							
								use Brian2694\Toastr\Facades\Toastr;
							 | 
						||
| 
								 | 
							
								use Rap2hpoutre\FastExcel\FastExcel;
							 | 
						||
| 
								 | 
							
								use Illuminate\Support\Facades\Route;
							 | 
						||
| 
								 | 
							
								use Grimzy\LaravelMysqlSpatial\Types\Point;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class OrderController extends Controller
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    public function list($status, Request $request)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (session()->has('zone_filter') == false) {
							 | 
						||
| 
								 | 
							
								            session()->put('zone_filter', 0);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (session()->has('order_filter')) {
							 | 
						||
| 
								 | 
							
								            $request = json_decode(session('order_filter'));
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        Order::where(['checked' => 0])->update(['checked' => 1]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $orders = Order::with(['customer', 'restaurant'])
							 | 
						||
| 
								 | 
							
								            ->when(isset($request->zone), function ($query) use ($request) {
							 | 
						||
| 
								 | 
							
								                return $query->whereHas('restaurant', function ($q) use ($request) {
							 | 
						||
| 
								 | 
							
								                    return $q->whereIn('zone_id', $request->zone);
							 | 
						||
| 
								 | 
							
								                });
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'scheduled', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->whereRaw('created_at <> schedule_at');
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'searching_for_deliverymen', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->SearchingForDeliveryman();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'pending', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->Pending();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'accepted', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->AccepteByDeliveryman();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'processing', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->Preparing();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'food_on_the_way', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->FoodOnTheWay();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'delivered', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->Delivered();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'canceled', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->Canceled();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'failed', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->failed();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'requested', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->Refund_requested();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'rejected', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->Refund_request_canceled();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'refunded', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->Refunded();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'scheduled', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->Scheduled();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'on_going', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->Ongoing();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when(($status != 'all' && $status != 'scheduled' && $status != 'canceled' && $status != 'refund_requested' && $status != 'refunded' && $status != 'delivered' && $status != 'failed'), function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->OrderScheduledIn(30);
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when(isset($request->vendor), function ($query) use ($request) {
							 | 
						||
| 
								 | 
							
								                return $query->whereHas('restaurant', function ($query) use ($request) {
							 | 
						||
| 
								 | 
							
								                    return $query->whereIn('id', $request->vendor);
							 | 
						||
| 
								 | 
							
								                });
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when(isset($request->orderStatus) && $status == 'all', function ($query) use ($request) {
							 | 
						||
| 
								 | 
							
								                return $query->whereIn('order_status', $request->orderStatus);
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when(isset($request->scheduled) && $status == 'all', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->scheduled();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when(isset($request->order_type), function ($query) use ($request) {
							 | 
						||
| 
								 | 
							
								                return $query->where('order_type', $request->order_type);
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when(isset($request->from_date) && isset($request->to_date) && $request->from_date != null && $request->to_date != null, function ($query) use ($request) {
							 | 
						||
| 
								 | 
							
								                return $query->whereBetween('created_at', [$request->from_date . " 00:00:00", $request->to_date . " 23:59:59"]);
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->Notpos()
							 | 
						||
| 
								 | 
							
								            ->hasSubscriptionToday()
							 | 
						||
| 
								 | 
							
								            ->orderBy('schedule_at', 'desc')
							 | 
						||
| 
								 | 
							
								            ->paginate(config('default_pagination'));
							 | 
						||
| 
								 | 
							
								        $orderstatus = isset($request->orderStatus) ? $request->orderStatus : [];
							 | 
						||
| 
								 | 
							
								        $scheduled = isset($request->scheduled) ? $request->scheduled : 0;
							 | 
						||
| 
								 | 
							
								        $vendor_ids = isset($request->vendor) ? $request->vendor : [];
							 | 
						||
| 
								 | 
							
								        $zone_ids = isset($request->zone) ? $request->zone : [];
							 | 
						||
| 
								 | 
							
								        $from_date = isset($request->from_date) ? $request->from_date : null;
							 | 
						||
| 
								 | 
							
								        $to_date = isset($request->to_date) ? $request->to_date : null;
							 | 
						||
| 
								 | 
							
								        $order_type = isset($request->order_type) ? $request->order_type : null;
							 | 
						||
| 
								 | 
							
								        $total = $orders->total();
							 | 
						||
| 
								 | 
							
								        // dd($orders);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return view('admin-views.order.list', compact('orders', 'status', 'orderstatus', 'scheduled', 'vendor_ids', 'zone_ids', 'from_date', 'to_date', 'total', 'order_type'));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function export_orders($status, $type, Request $request)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (session()->has('zone_filter') == false) {
							 | 
						||
| 
								 | 
							
								            session()->put('zone_filter', 0);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (session()->has('order_filter')) {
							 | 
						||
| 
								 | 
							
								            $request = json_decode(session('order_filter'));
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $orders = Order::with(['customer', 'restaurant'])
							 | 
						||
| 
								 | 
							
								            ->when(isset($request->zone), function ($query) use ($request) {
							 | 
						||
| 
								 | 
							
								                return $query->whereHas('restaurant', function ($q) use ($request) {
							 | 
						||
| 
								 | 
							
								                    return $q->whereIn('zone_id', $request->zone);
							 | 
						||
| 
								 | 
							
								                });
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'scheduled', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->whereRaw('created_at <> schedule_at');
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'searching_for_deliverymen', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->SearchingForDeliveryman();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'pending', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->Pending();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'accepted', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->AccepteByDeliveryman();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'processing', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->Preparing();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'food_on_the_way', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->FoodOnTheWay();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'delivered', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->Delivered();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'canceled', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->Canceled();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'failed', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->failed();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'requested', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->Refund_requested();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'rejected', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->Refund_request_canceled();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'refunded', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->Refunded();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'requested', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->Refund_requested();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'rejected', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->Refund_request_canceled();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'scheduled', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->Scheduled();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'on_going', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->Ongoing();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when(($status != 'all' && $status != 'scheduled' && $status != 'canceled' && $status != 'refund_requested' && $status != 'refunded' && $status != 'delivered' && $status != 'failed'), function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->OrderScheduledIn(30);
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when(isset($request->vendor), function ($query) use ($request) {
							 | 
						||
| 
								 | 
							
								                return $query->whereHas('restaurant', function ($query) use ($request) {
							 | 
						||
| 
								 | 
							
								                    return $query->whereIn('id', $request->vendor);
							 | 
						||
| 
								 | 
							
								                });
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when(isset($request->orderStatus) && $status == 'all', function ($query) use ($request) {
							 | 
						||
| 
								 | 
							
								                return $query->whereIn('order_status', $request->orderStatus);
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when(isset($request->scheduled) && $status == 'all', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->scheduled();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when(isset($request->order_type), function ($query) use ($request) {
							 | 
						||
| 
								 | 
							
								                return $query->where('order_type', $request->order_type);
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when(isset($request->from_date) && isset($request->to_date) && $request->from_date != null && $request->to_date != null, function ($query) use ($request) {
							 | 
						||
| 
								 | 
							
								                return $query->whereBetween('created_at', [$request->from_date . " 00:00:00", $request->to_date . " 23:59:59"]);
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->Notpos()
							 | 
						||
| 
								 | 
							
								            ->orderBy('schedule_at', 'desc')
							 | 
						||
| 
								 | 
							
								            ->get();
							 | 
						||
| 
								 | 
							
								        if ($type == 'excel') {
							 | 
						||
| 
								 | 
							
								            return (new FastExcel(OrderLogic::format_export_data($orders)))->download('Orders.xlsx');
							 | 
						||
| 
								 | 
							
								        } else if ($type == 'csv') {
							 | 
						||
| 
								 | 
							
								            return (new FastExcel(OrderLogic::format_export_data($orders)))->download('Orders.csv');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return (new FastExcel(OrderLogic::format_export_data($orders)))->download('Orders.xlsx');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function dispatch_list($status, Request $request)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (session()->has('order_filter')) {
							 | 
						||
| 
								 | 
							
								            $request = json_decode(session('order_filter'));
							 | 
						||
| 
								 | 
							
								            $zone_ids = isset($request->zone) ? $request->zone : 0;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $key = explode(' ', $request['search']);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        Order::where(['checked' => 0])->update(['checked' => 1]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $orders = Order::with(['customer', 'restaurant'])
							 | 
						||
| 
								 | 
							
								            ->when(isset($request->zone), function ($query) use ($request) {
							 | 
						||
| 
								 | 
							
								                return $query->whereHas('restaurant', function ($query) use ($request) {
							 | 
						||
| 
								 | 
							
								                    return $query->whereIn('zone_id', $request->zone);
							 | 
						||
| 
								 | 
							
								                });
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'searching_for_deliverymen', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->SearchingForDeliveryman();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when($status == 'on_going', function ($query) {
							 | 
						||
| 
								 | 
							
								                return $query->Ongoing();
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when(isset($request->vendor), function ($query) use ($request) {
							 | 
						||
| 
								 | 
							
								                return $query->whereHas('restaurant', function ($query) use ($request) {
							 | 
						||
| 
								 | 
							
								                    return $query->whereIn('id', $request->vendor);
							 | 
						||
| 
								 | 
							
								                });
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when(isset($key),function($query) use($key){
							 | 
						||
| 
								 | 
							
								                $query->where(function ($q) use ($key) {
							 | 
						||
| 
								 | 
							
								                    foreach ($key as $value) {
							 | 
						||
| 
								 | 
							
								                        $q->orWhere('id', 'like', "%{$value}%")
							 | 
						||
| 
								 | 
							
								                            ->orWhere('order_status', 'like', "%{$value}%")
							 | 
						||
| 
								 | 
							
								                            ->orWhere('transaction_reference', 'like', "%{$value}%");
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                });
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								            ->when(isset($request->from_date) && isset($request->to_date) && $request->from_date != null && $request->to_date != null, function ($query) use ($request) {
							 | 
						||
| 
								 | 
							
								                return $query->whereBetween('created_at', [$request->from_date . " 00:00:00", $request->to_date . " 23:59:59"]);
							 | 
						||
| 
								 | 
							
								            })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            ->Notpos()
							 | 
						||
| 
								 | 
							
								            ->OrderScheduledIn(30)
							 | 
						||
| 
								 | 
							
								            ->orderBy('schedule_at', 'desc')
							 | 
						||
| 
								 | 
							
								            ->paginate(config('default_pagination'));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $orderstatus = isset($request->orderStatus) ? $request->orderStatus : [];
							 | 
						||
| 
								 | 
							
								        $scheduled = isset($request->scheduled) ? $request->scheduled : 0;
							 | 
						||
| 
								 | 
							
								        $vendor_ids = isset($request->vendor) ? $request->vendor : [];
							 | 
						||
| 
								 | 
							
								        $zone_ids = isset($request->zone) ? $request->zone : [];
							 | 
						||
| 
								 | 
							
								        $from_date = isset($request->from_date) ? $request->from_date : null;
							 | 
						||
| 
								 | 
							
								        $to_date = isset($request->to_date) ? $request->to_date : null;
							 | 
						||
| 
								 | 
							
								        $total = $orders->total();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return view('admin-views.order.distaptch_list', compact('orders', 'status', 'orderstatus', 'scheduled', 'vendor_ids', 'zone_ids', 'from_date', 'to_date', 'total'));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function refund_settings()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $refund_active_status = BusinessSetting::where(['key'=>'refund_active_status'])->first();
							 | 
						||
| 
								 | 
							
								        $reasons=RefundReason::orderBy('id', 'desc')
							 | 
						||
| 
								 | 
							
								        ->paginate(config('default_pagination'));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return view('admin-views.refund.index', compact('refund_active_status','reasons'));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function refund_reason(Request $request)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $request->validate([
							 | 
						||
| 
								 | 
							
								            'reason' => 'required|string|max:191',
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								        RefundReason::create([
							 | 
						||
| 
								 | 
							
								            'reason' => $request->reason,
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        Toastr::success(translate('Refund Reason Added Successfully'));
							 | 
						||
| 
								 | 
							
								        return back();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    public function reason_edit(Request $request)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $request->validate([
							 | 
						||
| 
								 | 
							
								            'reason' => 'required|max:100',
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								        $refund_reason = RefundReason::findOrFail($request->reason_id);
							 | 
						||
| 
								 | 
							
								        $refund_reason->reason = $request->reason;
							 | 
						||
| 
								 | 
							
								        $refund_reason->save();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        Toastr::success(translate('Refund Reason Updated Successfully'));
							 | 
						||
| 
								 | 
							
								        return back();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    public function reason_status(Request $request)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $refund_reason = RefundReason::findOrFail($request->id);
							 | 
						||
| 
								 | 
							
								        $refund_reason->status = $request->status;
							 | 
						||
| 
								 | 
							
								        $refund_reason->save();
							 | 
						||
| 
								 | 
							
								        Toastr::success(translate('messages.status_updated'));
							 | 
						||
| 
								 | 
							
								        return back();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    public function reason_delete(Request $request)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $refund_reason = RefundReason::findOrFail($request->id);
							 | 
						||
| 
								 | 
							
								        $refund_reason->delete();
							 | 
						||
| 
								 | 
							
								        Toastr::success(translate('Refund Reason Deleted Successfully'));
							 | 
						||
| 
								 | 
							
								        return back();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function order_refund_rejection(Request $request){
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $request->validate([
							 | 
						||
| 
								 | 
							
								            'order_id' => 'required',
							 | 
						||
| 
								 | 
							
								            'admin_note' => 'nullable|string|max:65535',
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								            Refund::where('order_id', $request->order_id)->update([
							 | 
						||
| 
								 | 
							
								                'order_status' => 'refund_request_canceled',
							 | 
						||
| 
								 | 
							
								                'admin_note'=>$request->admin_note ?? null,
							 | 
						||
| 
								 | 
							
								                'refund_status'=>'rejected',
							 | 
						||
| 
								 | 
							
								                'refund_method'=>'canceled',
							 | 
						||
| 
								 | 
							
								            ]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            $order = Order::Notpos()->find($request->order_id);
							 | 
						||
| 
								 | 
							
								            $order->order_status = 'refund_request_canceled';
							 | 
						||
| 
								 | 
							
								            $order->refund_request_canceled = now();
							 | 
						||
| 
								 | 
							
								            $order->save();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            Toastr::success(translate('Refund Rejection Successfully'));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (!Helpers::send_order_notification($order)) {
							 | 
						||
| 
								 | 
							
								                Toastr::warning(translate('messages.push_notification_faild'));
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            return back();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function refund_mode()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $refund_mode = BusinessSetting::where('key', 'refund_active_status')->first();
							 | 
						||
| 
								 | 
							
								        if (isset($refund_mode) == false) {
							 | 
						||
| 
								 | 
							
								            DB::table('business_settings')->insert([
							 | 
						||
| 
								 | 
							
								                'key' => 'refund_active_status',
							 | 
						||
| 
								 | 
							
								                'value' => 1,
							 | 
						||
| 
								 | 
							
								                'created_at' => now(),
							 | 
						||
| 
								 | 
							
								                'updated_at' => now(),
							 | 
						||
| 
								 | 
							
								            ]);
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            DB::table('business_settings')->where(['key' => 'refund_active_status'])->update([
							 | 
						||
| 
								 | 
							
								                'key' => 'refund_active_status',
							 | 
						||
| 
								 | 
							
								                'value' => $refund_mode->value == 1 ? 0 : 1,
							 | 
						||
| 
								 | 
							
								                'updated_at' => now(),
							 | 
						||
| 
								 | 
							
								            ]);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (isset($refund_mode) && $refund_mode->value){
							 | 
						||
| 
								 | 
							
								            return response()->json(['message'=>'Order Refund Request Mode is off.']);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return response()->json(['message'=>'Order Refund Request Mode is on.']);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function details(Request $request, $id)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        // OrderLogic::create_subscription_log($id);
							 | 
						||
| 
								 | 
							
								        $order = Order::with(['subscription','subscription.schedule_today','details', 'refund','restaurant' => function ($query) {
							 | 
						||
| 
								 | 
							
								            return $query->withCount('orders');
							 | 
						||
| 
								 | 
							
								        }, 'customer' => function ($query) {
							 | 
						||
| 
								 | 
							
								            return $query->withCount('orders');
							 | 
						||
| 
								 | 
							
								        }, 'delivery_man' => function ($query) {
							 | 
						||
| 
								 | 
							
								            return $query->withCount('orders');
							 | 
						||
| 
								 | 
							
								        }, 'details.food' => function ($query) {
							 | 
						||
| 
								 | 
							
								            return $query->withoutGlobalScope(RestaurantScope::class);
							 | 
						||
| 
								 | 
							
								        }, 'details.campaign' => function ($query) {
							 | 
						||
| 
								 | 
							
								            return $query->withoutGlobalScope(RestaurantScope::class);
							 | 
						||
| 
								 | 
							
								        }])->where(['id' => $id])->Notpos()->first();
							 | 
						||
| 
								 | 
							
								        if (isset($order)) {
							 | 
						||
| 
								 | 
							
								            if (isset($order->restaurant) && (($order->restaurant->self_delivery_system && $order->restaurant->restaurant_model == 'commission') ||
							 | 
						||
| 
								 | 
							
								            ($order->restaurant->restaurant_model == 'subscription' &&  isset($order->restaurant->restaurant_sub) && $order->restaurant->restaurant_sub->self_delivery == 1) ) ) {
							 | 
						||
| 
								 | 
							
								                $deliveryMen = DeliveryMan::where('restaurant_id', $order->restaurant_id)->available()->active()->get();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            } else {
							 | 
						||
| 
								 | 
							
								                if($order->restaurant !== null){
							 | 
						||
| 
								 | 
							
								                    $deliveryMen = DeliveryMan::where('zone_id', $order->restaurant->zone_id)->where(function($query)use($order){
							 | 
						||
| 
								 | 
							
								                            $query->where('vehicle_id',$order->vehicle_id)->orWhereNull('vehicle_id');
							 | 
						||
| 
								 | 
							
								                    })
							 | 
						||
| 
								 | 
							
								                    ->available()->active()->get();
							 | 
						||
| 
								 | 
							
								                } else{
							 | 
						||
| 
								 | 
							
								                    $deliveryMen = DeliveryMan::where('zone_id', '=', NULL)->where('vehicle_id',$order->vehicle_id)->active()->get();
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            $category = $request->query('category_id', 0);
							 | 
						||
| 
								 | 
							
								            // $sub_category = $request->query('sub_category', 0);
							 | 
						||
| 
								 | 
							
								            $categories = Category::active()->get();
							 | 
						||
| 
								 | 
							
								            $keyword = $request->query('keyword', false);
							 | 
						||
| 
								 | 
							
								            $key = explode(' ', $keyword);
							 | 
						||
| 
								 | 
							
								            $products = Food::withoutGlobalScope(RestaurantScope::class)->where('restaurant_id', $order->restaurant_id)
							 | 
						||
| 
								 | 
							
								                ->when($category, function ($query) use ($category) {
							 | 
						||
| 
								 | 
							
								                    $query->whereHas('category', function ($q) use ($category) {
							 | 
						||
| 
								 | 
							
								                        return $q->whereId($category)->orWhere('parent_id', $category);
							 | 
						||
| 
								 | 
							
								                    });
							 | 
						||
| 
								 | 
							
								                })
							 | 
						||
| 
								 | 
							
								                ->when($keyword, function ($query) use ($key) {
							 | 
						||
| 
								 | 
							
								                    return $query->where(function ($q) use ($key) {
							 | 
						||
| 
								 | 
							
								                        foreach ($key as $value) {
							 | 
						||
| 
								 | 
							
								                            $q->orWhere('name', 'like', "%{$value}%");
							 | 
						||
| 
								 | 
							
								                        }
							 | 
						||
| 
								 | 
							
								                    });
							 | 
						||
| 
								 | 
							
								                })
							 | 
						||
| 
								 | 
							
								                ->latest()->paginate(10);
							 | 
						||
| 
								 | 
							
								            $editing = false;
							 | 
						||
| 
								 | 
							
								            if ($request->session()->has('order_cart')) {
							 | 
						||
| 
								 | 
							
								                $cart = session()->get('order_cart');
							 | 
						||
| 
								 | 
							
								                if (count($cart) > 0 && $cart[0]->order_id == $order->id) {
							 | 
						||
| 
								 | 
							
								                    $editing = true;
							 | 
						||
| 
								 | 
							
								                } else {
							 | 
						||
| 
								 | 
							
								                    session()->forget('order_cart');
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            $deliveryMen = Helpers::deliverymen_list_formatting($deliveryMen);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return view('admin-views.order.order-view', compact('order', 'deliveryMen', 'categories', 'products', 'category', 'keyword', 'editing'));
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            Toastr::info(translate('messages.no_more_orders'));
							 | 
						||
| 
								 | 
							
								            return back();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function search(Request $request)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $key = explode(' ', $request['search']);
							 | 
						||
| 
								 | 
							
								        $orders = Order::where(function ($q) use ($key) {
							 | 
						||
| 
								 | 
							
								            foreach ($key as $value) {
							 | 
						||
| 
								 | 
							
								                $q->orWhere('id', 'like', "%{$value}%")
							 | 
						||
| 
								 | 
							
								                    ->orWhere('order_status', 'like', "%{$value}%")
							 | 
						||
| 
								 | 
							
								                    ->orWhere('transaction_reference', 'like', "%{$value}%");
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        })->Notpos()->limit(50)->get();
							 | 
						||
| 
								 | 
							
								        return response()->json([
							 | 
						||
| 
								 | 
							
								            'view' => view('admin-views.order.partials._table', compact('orders'))->render()
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function status(Request $request)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $request->validate([
							 | 
						||
| 
								 | 
							
								            'reason'=>'required_if:order_status,canceled'
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								        $order = Order::Notpos()->find($request->id);
							 | 
						||
| 
								 | 
							
								        if (in_array($order->order_status, ['refunded', 'failed'])) {
							 | 
						||
| 
								 | 
							
								            Toastr::warning(translate('messages.you_can_not_change_the_status_of_a_completed_order'));
							 | 
						||
| 
								 | 
							
								            return back();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (in_array($order->order_status, ['refund_requested']) && BusinessSetting::where(['key'=>'refund_active_status'])->first()->value == false)  {
							 | 
						||
| 
								 | 
							
								            Toastr::warning(translate('Refund Option is not active. Please active it from Refund Settings'));
							 | 
						||
| 
								 | 
							
								            return back();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if ($order['delivery_man_id'] == null && $request->order_status == 'out_for_delivery') {
							 | 
						||
| 
								 | 
							
								            Toastr::warning(translate('messages.please_assign_deliveryman_first'));
							 | 
						||
| 
								 | 
							
								            return back();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if ($request->order_status == 'delivered' && $order['transaction_reference'] == null && !in_array($order['payment_method'],['cash_on_delivery','wallet'])) {
							 | 
						||
| 
								 | 
							
								            Toastr::warning(translate('messages.add_your_paymen_ref_first'));
							 | 
						||
| 
								 | 
							
								            return back();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if ($request->order_status == 'delivered') {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if ($order->transaction  == null || isset($order->subscription_id)) {
							 | 
						||
| 
								 | 
							
								                if ($order->payment_method == "cash_on_delivery") {
							 | 
						||
| 
								 | 
							
								                    if ($order->order_type == 'take_away') {
							 | 
						||
| 
								 | 
							
								                        $ol = OrderLogic::create_transaction($order, 'restaurant', null);
							 | 
						||
| 
								 | 
							
								                    } else if ($order->delivery_man_id) {
							 | 
						||
| 
								 | 
							
								                        $ol =  OrderLogic::create_transaction($order, 'deliveryman', null);
							 | 
						||
| 
								 | 
							
								                    } else if ($order->user_id) {
							 | 
						||
| 
								 | 
							
								                        $ol =  OrderLogic::create_transaction($order, false, null);
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                } else {
							 | 
						||
| 
								 | 
							
								                    $ol = OrderLogic::create_transaction($order, 'admin', null);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                if (!$ol) {
							 | 
						||
| 
								 | 
							
								                    Toastr::warning(translate('messages.faield_to_create_order_transaction'));
							 | 
						||
| 
								 | 
							
								                    return back();
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            } else if ($order->delivery_man_id) {
							 | 
						||
| 
								 | 
							
								                $order->transaction->update(['delivery_man_id' => $order->delivery_man_id]);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            $order->payment_status = 'paid';
							 | 
						||
| 
								 | 
							
								            if ($order->delivery_man) {
							 | 
						||
| 
								 | 
							
								                $dm = $order->delivery_man;
							 | 
						||
| 
								 | 
							
								                $dm->increment('order_count');
							 | 
						||
| 
								 | 
							
								                $dm->current_orders = $dm->current_orders > 1 ? $dm->current_orders - 1 : 0;
							 | 
						||
| 
								 | 
							
								                $dm->save();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            $order->details->each(function ($item, $key) {
							 | 
						||
| 
								 | 
							
								                if ($item->food) {
							 | 
						||
| 
								 | 
							
								                    $item->food->increment('order_count');
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            });
							 | 
						||
| 
								 | 
							
								            $order->customer ?  $order->customer->increment('order_count') : '';
							 | 
						||
| 
								 | 
							
								            $order->restaurant->increment('order_count');
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            else if ($request->order_status == 'refunded' && BusinessSetting::where('key', 'refund_active_status')->first()->value == 1) {
							 | 
						||
| 
								 | 
							
								                    if ($order->payment_status == "unpaid") {
							 | 
						||
| 
								 | 
							
								                        Toastr::warning(translate('messages.you_can_not_refund_a_cod_order'));
							 | 
						||
| 
								 | 
							
								                        return back();
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                    if (isset($order->delivered)) {
							 | 
						||
| 
								 | 
							
								                        $rt = OrderLogic::refund_order($order);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                        if (!$rt) {
							 | 
						||
| 
								 | 
							
								                            Toastr::warning(translate('messages.faield_to_create_order_transaction'));
							 | 
						||
| 
								 | 
							
								                            return back();
							 | 
						||
| 
								 | 
							
								                        }
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                    $refund_method= $request->refund_method  ?? 'manual';
							 | 
						||
| 
								 | 
							
								                    $wallet_status= BusinessSetting::where('key','wallet_status')->first()->value;
							 | 
						||
| 
								 | 
							
								                $refund_to_wallet= BusinessSetting::where('key', 'wallet_add_refund')->first()->value;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                if ($order->payment_status == "paid" && $wallet_status == 1 && $refund_to_wallet==1) {
							 | 
						||
| 
								 | 
							
								                    $refund_amount = round($order->order_amount - $order->delivery_charge - $order->dm_tips, config('round_up_to_digit'));
							 | 
						||
| 
								 | 
							
								                    CustomerLogic::create_wallet_transaction($order->user_id, $refund_amount, 'order_refund', $order->id);
							 | 
						||
| 
								 | 
							
								                    Toastr::info(translate('Refunded amount added to customer wallet'));
							 | 
						||
| 
								 | 
							
								                    $refund_method='wallet';
							 | 
						||
| 
								 | 
							
								                }else{
							 | 
						||
| 
								 | 
							
								                        Toastr::warning(translate('Customer Wallet Refund is not active.Plase Manage the Refund Amount Manually'));
							 | 
						||
| 
								 | 
							
								                        $refund_method=$request->refund_method  ?? 'manual';
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    Refund::where('order_id', $order->id)->update([
							 | 
						||
| 
								 | 
							
								                        'order_status' => 'refunded',
							 | 
						||
| 
								 | 
							
								                        'admin_note'=>$request->admin_note ?? null,
							 | 
						||
| 
								 | 
							
								                        'refund_status'=>'approved',
							 | 
						||
| 
								 | 
							
								                        'refund_method'=>$refund_method,
							 | 
						||
| 
								 | 
							
								                    ]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    Helpers::increment_order_count($order->restaurant);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    if ($order->delivery_man) {
							 | 
						||
| 
								 | 
							
								                        $dm = $order->delivery_man;
							 | 
						||
| 
								 | 
							
								                        $dm->current_orders = $dm->current_orders > 1 ? $dm->current_orders - 1 : 0;
							 | 
						||
| 
								 | 
							
								                        $dm->save();
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        else if ($request->order_status == 'canceled') {
							 | 
						||
| 
								 | 
							
								            if (in_array($order->order_status, ['delivered', 'canceled', 'refund_requested', 'refunded', 'failed', 'picked_up']) || $order->picked_up) {
							 | 
						||
| 
								 | 
							
								                Toastr::warning(translate('messages.you_can_not_cancel_a_completed_order'));
							 | 
						||
| 
								 | 
							
								                return back();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            // if(isset($order->confirmed) && isset($order->subscription_id)){
							 | 
						||
| 
								 | 
							
								            //     Toastr::warning(translate('messages.you_can_not_cancel_this_subscription_order_because_it_is_already_confirmed'));
							 | 
						||
| 
								 | 
							
								            //     return back();
							 | 
						||
| 
								 | 
							
								            // }
							 | 
						||
| 
								 | 
							
								            if(isset($order->subscription_id)){
							 | 
						||
| 
								 | 
							
								                $order->subscription()->update(['status' => 'canceled']);
							 | 
						||
| 
								 | 
							
								                if($order->subscription->log){
							 | 
						||
| 
								 | 
							
								                    $order->subscription->log()->update([
							 | 
						||
| 
								 | 
							
								                        'order_status' => $request->status,
							 | 
						||
| 
								 | 
							
								                        'canceled' => now(),
							 | 
						||
| 
								 | 
							
								                        ]);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            $order->cancellation_reason = $request->reason;
							 | 
						||
| 
								 | 
							
								            $order->canceled_by = 'admin';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if ($order->delivery_man) {
							 | 
						||
| 
								 | 
							
								                $dm = $order->delivery_man;
							 | 
						||
| 
								 | 
							
								                $dm->current_orders = $dm->current_orders > 1 ? $dm->current_orders - 1 : 0;
							 | 
						||
| 
								 | 
							
								                $dm->save();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            Helpers::increment_order_count($order->restaurant);
							 | 
						||
| 
								 | 
							
								            OrderLogic::refund_before_delivered($order);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $order->order_status = $request->order_status;
							 | 
						||
| 
								 | 
							
								        if($request->order_status == 'processing') {
							 | 
						||
| 
								 | 
							
								            $order->processing_time = isset($request->processing_time) ? $request->processing_time : explode('-', $order['restaurant']['delivery_time'])[0];
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $order[$request->order_status] = now();
							 | 
						||
| 
								 | 
							
								        $order->save();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        OrderLogic::update_subscription_log($order);
							 | 
						||
| 
								 | 
							
								        if (!Helpers::send_order_notification($order)) {
							 | 
						||
| 
								 | 
							
								            Toastr::warning(translate('messages.push_notification_faild'));
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        Toastr::success(translate('messages.order') . translate('messages.status_updated'));
							 | 
						||
| 
								 | 
							
								        return back();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function add_delivery_man($order_id, $delivery_man_id)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if ($delivery_man_id == 0) {
							 | 
						||
| 
								 | 
							
								            return response()->json(['message' => translate('messages.deliveryman') . ' ' . translate('messages.not_found')], 404);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $order = Order::Notpos()->with(['subscription.schedule_today'])->find($order_id);
							 | 
						||
| 
								 | 
							
								        $deliveryman = DeliveryMan::where('id', $delivery_man_id)->available()->active()->first();
							 | 
						||
| 
								 | 
							
								        if ($order->delivery_man_id == $delivery_man_id) {
							 | 
						||
| 
								 | 
							
								            return response()->json(['message' => translate('messages.order_already_assign_to_this_deliveryman')], 400);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if ($deliveryman) {
							 | 
						||
| 
								 | 
							
								            if ($deliveryman->current_orders >= config('dm_maximum_orders')) {
							 | 
						||
| 
								 | 
							
								                return response()->json(['message' => translate('messages.dm_maximum_order_exceed_warning')], 400);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            $cash_in_hand = isset($deliveryman->wallet) ? $deliveryman->wallet->collected_cash : 0;
							 | 
						||
| 
								 | 
							
								            $dm_max_cash=BusinessSetting::where('key','dm_max_cash_in_hand')->first();
							 | 
						||
| 
								 | 
							
								            $value= $dm_max_cash ? $dm_max_cash->value : 0;
							 | 
						||
| 
								 | 
							
								            if($order->payment_method == "cash_on_delivery" && (($cash_in_hand+$order->order_amount) >= $value)){
							 | 
						||
| 
								 | 
							
								                return response()->json(['message'=>translate('delivery man max cash in hand exceeds')], 400);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            if ($order->delivery_man) {
							 | 
						||
| 
								 | 
							
								                $dm = $order->delivery_man;
							 | 
						||
| 
								 | 
							
								                $dm->current_orders = $dm->current_orders > 1 ? $dm->current_orders - 1 : 0;
							 | 
						||
| 
								 | 
							
								                // $dm->decrement('assigned_order_count');
							 | 
						||
| 
								 | 
							
								                $dm->save();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                $data = [
							 | 
						||
| 
								 | 
							
								                    'title' => translate('messages.order_push_title'),
							 | 
						||
| 
								 | 
							
								                    'description' => translate('messages.you_are_unassigned_from_a_order'),
							 | 
						||
| 
								 | 
							
								                    'order_id' => '',
							 | 
						||
| 
								 | 
							
								                    'image' => '',
							 | 
						||
| 
								 | 
							
								                    'type' => 'assign'
							 | 
						||
| 
								 | 
							
								                ];
							 | 
						||
| 
								 | 
							
								                Helpers::send_push_notif_to_device($dm->fcm_token, $data);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                DB::table('user_notifications')->insert([
							 | 
						||
| 
								 | 
							
								                    'data' => json_encode($data),
							 | 
						||
| 
								 | 
							
								                    'delivery_man_id' => $dm->id,
							 | 
						||
| 
								 | 
							
								                    'created_at' => now(),
							 | 
						||
| 
								 | 
							
								                    'updated_at' => now()
							 | 
						||
| 
								 | 
							
								                ]);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            $order->delivery_man_id = $delivery_man_id;
							 | 
						||
| 
								 | 
							
								            $order->order_status = in_array($order->order_status, ['pending', 'confirmed']) ? 'accepted' : $order->order_status;
							 | 
						||
| 
								 | 
							
								            $order->accepted = now();
							 | 
						||
| 
								 | 
							
								            $order->save();
							 | 
						||
| 
								 | 
							
								            OrderLogic::update_subscription_log($order);
							 | 
						||
| 
								 | 
							
								            $deliveryman->current_orders = $deliveryman->current_orders + 1;
							 | 
						||
| 
								 | 
							
								            $deliveryman->save();
							 | 
						||
| 
								 | 
							
								            $deliveryman->increment('assigned_order_count');
							 | 
						||
| 
								 | 
							
								            $value = Helpers::order_status_update_message('accepted');
							 | 
						||
| 
								 | 
							
								            try {
							 | 
						||
| 
								 | 
							
								                if ($value && $order->customer) {
							 | 
						||
| 
								 | 
							
								                    $fcm_token = $order->customer->cm_firebase_token;
							 | 
						||
| 
								 | 
							
								                    $data = [
							 | 
						||
| 
								 | 
							
								                        'title' => translate('messages.order_push_title'),
							 | 
						||
| 
								 | 
							
								                        'description' => $value,
							 | 
						||
| 
								 | 
							
								                        'order_id' => $order['id'],
							 | 
						||
| 
								 | 
							
								                        'image' => '',
							 | 
						||
| 
								 | 
							
								                        'type' => 'order_status'
							 | 
						||
| 
								 | 
							
								                    ];
							 | 
						||
| 
								 | 
							
								                    Helpers::send_push_notif_to_device($fcm_token, $data);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    DB::table('user_notifications')->insert([
							 | 
						||
| 
								 | 
							
								                        'data' => json_encode($data),
							 | 
						||
| 
								 | 
							
								                        'user_id' => $order->customer->id,
							 | 
						||
| 
								 | 
							
								                        'created_at' => now(),
							 | 
						||
| 
								 | 
							
								                        'updated_at' => now()
							 | 
						||
| 
								 | 
							
								                    ]);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                $data = [
							 | 
						||
| 
								 | 
							
								                    'title' => translate('messages.order_push_title'),
							 | 
						||
| 
								 | 
							
								                    'description' => translate('messages.you_are_assigned_to_a_order'),
							 | 
						||
| 
								 | 
							
								                    'order_id' => $order['id'],
							 | 
						||
| 
								 | 
							
								                    'image' => '',
							 | 
						||
| 
								 | 
							
								                    'type' => 'assign'
							 | 
						||
| 
								 | 
							
								                ];
							 | 
						||
| 
								 | 
							
								                Helpers::send_push_notif_to_device($deliveryman->fcm_token, $data);
							 | 
						||
| 
								 | 
							
								                DB::table('user_notifications')->insert([
							 | 
						||
| 
								 | 
							
								                    'data' => json_encode($data),
							 | 
						||
| 
								 | 
							
								                    'delivery_man_id' => $deliveryman->id,
							 | 
						||
| 
								 | 
							
								                    'created_at' => now(),
							 | 
						||
| 
								 | 
							
								                    'updated_at' => now()
							 | 
						||
| 
								 | 
							
								                ]);
							 | 
						||
| 
								 | 
							
								            } catch (\Exception $e) {
							 | 
						||
| 
								 | 
							
								                info($e);
							 | 
						||
| 
								 | 
							
								                Toastr::warning(translate('messages.push_notification_faild'));
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            return response()->json([], 200);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return response()->json(['message' => translate('Deliveryman not available!')], 400);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    public function update_shipping(Request $request, Order $order)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $request->validate([
							 | 
						||
| 
								 | 
							
								            'contact_person_name' => 'required',
							 | 
						||
| 
								 | 
							
								            'address_type' => 'required',
							 | 
						||
| 
								 | 
							
								            'contact_person_number' => 'required',
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								        if ($request->latitude && $request->longitude) {
							 | 
						||
| 
								 | 
							
								            $point = new Point($request->latitude, $request->longitude);
							 | 
						||
| 
								 | 
							
								            $zone = Zone::where('id', $order->restaurant->zone_id)->contains('coordinates', $point)->first();
							 | 
						||
| 
								 | 
							
								            if (!$zone) {
							 | 
						||
| 
								 | 
							
								                Toastr::error(translate('messages.out_of_coverage'));
							 | 
						||
| 
								 | 
							
								                return back();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $address = [
							 | 
						||
| 
								 | 
							
								            'contact_person_name' => $request->contact_person_name,
							 | 
						||
| 
								 | 
							
								            'contact_person_number' => $request->contact_person_number,
							 | 
						||
| 
								 | 
							
								            'address_type' => $request->address_type,
							 | 
						||
| 
								 | 
							
								            'address' => $request->address,
							 | 
						||
| 
								 | 
							
								            'longitude' => $request->longitude,
							 | 
						||
| 
								 | 
							
								            'latitude' => $request->latitude,
							 | 
						||
| 
								 | 
							
								            'floor' => $request->floor,
							 | 
						||
| 
								 | 
							
								            'house' => $request->house,
							 | 
						||
| 
								 | 
							
								            'road' => $request->road,
							 | 
						||
| 
								 | 
							
								        ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $order->delivery_address = json_encode($address);
							 | 
						||
| 
								 | 
							
								        $order->save();
							 | 
						||
| 
								 | 
							
								        Toastr::success(translate('messages.delivery_address_updated'));
							 | 
						||
| 
								 | 
							
								        return back();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function generate_invoice($id)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $order = Order::Notpos()->where('id', $id)->first();
							 | 
						||
| 
								 | 
							
								        return view('admin-views.order.invoice', compact('order'));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function add_payment_ref_code(Request $request, $id)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $request->validate([
							 | 
						||
| 
								 | 
							
								            'transaction_reference' => 'max:30'
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								        Order::Notpos()->where(['id' => $id])->update([
							 | 
						||
| 
								 | 
							
								            'transaction_reference' => $request['transaction_reference']
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        Toastr::success(translate('messages.payment_reference_code_is_added'));
							 | 
						||
| 
								 | 
							
								        return back();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function restaurnt_filter($id)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        session()->put('restaurnt_filter', $id);
							 | 
						||
| 
								 | 
							
								        return back();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function filter(Request $request)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $request->validate([
							 | 
						||
| 
								 | 
							
								            'from_date' => 'required_if:to_date,true',
							 | 
						||
| 
								 | 
							
								            'to_date' => 'required_if:from_date,true',
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								        session()->put('order_filter', json_encode($request->all()));
							 | 
						||
| 
								 | 
							
								        return back();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    public function filter_reset(Request $request)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        session()->forget('order_filter');
							 | 
						||
| 
								 | 
							
								        return back();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function add_to_cart(Request $request)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if ($request->item_type == 'food') {
							 | 
						||
| 
								 | 
							
								            $product = Food::withOutGlobalScope(RestaurantScope::class)->find($request->id);
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            $product = ItemCampaign::withOutGlobalScope(RestaurantScope::class)->find($request->id);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $data = new OrderDetail();
							 | 
						||
| 
								 | 
							
								        if ($request->order_details_id) {
							 | 
						||
| 
								 | 
							
								            $data['id'] = $request->order_details_id;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $data['food_id'] = $request->item_type == 'food' ? $product->id : null;
							 | 
						||
| 
								 | 
							
								        $data['item_campaign_id'] = $request->item_type == 'campaign' ? $product->id : null;
							 | 
						||
| 
								 | 
							
								        $data['food'] = $request->item_type == 'food' ? $product : null;
							 | 
						||
| 
								 | 
							
								        $data['item_campaign'] = $request->item_type == 'campaign' ? $product : null;
							 | 
						||
| 
								 | 
							
								        $data['order_id'] = $request->order_id;
							 | 
						||
| 
								 | 
							
								        $variations = [];
							 | 
						||
| 
								 | 
							
								        $price = 0;
							 | 
						||
| 
								 | 
							
								        $addon_price = 0;
							 | 
						||
| 
								 | 
							
								        $variation_price=0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $product_variations = json_decode($product->variations, true);
							 | 
						||
| 
								 | 
							
								        if ($request->variations && count($product_variations)) {
							 | 
						||
| 
								 | 
							
								            foreach($request->variations  as $key=> $value ){
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                if($value['required'] == 'on' &&  isset($value['values']) == false){
							 | 
						||
| 
								 | 
							
								                    return response()->json([
							 | 
						||
| 
								 | 
							
								                        'data' => 'variation_error',
							 | 
						||
| 
								 | 
							
								                        'message' => translate('Please select items from') . ' ' . $value['name'],
							 | 
						||
| 
								 | 
							
								                    ]);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                if(isset($value['values'])  && $value['min'] != 0 && $value['min'] > count($value['values']['label'])){
							 | 
						||
| 
								 | 
							
								                    return response()->json([
							 | 
						||
| 
								 | 
							
								                        'data' => 'variation_error',
							 | 
						||
| 
								 | 
							
								                        'message' => translate('Please select minimum ').$value['min'].translate(' For ').$value['name'].'.',
							 | 
						||
| 
								 | 
							
								                    ]);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                if(isset($value['values']) && $value['max'] != 0 && $value['max'] < count($value['values']['label'])){
							 | 
						||
| 
								 | 
							
								                    return response()->json([
							 | 
						||
| 
								 | 
							
								                        'data' => 'variation_error',
							 | 
						||
| 
								 | 
							
								                        'message' => translate('Please select maximum ').$value['max'].translate(' For ').$value['name'].'.',
							 | 
						||
| 
								 | 
							
								                    ]);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            $variation_data = Helpers::get_varient($product_variations, $request->variations);
							 | 
						||
| 
								 | 
							
								            $variation_price = $variation_data['price'];
							 | 
						||
| 
								 | 
							
								            $variations = $variation_data['variations'];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $price = $product->price + $variation_price;
							 | 
						||
| 
								 | 
							
								        $data['variation'] = json_encode($variations);
							 | 
						||
| 
								 | 
							
								        $data['variant'] = '';
							 | 
						||
| 
								 | 
							
								        // $data['variation_price'] = $variation_price;
							 | 
						||
| 
								 | 
							
								        $data['quantity'] = $request['quantity'];
							 | 
						||
| 
								 | 
							
								        $data['price'] = $price;
							 | 
						||
| 
								 | 
							
								        $data['status'] = true;
							 | 
						||
| 
								 | 
							
								        $data['discount_on_food'] = Helpers::product_discount_calculate($product, $price, $product->restaurant);
							 | 
						||
| 
								 | 
							
								        $data["discount_type"] = "discount_on_product";
							 | 
						||
| 
								 | 
							
								        $data["tax_amount"] = Helpers::tax_calculate($product, $price);
							 | 
						||
| 
								 | 
							
								        $add_ons = [];
							 | 
						||
| 
								 | 
							
								        $add_on_qtys = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if ($request['addon_id']) {
							 | 
						||
| 
								 | 
							
								            foreach ($request['addon_id'] as $id) {
							 | 
						||
| 
								 | 
							
								                $addon_price += $request['addon-price' . $id] * $request['addon-quantity' . $id];
							 | 
						||
| 
								 | 
							
								                $add_on_qtys[] = $request['addon-quantity' . $id];
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            $add_ons = $request['addon_id'];
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $addon_data = Helpers::calculate_addon_price(\App\Models\AddOn::withOutGlobalScope(App\Scopes\RestaurantScope::class)->whereIn('id', $add_ons)->get(), $add_on_qtys);
							 | 
						||
| 
								 | 
							
								        $data['add_ons'] = json_encode($addon_data['addons']);
							 | 
						||
| 
								 | 
							
								        $data['total_add_on_price'] = $addon_data['total_add_on_price'];
							 | 
						||
| 
								 | 
							
								        // dd($data);
							 | 
						||
| 
								 | 
							
								        $cart = $request->session()->get('order_cart', collect([]));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (isset($request->cart_item_key)) {
							 | 
						||
| 
								 | 
							
								            $cart[$request->cart_item_key] = $data;
							 | 
						||
| 
								 | 
							
								            return response()->json([
							 | 
						||
| 
								 | 
							
								                'data' => 2
							 | 
						||
| 
								 | 
							
								            ]);
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            $cart->push($data);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        // dd( $cart);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return response()->json([
							 | 
						||
| 
								 | 
							
								            'data' => 0
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function remove_from_cart(Request $request)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cart = $request->session()->get('order_cart', collect([]));
							 | 
						||
| 
								 | 
							
								        $cart[$request->key]->status = false;
							 | 
						||
| 
								 | 
							
								        $request->session()->put('order_cart', $cart);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return response()->json([], 200);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function edit(Request $request, Order $order)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $order = Order::withoutGlobalScope(RestaurantScope::class)->with(['details', 'restaurant' => function ($query) {
							 | 
						||
| 
								 | 
							
								            return $query->withCount('orders');
							 | 
						||
| 
								 | 
							
								        }, 'customer' => function ($query) {
							 | 
						||
| 
								 | 
							
								            return $query->withCount('orders');
							 | 
						||
| 
								 | 
							
								        }, 'delivery_man' => function ($query) {
							 | 
						||
| 
								 | 
							
								            return $query->withCount('orders');
							 | 
						||
| 
								 | 
							
								        }, 'details' => function ($query) {
							 | 
						||
| 
								 | 
							
								            return $query->with(['food'=> function ($q) {
							 | 
						||
| 
								 | 
							
								                return $q->withoutGlobalScope(RestaurantScope::class);
							 | 
						||
| 
								 | 
							
								            },'campaign' => function ($q) {
							 | 
						||
| 
								 | 
							
								                return $q->withoutGlobalScope(RestaurantScope::class);
							 | 
						||
| 
								 | 
							
								            }]);
							 | 
						||
| 
								 | 
							
								        }])->where(['id' => $order->id])->Notpos()->first();
							 | 
						||
| 
								 | 
							
								        if ($request->cancle) {
							 | 
						||
| 
								 | 
							
								            if ($request->session()->has(['order_cart'])) {
							 | 
						||
| 
								 | 
							
								                session()->forget(['order_cart']);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            return back();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $cart = collect([]);
							 | 
						||
| 
								 | 
							
								        foreach ($order->details as $details) {
							 | 
						||
| 
								 | 
							
								            unset($details['food_details']);
							 | 
						||
| 
								 | 
							
								            $details['status'] = true;
							 | 
						||
| 
								 | 
							
								            $cart->push($details);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if ($request->session()->has('order_cart')) {
							 | 
						||
| 
								 | 
							
								            session()->forget('order_cart');
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            $request->session()->put('order_cart', $cart);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return back();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function update(Request $request, Order $order)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $order = Order::with(['details', 'restaurant' => function ($query) {
							 | 
						||
| 
								 | 
							
								            return $query->withCount('orders');
							 | 
						||
| 
								 | 
							
								        }, 'customer' => function ($query) {
							 | 
						||
| 
								 | 
							
								            return $query->withCount('orders');
							 | 
						||
| 
								 | 
							
								        }, 'delivery_man' => function ($query) {
							 | 
						||
| 
								 | 
							
								            return $query->withCount('orders');
							 | 
						||
| 
								 | 
							
								        }, 'details.food' => function ($query) {
							 | 
						||
| 
								 | 
							
								            return $query->withoutGlobalScope(RestaurantScope::class);
							 | 
						||
| 
								 | 
							
								        }, 'details.campaign' => function ($query) {
							 | 
						||
| 
								 | 
							
								            return $query->withoutGlobalScope(RestaurantScope::class);
							 | 
						||
| 
								 | 
							
								        }])->where(['id' => $order->id])->Notpos()->first();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (!$request->session()->has('order_cart')) {
							 | 
						||
| 
								 | 
							
								            Toastr::error(translate('messages.order_data_not_found'));
							 | 
						||
| 
								 | 
							
								            return back();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $cart = $request->session()->get('order_cart', collect([]));
							 | 
						||
| 
								 | 
							
								        $restaurant = $order->restaurant;
							 | 
						||
| 
								 | 
							
								        $coupon = null;
							 | 
						||
| 
								 | 
							
								        $total_addon_price = 0;
							 | 
						||
| 
								 | 
							
								        $product_price = 0;
							 | 
						||
| 
								 | 
							
								        $restaurant_discount_amount = 0;
							 | 
						||
| 
								 | 
							
								        if ($order->coupon_code) {
							 | 
						||
| 
								 | 
							
								            $coupon = Coupon::where(['code' => $order->coupon_code])->first();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        foreach ($cart as $c) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if ($c['status'] == true) {
							 | 
						||
| 
								 | 
							
								                unset($c['food']);
							 | 
						||
| 
								 | 
							
								                unset($c['status']);
							 | 
						||
| 
								 | 
							
								                unset($c['item_campaign']);
							 | 
						||
| 
								 | 
							
								                if ($c['item_campaign_id'] != null) {
							 | 
						||
| 
								 | 
							
								                    $product = ItemCampaign::find($c['item_campaign_id']);
							 | 
						||
| 
								 | 
							
								                    if ($product) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                        $price = $c['price'];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                        $product = Helpers::product_data_formatting($product);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                        $c->food_details = json_encode($product);
							 | 
						||
| 
								 | 
							
								                        $c->updated_at = now();
							 | 
						||
| 
								 | 
							
								                        // $variation_data = Helpers::get_varient($product->variations, $c['variations']);
							 | 
						||
| 
								 | 
							
								                        // $variations = $variation_data['variations'];
							 | 
						||
| 
								 | 
							
								                        if (isset($c->id)) {
							 | 
						||
| 
								 | 
							
								                            OrderDetail::where('id', $c->id)->update(
							 | 
						||
| 
								 | 
							
								                                [
							 | 
						||
| 
								 | 
							
								                                    'food_id' => $c->food_id,
							 | 
						||
| 
								 | 
							
								                                    'item_campaign_id' => $c->item_campaign_id,
							 | 
						||
| 
								 | 
							
								                                    'food_details' => $c->food_details,
							 | 
						||
| 
								 | 
							
								                                    'quantity' => $c->quantity,
							 | 
						||
| 
								 | 
							
								                                    'price' => $c->price,
							 | 
						||
| 
								 | 
							
								                                    'tax_amount' => $c->tax_amount,
							 | 
						||
| 
								 | 
							
								                                    'discount_on_food' => $c->discount_on_food,
							 | 
						||
| 
								 | 
							
								                                    'discount_type' => $c->discount_type,
							 | 
						||
| 
								 | 
							
								                                    'variant' => $c->variant,
							 | 
						||
| 
								 | 
							
								                                    'variation' => $c->variation,
							 | 
						||
| 
								 | 
							
								                                    'add_ons' => $c->add_ons,
							 | 
						||
| 
								 | 
							
								                                    'total_add_on_price' => $c->total_add_on_price,
							 | 
						||
| 
								 | 
							
								                                    'updated_at' => $c->updated_at
							 | 
						||
| 
								 | 
							
								                                ]
							 | 
						||
| 
								 | 
							
								                            );
							 | 
						||
| 
								 | 
							
								                        } else {
							 | 
						||
| 
								 | 
							
								                            $c->save();
							 | 
						||
| 
								 | 
							
								                        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                        $total_addon_price += $c['total_add_on_price'];
							 | 
						||
| 
								 | 
							
								                        $product_price += $price * $c['quantity'];
							 | 
						||
| 
								 | 
							
								                        $restaurant_discount_amount += $c['discount_on_food'] * $c['quantity'];
							 | 
						||
| 
								 | 
							
								                    } else {
							 | 
						||
| 
								 | 
							
								                        Toastr::error(translate('messages.food_not_found'));
							 | 
						||
| 
								 | 
							
								                        return back();
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                } else {
							 | 
						||
| 
								 | 
							
								                    $product = Food::find($c['food_id']);
							 | 
						||
| 
								 | 
							
								                    if ($product) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                        $price = $c['price'];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                        $product = Helpers::product_data_formatting($product);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                        $c->food_details = json_encode($product);
							 | 
						||
| 
								 | 
							
								                        $c->updated_at = now();
							 | 
						||
| 
								 | 
							
								                        if (isset($c->id)) {
							 | 
						||
| 
								 | 
							
								                            OrderDetail::where('id', $c->id)->update(
							 | 
						||
| 
								 | 
							
								                                [
							 | 
						||
| 
								 | 
							
								                                    'food_id' => $c->food_id,
							 | 
						||
| 
								 | 
							
								                                    'item_campaign_id' => $c->item_campaign_id,
							 | 
						||
| 
								 | 
							
								                                    'food_details' => $c->food_details,
							 | 
						||
| 
								 | 
							
								                                    'quantity' => $c->quantity,
							 | 
						||
| 
								 | 
							
								                                    'price' => $c->price,
							 | 
						||
| 
								 | 
							
								                                    'tax_amount' => $c->tax_amount,
							 | 
						||
| 
								 | 
							
								                                    'discount_on_food' => $c->discount_on_food,
							 | 
						||
| 
								 | 
							
								                                    'discount_type' => $c->discount_type,
							 | 
						||
| 
								 | 
							
								                                    'variant' => $c->variant,
							 | 
						||
| 
								 | 
							
								                                    'variation' => $c->variation,
							 | 
						||
| 
								 | 
							
								                                    'add_ons' => $c->add_ons,
							 | 
						||
| 
								 | 
							
								                                    'total_add_on_price' => $c->total_add_on_price,
							 | 
						||
| 
								 | 
							
								                                    'updated_at' => $c->updated_at
							 | 
						||
| 
								 | 
							
								                                ]
							 | 
						||
| 
								 | 
							
								                            );
							 | 
						||
| 
								 | 
							
								                        } else {
							 | 
						||
| 
								 | 
							
								                            $c->save();
							 | 
						||
| 
								 | 
							
								                        }
							 | 
						||
| 
								 | 
							
								                        $total_addon_price += $c['total_add_on_price'];
							 | 
						||
| 
								 | 
							
								                        $product_price += $price * $c['quantity'];
							 | 
						||
| 
								 | 
							
								                        $restaurant_discount_amount += $c['discount_on_food'] * $c['quantity'];
							 | 
						||
| 
								 | 
							
								                    } else {
							 | 
						||
| 
								 | 
							
								                        Toastr::error(translate('messages.food_not_found'));
							 | 
						||
| 
								 | 
							
								                        return back();
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            } else {
							 | 
						||
| 
								 | 
							
								                $c->delete();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $restaurant_discount = Helpers::get_restaurant_discount($restaurant);
							 | 
						||
| 
								 | 
							
								        if (isset($restaurant_discount)) {
							 | 
						||
| 
								 | 
							
								            if ($product_price + $total_addon_price < $restaurant_discount['min_purchase']) {
							 | 
						||
| 
								 | 
							
								                $restaurant_discount_amount = 0;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if ($restaurant_discount_amount > $restaurant_discount['max_discount']) {
							 | 
						||
| 
								 | 
							
								                $restaurant_discount_amount = $restaurant_discount['max_discount'];
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $order->delivery_charge = $order->original_delivery_charge;
							 | 
						||
| 
								 | 
							
								        if ($coupon) {
							 | 
						||
| 
								 | 
							
								            if ($coupon->coupon_type == 'free_delivery') {
							 | 
						||
| 
								 | 
							
								                $order->delivery_charge = 0;
							 | 
						||
| 
								 | 
							
								                $coupon = null;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if ($order->restaurant->free_delivery) {
							 | 
						||
| 
								 | 
							
								            $order->delivery_charge = 0;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $coupon_discount_amount = $coupon ? CouponLogic::get_discount($coupon, $product_price + $total_addon_price - $restaurant_discount_amount) : 0;
							 | 
						||
| 
								 | 
							
								        $total_price = $product_price + $total_addon_price - $restaurant_discount_amount - $coupon_discount_amount;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $tax = $restaurant->tax;
							 | 
						||
| 
								 | 
							
								        $total_tax_amount = ($tax > 0) ? (($total_price * $tax) / 100) : 0;
							 | 
						||
| 
								 | 
							
								        if ($restaurant->minimum_order > $product_price + $total_addon_price) {
							 | 
						||
| 
								 | 
							
								            Toastr::error(translate('messages.you_need_to_order_at_least', ['amount' => $restaurant->minimum_order . ' ' . Helpers::currency_code()]));
							 | 
						||
| 
								 | 
							
								            return back();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $free_delivery_over = BusinessSetting::where('key', 'free_delivery_over')->first()->value;
							 | 
						||
| 
								 | 
							
								        if (isset($free_delivery_over)) {
							 | 
						||
| 
								 | 
							
								            if ($free_delivery_over <= $product_price + $total_addon_price - $coupon_discount_amount - $restaurant_discount_amount) {
							 | 
						||
| 
								 | 
							
								                $order->delivery_charge = 0;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $total_order_ammount = $total_price + $total_tax_amount + $order->delivery_charge;
							 | 
						||
| 
								 | 
							
								        $adjustment = $order->order_amount - $total_order_ammount;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $order->coupon_discount_amount = $coupon_discount_amount;
							 | 
						||
| 
								 | 
							
								        $order->restaurant_discount_amount = $restaurant_discount_amount;
							 | 
						||
| 
								 | 
							
								        $order->total_tax_amount = $total_tax_amount;
							 | 
						||
| 
								 | 
							
								        $order->order_amount = $total_order_ammount;
							 | 
						||
| 
								 | 
							
								        $order->adjusment = $adjustment;
							 | 
						||
| 
								 | 
							
								        $order->edited = true;
							 | 
						||
| 
								 | 
							
								        $order->save();
							 | 
						||
| 
								 | 
							
								        session()->forget('order_cart');
							 | 
						||
| 
								 | 
							
								        Toastr::success(translate('messages.order_updated_successfully'));
							 | 
						||
| 
								 | 
							
								        return back();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function quick_view(Request $request)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $product = $product = Food::withOutGlobalScope(RestaurantScope::class)->findOrFail($request->product_id);
							 | 
						||
| 
								 | 
							
								        $item_type = 'food';
							 | 
						||
| 
								 | 
							
								        $order_id = $request->order_id;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return response()->json([
							 | 
						||
| 
								 | 
							
								            'success' => 1,
							 | 
						||
| 
								 | 
							
								            'view' => view('admin-views.order.partials._quick-view', compact('product', 'order_id', 'item_type'))->render(),
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function quick_view_cart_item(Request $request)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $cart_item = session('order_cart')[$request->key];
							 | 
						||
| 
								 | 
							
								        $order_id = $request->order_id;
							 | 
						||
| 
								 | 
							
								        $item_key = $request->key;
							 | 
						||
| 
								 | 
							
								        $product = $cart_item->food ? $cart_item->food : $cart_item->campaign;
							 | 
						||
| 
								 | 
							
								        $item_type = $cart_item->food ? 'food' : 'campaign';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return response()->json([
							 | 
						||
| 
								 | 
							
								            'success' => 1,
							 | 
						||
| 
								 | 
							
								            'view' => view('admin-views.order.partials._quick-view-cart-item', compact('order_id', 'product', 'cart_item', 'item_key', 'item_type'))->render(),
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function orders_export(Request $request, $type, $restaurant_id){
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $orders = Order::with('customer')->where(['restaurant_id'=>$restaurant_id])->get();
							 | 
						||
| 
								 | 
							
								        if($type == 'excel'){
							 | 
						||
| 
								 | 
							
								            return (new FastExcel(Helpers::export_restaurant_orders($orders)))->download('Orders.xlsx');
							 | 
						||
| 
								 | 
							
								        }elseif($type == 'csv'){
							 | 
						||
| 
								 | 
							
								            return (new FastExcel(Helpers::export_restaurant_orders($orders)))->download('Orders.csv');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function restaurant_order_search(Request $request){
							 | 
						||
| 
								 | 
							
								        $key = explode(' ', $request['search']);
							 | 
						||
| 
								 | 
							
								        $orders = Order::where(['restaurant_id'=>$request->restaurant_id])
							 | 
						||
| 
								 | 
							
								                        ->where(function($q) use($key){
							 | 
						||
| 
								 | 
							
								                            foreach ($key as $value){
							 | 
						||
| 
								 | 
							
								                                $q->orWhere('id', 'like', "%{$value}%");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                            }
							 | 
						||
| 
								 | 
							
								                        })
							 | 
						||
| 
								 | 
							
								                        ->whereHas('customer', function($q) use($key){
							 | 
						||
| 
								 | 
							
								                            foreach($key as $value){
							 | 
						||
| 
								 | 
							
								                                $q->orWhere('f_name', 'like', "%{$value}%")
							 | 
						||
| 
								 | 
							
								                                ->orWhere('l_name', 'like', "%{$value}%");
							 | 
						||
| 
								 | 
							
								                            }
							 | 
						||
| 
								 | 
							
								                        })->get();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                        return response()->json([
							 | 
						||
| 
								 | 
							
								                            'view'=> view('admin-views.vendor.view.partials._orderTable', compact('orders'))->render()
							 | 
						||
| 
								 | 
							
								                        ]);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |