FrontController.php 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654
  1. <?php
  2. namespace App\Http\Controllers\Front;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. use App\Models\User;
  6. use App\Models\Admin;
  7. use App\Models\Slider;
  8. use App\Models\WelcomeItem;
  9. use App\Models\Feature;
  10. use App\Models\CounterItem;
  11. use App\Models\Testimonial;
  12. use App\Models\TeamMember;
  13. use App\Models\Faq;
  14. use App\Models\BlogCategory;
  15. use App\Models\Post;
  16. use App\Models\Destination;
  17. use App\Models\DestinationPhoto;
  18. use App\Models\DestinationVideo;
  19. use App\Models\Package;
  20. use App\Models\PackageAmenity;
  21. use App\Models\PackageItinerary;
  22. use App\Models\PackagePhoto;
  23. use App\Models\PackageVideo;
  24. use App\Models\PackageFaq;
  25. use App\Models\Amenity;
  26. use App\Models\Tour;
  27. use App\Models\Booking;
  28. use App\Models\Review;
  29. use App\Models\Wishlist;
  30. use App\Models\Subscriber;
  31. use App\Models\HomeItem;
  32. use App\Models\AboutItem;
  33. use App\Models\ContactItem;
  34. use App\Models\TermPrivacyItem;
  35. use App\Mail\Websitemail;
  36. use Hash;
  37. use Auth;
  38. use Srmklive\PayPal\Services\PayPal as PayPalClient;
  39. class FrontController extends Controller
  40. {
  41. public function home()
  42. {
  43. $sliders = Slider::get();
  44. $welcome_item = WelcomeItem::where('id',1)->first();
  45. $features = Feature::get();
  46. $testimonials = Testimonial::get();
  47. $destinations = Destination::orderBy('view_count','desc')->get()->take(8);
  48. $posts = Post::with('blog_category')->orderBy('id','desc')->get()->take(3);
  49. $packages = Package::with(['destination','package_amenities','package_itineraries','tours','reviews'])->orderBy('id','desc')->get()->take(3);
  50. $home_item = HomeItem::where('id',1)->first();
  51. return view('front.home', compact('sliders','welcome_item','features', 'testimonials', 'posts', 'destinations', 'packages', 'home_item'));
  52. }
  53. public function about()
  54. {
  55. $welcome_item = WelcomeItem::where('id',1)->first();
  56. $features = Feature::get();
  57. $counter_item = CounterItem::where('id',1)->first();
  58. $about_item = AboutItem::where('id',1)->first();
  59. return view('front.about', compact('welcome_item', 'features', 'counter_item', 'about_item'));
  60. }
  61. public function contact()
  62. {
  63. $contact_item = ContactItem::where('id',1)->first();
  64. return view('front.contact', compact('contact_item'));
  65. }
  66. public function contact_submit(Request $request)
  67. {
  68. $request->validate([
  69. 'name' => 'required',
  70. 'email' => 'required|email',
  71. 'comment' => 'required',
  72. ]);
  73. $admin = Admin::where('id',1)->first();
  74. $subject = "Contact Form Message";
  75. $message = "<b>Name:</b><br>".$request->name."<br><br>";
  76. $message .= "<b>Email:</b><br>".$request->email."<br><br>";
  77. $message .= "<b>Comment:</b><br>".nl2br($request->comment)."<br>";
  78. \Mail::to($admin->email)->send(new Websitemail($subject,$message));
  79. return redirect()->back()->with('success', 'Your message is submitted successfully. We will contact you soon.');
  80. }
  81. public function subscriber_submit(Request $request)
  82. {
  83. $request->validate([
  84. 'email' => 'required|email|unique:subscribers,email',
  85. ]);
  86. $token = hash('sha256',time());
  87. $obj = new Subscriber;
  88. $obj->email = $request->email;
  89. $obj->token = $token;
  90. $obj->status = 'Pending';
  91. $obj->save();
  92. $verification_link = route('subscriber_verify',['email'=>$request->email,'token'=>$token]);
  93. $subject = 'Subscriber Verification';
  94. $message = 'Please click the following link to verify your email address as subscriber:<br><a href="'.$verification_link.'">Verify Email</a>';
  95. \Mail::to($request->email)->send(new Websitemail($subject,$message));
  96. return redirect()->back()->with('success', 'You are subscribed successfully. Please check your email to confirm the verification link.');
  97. }
  98. public function subscriber_verify($email,$token)
  99. {
  100. $subscriber = Subscriber::where('token',$token)->where('email',$email)->first();
  101. if(!$subscriber) {
  102. return redirect()->route('home');
  103. }
  104. $subscriber->token = '';
  105. $subscriber->status = 'Active';
  106. $subscriber->update();
  107. return redirect()->back()->with('success', 'Your subscribtion is successful.');
  108. }
  109. public function team_members()
  110. {
  111. $team_members = TeamMember::paginate(20);
  112. return view('front.team_members', compact('team_members'));
  113. }
  114. public function team_member($slug)
  115. {
  116. $team_member = TeamMember::where('slug',$slug)->first();
  117. return view('front.team_member', compact('team_member'));
  118. }
  119. public function faq()
  120. {
  121. $faqs = Faq::get();
  122. return view('front.faq', compact('faqs'));
  123. }
  124. public function terms()
  125. {
  126. $term_privacy_item = TermPrivacyItem::where('id',1)->first();
  127. return view('front.terms', compact('term_privacy_item'));
  128. }
  129. public function privacy()
  130. {
  131. $term_privacy_item = TermPrivacyItem::where('id',1)->first();
  132. return view('front.privacy', compact('term_privacy_item'));
  133. }
  134. public function blog()
  135. {
  136. $posts = Post::with('blog_category')->orderBy('id','desc')->paginate(9);
  137. return view('front.blog', compact('posts'));
  138. }
  139. public function post($slug)
  140. {
  141. $categories = BlogCategory::orderBy('name','asc')->get();
  142. $post = Post::with('blog_category')->where('slug',$slug)->first();
  143. $latest_posts = Post::with('blog_category')->orderBy('id','desc')->get()->take(5);
  144. return view('front.post', compact('post', 'categories', 'latest_posts'));
  145. }
  146. public function category($slug)
  147. {
  148. $category = BlogCategory::where('slug',$slug)->first();
  149. $posts = Post::with('blog_category')->where('blog_category_id',$category->id)->orderBy('id','desc')->paginate(9);
  150. return view('front.category', compact('posts', 'category'));
  151. }
  152. public function destinations()
  153. {
  154. $destinations = Destination::orderBy('id','asc')->paginate(20);
  155. return view('front.destinations', compact('destinations'));
  156. }
  157. public function destination($slug)
  158. {
  159. $destination = Destination::where('slug',$slug)->first();
  160. $destination->view_count = $destination->view_count + 1;
  161. $destination->update();
  162. $destination_photos = DestinationPhoto::where('destination_id',$destination->id)->get();
  163. $destination_videos = DestinationVideo::where('destination_id',$destination->id)->get();
  164. $packages = Package::with(['destination','package_amenities','package_itineraries','tours','reviews'])->orderBy('id','desc')->where('destination_id',$destination->id)->get()->take(3);
  165. return view('front.destination', compact('destination', 'destination_photos', 'destination_videos', 'packages'));
  166. }
  167. public function packages(Request $request)
  168. {
  169. $form_name = $request->name;
  170. $form_min_price = $request->min_price;
  171. $form_max_price = $request->max_price;
  172. $form_destination_id = $request->destination_id;
  173. $form_review = $request->review;
  174. $destinations = Destination::orderBy('name','asc')->get();
  175. $packages = Package::with(['destination','package_amenities','package_itineraries','tours','reviews'])->orderBy('id','desc');
  176. if($request->name != '') {
  177. $packages = $packages->where('name','like','%'.$request->name.'%');
  178. }
  179. if($request->min_price != '') {
  180. $packages = $packages->where('price','>=',$request->min_price);
  181. }
  182. if($request->max_price != '') {
  183. $packages = $packages->where('price','<=',$request->max_price);
  184. }
  185. if($request->destination_id != '') {
  186. $packages = $packages->where('destination_id',$request->destination_id);
  187. }
  188. if($request->review != 'all' && $request->review != null) {
  189. $packages = $packages->whereRaw('total_score/total_rating = ?', [$request->review]);
  190. }
  191. $packages = $packages->paginate(6);
  192. return view('front.packages', compact('destinations', 'packages', 'form_name', 'form_min_price', 'form_max_price', 'form_destination_id', 'form_review'));
  193. }
  194. public function package($slug)
  195. {
  196. $package = Package::with('destination')->where('slug',$slug)->first();
  197. $package_amenities_include = PackageAmenity::with('amenity')->where('package_id',$package->id)->where('type','Include')->get();
  198. $package_amenities_exclude = PackageAmenity::with('amenity')->where('package_id',$package->id)->where('type','Exclude')->get();
  199. $package_itineraries = PackageItinerary::where('package_id',$package->id)->get();
  200. $package_photos = PackagePhoto::where('package_id',$package->id)->get();
  201. $package_videos = PackageVideo::where('package_id',$package->id)->get();
  202. $package_faqs = PackageFaq::where('package_id',$package->id)->get();
  203. $tours = Tour::where('package_id',$package->id)->get();
  204. $reviews = Review::with('user')->where('package_id',$package->id)->get();
  205. return view('front.package', compact('package', 'package_amenities_include', 'package_amenities_exclude', 'package_itineraries', 'package_photos', 'package_videos', 'package_faqs', 'tours', 'reviews'));
  206. }
  207. public function wishlist($package_id)
  208. {
  209. if(!Auth::guard('web')->check()) {
  210. return redirect()->route('login')->with('error', 'Please login first to add this item to your wishlist!');
  211. }
  212. $user_id = Auth::guard('web')->user()->id;
  213. $check = Wishlist::where('user_id',$user_id)->where('package_id',$package_id)->count();
  214. if($check > 0) {
  215. return redirect()->back()->with('error', 'This item is already in your wishlist!');
  216. }
  217. $wishlist = new Wishlist();
  218. $wishlist->user_id = $user_id;
  219. $wishlist->package_id = $package_id;
  220. $wishlist->save();
  221. return redirect()->back()->with('success', 'Item is added to your wishlist!');
  222. }
  223. public function payment(Request $request)
  224. {
  225. //dd($request->all());
  226. // Check the tour selection
  227. if(!$request->tour_id) {
  228. return redirect()->back()->with('error', 'Please select a tour first!');
  229. }
  230. // Check the seat availability
  231. $tour_data = Tour::where('id',$request->tour_id)->first();
  232. $total_allowed_seats = $tour_data->total_seat;
  233. if($total_allowed_seats != '-1') {
  234. $total_booked_seats = 0;
  235. $all_data = Booking::where('tour_id',$request->tour_id)->where('package_id',$request->package_id)->get();
  236. foreach($all_data as $data) {
  237. $total_booked_seats += $data->total_person;
  238. }
  239. $remaining_seats = $total_allowed_seats - $total_booked_seats;
  240. if($total_booked_seats+$request->total_person > $total_allowed_seats) {
  241. return redirect()->back()->with('error', 'Sorry! Only '.$remaining_seats.' seats are available for this tour!');
  242. }
  243. }
  244. $user_id = Auth::guard('web')->user()->id;
  245. $package = Package::where('id',$request->package_id)->first();
  246. $total_price = $request->ticket_price * $request->total_person;
  247. if($request->payment_method == 'PayPal')
  248. {
  249. $provider = new PayPalClient;
  250. $provider->setApiCredentials(config('paypal'));
  251. $paypalToken = $provider->getAccessToken();
  252. $response = $provider->createOrder([
  253. "intent" => "CAPTURE",
  254. "application_context" => [
  255. "return_url" => route('paypal_success'),
  256. "cancel_url" => route('paypal_cancel')
  257. ],
  258. "purchase_units" => [
  259. [
  260. "amount" => [
  261. "currency_code" => "USD",
  262. "value" => $total_price
  263. ]
  264. ]
  265. ]
  266. ]);
  267. //dd($response);
  268. if(isset($response['id']) && $response['id'] != null) {
  269. foreach($response['links'] as $link) {
  270. if($link['rel'] == 'approve') {
  271. session()->put('total_person', $request->total_person);
  272. session()->put('tour_id', $request->tour_id);
  273. session()->put('package_id', $request->package_id);
  274. session()->put('user_id', $user_id);
  275. return redirect()->away($link['href']);
  276. }
  277. }
  278. } else {
  279. return redirect()->route('paypal_cancel');
  280. }
  281. }
  282. elseif($request->payment_method == 'Stripe')
  283. {
  284. $stripe = new \Stripe\StripeClient(config('stripe.stripe_sk'));
  285. $response = $stripe->checkout->sessions->create([
  286. 'line_items' => [
  287. [
  288. 'price_data' => [
  289. 'currency' => 'usd',
  290. 'product_data' => [
  291. 'name' => $package->name,
  292. ],
  293. 'unit_amount' => $total_price*100,
  294. ],
  295. 'quantity' => $request->total_person,
  296. ],
  297. ],
  298. 'mode' => 'payment',
  299. 'success_url' => route('stripe_success').'?session_id={CHECKOUT_SESSION_ID}',
  300. 'cancel_url' => route('stripe_cancel'),
  301. ]);
  302. //dd($response);
  303. if(isset($response->id) && $response->id != ''){
  304. //session()->put('product_name', $request->product_name);
  305. //session()->put('quantity', $request->quantity);
  306. //session()->put('price', $request->price);
  307. session()->put('total_person', $request->total_person);
  308. session()->put('tour_id', $request->tour_id);
  309. session()->put('package_id', $request->package_id);
  310. session()->put('user_id', $user_id);
  311. session()->put('paid_amount', $total_price);
  312. return redirect($response->url);
  313. } else {
  314. return redirect()->route('stripe_cancel');
  315. }
  316. }
  317. elseif($request->payment_method == 'Cash')
  318. {
  319. $obj = new Booking;
  320. $obj->tour_id = $request->tour_id;
  321. $obj->package_id = $request->package_id;
  322. $obj->user_id = Auth::guard('web')->user()->id;
  323. $obj->total_person = $request->total_person;
  324. $obj->paid_amount = $request->ticket_price;
  325. $obj->payment_method = "Cash";
  326. $obj->payment_status = "Pending";
  327. $obj->invoice_no = time();
  328. $obj->save();
  329. return redirect()->back()->with('success', 'Payment is pending and will be successful after admin approval!');
  330. }
  331. }
  332. public function paypal_success(Request $request)
  333. {
  334. $provider = new PayPalClient;
  335. $provider->setApiCredentials(config('paypal'));
  336. $paypalToken = $provider->getAccessToken();
  337. $response = $provider->capturePaymentOrder($request->token);
  338. //dd($response);
  339. if(isset($response['status']) && $response['status'] == 'COMPLETED') {
  340. // Insert data into database
  341. $obj = new Booking;
  342. $obj->tour_id = session()->get('tour_id');
  343. $obj->package_id = session()->get('package_id');
  344. $obj->user_id = session()->get('user_id');
  345. $obj->total_person = session()->get('total_person');
  346. //$obj->payment_id = $response['id'];
  347. $obj->paid_amount = $response['purchase_units'][0]['payments']['captures'][0]['amount']['value'];
  348. //$obj->currency = $response['purchase_units'][0]['payments']['captures'][0]['amount']['currency_code'];
  349. // $obj->payer_name = $response['payer']['name']['given_name'];
  350. // $obj->payer_email = $response['payer']['email_address'];
  351. $obj->payment_method = "PayPal";
  352. $obj->payment_status = 'Completed';
  353. $obj->invoice_no = time();
  354. $obj->save();
  355. return redirect()->back()->with('success', 'Payment is successful!');
  356. unset($_SESSION['tour_id']);
  357. unset($_SESSION['package_id']);
  358. unset($_SESSION['user_id']);
  359. unset($_SESSION['total_person']);
  360. } else {
  361. return redirect()->route('paypal_cancel');
  362. }
  363. }
  364. public function paypal_cancel()
  365. {
  366. return redirect()->back()->with('error', 'Payment is cancelled!');
  367. }
  368. public function stripe_success(Request $request)
  369. {
  370. if(isset($request->session_id)) {
  371. $stripe = new \Stripe\StripeClient(config('stripe.stripe_sk'));
  372. $response = $stripe->checkout->sessions->retrieve($request->session_id);
  373. //dd($response);
  374. $obj = new Booking;
  375. $obj->tour_id = session()->get('tour_id');
  376. $obj->package_id = session()->get('package_id');
  377. $obj->user_id = session()->get('user_id');
  378. $obj->total_person = session()->get('total_person');
  379. $obj->paid_amount = session()->get('paid_amount');
  380. $obj->payment_method = "Stripe";
  381. $obj->payment_status = "Completed";
  382. $obj->invoice_no = time();
  383. $obj->save();
  384. return redirect()->back()->with('success', 'Payment is successful!');
  385. unset($_SESSION['tour_id']);
  386. unset($_SESSION['package_id']);
  387. unset($_SESSION['user_id']);
  388. unset($_SESSION['total_person']);
  389. unset($_SESSION['paid_amount']);
  390. } else {
  391. return redirect()->route('stripe_cancel');
  392. }
  393. }
  394. public function stripe_cancel()
  395. {
  396. return redirect()->back()->with('error', 'Payment is cancelled!');
  397. }
  398. public function enquery_form_submit(Request $request, $id)
  399. {
  400. $package = Package::where('id',$id)->first();
  401. $admin = Admin::where('id',1)->first();
  402. $request->validate([
  403. 'name' => 'required',
  404. 'email' => 'required|email',
  405. 'phone' => 'required',
  406. 'message' => 'required',
  407. ]);
  408. $subject = "Enquery about: ".$package->name;
  409. $message = "<b>Name:</b><br>".$request->name."<br><br>";
  410. $message .= "<b>Email:</b><br>".$request->email."<br><br>";
  411. $message .= "<b>Phone:</b><br>".$request->phone."<br><br>";
  412. $message .= "<b>Message:</b><br>".nl2br($request->message)."<br>";
  413. \Mail::to($admin->email)->send(new Websitemail($subject,$message));
  414. return redirect()->back()->with('success', 'Your enquery is submitted successfully. We will contact you soon.');
  415. }
  416. public function review_submit(Request $request)
  417. {
  418. //dd($request->all());
  419. $request->validate([
  420. 'rating' => 'required',
  421. 'comment' => 'required',
  422. ]);
  423. $obj = new Review;
  424. $obj->user_id = Auth::guard('web')->user()->id;
  425. $obj->package_id = $request->package_id;
  426. $obj->rating = $request->rating;
  427. $obj->comment = $request->comment;
  428. $obj->save();
  429. $package_data = Package::where('id',$request->package_id)->first();
  430. $package_data->total_rating = $package_data->total_rating + 1;
  431. $package_data->total_score = $package_data->total_score + $request->rating;
  432. $package_data->update();
  433. return redirect()->back()->with('success', 'Review is submitted successfully!');
  434. }
  435. public function registration()
  436. {
  437. return view('front.registration');
  438. }
  439. public function registration_submit(Request $request)
  440. {
  441. $request->validate([
  442. 'name' => 'required',
  443. 'email' => 'required|email|unique:users,email',
  444. 'password' => 'required',
  445. 'retype_password' => 'required|same:password',
  446. ]);
  447. $token = hash('sha256',time());
  448. $user = new User();
  449. $user->name = $request->name;
  450. $user->email = $request->email;
  451. $user->password = bcrypt($request->password);
  452. $user->token = $token;
  453. $user->save();
  454. $verification_link = route('registration_verify',['email'=>$request->email,'token'=>$token]);
  455. $subject = 'User Account Verification';
  456. $message = 'Please click the following link to verify your email address:<br><a href="'.$verification_link.'">Verify Email</a>';
  457. \Mail::to($request->email)->send(new Websitemail($subject,$message));
  458. return redirect()->back()->with('success', 'Registration is Successful, but you have to verify your email address to login. So please check your email to confirm the verification link.');
  459. }
  460. public function registration_verify($email,$token)
  461. {
  462. //dd($token,$email);
  463. $user = User::where('token',$token)->where('email',$email)->first();
  464. if(!$user) {
  465. return redirect()->route('login');
  466. }
  467. $user->token = '';
  468. $user->status = 1;
  469. $user->update();
  470. return redirect()->route('login')->with('success', 'Your email is verified. You can login now.');
  471. }
  472. public function login()
  473. {
  474. return view('front.login');
  475. }
  476. public function login_submit(Request $request)
  477. {
  478. $request->validate([
  479. 'email' => ['required', 'email'],
  480. 'password' => ['required'],
  481. ]);
  482. $check = $request->all();
  483. $data = [
  484. 'email' => $check['email'],
  485. 'password' => $check['password'],
  486. 'status' => 1,
  487. ];
  488. if(Auth::guard('web')->attempt($data)) {
  489. return redirect()->route('user_dashboard')->with('success','Login is successful!');
  490. } else {
  491. return redirect()->route('login')->with('error','The information you entered is incorrect! Please try again!')->withInput();
  492. }
  493. }
  494. public function logout()
  495. {
  496. Auth::guard('web')->logout();
  497. return redirect()->route('login')->with('success','Logout is successful!');
  498. }
  499. public function forget_password()
  500. {
  501. return view('front.forget-password');
  502. }
  503. public function forget_password_submit(Request $request)
  504. {
  505. $request->validate([
  506. 'email' => ['required', 'email'],
  507. ]);
  508. $user = User::where('email',$request->email)->first();
  509. if(!$user) {
  510. return redirect()->back()->with('error','Email is not found!');
  511. }
  512. $token = hash('sha256',time());
  513. $user->token = $token;
  514. $user->update();
  515. $reset_link = route('reset_password',['token'=>$token,'email'=>$request->email]);
  516. $subject = "Password Reset";
  517. $message = "To reset password, please click on the link below:<br>";
  518. $message .= "<a href='".$reset_link."'>Click Here</a>";
  519. \Mail::to($request->email)->send(new Websitemail($subject,$message));
  520. return redirect()->back()->with('success','We have sent a password reset link to your email');
  521. }
  522. public function reset_password($token,$email)
  523. {
  524. $user = User::where('email',$email)->where('token',$token)->first();
  525. if(!$user) {
  526. return redirect()->route('login')->with('error','Token or email is not correct!');
  527. }
  528. return view('front.reset-password', compact('token','email'));
  529. }
  530. public function reset_password_submit(Request $request, $token, $email)
  531. {
  532. $request->validate([
  533. 'password' => ['required'],
  534. 'retype_password' => ['required','same:password'],
  535. ]);
  536. $user = User::where('email',$request->email)->where('token',$request->token)->first();
  537. $user->password = Hash::make($request->password);
  538. $user->token = "";
  539. $user->update();
  540. return redirect()->route('login')->with('success','Password reset is successful. You can login now.');
  541. }
  542. }