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.
		
		
		
		
		
			
		
			
				
					
					
						
							1155 lines
						
					
					
						
							51 KiB
						
					
					
				
			
		
		
	
	
							1155 lines
						
					
					
						
							51 KiB
						
					
					
				<?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()
 | 
						|
                        ]);
 | 
						|
    }
 | 
						|
}
 | 
						|
 |