155 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			PHP
		
	
	
<?php
 | 
						|
 | 
						|
namespace App\Console\Commands;
 | 
						|
 | 
						|
use Illuminate\Console\Command;
 | 
						|
use App\Services\PerizinanApiService;
 | 
						|
use Illuminate\Support\Facades\Log;
 | 
						|
use Carbon\Carbon;
 | 
						|
 | 
						|
class SyncPerizinanData extends Command
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * The name and signature of the console command.
 | 
						|
     *
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    protected $signature = 'perizinan:sync {kategori?} {--fastest : Include fastest permohonan data sync} {--terakhir-terbit : Include terakhir terbit data sync} {--all : Include all data types (fastest + terakhir terbit)}';
 | 
						|
 | 
						|
    /**
 | 
						|
     * The console command description.
 | 
						|
     *
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    protected $description = 'Sync perizinan data from API to database (status, fastest permohonan, and terakhir terbit)';
 | 
						|
 | 
						|
    /**
 | 
						|
     * Execute the console command.
 | 
						|
     */
 | 
						|
    public function handle()
 | 
						|
    {
 | 
						|
        $startTime = Carbon::now();
 | 
						|
        $kategori = $this->argument('kategori');
 | 
						|
        $includeFastest = $this->option('fastest');
 | 
						|
        $includeTerakhirTerbit = $this->option('terakhir-terbit');
 | 
						|
        $includeAll = $this->option('all');
 | 
						|
 | 
						|
        // If --all is specified, include both fastest and terakhir terbit
 | 
						|
        if ($includeAll) {
 | 
						|
            $includeFastest = true;
 | 
						|
            $includeTerakhirTerbit = true;
 | 
						|
        }
 | 
						|
 | 
						|
        Log::info('Starting perizinan data sync', [
 | 
						|
            'kategori' => $kategori,
 | 
						|
            'include_fastest' => $includeFastest,
 | 
						|
            'include_terakhir_terbit' => $includeTerakhirTerbit,
 | 
						|
            'start_time' => $startTime->format('Y-m-d H:i:s')
 | 
						|
        ]);
 | 
						|
 | 
						|
        $this->info('🚀 Starting perizinan data synchronization...');
 | 
						|
        if ($includeFastest) {
 | 
						|
            $this->info('⚡ Including fastest permohonan data sync');
 | 
						|
        }
 | 
						|
        if ($includeTerakhirTerbit) {
 | 
						|
            $this->info('📋 Including terakhir terbit data sync');
 | 
						|
        }
 | 
						|
 | 
						|
        $service = new PerizinanApiService();
 | 
						|
 | 
						|
        try {
 | 
						|
            if ($kategori) {
 | 
						|
                // Sync specific category
 | 
						|
                $this->info("📥 Syncing status data for kategori: {$kategori}");
 | 
						|
                $statusResult = $service->syncToDatabase($kategori);
 | 
						|
 | 
						|
                if ($statusResult) {
 | 
						|
                    $this->info("✅ Successfully synced status data for kategori: {$kategori}");
 | 
						|
                } else {
 | 
						|
                    $this->error("❌ Failed to sync status data for kategori: {$kategori}");
 | 
						|
                }
 | 
						|
 | 
						|
                // Sync fastest data if requested
 | 
						|
                if ($includeFastest) {
 | 
						|
                    $this->info("⚡ Syncing fastest permohonan data for kategori: {$kategori}");
 | 
						|
                    $fastestResult = $service->syncFastestDataToDatabase($kategori, 5);
 | 
						|
 | 
						|
                    if ($fastestResult) {
 | 
						|
                        $this->info("✅ Successfully synced fastest data for kategori: {$kategori}");
 | 
						|
                    } else {
 | 
						|
                        $this->error("❌ Failed to sync fastest data for kategori: {$kategori}");
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                // Sync terakhir terbit data if requested
 | 
						|
                if ($includeTerakhirTerbit) {
 | 
						|
                    $this->info("📋 Syncing terakhir terbit data for kategori: {$kategori}");
 | 
						|
                    $terakhirTerbitResult = $service->syncTerakhirTerbitToDatabase($kategori, 5);
 | 
						|
 | 
						|
                    if ($terakhirTerbitResult) {
 | 
						|
                        $this->info("✅ Successfully synced terakhir terbit data for kategori: {$kategori}");
 | 
						|
                    } else {
 | 
						|
                        $this->error("❌ Failed to sync terakhir terbit data for kategori: {$kategori}");
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            } else {
 | 
						|
                // Sync all categories
 | 
						|
                $this->info("📥 Syncing data for all categories...");
 | 
						|
                $results = $service->syncAllCategories($includeFastest, $includeTerakhirTerbit);
 | 
						|
 | 
						|
                foreach ($results as $cat => $result) {
 | 
						|
                    if (isset($result['status']) && $result['status']) {
 | 
						|
                        $this->info("✅ Successfully synced status data for kategori: {$cat}");
 | 
						|
                    } else {
 | 
						|
                        $this->error("❌ Failed to sync status data for kategori: {$cat}");
 | 
						|
                    }
 | 
						|
 | 
						|
                    if ($includeFastest) {
 | 
						|
                        if (isset($result['fastest']) && $result['fastest']) {
 | 
						|
                            $this->info("✅ Successfully synced fastest data for kategori: {$cat}");
 | 
						|
                        } else {
 | 
						|
                            $this->error("❌ Failed to sync fastest data for kategori: {$cat}");
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
 | 
						|
                    if ($includeTerakhirTerbit) {
 | 
						|
                        if (isset($result['terakhir_terbit']) && $result['terakhir_terbit']) {
 | 
						|
                            $this->info("✅ Successfully synced terakhir terbit data for kategori: {$cat}");
 | 
						|
                        } else {
 | 
						|
                            $this->error("❌ Failed to sync terakhir terbit data for kategori: {$cat}");
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            $endTime = Carbon::now();
 | 
						|
            $duration = $endTime->diffInSeconds($startTime);
 | 
						|
 | 
						|
            $this->info("🎉 Data synchronization completed in {$duration} seconds");
 | 
						|
 | 
						|
            Log::info('Perizinan data sync completed', [
 | 
						|
                'kategori' => $kategori ?: 'all',
 | 
						|
                'include_fastest' => $includeFastest,
 | 
						|
                'include_terakhir_terbit' => $includeTerakhirTerbit,
 | 
						|
                'duration_seconds' => $duration,
 | 
						|
                'end_time' => $endTime->format('Y-m-d H:i:s')
 | 
						|
            ]);
 | 
						|
 | 
						|
        } catch (\Exception $e) {
 | 
						|
            $this->error("💥 An error occurred: " . $e->getMessage());
 | 
						|
 | 
						|
            Log::error('Perizinan data sync failed', [
 | 
						|
                'kategori' => $kategori ?: 'all',
 | 
						|
                'include_fastest' => $includeFastest,
 | 
						|
                'include_terakhir_terbit' => $includeTerakhirTerbit,
 | 
						|
                'error' => $e->getMessage(),
 | 
						|
                'trace' => $e->getTraceAsString()
 | 
						|
            ]);
 | 
						|
 | 
						|
            return 1;
 | 
						|
        }
 | 
						|
 | 
						|
        return 0;
 | 
						|
    }
 | 
						|
}
 |