Viewing File: /home/ubuntu/shop-website-base/app/Http/Controllers/User/ProductController.php

<?php

namespace App\Http\Controllers\User;

use App\Http\Controllers\Controller;

use Illuminate\Http\Request;

use App\Http\Requests;

use App\Http\Controllers\Api\User\ProductApiController;

use Exception, DB, Validator, Setting, Log, Hash, Auth;

use App\Helpers\Helper, App\Helpers\CommonHelper;

use App\Models\Product, App\Models\User, App\Models\ProductGallery;

use App\Models\Cart, App\Models\UserBillingAddress;

use App\Models\Category, App\Models\SubCategory;

use App\Models\Order, App\Models\OrderProduct, App\Models\OrderPayment;

use App\Repositories\ProductRepository as ProductRepo;

use Twilio\Rest\Client;

class ProductController extends Controller {
	
	protected $skip, $take;

    protected $ProductAPI;

	public function __construct(Request $request,ProductApiController $API) {

        $this->ProductAPI = $API;

        Log::info(url()->current());   

        Log::info("Request Data".print_r($request->all(), true));
        
        $this->middleware('auth:user',['except' => ['add_to_cart','products','products_cart_remove','products_view','categories','products_list']]);

        $this->loginUser = User::find($request->id);

        $this->skip = $request->skip ?: 0;

        $this->take = $request->take ?: (Setting::get('admin_take_count') ?: TAKE_COUNT);

    }

    /**
     * @method products()
     *
     * @uses List Products
     *
     * @created
     * 
     * @updated
     *
     * @param object $request
     *
     * @return user details
     */
    public function products(Request $request) {

        try {
            
            $skip = $request->skip ? $request->skip : 0;

            $base_query = Product::CommonResponse();

            $title = tr('new_products');

            if($request->category) {

                $category = Category::where('unique_id',$request->category)->first();

                $title = $category->name;

                $base_query = $base_query->where('category_id',$category->id);

            }

            if($request->sub_category_id) {

                $sub_category = SubCategory::find($request->sub_category_id);

                $sub_category_name = $sub_category->name;

                $category = Category::find($sub_category->category_id);

                $title = $category->name;

                $category_id = $category->id;

                $base_query = $base_query->where('sub_category_id',$request->sub_category_id);

            }

            if($request->search_key) {

                $search_key = $request->search_key;
                $base_query = $base_query
                    ->Where('products.name','LIKE','%'.$search_key.'%')
                    ->orWhere('products.description','LIKE','%'.$search_key.'%');
            }


            if($request->sort_key){
                
                switch ($request->sort_key) {
                   
                    case SORT_BY_POPULARITY:
                        $base_query = $base_query->orderBy('used_quantity','DESC');
                        break;

                    case SORT_BY_ALPHABETICAL:
                        $base_query = $base_query->orderBy('name','asc');
                        break;
    
                    case SORT_BY_LOW_TO_HIGH:
                        $base_query = $base_query->orderBy('amount','asc');
                        break;
    
                    case SORT_BY_HIGH_TO_LOW:
    
                        $base_query =  $base_query->orderBy('amount','desc');
                        break;
                    
                    default:
                        $base_query = $base_query->orderBy('updated_at','desc');
                        break;
                    }
                
            } else{
                
                $base_query = $base_query->orderBy('updated_at','desc');
            }

            $base_query = $base_query->skip($skip)->take(8);

            $total_products = $base_query->count();

            $product = $base_query->get();

            if($request->ajax()) {

                $view =  view('user.products._products')
                    ->with('product', $product)
                    ->with('total_current_products', count($product))
                    ->with('total_products', $product)
                    ->with('skip', $skip);

                $data = ['total_products'=> count($product), 'total_current_products' => count($product),'view'=> $view->render()];

                return $data;

            }

            return view('user.products.index')
                        ->with('page','new_products')
                        ->with('product',$product)
                        ->with('total_current_products', count($product))
                        ->with('total_products', $product)
                        ->with('title',$title)
                        ->with('sub_category_name',$sub_category_name ?? '')
                        ->with('category_id',$category_id ?? '');

        } catch (Exception $e) {

            return redirect()->back()->withInput()->with('flash_error', $e->getMessage());

        }

    }

