DEV Community

Eko Priyanto
Eko Priyanto

Posted on

Grab JDIHN berdasarkan jenis dokumen

Grab JDIHN berdasarkan jenis dokumen.


<?php

/**
 * Skrip interaktif untuk mengambil data dari API jdihn.go.id
 * dan mengonversinya menjadi file CSV.
 * Pengguna dapat memilih jenis dokumen dari daftar yang tersedia.
 */

// Non-aktifkan waktu eksekusi maksimum PHP, karena prosesnya bisa memakan waktu.
// Hapus baris ini jika Anda berada di lingkungan hosting yang membatasi fungsi ini.
set_time_limit(0);

// --- Langkah 0: Tampilkan daftar jenis dokumen dan minta input dari pengguna ---

// Data JSON yang berisi daftar jenis dokumen
 $jenisDokumenJson = '[
    {"id":4,"name":"MONOGRAFI HUKUM"},
    {"id":5,"name":"ARTIKEL HUKUM"},
    {"id":7,"name":"UNDANG-UNDANG DASAR"},
    {"id":8,"name":"KETETAPAN MPR"},
    {"id":9,"name":"UNDANG-UNDANG"},
    {"id":10,"name":"PERATURAN PEMERINTAH PENGGANTI UNDANG-UNDANG"},
    {"id":11,"name":"PERATURAN PEMERINTAH"},
    {"id":12,"name":"PERATURAN PRESIDEN"},
    {"id":13,"name":"KEPUTUSAN PRESIDEN"},
    {"id":14,"name":"INSTRUKSI PRESIDEN"},
    {"id":15,"name":"PENETAPAN PRESIDEN"},
    {"id":16,"name":"UNDANG-UNDANG DARURAT"},
    {"id":17,"name":"PENGATURAN PENGUASA PERANG TERTINGGI"},
    {"id":27,"name":"PERATURAN KEMENTERIAN"},
    {"id":28,"name":"PERATURAN BERSAMA"},
    {"id":29,"name":"KEPUTUSAN KEMENTERIAN"},
    {"id":30,"name":"KEPUTUSAN BERSAMA"},
    {"id":31,"name":"INSTRUKSI KEMENTERIAN"},
    {"id":33,"name":"SURAT EDARAN KEMENTERIAN"},
    {"id":34,"name":"PERATURAN ESELON 1"},
    {"id":35,"name":"KEPUTUSAN ESELON 1"},
    {"id":36,"name":"PERATURAN LEMBAGA NEGARA"},
    {"id":42,"name":"PERATURAN BPK"},
    {"id":44,"name":"KEPUTUSAN LEMBAGA NEGARA"},
    {"id":45,"name":"PERATURAN LEMBAGA PEMERINTAH NON KEMENTERIAN"},
    {"id":47,"name":"PERATURAN KEPALA"},
    {"id":48,"name":"KEPUTUSAN LEMBAGA PEMERINTAH NON KEMENTERIAN"},
    {"id":49,"name":"PERATURAN LEMBAGA NON STRUKTURAL"},
    {"id":56,"name":"KEPUTUSAN LEMBAGA NON STRUKTURAL"},
    {"id":57,"name":"PERATURAN DAERAH PROVINSI"},
    {"id":58,"name":"PERATURAN DAERAH KABUPATEN"},
    {"id":59,"name":"PERATURAN DAERAH KOTA"},
    {"id":60,"name":"PERATURAN DPRD PROVINSI"},
    {"id":61,"name":"PERATURAN DPRD KABUPATEN"},
    {"id":62,"name":"PERATURAN DPRD KOTA"},
    {"id":63,"name":"PERATURAN GUBERNUR"},
    {"id":64,"name":"PERATURAN BUPATI"},
    {"id":65,"name":"PERATURAN WALIKOTA"},
    {"id":67,"name":"PERATURAN DESA"},
    {"id":68,"name":"KEPUTUSAN GUBERNUR"},
    {"id":69,"name":"KEPUTUSAN BUPATI"},
    {"id":70,"name":"KEPUTUSAN WALIKOTA"},
    {"id":71,"name":"KEPUTUSAN DPRD"},
    {"id":72,"name":"INSTRUKSI GUBERNUR"},
    {"id":73,"name":"INSTRUKSI BUPATI"},
    {"id":74,"name":"INSTRUKSI WALIKOTA"},
    {"id":75,"name":"SURAT EDARAN PEMERINTAH DAERAH"},
    {"id":76,"name":"STAATSBLAD"},
    {"id":77,"name":"BUKU HUKUM"},
    {"id":78,"name":"NASKAH AKADEMIK KEMENKUMHAM"},
    {"id":79,"name":"NASKAH AKADEMIK"},
    {"id":80,"name":"PENELITIAN HUKUM DAN HAM"},
    {"id":81,"name":"PENGKAJIAN HUKUM"},
    {"id":83,"name":"PENULISAN KARYA ILMIAH"},
    {"id":84,"name":"KOMPENDIUM HUKUM"},
    {"id":85,"name":"ANALISIS DAN EVALUASI"},
    {"id":86,"name":"MAJALAH HUKUM NASIONAL"},
    {"id":87,"name":"MAJALAH HUKUM"},
    {"id":89,"name":"KLIPING MAJALAH KORAN"},
    {"id":90,"name":"JURNAL HUKUM"},
    {"id":91,"name":"YURISPRUDENSI"},
    {"id":92,"name":"PUTUSAN MAHKAMAH AGUNG"},
    {"id":93,"name":"PUTUSAN MAHKAMAH KONSTITUSI"},
    {"id":94,"name":"RANCANGAN"},
    {"id":95,"name":"RANCANGAN PERATURAN DAERAH"},
    {"id":96,"name":"RANCANGAN PERATURAN DAERAH PROVINSI"},
    {"id":97,"name":"RANCANGAN PERATURAN DAERAH KABUPATEN"},
    {"id":98,"name":"RANCANGAN PERATURAN DAERAH KOTA"},
    {"id":100,"name":"RANCANGAN PERATURAN BUPATI"},
    {"id":103,"name":"MEMORANDUM OF UNDERSTANDING"},
    {"id":104,"name":"PERJANJIAN KERJA SAMA"},
    {"id":105,"name":"ARTIKEL"},
    {"id":162,"name":"SURAT EDARAN"},
    {"id":163,"name":"INSTRUKSI LEMBAGA PEMERINTAH NON KEMENTERIAN"},
    {"id":217,"name":"LOKAKARYA"},
    {"id":492,"name":"OSAMU SEIREI"},
    {"id":493,"name":"OSAMU KANREI"},
    {"id":624,"name":"PENELITIAN HUKUM"},
    {"id":683,"name":"RANCANGAN PERATURAN BADAN"},
    {"id":685,"name":"SURAT EDARAN LEMBAGA NEGARA"},
    {"id":686,"name":"SURAT EDARAN LEMBAGA PEMERINTAH NON KEMENTERIAN"},
    {"id":687,"name":"SURAT EDARAN LEMBAGA NON STRUKTURAL"},
    {"id":688,"name":"RISALAH SIDANG"},
    {"id":696,"name":"KEPUTUSAN PIMPINAN DPRD"},
    {"id":720,"name":"RISALAH DPRD"},
    {"id":794,"name":"KEPUTUSAN REKTOR"},
    {"id":804,"name":"SURAT EDARAN KEPALA DESA"},
    {"id":815,"name":"SURAT KEPUTUSAN DPRD KABUPATEN"},
    {"id":816,"name":"KEPUTUSAN BERSAMA DPRD"},
    {"id":817,"name":"SURAT KEPUTUSAN"},
    {"id":823,"name":"KEPUTUSAN ESELON II"},
    {"id":826,"name":"PERATURAN KEPALA DESA"},
    {"id":831,"name":"HIMPUNAN"},
    {"id":833,"name":"KESEPAKATAN BERSAMA BUPATI"},
    {"id":841,"name":"PERATURAN DEWAN"},
    {"id":844,"name":"HIMPUNAN PERATURAN"},
    {"id":892,"name":"STATUTEN"},
    {"id":911,"name":"PERATURAN KOMISI"},
    {"id":973,"name":"KEPUTUSAN BADAN MUSYAWARAH DPRD"},
    {"id":1013,"name":"BERITA ACARA"},
    {"id":1027,"name":"KEPUTUSAN KEPALA DESA"},
    {"id":1031,"name":"RANCANGAN DPRD"},
    {"id":1033,"name":"KEPUTUSAN SEKRETARIS DPRD"},
    {"id":1035,"name":"KARYA TULIS"},
    {"id":1103,"name":"PERATURAN PERGURUAN TINGGI"},
    {"id":1104,"name":"KEPUTUSAN PERGURUAN TINGGI"},
    {"id":1105,"name":"SURAT EDARAN PERGURUAN TINGGI"},
    {"id":1108,"name":"INSTRUKSI PERGURUAN TINGGI"},
    {"id":1110,"name":"CONVENTION"},
    {"id":1111,"name":"TREATY"},
    {"id":1112,"name":"DECLARATION"},
    {"id":1113,"name":"PROTOCOL"},
    {"id":1114,"name":"COVENANT"},
    {"id":1115,"name":"AGREEMENT"},
    {"id":1147,"name":"PERJANJIAN KERJA SAMA PERGURUAN TINGGI"},
    {"id":1155,"name":"PERJANJIAN KERJASAMA"},
    {"id":1157,"name":"INSTRUKSI MENTERI"},
    {"id":1159,"name":"KEPUTUSAN MENTERI"},
    {"id":1198,"name":"PERATURAN DPR"},
    {"id":1363,"name":"ZYOOREI"},
    {"id":1364,"name":"SYUUREI"},
    {"id":1365,"name":"MAKLOEMAT GUNSEIKAN"},
    {"id":1366,"name":"OSAMU GUNREI"},
    {"id":1689,"name":"PERATURAN ESELON 2 DAERAH"},
    {"id":1690,"name":"KEPUTUSAN ESELON 1 DAERAH"},
    {"id":1691,"name":"KEPUTUSAN ESELON 2 DAERAH"}
]';

