349 lines
14 KiB
PHP
349 lines
14 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Utility\PayfastUtility;
|
|
use Illuminate\Http\Request;
|
|
use App\Models\Category;
|
|
use App\Models\Cart;
|
|
use App\Models\Order;
|
|
use App\Models\Coupon;
|
|
use App\Models\CouponUsage;
|
|
use App\Models\Address;
|
|
use App\Models\Carrier;
|
|
use App\Models\CombinedOrder;
|
|
use App\Models\Product;
|
|
use App\Utility\PayhereUtility;
|
|
use App\Utility\NotificationUtility;
|
|
use Session;
|
|
use Auth;
|
|
|
|
class CheckoutController extends Controller
|
|
{
|
|
|
|
public function __construct()
|
|
{
|
|
//
|
|
}
|
|
|
|
//check the selected payment gateway and redirect to that controller accordingly
|
|
public function checkout(Request $request)
|
|
{
|
|
// Minumum order amount check
|
|
if(get_setting('minimum_order_amount_check') == 1){
|
|
$subtotal = 0;
|
|
foreach (Cart::where('user_id', Auth::user()->id)->get() as $key => $cartItem){
|
|
$product = Product::find($cartItem['product_id']);
|
|
$subtotal += cart_product_price($cartItem, $product, false, false) * $cartItem['quantity'];
|
|
}
|
|
if ($subtotal < get_setting('minimum_order_amount')) {
|
|
flash(translate('You order amount is less then the minimum order amount'))->warning();
|
|
return redirect()->route('home');
|
|
}
|
|
}
|
|
// Minumum order amount check end
|
|
|
|
if ($request->payment_option != null) {
|
|
(new OrderController)->store($request);
|
|
|
|
$request->session()->put('payment_type', 'cart_payment');
|
|
|
|
$data['combined_order_id'] = $request->session()->get('combined_order_id');
|
|
$request->session()->put('payment_data', $data);
|
|
|
|
if ($request->session()->get('combined_order_id') != null) {
|
|
|
|
// If block for Online payment, wallet and cash on delivery. Else block for Offline payment
|
|
$decorator = __NAMESPACE__ . '\\Payment\\' . str_replace(' ', '', ucwords(str_replace('_', ' ', $request->payment_option))) . "Controller";
|
|
if (class_exists($decorator)) {
|
|
return (new $decorator)->pay($request);
|
|
}
|
|
else {
|
|
$combined_order = CombinedOrder::findOrFail($request->session()->get('combined_order_id'));
|
|
$manual_payment_data = array(
|
|
'name' => $request->payment_option,
|
|
'amount' => $combined_order->grand_total,
|
|
'trx_id' => $request->trx_id,
|
|
'photo' => $request->photo
|
|
);
|
|
foreach ($combined_order->orders as $order) {
|
|
$order->manual_payment = 1;
|
|
$order->manual_payment_data = json_encode($manual_payment_data);
|
|
$order->save();
|
|
}
|
|
flash(translate('Your order has been placed successfully. Please submit payment information from purchase history'))->success();
|
|
return redirect()->route('order_confirmed');
|
|
}
|
|
}
|
|
} else {
|
|
flash(translate('Select Payment Option.'))->warning();
|
|
return back();
|
|
}
|
|
}
|
|
|
|
//redirects to this method after a successfull checkout
|
|
public function checkout_done($combined_order_id, $payment)
|
|
{
|
|
$combined_order = CombinedOrder::findOrFail($combined_order_id);
|
|
|
|
foreach ($combined_order->orders as $key => $order) {
|
|
$order = Order::findOrFail($order->id);
|
|
$order->payment_status = 'paid';
|
|
$order->payment_details = $payment;
|
|
$order->save();
|
|
|
|
calculateCommissionAffilationClubPoint($order);
|
|
}
|
|
Session::put('combined_order_id', $combined_order_id);
|
|
return redirect()->route('order_confirmed');
|
|
}
|
|
|
|
public function get_shipping_info(Request $request)
|
|
{
|
|
$carts = Cart::where('user_id', Auth::user()->id)->get();
|
|
// if (Session::has('cart') && count(Session::get('cart')) > 0) {
|
|
if ($carts && count($carts) > 0) {
|
|
$categories = Category::all();
|
|
return view('frontend.shipping_info', compact('categories', 'carts'));
|
|
}
|
|
flash(translate('Your cart is empty'))->success();
|
|
return back();
|
|
}
|
|
|
|
public function store_shipping_info(Request $request)
|
|
{
|
|
if ($request->address_id == null) {
|
|
flash(translate("Please add shipping address"))->warning();
|
|
return back();
|
|
}
|
|
|
|
$carts = Cart::where('user_id', Auth::user()->id)->get();
|
|
if($carts->isEmpty()) {
|
|
flash(translate('Your cart is empty'))->warning();
|
|
return redirect()->route('home');
|
|
}
|
|
|
|
foreach ($carts as $key => $cartItem) {
|
|
$cartItem->address_id = $request->address_id;
|
|
$cartItem->save();
|
|
}
|
|
|
|
$carrier_list = array();
|
|
if(get_setting('shipping_type') == 'carrier_wise_shipping'){
|
|
$zone = \App\Models\Country::where('id',$carts[0]['address']['country_id'])->first()->zone_id;
|
|
|
|
$carrier_query = Carrier::query();
|
|
$carrier_query->whereIn('id',function ($query) use ($zone) {
|
|
$query->select('carrier_id')->from('carrier_range_prices')
|
|
->where('zone_id', $zone);
|
|
})->orWhere('free_shipping', 1);
|
|
$carrier_list = $carrier_query->get();
|
|
}
|
|
|
|
return view('frontend.delivery_info', compact('carts','carrier_list'));
|
|
}
|
|
|
|
public function store_delivery_info(Request $request)
|
|
{
|
|
$carts = Cart::where('user_id', Auth::user()->id)
|
|
->get();
|
|
|
|
if($carts->isEmpty()) {
|
|
flash(translate('Your cart is empty'))->warning();
|
|
return redirect()->route('home');
|
|
}
|
|
|
|
$shipping_info = Address::where('id', $carts[0]['address_id'])->first();
|
|
$total = 0;
|
|
$tax = 0;
|
|
$shipping = 0;
|
|
$subtotal = 0;
|
|
|
|
if ($carts && count($carts) > 0) {
|
|
foreach ($carts as $key => $cartItem) {
|
|
$product = Product::find($cartItem['product_id']);
|
|
$tax += cart_product_tax($cartItem, $product,false) * $cartItem['quantity'];
|
|
$subtotal += cart_product_price($cartItem, $product, false, false) * $cartItem['quantity'];
|
|
|
|
if(get_setting('shipping_type') != 'carrier_wise_shipping' || $request['shipping_type_' . $product->user_id] == 'pickup_point'){
|
|
if ($request['shipping_type_' . $product->user_id] == 'pickup_point') {
|
|
$cartItem['shipping_type'] = 'pickup_point';
|
|
$cartItem['pickup_point'] = $request['pickup_point_id_' . $product->user_id];
|
|
} else {
|
|
$cartItem['shipping_type'] = 'home_delivery';
|
|
}
|
|
$cartItem['shipping_cost'] = 0;
|
|
if ($cartItem['shipping_type'] == 'home_delivery') {
|
|
$cartItem['shipping_cost'] = getShippingCost($carts, $key);
|
|
}
|
|
}
|
|
else{
|
|
$cartItem['shipping_type'] = 'carrier';
|
|
$cartItem['carrier_id'] = $request['carrier_id_' . $product->user_id];
|
|
$cartItem['shipping_cost'] = getShippingCost($carts, $key, $cartItem['carrier_id']);
|
|
}
|
|
|
|
$shipping += $cartItem['shipping_cost'];
|
|
$cartItem->save();
|
|
}
|
|
$total = $subtotal + $tax + $shipping;
|
|
|
|
return view('frontend.payment_select', compact('carts', 'shipping_info', 'total'));
|
|
|
|
} else {
|
|
flash(translate('Your Cart was empty'))->warning();
|
|
return redirect()->route('home');
|
|
}
|
|
}
|
|
|
|
public function apply_coupon_code(Request $request)
|
|
{
|
|
$coupon = Coupon::where('code', $request->code)->first();
|
|
$response_message = array();
|
|
|
|
if ($coupon != null) {
|
|
if (strtotime(date('d-m-Y')) >= $coupon->start_date && strtotime(date('d-m-Y')) <= $coupon->end_date) {
|
|
if (CouponUsage::where('user_id', Auth::user()->id)->where('coupon_id', $coupon->id)->first() == null) {
|
|
$coupon_details = json_decode($coupon->details);
|
|
|
|
$carts = Cart::where('user_id', Auth::user()->id)
|
|
->where('owner_id', $coupon->user_id)
|
|
->get();
|
|
|
|
$coupon_discount = 0;
|
|
|
|
if ($coupon->type == 'cart_base') {
|
|
$subtotal = 0;
|
|
$tax = 0;
|
|
$shipping = 0;
|
|
foreach ($carts as $key => $cartItem) {
|
|
$product = Product::find($cartItem['product_id']);
|
|
$subtotal += cart_product_price($cartItem, $product, false, false) * $cartItem['quantity'];
|
|
$tax += cart_product_tax($cartItem, $product,false) * $cartItem['quantity'];
|
|
$shipping += $cartItem['shipping_cost'];
|
|
}
|
|
$sum = $subtotal + $tax + $shipping;
|
|
if ($sum >= $coupon_details->min_buy) {
|
|
if ($coupon->discount_type == 'percent') {
|
|
$coupon_discount = ($sum * $coupon->discount) / 100;
|
|
if ($coupon_discount > $coupon_details->max_discount) {
|
|
$coupon_discount = $coupon_details->max_discount;
|
|
}
|
|
} elseif ($coupon->discount_type == 'amount') {
|
|
$coupon_discount = $coupon->discount;
|
|
}
|
|
|
|
}
|
|
} elseif ($coupon->type == 'product_base') {
|
|
foreach ($carts as $key => $cartItem) {
|
|
$product = Product::find($cartItem['product_id']);
|
|
foreach ($coupon_details as $key => $coupon_detail) {
|
|
if ($coupon_detail->product_id == $cartItem['product_id']) {
|
|
if ($coupon->discount_type == 'percent') {
|
|
$coupon_discount += (cart_product_price($cartItem, $product, false, false) * $coupon->discount / 100) * $cartItem['quantity'];
|
|
} elseif ($coupon->discount_type == 'amount') {
|
|
$coupon_discount += $coupon->discount * $cartItem['quantity'];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if($coupon_discount > 0){
|
|
Cart::where('user_id', Auth::user()->id)
|
|
->where('owner_id', $coupon->user_id)
|
|
->update(
|
|
[
|
|
'discount' => $coupon_discount / count($carts),
|
|
'coupon_code' => $request->code,
|
|
'coupon_applied' => 1
|
|
]
|
|
);
|
|
$response_message['response'] = 'success';
|
|
$response_message['message'] = translate('Coupon has been applied');
|
|
}
|
|
else{
|
|
$response_message['response'] = 'warning';
|
|
$response_message['message'] = translate('This coupon is not applicable to your cart products!');
|
|
}
|
|
|
|
} else {
|
|
$response_message['response'] = 'warning';
|
|
$response_message['message'] = translate('You already used this coupon!');
|
|
}
|
|
} else {
|
|
$response_message['response'] = 'warning';
|
|
$response_message['message'] = translate('Coupon expired!');
|
|
}
|
|
} else {
|
|
$response_message['response'] = 'danger';
|
|
$response_message['message'] = translate('Invalid coupon!');
|
|
}
|
|
|
|
$carts = Cart::where('user_id', Auth::user()->id)
|
|
->get();
|
|
$shipping_info = Address::where('id', $carts[0]['address_id'])->first();
|
|
|
|
$returnHTML = view('frontend.partials.cart_summary', compact('coupon', 'carts', 'shipping_info'))->render();
|
|
return response()->json(array('response_message' => $response_message, 'html'=>$returnHTML));
|
|
}
|
|
|
|
public function remove_coupon_code(Request $request)
|
|
{
|
|
Cart::where('user_id', Auth::user()->id)
|
|
->update(
|
|
[
|
|
'discount' => 0.00,
|
|
'coupon_code' => '',
|
|
'coupon_applied' => 0
|
|
]
|
|
);
|
|
|
|
$coupon = Coupon::where('code', $request->code)->first();
|
|
$carts = Cart::where('user_id', Auth::user()->id)
|
|
->get();
|
|
|
|
$shipping_info = Address::where('id', $carts[0]['address_id'])->first();
|
|
|
|
return view('frontend.partials.cart_summary', compact('coupon', 'carts', 'shipping_info'));
|
|
}
|
|
|
|
public function apply_club_point(Request $request) {
|
|
if (addon_is_activated('club_point')){
|
|
|
|
$point = $request->point;
|
|
|
|
if(Auth::user()->point_balance >= $point) {
|
|
$request->session()->put('club_point', $point);
|
|
flash(translate('Point has been redeemed'))->success();
|
|
}
|
|
else {
|
|
flash(translate('Invalid point!'))->warning();
|
|
}
|
|
}
|
|
return back();
|
|
}
|
|
|
|
public function remove_club_point(Request $request) {
|
|
$request->session()->forget('club_point');
|
|
return back();
|
|
}
|
|
|
|
public function order_confirmed()
|
|
{
|
|
$combined_order = CombinedOrder::findOrFail(Session::get('combined_order_id'));
|
|
|
|
Cart::where('user_id', $combined_order->user_id)
|
|
->delete();
|
|
|
|
//Session::forget('club_point');
|
|
//Session::forget('combined_order_id');
|
|
|
|
// foreach($combined_order->orders as $order){
|
|
// NotificationUtility::sendOrderPlacedNotification($order);
|
|
// }
|
|
|
|
return view('frontend.order_confirmed', compact('combined_order'));
|
|
}
|
|
}
|