ソースを参照

export with filters

Alexander Musikhin 1 ヶ月 前
コミット
2d8ef6b0ae

+ 48 - 6
app/Http/Controllers/OrderController.php

@@ -29,8 +29,8 @@ use App\Services\FileService;
 use App\Services\NotificationService;
 use Illuminate\Http\RedirectResponse;
 use Illuminate\Http\Request;
-use Illuminate\Support\Str;
 use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Str;
 use Illuminate\Support\Facades\Storage;
 use Symfony\Component\HttpFoundation\BinaryFileResponse;
 use Throwable;
@@ -640,14 +640,56 @@ class OrderController extends Controller
 
     public function export(Request $request)
     {
+        $request->validate([
+            'withFilter' => 'nullable',
+            'filters' => 'nullable|array',
+            's' => 'nullable|string',
+        ]);
 
-        $schedules = Order::query()
-            ->get();
+        $orders = Order::query();
 
-        ExportOrdersJob::dispatch($schedules, $request->user()->id);
-        return redirect()->route('order.index')
-            ->with(['success' => 'Задача выгрузки создана!']);
+        if ($request->boolean('withFilter')) {
+            $filterRequest = new Request(array_filter([
+                'filters' => $request->input('filters', []),
+                's' => $request->input('s'),
+                'sortBy' => $request->input('sortBy'),
+                'order' => $request->input('order'),
+            ], static fn ($value) => $value !== null));
+
+            $model = new OrderView;
+            $this->createFilters($model, 'user_name', 'district_name', 'area_name', 'object_type_name', 'brigadier_name', 'order_status_name', 'ready_to_mount');
+            $this->createDateFilters($model, 'installation_date', 'ready_date');
+            $this->data['ranges'] = [];
+
+            $q = $model::query();
+            $this->acceptFilters($q, $filterRequest);
+            $this->acceptSearch($q, $filterRequest);
+            $this->setSortAndOrderBy($model, $filterRequest);
+
+            if (hasRole('brigadier')) {
+                $q->where('brigadier_id', auth()->id());
+            }
 
+            if (hasRole(Role::WAREHOUSE_HEAD)) {
+                $q->whereNotNull('brigadier_id');
+                $q->whereNotNull('installation_date');
+            }
+
+            $this->applyStableSorting($q);
+            $orderIds = $q->pluck('id');
+
+            $orders = Order::query()
+                ->whereIn('id', $orderIds)
+                ->get()
+                ->sortBy(static fn (Order $order) => $orderIds->search($order->id))
+                ->values();
+        } else {
+            $orders = $orders->get();
+        }
+
+        ExportOrdersJob::dispatch($orders, $request->user()->id);
+        return redirect()->route('order.index', session('gp_orders'))
+            ->with(['success' => 'Задача выгрузки создана!']);
     }
     public function exportOne(Order $order, Request $request)
     {

+ 9 - 5
app/Http/Controllers/ProductController.php

@@ -134,17 +134,21 @@ class ProductController extends Controller
         $request->validate([
             'withFilter'    => 'nullable',
             'filters'       => 'nullable|array',
+            's'             => 'nullable|string',
         ]);
 
-        // load and save file
-        $filters = ($request->withFilter) ? $request->filters ?? [] : [];
+        $filters = [];
+        if ($request->boolean('withFilter')) {
+            $filters = $request->filters ?? [];
+            if ($request->filled('s')) {
+                $filters['s'] = $request->string('s')->toString();
+            }
+        }
 
-        // dispatch job
         $filters['year'] = year();
-        ExportCatalog::dispatch($filters , $request->user()->id);
+        ExportCatalog::dispatch($filters, $request->user()->id);
         Log::info('ExportCatalog job created!');
 
-
         return redirect()->route('catalog.index', session('gp_products'))->with(['success' => 'Задача экспорта успешно создана!']);
     }
 

+ 12 - 2
app/Http/Controllers/ReclamationController.php

