359 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			359 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
<?php
 | 
						|
 | 
						|
namespace App\Services;
 | 
						|
 | 
						|
use Illuminate\Support\Facades\Http;
 | 
						|
use Illuminate\Support\Facades\Log;
 | 
						|
use App\Models\PerizinanStatus;
 | 
						|
use App\Models\FastestPermohonan;
 | 
						|
use App\Models\TerakhirTerbit;
 | 
						|
use Carbon\Carbon;
 | 
						|
 | 
						|
class PerizinanApiService
 | 
						|
{
 | 
						|
    private $baseUrl;
 | 
						|
    private $bearerToken;
 | 
						|
    private $apiKey;
 | 
						|
 | 
						|
    public function __construct()
 | 
						|
    {
 | 
						|
        $this->baseUrl = config('services.perizinan.base_url', 'https://wsdev.jakarta.go.id/gateway/DataPerizinanLingkungan/1.0');
 | 
						|
        $this->bearerToken = config('services.perizinan.bearer_token');
 | 
						|
        $this->apiKey = config('services.perizinan.api_key');
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Fetch summary by status from API
 | 
						|
     */
 | 
						|
    public function fetchSummaryByStatus($kategori)
 | 
						|
    {
 | 
						|
        try {
 | 
						|
            $url = "{$this->baseUrl}/summary_by_status";
 | 
						|
 | 
						|
            Log::info("Fetching data from API", [
 | 
						|
                'url' => $url,
 | 
						|
                'kategori' => $kategori
 | 
						|
            ]);
 | 
						|
 | 
						|
            $response = Http::timeout(60) // Increase timeout to 60 seconds
 | 
						|
                ->retry(3, 100) // Retry 3 times with 100ms delay
 | 
						|
                ->withHeaders([
 | 
						|
                    'Authorization' => 'Bearer ' . $this->bearerToken,
 | 
						|
                    'x-Gateway-APIKey' => $this->apiKey,
 | 
						|
                    'Accept' => 'application/json',
 | 
						|
                    'Content-Type' => 'application/json'
 | 
						|
                ])->get($url, [
 | 
						|
                    'kategori' => $kategori
 | 
						|
                ]);
 | 
						|
 | 
						|
            if ($response->successful()) {
 | 
						|
                $data = $response->json();
 | 
						|
 | 
						|
                Log::info("API Response received", [
 | 
						|
                    'kategori' => $kategori,
 | 
						|
                    'success' => $data['success'] ?? false,
 | 
						|
                    'data_count' => count($data['data'] ?? [])
 | 
						|
                ]);
 | 
						|
 | 
						|
                return $data;
 | 
						|
            } else {
 | 
						|
                Log::error("API request failed", [
 | 
						|
                    'kategori' => $kategori,
 | 
						|
                    'status' => $response->status(),
 | 
						|
                    'body' => $response->body()
 | 
						|
                ]);
 | 
						|
 | 
						|
                return null;
 | 
						|
            }
 | 
						|
        } catch (\Exception $e) {
 | 
						|
            Log::error("Exception occurred while fetching API data", [
 | 
						|
                'kategori' => $kategori,
 | 
						|
                'error' => $e->getMessage(),
 | 
						|
                'trace' => $e->getTraceAsString()
 | 
						|
            ]);
 | 
						|
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Sync data to database
 | 
						|
     */
 | 
						|
    public function syncToDatabase($kategori)
 | 
						|
    {
 | 
						|
        $apiData = $this->fetchSummaryByStatus($kategori);
 | 
						|
 | 
						|
        if (!$apiData || !($apiData['success'] ?? false)) {
 | 
						|
            Log::warning("Failed to fetch data for kategori: {$kategori}");
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        $syncDate = Carbon::today();
 | 
						|
        $apiLastUpdated = Carbon::parse($apiData['last_updated']);
 | 
						|
        $syncedCount = 0;
 | 
						|
 | 
						|
        foreach ($apiData['data'] as $item) {
 | 
						|
            // Check if data already exists for today
 | 
						|
            $exists = PerizinanStatus::where('kategori', $kategori)
 | 
						|
                ->where('status_id', $item['id'])
 | 
						|
                ->whereDate('sync_date', $syncDate)
 | 
						|
                ->exists();
 | 
						|
 | 
						|
            if (!$exists) {
 | 
						|
                PerizinanStatus::create([
 | 
						|
                    'kategori' => $kategori,
 | 
						|
                    'status_id' => $item['id'],
 | 
						|
                    'label' => $item['label'],
 | 
						|
                    'value' => $item['value'],
 | 
						|
                    'api_last_updated' => $apiLastUpdated,
 | 
						|
                    'sync_date' => $syncDate
 | 
						|
                ]);
 | 
						|
 | 
						|
                $syncedCount++;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        Log::info("Data synced successfully", [
 | 
						|
            'kategori' => $kategori,
 | 
						|
            'synced_count' => $syncedCount,
 | 
						|
            'sync_date' => $syncDate->format('Y-m-d'),
 | 
						|
            'api_last_updated' => $apiLastUpdated->format('Y-m-d H:i:s')
 | 
						|
        ]);
 | 
						|
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Fetch fastest permohonan from API
 | 
						|
     */
 | 
						|
    public function fetchFastestPermohonan($kategori, $limit = 5)
 | 
						|
    {
 | 
						|
        try {
 | 
						|
            $url = "{$this->baseUrl}/fastest_permohonan";
 | 
						|
 | 
						|
            Log::info("Fetching fastest permohonan data from API", [
 | 
						|
                'url' => $url,
 | 
						|
                'kategori' => $kategori,
 | 
						|
                'limit' => $limit
 | 
						|
            ]);
 | 
						|
 | 
						|
            $response = Http::timeout(60) // Increase timeout to 60 seconds
 | 
						|
                ->retry(3, 100) // Retry 3 times with 100ms delay
 | 
						|
                ->withHeaders([
 | 
						|
                    'Authorization' => 'Bearer ' . $this->bearerToken,
 | 
						|
                    'x-Gateway-APIKey' => $this->apiKey,
 | 
						|
                    'Accept' => 'application/json',
 | 
						|
                    'Content-Type' => 'application/json'
 | 
						|
                ])->get($url, [
 | 
						|
                    'kategori' => $kategori,
 | 
						|
                    'limit' => $limit
 | 
						|
                ]);
 | 
						|
 | 
						|
            if ($response->successful()) {
 | 
						|
                $data = $response->json();
 | 
						|
 | 
						|
                Log::info("Fastest permohonan API Response received", [
 | 
						|
                    'kategori' => $kategori,
 | 
						|
                    'limit' => $limit,
 | 
						|
                    'success' => $data['success'] ?? false,
 | 
						|
                    'data_count' => count($data['data'] ?? [])
 | 
						|
                ]);
 | 
						|
 | 
						|
                return $data;
 | 
						|
            } else {
 | 
						|
                Log::error("Fastest permohonan API request failed", [
 | 
						|
                    'kategori' => $kategori,
 | 
						|
                    'limit' => $limit,
 | 
						|
                    'status' => $response->status(),
 | 
						|
                    'body' => $response->body()
 | 
						|
                ]);
 | 
						|
 | 
						|
                return null;
 | 
						|
            }
 | 
						|
        } catch (\Exception $e) {
 | 
						|
            Log::error("Exception occurred while fetching fastest permohonan data", [
 | 
						|
                'kategori' => $kategori,
 | 
						|
                'limit' => $limit,
 | 
						|
                'error' => $e->getMessage(),
 | 
						|
                'trace' => $e->getTraceAsString()
 | 
						|
            ]);
 | 
						|
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Sync fastest permohonan data to database
 | 
						|
     */
 | 
						|
    public function syncFastestDataToDatabase($kategori, $limit = 5)
 | 
						|
    {
 | 
						|
        $apiData = $this->fetchFastestPermohonan($kategori, $limit);
 | 
						|
 | 
						|
        if (!$apiData || !($apiData['success'] ?? false)) {
 | 
						|
            Log::warning("Failed to fetch fastest permohonan data for kategori: {$kategori}");
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        $syncDate = Carbon::today();
 | 
						|
        $apiLastUpdated = Carbon::parse($apiData['last_updated']);
 | 
						|
        $syncedCount = 0;
 | 
						|
 | 
						|
        // Delete existing data for today to ensure we have fresh data
 | 
						|
        FastestPermohonan::where('kategori', $kategori)
 | 
						|
            ->whereDate('sync_date', $syncDate)
 | 
						|
            ->delete();
 | 
						|
 | 
						|
        foreach ($apiData['data'] as $index => $item) {
 | 
						|
            FastestPermohonan::create([
 | 
						|
                'kategori' => $kategori,
 | 
						|
                'nama' => $item['nama'],
 | 
						|
                'total' => $item['total'],
 | 
						|
                'durasi_pemohon' => $item['durasi_pemohon'],
 | 
						|
                'durasi_petugas' => $item['durasi_petugas'],
 | 
						|
                'api_last_updated' => $apiLastUpdated,
 | 
						|
                'sync_date' => $syncDate
 | 
						|
            ]);
 | 
						|
 | 
						|
            $syncedCount++;
 | 
						|
        }
 | 
						|
 | 
						|
        Log::info("Fastest permohonan data synced successfully", [
 | 
						|
            'kategori' => $kategori,
 | 
						|
            'synced_count' => $syncedCount,
 | 
						|
            'sync_date' => $syncDate->format('Y-m-d'),
 | 
						|
            'api_last_updated' => $apiLastUpdated->format('Y-m-d H:i:s')
 | 
						|
        ]);
 | 
						|
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Fetch terakhir terbit from API
 | 
						|
     */
 | 
						|
    public function fetchTerakhirTerbit($kategori, $limit = 5)
 | 
						|
    {
 | 
						|
        try {
 | 
						|
            $url = "{$this->baseUrl}/terakhir_terbit";
 | 
						|
 | 
						|
            Log::info("Fetching terakhir terbit data from API", [
 | 
						|
                'url' => $url,
 | 
						|
                'kategori' => $kategori,
 | 
						|
                'limit' => $limit
 | 
						|
            ]);
 | 
						|
 | 
						|
            $response = Http::timeout(60) // Increase timeout to 60 seconds
 | 
						|
                ->retry(3, 100) // Retry 3 times with 100ms delay
 | 
						|
                ->withHeaders([
 | 
						|
                    'Authorization' => 'Bearer ' . $this->bearerToken,
 | 
						|
                    'x-Gateway-APIKey' => $this->apiKey,
 | 
						|
                    'Accept' => 'application/json',
 | 
						|
                    'Content-Type' => 'application/json'
 | 
						|
                ])->get($url, [
 | 
						|
                    'kategori' => $kategori,
 | 
						|
                    'limit' => $limit
 | 
						|
                ]);
 | 
						|
 | 
						|
            if ($response->successful()) {
 | 
						|
                $data = $response->json();
 | 
						|
 | 
						|
                Log::info("Terakhir terbit API Response received", [
 | 
						|
                    'kategori' => $kategori,
 | 
						|
                    'limit' => $limit,
 | 
						|
                    'success' => $data['success'] ?? false,
 | 
						|
                    'data_count' => count($data['data'] ?? [])
 | 
						|
                ]);
 | 
						|
 | 
						|
                return $data;
 | 
						|
            } else {
 | 
						|
                Log::error("Terakhir terbit API request failed", [
 | 
						|
                    'kategori' => $kategori,
 | 
						|
                    'limit' => $limit,
 | 
						|
                    'status' => $response->status(),
 | 
						|
                    'body' => $response->body()
 | 
						|
                ]);
 | 
						|
 | 
						|
                return null;
 | 
						|
            }
 | 
						|
        } catch (\Exception $e) {
 | 
						|
            Log::error("Exception occurred while fetching terakhir terbit data", [
 | 
						|
                'kategori' => $kategori,
 | 
						|
                'limit' => $limit,
 | 
						|
                'error' => $e->getMessage(),
 | 
						|
                'trace' => $e->getTraceAsString()
 | 
						|
            ]);
 | 
						|
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Sync terakhir terbit data to database
 | 
						|
     */
 | 
						|
    public function syncTerakhirTerbitToDatabase($kategori, $limit = 5)
 | 
						|
    {
 | 
						|
        $apiData = $this->fetchTerakhirTerbit($kategori, $limit);
 | 
						|
 | 
						|
        if (!$apiData || !($apiData['success'] ?? false)) {
 | 
						|
            Log::warning("Failed to fetch terakhir terbit data for kategori: {$kategori}");
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        $syncDate = Carbon::today();
 | 
						|
        $apiLastUpdated = Carbon::parse($apiData['last_updated']);
 | 
						|
        $syncedCount = 0;
 | 
						|
 | 
						|
        // Delete existing data for today to ensure we have fresh ranking
 | 
						|
        TerakhirTerbit::where('kategori', $kategori)
 | 
						|
            ->whereDate('sync_date', $syncDate)
 | 
						|
            ->delete();
 | 
						|
 | 
						|
        foreach ($apiData['data'] as $index => $item) {
 | 
						|
            TerakhirTerbit::create([
 | 
						|
                'kategori' => $kategori,
 | 
						|
                'nama_izin' => $item['nama_izin'],
 | 
						|
                'pemohon' => $item['pemohon'],
 | 
						|
                'tanggal_terbit' => Carbon::parse($item['tanggal_terbit']),
 | 
						|
                'api_last_updated' => $apiLastUpdated,
 | 
						|
                'sync_date' => $syncDate
 | 
						|
            ]);
 | 
						|
 | 
						|
            $syncedCount++;
 | 
						|
        }
 | 
						|
 | 
						|
        Log::info("Terakhir terbit data synced successfully", [
 | 
						|
            'kategori' => $kategori,
 | 
						|
            'synced_count' => $syncedCount,
 | 
						|
            'sync_date' => $syncDate->format('Y-m-d'),
 | 
						|
            'api_last_updated' => $apiLastUpdated->format('Y-m-d H:i:s')
 | 
						|
        ]);
 | 
						|
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Sync all categories
 | 
						|
     */
 | 
						|
    public function syncAllCategories($includeFastest = true, $includeTerakhirTerbit = true)
 | 
						|
    {
 | 
						|
        $categories = ['pertek', 'amdal'];
 | 
						|
        $results = [];
 | 
						|
 | 
						|
        foreach ($categories as $kategori) {
 | 
						|
            // Sync status data
 | 
						|
            $results[$kategori]['status'] = $this->syncToDatabase($kategori);
 | 
						|
 | 
						|
            // Sync fastest data if requested
 | 
						|
            if ($includeFastest) {
 | 
						|
                $results[$kategori]['fastest'] = $this->syncFastestDataToDatabase($kategori, 5);
 | 
						|
            }
 | 
						|
 | 
						|
            // Sync terakhir terbit data if requested
 | 
						|
            if ($includeTerakhirTerbit) {
 | 
						|
                $results[$kategori]['terakhir_terbit'] = $this->syncTerakhirTerbitToDatabase($kategori, 5);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        return $results;
 | 
						|
    }
 | 
						|
}
 |