    /**
     * @method categories()
     *
     * @uses List Products
     *
     * @created
     * 
     * @updated
     *
     * @param object $request
     *
     * @return user details
     */
    public function categories(Request $request) {

        try {
            
            $skip = $request->skip ? $request->skip : 0;

            $base_query = Category::orderBy('updated_at','desc')
                ->with('categoryProducts')->has('categoryProducts')
                ->skip($skip)->take(4);

            $total_categories = $base_query->count();

            $category = $base_query->get();
            
            if($request->ajax()) {

                $view =  view('user.categories._categories')
                    ->with('category', $category)
                    ->with('total_current_category', count($category))
                    ->with('total_categories', $category)
                    ->with('skip', $skip);

                $data = ['total_categories'=> $total_categories, 'total_current_category' => count($category),'view'=> $view->render()];

                return $data;

            }

            return view('user.categories.index')
                        ->with('category',$category)
                        ->with('total_current_category', count($category))
                        ->with('total_categories', $category);

        } catch (Exception $e) {

            return redirect()->back()->withInput()->with('flash_error', $e->getMessage());

        }

    }

    /**
     * @method add_to_wishlist()
     *
     * @uses List Products
     *
     * @created
     * 
     * @updated
     *
     * @param object $request
     *
     * @return user details
     */
    public function add_to_wishlist(Request $request) {

        try {
            
            $request->request->add([ 
                'id' => Auth::guard('user')->user()->id,
            ]);        

            $response = $this->ProductAPI->product_wishlists_save($request)->getData();

            return response()->json($response);

        } catch (Exception $e) {

            return redirect()->back()->withInput()->with('flash_error', $e->getMessage());

        }

    }

     /**
     * @method add_to_cart()
     *
     * @uses Product added to cart
     *
     * @created Bhawya
     * 
     * @updated Bhawya
     *
     * @param object $request
     *
     * @return view page
     */
    public function add_to_cart(Request $request) {

        try {

            if(Auth::guard('user')->check()) {

                $request->request->add([ 
                    'id' => Auth::guard('user')->user()->id,
                    'quantity' => 0.5
                ]);  

                $response = $this->ProductAPI->add_to_cart($request)->getData();

            } else {

                $request->request->add([ 
                    'ip_address' => get_ip_address(),
                    'quantity' => 0.5
                ]);

                $response = $this->ProductAPI->add_to_cart_unregistered($request)->getData();

            }

            return response()->json($response);

        } catch (Exception $e) {

            return redirect()->route('user.index')->with('flash_error', $e->getMessage());

        }


    }

    /**
     * @method products_cart_remove()
     *
     * @uses Product added to cart
     *
     * @created Bhawya
     * 
     * @updated Bhawya
     *
     * @param object $request
     *
     * @return view page
     */
    public function products_cart_remove(Request $request) {

        try {
                
            if(Auth::guard('user')->check()) {

                $request->request->add([ 
                    'id' => Auth::guard('user')->user()->id,
                ]);        
            

                $response = $this->ProductAPI->carts_delete($request)->getData();

            } else {

                $request->request->add([ 
                    'ip_address' => get_ip_address(),
                ]);

                $response = $this->ProductAPI->carts_delete($request)->getData();

            }

            if($response->success) {

                return back()->with('flash_success', $response->message);

            } else {

                return back()->with('flash_error',  $response->message);
            }

        } catch (Exception $e) {

            return redirect()->route('user.index')->with('flash_error', $e->getMessage());

        }


    }


     /**
     * @method products_view()
     *
     * @uses List Products
     *
     * @created
     * 
     * @updated
     *
     * @param object $request
     *
     * @return user details
     */
    public function products_view($unique_id, Request $request) {

        try {
             
            
            $product = Product::where('products.unique_id', $unique_id)->CommonResponse()->where('products.status', APPROVED)->first();

            if(!$product) {

                throw new Exception(tr('product_not_available'), 101);
                
            }

            $product_gallery = ProductGallery::where('product_id',$product->product_id)->get();

            $product['cart'] = [];

            if(Auth::guard('user')->check()) {
                
                $product['cart'] = Cart::where('carts.user_id', Auth::guard('user')->user()->id)->where('product_id', $product->product_id)->first();

            } else {

               $product['cart'] = Cart::where('carts.ip_address', get_ip_address())->where('product_id', $product->product_id)->first();

            }
            
            $base_query = Product::CommonResponse()->where('products.status', APPROVED)->orderBy('products.updated_at','desc');
            
            $suggestion_products = $base_query->where('products.id', '!=', $product->product_id)->where('product_inventories.remaining_quantity', '>', 0)->skip(0)->take(6)->get();

            return view('user.products.view')
                        ->with('product', $product)
                        ->with('product_gallery', $product_gallery)
                        ->with('suggestion_products', $suggestion_products);

        } catch (Exception $e) {

            return redirect()->route('user.index')->with('flash_error', $e->getMessage());

        }

    }

