<?php
namespace App\Http\Controllers\Front;
use App\Models\Product;
use App\Models\Language;
use Illuminate\Http\Request;
use App\Models\ProductCategory;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;
class ProductController extends Controller
{
public $lang_id;
public function __construct()
{
if (session()->has('lang')) {
$currlang = Language::where('code', session()->get('lang'))->first();
} else {
$currlang = Language::where('is_default', 1)->first();
}
$this->lang_id = $currlang->id;
}
public function index(Request $request)
{
if (session()->has('lang')) {
$currlang = Language::where('code', session()->get('lang'))->first();
} else {
$currlang = Language::where('is_default', 1)->first();
}
// $data['products'] = Product::where('status', 1)->where('language_id', $currlang->id)->paginate(6);
$data['categories'] = ProductCategory::where('status', 1)->where('language_id', $currlang->id )->get();
$search = $request->search;
$minprice = $request->min;
$maxprice = $request->max;
$category = $request->category;
$category = ProductCategory::where('slug',$request->category)->exists();
if($category){
$category_id = ProductCategory::where('slug',$request->category)->first()->id;
}else{
$category_id = '';
}
if($request->type){
$type = $request->type;
}else{
$type = 'new';
}
$reviewcheck = $request->rating;
$data['products'] =
Product::when($category_id, function ($query, $category_id) {
return $query->where('category_id', $category_id);
})
->when($currlang->id, function ($query, $lang_id) {
return $query->where('language_id', $lang_id);
})
->when($search, function ($query, $search) {
return $query->where('title', 'like', '%' . $search . '%');
})
->when($minprice, function ($query, $minprice) {
return $query->where('current_price', '>=', $minprice);
})
->when($maxprice, function ($query, $maxprice) {
return $query->where('current_price', '<=', $maxprice);
})
->when($reviewcheck, function ($query, $reviewcheck) {
return $query->where('rating', '>=', $reviewcheck);
})
->when($type, function ($query, $type) {
if ($type == 'new') {
return $query->orderBy('id', 'DESC');
} elseif ($type == 'old') {
return $query->orderBy('id', 'ASC');
} elseif ($type == 'high_low') {
return $query->orderBy('current_price', 'DESC');
} elseif ($type == 'low_high') {
return $query->orderBy('current_price', 'ASC');
}
})
->where('status', 1)->paginate(9);
return view('front.product.index',$data);
}
public function product_load($category_id)
{
$category_id = Productcategory::findOrFail($category_id);
$products = Product::where('category_id', $category_id->id)->limit(4)->get();
return view('front.load.product',compact('products', 'category_id'));
}
public function product_details($slug)
{
$data['product'] = Product::where('slug',$slug)->first();
$data['related_products'] = Product::where('category_id',$data['product']->category_id)->where('id','!=',$data['product']->id)->get();
return view('front.product.details',$data);
}
public function cart()
{
if (Session::has('cart')) {
$cart = Session::get('cart');
} else {
$cart = [];
}
return view('front.product.cart', compact('cart'));
}
// add to cart
public function addToCart($id)
{
$cart = Session::get('cart');
if (strpos($id, ',,,') == true) {
$data = explode(',,,', $id);
$id = $data[0];
$qty = $data[1];
$product = Product::findOrFail($id);
if(!empty($cart) && array_key_exists($id, $cart)){
if($product->stock < $cart[$id]['qty'] + $qty){
return response()->json(['error' => 'Product Out of Stock']);
}
}else{
if($product->stock < $qty){
return response()->json(['error' => 'Product Out of Stock']);
}
}
if (!$product) {
abort(404);
}
$cart = Session::get('cart');
// if cart is empty then this the first product
if (!$cart) {
$cart = [
$id => [
"id" => $product->id,
"title" => $product->title,
"qty" => $qty,
"price" => $product->current_price,
"downloadable_file" => $product->downloadable_file == null ? '' : $product->downloadable_file,
"image" => $product->image
]
];
Session::put('cart', $cart);
return response()->json(['message' => 'Product added to cart successfully!']);
}
// if cart not empty then check if this product exist then increment quantity
if (isset($cart[$id])) {
if($product->is_downloadable){
return response()->json(['message' => 'Product Allready Added']);
}
$cart[$id]['qty'] += $qty;
Session::put('cart', $cart);
return response()->json(['message' => 'Product added to cart successfully!']);
}
// if item not exist in cart then add to cart with quantity = 1
$cart[$id] = [
"id" => $product->id,
"title" => $product->title,
"qty" => $qty,
"price" => $product->current_price,
"downloadable_file" => $product->downloadable_file == null ? '' : $product->downloadable_file,
"image" => $product->image
];
} else {
$id = $id;
$product = Product::findOrFail($id);
if (!$product) {
abort(404);
}
if(!empty($cart) && array_key_exists($id, $cart)){
if($product->stock < $cart[$id]['qty'] + 1){
return response()->json(['error' => 'Product Out of Stock']);
}
}else{
if($product->stock < 1){
return response()->json(['error' => 'Product Out of Stock']);
}
}
$cart = Session::get('cart');
// if cart is empty then this the first product
if (!$cart) {
$cart = [
$id => [
"id" => $product->id,
"title" => $product->title,
"qty" => 1,
"price" => $product->current_price,
"downloadable_file" => $product->downloadable_file == null ? '' : $product->downloadable_file,
"image" => $product->image
]
];
Session::put('cart', $cart);
return response()->json(['message' => 'Product added to cart successfully!']);
}
// if cart not empty then check if this product exist then increment quantity
if (isset($cart[$id])) {
if($product->is_downloadable){
return response()->json(['message' => 'Product Allready Added']);
}
$cart[$id]['qty']++;
Session::put('cart', $cart);
return response()->json(['message' => 'Product added to cart successfully!']);
}
// if item not exist in cart then add to cart with quantity = 1
$cart[$id] = [
"id" => $product->id,
"title" => $product->title,
"qty" => 1,
"price" => $product->current_price,
"downloadable_file" => $product->downloadable_file == null ? '' : $product->downloadable_file,
"image" => $product->image
];
}
Session::put('cart', $cart);
return response()->json(['message' => 'Product added to cart successfully!']);
}
public function Prdouctcheckout(Request $request, $slug)
{
$product = Product::where('slug', $slug)->first();
if (!$product) {
abort(404);
}
if ($request->qty) {
$qty = $request->qty;
} else {
$qty = 1;
}
$cart = Session::get('cart');
$id = $product->id;
// if cart is empty then this the first product
if (!($cart)) {
if($product->stock < $qty){
Session::flash('warning','Product Out of stock');
return back();
}
$cart = [
$id => [
"id" => $product->id,
"title" => $product->title,
"qty" => $qty,
"price" => $product->current_price,
"downloadable_file" => $product->downloadable_file == null ? '' : $product->downloadable_file,
"image" => $product->image
]
];
Session::put('cart', $cart);
if (!Auth::user()) {
Session::put('link', url()->current());
return redirect(route('user.login'));
}
return redirect(route('front.checkout'));
}
// if cart not empty then check if this product exist then increment quantity
if (isset($cart[$id])) {
if($product->is_downloadable){
return response()->json(['message' => 'Product Allready Added']);
}
if($product->stock < $cart[$id]['qty'] + $qty){
Session::flash('warning','Product Out of stock');
return back();
}
$qt = $cart[$id]['qty'];
$cart[$id]['qty'] = $qt + $qty;
Session::put('cart', $cart);
if (!Auth::user()) {
Session::put('link', url()->current());
return redirect(route('user.login'));
}
return redirect(route('front.checkout'));
}
if($product->stock < $qty){
Session::flash('warning','Product Out of stock');
return back();
}
$cart[$id] = [
"id" => $product->id,
"title" => $product->title,
"qty" => $qty,
"price" => $product->current_price,
"downloadable_file" => $product->downloadable_file == null ? '' : $product->downloadable_file,
"image" => $product->image
];
Session::put('cart', $cart);
if (!Auth::user()) {
Session::put('link', url()->current());
return redirect(route('user.login'));
}
return redirect(route('front.checkout'));
}
public function checkout()
{
if (!Session::get('cart')) {
Session::flash('warning', 'Your cart is empty.');
return redirect(route('front.cart'));
}
if (session()->has('lang')) {
$currentLang = Language::where('code', session()->get('lang'))->first();
} else {
$currentLang = Language::where('is_default', 1)->first();
}
$user = Auth::user();
if ($user) {
if (Session::has('cart')) {
$data['cart'] = Session::get('cart');
} else {
$data['cart'] = null;
}
// $data['shippings'] = ShippingCharge::where('language_id',$currentLang->id)->get();
$data['user'] = Auth::user();
return view('front.product.checkout', $data);
} else {
Session::put('link', url()->current());
return redirect(route('user.login'));
}
}
// header cart load
public function headerCartLoad()
{
if(Session::has('cart')){
$cart = Session::get('cart');
}else{
$cart = [];
}
return view('front.load.header_cart',compact('cart'));
}
// cart qty get
public function cartQtyGet()
{
if(Session::has('cart')){
$qty = count(Session::get('cart'));
return $qty;
}
}
public function cartitemremove($id)
{
if ($id) {
$cart = Session::get('cart');
if (isset($cart[$id])) {
unset($cart[$id]);
Session::put('cart', $cart);
}
$total = 0;
$count = 0;
foreach ($cart as $i) {
$total += $i['price'] * $i['qty'];
$count += $i['qty'];
}
$total = round($total, 2);
return response()->json(['message' => 'Product removed successfully', 'count' => $count, 'total' => $total]);
}
}
public function updatecart(Request $request)
{
if (Session::has('cart')) {
$cart = Session::get('cart');
foreach ($request->product_id as $key => $id) {
$product = Product::findOrFail($id);
if($product->stock < $request->qty[$key]){
return response()->json(['error' => $product->title .' stock not available']);
}
if (isset($cart[$id])) {
if($product->is_downloadable){
$cart[$id]['qty'] = 1;
}else{
$cart[$id]['qty'] = $request->qty[$key];
}
Session::put('cart', $cart);
}
}
}
$total = 0;
$count = 0;
foreach ($cart as $i) {
$total += $i['price'] * $i['qty'];
$count += $i['qty'];
}
$total = round($total, 2);
return response()->json(['message' => 'Cart Update Successfully.', 'total' => $total, 'count' => $count]);
}
}