| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- <?php
- namespace App\Http\Controllers;
- use App\Jobs\ClearYearDataJob;
- use App\Models\Contract;
- use App\Models\File;
- use App\Models\MafOrder;
- use App\Models\Order;
- use App\Models\Product;
- use App\Models\ProductSKU;
- use App\Models\Reclamation;
- use App\Models\Schedule;
- use App\Models\Ttn;
- use Illuminate\Http\JsonResponse;
- use Illuminate\Http\Request;
- use Illuminate\View\View;
- class ClearDataController extends Controller
- {
- public function index(): View
- {
- return view('clear-data.index', [
- 'active' => '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();
- }
- }
|