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.
227 lines
8.8 KiB
227 lines
8.8 KiB
<?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);
|
|
}
|
|
}
|
|
|