    /**
     * @method my_cart()
     *
     * @uses List Products
     *
     * @created
     * 
     * @updated
     *
     * @param object $request
     *
     * @return user details
     */
    public function my_cart(Request $request) {

        try {

            $request->request->add([ 
                'id' => Auth::guard('user')->user()->id,
            ]);

            $query = Cart::where('carts.user_id', $request->id)
                    ->CommonResponse()
                    ->where('products.status', APPROVED);

            $cart = $query->orderBy('carts.id','DESC')->get();

            $total_price = formatted_amount($cart->sum('total_price'));

            return view('user.checkout.carts_list')
                ->with('cart',$cart)
                ->with('total_price' , $total_price);

    } catch (Exception $e) {

            return redirect()->route('user.index')->with('flash_error', $e->getMessage());

        }

    }

    /**
     * @method cart_checkout()
     *
     * @uses List Products
     *
     * @created
     * 
     * @updated
     *
     * @param object $request
     *
     * @return user details
     */
    public function cart_checkout(Request $request) {

        try {

            $request->request->add([ 
                'id' => Auth::guard('user')->user()->id,
            ]);

            $user_delivery_address = UserBillingAddress::where('user_id', $request->id)
                    ->where('status', APPROVED)->orderBy('id','DESC')->get();
           
            $query = Cart::where('carts.user_id', $request->id)
                    ->CommonResponse()
                    ->where('products.status', APPROVED);

            $cart = $query->orderBy('carts.id','DESC')->get();

            $total_price = formatted_amount($cart->sum('total_price'));

            return view('user.checkout.checkout')
                ->with('cart',$cart)
                ->with('total_price' , $total_price)
                ->with('user_delivery_address',$user_delivery_address);

    } catch (Exception $e) {

            return redirect()->route('user.index')->with('flash_error', $e->getMessage());

        }

    }

    /**
     * @method carts_checkout_save()
     *
     * @uses Save Payment
     *
     * @created Bhawya
     * 
     * @updated Bhawya
     *
     * @param object $request
     *
     * @return view page
     */
    public function carts_checkout_save(Request $request) {

        try {

           
            $request->request->add([ 
                'id' => Auth::guard('user')->user()->id,
            ]);

            $cart = Cart::where('carts.user_id', $request->id)->CommonResponse()
                ->where('products.status', APPROVED)
                ->first();

            if(!$cart) {

                throw new Exception(api_error(106),106);

            }
            
            if(!$request->user_billing_address_id) {

                $rules = [
                    'street_address' => 'required',
                    'address' => 'required',
                    'zipcode' => 'required',
                    'city' => 'required',
                ];

                Helper::custom_validator($request->all(),$rules);

                $billing_details = ProductRepo::user_billing_address_save($request);

                $request->request->add([ 
                    'user_billing_address_id' => $billing_details->id,
                ]); 
              
            }

            $checkout_response = $this->ProductAPI->save_orders($request)->getData();

            if($checkout_response->success) {

                $order = Order::where('id',$checkout_response->data->order_id)->first();

                $request->request->add([ 
                    'order_id' => $order->id
                ]);

                ProductRepo::order_confirmation_mail($request);

                $job_data['status'] = 'Confirmed';
                
                $job_data['order'] = $order;

                dispatch(new \App\Jobs\OrderMessageJob($job_data));

                return view('user.orders.success')
                    ->with('order',$order)
                    ->with('flash_success', $checkout_response->message);

            } else {

                return back()->with('flash_error',  $checkout_response->message);
            }

        } catch (Exception $e) {

            return redirect()->route('user.cart_checkout')->with('flash_error', $e->getMessage());

        }

    }

