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.
 
 

335 lines
13 KiB

<?php
namespace App\Http\Controllers\Vendor;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\CentralLogics\Helpers;
use App\CentralLogics\OrderLogic;
use App\Models\Order;
use App\Models\Category;
use App\Models\Food;
use App\Models\OrderDetail;
use App\Models\Admin;
use App\Models\RestaurantWallet;
use App\Models\AdminWallet;
use App\Models\ItemCampaign;
use App\Models\BusinessSetting;
use Brian2694\Toastr\Facades\Toastr;
use Illuminate\Support\Facades\DB;
class OrderController extends Controller
{
public function list($status)
{
$data =0;
$restaurant =Helpers::get_restaurant_data();
if (($restaurant->restaurant_model == 'subscription' && isset($restaurant->restaurant_sub) && $restaurant->restaurant_sub->self_delivery == 1) || ($restaurant->restaurant_model == 'commission' && $restaurant->self_delivery_system == 1) ){
$data =1;
}
Order::where(['checked' => 0])->where('restaurant_id',Helpers::get_restaurant_id())->update(['checked' => 1]);
$orders = Order::with(['customer'])
->when($status == 'searching_for_deliverymen', function($query){
return $query->SearchingForDeliveryman();
})
->when($status == 'confirmed', function($query){
return $query->whereIn('order_status',['confirmed', 'accepted'])->whereNotNull('confirmed');
})
->when($status == 'pending', function($query) use($data){
if(config('order_confirmation_model') == 'restaurant' || $data)
{
return $query->where('order_status','pending');
}
else
{
return $query->where('order_status','pending')->where('order_type', 'take_away');
}
})
->when($status == 'cooking', function($query){
return $query->where('order_status','processing');
})
->when($status == 'food_on_the_way', function($query){
return $query->where('order_status','picked_up');
})
->when($status == 'delivered', function($query){
return $query->Delivered();
})
->when($status == 'ready_for_delivery', function($query){
return $query->where('order_status','handover');
})
->when($status == 'refund_requested', function($query){
return $query->Refund_requested();
})
->when($status == 'refunded', function($query){
return $query->Refunded();
})
->when($status == 'scheduled', function($query) use($data){
return $query->Scheduled()->where(function($q) use($data){
if(config('order_confirmation_model') == 'restaurant' || $data)
{
$q->whereNotIn('order_status',['failed','canceled', 'refund_requested', 'refunded']);
}
else
{
$q->whereNotIn('order_status',['pending','failed','canceled', 'refund_requested', 'refunded'])->orWhere(function($query){
$query->where('order_status','pending')->where('order_type', 'take_away');
});
}
});
})
->when($status == 'all', function($query) use($data){
return $query->where(function($q1) use($data) {
$q1->whereNotIn('order_status',(config('order_confirmation_model') == 'restaurant'|| $data)?['failed','canceled', 'refund_requested', 'refunded']:['pending','failed','canceled', 'refund_requested', 'refunded'])
->orWhere(function($q2){
return $q2->where('order_status','pending')->where('order_type', 'take_away');
})->orWhere(function($q3){
return $q3->where('order_status','pending')->whereNotNull('subscription_id');
});
});
})
->when(in_array($status, ['pending','confirmed']), function($query){
return $query->OrderScheduledIn(30);
})
->Notpos()
->hasSubscriptionToday()
->where('restaurant_id',\App\CentralLogics\Helpers::get_restaurant_id())
->orderBy('schedule_at', 'desc')
->paginate(config('default_pagination'));
$status = translate('messages.'.$status);
return view('vendor-views.order.list', compact('orders', 'status'));
}
public function search(Request $request){
$key = explode(' ', $request['search']);
$orders=Order::where(['restaurant_id'=>Helpers::get_restaurant_id()])->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(100)->get();
return response()->json([
'view'=>view('vendor-views.order.partials._table',compact('orders'))->render()
]);
}
public function details(Request $request,$id)
{
// OrderLogic::create_subscription_log($id);
$order = Order::with(['subscription','subscription.schedule_today','details', 'customer'=>function($query){
return $query->withCount('orders');
},'delivery_man'=>function($query){
return $query->withCount('orders');
}])->where(['id' => $id, 'restaurant_id' => Helpers::get_restaurant_id()])->first();
if (isset($order)) {
return view('vendor-views.order.order-view', compact('order'));
} else {
Toastr::info('No more orders!');
return back();
}
}
public function status(Request $request)
{
$request->validate([
'id' => 'required',
'order_status' => 'required|in:confirmed,processing,handover,delivered,canceled',
'reason' =>'required_if:order_status,canceled',
],[
'id.required' => 'Order id is required!'
]);
$order = Order::where(['id' => $request->id, 'restaurant_id' => Helpers::get_restaurant_id()])->first();
if($order->delivered != null)
{
Toastr::warning(translate('messages.cannot_change_status_after_delivered'));
return back();
}
if($request['order_status']=='canceled' && !config('canceled_by_restaurant'))
{
Toastr::warning(translate('messages.you_can_not_cancel_a_order'));
return back();
}
if($request['order_status']=='canceled' && $order->confirmed)
{
Toastr::warning(translate('messages.you_can_not_cancel_after_confirm'));
return back();
}
$data =0;
$restaurant =Helpers::get_restaurant_data();
if (($restaurant->restaurant_model == 'subscription' && isset($restaurant->restaurant_sub) && $restaurant->restaurant_sub->self_delivery == 1) || ($restaurant->restaurant_model == 'commission' && $restaurant->self_delivery_system == 1) ){
$data =1;
}
if($request['order_status']=='delivered' && $order->order_type != 'take_away' && !$data)
{
Toastr::warning(translate('messages.you_can_not_delivered_delivery_order'));
return back();
}
if($request['order_status'] =="confirmed")
{
if(!$data && config('order_confirmation_model') == 'deliveryman' && $order->order_type != 'take_away' && $order->subscription_id == null )
{
Toastr::warning(translate('messages.order_confirmation_warning'));
return back();
}
}
if ($request->order_status == 'delivered') {
$order_delivery_verification = (boolean)\App\Models\BusinessSetting::where(['key' => 'order_delivery_verification'])->first()->value;
if($order_delivery_verification)
{
if($request->otp)
{
if($request->otp != $order->otp)
{
Toastr::warning(translate('messages.order_varification_code_not_matched'));
return back();
}
}
else
{
Toastr::warning(translate('messages.order_varification_code_is_required'));
return back();
}
}
if($order->transaction == null || isset($order->subscription_id))
{
if($order->payment_method == 'cash_on_delivery')
{
$ol = OrderLogic::create_transaction($order,'restaurant', null);
}
else{
$ol = OrderLogic::create_transaction($order,'admin', null);
}
if(!$ol)
{
Toastr::warning(translate('messages.faield_to_create_order_transaction'));
return back();
}
}
$order->payment_status = 'paid';
$order->details->each(function($item, $key){
if($item->food)
{
$item->food->increment('order_count');
}
});
$order->customer ? $order->customer->increment('order_count') : '';
}
if($request->order_status == 'canceled' || $request->order_status == 'delivered')
{
if($order->delivery_man)
{
$dm = $order->delivery_man;
$dm->current_orders = $dm->current_orders>1?$dm->current_orders-1:0;
$dm->save();
}
}
if($request->order_status == 'canceled' )
{
// dd($order->subscription_id);
Helpers::increment_order_count($order->restaurant);
$order->cancellation_reason = $request->reason;
$order->canceled_by = 'restaurant';
if(!isset($order->confirmed) && isset($order->subscription_id)){
$order->subscription()->update(['status' => 'canceled']);
if($order->subscription->log){
$order->subscription->log()->update([
'order_status' => $request->status,
'canceled' => now(),
]);
}
}
}
if($request->order_status == 'delivered')
{
$order->restaurant->increment('order_count');
if($order->delivery_man)
{
$order->delivery_man->increment('order_count');
}
}
// dd($request->order_status);
$order->order_status = $request->order_status;
if ($request->order_status == "processing") {
$order->processing_time = $request->processing_time;
}
$order[$request['order_status']] = now();
$order->save();
if(!Helpers::send_order_notification($order))
{
Toastr::warning(translate('messages.push_notification_faild'));
}
OrderLogic::update_subscription_log($order);
// dd($order);
Toastr::success(translate('messages.order').' '.translate('messages.status_updated'));
return back();
}
public function update_shipping(Request $request, $id)
{
$request->validate([
'contact_person_name' => 'required',
'address_type' => 'required',
'contact_person_number' => 'required',
'address' => 'required',
]);
$address = [
'contact_person_name' => $request->contact_person_name,
'contact_person_number' => $request->contact_person_number,
'address_type' => $request->address_type,
'address' => $request->address,
'floor' => $request->floor,
'road' => $request->road,
'house' => $request->house,
'longitude' => $request->longitude,
'latitude' => $request->latitude,
'created_at' => now(),
'updated_at' => now()
];
DB::table('customer_addresses')->where('id', $id)->update($address);
Toastr::success('Delivery address updated!');
return back();
}
public function generate_invoice($id)
{
$order = Order::where(['id' => $id, 'restaurant_id' => Helpers::get_restaurant_id()])->first();
return view('vendor-views.order.invoice', compact('order'));
}
public function add_payment_ref_code(Request $request, $id)
{
Order::where(['id' => $id, 'restaurant_id' => Helpers::get_restaurant_id()])->update([
'transaction_reference' => $request['transaction_reference']
]);
Toastr::success('Payment reference code is added!');
return back();
}
}