sarga/packages/Webkul/API/Http/Controllers/Shop/CheckoutController.php

231 lines
6.1 KiB
PHP
Raw Normal View History

2019-05-07 11:36:21 +00:00
<?php
namespace Webkul\API\Http\Controllers\Shop;
2020-11-12 07:57:27 +00:00
use Cart;
use Exception;
use Illuminate\Support\Str;
use Webkul\Payment\Facades\Payment;
use Webkul\Shipping\Facades\Shipping;
use Webkul\Sales\Repositories\OrderRepository;
2019-05-07 11:36:21 +00:00
use Webkul\Checkout\Repositories\CartRepository;
2020-11-12 07:57:27 +00:00
use Webkul\Shop\Http\Controllers\OnepageController;
2019-05-07 11:36:21 +00:00
use Webkul\Checkout\Repositories\CartItemRepository;
2020-11-12 07:57:27 +00:00
use Webkul\Checkout\Http\Requests\CustomerAddressForm;
use Webkul\API\Http\Resources\Sales\Order as OrderResource;
2019-05-07 11:36:21 +00:00
use Webkul\API\Http\Resources\Checkout\Cart as CartResource;
use Webkul\API\Http\Resources\Checkout\CartShippingRate as CartShippingRateResource;
class CheckoutController extends Controller
{
/**
* Contains current guard
*
* @var array
*/
protected $guard;
/**
* CartRepository object
*
2020-03-05 05:34:57 +00:00
* @var \Webkul\Checkout\Repositories\CartRepository
2019-05-07 11:36:21 +00:00
*/
protected $cartRepository;
/**
* CartItemRepository object
*
2020-03-05 05:34:57 +00:00
* @var \Webkul\Checkout\Repositories\CartItemRepository
2019-05-07 11:36:21 +00:00
*/
protected $cartItemRepository;
/**
* Controller instance
*
2020-03-05 14:19:14 +00:00
* @param \Webkul\Checkout\Repositories\CartRepository $cartRepository
2020-03-05 05:34:57 +00:00
* @param \Webkul\Checkout\Repositories\CartItemRepository $cartItemRepository
2020-03-05 14:19:14 +00:00
* @param \Webkul\Sales\Repositories\OrderRepository $orderRepository
2019-05-07 11:36:21 +00:00
*/
public function __construct(
CartRepository $cartRepository,
CartItemRepository $cartItemRepository,
OrderRepository $orderRepository
)
{
$this->guard = request()->has('token') ? 'api' : 'customer';
auth()->setDefaultDriver($this->guard);
// $this->middleware('auth:' . $this->guard);
2020-01-21 09:43:01 +00:00
2019-05-07 11:36:21 +00:00
$this->_config = request('_config');
$this->cartRepository = $cartRepository;
$this->cartItemRepository = $cartItemRepository;
$this->orderRepository = $orderRepository;
}
/**
* Saves customer address.
*
* @param \Webkul\Checkout\Http\Requests\CustomerAddressForm $request
* @return \Illuminate\Http\Response
*/
public function saveAddress(CustomerAddressForm $request)
{
$data = request()->all();
$data['billing']['address1'] = implode(PHP_EOL, array_filter($data['billing']['address1']));
2020-02-19 11:24:04 +00:00
2019-05-07 11:36:21 +00:00
$data['shipping']['address1'] = implode(PHP_EOL, array_filter($data['shipping']['address1']));
if (isset($data['billing']['id']) && str_contains($data['billing']['id'], 'address_')) {
unset($data['billing']['id']);
unset($data['billing']['address_id']);
}
2020-01-21 09:43:01 +00:00
if (isset($data['shipping']['id']) && Str::contains($data['shipping']['id'], 'address_')) {
2019-05-07 11:36:21 +00:00
unset($data['shipping']['id']);
unset($data['shipping']['address_id']);
}
2020-02-19 11:24:04 +00:00
if (Cart::hasError() || ! Cart::saveCustomerAddress($data) || ! Shipping::collectRates()) {
2019-05-07 11:36:21 +00:00
abort(400);
2020-02-19 11:24:04 +00:00
}
2019-05-07 11:36:21 +00:00
$rates = [];
foreach (Shipping::getGroupedAllShippingRates() as $code => $shippingMethod) {
$rates[] = [
'carrier_title' => $shippingMethod['carrier_title'],
2020-03-04 06:32:53 +00:00
'rates' => CartShippingRateResource::collection(collect($shippingMethod['rates'])),
2019-05-07 11:36:21 +00:00
];
}
Cart::collectTotals();
return response()->json([
'data' => [
'rates' => $rates,
2020-03-04 06:32:53 +00:00
'cart' => new CartResource(Cart::getCart()),
2019-05-07 11:36:21 +00:00
]
]);
}
/**
* Saves shipping method.
*
* @return \Illuminate\Http\Response
*/
public function saveShipping()
{
$shippingMethod = request()->get('shipping_method');
2020-02-28 10:25:53 +00:00
if (Cart::hasError()
|| !$shippingMethod
|| ! Cart::saveShippingMethod($shippingMethod)
) {
2019-05-07 11:36:21 +00:00
abort(400);
2020-02-19 11:24:04 +00:00
}
2019-05-07 11:36:21 +00:00
Cart::collectTotals();
return response()->json([
'data' => [
'methods' => Payment::getPaymentMethods(),
2020-03-04 06:32:53 +00:00
'cart' => new CartResource(Cart::getCart()),
2019-05-07 11:36:21 +00:00
]
]);
}
/**
* Saves payment method.
*
* @return \Illuminate\Http\Response
*/
public function savePayment()
{
$payment = request()->get('payment');
2020-02-19 11:24:04 +00:00
if (Cart::hasError() || ! $payment || ! Cart::savePaymentMethod($payment)) {
2019-05-07 11:36:21 +00:00
abort(400);
2020-02-19 11:24:04 +00:00
}
2019-05-07 11:36:21 +00:00
return response()->json([
'data' => [
2020-03-04 06:32:53 +00:00
'cart' => new CartResource(Cart::getCart()),
2019-05-07 11:36:21 +00:00
]
]);
}
2020-11-12 07:54:35 +00:00
/**
* Check for minimum order.
*
* @return \Illuminate\Http\Response
*/
public function checkMinimumOrder()
{
$cart = Cart::getCart();
$cartBaseSubTotal = (float) $cart->base_sub_total;
$minimumOrderAmount = (float) core()->getConfigData('sales.orderSettings.minimum-order.minimum_order_amount') ?? 0;
2020-11-16 12:56:05 +00:00
$status = $cartBaseSubTotal >= $minimumOrderAmount;
2020-11-12 07:54:35 +00:00
return response()->json([
'status' => ! $status ? false : true,
'message' => ! $status ? trans('shop::app.checkout.cart.minimum-order-message', ['amount' => $minimumOrderAmount]) : 'Success',
'data' => [
'cart' => new CartResource($cart),
]
]);
}
2019-05-07 11:36:21 +00:00
/**
* Saves order.
*
* @return \Illuminate\Http\Response
*/
public function saveOrder()
{
2020-02-19 11:24:04 +00:00
if (Cart::hasError()) {
2019-05-07 11:36:21 +00:00
abort(400);
2020-02-19 11:24:04 +00:00
}
2019-05-07 11:36:21 +00:00
Cart::collectTotals();
$this->validateOrder();
$cart = Cart::getCart();
if ($redirectUrl = Payment::getRedirectUrl($cart)) {
return response()->json([
2020-02-19 11:24:04 +00:00
'success' => true,
2020-03-04 06:32:53 +00:00
'redirect_url' => $redirectUrl,
2019-05-07 11:36:21 +00:00
]);
}
$order = $this->orderRepository->create(Cart::prepareDataForOrder());
Cart::deActivateCart();
return response()->json([
2020-02-27 08:03:03 +00:00
'success' => true,
'order' => new OrderResource($order),
]);
2019-05-07 11:36:21 +00:00
}
/**
* Validate order before creation
*
2020-04-29 08:03:37 +00:00
* @throws Exception
2019-05-07 11:36:21 +00:00
*/
2020-04-29 08:03:37 +00:00
public function validateOrder(): void
2019-05-07 11:36:21 +00:00
{
2020-04-29 08:03:37 +00:00
app(OnepageController::class)->validateOrder();
2019-05-07 11:36:21 +00:00
}
}