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.
 
 

1020 lines
44 KiB

<?php
namespace App\Http\Controllers\Api\V1;
use App\Models\Food;
use App\Models\Zone;
use App\Models\Order;
use App\Models\Coupon;
use App\Models\Refund;
use App\Models\Vehicle;
use App\Models\Restaurant;
use App\Models\OrderDetail;
use App\Models\ItemCampaign;
use App\Models\RefundReason;
use App\Models\Subscription;
use Illuminate\Http\Request;
use App\CentralLogics\Helpers;
use App\Models\BusinessSetting;
use App\CentralLogics\OrderLogic;
use App\Models\OrderCancelReason;
use App\CentralLogics\CouponLogic;
use Illuminate\Support\Facades\DB;
use App\CentralLogics\CustomerLogic;
use App\Http\Controllers\Controller;
use App\Models\SubscriptionSchedule;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Validator;
use Grimzy\LaravelMysqlSpatial\Types\Point;
use Illuminate\Support\Facades\Http;
class OrderController extends Controller
{
public function track_order(Request $request)
{
$validator = Validator::make($request->all(), [
'order_id' => 'required'
]);
if ($validator->fails()) {
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
}
$order = Order::with(['restaurant.restaurant_sub', 'refund', 'delivery_man.rating','subscription'])->withCount('details')->where(['id' => $request['order_id'], 'user_id' => $request->user()->id])->Notpos()->first();
if($order)
{
$order['restaurant'] = $order['restaurant']?Helpers::restaurant_data_formatting($order['restaurant']):$order['restaurant'];
$order['delivery_address'] = $order['delivery_address']?json_decode($order['delivery_address']):$order['delivery_address'];
$order['delivery_man'] = $order['delivery_man']?Helpers::deliverymen_data_formatting([$order['delivery_man']]):$order['delivery_man'];
unset($order['details']);
}
else
{
return response()->json([
'errors' => [
['code' => 'schedule_at', 'message' => translate('messages.not_found')]
]
], 404);
}
return response()->json($order, 200);
}
public function place_order(Request $request)
{
$validator = Validator::make($request->all(), [
'order_amount' => 'required',
'payment_method'=>'required|in:cash_on_delivery,digital_payment,wallet',
'order_type' => 'required|in:take_away,delivery',
'restaurant_id' => 'required',
'distance' => 'required_if:order_type,delivery',
'address' => 'required_if:order_type,delivery',
'longitude' => 'required_if:order_type,delivery',
'latitude' => 'required_if:order_type,delivery',
'dm_tips' => 'nullable|numeric'
]);
if ($validator->fails()) {
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
}
if($request->payment_method == 'wallet' && Helpers::get_business_settings('wallet_status', false) != 1)
{
return response()->json([
'errors' => [
['code' => 'payment_method', 'message' => translate('messages.customer_wallet_disable_warning')]
]
], 203);
}
$coupon = null;
$delivery_charge = null;
$free_delivery_by = null;
$coupon_created_by = null;
$schedule_at = $request->schedule_at?\Carbon\Carbon::parse($request->schedule_at):now();
if($request->schedule_at && $schedule_at < now())
{
return response()->json([
'errors' => [
['code' => 'order_time', 'message' => translate('messages.you_can_not_schedule_a_order_in_past')]
]
], 406);
}
$restaurant = Restaurant::with(['discount', 'restaurant_sub'])->selectRaw('*, IF(((select count(*) from `restaurant_schedule` where `restaurants`.`id` = `restaurant_schedule`.`restaurant_id` and `restaurant_schedule`.`day` = '.$schedule_at->format('w').' and `restaurant_schedule`.`opening_time` < "'.$schedule_at->format('H:i:s').'" and `restaurant_schedule`.`closing_time` >"'.$schedule_at->format('H:i:s').'") > 0), true, false) as open')->where('id', $request->restaurant_id)->first();
if(!$restaurant)
{
return response()->json([
'errors' => [
['code' => 'order_time', 'message' => translate('messages.restaurant_not_found')]
]
], 404);
}
$rest_sub=$restaurant->restaurant_sub;
if ($restaurant->restaurant_model == 'subscription' && isset($rest_sub)) {
if($rest_sub->max_order != "unlimited" && $rest_sub->max_order <= 0){
return response()->json([
'errors' => [
['code' => 'order-confirmation-error', 'message' => translate('messages.Sorry_the_restaurant_is_unable_to_take_any_order_!')]
]
], 403);
}
} elseif( $restaurant->restaurant_model == 'unsubscribed'){
return response()->json([
'errors' => [
['code' => 'order-confirmation-model', 'message' => translate('messages.Sorry_the_restaurant_is_unable_to_take_any_order_!')]
]
], 403);
}
if($request->schedule_at && !$restaurant->schedule_order)
{
return response()->json([
'errors' => [
['code' => 'schedule_at', 'message' => translate('messages.schedule_order_not_available')]
]
], 406);
}
if($restaurant->open == false && !$request->subscription_order)
{
return response()->json([
'errors' => [
['code' => 'order_time', 'message' => translate('messages.restaurant_is_closed_at_order_time')]
]
], 406);
}
if ($request['coupon_code']) {
$coupon = Coupon::active()->where(['code' => $request['coupon_code']])->first();
if (isset($coupon)) {
$staus = CouponLogic::is_valide($coupon, $request->user()->id ,$request['restaurant_id']);
if($staus==407)
{
return response()->json([
'errors' => [
['code' => 'coupon', 'message' => translate('messages.coupon_expire')]
]
], 407);
}
else if($staus==408)
{
return response()->json([
'errors' => [
['code' => 'coupon', 'message' => translate('messages.You_are_not_eligible_for_this_coupon')]
]
], 403);
}
else if($staus==406)
{
return response()->json([
'errors' => [
['code' => 'coupon', 'message' => translate('messages.coupon_usage_limit_over')]
]
], 406);
}
else if($staus==404)
{
return response()->json([
'errors' => [
['code' => 'coupon', 'message' => translate('messages.not_found')]
]
], 404);
}
$coupon_created_by =$coupon->created_by;
if($coupon->coupon_type == 'free_delivery')
{
$delivery_charge = 0;
$free_delivery_by = $coupon_created_by;
$coupon_created_by = null;
// $coupon = null;
}
} else {
return response()->json([
'errors' => [
['code' => 'coupon', 'message' => translate('messages.not_found')]
]
], 404);
}
}
if(isset($coupon))
{
$coupon->increment('total_uses');
}
if(isset($coupon) && $coupon->coupon_type == 'free_delivery')
{
$coupon = null;
}
$per_km_shipping_charge = 0;
$minimum_shipping_charge = 0;
$maximum_shipping_charge = 0;
$max_cod_order_amount_value= 0;
$increased=0;
$distance_data = $request->distance;
$data = Vehicle::active()->
where(function ($query) use ($distance_data) {
$query->where('starting_coverage_area', '<=', $distance_data)->where('maximum_coverage_area', '>=', $distance_data)
->orWhere(function ($query) use ($distance_data) {
$query->where('starting_coverage_area', '>=', $distance_data);
});
})
->orderBy('starting_coverage_area')->first();
$extra_charges = (float) (isset($data) ? $data->extra_charges : 0);
$vehicle_id= (isset($data) ? $data->id : null);
if($request->latitude && $request->longitude)
{
$point = new Point($request->latitude,$request->longitude);
$zone = Zone::where('id', $restaurant->zone_id)->contains('coordinates', $point)->first();
if(!$zone)
{
$errors = [];
array_push($errors, ['code' => 'coordinates', 'message' => translate('messages.out_of_coverage')]);
return response()->json([
'errors' => $errors
], 403);
}
if( $zone->per_km_shipping_charge && $zone->minimum_shipping_charge ) {
$per_km_shipping_charge = $zone->per_km_shipping_charge;
$minimum_shipping_charge = $zone->minimum_shipping_charge;
$maximum_shipping_charge = $zone->maximum_shipping_charge;
$max_cod_order_amount_value= $zone->max_cod_order_amount;
if($zone->increased_delivery_fee_status == 1){
$increased=$zone->increased_delivery_fee ?? 0;
}
}
}
if($request['order_type'] != 'take_away' && !$restaurant->free_delivery && !isset($delivery_charge) && ($restaurant->restaurant_model == 'subscription' && isset($restaurant->restaurant_sub) && $restaurant->restaurant_sub->self_delivery == 1 || $restaurant->restaurant_model == 'commission' && $restaurant->self_delivery_system == 1 ))
{
$per_km_shipping_charge = $restaurant->per_km_shipping_charge;
$minimum_shipping_charge = $restaurant->minimum_shipping_charge;
$maximum_shipping_charge = $restaurant->maximum_shipping_charge;
$extra_charges= 0;
$vehicle_id=null;
$increased=0;
}
if($restaurant->free_delivery || $free_delivery_by == 'vendor' ){
$per_km_shipping_charge = $restaurant->per_km_shipping_charge;
$minimum_shipping_charge = $restaurant->minimum_shipping_charge;
$maximum_shipping_charge = $restaurant->maximum_shipping_charge;
$extra_charges= 0;
$vehicle_id=null;
$increased=0;
}
$original_delivery_charge = ($request->distance * $per_km_shipping_charge > $minimum_shipping_charge) ? $request->distance * $per_km_shipping_charge + $extra_charges : $minimum_shipping_charge + $extra_charges;
if($request['order_type'] == 'take_away')
{
$per_km_shipping_charge = 0;
$minimum_shipping_charge = 0;
$maximum_shipping_charge = 0;
$extra_charges= 0;
$distance_data = 0;
$vehicle_id=null;
$increased=0;
$original_delivery_charge =0;
}
if ( $maximum_shipping_charge > $minimum_shipping_charge && $original_delivery_charge > $maximum_shipping_charge ){
$original_delivery_charge = $maximum_shipping_charge;
}
else{
$original_delivery_charge = $original_delivery_charge;
}
if(!isset($delivery_charge)){
$delivery_charge = ($request->distance * $per_km_shipping_charge > $minimum_shipping_charge) ? $request->distance * $per_km_shipping_charge : $minimum_shipping_charge;
if ( $maximum_shipping_charge > $minimum_shipping_charge && $delivery_charge + $extra_charges > $maximum_shipping_charge ){
$delivery_charge =$maximum_shipping_charge;
}
else{
$delivery_charge =$extra_charges + $delivery_charge;
}
}
if($increased > 0 ){
if($delivery_charge > 0){
$increased_fee = ($delivery_charge * $increased) / 100;
$delivery_charge = $delivery_charge + $increased_fee;
}
if($original_delivery_charge > 0){
$increased_fee = ($original_delivery_charge * $increased) / 100;
$original_delivery_charge = $original_delivery_charge + $increased_fee;
}
}
$address = [
'contact_person_name' => $request->contact_person_name?$request->contact_person_name:$request->user()->f_name.' '.$request->user()->f_name,
'contact_person_number' => $request->contact_person_number?$request->contact_person_number:$request->user()->phone,
'address_type' => $request->address_type?$request->address_type:'Delivery',
'address' => $request->address,
'floor' => $request->floor,
'road' => $request->road,
'house' => $request->house,
'longitude' => (string)$request->longitude,
'latitude' => (string)$request->latitude,
];
$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::orderBy('id','desc')->first('id')->id + 1;
}
$order->distance = $distance_data;
$order->user_id = $request->user()->id;
$order->order_amount = $request['order_amount'];
$order->payment_status = $request['payment_method']=='wallet'?'paid':'unpaid';
$order->order_status = $request['payment_method']=='digital_payment'?'pending':($request->payment_method == 'wallet'?'confirmed':'pending');
$order->coupon_code = $request['coupon_code'];
$order->payment_method = $request->payment_method;
$order->transaction_reference = null;
$order->order_note = $request['order_note'];
$order->order_type = $request['order_type'];
$order->restaurant_id = $request['restaurant_id'];
$order->delivery_charge = round($delivery_charge, config('round_up_to_digit'))??0;
$order->original_delivery_charge = round($original_delivery_charge, config('round_up_to_digit'));
$order->delivery_address = json_encode($address);
$order->schedule_at = $schedule_at;
$order->scheduled = $request->schedule_at?1:0;
$order->otp = rand(1000, 9999);
$order->zone_id = $restaurant->zone_id;
$dm_tips_manage_status = BusinessSetting::where('key', 'dm_tips_status')->first()->value;
if ($dm_tips_manage_status == 1) {
$order->dm_tips = $request->dm_tips ?? 0;
} else {
$order->dm_tips = 0;
}
$order->vehicle_id = $vehicle_id;
$order->pending = now();
$order->confirmed = $request->payment_method == 'wallet' ? now() : null;
$order->created_at = now();
$order->updated_at = now();
foreach ($request['cart'] as $c) {
if ($c['item_campaign_id'] != null) {
$product = ItemCampaign::active()->find($c['item_campaign_id']);
if ($product) {
$product_variations = json_decode($product->variations, true);
$variations=[];
if (count($product_variations)) {
$variation_data = Helpers::get_varient($product_variations, $c['variations']);
$price = $product['price'] + $variation_data['price'];
$variations = $variation_data['variations'];
} else {
$price = $product['price'];
}
$product->tax = $restaurant->tax;
$product = Helpers::product_data_formatting($product, false, false, app()->getLocale());
$addon_data = Helpers::calculate_addon_price(\App\Models\AddOn::whereIn('id',$c['add_on_ids'])->get(), $c['add_on_qtys']);
$or_d = [
'food_id' => null,
'item_campaign_id' => $c['item_campaign_id'],
'food_details' => json_encode($product),
'quantity' => $c['quantity'],
'price' => round($price, config('round_up_to_digit')),
'tax_amount' => Helpers::tax_calculate($product, $price),
'discount_on_food' => Helpers::product_discount_calculate($product, $price, $restaurant),
'discount_type' => 'discount_on_product',
'variation' => json_encode($variations),
'add_ons' => json_encode($addon_data['addons']),
'total_add_on_price' => $addon_data['total_add_on_price'],
'created_at' => now(),
'updated_at' => now()
];
$order_details[] = $or_d;
$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'];
} else {
return response()->json([
'errors' => [
['code' => 'campaign', 'message' => translate('messages.product_unavailable_warning')]
]
], 404);
}
} else {
$product = Food::active()->find($c['food_id']);
if ($product) {
$product_variations = json_decode($product->variations, true);
$variations=[];
if (count($product_variations)) {
$variation_data = Helpers::get_varient($product_variations, $c['variations']);
$price = $product['price'] + $variation_data['price'];
$variations = $variation_data['variations'];
} else {
$price = $product['price'];
}
$product->tax = $restaurant->tax;
$product = Helpers::product_data_formatting($product, false, false, app()->getLocale());
$addon_data = Helpers::calculate_addon_price(\App\Models\AddOn::whereIn('id',$c['add_on_ids'])->get(), $c['add_on_qtys']);
$or_d = [
'food_id' => $c['food_id'],
'item_campaign_id' => null,
'food_details' => json_encode($product),
'quantity' => $c['quantity'],
'price' => round($price, config('round_up_to_digit')),
'tax_amount' => round(Helpers::tax_calculate($product, $price), config('round_up_to_digit')),
'discount_on_food' => Helpers::product_discount_calculate($product, $price, $restaurant),
'discount_type' => 'discount_on_product',
'variation' => json_encode($variations),
'add_ons' => json_encode($addon_data['addons']),
'total_add_on_price' => round($addon_data['total_add_on_price'], config('round_up_to_digit')),
'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' => 'food', 'message' => translate('messages.product_unavailable_warning')]
]
], 404);
}
}
}
$order->discount_on_product_by = 'vendor';
$restaurant_discount = Helpers::get_restaurant_discount($restaurant);
if(isset($restaurant_discount))
{
$order->discount_on_product_by = 'admin';
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'];
}
}
$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 > 0)?$restaurant->tax:0;
$order->tax_status = 'excluded';
$tax_included =BusinessSetting::where(['key'=>'tax_included'])->first() ? BusinessSetting::where(['key'=>'tax_included'])->first()->value : 0;
if ($tax_included == 1){
$order->tax_status = 'included';
}
$total_tax_amount=Helpers::product_tax($total_price,$tax,$order->tax_status =='included');
$tax_a=$order->tax_status =='included'?0:$total_tax_amount;
if($restaurant->minimum_order > $product_price + $total_addon_price )
{
return response()->json([
'errors' => [
['code' => 'order_time', 'message' => translate('messages.you_need_to_order_at_least', ['amount'=>$restaurant->minimum_order.' '.Helpers::currency_code()])]
]
], 406);
}
$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;
$free_delivery_by = 'admin';
}
}
if($restaurant->free_delivery){
$order->delivery_charge = 0;
$free_delivery_by = 'vendor';
}
$order->coupon_created_by = $coupon_created_by;
// if($coupon)
// {
// $coupon->increment('total_uses');
// }
$order_amount = round($total_price + $tax_a + $order->delivery_charge , config('round_up_to_digit'));
if($request->payment_method == 'wallet' && $request->user()->wallet_balance < $order_amount)
{
return response()->json([
'errors' => [
['code' => 'order_amount', 'message' => translate('messages.insufficient_balance')]
]
], 203);
}
try {
$order->coupon_discount_amount = round($coupon_discount_amount, config('round_up_to_digit'));
$order->coupon_discount_title = $coupon ? $coupon->title : '';
$order->free_delivery_by = $free_delivery_by;
$order->restaurant_discount_amount= round($restaurant_discount_amount, config('round_up_to_digit'));
$order->total_tax_amount= round($total_tax_amount, config('round_up_to_digit'));
$order->order_amount = $order_amount + $order->dm_tips;
if( $max_cod_order_amount_value > 0 && $order->payment_method == 'cash_on_delivery' && $order->order_amount > $max_cod_order_amount_value){
return response()->json([
'errors' => [
['code' => 'order_amount', 'message' => translate('messages.You can not Order more then ').$max_cod_order_amount_value .Helpers::currency_symbol().' '. translate('messages.on COD order.')]
]
], 203);
}
// if ($request->subscription_order && $restaurant->restaurant_model == 'subscription' && isset($rest_sub) &&
// Carbon::parse($rest_sub->expiry_date)->format('Y-m-d') < Carbon::parse($request->subscription_end_at
// )){
// return response()->json([
// 'errors' => [
// ['code' => 'restaurant_subs_exp', 'message' => translate('messages.You_need_to_Set_end_date_before').' '.$rest_sub->expiry_date->format('Y-m-d')]
// ]
// ], 203);
// }
DB::beginTransaction();
// new Order Subscription create
if($request->subscription_order && $request->subscription_quantity){
$subscription = new Subscription();
$subscription->status = 'active';
$subscription->start_at = $request->subscription_start_at;
$subscription->end_at = $request->subscription_end_at;
$subscription->type = $request->subscription_type;
$subscription->quantity = $request->subscription_quantity;
$subscription->user_id = $request->user()->id;
$subscription->restaurant_id = $restaurant->id;
$subscription->save();
$order->subscription_id = $subscription->id;
// $subscription_schedules = Helpers::get_subscription_schedules($request->subscription_type, $request->subscription_start_at, $request->subscription_end_at, json_decode($request->days, true));
$days = array_map(function($day)use($subscription){
$day['subscription_id'] = $subscription->id;
$day['type'] = $subscription->type;
$day['created_at'] = now();
$day['updated_at'] = now();
return $day;
},json_decode($request->subscription_days, true));
// info(['SubscriptionSchedule_____', $days]);
SubscriptionSchedule::insert($days);
// $order->checked = 1;
}
$order->save();
// new Order Subscription logs create for the order
OrderLogic::create_subscription_log($order->id);
// End Order Subscription.
foreach ($order_details as $key => $item) {
$order_details[$key]['order_id'] = $order->id;
}
OrderDetail::insert($order_details);
$customer = $request->user();
$customer->zone_id = $restaurant->zone_id;
$customer->save();
$restaurant->increment('total_order');
if ($restaurant->restaurant_model == 'subscription' && isset($rest_sub) && $request['payment_method'] != 'digital_payment'){
if ($rest_sub->max_order != "unlimited" && $rest_sub->max_order > 0 ) {
$rest_sub->decrement('max_order' , 1);
}
}
DB::commit();
// if($order->subscription_id == null){
// Http::async()->get(url('/')."/api/v1/customer/order/send-notification/{$order->id}");
// }
Helpers::visitor_log('restaurant',$customer->id,$restaurant->id,true);
if($request->payment_method == 'wallet') CustomerLogic::create_wallet_transaction($order->user_id, $order->order_amount, 'order_place', $order->id);
try{
if($order->order_status == 'pending')
{
Mail::to($customer['email'])->send(new \App\Mail\OrderPlaced($order->id));
}
}catch (\Exception $ex) {
info($ex);
}
return response()->json([
'message' => translate('messages.order_placed_successfully'),
'order_id' => $order->id,
'total_ammount' => $total_price+$order->delivery_charge+$tax_a
], 200);
} catch (\Exception $e) {
info($e);
return response()->json([$e], 403);
}
return response()->json([
'errors' => [
['code' => 'order_time', 'message' => translate('messages.failed_to_place_order')]
]
], 403);
}
public function get_order_list(Request $request)
{
$validator = Validator::make($request->all(), [
'limit' => 'required',
'offset' => 'required',
]);
if ($validator->fails()) {
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
}
$paginator = Order::with(['restaurant', 'delivery_man.rating'])->withCount('details')->where(['user_id' => $request->user()->id])->
whereIn('order_status', ['delivered','canceled','refund_requested','refund_request_canceled','refunded','failed'])->Notpos()
->whereNull('subscription_id')
->latest()->paginate($request['limit'], ['*'], 'page', $request['offset']);
$orders = array_map(function ($data) {
$data['delivery_address'] = $data['delivery_address']?json_decode($data['delivery_address']):$data['delivery_address'];
$data['restaurant'] = $data['restaurant']?Helpers::restaurant_data_formatting($data['restaurant']):$data['restaurant'];
$data['delivery_man'] = $data['delivery_man']?Helpers::deliverymen_data_formatting([$data['delivery_man']]):$data['delivery_man'];
return $data;
}, $paginator->items());
$data = [
'total_size' => $paginator->total(),
'limit' => $request['limit'],
'offset' => $request['offset'],
'orders' => $orders
];
return response()->json($data, 200);
}
public function get_order_subscription_list(Request $request)
{
$validator = Validator::make($request->all(), [
'limit' => 'required',
'offset' => 'required',
]);
if ($validator->fails()) {
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
}
$paginator = Order::with(['restaurant', 'delivery_man.rating'])->withCount('details')->where(['user_id' => $request->user()->id])
// ->whereIn('order_status', ['delivered','canceled','refund_requested','refund_request_canceled','refunded','failed'])
->Notpos()
->whereNotNull('subscription_id')
->latest()->paginate($request['limit'], ['*'], 'page', $request['offset']);
$orders = array_map(function ($data) {
$data['delivery_address'] = $data['delivery_address']?json_decode($data['delivery_address']):$data['delivery_address'];
$data['restaurant'] = $data['restaurant']?Helpers::restaurant_data_formatting($data['restaurant']):$data['restaurant'];
$data['delivery_man'] = $data['delivery_man']?Helpers::deliverymen_data_formatting([$data['delivery_man']]):$data['delivery_man'];
return $data;
}, $paginator->items());
$data = [
'total_size' => $paginator->total(),
'limit' => $request['limit'],
'offset' => $request['offset'],
'orders' => $orders
];
return response()->json($data, 200);
}
public function get_running_orders(Request $request)
{
$validator = Validator::make($request->all(), [
'limit' => 'required',
'offset' => 'required',
]);
if ($validator->fails()) {
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
}
$paginator = Order::with(['restaurant', 'delivery_man.rating'])->withCount('details')->where(['user_id' => $request->user()->id])
->whereNull('subscription_id')
// ->hasSubscriptionToday()
->whereNotIn('order_status', ['delivered','canceled','refund_requested','refund_request_canceled','refunded','failed'])
->Notpos()->latest()->paginate($request['limit'], ['*'], 'page', $request['offset']);
$orders = array_map(function ($data) {
$data['delivery_address'] = $data['delivery_address']?json_decode($data['delivery_address']):$data['delivery_address'];
$data['restaurant'] = $data['restaurant']?Helpers::restaurant_data_formatting($data['restaurant']):$data['restaurant'];
$data['delivery_man'] = $data['delivery_man']?Helpers::deliverymen_data_formatting([$data['delivery_man']]):$data['delivery_man'];
return $data;
}, $paginator->items());
$data = [
'total_size' => $paginator->total(),
'limit' => $request['limit'],
'offset' => $request['offset'],
'orders' => $orders
];
return response()->json($data, 200);
}
public function get_order_details(Request $request)
{
$validator = Validator::make($request->all(), [
'order_id' => 'required'
]);
if ($validator->fails()) {
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
}
$order = Order::with('details','subscription.schedules')->where('user_id', $request->user()->id)->find($request->order_id);
$details = isset($order->details)?$order->details:null;
if ($details != null && $details->count() > 0) {
$storage = [];
foreach ($details as $item) {
$item['add_ons'] = json_decode($item['add_ons']);
$item['variation'] = json_decode($item['variation']);
$item['food_details'] = json_decode($item['food_details'], true);
$item['zone_id'] = (int) (isset($order->zone_id) ? $order->zone_id : $order->restaurant->zone_id);
array_push($storage, $item);
}
$data = $storage;
// $details = Helpers::order_details_data_formatting($details);
$subscription_schedules = $order->subscription ? $order->subscription->schedules : [];
return response()->json(['details'=>$data, 'subscription_schedules'=> $subscription_schedules,
], 200);
}
// $details = OrderDetail::whereHas('order', function($query)use($request){
// return $query->where('user_id', $request->user()->id);
// })->where(['order_id' => $request['order_id']])->get();
// if ($details->count() > 0) {
// $details = $details = Helpers::order_details_data_formatting($details);
// return response()->json($details, 200);
// }
else {
return response()->json([
'errors' => [
['code' => 'order', 'message' => translate('messages.not_found')]
]
], 200);
}
}
public function cancel_order(Request $request)
{
$validator = Validator::make($request->all(), [
'reason' => 'required|max:255'
]);
if ($validator->fails()) {
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
}
$order = Order::where(['user_id' => $request->user()->id, 'id' => $request['order_id']])->Notpos()->first();
if(!$order){
return response()->json([
'errors' => [
['code' => 'order', 'message' => translate('messages.not_found')]
]
], 404);
}
else if ($order->order_status == 'pending' || $order->order_status == 'failed' || $order->order_status == 'canceled' ) {
$order->order_status = 'canceled';
$order->canceled = now();
$order->cancellation_reason = $request->reason;
$order->canceled_by = 'customer';
$order->save();
// 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(),
// ]);
// }
// }
Helpers::send_order_notification($order);
Helpers::increment_order_count($order->restaurant);
return response()->json(['message' => translate('messages.order_canceled_successfully')], 200);
}
return response()->json([
'errors' => [
['code' => 'order', 'message' => translate('messages.you_can_not_cancel_after_confirm')]
]
], 403);
}
public function refund_reasons(){
$refund_reasons=RefundReason::where('status',1)->get();
return response()->json([
'refund_reasons' => $refund_reasons
], 200);
}
public function refund_request(Request $request)
{
if(BusinessSetting::where(['key'=>'refund_active_status'])->first()->value == false){
return response()->json([
'errors' => [
['code' => 'order', 'message' => translate('You can not request for a refund')]
]
], 403);
}
$validator = Validator::make($request->all(), [
'customer_reason' => 'required|string|max:254',
'refund_method'=>'nullable|string|max:100',
'customer_note'=>'nullable|string|max:65535',
'image.*' => 'nullable|max:2048',
]);
if ($validator->fails()) {
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
}
$order = Order::where(['user_id' => $request->user()->id, 'id' => $request['order_id']])->Notpos()->first();
if(!$order){
return response()->json([
'errors' => [
['code' => 'order', 'message' => translate('messages.not_found')]
]
], 404);
}
else if ($order->order_status == 'delivered' && $order->payment_status == 'paid') {
$id_img_names = [];
if ($request->has('image')) {
foreach ($request->file('image') as $img) {
$image_name = Helpers::upload('refund/', 'png', $img);
array_push($id_img_names, $image_name);
}
$images = json_encode($id_img_names);
} else {
$images = json_encode([]);
// return response()->json(['message' => 'no_image'], 200);
}
$refund_amount = round($order->order_amount - $order->delivery_charge- $order->dm_tips , config('round_up_to_digit'));
$refund = new Refund();
$refund->order_id = $order->id;
$refund->user_id = $order->user_id;
$refund->order_status= $order->order_status;
$refund->refund_status= 'pending';
$refund->refund_method= $request->refund_method ?? 'wallet';
$refund->customer_reason= $request->customer_reason;
$refund->customer_note= $request->customer_note;
$refund->refund_amount= $refund_amount;
$refund->image = $images;
$refund->save();
$order->order_status = 'refund_requested';
$order->refund_requested = now();
$order->save();
// Helpers::send_order_notification($order);
return response()->json(['message' => translate('messages.refund_request_placed_successfully')], 200);
}
return response()->json([
'errors' => [
['code' => 'order', 'message' => translate('messages.you_can_not_request_for_refund_after_delivery')]
]
], 403);
}
public function update_payment_method(Request $request)
{
$config=Helpers::get_business_settings('cash_on_delivery');
if($config['status']==0)
{
return response()->json([
'errors' => [
['code' => 'cod', 'message' => translate('messages.Cash on delivery order not available at this time')]
]
], 403);
}
$order = Order::where(['user_id' => $request->user()->id, 'id' => $request['order_id']])->Notpos()->first();
if ($order) {
Order::where(['user_id' => $request->user()->id, 'id' => $request['order_id']])->update([
'payment_method' => 'cash_on_delivery', 'order_status'=>'pending', 'pending'=> now()
]);
$fcm_token = $request->user()->cm_firebase_token;
$value = Helpers::order_status_update_message('pending');
try {
if ($value) {
$data = [
'title' =>translate('messages.order_placed_successfully'),
'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'=>$request->user()->id,
'created_at'=>now(),
'updated_at'=>now()
]);
}
if($order->order_type == 'delivery' && !$order->scheduled)
{
$data = [
'title' =>translate('messages.order_placed_successfully'),
'description' => translate('messages.new_order_push_description'),
'order_id' => $order->id,
'image' => '',
];
Helpers::send_push_notif_to_topic($data, $order->restaurant->zone->deliveryman_wise_topic, 'order_request');
}
} catch (\Exception $e) {
info($e);
}
return response()->json(['message' => translate('messages.payment').' '.translate('messages.method').' '.translate('messages.updated_successfully')], 200);
}
return response()->json([
'errors' => [
['code' => 'order', 'message' => translate('messages.not_found')]
]
], 404);
}
public function cancellation_reason(Request $request)
{
$validator = Validator::make($request->all(), [
'limit' => 'required',
'offset' => 'required',
]);
if ($validator->fails()) {
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
}
$limit = $request->query('limit', 1);
$offset = $request->query('offset', 1);
$reasons = OrderCancelReason::where('status', 1)->when($request->type,function($query) use($request){
return $query->where('user_type',$request->type);
})
->paginate($limit, ['*'], 'page', $offset);
$data = [
'total_size' => $reasons->total(),
'limit' => $limit,
'offset' => $offset,
'reasons' => $reasons->items(),
];
return response()->json($data, 200);
}
public function food_list(Request $request){
$validator = Validator::make($request->all(), [
'food_id' => 'required',
]);
$food_ids= json_decode($request['food_id'], true);
if ($validator->fails()) {
return response()->json(['errors' => Helpers::error_processor($validator)], 403);
}
$product = Food::active()->whereIn('id',$food_ids)->get();
return response()->json(Helpers::product_data_formatting($product, true, false, app()->getLocale()), 200);
}
public function order_notification(Request $request,$order_id){
$order = Order::where('user_id', $request->user()->id)->where('id',$order_id)->first();
if($order){
Helpers::send_order_notification($order);
}
return response()->json();
}
}