Enforce policies on Delivery Mode
This commit is contained in:
parent
1c9bbf5f41
commit
f66d470b3d
3 changed files with 132 additions and 9 deletions
|
|
@ -10,6 +10,7 @@ use Illuminate\Database\Eloquent\Builder;
|
|||
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
||||
use Illuminate\Foundation\Bus\DispatchesJobs;
|
||||
use Illuminate\Foundation\Validation\ValidatesRequests;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Routing\Controller as BaseController;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
|
@ -28,7 +29,7 @@ class Controller extends BaseController
|
|||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->middleware(function ($request, $next) {
|
||||
$this->middleware(function (Request $request, callable $next) {
|
||||
$reponse = $next($request);
|
||||
if (\request()->is('bo*') and !\request()->ajax()) {
|
||||
if (!DeliveryMode::getCachedDeliveryModes()->where('status', true)->count()) {
|
||||
|
|
|
|||
|
|
@ -23,7 +23,9 @@ use App\Models\Shop;
|
|||
use App\Models\Timeslot;
|
||||
use App\Notifications\Order\OrderCreated;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
use Illuminate\Support\Facades\Session;
|
||||
use Illuminate\Support\Facades\View;
|
||||
|
|
@ -33,6 +35,20 @@ use LDC\LDCCRM\Enums\Country;
|
|||
|
||||
class OrderController extends Controller
|
||||
{
|
||||
/**
|
||||
* OrderController
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->middleware(function (Request $request, callable $next) {
|
||||
// * On peut passer commande ?
|
||||
$this->authorize('orderThings', Order::class);
|
||||
return $next($request);
|
||||
});
|
||||
}
|
||||
|
||||
// * --- TUNNEL DE COMMANDE ---
|
||||
/**
|
||||
* Récapitualtif du panier
|
||||
|
|
@ -45,8 +61,6 @@ class OrderController extends Controller
|
|||
{
|
||||
$this->assertDoesNotHaveEmptyBasket();
|
||||
$this->assertBasketDidNotChange();
|
||||
// * On peut passer commande ?
|
||||
$this->authorize('orderThings', Order::class);
|
||||
$this->setOrderProcessStep(OrderProcess::reviewBasket());
|
||||
|
||||
/** @var \Gloudemans\Shoppingcart\Cart */
|
||||
|
|
@ -160,6 +174,7 @@ class OrderController extends Controller
|
|||
$this->assertDoesNotHaveEmptyBasket();
|
||||
$this->assertBasketDidNotChange();
|
||||
$this->assertDoesHaveCurrentOrder();
|
||||
$this->assertDeliveryModeIsValid();
|
||||
$this->setOrderProcessStep(OrderProcess::shippment(), OrderProcess::shippingMethod());
|
||||
|
||||
/** @var \App\Models\Order $order */
|
||||
|
|
@ -207,6 +222,7 @@ class OrderController extends Controller
|
|||
$this->assertDoesNotHaveEmptyBasket();
|
||||
$this->assertBasketDidNotChange();
|
||||
$this->assertDoesHaveCurrentOrder();
|
||||
$this->assertDeliveryModeIsValid();
|
||||
$this->setOrderProcessStep(OrderProcess::shippment(), OrderProcess::shippingMethod());
|
||||
/** @var \App\Models\Shop */
|
||||
$shop = Shop::query()->where('id', $request->shop_id)->firstOrFail();
|
||||
|
|
@ -250,6 +266,7 @@ class OrderController extends Controller
|
|||
$this->assertDoesNotHaveEmptyBasket();
|
||||
$this->assertDoesHaveCurrentOrder();
|
||||
$this->assertBasketDidNotChange();
|
||||
$this->assertDeliveryModeIsValid();
|
||||
$this->setOrderProcessStep(OrderProcess::shippment(), OrderProcess::shippingMethod());
|
||||
|
||||
/** @var \App\Models\Order $order */
|
||||
|
|
@ -295,6 +312,7 @@ class OrderController extends Controller
|
|||
$this->assertDoesNotHaveEmptyBasket();
|
||||
$this->assertBasketDidNotChange();
|
||||
$this->assertDoesHaveCurrentOrder();
|
||||
$this->assertDeliveryModeIsValid();
|
||||
$this->setOrderProcessStep(OrderProcess::paymentReview(), OrderProcess::shippment());
|
||||
|
||||
$this->allowTimeSlotSelect();
|
||||
|
|
@ -329,6 +347,7 @@ class OrderController extends Controller
|
|||
$this->assertDoesNotHaveEmptyBasket();
|
||||
$this->assertBasketDidNotChange();
|
||||
$this->assertDoesHaveCurrentOrder();
|
||||
$this->assertDeliveryModeIsValid();
|
||||
$this->setOrderProcessStep(OrderProcess::paymentReview(), OrderProcess::shippment());
|
||||
|
||||
/** @var \App\Models\Customer $customer */
|
||||
|
|
@ -488,6 +507,22 @@ class OrderController extends Controller
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Assert delivery mode si still available.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function assertDeliveryModeIsValid(): void
|
||||
{
|
||||
$order = Order::getCurrentOrder();
|
||||
if (!Gate::check('orderUsingDeliveryMode', $order)) {
|
||||
Session::remove('deliveryModePickSlot');
|
||||
\redirect()->route('order-tunnel.shipping-mode')
|
||||
->with('warning', trans('Le mode de livraison n\'est pas disponible'))
|
||||
->throwResponse();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate Process step
|
||||
*
|
||||
|
|
|
|||
|
|
@ -2,7 +2,10 @@
|
|||
|
||||
namespace App\Policies;
|
||||
|
||||
use App\Enums\Order\DeliveryModeEnum;
|
||||
use App\Enums\Order\PaymentModeEnum;
|
||||
use App\Models\Customer;
|
||||
use App\Models\Order;
|
||||
use Illuminate\Auth\Access\HandlesAuthorization;
|
||||
use Illuminate\Auth\Access\Response;
|
||||
|
||||
|
|
@ -20,16 +23,100 @@ class OrderPolicy
|
|||
*/
|
||||
public function orderThings(Customer $customer = null)
|
||||
{
|
||||
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\DeliveryMode> */
|
||||
$deliveryModes = app('DeliveryModesGlobal');
|
||||
if (!$deliveryModes->where('status', true)->count()) {
|
||||
// phpcs:enable
|
||||
if (!$this->anyDeliveryModeAvalable()) {
|
||||
return Response::deny(trans('Aucun mode de livraison n\'est disponible'));
|
||||
}
|
||||
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\PaymentMode> */
|
||||
$paymentModes = app('PaymentModesGlobal');
|
||||
if (!$paymentModes->where('status', true)->count()) {
|
||||
if (!$this->anyPaymentModeAvalable()) {
|
||||
return Response::deny(trans('Aucun mode de paiement n\'est disponible'));
|
||||
}
|
||||
return Response::allow();
|
||||
}
|
||||
|
||||
/**
|
||||
* Can a user order things ?
|
||||
*
|
||||
* @param \App\Models\Customer|null $customer
|
||||
* @param \App\Models\Order $order
|
||||
*
|
||||
* @return \Illuminate\Auth\Access\Response
|
||||
* @phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundBeforeLastUsed
|
||||
*/
|
||||
public function orderUsingDeliveryMode(
|
||||
Customer $customer = null,
|
||||
Order $order
|
||||
) {
|
||||
// phpcs:enable
|
||||
if (!$this->anyDeliveryModeAvalable()) {
|
||||
return Response::deny(trans('Aucun mode de livraison n\'est disponible'));
|
||||
}
|
||||
if (!$this->anyPaymentModeAvalable()) {
|
||||
return Response::deny(trans('Aucun mode de paiement n\'est disponible'));
|
||||
}
|
||||
if (!$this->deliveryModeIsAvalaible($order->deliveryMode->mode)) {
|
||||
return Response::deny(trans("Le mode de livraison {$order->deliveryMode->mode->label} n'est disponible"));
|
||||
}
|
||||
// * Selection d'un mode de livraison autre que 'inShop'seulement
|
||||
// * si un mode de paiement autre que 'inShop'est disponible.
|
||||
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\DeliveryMode> */
|
||||
$deliveryModes = app('DeliveryModesGlobal');
|
||||
if (
|
||||
!$order->deliveryMode->mode->equals(DeliveryModeEnum::inShop()) and
|
||||
!$this->deliveryModeIsAvalaible(DeliveryModeEnum::inShop()) and
|
||||
$deliveryModes->count() < 2
|
||||
) {
|
||||
return Response::deny(trans("Le mode de livraison {$order->deliveryMode->mode->label} n'est disponible"));
|
||||
}
|
||||
return Response::allow();
|
||||
}
|
||||
|
||||
/**
|
||||
* There is a delivery mode avalable
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
private function anyDeliveryModeAvalable(): bool
|
||||
{
|
||||
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\DeliveryMode> */
|
||||
$deliveryModes = app('DeliveryModesGlobal');
|
||||
return (bool)$deliveryModes->where('status', true)->count();
|
||||
}
|
||||
|
||||
/**
|
||||
* There is a payment mode avalable
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
private function anyPaymentModeAvalable(): bool
|
||||
{
|
||||
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\PaymentMode> */
|
||||
$paymentModes = app('PaymentModesGlobal');
|
||||
return (bool)$paymentModes->where('status', true)->count();
|
||||
}
|
||||
|
||||
/**
|
||||
* The delivery mode is available.
|
||||
*
|
||||
* @param \App\Enums\Order\DeliveryModeEnum $delivery_mode_enum
|
||||
* @return boolean
|
||||
*/
|
||||
private function deliveryModeIsAvalaible(DeliveryModeEnum $delivery_mode_enum): bool
|
||||
{
|
||||
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\DeliveryMode> */
|
||||
$deliveryModes = app('DeliveryModesGlobal');
|
||||
return (bool)$deliveryModes->where('mode', $delivery_mode_enum)->where('status', true)->first();
|
||||
}
|
||||
|
||||
/**
|
||||
* The payment mode is available.
|
||||
*
|
||||
* @param \App\Enums\Order\PaymentModeEnum $payment_mode_enum
|
||||
* @return boolean
|
||||
*/
|
||||
private function paymentModeIsAvailable(PaymentModeEnum $payment_mode_enum): bool
|
||||
{
|
||||
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\PaymentMode> */
|
||||
$paymentModes = app('PaymentModesGlobal');
|
||||
return (bool)$paymentModes->where('mode', $payment_mode_enum)->where('status', true)->first();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue