Your IP : 216.73.217.77


Current Path : /home/users/unlimited/www/egrocer.codeskitter.site/app/Http/Controllers/
Upload File :
Current File : /home/users/unlimited/www/egrocer.codeskitter.site/app/Http/Controllers/SellerController.php

<?php

namespace App\Http\Controllers;

use App\Helpers\CommonHelper;
use App\Http\Controllers\API\OrdersApiController;
use App\Http\Controllers\API\OrderStatusApiController;
use App\Models\Category;
use App\Models\City;
use App\Models\DeliveryBoy;
use App\Models\Favorite;
use App\Models\Order;
use App\Models\OrderItem;
use App\Models\OrderStatusList;
use App\Models\PanelNotification;
use App\Models\Product;
use App\Models\ProductVariant;
use App\Models\ReturnRequest;
use App\Models\Seller;
use App\Models\Setting;
use App\Models\User;
use App\Models\Admin;
use Carbon\Carbon;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Session;

class SellerController extends BaseController
{
    public function index(){

        $seller_id = auth()->user()->seller->id;
        $orderIds = OrderItem::where('seller_id',$seller_id)->get()->pluck('order_id')->toArray() ?? [];
        $productsIds = Product::where('seller_id',$seller_id)->get()->pluck('id')->toArray() ?? [];
        $productsIds_stock = Product::where('seller_id',$seller_id)->where('is_unlimited_stock',0)->get()->pluck('id')->toArray() ?? [];

        $data = array();

        $data['order_count'] = Order::whereIn('id',$orderIds)->count() ?? 0;

        $ignoreStatus = array(
            OrderStatusList::$paymentPending,
            OrderStatusList::$delivered,
            OrderStatusList::$cancelled,
            OrderStatusList::$returned,
        );
        $data['pending_order_count'] = Order::whereIn('id',$orderIds)->whereNotIn('active_status', $ignoreStatus)->count() ?? 0;

        $data['product_count'] = Product::where('seller_id',$seller_id)->get()->count() ?? 0;

        $categoryIds = Seller::select('categories')->where('id',$seller_id)->value('categories')??"";
        $categoryIdsArray = explode(',', $categoryIds);

        $childCategoryIds = CommonHelper::getChildCategoryIds($categoryIdsArray);
        $finalCategoryIds = array_unique(array_merge($categoryIdsArray, $childCategoryIds));

        if($childCategoryIds != ""){
            $data['category_count'] = count($finalCategoryIds);
        }else{
            $data['category_count'] = 0;
        }
        $data['packet_products'] = ProductVariant::select("*")->leftJoin('products', 'product_variants.product_id', '=', 'products.id')->
        where('products.type','packet')->whereIn('product_id',$productsIds)->get()->count();
        $data['loose_products'] = ProductVariant::select("*")->leftJoin('products', 'product_variants.product_id', '=', 'products.id')->
        where('products.type','loose')->whereIn('product_id',$productsIds)->get()->count();
        $data['sold_out_count'] = ProductVariant::where('status',ProductVariant::$statusSoldOut)
            ->whereIn('product_id',$productsIds_stock)
            ->where('stock','<=',0)
            ->where('stock','<=',0)->get()->count();

        $low_stock = Setting::where('variable', 'low_stock_limit')->first();
        $low_stock_limit = 0;
        if($low_stock){
            $low_stock_limit = $low_stock->value;
        }
        $data['low_stock_count'] = ProductVariant::where('status',ProductVariant::$statusAvailable)->whereIn('product_id',$productsIds_stock);
        if($low_stock_limit !==0){
            $data['low_stock_count'] = $data['low_stock_count']->where('stock','<=',$low_stock_limit);
        }
        $data['low_stock_count'] = $data['low_stock_count']->get()->count();


        $data['balance'] = number_format(Seller::where('id', $seller_id)->value('balance'), 2);


        if ($categoryIds != "") {
         
            $categoryIdsArray = explode(',', $categoryIds);

            $childCategoryIds = CommonHelper::getChildCategoryIds($categoryIdsArray);

            // Merge product categories with their top-level parents
            $finalCategoryIds = array_unique(array_merge($categoryIdsArray, $childCategoryIds));
            
            // Convert to comma-separated string
            $categoryIds = implode(',', $finalCategoryIds);
        
        // Debug output
        
        $category_product_count = Category::select('id', 'name', DB::raw("
                (SELECT COUNT(id) 
                 FROM products 
                 WHERE products.category_id = categories.id 
                 AND categories.id IN ($categoryIds) 
                 AND products.seller_id = $seller_id) AS product_count
            "))
            ->having('product_count', '!=', 0)
            ->orderBy('id', 'ASC')
            ->get()
            ->makeHidden(['image_url', 'has_child', 'has_active_child']);
           
        }
      
        else{
            $category_product_count = Category::select('id','name')->get()->makeHidden(['image_url']);
        }

        $data['category_product_count'] = $category_product_count;

        $year = date("Y");
        $curdate = date('Y-m-d');

        $data['weekly_sales'] = Order::select(DB::raw('ROUND(SUM(final_total), 2) AS total_sale'), DB::raw('DATE(created_at) AS order_date'))
            ->where(DB::raw('YEAR(created_at)'),'=', $year)
            ->where(DB::raw('DATE(created_at)'),'<=', $curdate)
            ->whereIn('orders.id', $orderIds)
            ->groupBy(DB::raw('DATE(created_at)'))
            ->orderBy(DB::raw('DATE(created_at)'),'DESC')
            ->limit(7)->get();

        $orderIdsString = 0;
        if(count($orderIds) != 0){
            $orderIdsString = implode(",", array_unique($orderIds));
        }
        $data['status_order_count'] = OrderStatusList::select('order_status_lists.id','order_status_lists.status',
            DB::raw('(select count(orders.id) from orders where orders.active_status = order_status_lists.id and orders.id IN ('. $orderIdsString .')) AS order_count'))
            ->orderBy('order_status_lists.id','asc')
            ->get();
       
        return CommonHelper::responseWithData($data);
    }



    public function getProducts(Request $request){ 
        $limit = $request->limit;
        $offset = $request->offset; 
        $seller_id = auth()->user()->seller->id;

        $join = "LEFT JOIN `categories` c ON c.id = p.category_id
        LEFT JOIN `product_variants` pv ON pv.product_id = p.id
            LEFT JOIN `units` u ON u.id = pv.stock_unit_id
            LEFT JOIN `sellers` s ON s.id = p.seller_id
            LEFT JOIN `order_status_lists` osl ON osl.id = p.till_status
            ";
        $where = " WHERE p.seller_id=".$seller_id;

        //here Sold Out as 0
        if(isset($request->type) && $request->type === 'sold_out'){ 
            $where .= empty($where) ? " WHERE pv.stock <=0 AND pv.status = '0' AND p.is_unlimited_stock = '0' " : " AND pv.stock <=0 AND pv.status = '0' AND p.is_unlimited_stock = '0'";
        }
        //here Available as 1, low_stock_limit
        if(isset($request->type) && $request->type === 'low_stock'){
            $low_stock_limit = Setting::where('variable', 'low_stock_limit')->first();
            $where .= empty($where) ? " WHERE pv.stock <= ".$low_stock_limit['value']." AND pv.status = '1' AND p.is_unlimited_stock = '0'" : " AND pv.stock <= ".$low_stock_limit['value']." AND pv.status = '1' AND p.is_unlimited_stock = '0'";
        }
        //here packet paroducts
        if(isset($request->type) && $request->type === 'packet_products'){
            $where .= empty($where) ? " WHERE p.type = 'packet'" : " AND p.type ='packet'";
        }
        //here loose paroducts
        if(isset($request->type) && $request->type === 'loose_products'){
            $where .= empty($where) ? " WHERE p.type = 'loose'" : " AND p.type ='loose'";
        }
      
        $products = \DB::select("SELECT p.id AS product_id, p.*, p.name, p.seller_id, p.status, p.tax_id, p.image, 
            CONCAT('" . asset('storage/') . "/', p.image) as image_url,
            s.name as seller_name, p.indicator, p.manufacturer, p.made_in, p.return_status, 
            p.cancelable_status, p.till_status, osl.status as till_status_name, p.description,
            pv.id as product_variant_id, pv.price, pv.discounted_price, pv.measurement, 
            pv.status as pv_status, pv.stock, pv.stock_unit_id, u.short_code,
            (select short_code from units where units.id = pv.stock_unit_id) as stock_unit
            FROM `products` p $join $where 
            ORDER BY p.id DESC, pv.id ASC");
        $total = count($products);
        if(isset($request->limit)){
            $products = array_slice($products, $offset, $limit);
        }
        $data = array(
            "products" => $products
        );

        return CommonHelper::responseWithData($data,$total);
    }

    public function getWeeklySales(){

        $seller_id = auth()->user()->seller->id;
        $year = date("Y");
        $curdate = date('Y-m-d');
        $orders = Order::select(DB::raw('ROUND(SUM(final_total), 2) AS total_sale'),
            DB::raw('DATE(orders.created_at) AS order_date'))
            ->where(DB::raw('YEAR(orders.created_at)'),'=', $year)
            ->where(DB::raw('DATE(orders.created_at)'),'<=', $curdate)
            ->leftJoin('order_items', 'order_items.order_id', '=', 'orders.id')
            ->where('order_items.seller_id',$seller_id)
            ->groupBy(DB::raw('DATE(orders.created_at)'))
            ->orderBy(DB::raw('DATE(orders.created_at)'),'DESC')
            ->limit(7)
            ->get();

        return CommonHelper::responseWithData($orders);
    }

    public function countProductCategoryWise(){
        $sellerCategoryIds = auth()->user()->seller->categories;
        $categories = Category::select('name',DB::raw('(SELECT count(id) from `products` WHERE products.category_id = categories.id) AS product_count'))
            ->whereIn('id',explode(',',$sellerCategoryIds))
            ->orderBy('id','ASC')->get();
        return CommonHelper::responseWithData($categories);
    }

    public function doLanguageChange(Request $request)
    {
        Session::put('lang',$request->language);
      
        return response()->json(['status' => true]);
    }
    public function createSlug($text){
        $slug = CommonHelper::slugify($text);
        return CommonHelper::responseWithData($slug);
    }

    public function getTopNotifications(){
        $notifications = PanelNotification::where('notifiable_id',auth()->user()->id);
        $unReadCount = (clone $notifications)->where('read_at',NULL)->get()->count();
        $notifications = $notifications->orderBy('created_at','DESC')->get();

        $data = array();
        $data['unread'] = $unReadCount;
        $data['notifications'] = $notifications;
        return CommonHelper::responseWithData($data);
    }

    public function markAsReadNotifications(Request $request){

        auth()->user()
            ->unreadNotifications
            ->when($request->input('id'), function ($query) use ($request) {
                return $query->where('id', $request->input('id'));
            })
            ->markAsRead();
        return CommonHelper::responseWithData("Notification Mark as Read Successfully!");

    }

    public function getOrders(Request $request){
        $seller_id = auth()->user()->seller->id; 

        $limit = ($request->limit);
        $offset = ($request->offset)??0;
        $filter = $request->search; // Filter query

        $startDate = Carbon::parse($request->input('startDate'))->startOfDay();
        $endDate = Carbon::parse($request->input('endDate'))->endOfDay();

        $startDeliveryDate = Carbon::parse($request->input('startDeliveryDate'))->startOfDay();
        $endDeliveryDate = Carbon::parse($request->input('endDeliveryDate'))->endOfDay();

        $orders = Order::select('orders.*','orders.id as order_id','delivery_boys.name as delivery_boy_name','sellers.name as seller_name',
            'users.name as user_name','order_items.active_status as order_status')
            ->leftJoin('order_items', 'order_items.order_id', '=', 'orders.id')
            ->leftJoin('users', 'orders.user_id', '=', 'users.id')
            ->leftJoin('product_variants', 'order_items.product_variant_id', '=', 'product_variants.id')
            ->leftJoin('products', 'product_variants.product_id', '=', 'products.id')
            ->leftJoin('delivery_boys', 'orders.delivery_boy_id', '=', 'delivery_boys.id')
            ->leftJoin('sellers', 'order_items.seller_id', '=', 'sellers.id')->where('order_items.seller_id', $seller_id);

        if(isset($request->startDate) && $request->startDate != "" && isset($request->endDate) && $request->endDate != ""){
            $orders = $orders->whereBetween('order_items.created_at', [$startDate, $endDate]);
        }

        if(isset($request->startDeliveryDate) && $request->startDeliveryDate != "" && isset($request->endDeliveryDate) && $request->endDeliveryDate != ""){
            // Convert start and end dates from request to Y-m-d format
            $startDeliveryDate = date('Y-m-d', strtotime($request->startDeliveryDate));
            $endDeliveryDate = date('Y-m-d', strtotime($request->endDeliveryDate));
        
            // Define a callback function to extract and format the delivery_time date
            $orders = $orders->where(function($query) use ($startDeliveryDate, $endDeliveryDate) {
                $query->whereRaw("STR_TO_DATE(SUBSTRING_INDEX(orders.delivery_time, ' ', 1), '%d-%m-%Y') BETWEEN ? AND ?", [$startDeliveryDate, $endDeliveryDate]);
            });
        }

        if(isset($request->status) && $request->status != "" && $request->status != 0){
            $orders = $orders->where('orders.active_status', $request->status);
        }

        // Apply filter to all columns in all joined tables
        if ($filter) {
            $columns = [
                'orders.payment_method', 'orders.id', 'delivery_boys.name','orders.delivery_charge','orders.wallet_balance', 'orders.final_total','orders.total','orders.delivery_time','sellers.name',
                'users.name', 'order_items.active_status', 'products.name'
                // Add more columns as needed
            ];
            
            $orders = $orders->where(function($query) use ($filter, $columns) {
                foreach ($columns as $column) {
                    $query->orWhere($column, 'like', "%{$filter}%");
                }
            });
        }

        $totalOrder = $orders->groupBy('orders.id')->get()->count();
       
        if(isset($limit) &&  $limit>0 ){
            $orders = $orders->groupBy('orders.id')->orderBy('orders.id','DESC')->skip($offset)->take($limit)->get();
        }else{
            $orders = $orders->groupBy('orders.id')->orderBy('orders.id','DESC')->get();
        }
        // Add OTP value dynamically based on setting
        $generate_otp = Setting::get_value("generate_otp");
        foreach ($orders as $order) {
            $order->otp = ($generate_otp == 1) ? $order->otp : 0;
        }
        $item_limit = ($request->item_limit);
        $item_offset = ($request->item_offset)??0;
        $order_items = Order::select('order_items.*','orders.mobile','orders.total' ,'orders.delivery_charge','orders.discount','orders.promo_code',
            'orders.promo_discount','orders.wallet_balance','orders.final_total','orders.payment_method','orders.address','orders.delivery_time',
            'users.name as user_name'
            ,'order_items.status as order_status','sellers.name as seller_name')
            ->leftJoin('order_items', 'order_items.order_id', '=', 'orders.id')
            ->leftJoin('users', 'orders.user_id', '=', 'users.id')
            ->leftJoin('product_variants', 'order_items.product_variant_id', '=', 'product_variants.id')
            ->leftJoin('products', 'product_variants.product_id', '=', 'products.id')
            ->leftJoin('delivery_boys', 'orders.delivery_boy_id', '=', 'delivery_boys.id')
            ->leftJoin('sellers', 'order_items.seller_id', '=', 'sellers.id')
            ->where('order_items.seller_id', $seller_id);

        if(isset($request->startDate) && $request->startDate != "" && isset($request->endDate) && $request->endDate != ""){
            $order_items = $order_items->whereBetween('order_items.created_at', [$startDate, $endDate]);
        }

        if(isset($request->startDeliveryDate) && $request->startDeliveryDate != "" && isset($request->endDeliveryDate) && $request->endDeliveryDate != ""){
            // Convert start and end dates from request to Y-m-d format
            $startDeliveryDate = date('Y-m-d', strtotime($request->startDeliveryDate));
            $endDeliveryDate = date('Y-m-d', strtotime($request->endDeliveryDate));
        
            // Define a callback function to extract and format the delivery_time date
            $order_items = $order_items->where(function($query) use ($startDeliveryDate, $endDeliveryDate) {
                $query->whereRaw("STR_TO_DATE(SUBSTRING_INDEX(orders.delivery_time, ' ', 1), '%d-%m-%Y') BETWEEN ? AND ?", [$startDeliveryDate, $endDeliveryDate]);
            });
        }

        if(isset($request->status) && $request->status != "" && $request->status != 0){
            $order_items = $order_items->where('orders.active_status', $request->status);
        }
        // Apply filter to all columns in all joined tables
        if ($filter) {
            $columns = [
                'orders.payment_method', 'orders.id', 'delivery_boys.name','orders.delivery_charge','orders.wallet_balance', 'orders.final_total','orders.total','orders.delivery_time','sellers.name',
                'users.name', 'order_items.active_status', 'products.name', 'order_items.id', 'order_items.is_credited'
                // Add more columns as needed 
            ];
            
            $order_items = $order_items->where(function($query) use ($filter, $columns) {
                foreach ($columns as $column) {
                    $query->orWhere($column, 'like', "%{$filter}%");
                }
            });
        }
     
        $totalOrderItem = $order_items->count();
        if(isset($item_limit) &&  $item_limit>0 ){
            $order_items = $order_items->orderBy('order_items.id','DESC')->skip($item_offset)->take($item_limit)->get();
        }else{
            $order_items = $order_items->orderBy('order_items.id','DESC')->get();
        }

        $statusOrderCount = CommonHelper::getStatusOrderCount($seller_id)->toArray() ?? [];
        array_unshift($statusOrderCount, array("id" => 0, "status" => "All Orders", "order_count" => $totalOrder));

        if($orders){
            $data = array(
                "status_order_count" => $statusOrderCount,
                "orders" => $orders,
                "total_order_item" => $totalOrderItem,
                "order_items" => $order_items
            );
            return CommonHelper::responseWithData($data, $totalOrder);
        }else{
            return CommonHelper::responseSuccess('Order not found');
        }

    }

    public function getOrder(Request $request){
        $data = CommonHelper::getOrderDetails($request->order_id);
        return CommonHelper::responseWithData($data);
    }

    public function getOrderStatus(){
        return app(OrderStatusApiController::class)->getOrderStatus();
    }

    public function getCategories(Request $request){
        $seller_categories = auth()->user()->seller->categories;
        $category_id = $request->get('category_id',0);
        if(isset($request->category_id)  ){
            $categories =  Category::where('parent_id',$category_id)->orderBy('name','ASC')->get();
        }else{
            $categories =  Category::whereIn('id', explode(",", $seller_categories))->where('parent_id',$category_id)->orderBy('name','ASC')->get();
        }
        return CommonHelper::responseWithData($categories);
    }

    public function getReturnRequests(){
        $seller_id = auth()->user()->seller->id;
        $ReturnRequests = ReturnRequest::select('return_requests.*','users.name',
            'order_items.product_variant_id','order_items.quantity','order_items.price',
            'order_items.discounted_price','order_items.product_name','order_items.variant_name')
            ->leftJoin('users', 'return_requests.user_id', '=', 'users.id')
            ->leftJoin('order_items', 'return_requests.order_item_id', '=', 'order_items.id')
            ->leftJoin('products', 'return_requests.product_id', '=', 'products.id')
            ->leftJoin('product_variants', 'return_requests.product_variant_id', '=', 'product_variants.id')
            ->where('products.seller_id',$seller_id)
            ->orderBy('return_requests.id','DESC')
            ->get();
        return CommonHelper::responseWithData($ReturnRequests);
    }

    public function getProductSalesReport(Request $request){
        $seller_id = auth()->user()->seller->id;
        $startDate = Carbon::parse($request->input('startDate'))->startOfDay();
        $endDate = Carbon::parse($request->input('endDate'))->endOfDay();
        $ProductSalesReports = OrderItem::select('product_variants.product_id','products.name as product_name',
            'sellers.name as seller_name','product_variants.measurement','units.short_code AS unit_name','order_items.*','orders.*',
            DB::raw('(SELECT COUNT(order_items.product_variant_id) FROM order_items WHERE product_variants.id = order_items.product_variant_id) as total_sales'),
            DB::raw('(SELECT SUM(order_items.sub_total) FROM `order_items` WHERE product_variants.id = order_items.product_variant_id) as total_price')
        )
            ->leftJoin('orders', 'order_items.order_id', '=', 'orders.id')
            ->leftJoin('product_variants', 'order_items.product_variant_id', '=', 'product_variants.id')
            ->leftJoin('units', 'product_variants.stock_unit_id', '=', 'units.id')
            ->leftJoin('products', 'product_variants.product_id', '=', 'products.id')
            ->leftJoin('sellers', 'products.seller_id', '=', 'sellers.id')
            ->where('products.seller_id', $seller_id)
            ->where('orders.active_status', OrderStatusList::$delivered)
            ->whereBetween('order_items.created_at', [$startDate, $endDate])
            ->orderBy('order_items.id','DESC')
            ->groupBy('product_variants.id')
            ->get();
        return CommonHelper::responseWithData($ProductSalesReports);
    }

    public function getSalesReport(Request $request){
        $seller_id = auth()->user()->seller->id;
        $startDate = Carbon::parse($request->input('startDate'))->startOfDay();
        $endDate = Carbon::parse($request->input('endDate'))->endOfDay();
        $categories = CommonHelper::getSellerCategories($seller_id);
        $SalesReports = OrderItem::select('order_items.id','orders.total',
            'order_items.seller_id','order_items.sub_total','orders.user_id','orders.mobile',
            'products.name as product_name','orders.final_total','orders.address',
            'users.name as user_name','order_items.status',
            DB::raw('DATE_FORMAT(order_items.created_at,"%d-%m-%Y") as added_date'))
            ->leftJoin('users', 'order_items.user_id', '=', 'users.id')
            ->leftJoin('product_variants', 'order_items.product_variant_id', '=', 'product_variants.id')
            ->leftJoin('products', 'product_variants.product_id', '=', 'products.id')
            ->leftJoin('orders', 'order_items.order_id', '=', 'orders.id')
            ->where('products.seller_id', $seller_id)
            ->whereBetween('order_items.created_at', [$startDate, $endDate])
            ->where('orders.active_status', OrderStatusList::$delivered);
        if(isset($request->category) && $request->category != ""){
            $SalesReports = $SalesReports->where('products.category_id', $request->category);
        }
        $SalesReports = $SalesReports->orderBy('order_items.id','DESC')->get();
        $data = array(
            "categories" => $categories,
            "salesReports" => $SalesReports
        );
        return CommonHelper::responseWithData($data);
    }

    public function getSettings(){
        $variables = array(
            "app_name",
            "support_number",
            "support_email",
            "current_version",
            "minimum_version_required",
            "is_version_system_on",
            "ios_is_version_system_on",
            "currency",
            "currency_code",
            "decimal_point",
            "low_stock_limit",
            "app_mode_seller",
            "privacy_policy_seller",
            "terms_conditions_seller",
            "google_place_api_key",
            "app_mode_seller",
            "app_mode_seller_remark",
            "seller_commission"
        );
        $settings = CommonHelper::getSettings($variables);
        $settings["allPermissions"] = auth()->user()->allPermissions;
        $settings["view_customer_detail"] = Seller::select('customer_privacy')->where('admin_id',auth()->user()->id)->first()->customer_privacy;
        $settings["assign_delivery_boy"] = Seller::select('assign_delivery_boy')->where('admin_id',auth()->user()->id)->first()->assign_delivery_boy;
        $settings["view_order_otp"] = Seller::select('view_order_otp')->where('admin_id',auth()->user()->id)->first()->view_order_otp;
        $settings["change_order_status_delivered"] = Seller::select('change_order_status_delivered')->where('admin_id',auth()->user()->id)->first()->change_order_status_delivered;

        if(!empty($settings)){
            return CommonHelper::responseWithData($settings);
        }else{
            return  CommonHelper::responseError('No settings found!');
        }
    }
    public function getPrivacyPolicy(){
        $variables = array(
            "privacy_policy_seller",
            "terms_conditions_seller",
        );
        $settings = CommonHelper::getSettings($variables);
        if(!empty($settings)){
            return CommonHelper::responseWithData($settings);
        }else{
            return  CommonHelper::responseError('No settings found!');
        }
    }

    public function getDeliveryBoys(Request $request){
        $limit = ($request->limit)??10;
        $offset = ($request->offset)??0;

        $city_id = auth()->user()->seller->city_id;

        $deliveryBoys = DeliveryBoy::select('id','name')->where('city_id',$city_id);

        $totalDeliveryBoys = clone $deliveryBoys;
        $totalDeliveryBoys = $totalDeliveryBoys->count();

        $deliveryBoys = $deliveryBoys->orderBy('id','DESC')->skip($offset)->take($limit)->get();
        return CommonHelper::responseWithData($deliveryBoys, $totalDeliveryBoys);
    }

    public function getCities(){
        $cities = City::select('id','name','state','formatted_address','latitude','longitude')->orderBy('id','DESC')->get();
        if(empty($cities)){
            return  CommonHelper::responseError('Cities not found.');
        }
        return CommonHelper::responseWithData($cities);
    }
    public function getMainCategories(Request $request){
        $seller_id = auth()->user()->seller->id;
        $seller = Seller::where('id', $seller_id)->first();
        
        $query = Category::orderBy('name', 'ASC');
        
        if (isset($request->category_id) && $request->category_id !== 0) {
            $query->where("parent_id", $request->category_id);
        } else {
            $query->whereIn('id', explode(",", $seller->categories));
        }
    
        if (isset($request->search) && !empty($request->search)) {
            $searchTerm = $request->search;
            $query->where('name', 'LIKE', '%' . $searchTerm . '%');
        }
    
        $userCategories = $query->get();
        $total = $userCategories->count();
        
        return CommonHelper::responseWithData($userCategories, $total);
    }
    public function deploy(){
       
        exec("git pull");
        exec("composer install --no-interaction --prefer-dist --optimize-autoloader --no-dev");
        exec("php artisan migrate");
        echo "Done";
    }
}