<?php
namespace App\Http\Controllers;
use App\Mail\SecondEmailVerifyMailManager;
use App\Models\AffiliateConfig;
use App\Models\Brand;
use App\Models\BusinessSetting;
use App\Models\Cart;
use App\Models\Category;
use App\Models\Coupon;
use App\Models\CustomerPackage;
use App\Models\FlashDeal;
use App\Models\Order;
use App\Models\OrderDetail;
use App\Models\Page;
use App\Models\PickupPoint;
use App\Models\Product;
use App\Models\ProductQuery;
use App\Models\Shop;
use App\Models\SubCategory;
use App\Models\User;
use Auth;
use Cache;
use Cookie;
use Hash;
use Illuminate\Auth\Events\PasswordReset;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\View;
use Illuminate\Support\Str;
use Mail;
class HomeController extends Controller {
public function index() {
$featured_categories = Cache::rememberForever('featured_categories', function () {
return Category::where('featured', 1)->get();
});
return view('frontend.index', compact('featured_categories'));
}
public function load_todays_deal_section() {
$todays_deal_products = filter_products(Product::where('todays_deal', '1'))->get();
// dd($todays_deal_products);
return view('frontend.partials.todays_deal', compact('todays_deal_products'));
}
public function load_newest_product_section() {
$newest_products = Cache::remember('newest_products', 3600, function () {
return filter_products(Product::latest())->limit(12)->get();
});
return view('frontend.partials.newest_products_section', compact('newest_products'));
}
public function load_featured_section() {
return view('frontend.partials.featured_products_section');
}
public function load_articles_section() {
return view('frontend.partials.articles_section');
}
public function load_best_selling_section() {
return view('frontend.partials.best_selling_section');
}
public function load_auction_products_section() {
if (!addon_is_activated('auction')) {
return;
}
return view('auction.frontend.auction_products_section');
}
public function load_home_categories_section() {
return view('frontend.partials.home_categories_section');
}
public function load_best_sellers_section() {
return view('frontend.partials.best_sellers_section');
}
public function registration(Request $request) {
if ($request->has('referral_code') && addon_is_activated('affiliate_system')) {
try {
$affiliate_validation_time = AffiliateConfig::where('type', 'validation_time')->first();
$cookie_minute = 30 * 24;
if ($affiliate_validation_time) {
$cookie_minute = $affiliate_validation_time->value * 60;
}
Cookie::queue('referral_code', $request->referral_code, $cookie_minute);
$referred_by_user = User::where('referral_code', $request->referral_code)->first();
$affiliateController = new AffiliateController;
$affiliateController->processAffiliateStats($referred_by_user->id, 1, 0, 0, 0);
} catch (\Exception $e) {
}
}
return view('frontend.user_registration');
}
public function cart_login(Request $request) {
$user = null;
if ($request->get('phone') != null) {
$user = User::whereIn('user_type', ['customer', 'seller', 'workshop'])->where('phone', "+{$request['country_code']}{$request['phone']}")->first();
} elseif ($request->get('email') != null) {
$user = User::whereIn('user_type', ['customer', 'seller', 'workshop'])->where('email', $request->email)->first();
}
if ($user != null) {
if (Hash::check($request->password, $user->password)) {
if ($request->has('remember')) {
auth()->login($user, true);
} else {
auth()->login($user, false);
}
} else {
flash(translate('Invalid email or password!'))->warning();
}
} else {
flash(translate('Invalid email or password!'))->warning();
}
return back();
}
public function dashboard() {
if (Auth::user()->user_type == 'seller') {
return redirect()->route('seller.dashboard');
} elseif (Auth::user()->user_type == 'workshop') {
return redirect()->route('workshop.dashboard');
} elseif (Auth::user()->user_type == 'customer') {
$users_cart = Cart::where('user_id', auth()->user()->id)->first();
if ($users_cart) {
flash(translate('You had placed your items in the shopping cart. Try to order before the product quantity runs out.'))->warning();
}
return view('frontend.user.customer.dashboard');
} elseif (Auth::user()->user_type == 'delivery_boy') {
return view('delivery_boys.dashboard');
} else {
abort(404);
}
}
public function profile(Request $request) {
if (Auth::user()->user_type == 'seller') {
return redirect()->route('seller.profile.index');
} elseif (Auth::user()->user_type == 'delivery_boy') {
return view('delivery_boys.profile');
} else {
$phone_number = Auth::user()->phone;
return view('frontend.user.profile', compact('phone_number'));
}
}
public function userProfileUpdate(Request $request) {
if (env('DEMO_MODE') == 'On') {
flash(translate('Sorry! the action is not permitted in demo '))->error();
return back();
}
$user = Auth::user();
$user->name = $request->name;
$user->address = $request->address;
$user->country = $request->country;
$user->city = $request->city;
$user->postal_code = $request->postal_code;
$user->phone = $request->phone;
if ($request->new_password != null && ($request->new_password == $request->confirm_password)) {
$user->password = Hash::make($request->new_password);
}
$user->avatar_original = $request->photo;
$user->save();
flash(translate('Your Profile has been updated successfully!'))->success();
return back();
}
public function flash_deal_details($slug) {
$flash_deal = FlashDeal::where('slug', $slug)->first();
if ($flash_deal != null)
return view('frontend.flash_deal_details', compact('flash_deal'));
else {
abort(404);
}
}
public function trackOrder(Request $request) {
if ($request->has('order_code')) {
$order = Order::where('code', $request->order_code)->first();
if ($order != null) {
return view('frontend.track_order', compact('order'));
}
}
return view('frontend.track_order');
}
public function product(Request $request, $slug) {
if (!Auth::check()) {
session(['link' => url()->current()]);
}
$detailedProduct = Product::with('reviews', 'brand', 'stocks', 'user', 'user.shop')->where('auction_product', 0)->where('slug', $slug)->where('approved', 1)->first();
if ($detailedProduct != null && $detailedProduct->published) {
if (!addon_is_activated('wholesale') && $detailedProduct->wholesale_product == 1) {
abort(404);
}
$product_queries = ProductQuery::where('product_id', $detailedProduct->id)->where('customer_id', '!=', Auth::id())->latest('id')->paginate(3);
$total_query = ProductQuery::where('product_id', $detailedProduct->id)->count();
$reviews = $detailedProduct->reviews()->paginate(3);
// Pagination using Ajax
if (request()->ajax()) {
if ($request->type == 'query') {
return Response::json(View::make('frontend.partials.product_query_pagination', array('product_queries' => $product_queries))->render());
}
if ($request->type == 'review') {
return Response::json(View::make('frontend.product_details.reviews', array('reviews' => $reviews))->render());
}
}
// review status
$review_status = 0;
if (Auth::check()) {
$OrderDetail = OrderDetail::with(['order' => function ($q) {
$q->where('user_id', Auth::id());
}])->where('product_id', $detailedProduct->id)->where('delivery_status', 'delivered')->first();
$review_status = $OrderDetail ? 1 : 0;
}
if ($request->has('product_referral_code') && addon_is_activated('affiliate_system')) {
$affiliate_validation_time = AffiliateConfig::where('type', 'validation_time')->first();
$cookie_minute = 30 * 24;
if ($affiliate_validation_time) {
$cookie_minute = $affiliate_validation_time->value * 60;
}
Cookie::queue('product_referral_code', $request->product_referral_code, $cookie_minute);
Cookie::queue('referred_product_id', $detailedProduct->id, $cookie_minute);
$referred_by_user = User::where('referral_code', $request->product_referral_code)->first();
$affiliateController = new AffiliateController;
$affiliateController->processAffiliateStats($referred_by_user->id, 1, 0, 0, 0);
}
return view('frontend.product_details', compact('detailedProduct', 'product_queries', 'total_query', 'reviews', 'review_status'));
}
abort(404);
}
public function shop($slug) {
$shop = Shop::where('slug', $slug)->first();
if ($shop != null) {
if ($shop->verification_status != 0) {
return view('frontend.seller_shop', compact('shop'));
} else {
return view('frontend.seller_shop_without_verification', compact('shop'));
}
}
abort(404);
}
public function filter_shop(Request $request, $slug, $type) {
$shop = Shop::where('slug', $slug)->first();
if ($shop != null && $type != null) {
if ($type == 'all-products') {
$sort_by = $request->sort_by;
$min_price = $request->min_price;
$max_price = $request->max_price;
$selected_categories = array();
$brand_id = null;
$rating = null;
$conditions = ['user_id' => $shop->user->id, 'published' => 1, 'approved' => 1];
if ($request->brand != null) {
$brand_id = (Brand::where('slug', $request->brand)->first() != null) ? Brand::where('slug', $request->brand)->first()->id : null;
$conditions = array_merge($conditions, ['brand_id' => $brand_id]);
}
$products = Product::where($conditions);
if ($request->has('selected_categories')) {
$selected_categories = $request->selected_categories;
$products->whereIn('category_id', $selected_categories);
}
if ($min_price != null && $max_price != null) {
$products->where('unit_price', '>=', $min_price)->where('unit_price', '<=', $max_price);
}
if ($request->has('rating')) {
$rating = $request->rating;
$products->where('rating', '>=', $rating);
}
switch ($sort_by) {
case 'newest':
$products->orderBy('created_at', 'desc');
break;
case 'oldest':
$products->orderBy('created_at', 'asc');
break;
case 'price-asc':
$products->orderBy('unit_price', 'asc');
break;
case 'price-desc':
$products->orderBy('unit_price', 'desc');
break;
default:
$products->orderBy('id', 'desc');
break;
}
$products = $products->paginate(24)->appends(request()->query());
return view('frontend.seller_shop', compact('shop', 'type', 'products', 'selected_categories', 'min_price', 'max_price', 'brand_id', 'sort_by', 'rating'));
}
return view('frontend.seller_shop', compact('shop', 'type'));
}
abort(404);
}
public function all_categories(Request $request) {
$categories = Category::where('level', 0)->orderBy('order_level', 'desc')->get();
return view('frontend.all_category', compact('categories'));
}
public function all_brands(Request $request) {
$brands = Brand::all();
return view('frontend.all_brand', compact('brands'));
}
public function home_settings(Request $request) {
return view('home_settings.index');
}
public function top_10_settings(Request $request) {
foreach (Category::all() as $key => $category) {
if (is_array($request->top_categories) && in_array($category->id, $request->top_categories)) {
$category->top = 1;
$category->save();
} else {
$category->top = 0;
$category->save();
}
}
foreach (Brand::all() as $key => $brand) {
if (is_array($request->top_brands) && in_array($brand->id, $request->top_brands)) {
$brand->top = 1;
$brand->save();
} else {
$brand->top = 0;
$brand->save();
}
}
flash(translate('Top 10 categories and brands have been updated successfully'))->success();
return redirect()->route('home_settings.index');
}
public function variant_price(Request $request) {
$product = Product::find($request->id);
$vendor_commission = (int)BusinessSetting::where('type', 'vendor_commission')->first()->value;
$str = '';
$quantity = 0;
$tax = 0;
$max_limit = 0;
if ($request->has('color')) {
$str = $request['color'];
}
if (json_decode($product->choice_options) != null) {
foreach (json_decode($product->choice_options) as $key => $choice) {
if ($str != null) {
$str .= '-' . str_replace(' ', '', $request['attribute_id_' . $choice->attribute_id]);
} else {
$str .= str_replace(' ', '', $request['attribute_id_' . $choice->attribute_id]);
}
}
}
$product_stock = $product->stocks->first();
$price = $product_stock->price;
if ($product->wholesale_product) {
$wholesalePrice = $product_stock->wholesalePrices->where('min_qty', '<=', $request->quantity)->where('max_qty', '>=', $request->quantity)->first();
if ($wholesalePrice) {
$price = $wholesalePrice->price;
}
}
$quantity = $product_stock->qty;
$max_limit = $product_stock->qty;
if ($quantity >= 1 && $product->min_qty <= $quantity) {
$in_stock = 1;
} else {
$in_stock = 0;
}
//Product Stock Visibility
if ($product->stock_visibility_state == 'text') {
if ($quantity >= 1 && $product->min_qty < $quantity) {
$quantity = translate('In Stock');
} else {
$quantity = translate('Out Of Stock');
}
}
//$price += $price * $vendor_commission / 100;
//discount calculation
$discount_applicable = false;
if ($product->discount_start_date == null) {
$discount_applicable = true;
} elseif (
strtotime(date('d-m-Y H:i:s')) >= $product->discount_start_date &&
strtotime(date('d-m-Y H:i:s')) <= $product->discount_end_date
){
$discount_applicable = true;
}
if ($discount_applicable) {
if ($product->discount_type == 'percent') {
$price -= ($price * $product->discount) / 100;
} elseif ($product->discount_type == 'amount') {
$price -= $product->discount;
}
}
$price += $price * config('app.itbis') / 100;
return array(
'price' => single_price($price * $request->quantity),
'quantity' => $quantity,
'digital' => $product->digital,
'variation' => $str,
'max_limit' => $max_limit,
'in_stock' => $in_stock
);
}
public function sellerpolicy() {
$page = Page::where('type', 'seller_policy_page')->first();
return view("frontend.policies.sellerpolicy", compact('page'));
}
public function returnpolicy() {
$page = Page::where('type', 'return_policy_page')->first();
return view("frontend.policies.returnpolicy", compact('page'));
}
public function supportpolicy() {
$page = Page::where('type', 'support_policy_page')->first();
return view("frontend.policies.supportpolicy", compact('page'));
}
public function terms() {
$page = Page::where('type', 'terms_conditions_page')->first();
return view("frontend.policies.terms", compact('page'));
}
public function privacypolicy() {
$page = Page::where('type', 'privacy_policy_page')->first();
return view("frontend.policies.privacypolicy", compact('page'));
}
public function get_pick_up_points(Request $request) {
$pick_up_points = PickupPoint::all();
return view('frontend.partials.pick_up_points', compact('pick_up_points'));
}
public function get_category_items(Request $request) {
$category = Category::findOrFail($request->id);
//$category = SubCategory::findOrFail($request->id);
return view('frontend.partials.category_elements', compact('category'));
}
public function premium_package_index() {
$customer_packages = CustomerPackage::all();
return view('frontend.user.customer_packages_lists', compact('customer_packages'));
}
// public function new_page()
// {
// $user = User::where('user_type', 'admin')->first();
// auth()->login($user);
// return redirect()->route('admin.dashboard');
// }
// Ajax call
public function new_verify(Request $request) {
$email = $request->email;
if (isUnique($email) == '0') {
$response['status'] = 2;
$response['message'] = translate('Email already exists!');
return json_encode($response);
}
$response = $this->send_email_change_verification_mail($request, $email);
return json_encode($response);
}
// Form request
public function send_email_change_verification_mail($request, $email) {
$response['status'] = 0;
$response['message'] = 'Unknown';
$verification_code = Str::random(32);
$array['subject'] = translate('Email Verification');
$array['from'] = env('MAIL_FROM_ADDRESS');
$array['content'] = translate('Verify your account');
$array['link'] = route('email_change.callback') . '?new_email_verificiation_code=' . $verification_code . '&email=' . $email;
$array['sender'] = Auth::user()->name;
$array['details'] = translate("Email Second");
$user = Auth::user();
$user->new_email_verificiation_code = $verification_code;
$user->save();
try {
Mail::to($email)->queue(new SecondEmailVerifyMailManager($array));
$response['status'] = 1;
$response['message'] = translate("Your verification mail has been Sent to your email.");
} catch (\Exception $e) {
// return $e->getMessage();
$response['status'] = 0;
$response['message'] = $e->getMessage();
}
return $response;
}
public function update_email(Request $request) {
$email = $request->email;
if (isUnique($email)) {
$this->send_email_change_verification_mail($request, $email);
flash(translate('A verification mail has been sent to the mail you provided us with.'))->success();
return back();
}
flash(translate('Email already exists!'))->warning();
return back();
}
public function email_change_callback(Request $request) {
if ($request->has('new_email_verificiation_code') && $request->has('email')) {
$verification_code_of_url_param = $request->input('new_email_verificiation_code');
$user = User::where('new_email_verificiation_code', $verification_code_of_url_param)->first();
if ($user != null) {
$user->email = $request->input('email');
$user->new_email_verificiation_code = null;
$user->save();
auth()->login($user, true);
flash(translate('Email Changed successfully'))->success();
if ($user->user_type == 'seller') {
return redirect()->route('seller.dashboard');
}
return redirect()->route('dashboard');
}
}
flash(translate('Email was not verified. Please resend your mail!'))->error();
return redirect()->route('dashboard');
}
public function reset_password_with_code(Request $request) {
if (($user = User::where('email', $request->email)->where('verification_code', $request->code)->first()) != null) {
if ($request->password == $request->password_confirmation) {
$user->password = Hash::make($request->password);
$user->email_verified_at = date('Y-m-d h:m:s');
$user->save();
event(new PasswordReset($user));
auth()->login($user, true);
flash(translate('Password updated successfully'))->success();
if (auth()->user()->user_type == 'admin' || auth()->user()->user_type == 'staff') {
return redirect()->route('admin.dashboard');
}
return redirect()->route('home');
} else {
flash(translate("Password and confirm password didn't match"))->warning();
return view('auth.passwords.reset');
}
} else {
flash(translate("Verification code mismatch"))->error();
return view('auth.passwords.reset');
}
}
public function all_flash_deals() {
$today = strtotime(date('Y-m-d H:i:s'));
$data['all_flash_deals'] = FlashDeal::where('status', 1)
->where('start_date', "<=", $today)
->where('end_date', ">", $today)
->orderBy('created_at', 'desc')
->get();
return view("frontend.flash_deal.all_flash_deal_list", $data);
}
public function todays_deal() {
$todays_deal_products = Cache::rememberForever('todays_deal_products', function () {
return filter_products(Product::with('thumbnail')->where('todays_deal', '1'))->get();
});
return view("frontend.todays_deal", compact('todays_deal_products'));
}
public function all_seller(Request $request) {
$shops = Shop::whereIn('user_id', verified_sellers_id())
->paginate(15);
return view('frontend.shop_listing', compact('shops'));
}
public function all_coupons(Request $request) {
$coupons = Coupon::where('start_date', '<=', strtotime(date('d-m-Y')))->where('end_date', '>=', strtotime(date('d-m-Y')))->paginate(15);
return view('frontend.coupons', compact('coupons'));
}
public function inhouse_products(Request $request) {
$products = filter_products(Product::where('added_by', 'admin'))->with('taxes')->paginate(12)->appends(request()->query());
return view('frontend.inhouse_products', compact('products'));
}
}
|