Merge branch 'cart-temp'

This commit is contained in:
2026-09-28 18:09:29 +03:00
212 changed files with 12133 additions and 3316 deletions
+1
View File
@@ -54,6 +54,7 @@
*/
'cart_lines' => [
Lunar\Pipelines\CartLine\GetUnitPrice::class,
Modules\Core\Cart\Pipelines\ZeroSavedForLaterPrice::class,
],
],
+1 -1
View File
@@ -44,5 +44,5 @@
| Determines whether the cart sholud be soft deleted when the user logs out.
|
*/
'delete_on_forget' => true,
'delete_on_forget' => false,
];
+94 -7
View File
@@ -58,11 +58,23 @@
| make sense for the store you're building.
|
*/
'draft_status' => 'awaiting-payment',
'draft_status' => 'awaiting_payment',
// Two sequences — carrier and store-pickup — see Modules\Core\Order\
// Services\OrderStatusFlow, the single source of truth for which
// transitions are actually offered from a given status. Payment
// timing (prepaid vs. cash-on-delivery) does not affect this
// sequence at all — see Order::paid/paid_at instead, an entirely
// independent field with no status value of its own.
//
// 'favourite' controls whether a status gets its own tab in the order
// list topbar (Lunar\Admin\...\ListOrders::getDefaultTabs()) — set
// only on the main-journey statuses so the topbar isn't cluttered
// with every branch/exception value; every status (favourite or not)
// remains reachable via the table's own status filter/search.
'statuses' => [
'awaiting-payment' => [
'awaiting_payment' => [
'label' => 'Awaiting Payment',
'color' => '#848a8c',
'mailers' => [],
@@ -70,17 +82,25 @@
'favourite' => true,
],
'payment-offline' => [
'label' => 'Payment Offline',
'processing' => [
'label' => 'Processing',
'color' => '#0A81D7',
'mailers' => [],
'notifications' => [],
'favourite' => true,
],
'payment-received' => [
'label' => 'Payment Received',
'color' => '#6a67ce',
'ready_for_dispatch' => [
'label' => 'Ready for Dispatch',
'color' => '#c98a2e',
'mailers' => [],
'notifications' => [],
'favourite' => true,
],
'ready_for_pickup' => [
'label' => 'Ready for Pickup',
'color' => '#c98a2e',
'mailers' => [],
'notifications' => [],
'favourite' => true,
@@ -88,11 +108,78 @@
'dispatched' => [
'label' => 'Dispatched',
'color' => '#0A81D7',
'mailers' => [],
'notifications' => [],
'favourite' => true,
],
'delivery_failed' => [
'label' => 'Delivery Failed',
'color' => '#c0392b',
'mailers' => [],
'notifications' => [],
'favourite' => false,
],
'picked_up' => [
'label' => 'Picked Up',
'color' => '#3f7a5c',
'mailers' => [],
'notifications' => [],
'favourite' => true,
],
// The parcel arriving and the return window opening are the same
// moment — one status value covers both.
'delivered' => [
'label' => 'Delivered',
'color' => '#c98a2e',
'mailers' => [],
'notifications' => [],
'favourite' => true,
],
'completed' => [
'label' => 'Completed',
'color' => '#3f7a5c',
'mailers' => [],
'notifications' => [],
'favourite' => true,
],
'return_requested' => [
'label' => 'Return Requested',
'color' => '#c98a2e',
'mailers' => [],
'notifications' => [],
'favourite' => false,
],
'returned' => [
'label' => 'Returned',
'color' => '#c0392b',
'mailers' => [],
'notifications' => [],
'favourite' => false,
],
'partially_refunded' => [
'label' => 'Partially Refunded',
'color' => '#c98a2e',
'mailers' => [],
'notifications' => [],
'favourite' => false,
],
'refunded' => [
'label' => 'Refunded',
'color' => '#c0392b',
'mailers' => [],
'notifications' => [],
'favourite' => false,
],
],
/*
+1 -1
View File
@@ -46,6 +46,6 @@
| to include in the count below.
|
*/
'order_count_statuses' => ['payment-received'],
'order_count_statuses' => ['processing'],
];
+3
View File
@@ -1,5 +1,7 @@
<?php
use Modules\Core\Payment\Drivers\OfflinePaymentDriver;
return [
'default' => env('PAYMENTS_TYPE', 'cash-in-hand'),
@@ -7,6 +9,7 @@
'types' => [
'cash-in-hand' => [
'driver' => 'offline',
'payment_driver' => OfflinePaymentDriver::class,
'authorized' => 'payment-offline',
],
],
+28 -4
View File
@@ -20,7 +20,17 @@
Lunar\Models\Collection::class,
Lunar\Models\Customer::class,
Lunar\Models\Order::class,
Lunar\Models\Product::class,
// Modules\Core\Catalog\Models\Product, not Lunar\Models\Product —
// both share the same underlying Meilisearch index name, so
// listing the base class here too would make every reindex
// (this default list is always merged in, even when a specific
// model is passed on the CLI — see Lunar\Console\Commands\
// ScoutIndexerCommand::handle()) run the base class's indexing a
// second time right after the subclass's, silently overwriting
// every document with one missing custom_fields/order_count
// (the whole reason Modules\Core\Catalog\Models\Product exists —
// see its own docblock). Caught in practice.
Modules\Core\Catalog\Models\Product::class,
Lunar\Models\ProductOption::class,
/*
@@ -46,11 +56,25 @@
'indexers' => [
Lunar\Models\Brand::class => Lunar\Search\BrandIndexer::class,
Lunar\Models\Collection::class => Lunar\Search\CollectionIndexer::class,
Lunar\Models\Collection::class => Modules\Core\Catalog\Services\CollectionIndexer::class,
Lunar\Models\Customer::class => Lunar\Search\CustomerIndexer::class,
Lunar\Models\Order::class => Lunar\Search\OrderIndexer::class,
Lunar\Models\Product::class => Modules\Core\Search\ProductIndexer::class,
Lunar\Models\ProductOption::class => Lunar\Search\ProductOptionIndexer::class,
// Lunar\Models\Product::class, NOT Modules\Core\Catalog\Models\
// Product::class — Lunar\Base\Traits\Searchable::indexer() (and
// getFilterableAttributes()/getSortableAttributes(), same trait)
// reads `$config[self::class]`, and `self::class` inside a TRAIT
// METHOD is a compile-time literal bound to whichever class first
// `use`s the trait — Lunar\Models\Product, since the subclass
// never re-declares indexer() itself — regardless of which
// instance actually calls the method at runtime. Keying this by
// the subclass here made the lookup miss entirely, silently
// falling back to Lunar\Search\ScoutIndexer's own near-empty
// filterable/sortable field list — confirmed live: it wiped every
// real filterable/sortable attribute the index had (including
// ones that already worked, like collection_ids), not just the
// new order_count one. Caught in practice, reverted.
Lunar\Models\Product::class => Modules\Core\Catalog\Services\ProductIndexer::class,
Lunar\Models\ProductOption::class => Lunar\Search\ProductOptionIndexer::class
],
];