diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 9d2edae..94f7bfd 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -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()) { diff --git a/app/Http/Controllers/Fo/OrderController.php b/app/Http/Controllers/Fo/OrderController.php index 75fe010..353b4a3 100644 --- a/app/Http/Controllers/Fo/OrderController.php +++ b/app/Http/Controllers/Fo/OrderController.php @@ -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 * diff --git a/app/Policies/OrderPolicy.php b/app/Policies/OrderPolicy.php index 942a699..d4e5d0d 100644 --- a/app/Policies/OrderPolicy.php +++ b/app/Policies/OrderPolicy.php @@ -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(); + } }