// Decode JSON menjadi array asosiatif
 $jenisDokumenList = json_decode($jenisDokumenJson, true);

// Buat array untuk pencarian cepat (id => name)
 $lookup = array_column($jenisDokumenList, 'name', 'id');

echo "========================================\n";
echo "    Daftar Jenis Dokumen JDIHN\n";
echo "========================================\n";
foreach ($jenisDokumenList as $dokumen) {
    // Menggunakan sprintf untuk formatting output yang rapi
    echo sprintf("ID: %-5s | Nama: %s\n", $dokumen['id'], $dokumen['name']);
}
echo "========================================\n";

// Loop untuk meminta input yang valid dari pengguna
do {
    $input = readline("Masukkan kode jenis dokumen yang ingin diambil (ID): ");
    if (!ctype_digit($input)) {
        echo "Error: Input harus berupa angka. Silakan coba lagi.\n";
    } elseif (!isset($lookup[$input])) {
        echo "Error: Kode '$input' tidak ditemukan dalam daftar. Silakan coba lagi.\n";
    } else {
        // Input valid, keluar dari loop
        break;
    }
} while (true);

 $jenisId = (int)$input;
 $jenisName = $lookup[$jenisId];

echo "\nAnda memilih: ID {$jenisId} ({$jenisName}).\n";
echo "Memulai proses pengambilan data...\n\n";