@@ -91,8 +91,18 @@ class ReclamationController extends Controller
 
     public function export(Request $request)
     {
-        $gp = session('gp_reclamations') ?? [];
-        $filterRequest = new Request($gp);
+        $request->validate([
+            'withFilter' => 'nullable',
+            'filters' => 'nullable|array',
+            's' => 'nullable|string',
+        ]);
+
+        $filterRequest = $request->boolean('withFilter')
+            ? new Request(array_filter([
+                'filters' => $request->input('filters', []),
+                's' => $request->input('s'),
+            ], static fn ($value) => $value !== null))
+            : new Request();
 
         $model = new ReclamationView();
         $this->createFilters($model, 'user_name', 'status_name');

+ 1 - 1
resources/views/catalog/index.blade.php

@@ -65,7 +65,7 @@
                         @include('partials.checkbox', ['title' => 'С учётом текущего фильтра и поиска', 'name' => 'withFilter', 'type' => 'checkbox', 'value' => 'yes', 'checked' => false])
                         <div class="d-none">
                             @if(request()->s)
-                                @include('partials.input', ['name' => 'filters[s]', 'title' => 'поиск', 'value' => request()->s])
+                                @include('partials.input', ['name' => 's', 'title' => 'поиск', 'value' => request()->s])
                             @endif
                             @if(request()->filters)
                                 @foreach(request()->filters as $filterName => $filterValue)

+ 37 - 6
resources/views/orders/index.blade.php

@@ -13,14 +13,9 @@
                 <a href="{{ route('order.create') }}" class="btn btn-sm btn-primary">Создать</a>
             @endif
             @if(hasRole('admin,manager'))
-                <a href="#" class="btn btn-sm btn-primary" onclick="$('#export-orders').submit()">Экспорт</a>
+                <button type="button" class="btn btn-sm btn-primary" data-bs-toggle="modal" data-bs-target="#exportOrdersModal">Экспорт</button>
             @endif
         </div>
-        @if(hasRole('admin,manager'))
-            <form class="d-none" method="post" action="{{ route('order.export') }}" id="export-orders">
-                @csrf
-            </form>
-        @endif
     </div>
     @include('partials.table', [
         'id'        => $id,
@@ -31,4 +26,40 @@
     ])
 
     @include('partials.pagination', ['items' => $orders])
+
+    @if(hasRole('admin,manager'))
+        <div class="modal fade" id="exportOrdersModal" tabindex="-1" aria-labelledby="exportOrdersModalLabel" aria-hidden="true">
+            <div class="modal-dialog modal-fullscreen-sm-down modal-lg">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <h1 class="modal-title fs-5" id="exportOrdersModalLabel">Экспорт площадок</h1>
+                        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
+                    </div>
+                    <div class="modal-body">
+                        <form action="{{ route('order.export') }}" method="post">
+                            @csrf
+                            @include('partials.checkbox', ['title' => 'С учётом текущего фильтра и поиска', 'name' => 'withFilter', 'type' => 'checkbox', 'value' => 'yes', 'checked' => false])
+                            <div class="d-none">
+                                @if(request()->s)
+                                    @include('partials.input', ['name' => 's', 'title' => 'поиск', 'value' => request()->s])
+                                @endif
+                                @if(request()->sortBy)
+                                    @include('partials.input', ['name' => 'sortBy', 'title' => 'sortBy', 'value' => request()->sortBy])
+                                @endif
+                                @if(request()->has('order'))
+                                    @include('partials.input', ['name' => 'order', 'title' => 'order', 'value' => request()->order])
+                                @endif
+                                @if(request()->filters)
+                                    @foreach(request()->filters as $filterName => $filterValue)
+                                        @include('partials.input', ['name' => 'filters[' . $filterName .']', 'title' => $filterName, 'value' => $filterValue])
+                                    @endforeach
+                                @endif
+                            </div>
+                            @include('partials.submit', ['name' => 'Экспорт'])
+                        </form>
+                    </div>
+                </div>
+            </div>
+        </div>
+    @endif
 @endsection

+ 28 - 4
resources/views/reclamations/index.blade.php

@@ -8,16 +8,40 @@
         </div>
         <div class="col-md-6 text-end">
             @if(hasRole('admin'))
-                <a href="#" class="btn btn-sm btn-primary" onclick="$('#export-reclamations').submit()">Экспорт</a>
+                <button type="button" class="btn btn-sm btn-primary" data-bs-toggle="modal" data-bs-target="#exportReclamationsModal">Экспорт</button>
             @endif
 
         </div>
     </div>
 
     @if(hasRole('admin'))
-        <form class="d-none" method="post" action="{{ route('reclamations.export') }}" id="export-reclamations">
-            @csrf
-        </form>
+        <div class="modal fade" id="exportReclamationsModal" tabindex="-1" aria-labelledby="exportReclamationsModalLabel" aria-hidden="true">
+            <div class="modal-dialog modal-fullscreen-sm-down modal-lg">
+                <div class="modal-content">
+                    <div class="modal-header">
+                        <h1 class="modal-title fs-5" id="exportReclamationsModalLabel">Экспорт рекламаций</h1>
+                        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
+                    </div>
+                    <div class="modal-body">
+                        <form method="post" action="{{ route('reclamations.export') }}">
+                            @csrf
+                            @include('partials.checkbox', ['title' => 'С учётом текущего фильтра и поиска', 'name' => 'withFilter', 'type' => 'checkbox', 'value' => 'yes', 'checked' => false])
+                            <div class="d-none">
+                                @if(request()->s)
+                                    @include('partials.input', ['name' => 's', 'title' => 'поиск', 'value' => request()->s])
+                                @endif
+                                @if(request()->filters)
+                                    @foreach(request()->filters as $filterName => $filterValue)
+                                        @include('partials.input', ['name' => 'filters[' . $filterName .']', 'title' => $filterName, 'value' => $filterValue])
+                                    @endforeach
+                                @endif
+                            </div>
+                            @include('partials.submit', ['name' => 'Экспорт'])
+                        </form>
+                    </div>
+                </div>
+            </div>
+        </div>
     @endif
 
     @include('partials.table', [