¨4.0.1¨
This commit is contained in:
@@ -12,14 +12,16 @@ class OrderPlaced
|
||||
/**
|
||||
* The instance of order.
|
||||
*
|
||||
* @var \Modules\Order\Entities\Order
|
||||
* @var Order
|
||||
*/
|
||||
public $order;
|
||||
|
||||
|
||||
/**
|
||||
* Create a new event instance.
|
||||
*
|
||||
* @param \Modules\Order\Entities\Order $order
|
||||
* @param Order $order
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(Order $order)
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace Modules\Checkout\Http\Controllers;
|
||||
|
||||
use Exception;
|
||||
use Illuminate\Http\Response;
|
||||
use Modules\Order\Entities\Order;
|
||||
use Modules\Payment\Facades\Gateway;
|
||||
use Modules\Checkout\Events\OrderPlaced;
|
||||
@@ -14,8 +15,9 @@ class CheckoutCompleteController
|
||||
* Store a newly created resource in storage.
|
||||
*
|
||||
* @param int $orderId
|
||||
* @param \Modules\Checkout\Services\OrderService $orderService
|
||||
* @return \Illuminate\Http\Response
|
||||
* @param OrderService $orderService
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function store($orderId, OrderService $orderService)
|
||||
{
|
||||
@@ -37,16 +39,18 @@ class CheckoutCompleteController
|
||||
|
||||
event(new OrderPlaced($order));
|
||||
|
||||
if (! request()->ajax()) {
|
||||
if (!request()->ajax()) {
|
||||
return redirect()->route('checkout.complete.show');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\Response
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function show()
|
||||
{
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace Modules\Checkout\Http\Controllers;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Cart\Facades\Cart;
|
||||
use Modules\Order\Entities\Order;
|
||||
use Modules\Checkout\Services\OrderService;
|
||||
|
||||
class PaymentCanceledController
|
||||
{
|
||||
@@ -13,8 +14,7 @@ class PaymentCanceledController
|
||||
*
|
||||
* @param int $orderId
|
||||
* @param string $paymentMethod
|
||||
* @param \Modules\Checkout\Services\OrderService $orderService
|
||||
* @return \Illuminate\Http\Response
|
||||
* @param OrderService $orderService
|
||||
*/
|
||||
public function store(Request $request, $orderId)
|
||||
{
|
||||
@@ -27,8 +27,7 @@ class PaymentCanceledController
|
||||
[
|
||||
'success' => true,
|
||||
'message' => trans('payment::messages.payment_cancelled'),
|
||||
],
|
||||
200,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
10
Modules/Checkout/Http/Exceptions/CheckoutException.php
Normal file
10
Modules/Checkout/Http/Exceptions/CheckoutException.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace Modules\Checkout\Http\Exceptions;
|
||||
|
||||
use Exception;
|
||||
|
||||
class CheckoutException extends Exception
|
||||
{
|
||||
|
||||
}
|
||||
@@ -2,12 +2,15 @@
|
||||
|
||||
namespace Modules\Checkout\Listeners;
|
||||
|
||||
use Modules\Checkout\Events\OrderPlaced;
|
||||
|
||||
class AddPlacedOrderToSession
|
||||
{
|
||||
/**
|
||||
* Handle the event.
|
||||
*
|
||||
* @param \Modules\Checkout\Events\OrderPlaced $event
|
||||
* @param OrderPlaced $event
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function handle($event)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
namespace Modules\Checkout\Listeners;
|
||||
|
||||
use Swift_TransportException;
|
||||
use Exception;
|
||||
use Modules\Checkout\Mail\Invoice;
|
||||
use Modules\Checkout\Mail\NewOrder;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
@@ -13,7 +13,8 @@ class SendNewOrderEmails
|
||||
/**
|
||||
* Handle the event.
|
||||
*
|
||||
* @param \Modules\Checkout\Events\OrderPlaced $event
|
||||
* @param OrderPlaced $event
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function handle(OrderPlaced $event)
|
||||
@@ -28,8 +29,8 @@ class SendNewOrderEmails
|
||||
Mail::to($event->order->customer_email)
|
||||
->send(new Invoice($event->order));
|
||||
}
|
||||
} catch (Swift_TransportException $e) {
|
||||
//
|
||||
} catch (Exception) {
|
||||
//TODO:handle exception
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,29 +5,26 @@ namespace Modules\Checkout\Listeners;
|
||||
use Modules\Sms\Sms;
|
||||
use Modules\Order\Entities\Order;
|
||||
use Modules\Checkout\Events\OrderPlaced;
|
||||
use Modules\Sms\Exceptions\SmsException;
|
||||
|
||||
class SendNewOrderSms
|
||||
{
|
||||
/**
|
||||
* Handle the event.
|
||||
*
|
||||
* @param \Modules\Checkout\Events\OrderPlaced $event
|
||||
* @param OrderPlaced $event
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function handle(OrderPlaced $event)
|
||||
{
|
||||
try {
|
||||
$this->sendAdminSms($event->order);
|
||||
$this->sendCustomerSms($event->order);
|
||||
} catch (SmsException $e) {
|
||||
//
|
||||
}
|
||||
$this->sendAdminSms($event->order);
|
||||
$this->sendCustomerSms($event->order);
|
||||
}
|
||||
|
||||
|
||||
private function sendAdminSms(Order $order)
|
||||
{
|
||||
if (! setting('new_order_admin_sms')) {
|
||||
if (!setting('new_order_admin_sms')) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -37,14 +34,16 @@ class SendNewOrderSms
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
private function adminMessage(Order $order)
|
||||
{
|
||||
return trans('sms::messages.new_order', ['order_id' => $order->id]);
|
||||
}
|
||||
|
||||
|
||||
private function sendCustomerSms(Order $order)
|
||||
{
|
||||
if (! setting('new_order_sms')) {
|
||||
if (!setting('new_order_sms')) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -54,6 +53,7 @@ class SendNewOrderSms
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
private function customerMessage(Order $order)
|
||||
{
|
||||
return trans('sms::messages.order_has_been_placed', [
|
||||
|
||||
@@ -3,13 +3,15 @@
|
||||
namespace Modules\Checkout\Listeners;
|
||||
|
||||
use Modules\Order\Entities\Order;
|
||||
use Modules\Checkout\Events\OrderPlaced;
|
||||
|
||||
class UpdateOrderStatus
|
||||
{
|
||||
/**
|
||||
* Handle the event.
|
||||
*
|
||||
* @param \Modules\Checkout\Events\OrderPlaced $event
|
||||
* @param OrderPlaced $event
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function handle($event)
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace Modules\Checkout\Mail;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Mail\Mailable;
|
||||
use Modules\Media\Entities\File;
|
||||
use Modules\Order\Entities\Order;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
|
||||
@@ -15,14 +16,16 @@ class Invoice extends Mailable implements ShouldQueue
|
||||
/**
|
||||
* The instance of the order.
|
||||
*
|
||||
* @var \Modules\Order\Entities\Order
|
||||
* @var Order
|
||||
*/
|
||||
public $order;
|
||||
|
||||
|
||||
/**
|
||||
* Create a new message instance.
|
||||
*
|
||||
* @param \Modules\Order\Entities\Order $order
|
||||
* @param Order $order
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($order)
|
||||
@@ -30,6 +33,7 @@ class Invoice extends Mailable implements ShouldQueue
|
||||
$this->order = $order;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Build the message.
|
||||
*
|
||||
@@ -47,6 +51,7 @@ class Invoice extends Mailable implements ShouldQueue
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
private function getViewName()
|
||||
{
|
||||
return 'invoice' . (is_rtl() ? '_rtl' : '');
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace Modules\Checkout\Mail;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Mail\Mailable;
|
||||
use Modules\Media\Entities\File;
|
||||
use Modules\Order\Entities\Order;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
|
||||
@@ -14,10 +15,12 @@ class NewOrder extends Mailable implements ShouldQueue
|
||||
|
||||
public $order;
|
||||
|
||||
|
||||
/**
|
||||
* Create a new message instance.
|
||||
*
|
||||
* @param \Modules\Order\Entities\Order $order
|
||||
* @param Order $order
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($order)
|
||||
@@ -25,6 +28,7 @@ class NewOrder extends Mailable implements ShouldQueue
|
||||
$this->order = $order;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Build the message.
|
||||
*
|
||||
@@ -38,6 +42,7 @@ class NewOrder extends Mailable implements ShouldQueue
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
private function getViewName()
|
||||
{
|
||||
return 'new_order' . (is_rtl() ? '_rtl' : '');
|
||||
|
||||
@@ -2,6 +2,11 @@
|
||||
|
||||
namespace Modules\Checkout\Providers;
|
||||
|
||||
use Modules\Checkout\Events\OrderPlaced;
|
||||
use Modules\Checkout\Listeners\SendNewOrderSms;
|
||||
use Modules\Checkout\Listeners\UpdateOrderStatus;
|
||||
use Modules\Checkout\Listeners\SendNewOrderEmails;
|
||||
use Modules\Checkout\Listeners\AddPlacedOrderToSession;
|
||||
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
|
||||
|
||||
class EventServiceProvider extends ServiceProvider
|
||||
@@ -12,11 +17,11 @@ class EventServiceProvider extends ServiceProvider
|
||||
* @var array
|
||||
*/
|
||||
protected $listen = [
|
||||
\Modules\Checkout\Events\OrderPlaced::class => [
|
||||
\Modules\Checkout\Listeners\UpdateOrderStatus::class,
|
||||
\Modules\Checkout\Listeners\SendNewOrderEmails::class,
|
||||
\Modules\Checkout\Listeners\SendNewOrderSms::class,
|
||||
\Modules\Checkout\Listeners\AddPlacedOrderToSession::class,
|
||||
OrderPlaced::class => [
|
||||
UpdateOrderStatus::class,
|
||||
SendNewOrderEmails::class,
|
||||
SendNewOrderSms::class,
|
||||
AddPlacedOrderToSession::class,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
5
Modules/Checkout/Resources/lang/en/messages.php
Normal file
5
Modules/Checkout/Resources/lang/en/messages.php
Normal file
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'no_shipping_method' => 'No shipping method is found',
|
||||
];
|
||||
@@ -30,6 +30,21 @@ class OrderService
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
public function reduceStock()
|
||||
{
|
||||
Cart::reduceStock();
|
||||
}
|
||||
|
||||
|
||||
public function delete(Order $order)
|
||||
{
|
||||
$order->delete();
|
||||
|
||||
Cart::restoreStock();
|
||||
}
|
||||
|
||||
|
||||
private function mergeShippingAddress($request)
|
||||
{
|
||||
$request->merge([
|
||||
@@ -37,6 +52,7 @@ class OrderService
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
private function saveAddress($request)
|
||||
{
|
||||
if (auth()->guest()) {
|
||||
@@ -60,6 +76,7 @@ class OrderService
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private function extractAddress($data)
|
||||
{
|
||||
return [
|
||||
@@ -74,6 +91,7 @@ class OrderService
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
private function makeDefaultAddress(Address $address)
|
||||
{
|
||||
if (
|
||||
@@ -91,6 +109,7 @@ class OrderService
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
private function addShippingMethodToCart($request)
|
||||
{
|
||||
if (!Cart::allItemsAreVirtual() && !Cart::hasShippingMethod()) {
|
||||
@@ -98,6 +117,7 @@ class OrderService
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private function store($request)
|
||||
{
|
||||
return Order::create([
|
||||
@@ -137,6 +157,7 @@ class OrderService
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
private function storeOrderProducts(Order $order)
|
||||
{
|
||||
Cart::items()->each(function (CartItem $cartItem) use ($order) {
|
||||
@@ -144,6 +165,7 @@ class OrderService
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
private function storeOrderDownloads(Order $order)
|
||||
{
|
||||
Cart::items()->each(function (CartItem $cartItem) use ($order) {
|
||||
@@ -151,6 +173,7 @@ class OrderService
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
private function storeFlashSaleProductOrders(Order $order)
|
||||
{
|
||||
Cart::items()->each(function (CartItem $cartItem) use ($order) {
|
||||
@@ -169,27 +192,17 @@ class OrderService
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
private function incrementCouponUsage()
|
||||
{
|
||||
Cart::coupon()->usedOnce();
|
||||
}
|
||||
|
||||
|
||||
private function attachTaxes(Order $order)
|
||||
{
|
||||
Cart::taxes()->each(function (CartTax $cartTax) use ($order) {
|
||||
$order->attachTax($cartTax);
|
||||
});
|
||||
}
|
||||
|
||||
public function reduceStock()
|
||||
{
|
||||
Cart::reduceStock();
|
||||
}
|
||||
|
||||
public function delete(Order $order)
|
||||
{
|
||||
$order->delete();
|
||||
|
||||
Cart::restoreStock();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user