// --- Langkah 1: Dapatkan total halaman dari halaman pertama ---
 $baseUrl = 'https://jdihn.go.id/api/search?jenis=' . $jenisId . '&page=';
 $totalPages = 0;
try {
    $firstPageContent = @file_get_contents($baseUrl . '1');
    if ($firstPageContent === false) {
        throw new Exception("Gagal mengambil data dari halaman pertama. Periksa koneksi internet atau ketersediaan API.");
    }

    $firstPageData = json_decode($firstPageContent, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        throw new Exception("Gagal mem-parsing JSON dari halaman pertama: " . json_last_error_msg());
    }

    if (!isset($firstPageData['meta']['last_page'])) {
        throw new Exception("Struktur JSON tidak sesuai, 'meta.last_page' tidak ditemukan.");
    }

    $totalPages = $firstPageData['meta']['last_page'];
    echo "Ditemukan total {$totalPages} halaman.\n\n";

} catch (Exception $e) {
    die("Error: " . $e->getMessage() . "\n");
}

// --- Langkah 2: Buat nama file CSV secara dinamis ---
 $startPage = 1;
 $source = 'JDIHN';
// Bersihkan nama dokumen untuk digunakan sebagai nama file
 $fileNameSafe = str_replace([' ', '/'], '_', $jenisName);
 $outputFile = $jenisId . '_' . $fileNameSafe . '_page_' . $startPage . '_' . $totalPages . '_' . $source . '.csv';

