diff --git a/app/Console/Commands/EmegrendelesCleanup.php b/app/Console/Commands/EmegrendelesCleanup.php new file mode 100644 index 0000000..304fea4 --- /dev/null +++ b/app/Console/Commands/EmegrendelesCleanup.php @@ -0,0 +1,162 @@ +argument('date'); + + if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $date)) { + $this->error('Érvénytelen dátum formátum. Használd az YYYY-MM-DD formátumot.'); + return 1; + } + + $dryRun = $this->option('dry-run'); + + // Számlálás + $ordersCount = Order::where('deliveryDate', '<', $date)->count(); + + $archiveQuery = OrderArchive::where('deliveryDate', '<', $date); + $archivesCount = $archiveQuery->count(); + + $itemsCount = OrderArchivesItem::whereIn('order_archive_id', function ($query) use ($date) { + $query->select('id')->from('order_archives')->where('deliveryDate', '<', $date); + })->count(); + + $attachmentsCount = Attachment::whereIn('attachable_id', function ($query) use ($date) { + $query->select('id')->from('order_archives')->where('deliveryDate', '<', $date); + })->where('attachable_type', OrderArchive::class)->count(); + + $this->info("Törlendő elemek száma ($date előtt):"); + $this->table( + ['Típus', 'Darabszám'], + [ + ['Megrendelések (orders)', $ordersCount], + ['Archivált megrendelések (order_archives)', $archivesCount], + ['Archivált tételek (order_archives_items)', $itemsCount], + ['Csatolt fájlok (attachments)', $attachmentsCount], + ] + ); + + // Első megmaradó megrendelés keresése + $firstRemainingOrder = Order::where('deliveryDate', '>=', $date) + ->orderBy('deliveryDate', 'asc') + ->orderBy('humanId', 'asc') + ->first(); + + $firstRemainingArchive = OrderArchive::where('deliveryDate', '>=', $date) + ->orderBy('deliveryDate', 'asc') + ->orderBy('humanId', 'asc') + ->first(); + + $firstRemaining = null; + if ($firstRemainingOrder && $firstRemainingArchive) { + if ($firstRemainingOrder->deliveryDate < $firstRemainingArchive->deliveryDate) { + $firstRemaining = $firstRemainingOrder; + } elseif ($firstRemainingOrder->deliveryDate > $firstRemainingArchive->deliveryDate) { + $firstRemaining = $firstRemainingArchive; + } else { + $firstRemaining = ($firstRemainingOrder->humanId <= $firstRemainingArchive->humanId) + ? $firstRemainingOrder + : $firstRemainingArchive; + } + } else { + $firstRemaining = $firstRemainingOrder ?: $firstRemainingArchive; + } + + if ($firstRemaining) { + $this->info("Az első megmaradó megrendelés:"); + $this->line("- Human ID: " . ($firstRemaining->humanId ?: 'N/A')); + $this->line("- Dátum: " . $firstRemaining->deliveryDate); + } else { + $this->warn("Nincs megmaradó megrendelés a megadott dátumtól kezdődően."); + } + + if ($dryRun) { + $this->info('Dry-run mód: nem történt törlés.'); + return 0; + } + + if ($ordersCount === 0 && $archivesCount === 0) { + $this->info('Nincs törlendő elem.'); + return 0; + } + + if (!$this->confirm('Biztosan törölni szeretnéd a megadott elemeket?')) { + $this->info('Művelet megszakítva.'); + return 0; + } + + $this->info('Törlés megkezdése...'); + + // Orders törlése + Order::where('deliveryDate', '<', $date)->delete(); + $this->info('Megrendelések törölve.'); + + // Archivált adatok törlése optimalizáltan + $this->info('Archivált adatok törlése...'); + $bar = $this->output->createProgressBar($archivesCount); + $bar->start(); + + OrderArchive::where('deliveryDate', '<', $date)->chunkById(1000, function ($archives) use ($bar) { + $archiveIds = $archives->pluck('id')->toArray(); + + // Kapcsolódó tételek törlése tömegesen + OrderArchivesItem::whereIn('order_archive_id', $archiveIds)->delete(); + + // Csatolmányok és fizikai fájlok kezelése + $attachments = Attachment::whereIn('attachable_id', $archiveIds) + ->where('attachable_type', OrderArchive::class) + ->get(); + + if ($attachments->isNotEmpty()) { + $filePaths = $attachments->map(function ($attachment) { + return $attachment->path . DIRECTORY_SEPARATOR . $attachment->filename; + })->toArray(); + + // Fizikai fájlok törlése a tárhelyről kötegelve + Storage::disk('attachments')->delete($filePaths); + + // Attachment rekordok törlése az adatbázisból + Attachment::whereIn('id', $attachments->pluck('id'))->delete(); + } + + // Maguk az archívum rekordok törlése tömegesen + OrderArchive::whereIn('id', $archiveIds)->delete(); + + $bar->advance($archives->count()); + }); + + $bar->finish(); + $this->info(""); + $this->info('Archivált megrendelések és kapcsolódó elemek törölve.'); + + return 0; + } +}