diff --git a/app/__pycache__/apiController.cpython-313.pyc b/app/__pycache__/apiController.cpython-313.pyc index 59b07c1..0a060d4 100644 Binary files a/app/__pycache__/apiController.cpython-313.pyc and b/app/__pycache__/apiController.cpython-313.pyc differ diff --git a/app/__pycache__/routes.cpython-313.pyc b/app/__pycache__/routes.cpython-313.pyc index 2943fe9..eee3129 100644 Binary files a/app/__pycache__/routes.cpython-313.pyc and b/app/__pycache__/routes.cpython-313.pyc differ diff --git a/app/apiController.py b/app/apiController.py index e5154e2..294f933 100644 --- a/app/apiController.py +++ b/app/apiController.py @@ -13,18 +13,37 @@ class apiController: return result @staticmethod - def kabkota(conn): + def kabkota(conn, provinsi_id=None): cur = conn.cursor() - SQL = "SELECT id,nama FROM wil_kabupatenkota ORDER BY nama" + if provinsi_id: + SQL = """ + SELECT id, nama + FROM wil_kabupatenkota + WHERE provinsi_id = %s + ORDER BY nama + """ + cur.execute(SQL, (provinsi_id,)) + else: + SQL = "SELECT id,nama FROM wil_kabupatenkota ORDER BY nama" + cur.execute(SQL) - cur.execute(SQL) result = cur.fetchall() return result @staticmethod - def kecamatan(conn): + def kecamatan(conn, kabkota_id): cur = conn.cursor() - SQL = "SELECT id,nama FROM wil_kecamatan ORDER BY nama" - cur.execute(SQL) + if kabkota_id: + SQL = """ + SELECT id, nama + FROM wil_kecamatan + WHERE kabupatenkota_id = %s + ORDER BY nama + """ + cur.execute(SQL, (kabkota_id,)) + else: + SQL = "SELECT id,nama FROM wil_kecamatan ORDER BY nama" + cur.execute(SQL) + result = cur.fetchall() return result @@ -147,20 +166,13 @@ class apiController: kode_provinsi, kabupaten_kota_kode, kabupaten_kota_nama, - COUNT(DISTINCT kelurahan_desa_id) AS "COUNT_DISTINCT(kelurahan_desa_id)" + COUNT(DISTINCT kelurahan_desa_id) AS jumlah_desa FROM ( SELECT - wp.id AS provinsi_id, wp.kode AS kode_provinsi, - wkk.id AS kabupaten_kota_id, wkk.kode AS kabupaten_kota_kode, wkk.nama AS kabupaten_kota_nama, - wk.id AS kecamatan_id, - wk.kode AS kecamatan_kode, - wk.nama AS kecamatan_nama, wkd.id AS kelurahan_desa_id, - wkd.kode AS kelurahan_desa_kode, - wkd.nama AS kelurahan_desa_nama, mid.status, mid.tahun FROM metrik_indeks_desa mid @@ -169,11 +181,10 @@ class apiController: INNER JOIN wil_kabupatenkota wkk ON wk.kabupatenkota_id = wkk.id INNER JOIN wil_provinsi wp ON wkk.provinsi_id = wp.id WHERE mid.tahun = (SELECT MAX(tahun) FROM metrik_indeks_desa) - ) AS virtual_table - WHERE kode_provinsi = %s - AND kabupaten_kota_kode = %s - GROUP BY tahun, status, kode_provinsi, kabupaten_kota_kode, kabupaten_kota_nama - ORDER BY status, kabupaten_kota_kode DESC; + AND wp.kode = %s + AND wkk.kode = %s + ) AS filtered_data + GROUP BY tahun, status, kode_provinsi, kabupaten_kota_kode, kabupaten_kota_nama; """ cur.execute(SQL, (kode_prov, kode_kabkota)) result = cur.fetchall() @@ -708,24 +719,19 @@ class apiController: def getTotalSerapanKab(conn, kode_kab): cur = conn.cursor() SQL = """ - SELECT - SUM(serapan) / 1000000000 AS serapan_per_1M, - (SUM(serapan) / NULLIF(SUM(pagu), 0)) * 100 AS persentase_serapan - FROM ( + WITH latest_year AS ( + SELECT MAX(tahun) AS tahun FROM metrik_dana_desa + ) SELECT - wp.id provinsi_id, wp.kode provinsi_kode, wp.nama provinsi_nama, - wkk.id kabupaten_kota_id, wkk.kode kabupaten_kota_kode, wkk.nama kabupaten_kota_nama, - wk.id kecamatan_id, wk.kode kecamatan_kode, wk.nama kecamatan_nama, - wkd.id kelurahan_desa_id, wkd.kode kelurahan_desa_kode, wkd.nama kelurahan_desa_nama, - mdd.pagu, salur_pagu, mdd.persen_serapan, mdd.tahun_anggaran - FROM metrik_dana_desa mdd - INNER JOIN wil_desa wkd ON mdd.kelurahan_desa_id = wkd.id + SUM(mdd.salur_pagu) / 1000000000 AS serapan_per_1M, + (SUM(mdd.salur_pagu) / NULLIF(SUM(mdd.pagu), 0)) * 100 AS persentase_serapan + FROM metrik_dana_desa mdd + INNER JOIN wil_desa wkd ON mdd.desa_id = wkd.id INNER JOIN wil_kecamatan wk ON wkd.kecamatan_id = wk.id INNER JOIN wil_kabupatenkota wkk ON wk.kabupatenkota_id = wkk.id INNER JOIN wil_provinsi wp ON wkk.provinsi_id = wp.id - WHERE wkk.kode = %s - ) AS virtual_table - WHERE tahun_anggaran = 2024; + WHERE mdd.tahun = (SELECT tahun FROM latest_year) AND + wkk.kode = %s """ try: cur.execute(SQL, (kode_kab,)) diff --git a/app/routes.py b/app/routes.py index 5042c5b..de5b45d 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,5 +1,4 @@ -from flask import Blueprint, jsonify, render_template -import psycopg2 +from flask import Blueprint, jsonify, render_template, request from app import mapController from app.apiController import apiController from app.utils import toRupiah @@ -272,14 +271,16 @@ def get_master_provinsi(): data = apiController.provinsi(conn) return data -@main.route('/api/master/kabkota') +@main.route('/api/master/kabkota/') def get_master_kabkota(): + provinsi_id = request.args.get('provinsi_id') with get_connection() as conn: - data = apiController.kabkota + data = apiController.kabkota(conn, provinsi_id) return jsonify(data) @main.route('/api/master/kecamatan') def get_master_kecamatan(): + kabkota_id = request.args.get('kabkota_id') with get_connection() as conn: - data = apiController.kecamatan(conn) + data = apiController.kecamatan(conn,kabkota_id) return jsonify(data) diff --git a/templates/index.html b/templates/index.html index f341295..713b6bf 100644 --- a/templates/index.html +++ b/templates/index.html @@ -583,7 +583,7 @@ } $('#provinsiDropdown').on('change', function (e) { - const kodeProvinsi = $(this).val(); // lebih aman daripada e.target.value + const kodeProvinsi = $(this).val(); console.log("Provinsi dipilih:", kodeProvinsi); if (!kodeProvinsi) { @@ -593,6 +593,29 @@ localStorage.setItem('kode_provinsi', kodeProvinsi); + $('#kabkotaDropdown').empty().trigger('change'); + + // Ambil kabupaten berdasarkan provinsi + const kabkotaURL = "{{ url_for('main.get_master_kabkota') }}"; + $.ajax({ + url: kabkotaURL, + data: { provinsi_id: kodeProvinsi }, + dataType: 'json', + success: function (data) { + const results = data.map(kabupaten => ({ + id: kabupaten[0], + text: kabupaten[1] + })); + + // Tambahkan ke dropdown kabupaten + $('#kabkotaDropdown').select2({ + data: results, + placeholder: 'Pilih Kabupaten/Kota', + allowClear: true + }); + } + }); + console.log(`Memuat kabupaten dari /geojson/kabupaten/${kodeProvinsi}`); loadLayer(`/geojson/kabupaten/${kodeProvinsi}`, () => { console.log("Layer kabupaten dimuat."); @@ -600,9 +623,36 @@ }); $('#kabkotaDropdown').on('change', function (e) { - const kodeKabupaten = e.target.value; - + const kodeKabupaten = $(this).val(); + if (!kodeKabupaten) { + console.warn("Tidak ada kode provinsi yang dipilih!"); + return; + } localStorage.setItem('kode_kabupatenkota', kodeKabupaten); + + $('#kecamatanDropdown').empty().trigger('change'); + + // Ambil kabupaten berdasarkan provinsi + const kabkotaURL = "{{ url_for('main.get_master_kecamatan') }}"; + $.ajax({ + url: kabkotaURL, + data: { kabkota_id: kodeKabupaten }, + dataType: 'json', + success: function (data) { + const results = data.map(kecamatan => ({ + id: kecamatan[0], + text: kecamatan[1] + })); + + // Tambahkan ke dropdown kabupaten + $('#kecamatanDropdown').select2({ + data: results, + placeholder: 'Pilih Kabupaten/Kota', + allowClear: true + }); + } + }); + loadLayer(`/geojson/kecamatan/${kodeKabupaten}`, () => {}, 'kecamatan'); }).select2(); @@ -611,10 +661,66 @@ localStorage.setItem('kode_kecamatan', kodeKecamatan); loadLayer(`/geojson/desa/${kodeKecamatan}`, () => {}, 'desa'); }); + + +