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.
 
 

1062 lines
47 KiB

<?php
namespace App\Http\Controllers\Admin;
use App\Models\Zone;
use App\Models\AddOn;
use App\Models\Vendor;
use App\Models\Message;
use App\Models\UserInfo;
use App\Models\Restaurant;
use Illuminate\Support\Str;
use App\Models\Conversation;
use Illuminate\Http\Request;
use App\CentralLogics\Helpers;
use Illuminate\Support\Carbon;
use App\Models\BusinessSetting;
use App\Models\WithdrawRequest;
use App\Scopes\RestaurantScope;
use App\Models\OrderTransaction;
use App\Models\RestaurantWallet;
use App\Models\AccountTransaction;
use App\Models\RestaurantSchedule;
use Illuminate\Support\Facades\DB;
use App\Models\SubscriptionPackage;
use App\Http\Controllers\Controller;
use Brian2694\Toastr\Facades\Toastr;
use Illuminate\Support\Facades\Mail;
use Rap2hpoutre\FastExcel\FastExcel;
use App\CentralLogics\RestaurantLogic;
use App\Models\RestaurantSubscription;
use App\Models\SubscriptionTransaction;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
use Grimzy\LaravelMysqlSpatial\Types\Point;
class VendorController extends Controller
{
public function index()
{
return view('admin-views.vendor.index');
}
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'f_name' => 'required|max:100',
'l_name' => 'nullable|max:100',
'name' => 'required|max:191',
'address' => 'required|max:1000',
'latitude' => 'required|numeric|min:-90|max:90',
'longitude' => 'required|numeric|min:-180|max:180',
'email' => 'required|unique:vendors',
'phone' => 'required|regex:/^([0-9\s\-\+\(\)]*)$/|min:10|max:20|unique:vendors',
'minimum_delivery_time' => 'required|regex:/^([0-9]{2})$/|min:2|max:2',
'maximum_delivery_time' => 'required|regex:/^([0-9]{2})$/|min:2|max:2|gt:minimum_delivery_time',
'password' => 'required|min:6',
'zone_id' => 'required',
'logo' => 'required|max:2048',
'cover_photo' => 'required|max:2048',
'tax' => 'required',
], [
'f_name.required' => translate('messages.first_name_is_required')
]);
$cuisine_ids = [];
$cuisine_ids=$request->cuisine_ids;
if ($request->zone_id) {
$point = new Point($request->latitude, $request->longitude);
$zone = Zone::contains('coordinates', $point)->where('id', $request->zone_id)->first();
if (!$zone) {
$validator->getMessageBag()->add('latitude', translate('messages.coordinates_out_of_zone'));
return back()->withErrors($validator)
->withInput();
}
}
if ($validator->fails()) {
return back()
->withErrors($validator)
->withInput();
}
$vendor = new Vendor();
$vendor->f_name = $request->f_name;
$vendor->l_name = $request->l_name;
$vendor->email = $request->email;
$vendor->phone = $request->phone;
$vendor->password = bcrypt($request->password);
$vendor->save();
$restaurant = new Restaurant;
$restaurant->name = $request->name;
$restaurant->phone = $request->phone;
$restaurant->email = $request->email;
$restaurant->logo = Helpers::upload('restaurant/', 'png', $request->file('logo'));
$restaurant->cover_photo = Helpers::upload('restaurant/cover/', 'png', $request->file('cover_photo'));
$restaurant->address = $request->address;
$restaurant->latitude = $request->latitude;
$restaurant->longitude = $request->longitude;
$restaurant->vendor_id = $vendor->id;
$restaurant->zone_id = $request->zone_id;
$restaurant->tax = $request->tax;
$restaurant->restaurant_model = 'none';
$restaurant->delivery_time = $request->minimum_delivery_time . '-' . $request->maximum_delivery_time;
$restaurant->save();
$restaurant->cuisine()->sync($cuisine_ids);
Toastr::success(translate('messages.vendor') . translate('messages.added_successfully'));
return redirect('admin/restaurant/list');
}
public function edit($id)
{
if (env('APP_MODE') == 'demo' && $id == 2) {
Toastr::warning(translate('messages.you_can_not_edit_this_restaurant_please_add_a_new_restaurant_to_edit'));
return back();
}
$restaurant = Restaurant::find($id);
return view('admin-views.vendor.edit', compact('restaurant'));
}
public function update(Request $request, Restaurant $restaurant)
{
$validator = Validator::make($request->all(), [
'f_name' => 'required|max:100',
'l_name' => 'nullable|max:100',
'name' => 'required|max:191',
'email' => 'required|unique:vendors,email,' . $restaurant->vendor->id,
'phone' => 'required|regex:/^([0-9\s\-\+\(\)]*)$/|min:10|max:20|unique:vendors,phone,' . $restaurant->vendor->id,
'zone_id' => 'required',
'latitude' => 'required|min:-90|max:90',
'longitude' => 'required|min:-180|max:180',
'tax' => 'required',
'password' => 'nullable|min:6',
'minimum_delivery_time' => 'required|regex:/^([0-9]{2})$/|min:2|max:2',
'maximum_delivery_time' => 'required|regex:/^([0-9]{2})$/|min:2|max:2|gt:minimum_delivery_time',
'logo' => 'nullable|max:2048',
'cover_photo' => 'nullable|max:2048',
], [
'f_name.required' => translate('messages.first_name_is_required')
]);
if ($request->zone_id) {
$point = new Point($request->latitude, $request->longitude);
$zone = Zone::contains('coordinates', $point)->where('id', $request->zone_id)->first();
if (!$zone) {
$validator->getMessageBag()->add('latitude', translate('messages.coordinates_out_of_zone'));
return back()->withErrors($validator)
->withInput();
}
}
if ($validator->fails()) {
return back()
->withErrors($validator)
->withInput();
}
$vendor = Vendor::findOrFail($restaurant->vendor->id);
$vendor->f_name = $request->f_name;
$vendor->l_name = $request->l_name;
$vendor->email = $request->email;
$vendor->phone = $request->phone;
$vendor->password = strlen($request->password) > 1 ? bcrypt($request->password) : $restaurant->vendor->password;
$vendor->save();
$cuisine_ids = [];
$cuisine_ids=$request->cuisine_ids;
$slug = Str::slug($request->name);
$restaurant->slug = $restaurant->slug? $restaurant->slug :"{$slug}{$restaurant->id}";
$restaurant->email = $request->email;
$restaurant->phone = $request->phone;
$restaurant->logo = $request->has('logo') ? Helpers::update('restaurant/', $restaurant->logo, 'png', $request->file('logo')) : $restaurant->logo;
$restaurant->cover_photo = $request->has('cover_photo') ? Helpers::update('restaurant/cover/', $restaurant->cover_photo, 'png', $request->file('cover_photo')) : $restaurant->cover_photo;
$restaurant->name = $request->name;
$restaurant->address = $request->address;
$restaurant->latitude = $request->latitude;
$restaurant->longitude = $request->longitude;
$restaurant->zone_id = $request->zone_id;
$restaurant->tax = $request->tax;
$restaurant->delivery_time = $request->minimum_delivery_time . '-' . $request->maximum_delivery_time;
$restaurant->save();
$restaurant->cuisine()->sync($cuisine_ids);
if ($vendor->userinfo) {
$userinfo = $vendor->userinfo;
$userinfo->f_name = $request->name;
$userinfo->l_name = '';
$userinfo->email = $request->email;
$userinfo->image = $restaurant->logo;
$userinfo->save();
}
Toastr::success(translate('messages.restaurant') . translate('messages.updated_successfully'));
return redirect('admin/restaurant/list');
}
public function destroy(Request $request, Restaurant $restaurant)
{
if (env('APP_MODE') == 'demo' && $restaurant->id == 2) {
Toastr::warning(translate('messages.you_can_not_delete_this_restaurant_please_add_a_new_restaurant_to_delete'));
return back();
}
if (Storage::disk('public')->exists('restaurant/' . $restaurant['logo'])) {
Storage::disk('public')->delete('restaurant/' . $restaurant['logo']);
}
$restaurant->delete();
$vendor = Vendor::findOrFail($restaurant->vendor->id);
if($vendor->userinfo){
$vendor->userinfo->delete();
}
$vendor->delete();
Toastr::success(translate('messages.restaurant') . ' ' . translate('messages.removed'));
return back();
}
public function view(Restaurant $restaurant,Request $request, $tab = null, $sub_tab = 'cash')
{
$wallet = $restaurant->vendor->wallet;
if (!$wallet) {
$wallet = new RestaurantWallet();
$wallet->vendor_id = $restaurant->vendor->id;
$wallet->total_earning = 0.0;
$wallet->total_withdrawn = 0.0;
$wallet->pending_withdraw = 0.0;
$wallet->created_at = now();
$wallet->updated_at = now();
$wallet->save();
}
if ($tab == 'settings') {
return view('admin-views.vendor.view.settings', compact('restaurant'));
} else if ($tab == 'order') {
return view('admin-views.vendor.view.order', compact('restaurant'));
} else if ($tab == 'product') {
return view('admin-views.vendor.view.product', compact('restaurant'));
} else if ($tab == 'discount') {
return view('admin-views.vendor.view.discount', compact('restaurant'));
} else if ($tab == 'transaction') {
return view('admin-views.vendor.view.transaction', compact('restaurant', 'sub_tab'));
} else if ($tab == 'reviews') {
return view('admin-views.vendor.view.review', compact('restaurant', 'sub_tab'));
} else if ($tab == 'conversations') {
$user = UserInfo::where(['vendor_id' => $restaurant->vendor->id])->first();
if ($user) {
$conversations = Conversation::with(['sender', 'receiver', 'last_message'])->WhereUser($user->id)
->paginate(8);
} else {
$conversations = [];
}
return view('admin-views.vendor.view.conversations', compact('restaurant', 'sub_tab', 'conversations'));
} elseif ($tab == 'subscriptions'){
$id=$restaurant->id;
if ($restaurant->restaurant_model == 'subscription' || $restaurant->restaurant_model == 'unsubscribed') {
$rest_subscription= RestaurantSubscription::where('restaurant_id', $id)->with(['package'])->latest()->first();
$package_id=(isset($rest_subscription->package_id)) ? $rest_subscription->package_id : 0 ;
$total_bill=SubscriptionTransaction::where('restaurant_id', $id)->where('package_id', $package_id)->sum('paid_amount');
$packages= SubscriptionPackage::where('status', 1)->get();
return view('admin-views.vendor.view.subscriptions', compact('restaurant', 'rest_subscription','package_id','total_bill','packages'));
} else{
abort(404);
}
} elseif ($tab == 'subscriptions-transactions'){
$filter = $request->query('filter', 'all');
$transcations = SubscriptionTransaction::where('restaurant_id', $restaurant->id)
->when($filter == 'month', function ($query) {
return $query->whereMonth('created_at', Carbon::now()->month);
})
->when($filter == 'year', function ($query) {
return $query->whereYear('created_at', Carbon::now()->year);
})
->latest()->paginate(config('default_pagination'));
$total = $transcations->total();
return view('admin-views.vendor.view.subs_transaction',[
'transcations' => $transcations,
'filter' => $filter,
'total' => $total,
'restaurant' => $restaurant,
]);
}
return view('admin-views.vendor.view.index', compact('restaurant','wallet'));
}
public function rest_transcation_search(Request $request)
{
$key = explode(' ', $request['search']);
$transcations = SubscriptionTransaction::where('restaurant_id',$request->id)->where(function ($q) use ($key) {
foreach ($key as $value) {
$q->orWhere('id', 'like', "%{$value}%")
->orWhere('paid_amount', 'like', "%{$value}%")
->orWhere('reference', 'like', "%{$value}%")
->orWheredate('created_at', 'like', "%{$value}%");
}
})
->get();
$total = $transcations->count();
return response()->json([
'view' => view('admin-views.vendor.view.partials._rest_subs_transcation', compact('transcations','total'))->render(), 'total'=> $total
]);
}
public function trans_search_by_date(Request $request){
$from=$request->start_date;
$to= $request->end_date;
$id= $request->id;
$filter = 'all';
$restaurant=Restaurant::findOrFail($id);
$transcations=SubscriptionTransaction::where('restaurant_id', $restaurant->id)
->whereBetween('created_at', ["{$from}", "{$to} 23:59:59"])
->latest()->paginate(config('default_pagination'));
$total = $transcations->total();
return view('admin-views.vendor.view.subs_transaction',[
'transcations' => $transcations,
'filter' => $filter,
'total' => $total,
'restaurant' => $restaurant,
'from' => $from,
'to' => $to,
]);
}
public function view_tab(Restaurant $restaurant)
{
Toastr::error(translate('messages.unknown_tab'));
return back();
}
public function list(Request $request)
{
$zone_id = $request->query('zone_id', 'all');
$cuisine_id = $request->query('cuisine_id', 'all');
$type = $request->query('type', 'all');
$typ = $request->query('restaurant_model', '');
$restaurants = Restaurant::when(is_numeric($zone_id), function ($query) use ($zone_id) {
return $query->where('zone_id', $zone_id);
})
->with('vendor')
->withSum('reviews' , 'rating')
->withCount('reviews')
->whereHas('vendor', function($q){
$q->where('status',1);
})
// ->when($cuisine_id,function($query) use($cuisine_id){
// $query->whereHas('cuisine', function ($query) use ($cuisine_id){
// $query->where('cuisine_restaurant.cuisine_id', $cuisine_id);
// });
// })
->cuisine($cuisine_id)
->type($type)->RestaurantModel($typ)->latest()->paginate(config('default_pagination'));
$zone = is_numeric($zone_id) ? Zone::findOrFail($zone_id) : null;
return view('admin-views.vendor.list', compact('restaurants', 'zone', 'type','typ','cuisine_id'));
}
public function pending(Request $request)
{
$key = explode(' ', $request['search']);
$zone_id = $request->query('zone_id', 'all');
$type = $request->query('type', 'all');
$typ = $request->query('restaurant_model', '');
$restaurants = Restaurant::when(is_numeric($zone_id), function ($query) use ($zone_id) {
return $query->where('zone_id', $zone_id);
})
->when(isset($key),function($query)use($key){
$query->where(function($q)use($key){
foreach ($key as $value) {
$q->orWhere('name', 'like', "%{$value}%")
->orWhere('email', 'like', "%{$value}%")
->orWhere('phone', 'like', "%{$value}%");
}
});
})
->with('vendor')
->whereHas('vendor', function ($q) {
$q->where('status', null);
})
->type($type)->RestaurantModel($typ)->latest()->paginate(config('default_pagination'));
$zone = is_numeric($zone_id) ? Zone::findOrFail($zone_id) : null;
return view('admin-views.vendor.pending_list', compact('restaurants', 'zone', 'type','typ'));
}
public function denied(Request $request)
{
$key = explode(' ', $request['search']);
$zone_id = $request->query('zone_id', 'all');
$type = $request->query('type', 'all');
$typ = $request->query('restaurant_model', '');
$restaurants = Restaurant::when(is_numeric($zone_id), function ($query) use ($zone_id) {
return $query->where('zone_id', $zone_id);
})
->when(isset($key),function($query)use($key){
$query->where(function($q)use($key){
foreach ($key as $value) {
$q->orWhere('name', 'like', "%{$value}%")
->orWhere('email', 'like', "%{$value}%")
->orWhere('phone', 'like', "%{$value}%");
}
});
})
->with('vendor')
->whereHas('vendor', function ($q) {
$q->Where('status', 0);
})
->type($type)->RestaurantModel($typ)->latest()->paginate(config('default_pagination'));
$zone = is_numeric($zone_id) ? Zone::findOrFail($zone_id) : null;
return view('admin-views.vendor.denied', compact('restaurants', 'zone', 'type','typ'));
}
public function search(Request $request)
{
$key = explode(' ', $request['search']);
$restaurants = Restaurant::whereHas('vendor', function($q){
$q->where('status',1);
})
->where(function($query)use ($key){
$query->orWhereHas('vendor', function ($q) use ($key) {
foreach ($key as $value) {
$q->orWhere('f_name', 'like', "%{$value}%")
->orWhere('l_name', 'like', "%{$value}%")
->orWhere('email', 'like', "%{$value}%")
->orWhere('phone', 'like', "%{$value}%");
}
})
->where(function ($q) use ($key) {
foreach ($key as $value) {
$q->orWhere('name', 'like', "%{$value}%")
->orWhere('email', 'like', "%{$value}%")
->orWhere('phone', 'like', "%{$value}%");
}
});
})
->withSum('reviews' , 'rating')
->withCount('reviews')
->get();
$total = $restaurants->count();
return response()->json([
'view' => view('admin-views.vendor.partials._table', compact('restaurants'))->render(), 'total' => $total
]);
}
public function get_restaurants(Request $request)
{
$zone_ids = isset($request->zone_ids) ? (count($request->zone_ids) > 0 ? $request->zone_ids : []) : 0;
$data = Restaurant::join('zones', 'zones.id', '=', 'restaurants.zone_id')
->when($zone_ids, function ($query) use ($zone_ids) {
$query->whereIn('restaurants.zone_id', $zone_ids);
})->where('restaurants.name', 'like', '%' . $request->q . '%')->limit(8)->get([DB::raw('restaurants.id as id, CONCAT(restaurants.name, " (", zones.name,")") as text')]);
if (isset($request->all)) {
$data[] = (object)['id' => 'all', 'text' => 'All'];
}
return response()->json($data);
}
public function status(Restaurant $restaurant, Request $request)
{
$restaurant->status = $request->status;
$restaurant->save();
$vendor = $restaurant->vendor;
try {
if ($request->status == 0) {
$vendor->auth_token = null;
if (isset($vendor->fcm_token)) {
$data = [
'title' => translate('messages.suspended'),
'description' => translate('messages.your_account_has_been_suspended'),
'order_id' => '',
'image' => '',
'type' => 'block'
];
Helpers::send_push_notif_to_device($vendor->fcm_token, $data);
DB::table('user_notifications')->insert([
'data' => json_encode($data),
'vendor_id' => $vendor->id,
'created_at' => now(),
'updated_at' => now()
]);
}
}
} catch (\Exception $e) {
Toastr::warning(translate('messages.push_notification_faild'));
}
Toastr::success(translate('messages.restaurant') . translate('messages.status_updated'));
return back();
}
public function restaurant_status(Restaurant $restaurant, Request $request)
{
// dd($request->menu);
if ($request->menu == "schedule_order" && !Helpers::schedule_order()) {
Toastr::warning(translate('messages.schedule_order_disabled_warning'));
return back();
}
if ((($request->menu == "delivery" && $restaurant->take_away == 0) || ($request->menu == "take_away" && $restaurant->delivery == 0)) && $request->status == 0) {
Toastr::warning(translate('messages.can_not_disable_both_take_away_and_delivery'));
return back();
}
if ((($request->menu == "veg" && $restaurant->non_veg == 0) || ($request->menu == "non_veg" && $restaurant->veg == 0)) && $request->status == 0) {
Toastr::warning(translate('messages.veg_non_veg_disable_warning'));
return back();
}
if ($request->menu == "self_delivery_system" && $request->status == '0') {
$restaurant['free_delivery'] = 0;
$restaurant->coupon()->where('created_by','vendor')->where('coupon_type','free_delivery')->delete();
}
$restaurant[$request->menu] = $request->status;
$restaurant->save();
Toastr::success(translate('messages.restaurant') . translate('messages.settings_updated'));
return back();
}
public function discountSetup(Restaurant $restaurant, Request $request)
{
$message = translate('messages.discount');
$message .= $restaurant->discount ? translate('messages.updated_successfully') : translate('messages.added_successfully');
$restaurant->discount()->updateOrinsert(
[
'restaurant_id' => $restaurant->id
],
[
'start_date' => $request->start_date,
'end_date' => $request->end_date,
'start_time' => $request->start_time,
'end_time' => $request->end_time,
'min_purchase' => $request->min_purchase != null ? $request->min_purchase : 0,
'max_discount' => $request->max_discount != null ? $request->max_discount : 0,
'discount' => $request->discount_type == 'amount' ? $request->discount : $request['discount'],
'discount_type' => 'percent'
]
);
return response()->json(['message' => $message], 200);
}
public function updateRestaurantSettings(Restaurant $restaurant, Request $request)
{
if(isset($request->restaurant_model)){
if($request->restaurant_model == 'subscription'){
$restaurant->restaurant_model= 'unsubscribed';
$restaurant->status=0;
} elseif($request->restaurant_model == 'commission'){
$restaurant->restaurant_model= 'commission';
}
if(isset($restaurant->restaurant_sub)){
$restaurant->restaurant_sub->update([
'status'=>0,
]);
}
$restaurant->save();
Toastr::success(translate('messages.restaurant') .' '.translate('messages.Business_Model_Updated'));
return back();
}
$request->validate([
'minimum_order' => 'required',
// 'comission' => 'required',
'tax' => 'required',
'minimum_delivery_time' => 'required|regex:/^([0-9]{2})$/|min:2|max:2',
'maximum_delivery_time' => 'required|regex:/^([0-9]{2})$/|min:2|max:2|gt:minimum_delivery_time',
]);
if ($request->comission_status) {
$restaurant->comission = $request->comission;
} else {
$restaurant->comission = null;
}
$restaurant->minimum_order = $request->minimum_order;
$restaurant->opening_time = $request->opening_time;
$restaurant->closeing_time = $request->closeing_time;
$restaurant->tax = $request->tax;
$restaurant->delivery_time = $request->minimum_delivery_time . '-' . $request->maximum_delivery_time;
if ($request->menu == "veg") {
$restaurant->veg = 1;
$restaurant->non_veg = 0;
} elseif ($request->menu == "non-veg") {
$restaurant->veg = 0;
$restaurant->non_veg = 1;
} elseif ($request->menu == "both") {
$restaurant->veg = 1;
$restaurant->non_veg = 1;
}
$restaurant->save();
Toastr::success(translate('messages.restaurant') . translate('messages.settings_updated'));
return back();
}
public function update_application($id,$status)
{
$restaurant = Restaurant::findOrFail($id);
$restaurant->vendor->status = $status;
$restaurant->vendor->save();
if ($status) $restaurant->status = 1;
if(isset($restaurant->restaurant_sub_trans) && isset($restaurant->restaurant_sub_update_application) && $restaurant->restaurant_sub_trans->payment_method == 'free_trial'){
$free_trial_period_data = json_decode(BusinessSetting::where(['key' => 'free_trial_period'])->first()->value,true);
$free_trial_period= (isset($free_trial_period_data['data']) ? $free_trial_period_data['data'] : 0);
$restaurant->restaurant_sub_update_application->update([
'expiry_date'=> Carbon::now()->addDays($free_trial_period)->format('Y-m-d'),
'status'=>1
]);
$restaurant->restaurant_model= 'subscription';
} elseif (isset($restaurant->restaurant_sub_trans) && isset($restaurant->restaurant_sub_update_application) && $restaurant->restaurant_sub_trans->payment_method != 'free_trial') {
$add_days=$restaurant->restaurant_sub_trans->validity;
$restaurant->restaurant_sub_update_application->update([
'expiry_date'=> Carbon::now()->addDays($add_days)->format('Y-m-d'),
'status'=>1
]);
$restaurant->restaurant_model= 'subscription';
}
$restaurant->save();
try {
if (config('mail.status')) {
Mail::to($restaurant->vendor->email)->send(new \App\Mail\SelfRegistration($status == 1 ? 'approved' : 'denied', $restaurant->vendor->f_name . ' ' . $restaurant->vendor->l_name));
}
} catch (\Exception $ex) {
info($ex);
}
Toastr::success(translate('messages.application_status_updated_successfully'));
return back();
}
public function cleardiscount(Restaurant $restaurant)
{
$restaurant->discount->delete();
Toastr::success(translate('messages.restaurant') . translate('messages.discount_cleared'));
return back();
}
public function withdraw()
{
$all = session()->has('withdraw_status_filter') && session('withdraw_status_filter') == 'all' ? 1 : 0;
$active = session()->has('withdraw_status_filter') && session('withdraw_status_filter') == 'approved' ? 1 : 0;
$denied = session()->has('withdraw_status_filter') && session('withdraw_status_filter') == 'denied' ? 1 : 0;
$pending = session()->has('withdraw_status_filter') && session('withdraw_status_filter') == 'pending' ? 1 : 0;
$withdraw_req = WithdrawRequest::with(['vendor'])
->when($all, function ($query) {
return $query;
})
->when($active, function ($query) {
return $query->where('approved', 1);
})
->when($denied, function ($query) {
return $query->where('approved', 2);
})
->when($pending, function ($query) {
return $query->where('approved', 0);
})
->latest()
->paginate(config('default_pagination'));
return view('admin-views.wallet.withdraw', compact('withdraw_req'));
}
public function withdraw_view($withdraw_id, $seller_id)
{
$wr = WithdrawRequest::with(['vendor','method:id,method_name'])->where(['id' => $withdraw_id])->first();
return view('admin-views.wallet.withdraw-view', compact('wr'));
}
public function status_filter(Request $request)
{
session()->put('withdraw_status_filter', $request['withdraw_status_filter']);
return response()->json(session('withdraw_status_filter'));
}
public function withdrawStatus(Request $request, $id)
{
$withdraw = WithdrawRequest::findOrFail($id);
$withdraw->approved = $request->approved;
$withdraw->transaction_note = $request['note'];
if ($request->approved == 1) {
RestaurantWallet::where('vendor_id', $withdraw->vendor_id)->increment('total_withdrawn', $withdraw->amount);
RestaurantWallet::where('vendor_id', $withdraw->vendor_id)->decrement('pending_withdraw', $withdraw->amount);
$withdraw->save();
Toastr::success(translate('messages.seller_payment_approved'));
return redirect()->route('admin.restaurant.withdraw_list');
} else if ($request->approved == 2) {
RestaurantWallet::where('vendor_id', $withdraw->vendor_id)->decrement('pending_withdraw', $withdraw->amount);
$withdraw->save();
Toastr::info(translate('messages.seller_payment_denied'));
return redirect()->route('admin.restaurant.withdraw_list');
} else {
Toastr::error(translate('messages.not_found'));
return back();
}
}
public function get_addons(Request $request)
{
$cat = AddOn::withoutGlobalScope(RestaurantScope::class)->withoutGlobalScope('translate')->where(['restaurant_id' => $request->restaurant_id])->active()->get();
$res = '';
foreach ($cat as $row) {
$res .= '<option value="' . $row->id . '"';
if (count($request->data)) {
$res .= in_array($row->id, $request->data) ? 'selected' : '';
}
$res .= '>' . $row->name . '</option>';
}
return response()->json([
'options' => $res,
]);
}
public function get_restaurant_data(Restaurant $restaurant)
{
return response()->json($restaurant);
}
public function restaurant_filter($id)
{
if ($id == 'all') {
if (session()->has('restaurant_filter')) {
session()->forget('restaurant_filter');
}
} else {
session()->put('restaurant_filter', Restaurant::where('id', $id)->first(['id', 'name']));
}
return back();
}
public function get_account_data(Restaurant $restaurant)
{
$wallet = $restaurant->vendor->wallet;
$cash_in_hand = 0;
$balance = 0;
if ($wallet) {
$cash_in_hand = $wallet->collected_cash;
$balance = $wallet->total_earning - $wallet->total_withdrawn - $wallet->pending_withdraw - $wallet->collected_cash;
}
return response()->json(['cash_in_hand' => $cash_in_hand, 'earning_balance' => $balance], 200);
}
public function bulk_import_index()
{
return view('admin-views.vendor.bulk-import');
}
public function bulk_import_data(Request $request)
{
try {
$collections = (new FastExcel)->import($request->file('products_file'));
} catch (\Exception $exception) {
Toastr::error(translate('messages.you_have_uploaded_a_wrong_format_file'));
return back();
}
$duplicate_phones = $collections->duplicates('phone');
$duplicate_emails = $collections->duplicates('email');
// dd(['Phone'=>$duplicate_phones, 'Email'=>$duplicate_emails]);
if ($duplicate_emails->isNotEmpty()) {
Toastr::error(translate('messages.duplicate_data_on_column', ['field' => translate('messages.email')]));
return back();
}
if ($duplicate_phones->isNotEmpty()) {
Toastr::error(translate('messages.duplicate_data_on_column', ['field' => translate('messages.phone')]));
return back();
}
$vendors = [];
$restaurants = [];
$vendor = Vendor::orderBy('id', 'desc')->first('id');
$vendor_id = $vendor ? $vendor->id : 0;
foreach ($collections as $key => $collection) {
if ($collection['ownerFirstName'] === "" || $collection['restaurantName'] === "" || $collection['phone'] === ""
|| $collection['email'] === "" || $collection['latitude'] === "" || $collection['longitude'] === ""
|| $collection['zone_id'] === "" || $collection['DeliveryTime'] === "" || $collection['RestaurantModel'] === "" ) {
Toastr::error(translate('messages.please_fill_all_required_fields'));
return back();
}
if(isset($collection['DeliveryTime']) && explode("-", (string)$collection['DeliveryTime'])[0] > explode("-", (string)$collection['DeliveryTime'])[1]){
Toastr::error('messages.max_delivery_time_must_be_greater_than_min_delivery_time');
return back();
}
if(isset($collection['Comission']) && ($collection['Comission'] < 0 || $collection['Comission'] > 100) ) {
Toastr::error('messages.Comission_must_be_in_0_to_100');
}
if(isset($collection['Tax']) && ($collection['Tax'] < 0 || $collection['Tax'] > 100 )) {
Toastr::error('messages.Tax_must_be_in_0_to_100');
}
if(isset($collection['latitude']) && ($collection['latitude'] < -90 || $collection['latitude'] > 90 )) {
Toastr::error('messages.latitude_must_be_in_-90_to_90');
}
if(isset($collection['longitude']) && ($collection['longitude'] < -180 || $collection['longitude'] > 180 )) {
Toastr::error('messages.longitude_must_be_in_-180_to_180');
}
if(isset($collection['MinimumDeliveryFee']) && ($collection['MinimumDeliveryFee'] < 0 )) {
Toastr::error('messages.Enter_valid_Minimum_Delivery_Fee');
}
if(isset($collection['MinimumOrderAmount']) && ($collection['MinimumOrderAmount'] < 0 )) {
Toastr::error('messages.Enter_valid_Minimum_Order_Amount');
}
if(isset($collection['PerKmDeliveryFee']) && ($collection['PerKmDeliveryFee'] < 0 )) {
Toastr::error('messages.Enter_valid_Per_Km_Delivery_Fee');
}
if(isset($collection['MaximumDeliveryFee']) && ($collection['MaximumDeliveryFee'] < 0 ) ) {
Toastr::error('messages.Enter_valid_Maximum_Delivery_Fee');
}
array_push($vendors, [
'id' => $vendor_id + $key + 1,
'f_name' => $collection['ownerFirstName'],
'l_name' => $collection['ownerLastName'],
'password' => bcrypt(12345678),
'phone' => $collection['phone'],
'email' => $collection['email'],
'status' => 1,
'created_at' => now(),
'updated_at' => now()
]);
array_push($restaurants, [
'name' => $collection['restaurantName'],
'logo' => $collection['logo'],
'phone' => $collection['phone'],
'email' => $collection['email'],
'latitude' => $collection['latitude'],
'longitude' => $collection['longitude'],
'vendor_id' => $vendor_id + $key + 1,
'zone_id' => $collection['zone_id'],
'address' => $collection['Address'],
// 'footer_text' => $collection['FooterText'],
'tax' => $collection['Tax'] ?? 0,
'minimum_order' => $collection['MinimumOrderAmount'] ?? 0,
'delivery_time' => $collection['DeliveryTime'] ?? '15-30',
'comission' => $collection['Comission'] ?? 'comission',
'minimum_shipping_charge' => $collection['MinimumDeliveryFee'] ?? 0,
'per_km_shipping_charge' => $collection['PerKmDeliveryFee'] ?? 0,
'maximum_shipping_charge' => $collection['MaximumDeliveryFee'] ?? 0,
// 'restaurant_model' => $collection['RestaurantModel'] ?? 'commission',
'restaurant_model' => $collection['RestaurantModel'] == 'subscription' ? 'unsubscribed' : 'commission' ,
'schedule_order' => $collection['ScheduleOrder'] == 'yes' ? 1 : 0,
'take_away' => $collection['TakeAway'] == 'yes' ? 1 : 0,
'free_delivery' => $collection['FreeDelivery'] == 'yes' ? 1 : 0,
'veg' => $collection['Veg'] == 'yes' ? 1 : 0,
'non_veg' => $collection['NonVeg'] == 'yes' ? 1 : 0,
'delivery' => $collection['Delivery'] == 'yes' ? 1 : 0,
'status' => $collection['Status'] == 'active' ? 1 : 0,
'food_section' => $collection['FoodSection'] == 'active' ?1 : 0,
'reviews_section' => $collection['ReviewsSection'] == 'active' ?1 : 0,
'pos_system' => $collection['PosSystem'] == 'active' ?1 : 0,
'self_delivery_system' => $collection['SelfDeliverySystem'] == 'active' ?1 : 0,
'active' => $collection['RestaurantOpen'] == 'yes' ?1 : 0,
'created_at' => now(),
'updated_at' => now()
]);
}
try {
DB::beginTransaction();
DB::table('vendors')->insert($vendors);
DB::table('restaurants')->insert($restaurants);
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
info($e);
Toastr::error(translate('messages.failed_to_import_data'));
return back();
}
Toastr::success(translate('messages.restaurant_imported_successfully', ['count' => count($restaurants)]));
return back();
}
public function bulk_export_index()
{
return view('admin-views.vendor.bulk-export');
}
public function bulk_export_data(Request $request)
{
$request->validate([
'type' => 'required',
'start_id' => 'required_if:type,id_wise',
'end_id' => 'required_if:type,id_wise',
'from_date' => 'required_if:type,date_wise',
'to_date' => 'required_if:type,date_wise'
]);
$vendors = Vendor::with('restaurants')->has('restaurants')
->when($request['type'] == 'date_wise', function ($query) use ($request) {
$query->whereBetween('created_at', [$request['from_date'] . ' 00:00:00', $request['to_date'] . ' 23:59:59']);
})
->when($request['type'] == 'id_wise', function ($query) use ($request) {
$query->whereBetween('id', [$request['start_id'], $request['end_id']]);
})
->when($request->type == 'all' ,function($q){
$q->where('status',1);
})
->get();
return (new FastExcel(RestaurantLogic::format_export_restaurants($vendors)))->download('Restaurants.xlsx');
}
public function add_schedule(Request $request)
{
$validator = Validator::make($request->all(), [
'start_time' => 'required|date_format:H:i',
'end_time' => 'required|date_format:H:i|after:start_time',
'restaurant_id' => 'required',
], [
'end_time.after' => translate('messages.End time must be after the start time')
]);
if ($validator->fails()) {
return response()->json(['errors' => Helpers::error_processor($validator)]);
}
$temp = RestaurantSchedule::where('day', $request->day)->where('restaurant_id', $request->restaurant_id)
->where(function ($q) use ($request) {
return $q->where(function ($query) use ($request) {
return $query->where('opening_time', '<=', $request->start_time)->where('closing_time', '>=', $request->start_time);
})->orWhere(function ($query) use ($request) {
return $query->where('opening_time', '<=', $request->end_time)->where('closing_time', '>=', $request->end_time);
});
})
->first();
if (isset($temp)) {
return response()->json(['errors' => [
['code' => 'time', 'message' => translate('messages.schedule_overlapping_warning')]
]]);
}
$restaurant = Restaurant::find($request->restaurant_id);
$restaurant_schedule = RestaurantSchedule::insert(['restaurant_id' => $request->restaurant_id, 'day' => $request->day, 'opening_time' => $request->start_time, 'closing_time' => $request->end_time]);
return response()->json([
'view' => view('admin-views.vendor.view.partials._schedule', compact('restaurant'))->render(),
]);
}
public function remove_schedule($restaurant_schedule)
{
$schedule = RestaurantSchedule::find($restaurant_schedule);
if (!$schedule) {
return response()->json([], 404);
}
$restaurant = $schedule->restaurant;
$schedule->delete();
return response()->json([
'view' => view('admin-views.vendor.view.partials._schedule', compact('restaurant'))->render(),
]);
}
public function restaurants_export( Request $request, $type)
{
$zone_id = $request->query('zone_id', 'all');
$restaurant_model = $request->query('restaurant_model', '');
$ty = $request->query('ty', 'all');
$restaurants = Restaurant::when(is_numeric($zone_id), function ($query) use ($zone_id) {
return $query->where('zone_id', $zone_id);
})
->type($ty)->RestaurantModel($restaurant_model)->latest()->with('vendor', 'zone')->get();
if ($type == 'excel') {
return (new FastExcel(Helpers::export_restaurants($restaurants)))->download('Restaurants.xlsx');
} elseif ($type == 'csv') {
return (new FastExcel(Helpers::export_restaurants($restaurants)))->download('Restaurants.csv');
}
}
public function withdraw_list_export(Request $request)
{
$withdraw_request = WithdrawRequest::latest()->get();
if ($request->type == 'excel') {
return (new FastExcel(Helpers::restaurant_withdraw_list_export($withdraw_request)))->download('WithdrawRequests.xlsx');
} elseif ($request->type == 'csv') {
return (new FastExcel(Helpers::restaurant_withdraw_list_export($withdraw_request)))->download('WithdrawRequests.csv');
}
}
public function conversation_list(Request $request)
{
$user = UserInfo::where('vendor_id', $request->user_id)->first();
$conversations = Conversation::WhereUser($user->id);
if ($request->query('key') != null) {
$key = explode(' ', $request->get('key'));
$conversations = $conversations->where(function ($qu) use ($key) {
$qu->whereHas('sender', function ($query) use ($key) {
foreach ($key as $value) {
$query->where('f_name', 'like', "%{$value}%")->orWhere('l_name', 'like', "%{$value}%")->orWhere('phone', 'like', "%{$value}%");
}
})->orWhereHas('receiver', function ($query1) use ($key) {
foreach ($key as $value) {
$query1->where('f_name', 'like', "%{$value}%")->orWhere('l_name', 'like', "%{$value}%")->orWhere('phone', 'like', "%{$value}%");
}
});
});
}
$conversations = $conversations->paginate(8);
$view = view('admin-views.vendor.view.partials._conversation_list', compact('conversations'))->render();
return response()->json(['html' => $view]);
}
public function conversation_view($conversation_id, $user_id)
{
$convs = Message::where(['conversation_id' => $conversation_id])->get();
$conversation = Conversation::find($conversation_id);
$receiver = UserInfo::find($conversation->receiver_id);
$sender = UserInfo::find($conversation->sender_id);
$user = UserInfo::find($user_id);
return response()->json([
'view' => view('admin-views.vendor.view.partials._conversations', compact('convs', 'user', 'receiver'))->render()
]);
}
public function cash_transaction_export(Request $request)
{
$transaction = AccountTransaction::where('from_type', 'restaurant')->where('from_id', $request->restaurant)->get();
if ($request->type == 'excel') {
return (new FastExcel($transaction))->download('CashTransaction.xlsx');
} elseif ($request->type == 'csv') {
return (new FastExcel($transaction))->download('CashTransaction.csv');
}
}
public function digital_transaction_export(Request $request)
{
$transaction = OrderTransaction::where('vendor_id', $request->restaurant)->latest()->get();
if ($request->type == 'excel') {
return (new FastExcel($transaction))->download('AdminOrderTransaction.xlsx');
} elseif ($request->type == 'csv') {
return (new FastExcel($transaction))->download('AdminOrderTransaction.csv');
}
}
public function withdraw_transaction_export(Request $request)
{
$transaction = WithdrawRequest::where('vendor_id', $request->restaurant)->get();
if ($request->type == 'excel') {
return (new FastExcel($transaction))->download('WithdrawTransaction.xlsx');
} elseif ($request->type == 'csv') {
return (new FastExcel($transaction))->download('WithdrawTransaction.csv');
}
}
public function withdraw_search(Request $request)
{
$key = explode(' ', $request['search']);
$withdraw_req = WithdrawRequest::whereHas('vendor', function ($query) use ($key) {
$query->whereHas('restaurants', function ($q) use ($key) {
foreach ($key as $value) {
$q->where('name', 'like', "%{$value}%");
}
});
})->get();
return response()->json([
'view' => view('admin-views.wallet.partials._table', compact('withdraw_req'))->render(),
'total' => $withdraw_req->count()
]);
}
}