'clear-data', 'years' => $this->getAvailableYears(), ]); } public function stats(Request $request): JsonResponse { $year = (int) $request->input('year'); if ($year < 2020 || $year > 2100) { return response()->json(['error' => 'Некорректный год'], 422); } $stats = $this->collectStats($year); return response()->json([ 'year' => $year, 'stats' => $stats, 'total' => array_sum($stats), ]); } public function destroy(Request $request) { $year = (int) $request->input('year'); if ($year < 2020 || $year > 2100) { return redirect()->back()->with('danger', 'Некорректный год'); } ClearYearDataJob::dispatch($year, $request->user()->id); return redirect()->route('clear-data.index')->with('success', 'Удаление данных за ' . $year . ' год запущено. Вы получите уведомление о завершении.'); } private function getAvailableYears(): array { $years = []; $orderYears = Order::withoutGlobalScopes()->withTrashed() ->selectRaw('DISTINCT year') ->pluck('year') ->toArray(); $productYears = Product::withoutGlobalScopes()->withTrashed() ->selectRaw('DISTINCT year') ->pluck('year') ->toArray(); $mafOrderYears = MafOrder::withoutGlobalScopes()->withTrashed() ->selectRaw('DISTINCT year') ->pluck('year') ->toArray(); $contractYears = Contract::selectRaw('DISTINCT year') ->pluck('year') ->toArray(); $ttnYears = Ttn::selectRaw('DISTINCT year') ->pluck('year') ->toArray(); $years = array_unique(array_merge($orderYears, $productYears, $mafOrderYears, $contractYears, $ttnYears)); rsort($years); return $years; } private function collectStats(int $year): array { $orderIds = Order::withoutGlobalScopes()->withTrashed()->where('year', $year)->pluck('id'); $productIds = Product::withoutGlobalScopes()->withTrashed()->where('year', $year)->pluck('id'); $mafOrderIds = MafOrder::withoutGlobalScopes()->withTrashed()->where('year', $year)->pluck('id'); $productSkuIds = ProductSKU::withoutGlobalScopes()->withTrashed()->where('year', $year)->pluck('id'); $reclamationCount = Reclamation::whereIn('order_id', $orderIds)->count(); $fileIds = $this->collectFileIds($year, $orderIds, $productIds, $productSkuIds); return [ 'Заказы (Orders)' => $orderIds->count(), 'Заказы МАФ (MafOrders)' => $mafOrderIds->count(), 'Продукты (Products)' => $productIds->count(), 'SKU продуктов (ProductSKU)' => $productSkuIds->count(), 'Рекламации (Reclamations)' => $reclamationCount, 'Расписания (Schedules)' => Schedule::whereIn('order_id', $orderIds)->count(), 'ТТН (Ttns)' => Ttn::where('year', $year)->count(), 'Контракты (Contracts)' => Contract::where('year', $year)->count(), 'Файлы (Files)' => $fileIds->count(), ]; } private function collectFileIds(int $year, $orderIds, $productIds, $productSkuIds): \Illuminate\Support\Collection { $fileIds = collect(); $fileIds = $fileIds->merge( \DB::table('order_photo')->whereIn('order_id', $orderIds)->pluck('file_id') ); $fileIds = $fileIds->merge( \DB::table('order_document')->whereIn('order_id', $orderIds)->pluck('file_id') ); $fileIds = $fileIds->merge( \DB::table('order_statement')->whereIn('order_id', $orderIds)->pluck('file_id') ); $reclamationIds = Reclamation::whereIn('order_id', $orderIds)->pluck('id'); $fileIds = $fileIds->merge( \DB::table('reclamation_photo_before')->whereIn('reclamation_id', $reclamationIds)->pluck('file_id') ); $fileIds = $fileIds->merge( \DB::table('reclamation_photo_after')->whereIn('reclamation_id', $reclamationIds)->pluck('file_id') ); $fileIds = $fileIds->merge( \DB::table('reclamation_document')->whereIn('reclamation_id', $reclamationIds)->pluck('file_id') ); $fileIds = $fileIds->merge( \DB::table('reclamation_act')->whereIn('reclamation_id', $reclamationIds)->pluck('file_id') ); $fileIds = $fileIds->merge( Product::withoutGlobalScopes()->withTrashed() ->whereIn('id', $productIds) ->whereNotNull('certificate_id') ->pluck('certificate_id') ); $fileIds = $fileIds->merge( ProductSKU::withoutGlobalScopes()->withTrashed() ->whereIn('id', $productSkuIds) ->whereNotNull('passport_id') ->pluck('passport_id') ); $fileIds = $fileIds->merge( Ttn::where('year', $year)->whereNotNull('file_id')->pluck('file_id') ); return $fileIds->unique(); } }