160 lines
4.6 KiB
PHP
160 lines
4.6 KiB
PHP
<?php
|
|
|
|
namespace Modules\Checkout\Http\Controllers;
|
|
|
|
use Exception;
|
|
use Modules\Support\Country;
|
|
use Modules\Cart\Facades\Cart;
|
|
use Modules\Page\Entities\Page;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Pipeline\Pipeline;
|
|
use Illuminate\Routing\Controller;
|
|
use Illuminate\Support\Collection;
|
|
use Modules\Coupon\Entities\Coupon;
|
|
use Illuminate\Contracts\View\View;
|
|
use Modules\Payment\Facades\Gateway;
|
|
use Illuminate\Contracts\View\Factory;
|
|
use Modules\Coupon\Checkers\ValidCoupon;
|
|
use Modules\Coupon\Checkers\CouponExists;
|
|
use Modules\Coupon\Checkers\MinimumSpend;
|
|
use Modules\Coupon\Checkers\MaximumSpend;
|
|
use Modules\User\Services\CustomerService;
|
|
use Modules\Checkout\Services\OrderService;
|
|
use Modules\Coupon\Checkers\AlreadyApplied;
|
|
use Modules\Address\Entities\DefaultAddress;
|
|
use Modules\Shipping\Facades\ShippingMethod;
|
|
use Modules\Coupon\Checkers\ExcludedProducts;
|
|
use Modules\Coupon\Checkers\ApplicableProducts;
|
|
use Modules\Coupon\Checkers\ExcludedCategories;
|
|
use Illuminate\Contracts\Foundation\Application;
|
|
use Modules\Coupon\Checkers\UsageLimitPerCoupon;
|
|
use Modules\Coupon\Checkers\ApplicableCategories;
|
|
use Modules\Order\Http\Requests\StoreOrderRequest;
|
|
use Modules\Coupon\Checkers\UsageLimitPerCustomer;
|
|
use Modules\Cart\Http\Middleware\CheckCartItemsStock;
|
|
use Modules\Cart\Http\Middleware\RedirectIfCartIsEmpty;
|
|
|
|
class CheckoutController extends Controller
|
|
{
|
|
private array $checkers = [
|
|
CouponExists::class,
|
|
AlreadyApplied::class,
|
|
ValidCoupon::class,
|
|
MinimumSpend::class,
|
|
MaximumSpend::class,
|
|
ApplicableProducts::class,
|
|
ExcludedProducts::class,
|
|
ApplicableCategories::class,
|
|
ExcludedCategories::class,
|
|
UsageLimitPerCoupon::class,
|
|
UsageLimitPerCustomer::class,
|
|
];
|
|
|
|
|
|
/**
|
|
* Create a new controller instance.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function __construct()
|
|
{
|
|
$this->middleware([
|
|
RedirectIfCartIsEmpty::class,
|
|
]);
|
|
|
|
$this->middleware([
|
|
CheckCartItemsStock::class,
|
|
])->only('store');
|
|
}
|
|
|
|
|
|
/**
|
|
* Store a newly created resource in storage.
|
|
*
|
|
* @param StoreOrderRequest $request
|
|
* @param CustomerService $customerService
|
|
* @param OrderService $orderService
|
|
*
|
|
* @return JsonResponse
|
|
*/
|
|
public function store(StoreOrderRequest $request, CustomerService $customerService, OrderService $orderService)
|
|
{
|
|
if (auth()->guest() && $request->create_an_account) {
|
|
$customerService->register($request)->login();
|
|
}
|
|
|
|
|
|
$cartWithCoupon = null;
|
|
$couponCode = request()->query('coupon_code');
|
|
if ($couponCode) {
|
|
$coupon = Coupon::findByCode($couponCode);
|
|
try {
|
|
resolve(Pipeline::class)
|
|
->send($coupon)
|
|
->through($this->checkers)
|
|
->then(function ($coupon) use (&$cartWithCoupon) {
|
|
Cart::applyCoupon($coupon);
|
|
});
|
|
} catch (Exception) {
|
|
//Just suppressing the exception
|
|
}
|
|
}
|
|
|
|
|
|
$order = $orderService->create($request);
|
|
|
|
$gateway = Gateway::get($request->payment_method);
|
|
|
|
try {
|
|
$response = $gateway->purchase($order, $request);
|
|
} catch (Exception $e) {
|
|
$orderService->delete($order);
|
|
|
|
return response()->json([
|
|
'message' => $e->getMessage(),
|
|
], 403);
|
|
} finally {
|
|
if (Cart::hasCoupon()) {
|
|
Cart::removeCoupon();
|
|
}
|
|
}
|
|
|
|
return response()->json($response);
|
|
}
|
|
|
|
|
|
/**
|
|
* Show the form for creating a new resource.
|
|
*
|
|
* @return Application|Factory|View
|
|
*/
|
|
public function create(): View|Factory|Application
|
|
{
|
|
Gateway::all();
|
|
|
|
return view('public.checkout.create', [
|
|
'cart' => Cart::instance(),
|
|
'countries' => Country::supported(),
|
|
'gateways' => Gateway::all(),
|
|
'defaultAddress' => auth()->user()->defaultAddress ?? new DefaultAddress,
|
|
'addresses' => $this->getAddresses(),
|
|
'termsPageURL' => Page::urlForPage(setting('storefront_terms_page')),
|
|
]);
|
|
}
|
|
|
|
|
|
/**
|
|
* Get addresses for the logged in user.
|
|
*
|
|
* @return Collection
|
|
*/
|
|
private function getAddresses()
|
|
{
|
|
if (auth()->guest()) {
|
|
return collect();
|
|
}
|
|
|
|
return auth()->user()->addresses->keyBy('id');
|
|
}
|
|
}
|