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.
		
		
		
		
		
			
		
			
				
					
					
						
							209 lines
						
					
					
						
							7.7 KiB
						
					
					
				
			
		
		
	
	
							209 lines
						
					
					
						
							7.7 KiB
						
					
					
				<?php
 | 
						|
 | 
						|
namespace App\Http\Controllers\Admin;
 | 
						|
 | 
						|
use App\Http\Controllers\Controller;
 | 
						|
use App\Models\Order;
 | 
						|
use App\Models\User;
 | 
						|
use Brian2694\Toastr\Facades\Toastr;
 | 
						|
use Illuminate\Http\Request;
 | 
						|
use Illuminate\Support\Facades\DB;
 | 
						|
use App\CentralLogics\Helpers;
 | 
						|
use App\Models\BusinessSetting;
 | 
						|
use App\Models\Newsletter;
 | 
						|
 | 
						|
class CustomerController extends Controller
 | 
						|
{
 | 
						|
    public function customer_list(Request $request)
 | 
						|
    {
 | 
						|
        $key = [];
 | 
						|
        if($request->search)
 | 
						|
        {
 | 
						|
            $key = explode(' ', $request['search']);
 | 
						|
        }
 | 
						|
        $customers = User::
 | 
						|
        when(count($key) > 0, function($query)use($key){
 | 
						|
            foreach ($key as $value) {
 | 
						|
                $query->orWhere('f_name', 'like', "%{$value}%")
 | 
						|
                    ->orWhere('l_name', 'like', "%{$value}%")
 | 
						|
                    ->orWhere('email', 'like', "%{$value}%")
 | 
						|
                    ->orWhere('phone', 'like', "%{$value}%");
 | 
						|
            };
 | 
						|
        })
 | 
						|
        ->orderBy('order_count','desc')->paginate(config('default_pagination'));
 | 
						|
        return view('admin-views.customer.list', compact('customers'));
 | 
						|
    }
 | 
						|
 | 
						|
    public function status(User $customer, Request $request)
 | 
						|
    {
 | 
						|
        $customer->status = $request->status;
 | 
						|
        $customer->save();
 | 
						|
 | 
						|
        try
 | 
						|
        {
 | 
						|
            if($request->status == 0)
 | 
						|
            {   $customer->tokens->each(function ($token, $key) {
 | 
						|
                    $token->delete();
 | 
						|
                });
 | 
						|
                if(isset($customer->cm_firebase_token))
 | 
						|
                {
 | 
						|
                    $data = [
 | 
						|
                        'title' => translate('messages.suspended'),
 | 
						|
                        'description' => translate('messages.your_account_has_been_blocked'),
 | 
						|
                        'order_id' => '',
 | 
						|
                        'image' => '',
 | 
						|
                        'type'=> 'block'
 | 
						|
                    ];
 | 
						|
                    Helpers::send_push_notif_to_device($customer->cm_firebase_token, $data);
 | 
						|
 | 
						|
                    DB::table('user_notifications')->insert([
 | 
						|
                        'data'=> json_encode($data),
 | 
						|
                        'user_id'=>$customer->id,
 | 
						|
                        'created_at'=>now(),
 | 
						|
                        'updated_at'=>now()
 | 
						|
                    ]);
 | 
						|
                }
 | 
						|
 | 
						|
            }
 | 
						|
 | 
						|
        }
 | 
						|
        catch (\Exception $e) {
 | 
						|
            Toastr::warning(translate('messages.push_notification_faild'));
 | 
						|
        }
 | 
						|
 | 
						|
        Toastr::success(translate('messages.customer').translate('messages.status_updated'));
 | 
						|
        return back();
 | 
						|
    }
 | 
						|
 | 
						|
    public function search(Request $request){
 | 
						|
        $key = explode(' ', $request['search']);
 | 
						|
        $customers=User::where(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}%");
 | 
						|
            }
 | 
						|
        })->orderBy('order_count','desc')->limit(50)->get();
 | 
						|
        return response()->json([
 | 
						|
            'view'=>view('admin-views.customer.partials._table',compact('customers'))->render()
 | 
						|
        ]);
 | 
						|
    }
 | 
						|
    public function order_search(Request $request){
 | 
						|
        $key = explode(' ', $request['search']);
 | 
						|
        $customer = User::find($request->id);
 | 
						|
 | 
						|
        $orders=Order::where(['user_id' => $customer->id])->Notpos()->
 | 
						|
        where(function ($q) use ($key) {
 | 
						|
            foreach ($key as $value) {
 | 
						|
                $q->Where('id', 'like', "%{$value}%");
 | 
						|
            }
 | 
						|
        })
 | 
						|
        ->paginate(config('default_pagination'));
 | 
						|
        // ->limit(50)->get();
 | 
						|
        $total=$orders->total();
 | 
						|
        return response()->json([
 | 
						|
            'view'=>view('admin-views.customer.partials._list_table',compact('customer', 'orders'))->render() ,'total' => $total
 | 
						|
        ]);
 | 
						|
    }
 | 
						|
 | 
						|
    public function view($id)
 | 
						|
    {
 | 
						|
        $customer = User::find($id);
 | 
						|
        if (isset($customer)) {
 | 
						|
            $orders = Order::latest()->where(['user_id' => $id])->Notpos()->paginate(config('default_pagination'));
 | 
						|
            return view('admin-views.customer.customer-view', compact('customer', 'orders'));
 | 
						|
        }
 | 
						|
        Toastr::error(translate('messages.customer_not_found'));
 | 
						|
        return back();
 | 
						|
    }
 | 
						|
 | 
						|
    public function get_customers(Request $request){
 | 
						|
        $key = explode(' ', $request['q']);
 | 
						|
        $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')]);
 | 
						|
        if($request->all) $data[]=(object)['id'=>false, 'text'=>translate('messages.all')];
 | 
						|
 | 
						|
 | 
						|
        return response()->json($data);
 | 
						|
    }
 | 
						|
 | 
						|
    public function settings()
 | 
						|
    {
 | 
						|
        $data = BusinessSetting::where('key','like','wallet_%')
 | 
						|
            ->orWhere('key','like','loyalty_%')
 | 
						|
            ->orWhere('key','like','ref_earning_%')
 | 
						|
            ->orWhere('key','like','ref_earning_%')->get();
 | 
						|
        $data = array_column($data->toArray(), 'value','key');
 | 
						|
        //dd($data);
 | 
						|
        return view('admin-views.customer.settings', compact('data'));
 | 
						|
    }
 | 
						|
 | 
						|
    public function update_settings(Request $request)
 | 
						|
    {
 | 
						|
 | 
						|
        if (env('APP_MODE') == 'demo') {
 | 
						|
            Toastr::info(translate('messages.update_option_is_disable_for_demo'));
 | 
						|
            return back();
 | 
						|
        }
 | 
						|
 | 
						|
        $request->validate([
 | 
						|
            'add_fund_bonus'=>'nullable|numeric|max:100|min:0',
 | 
						|
            'loyalty_point_exchange_rate'=>'nullable|numeric',
 | 
						|
            'ref_earning_exchange_rate'=>'nullable|numeric',
 | 
						|
        ]);
 | 
						|
        BusinessSetting::updateOrInsert(['key' => 'wallet_status'], [
 | 
						|
            'value' => $request['customer_wallet']??0
 | 
						|
        ]);
 | 
						|
        BusinessSetting::updateOrInsert(['key' => 'loyalty_point_status'], [
 | 
						|
            'value' => $request['customer_loyalty_point']??0
 | 
						|
        ]);
 | 
						|
        BusinessSetting::updateOrInsert(['key' => 'ref_earning_status'], [
 | 
						|
            'value' => $request['ref_earning_status'] ?? 0
 | 
						|
        ]);
 | 
						|
        BusinessSetting::updateOrInsert(['key' => 'wallet_add_refund'], [
 | 
						|
            'value' => $request['refund_to_wallet']??0
 | 
						|
        ]);
 | 
						|
        BusinessSetting::updateOrInsert(['key' => 'loyalty_point_exchange_rate'], [
 | 
						|
            'value' => $request['loyalty_point_exchange_rate'] ?? 0
 | 
						|
        ]);
 | 
						|
        BusinessSetting::updateOrInsert(['key' => 'ref_earning_exchange_rate'], [
 | 
						|
            'value' => $request['ref_earning_exchange_rate'] ?? 0
 | 
						|
        ]);
 | 
						|
        BusinessSetting::updateOrInsert(['key' => 'loyalty_point_item_purchase_point'], [
 | 
						|
            'value' => $request['item_purchase_point']??0
 | 
						|
        ]);
 | 
						|
        BusinessSetting::updateOrInsert(['key' => 'loyalty_point_minimum_point'], [
 | 
						|
            'value' => $request['minimun_transfer_point']??0
 | 
						|
        ]);
 | 
						|
 | 
						|
        Toastr::success(translate('messages.customer_settings_updated_successfully'));
 | 
						|
        return back();
 | 
						|
    }
 | 
						|
 | 
						|
    public function subscribedCustomers()
 | 
						|
    {
 | 
						|
        $subscribers = Newsletter::orderBy('id', 'desc')->paginate(config('default_pagination'));
 | 
						|
        return view('admin-views.customer.subscriber.list', compact('subscribers'));
 | 
						|
    }
 | 
						|
    public function subscriberMailSearch(Request $request)
 | 
						|
    {
 | 
						|
        $key = explode(' ', $request['search']);
 | 
						|
        $customers = Newsletter::where(function ($q) use ($key) {
 | 
						|
            foreach ($key as $value) {
 | 
						|
                $q->orWhere('email', 'like', "%". $value."%");
 | 
						|
            }
 | 
						|
        })->orderBy('id', 'desc')->get();
 | 
						|
        return response()->json([
 | 
						|
            'view' => view('admin-views.customer.partials._subscriber-email-table', compact('customers'))->render()
 | 
						|
        ]);
 | 
						|
    }
 | 
						|
}
 | 
						|
 |