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