Forráskód Böngészése

fix filter for dates

Alexander Musikhin 3 napja
szülő
commit
d30f7725f8

+ 3 - 0
app/Http/Controllers/FilterController.php

@@ -293,6 +293,9 @@ class FilterController extends Controller
     {
         $values = match ($column) {
             'order_number', 'note' => StockOrder::query()->pluck($column),
+            'created_at' => StockOrder::query()
+                ->selectRaw('DATE(created_at) as filter_date')
+                ->pluck('filter_date'),
             'item_article' => StockOrder::query()
                 ->join('common_catalog_items', 'common_catalog_items.id', '=', 'stock_orders.common_catalog_item_id')
                 ->pluck('common_catalog_items.article'),

+ 10 - 1
app/Http/Controllers/StockOrderController.php

@@ -114,7 +114,7 @@ class StockOrderController extends Controller
                 'reserved_quantity' => ['type' => 'ranges'],
                 'free_quantity' => ['type' => 'ranges'],
                 'note' => [],
-                'created_at' => ['type' => 'dates'],
+                'created_at' => [],
             ],
         ]);
     }
@@ -229,6 +229,15 @@ class StockOrderController extends Controller
             $query->whereIn('status', array_values($statusCodes));
         }
 
+        $createdDates = array_values(array_diff($this->filterValues($request, 'created_at'), ['-пусто-']));
+        if ($createdDates !== []) {
+            $query->where(function (Builder $query) use ($createdDates): void {
+                foreach ($createdDates as $createdDate) {
+                    $query->orWhereDate('stock_orders.created_at', $createdDate);
+                }
+            });
+        }
+
         $this->applyColumnRange($query, $request, 'ordered_quantity');
         $this->applySubqueryRange($query, $request, 'reserved_quantity', $this->reservedQuantitySubquery());
         $this->applySubqueryRange($query, $request, 'free_quantity', $this->freeQuantitySubquery());

+ 2 - 2
resources/views/partials/table.blade.php

@@ -57,10 +57,10 @@
                                 if (isset($filters[$headerName])) {
                                     $type = 'filters';
                                 } elseif (isset($ranges[$headerName])) {
-                                    // Для dropdown фильтров вместо диапазона используем список всех вариантов
+                                    // В фильтрах заголовка всегда показываем список фактических значений.
                                     $type = 'filters';
                                 } elseif (isset($dates[$headerName])) {
-                                    $type = 'dates';
+                                    $type = 'filters';
                                 }
                             @endphp
                             <div class="text-end cursor-pointer dropdown" data-bs-auto-close="outside" aria-expanded="false">

+ 22 - 0
tests/Feature/OrderControllerTest.php

@@ -76,6 +76,28 @@ class OrderControllerTest extends TestCase
         $response->assertSee($order->object_address);
     }
 
+    public function test_order_date_column_filter_uses_distinct_values_instead_of_a_range(): void
+    {
+        Order::factory()->create(['installation_date' => '2026-09-10']);
+        Order::factory()->create(['installation_date' => '2026-09-12']);
+
+        $response = $this->actingAs($this->managerUser)
+            ->get(route('order.index'));
+
+        $response->assertOk()
+            ->assertSee('id="filter-list-installation_date"', false)
+            ->assertDontSee('id="range_from_installation_date"', false);
+
+        $this->actingAs($this->managerUser)
+            ->getJson(route('getFilters', [
+                'table' => 'orders',
+                'column' => 'installation_date',
+            ]))
+            ->assertOk()
+            ->assertJsonFragment(['2026-09-10'])
+            ->assertJsonFragment(['2026-09-12']);
+    }
+
     public function test_orders_index_displays_products_total_column_value(): void
     {
         $order = Order::factory()->create([

+ 17 - 0
tests/Feature/StockControllerTest.php

@@ -170,6 +170,15 @@ class StockControllerTest extends TestCase
             ->assertOk()
             ->assertViewHas('orders', fn ($orders): bool => $orders->pluck('order_number')->all() === ['ORDER-B']);
 
+        $this->actingAs($this->admin)
+            ->get(route('stock.orders', [
+                'filters' => ['created_at' => '2026-02-10'],
+            ]))
+            ->assertOk()
+            ->assertViewHas('orders', fn ($orders): bool => $orders->pluck('order_number')->all() === ['ORDER-B'])
+            ->assertSee('id="filter-list-created_at"', false)
+            ->assertDontSee('id="range_from_created_at"', false);
+
         $this->actingAs($this->admin)
             ->get(route('stock.orders', [
                 'filters' => ['reserved_quantity_from' => 1, 'free_quantity_from' => 3],
@@ -195,6 +204,14 @@ class StockControllerTest extends TestCase
             ]))
             ->assertOk()
             ->assertExactJson(['Заказан', 'На складе']);
+
+        $this->actingAs($this->admin)
+            ->getJson(route('getFilters', [
+                'table' => 'stock_orders',
+                'column' => 'created_at',
+            ]))
+            ->assertOk()
+            ->assertExactJson(['2026-01-10', '2026-02-10']);
     }
 
     public function test_admin_can_create_order_linked_to_common_catalog(): void