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.
		
		
		
		
			
				
					228 lines
				
				8.8 KiB
			
		
		
			
		
	
	
					228 lines
				
				8.8 KiB
			| 
								 
											2 years ago
										 
									 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace App\Http\Controllers\Api\V1\Vendor;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use App\Http\Controllers\Controller;
							 | 
						||
| 
								 | 
							
								use App\Models\Category;
							 | 
						||
| 
								 | 
							
								use App\Models\Food;
							 | 
						||
| 
								 | 
							
								use App\Models\User;
							 | 
						||
| 
								 | 
							
								use App\Models\Order;
							 | 
						||
| 
								 | 
							
								use App\Models\OrderDetail;
							 | 
						||
| 
								 | 
							
								use Brian2694\Toastr\Facades\Toastr;
							 | 
						||
| 
								 | 
							
								use Illuminate\Http\Request;
							 | 
						||
| 
								 | 
							
								use App\CentralLogics\Helpers;
							 | 
						||
| 
								 | 
							
								use Illuminate\Support\Facades\DB;
							 | 
						||
| 
								 | 
							
								use Illuminate\Support\Facades\Validator;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class POSController extends Controller
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    public function place_order(Request $request)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $validator = Validator::make($request->all(), [
							 | 
						||
| 
								 | 
							
								            'paid_amount' => 'required',
							 | 
						||
| 
								 | 
							
								            'payment_method'=>'required',
							 | 
						||
| 
								 | 
							
								            'restaurant_id' => 'required',
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if ($validator->fails()) {
							 | 
						||
| 
								 | 
							
								            return response()->json(['errors' => Helpers::error_processor($validator)], 403);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $restaurant = $request->vendor->restaurants[0];
							 | 
						||
| 
								 | 
							
								        $cart = $request['cart'];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $total_addon_price = 0;
							 | 
						||
| 
								 | 
							
								        $product_price = 0;
							 | 
						||
| 
								 | 
							
								        $restaurant_discount_amount = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $order_details = [];
							 | 
						||
| 
								 | 
							
								        $order = new Order();
							 | 
						||
| 
								 | 
							
								        $order->id = 100000 + Order::all()->count() + 1;
							 | 
						||
| 
								 | 
							
								        if (Order::find($order->id)) {
							 | 
						||
| 
								 | 
							
								            $order->id = Order::latest()->first()->id + 1;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $order->payment_status = 'paid';
							 | 
						||
| 
								 | 
							
								        $order->order_status = 'delivered';
							 | 
						||
| 
								 | 
							
								        $order->order_type = 'pos';
							 | 
						||
| 
								 | 
							
								        $order->payment_method = $request->payment_method;
							 | 
						||
| 
								 | 
							
								        $order->transaction_reference = $request->paid_amount;
							 | 
						||
| 
								 | 
							
								        $order->restaurant_id = $restaurant->id;
							 | 
						||
| 
								 | 
							
								        $order->user_id = $request->user_id;
							 | 
						||
| 
								 | 
							
								        $order->delivery_charge = 0;
							 | 
						||
| 
								 | 
							
								        $order->original_delivery_charge = 0;
							 | 
						||
| 
								 | 
							
								        $order->created_at = now();
							 | 
						||
| 
								 | 
							
								        $order->updated_at = now();
							 | 
						||
| 
								 | 
							
								        foreach ($cart as $c) {
							 | 
						||
| 
								 | 
							
								            if(is_array($c))
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                $product = Food::find($c['food_id']);
							 | 
						||
| 
								 | 
							
								                if ($product) {
							 | 
						||
| 
								 | 
							
								                    if (count(json_decode($product['variations'], true)) > 0) {
							 | 
						||
| 
								 | 
							
								                        $price = Helpers::variation_price($product, json_encode($c['variation']));
							 | 
						||
| 
								 | 
							
								                    } else {
							 | 
						||
| 
								 | 
							
								                        $price = $product['price'];
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                    $product->tax = $restaurant->tax;
							 | 
						||
| 
								 | 
							
								                    $product = Helpers::product_data_formatting($product);
							 | 
						||
| 
								 | 
							
								                    $addon_data = Helpers::calculate_addon_price(\App\Models\AddOn::withOutGlobalScope(App\Scopes\RestaurantScope::class)->whereIn('id',$c['add_on_ids'])->get(), $c['add_on_qtys']);
							 | 
						||
| 
								 | 
							
								                    $or_d = [
							 | 
						||
| 
								 | 
							
								                        'food_id' => $product->id,
							 | 
						||
| 
								 | 
							
								                        'item_campaign_id' => null,
							 | 
						||
| 
								 | 
							
								                        'food_details' => json_encode($product),
							 | 
						||
| 
								 | 
							
								                        'quantity' => $c['quantity'],
							 | 
						||
| 
								 | 
							
								                        'price' => $price,
							 | 
						||
| 
								 | 
							
								                        'tax_amount' => Helpers::tax_calculate($product, $price),
							 | 
						||
| 
								 | 
							
								                        'discount_on_food' => Helpers::product_discount_calculate($product, $price, $restaurant),
							 | 
						||
| 
								 | 
							
								                        'discount_type' => 'discount_on_product',
							 | 
						||
| 
								 | 
							
								                        'variant' => json_encode($c['variant']),
							 | 
						||
| 
								 | 
							
								                        'variation' => json_encode([$c['variation']]),
							 | 
						||
| 
								 | 
							
								                        'add_ons' => json_encode($addon_data['addons']),
							 | 
						||
| 
								 | 
							
								                        'total_add_on_price' => $addon_data['total_add_on_price'],
							 | 
						||
| 
								 | 
							
								                        'created_at' => now(),
							 | 
						||
| 
								 | 
							
								                        'updated_at' => now()
							 | 
						||
| 
								 | 
							
								                    ];
							 | 
						||
| 
								 | 
							
								                    $total_addon_price += $or_d['total_add_on_price'];
							 | 
						||
| 
								 | 
							
								                    $product_price += $price*$or_d['quantity'];
							 | 
						||
| 
								 | 
							
								                    $restaurant_discount_amount += $or_d['discount_on_food']*$or_d['quantity'];
							 | 
						||
| 
								 | 
							
								                    $order_details[] = $or_d;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                else {
							 | 
						||
| 
								 | 
							
								                    return response()->json([
							 | 
						||
| 
								 | 
							
								                        'errors' => [
							 | 
						||
| 
								 | 
							
								                            ['code' => 'campaign', 'message' => 'not found!']
							 | 
						||
| 
								 | 
							
								                        ]
							 | 
						||
| 
								 | 
							
								                    ], 404);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        // $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'];
							 | 
						||
| 
								 | 
							
								        //     }
							 | 
						||
| 
								 | 
							
								        // }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if(isset($request['discount']))
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            $restaurant_discount_amount += $request['discount_type']=='percent'&&$request['discount']>0?((($product_price + $total_addon_price) * $request['discount'])/100):$request['discount'];
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $restaurant_discount_amount = round($restaurant_discount_amount ,2);
							 | 
						||
| 
								 | 
							
								        $total_price = $product_price + $total_addon_price - $restaurant_discount_amount;
							 | 
						||
| 
								 | 
							
								        $tax = isset($request['tax'])?$request['tax']:$restaurant->tax;
							 | 
						||
| 
								 | 
							
								        $total_tax_amount= ($tax > 0)?(($total_price * $tax)/100):0;
							 | 
						||
| 
								 | 
							
								        $coupon_discount_amount = 0;
							 | 
						||
| 
								 | 
							
								        $total_price = $product_price + $total_addon_price - $restaurant_discount_amount - $coupon_discount_amount;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $tax = $restaurant->tax;
							 | 
						||
| 
								 | 
							
								        $total_tax_amount= round(($tax > 0)?(($total_price * $tax)/100):0 ,2);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // if($restaurant->minimum_order > $product_price + $total_addon_price )
							 | 
						||
| 
								 | 
							
								        // {
							 | 
						||
| 
								 | 
							
								        //     Toastr::warning(translate('messages.you_need_to_order_at_least', ['amount'=>$restaurant->minimum_order.' '.Helpers::currency_code()]));
							 | 
						||
| 
								 | 
							
								        //     return back();
							 | 
						||
| 
								 | 
							
								        // }
							 | 
						||
| 
								 | 
							
								        // dd(['pro'=>$product_price, 'add'=>$total_addon_price, 'discount'=>$restaurant_discount_amount, 'tax'=>$total_tax_amount ,'cart'=>$cart]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        try {
							 | 
						||
| 
								 | 
							
								            $order->restaurant_discount_amount= $restaurant_discount_amount;
							 | 
						||
| 
								 | 
							
								            $order->total_tax_amount= $total_tax_amount;
							 | 
						||
| 
								 | 
							
								            $order->order_amount = $total_price + $total_tax_amount + $order->delivery_charge;
							 | 
						||
| 
								 | 
							
								            $order->save();
							 | 
						||
| 
								 | 
							
								            foreach ($order_details as $key => $item) {
							 | 
						||
| 
								 | 
							
								                $order_details[$key]['order_id'] = $order->id;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            OrderDetail::insert($order_details);
							 | 
						||
| 
								 | 
							
								            return response()->json([
							 | 
						||
| 
								 | 
							
								                'message' => translate('messages.order_placed_successfully'),
							 | 
						||
| 
								 | 
							
								                'order_id' => $order->id,
							 | 
						||
| 
								 | 
							
								                'total_ammount' => $total_price+$order->delivery_charge+$total_tax_amount
							 | 
						||
| 
								 | 
							
								            ], 200);
							 | 
						||
| 
								 | 
							
								        } catch (\Exception $e) {
							 | 
						||
| 
								 | 
							
								            info($e);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        Toastr::warning(translate('messages.failed_to_place_order'));
							 | 
						||
| 
								 | 
							
								        return back();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function order_list(Request $request)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $vendor = $request['vendor'];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $orders = Order::whereHas('restaurant.vendor', function($query) use($vendor){
							 | 
						||
| 
								 | 
							
								            $query->where('id', $vendor->id);
							 | 
						||
| 
								 | 
							
								        })
							 | 
						||
| 
								 | 
							
								        ->with('customer')
							 | 
						||
| 
								 | 
							
								        ->where('order_type', 'pos')
							 | 
						||
| 
								 | 
							
								        ->latest()
							 | 
						||
| 
								 | 
							
								        ->get();
							 | 
						||
| 
								 | 
							
								        $orders= Helpers::order_data_formatting($orders, true);
							 | 
						||
| 
								 | 
							
								        return response()->json($orders, 200);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function generate_invoice(Request $request)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $validator = Validator::make($request->all(), [
							 | 
						||
| 
								 | 
							
								            'order_id' => 'required'
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								        if ($validator->fails()) {
							 | 
						||
| 
								 | 
							
								            return response()->json(['errors' => Helpers::error_processor($validator)], 403);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $vendor = $request['vendor'];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $order = Order::whereHas('restaurant.vendor', function($query) use($vendor){
							 | 
						||
| 
								 | 
							
								            $query->where('id', $vendor->id);
							 | 
						||
| 
								 | 
							
								        })
							 | 
						||
| 
								 | 
							
								        ->with('customer')
							 | 
						||
| 
								 | 
							
								        ->where('id', $request->order_id)
							 | 
						||
| 
								 | 
							
								        ->where('order_type', 'pos')
							 | 
						||
| 
								 | 
							
								        ->first();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if($order)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return response()->json([
							 | 
						||
| 
								 | 
							
								                'view' => view('vendor-views.pos.order.invoice', compact('order'))->render(),
							 | 
						||
| 
								 | 
							
								            ]);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return response()->json([
							 | 
						||
| 
								 | 
							
								            'errors' => [
							 | 
						||
| 
								 | 
							
								                ['code' => 'order', 'message' => translate('messages.not_found')]
							 | 
						||
| 
								 | 
							
								            ]
							 | 
						||
| 
								 | 
							
								        ],404);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function get_customers(Request $request){
							 | 
						||
| 
								 | 
							
								        $validator = Validator::make($request->all(), [
							 | 
						||
| 
								 | 
							
								            'search' => 'required'
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								        if ($validator->fails()) {
							 | 
						||
| 
								 | 
							
								            return response()->json(['errors' => Helpers::error_processor($validator)], 403);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $key = explode(' ', $request['search']);
							 | 
						||
| 
								 | 
							
								        $data = User::
							 | 
						||
| 
								 | 
							
								        where(function ($q) use ($key) {
							 | 
						||
| 
								 | 
							
								            foreach ($key as $value) {
							 | 
						||
| 
								 | 
							
								                $q->orWhere('f_name', 'like', "%{$value}%")
							 | 
						||
| 
								 | 
							
								                ->orWhere('l_name', 'like', "%{$value}%")
							 | 
						||
| 
								 | 
							
								                ->orWhere('phone', 'like', "%{$value}%");
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        })
							 | 
						||
| 
								 | 
							
								        ->limit(8)
							 | 
						||
| 
								 | 
							
								        ->get([DB::raw('id, CONCAT(f_name, " ", l_name, " (", phone ,")") as text')]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $data[]=(object)['id'=>false, 'text'=>translate('messages.walk_in_customer')];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return response()->json($data);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |