From bd63a92604ca8dc9a47dcc63234fa5091a339f9a Mon Sep 17 00:00:00 2001 From: Valentin Lab Date: Sun, 5 Oct 2025 09:56:33 +0200 Subject: [PATCH] fix: make delivery option on checkout stick to the current sale channel --- app/Http/Controllers/Shop/OrderController.php | 16 +++++-- .../Shop/Orders/partials/addresses.blade.php | 44 +++++++++++++++++-- .../Shop/Orders/partials/deliveries.blade.php | 21 +++++++-- 3 files changed, 71 insertions(+), 10 deletions(-) diff --git a/app/Http/Controllers/Shop/OrderController.php b/app/Http/Controllers/Shop/OrderController.php index 0c945c29..3d007de5 100644 --- a/app/Http/Controllers/Shop/OrderController.php +++ b/app/Http/Controllers/Shop/OrderController.php @@ -49,12 +49,22 @@ class OrderController extends Controller { if (ShopCart::count()) { $customer = Customers::getWithAddresses(); - $deliveries = Deliveries::getByCustomer(); + $customerId = $customer ? $customer->id : false; + $defaultSaleChannelId = SaleChannels::getDefaultID($customerId); + $deliveries = $defaultSaleChannelId + ? Deliveries::getBySaleChannels([$defaultSaleChannelId]) + : Deliveries::getByCustomer($customerId); + $deliveries = $deliveries ? $deliveries->values() : collect(); + + $customerData = $customer ? $customer->toArray() : false; + if ($customerData && $defaultSaleChannelId) { + $customerData['default_sale_channel_id'] = $defaultSaleChannelId; + } $data = [ - 'customer' => $customer ? $customer->toArray() : false, + 'customer' => $customerData, 'basket' => Baskets::getBasketTotal(), - 'deliveries' => $deliveries ? $deliveries->toArray() : [], + 'deliveries' => $deliveries->toArray(), 'delivery_types' => DeliveryTypes::getWithPrice(Baskets::getWeight()), ]; diff --git a/resources/views/Shop/Orders/partials/addresses.blade.php b/resources/views/Shop/Orders/partials/addresses.blade.php index ec3e3d12..c0a896a7 100644 --- a/resources/views/Shop/Orders/partials/addresses.blade.php +++ b/resources/views/Shop/Orders/partials/addresses.blade.php @@ -1,13 +1,51 @@ +@php + $addresses = collect($addresses ?? []); + $preselectedAddressId = old($name); + + if ($preselectedAddressId === null && is_string($name) && str_contains($name, '[')) { + $dotName = preg_replace('/\[(.*?)\]/', '.$1', $name); + $dotName = trim($dotName, '.'); + $preselectedAddressId = $dotName ? old($dotName) : null; + } + + if (($preselectedAddressId === null || $preselectedAddressId === '') && $addresses->isNotEmpty()) { + $defaultAddress = $addresses->firstWhere('priority', 1); + + if (! $defaultAddress) { + $defaultAddress = $addresses + ->filter(function ($address) { + return (int) ($address['priority'] ?? 0) > 0; + }) + ->sortByDesc(function ($address) { + return (int) ($address['priority'] ?? 0); + }) + ->first(); + } + + if (! $defaultAddress) { + $defaultAddress = $addresses->firstWhere('is_default', true) + ?? $addresses->firstWhere('default', true); + } + + if (! $defaultAddress) { + $defaultAddress = $addresses->first(); + } + + $preselectedAddressId = $defaultAddress['id'] ?? null; + } + + $addresses = $addresses->all(); +@endphp + @if ($addresses) - @foreach ($addresses ?? [] as $address) + @foreach ($addresses as $address)
@include('components.form.radios.icheck', [ 'name' => $name, 'val' => $address['id'], 'id' => $prefix . '_address_' . $address['id'], - 'value' => - old($name) ?? $address['priority'] || count($addresses) === 1 ? $address['id'] : false, + 'value' => $preselectedAddressId, ])
diff --git a/resources/views/Shop/Orders/partials/deliveries.blade.php b/resources/views/Shop/Orders/partials/deliveries.blade.php index 64843a51..977eb553 100644 --- a/resources/views/Shop/Orders/partials/deliveries.blade.php +++ b/resources/views/Shop/Orders/partials/deliveries.blade.php @@ -39,16 +39,29 @@ ci-contre @push('js')