¨4.0.1¨

This commit is contained in:
¨NW¨
2023-12-03 14:07:47 +00:00
parent c08b36d1b6
commit f35052522d
1112 changed files with 43019 additions and 24987 deletions

View File

@@ -6,18 +6,51 @@ 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\Cart\Http\Middleware\CheckCartStock;
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\Cart\Http\Middleware\CheckCouponUsageLimit;
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.
*
@@ -27,50 +60,22 @@ class CheckoutController extends Controller
{
$this->middleware([
RedirectIfCartIsEmpty::class,
CheckCartStock::class,
CheckCouponUsageLimit::class,
]);
$this->middleware([
CheckCartItemsStock::class,
])->only('store');
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
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 \Illuminate\Support\Collection
*/
private function getAddresses()
{
if (auth()->guest()) {
return collect();
}
return auth()->user()->addresses->keyBy('id');
}
/**
* Store a newly created resource in storage.
*
* @param \Modules\Order\Http\Requests\StoreOrderRequest $request
* @param \Modules\User\Services\CustomerService $customerService
* @param \Modules\Checkout\Services\OrderService $orderService
* @return \Illuminate\Http\Response
* @param StoreOrderRequest $request
* @param CustomerService $customerService
* @param OrderService $orderService
*
* @return JsonResponse
*/
public function store(StoreOrderRequest $request, CustomerService $customerService, OrderService $orderService)
{
@@ -78,6 +83,24 @@ class CheckoutController extends Controller
$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);
@@ -90,8 +113,47 @@ class CheckoutController extends Controller
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');
}
}