echo "Membuka file CSV untuk ditulis: {$outputFile}\n";
 $handle = fopen($outputFile, 'w');
if ($handle === false) {
    die("Gagal membuka file {$outputFile} untuk ditulis. Periksa izin penulisan folder.\n");
}

// Tentukan header kolom CSV
 $csvHeader = [
    'judul', 'nomor', 'id_anggota', 'id_dokumen', 'hit_see', 'hit_download',
    'jenis_peraturan_id', 'jenis_peraturan_second_id', 'jenis_peraturan_parent_id', 'jenis_peraturan_name',
    'jenis_peraturan_status', 'jenis_peraturan_created_by', 'jenis_peraturan_updated_by',
    'jenis_peraturan_created_time', 'jenis_peraturan_updated_time', 'jenis_peraturan_setPublish',
    'tahun_terbit', 'instansi', 'download'
];

// Tulis header ke file CSV
fputcsv($handle, $csvHeader);


// --- Langkah 3: Looping melalui semua halaman dan tulis data ---
for ($page = $startPage; $page <= $totalPages; $page++) {
    echo "Memproses halaman {$page} dari {$totalPages}... ";

    $pageContent = @file_get_contents($baseUrl . $page);

    if ($pageContent === false) {
        echo "[GAGAL] Tidak dapat mengambil halaman {$page}. Melewati.\n";
        continue;
    }

    $pageData = json_decode($pageContent, true);
    if (json_last_error() !== JSON_ERROR_NONE || !isset($pageData['data'])) {
        echo "[GAGAL] Gagal mem-parsing JSON pada halaman {$page}. Melewati.\n";
        continue;
    }

    $itemsOnPage = count($pageData['data']);
    foreach ($pageData['data'] as $item) {
        $csvRow = [
            $item['judul'] ?? '', $item['nomor'] ?? '', $item['id_anggota'] ?? '', $item['id_dokumen'] ?? '',
            $item['hit_see'] ?? '', $item['hit_download'] ?? '',
            $item['jenis_peraturan']['id'] ?? '', $item['jenis_peraturan']['second_id'] ?? '',
            $item['jenis_peraturan']['parent_id'] ?? '', $item['jenis_peraturan']['name'] ?? '',
            $item['jenis_peraturan']['status'] ?? '', $item['jenis_peraturan']['_created_by'] ?? '',
            $item['jenis_peraturan']['_updated_by'] ?? '', $item['jenis_peraturan']['_created_time'] ?? '',
            $item['jenis_peraturan']['_updated_time'] ?? '', $item['jenis_peraturan']['setPublish'] ?? '',
            $item['tahun_terbit'] ?? '', $item['instansi'] ?? '', $item['download'] ?? ''
        ];
        fputcsv($handle, $csvRow);
    }

    echo "[SUKSES] ({$itemsOnPage} item ditambahkan)\n";
    sleep(1);
}

// --- Langkah 4: Tutup file dan selesai ---
fclose($handle);

echo "\nProses selesai! Semua data telah disimpan dalam file '{$outputFile}'.\n";

?>
Enter fullscreen mode Exit fullscreen mode

Hasilnya:

Enak pakai CSV atau supabase?

Top comments (0)