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.
298 lines
12 KiB
298 lines
12 KiB
1 year ago
|
<?php
|
||
|
|
||
|
namespace App\CentralLogics;
|
||
|
|
||
|
use App\Models\Restaurant;
|
||
|
use App\Models\OrderTransaction;
|
||
|
|
||
|
class RestaurantLogic
|
||
|
{
|
||
|
public static function get_restaurants($zone_id, $filter, $limit = 10, $offset = 1, $type='all',$name= null,$longitude=0,$latitude=0,$cuisine='all')
|
||
|
{
|
||
|
$paginator = Restaurant::
|
||
|
withOpen($longitude,$latitude)
|
||
|
->with(['discount'=>function($q){
|
||
|
return $q->validate();
|
||
|
}])->whereIn('zone_id', $zone_id)
|
||
|
->when($filter=='delivery', function($q){
|
||
|
return $q->delivery();
|
||
|
})
|
||
|
->when($filter=='take_away', function($q){
|
||
|
return $q->takeaway();
|
||
|
})
|
||
|
->when($name, function($q)use($name){
|
||
|
$key = explode(' ', $name);
|
||
|
$q->where(function($q)use($key){
|
||
|
foreach ($key as $value){
|
||
|
$q->orWhere('name', 'like', '%'.$value.'%');
|
||
|
}
|
||
|
return $q;
|
||
|
});
|
||
|
})
|
||
|
->Active()
|
||
|
->type($type)
|
||
|
->cuisine($cuisine)
|
||
|
->orderBy('open', 'desc')
|
||
|
->orderBy('distance')
|
||
|
->paginate($limit, ['*'], 'page', $offset);
|
||
|
/*$paginator->count();*/
|
||
|
return [
|
||
|
'total_size' => $paginator->total(),
|
||
|
'limit' => $limit,
|
||
|
'offset' => $offset,
|
||
|
'restaurants' => $paginator->items()
|
||
|
];
|
||
|
}
|
||
|
|
||
|
public static function get_latest_restaurants($zone_id, $limit = 10, $offset = 1, $type='all',$longitude=0,$latitude=0)
|
||
|
{
|
||
|
$paginator = Restaurant::withOpen($longitude,$latitude)
|
||
|
->with(['discount'=>function($q){
|
||
|
return $q->validate();
|
||
|
}])->whereIn('zone_id', $zone_id)
|
||
|
->Active()
|
||
|
->type($type)
|
||
|
->latest()
|
||
|
->limit(50)
|
||
|
->get();
|
||
|
// ->paginate($limit, ['*'], 'page', $offset);
|
||
|
/*$paginator->count();*/
|
||
|
return [
|
||
|
'total_size' => $paginator->count(),
|
||
|
'limit' => $limit,
|
||
|
'offset' => $offset,
|
||
|
'restaurants' => $paginator
|
||
|
];
|
||
|
}
|
||
|
|
||
|
public static function get_popular_restaurants($zone_id, $limit = 10, $offset = 1, $type='all',$longitude=0,$latitude=0)
|
||
|
{
|
||
|
$paginator = Restaurant::withOpen($longitude,$latitude)
|
||
|
->with(['discount'=>function($q){
|
||
|
return $q->validate();
|
||
|
}])->whereIn('zone_id', $zone_id)
|
||
|
->Active()
|
||
|
->type($type)
|
||
|
->withCount('orders')
|
||
|
->orderBy('open', 'desc')
|
||
|
->orderBy('orders_count', 'desc')
|
||
|
->limit(50)
|
||
|
->get();
|
||
|
// ->paginate($limit, ['*'], 'page', $offset);
|
||
|
/*$paginator->count();*/
|
||
|
return [
|
||
|
'total_size' => $paginator->count(),
|
||
|
'limit' => $limit,
|
||
|
'offset' => $offset,
|
||
|
'restaurants' => $paginator
|
||
|
];
|
||
|
}
|
||
|
|
||
|
public static function get_restaurant_details($restaurant_id)
|
||
|
{
|
||
|
return Restaurant::with(['discount'=>function($q){
|
||
|
return $q->validate();
|
||
|
}, 'campaigns', 'schedules','restaurant_sub'])->active()
|
||
|
->when(is_numeric($restaurant_id),function ($qurey) use($restaurant_id){
|
||
|
$qurey-> where('id', $restaurant_id);
|
||
|
})
|
||
|
->when(!is_numeric($restaurant_id),function ($qurey) use($restaurant_id){
|
||
|
$qurey-> where('slug', $restaurant_id);
|
||
|
})
|
||
|
->first();
|
||
|
}
|
||
|
|
||
|
public static function calculate_restaurant_rating($ratings)
|
||
|
{
|
||
|
$total_submit = $ratings[0]+$ratings[1]+$ratings[2]+$ratings[3]+$ratings[4];
|
||
|
$rating = ($ratings[0]*5+$ratings[1]*4+$ratings[2]*3+$ratings[3]*2+$ratings[4])/($total_submit?$total_submit:1);
|
||
|
return ['rating'=>$rating, 'total'=>$total_submit];
|
||
|
}
|
||
|
|
||
|
public static function update_restaurant_rating($ratings, $product_rating)
|
||
|
{
|
||
|
$restaurant_ratings = [1=>0 , 2=>0, 3=>0, 4=>0, 5=>0];
|
||
|
if($ratings)
|
||
|
{
|
||
|
$restaurant_ratings[1] = $ratings[4];
|
||
|
$restaurant_ratings[2] = $ratings[3];
|
||
|
$restaurant_ratings[3] = $ratings[2];
|
||
|
$restaurant_ratings[4] = $ratings[1];
|
||
|
$restaurant_ratings[5] = $ratings[0];
|
||
|
$restaurant_ratings[$product_rating] = $ratings[5-$product_rating] + 1;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$restaurant_ratings[$product_rating] = 1;
|
||
|
}
|
||
|
return json_encode($restaurant_ratings);
|
||
|
}
|
||
|
|
||
|
public static function search_restaurants($name, $zone_id, $category_id= null,$limit = 10, $offset = 1, $type='all',$longitude=0,$latitude=0)
|
||
|
{
|
||
|
$key = explode(' ', $name);
|
||
|
$paginator = Restaurant::withOpen($longitude,$latitude)->with(['discount'=>function($q){
|
||
|
return $q->validate();
|
||
|
}])->whereIn('zone_id', $zone_id)->weekday()->where(function ($q) use ($key) {
|
||
|
foreach ($key as $value) {
|
||
|
$q->orWhere('name', 'like', "%{$value}%");
|
||
|
}
|
||
|
})
|
||
|
->when($category_id, function($query)use($category_id){
|
||
|
$query->whereHas('foods.category', function($q)use($category_id){
|
||
|
return $q->whereId($category_id)->orWhere('parent_id', $category_id);
|
||
|
});
|
||
|
})
|
||
|
->active()->type($type)
|
||
|
->orderBy('open', 'desc')
|
||
|
->orderBy('distance')
|
||
|
->paginate($limit, ['*'], 'page', $offset);
|
||
|
|
||
|
return [
|
||
|
'total_size' => $paginator->total(),
|
||
|
'limit' => $limit,
|
||
|
'offset' => $offset,
|
||
|
'restaurants' => $paginator->items()
|
||
|
];
|
||
|
}
|
||
|
|
||
|
public static function get_overall_rating($reviews)
|
||
|
{
|
||
|
$totalRating = count($reviews);
|
||
|
$rating = 0;
|
||
|
foreach ($reviews as $key => $review) {
|
||
|
$rating += $review->rating;
|
||
|
}
|
||
|
if ($totalRating == 0) {
|
||
|
$overallRating = 0;
|
||
|
} else {
|
||
|
$overallRating = number_format($rating / $totalRating, 2);
|
||
|
}
|
||
|
|
||
|
return [$overallRating, $totalRating];
|
||
|
}
|
||
|
|
||
|
public static function get_earning_data($vendor_id)
|
||
|
{
|
||
|
$monthly_earning = OrderTransaction::whereMonth('created_at', date('m'))->NotRefunded()->where('vendor_id', $vendor_id)->sum('restaurant_amount');
|
||
|
$weekly_earning = OrderTransaction::whereBetween('created_at', [now()->startOfWeek(), now()->endOfWeek()])->NotRefunded()->where('vendor_id', $vendor_id)->sum('restaurant_amount');
|
||
|
$daily_earning = OrderTransaction::whereDate('created_at', now())->NotRefunded()->where('vendor_id', $vendor_id)->sum('restaurant_amount');
|
||
|
|
||
|
return['monthely_earning'=>(float)$monthly_earning, 'weekly_earning'=>(float)$weekly_earning, 'daily_earning'=>(float)$daily_earning];
|
||
|
}
|
||
|
|
||
|
public static function format_export_restaurants($restaurants)
|
||
|
{
|
||
|
$storage = [];
|
||
|
foreach($restaurants as $item)
|
||
|
{
|
||
|
$storage[] = [
|
||
|
'id'=>$item->id,
|
||
|
'ownerFirstName'=>$item->f_name,
|
||
|
'ownerLastName'=>$item->l_name,
|
||
|
'restaurantName'=>$item->restaurants[0]->name,
|
||
|
'logo'=>$item->restaurants[0]->logo,
|
||
|
'phone'=>$item->phone,
|
||
|
'email'=>$item->email,
|
||
|
'latitude'=>$item->restaurants[0]->latitude,
|
||
|
'longitude'=>$item->restaurants[0]->longitude,
|
||
|
'zone_id'=>$item->restaurants[0]->zone_id,
|
||
|
'Address'=>$item->restaurants[0]->address ?? null,
|
||
|
// 'FooterText'=>$item->restaurants[0]->footer_text ?? null,
|
||
|
'MinimumOrderAmount'=>$item->restaurants[0]->minimum_order,
|
||
|
'Comission'=>$item->restaurants[0]->comission ?? 0,
|
||
|
'Tax'=>$item->restaurants[0]->tax ?? 0,
|
||
|
|
||
|
'DeliveryTime'=>$item->restaurants[0]->delivery_time ?? '20-30',
|
||
|
'MinimumDeliveryFee'=>$item->restaurants[0]->minimum_shipping_charge ?? 0,
|
||
|
'PerKmDeliveryFee'=>$item->restaurants[0]->per_km_shipping_charge ?? 0,
|
||
|
'MaximumDeliveryFee'=>$item->restaurants[0]->maximum_shipping_charge ?? 0,
|
||
|
// 'order_count'=>$item->restaurants[0]->order_count,
|
||
|
// 'total_order'=>$item->restaurants[0]->total_order,
|
||
|
'RestaurantModel'=>$item->restaurants[0]->restaurant_model,
|
||
|
'ScheduleOrder'=> $item->restaurants[0]->schedule_order == 1 ? 'yes' : 'no',
|
||
|
'FreeDelivery'=> $item->restaurants[0]->free_delivery == 1 ? 'yes' : 'no',
|
||
|
'TakeAway'=> $item->restaurants[0]->take_away == 1 ? 'yes' : 'no',
|
||
|
'Delivery'=> $item->restaurants[0]->delivery == 1 ? 'yes' : 'no',
|
||
|
'Veg'=> $item->restaurants[0]->veg == 1 ? 'yes' : 'no',
|
||
|
'NonVeg'=> $item->restaurants[0]->non_veg == 1 ? 'yes' : 'no',
|
||
|
'Status'=> $item->restaurants[0]->status == 1 ? 'active' : 'inactive',
|
||
|
'FoodSection'=> $item->restaurants[0]->food_section == 1 ? 'active' : 'inactive',
|
||
|
'ReviewsSection'=> $item->restaurants[0]->reviews_section == 1 ? 'active' : 'inactive',
|
||
|
'SelfDeliverySystem'=> $item->restaurants[0]->self_delivery_system == 1 ? 'active' : 'inactive',
|
||
|
'PosSystem'=> $item->restaurants[0]->pos_system == 1 ? 'active' : 'inactive',
|
||
|
'RestaurantOpen'=> $item->restaurants[0]->active == 1 ? 'yes' : 'no',
|
||
|
// 'opening_time'=>$item->restaurants[0]->opening_time,
|
||
|
// 'off_day'=>$item->restaurants[0]->off_day,
|
||
|
// 'gst'=>$item->restaurants[0]->gst,
|
||
|
// 'closing_time'=>$item->restaurants[0]->closeing_time,
|
||
|
];
|
||
|
}
|
||
|
|
||
|
return $storage;
|
||
|
}
|
||
|
public static function format_restaurant_report_export_data($restaurants)
|
||
|
{
|
||
|
$storage = [];
|
||
|
foreach($restaurants as $key => $restaurant)
|
||
|
{
|
||
|
if($restaurant->count()<1)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
if ($restaurant->reviews_count){
|
||
|
$reviews_count = $restaurant->reviews_count;
|
||
|
}
|
||
|
else{
|
||
|
$reviews_count = 1;
|
||
|
}
|
||
|
|
||
|
$restaurant_rating = round($restaurant->reviews_sum_rating /$reviews_count,1);
|
||
|
$storage[] = [
|
||
|
'#'=>$key+1,
|
||
|
translate('messages.restaurant') =>$restaurant->name,
|
||
|
translate('messages.total_food') =>$restaurant->foods_count ?? 0,
|
||
|
translate('messages.total_order') =>$restaurant->without_refund_total_orders_count ?? 0,
|
||
|
translate('messages.total_order').translate('messages.amount') =>$restaurant->transaction_sum_order_amount ?? 0,
|
||
|
translate('messages.total_discount_given') =>$restaurant->transaction_sum_restaurant_expense ?? 0,
|
||
|
translate('messages.total_admin_commission') =>$restaurant->transaction_sum_admin_commission ?? 0,
|
||
|
translate('messages.total_vat_tax') =>$restaurant->transaction_sum_tax ?? 0,
|
||
|
translate('messages.average_ratings') =>$restaurant_rating,
|
||
|
];
|
||
|
}
|
||
|
|
||
|
return $storage;
|
||
|
}
|
||
|
|
||
|
public static function recently_viewed_restaurants_data($zone_id, $limit = 10, $offset = 1, $type='all',$longitude=0,$latitude=0)
|
||
|
{
|
||
|
$user_id = null;
|
||
|
if(auth('api')->user() !== null){
|
||
|
$user_id =auth('api')->user()->id;
|
||
|
}
|
||
|
|
||
|
$paginator = Restaurant::whereHas('users',function ($query) use($user_id){
|
||
|
$query->where('user_id',$user_id);
|
||
|
})
|
||
|
->withOpen($longitude,$latitude)
|
||
|
->with(['discount'=>function($q){
|
||
|
return $q->validate();
|
||
|
}])->whereIn('zone_id', $zone_id)
|
||
|
->Active()
|
||
|
->type($type)
|
||
|
->withCount('orders')
|
||
|
->orderBy('orders_count', 'desc')
|
||
|
->orderBy('open', 'desc')
|
||
|
->limit(50)
|
||
|
->get();
|
||
|
// ->paginate($limit, ['*'], 'page', $offset);
|
||
|
/*$paginator->count();*/
|
||
|
return [
|
||
|
'total_size' => $paginator->count(),
|
||
|
'limit' => $limit,
|
||
|
'offset' => $offset,
|
||
|
'restaurants' => $paginator
|
||
|
];
|
||
|
}
|
||
|
}
|