    /**
     * @method featured_products()
     *
     * @uses List Products
     *
     * @created
     * 
     * @updated
     *
     * @param object $request
     *
     * @return user details
     */
    public function featured_products(Request $request) {

        try {
            
            $skip = $request->skip ? $request->skip : 0;

            $base_query = Product::CommonResponse();

            if($request->category_id) {

                $category = Category::find($request->category_id);

            } else {

                $category = Category::where('status',APPROVED)->with('categoryProducts')->has('categoryProducts')->orderBy('updated_at','desc')->first();

            }
             
            $base_query = $base_query->where('category_id',$request->category_id);

            $title = $category->name ?? tr('featured_products');

            if($request->sub_category_id) {

                $sub_category = SubCategory::find($request->sub_category_id);

                $sub_category_name = $sub_category->name;

                $base_query = $base_query->where('sub_category_id',$request->sub_category_id);

            }

            $base_query = $base_query->skip($skip)->take(4);

            if($request->sort_key){

                $popular_products = OrderProduct::selectRaw('product_id, count(*)')->groupBy('product_id')->orderByRaw('COUNT(*) DESC')->pluck('product_id')->toArray();
                
                switch ($request->sort_key) {
                   
                    case SORT_BY_POPULARITY:
                        $base_query = $base_query->whereIn('products.id',$popular_products);
                        break;
    
                    case SORT_BY_ALPHABETICAL:
                        $base_query = $base_query->orderBy('name','asc');
                        break;
    
                    case SORT_BY_LOW_TO_HIGH:
                        $base_query = $base_query->orderBy('amount','asc');
                        break;
    
                    case SORT_BY_HIGH_TO_LOW:
    
                        $base_query =  $base_query->orderBy('amount','desc');
                        break;
                    
                    default:
                        $base_query = $base_query->orderBy('updated_at','desc');
                        break;
                    }
                
            }
            else{
                
                $base_query = $base_query->orderBy('updated_at','desc');
            }

            $total_products = $base_query->count();

            $product = $base_query->get();

            if($request->ajax()) {

                $view =  view('user.products._products')
                    ->with('product', $product)
                    ->with('total_current_products', count($product))
                    ->with('total_products', $product)
                    ->with('skip', $skip);

                $data = ['total_products'=> $total_products, 'total_current_products' => count($product),'view'=> $view->render()];

                return $data;

            }

            return view('user.products.featured_products')
                        ->with('product',$product)
                        ->with('total_current_products', count($product))
                        ->with('total_products', $product)
                        ->with('title',$title)
                        ->with('sub_category_name',$sub_category_name ?? '');

        } catch (Exception $e) {

            return redirect()->back()->withInput()->with('flash_error', $e->getMessage());

        }

    }

    /**
     * @method cart_checkout()
     *
     * @uses List Products
     *
     * @created
     * 
     * @updated
     *
     * @param object $request
     *
     * @return user details
     */
    public function billing_details(Request $request) {

        try {

            $request->request->add([ 
                'id' => Auth::guard('user')->user()->id,
            ]);

            $order = Order::where('id',$request->order_id)->first();


            if(!$order) {

                throw new Exception(tr('order_not_found'), 1);
                
            }

            $order_products = OrderProduct::where('order_id',$order->id)->orderBy('created_at','desc')->get();
            
            $order_payments = OrderPayment::where('order_id',$order->id)->first();
        
            return view('user.orders.billing_details')
                ->with('order',$order)
                ->with('order_products',$order_products)
                ->with('order_payments',$order_payments);

    } catch (Exception $e) {

            return redirect()->route('user.index')->with('flash_error', $e->getMessage());

        }

    }


     /**
     * @method products_list()
     *
     * @uses List Products
     *
     * @created Ganesh
     * 
     * @updated Ganesh
     *
     * @param object $request
     *
     * @return view page
     */
    public function products_list(Request $request) {

        try {


            $base_query = Product::orderBy('name','asc')->where('products.name', 'LIKE',  '%' . $request->get('query') .'%');

            $products = $base_query->get();

            return $this->sendResponse($message = '', '', $products);

            } catch(Exception $e) {

                return $this->sendError($e->getMessage(), $e->getCode());

            }
 

    }

}
Back to Directory File Manager