<?php
namespace App\Http\Controllers;
use App\Mail\InvoiceEmailManager;
use App\Models\Address;
use App\Models\Cart;
use App\Models\CombinedOrder;
use App\Models\Coupon;
use App\Models\CouponUsage;
use App\Models\Order;
use App\Models\Product;
use App\Models\User;
use App\Utility\NotificationUtility;
use Auth;
use Illuminate\Http\Request;
use Mail;
use Session;
class CheckoutController extends Controller {
public function checkout(Request $request) {
echo 1;
$combined_order_id = $request->session()->get('combined_order_id');
// Minumum order amount check
if (get_setting('minimum_order_amount_check') == 1) {
$subtotal = 0;
foreach (Cart::with('product')->ownedByCurrentUser()->get() as $cart) {
$product = $cart->product;
$subtotal += cart_product_price($cart, $product, false, false) * $cart->quantity;
}
if ($subtotal < get_setting('minimum_order_amount')) {
flash(translate('You order amount is less than 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'] = $combined_order_id;
$request->session()->put('payment_data', $data);
if ($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 {
return $this->makeManualPaymet($combined_order_id, $request);
}
}
} else {
flash(translate('Select Payment Option.'))->warning();
return back();
}
}
public function makeManualPaymet(int $combined_order_id, Request $request) {
echo 2;
$combined_order = CombinedOrder::with('orders')->findOrFail($combined_order_id);
$manual_payment_data = [
'name' => $request->payment_option,
'amount' => $combined_order->grand_total,
'trx_id' => $request->trx_id,
'photo' => $request->photo
];
$orderIds = $combined_order->orders->pluck('id');
Order::whereIn('id', $orderIds)->update([
'manual_payment' => true,
'manual_payment_data' => json_encode($manual_payment_data),
]);
flash(translate('Your order has been placed successfully. Please submit payment information from purchase history'))->success();
return redirect()->route('checkout.order_confirmed');
}
public function checkout_done($combined_order_id, $payment) {
dd($combined_order_id, $payment);
$combined_order = CombinedOrder::with('orders')->findOrFail($combined_order_id);
$orders = $combined_order->orders;
foreach ($orders as $order) {
$order->update([
'payment_status' => 'paid',
'payment_details' => $payment
]);
NotificationUtility::sendOrderPlacedNotification($order);
}
Session::put('combined_order_id', $combined_order_id);
return redirect()->route('checkout.order_confirmed');
}
public function getShippingInfo() {
return view('frontend.shipping_info', [
'addresses' => Address::ownedByCurrentUser()->get()
]);
}
public function storeDeliveryInfo(Request $request) {
dd($request->all());
$carts = Cart::with(['address', 'product'])->ownedByCurrentUser()->get();
$shipping_info = $carts->first()->address;
$tax = 0;
$shipping = 0;
$subtotal = 0;
foreach ($carts->groupBy('shop_id') as $shop_id => $shopCarts) {
$added_shipping_types = [];
foreach ($shopCarts as $cart) {
$product = $cart->product;
$tax += cart_product_tax($cart, $product, false) * $cart->quantity;
$subtotal += cart_product_price($cart, $product, false, false) * $cart->quantity;
if (!isset($added_shipping_types[$cart->shipping_type])) {
if (!isset($shipping_costs_by_shop[$shop_id])) {
$shipping_costs_by_shop[$shop_id] = 0;
}
$shipping_costs_by_shop[$shop_id] += $cart->shipping_cost;
// Marcar el costo de envío para este tipo como ya agregado para esta tienda
$added_shipping_types[$cart->shipping_type] = true;
}
}
}
// Sumar todos los costos de envío por tienda al total de envío
$shipping = array_sum($shipping_costs_by_shop);
$total = $subtotal + $tax + $shipping;
return view('frontend.payment_select', compact('carts', 'shipping_info', 'total'));
}
public function applyCouponCode(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::ownedByCurrentUser()->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 removeCouponCode(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 applyClubPoint(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 removeClubPoint(Request $request) {
$request->session()->forget('club_point');
return back();
}
public function orderConfirmed() {
$combined_order = CombinedOrder::findOrFail(Session::get('combined_order_id'));
$isAvailableToWorkshop = false;
//elimina del cart las compra que se realizo
Cart::where('user_id', $combined_order->user_id)
->delete();
// Get all children categories From Vehículos and Motocicletas
$availableCategories = CategoryController::getCategoryWithChildrens(['Vehículos', 'Motocicletas']);
// Get all children categories From Vehículos and Motocicletas
$orders = collect();
$products_to_install = collect();
$combined_order->orders()->each(function ($order) use ($orders, $availableCategories, &$isAvailableToWorkshop, &$products_to_install) {
// Check if some product can be installed
$orderDetails = $order->orderDetails()->get();
$array['view'] = 'emails.invoice';
$array['subject'] = 'Tu orden ah sido creada - ' . $order->code;
$array['from'] = env('MAIL_USERNAME');
$array['order'] = $order;
Mail::to(User::find($order->user_id)->email)->bcc($order->shop->user->email)->queue(new InvoiceEmailManager($array));
foreach ($orderDetails as $orderDetail) {
// Get the category name of product
$productName = $orderDetail->product->category->name ?? null;
if ($productName && $availableCategories->contains($productName)) {
$isAvailableToWorkshop = true;
$products_to_install->push(
[
'order_id' => $order->id,
'product' => $orderDetail->product
]
);
break;
}
}
$orders->push($orderDetails);
});
return view('frontend.order_confirmed', compact('combined_order', 'orders', 'isAvailableToWorkshop', 'products_to_install'));
}
}
|