Enforce policies on Delivery Mode

This commit is contained in:
Jérémy Munsch 2023-02-28 17:30:30 +01:00
parent 1c9bbf5f41
commit f66d470b3d
No known key found for this signature in database
GPG key ID: 18361AF3BFEC0FEC
3 changed files with 132 additions and 9 deletions

View file

@ -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()) {

View file

@ -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
*

View file

@ -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();
}
}