diff --git a/app/__pycache__/apiController.cpython-313.pyc b/app/__pycache__/apiController.cpython-313.pyc index e42f553..d7d30f6 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 6f78c3b..de3ff57 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 680b7a2..63e4220 100644 --- a/app/apiController.py +++ b/app/apiController.py @@ -51,48 +51,57 @@ class apiController: def getStatusKecamatan(conn,kode_prov, kode_kabkota, kode_kecamatan): cur = conn.cursor() SQL = """ - SELECT - tahun AS tahun, + SELECT + tahun as tahun, status as th, kode_provinsi, kabupaten_kota_kode, - kecamatan_kode, + kecamatan_kode, kecamatan_nama, - COUNT(DISTINCT kelurahan_desa_id) AS `COUNT_DISTINCT(kelurahan_desa_id)` - 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 - INNER JOIN wil_desa wkd ON mid.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 mid.tahun = ( - SELECT MAX(tahun) FROM metrik_indeks_desa LIMIT 1 - ) - ) AS virtual_table - WHERE kode_provinsi = %s - AND kabupaten_kota_kode = %s + COUNT(distinct kelurahan_desa_id) as `COUNT_DISTINCT(kelurahan_desa_id)` + 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, + wd.id as kelurahan_desa_id, + wp.kode as kelurahan_desa_kode, + wk.nama as kelurahan_desa_nama, + mid.status, + mid.tahun + FROM + metrik_indeks_desa mid + JOIN wil_desa wd on + wd.kode_int = mid.kode_desa + JOIN wil_kecamatan wk on + wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota wkk on + wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi wp on + wp.id = wkk.provinsi_id + where + mid.tahun = ( + select + MAX(tahun) + from + metrik_indeks_desa + limit 1 ) ) as virtual_table + WHERE provinsi_id = %s AND kecamatan_kode = %s GROUP BY tahun, status, kode_provinsi, kabupaten_kota_kode, kecamatan_kode, kecamatan_nama ORDER BY kecamatan_kode DESC; - """ try: - cur.execute(SQL, (kode_prov, kode_kabkota, kode_kecamatan)) + cur.execute(SQL, (kode_prov, kode_kecamatan)) + print('status kecamtan :', cur._executed) except Exception as e: + print(e) return [] print(kode_prov, kode_kabkota, kode_kecamatan) result = cur.fetchall() @@ -140,11 +149,11 @@ class apiController: # 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, + # wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, # mid.status, mid.status, mid.tahun # from metrik_indeks_desa mid - # inner join wil_desa wkd on mid.desa_id = wkd.id - # inner join wil_kecamatan wk on wkd.kecamatan_id = wk.id + # inner join wil_desa wkd on mid.desa_id = wk.id + # inner join wil_kecamatan wk on wk.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 mid.tahun = (select max(tahun) from metrik_indeks_desa limit 1) @@ -172,16 +181,16 @@ class apiController: wp.kode AS kode_provinsi, wkk.kode AS kabupaten_kota_kode, wkk.nama AS kabupaten_kota_nama, - wkd.id AS kelurahan_desa_id, + wk.id AS kelurahan_desa_id, mid.status, mid.tahun FROM metrik_indeks_desa mid - INNER JOIN wil_desa wkd ON mid.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 + JOIN wil_desa wd on wd.kode_int = mid.kode_desa + JOIN wil_kecamatan wk on wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota wkk on wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi wp on wp.id = wkk.provinsi_id WHERE mid.tahun = (SELECT MAX(tahun) FROM metrik_indeks_desa) - AND wp.kode = %s + AND wp.id = %s AND wkk.kode = %s ) AS filtered_data GROUP BY tahun, status, kode_provinsi, kabupaten_kota_kode, kabupaten_kota_nama; @@ -205,11 +214,11 @@ class apiController: # select wp.id provinsi_id, wp.kode kode_provinsi, # 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, + # wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, # mid.status, mid.status, mid.tahun # from metrik_indeks_desa mid - # inner join wil_desa wkd on mid.desa_id = wkd.id - # inner join wil_kecamatan wk on wkd.kecamatan_id = wk.id + # inner join wil_desa wkd on mid.desa_id = wk.id + # inner join wil_kecamatan wk on wk.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 mid.tahun = (select max(tahun) from metrik_indeks_desa limit 1) @@ -235,13 +244,13 @@ class apiController: 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, + wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, mb.jenis, mb.jumlah - from metric_bumdes mb - inner join wil_desa wkd on mb.kelurahan_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 + from metrik_bumdes mb + JOIN wil_desa wd on wd.kode_int = mb.kode_desa + JOIN wil_kecamatan wk on wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota wkk on wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi wp on wp.id = wkk.provinsi_id ) AS virtual_table GROUP BY jenis ORDER BY "SUM(jumlah)" DESC LIMIT 1000; """ @@ -259,13 +268,13 @@ class apiController: 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, + wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, mpd.jenis_pendamping, mpd.jumlah from metric_pendamping_desa mpd - inner join wil_desa wkd on mpd.kelurahan_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 + JOIN wil_desa wd on wd.kode_int = mpd.kode_desa + JOIN wil_kecamatan wk on wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota wkk on wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi wp on wp.id = wkk.provinsi_id ) AS virtual_table GROUP BY jenis_pendamping ORDER BY "SUM(jumlah)" DESC LIMIT 1000; """ @@ -281,13 +290,13 @@ class apiController: 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, + wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, mpd.jenis_pendamping, mpd.jumlah from metric_pendamping_desa mpd - 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 + JOIN wil_desa wd on wd.kode_int = mpd.kode_desa + JOIN wil_kecamatan wk on wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota wkk on wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi wp on wp.id = wkk.provinsi_id WHERE wp.kode = %s ) AS virtual_table GROUP BY jenis_pendamping ORDER BY "SUM(jumlah)" DESC LIMIT 1000; @@ -300,7 +309,7 @@ class apiController: return result @staticmethod - def getPendampingPerDesa(conn): + def getPendampingPerDesa(conn, kode_desa): cur = conn.cursor() SQL = """ SELECT jenis_pendamping AS jenis_pendamping, SUM(jumlah) / COUNT(DISTINCT kabupaten_kota_id) AS "SUM(jumlah) / COUNT(DISTINCT kabupaten_kota_id)" @@ -308,19 +317,22 @@ class apiController: 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, + wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, mpd.jenis_pendamping, mpd.jumlah from metric_pendamping_desa mpd - inner join wil_desa wkd on mpd.kelurahan_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 - ) AS virtual_table GROUP BY jenis_pendamping ORDER BY "SUM(jumlah) / COUNT(DISTINCT kabupaten_kota_id)" DESC + JOIN wil_desa wd on wd.kode_int = mpd.kode_desa + JOIN wil_kecamatan wk on wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota wkk on wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi wp on wp.id = wkk.provinsi_id + WHERE wk.kode = %s + ) AS virtual_table + GROUP BY jenis_pendamping ORDER BY "SUM(jumlah) / COUNT(DISTINCT kabupaten_kota_id)" DESC LIMIT 10000; """ try: cur.execute(SQL) except Exception as e: + print(e) return [] result = cur.fetchall() return result @@ -334,13 +346,13 @@ class apiController: 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, + wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, mkd.jumlah from metric_koperasi_desa mkd - inner join wil_desa wkd on mkd.kelurahan_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 + JOIN wil_desa wd on wd.kode_int = mkd.kode_desa + JOIN wil_kecamatan wk on wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota wkk on wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi wp on wp.id = wkk.provinsi_id ) AS virtual_table; """ cur.execute(SQL) @@ -356,13 +368,13 @@ class apiController: 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, + wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, mkd.jumlah from metric_koperasi_desa mkd - inner join wil_desa wkd on mkd.kelurahan_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 + JOIN wil_desa wd on wd.kode_int = mkd.kode_desa + JOIN wil_kecamatan wk on wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota wkk on wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi wp on wp.id = wkk.provinsi_id ) AS virtual_table WHERE jumlah = 0 LIMIT 50000; @@ -454,11 +466,11 @@ class apiController: # 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, + # wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, # mid.status, mid.status, mid.tahun # from metrik_indeks_desa mid - # inner join wil_desa wkd on mid.desa_id = wkd.id - # inner join wil_kecamatan wk on wkd.kecamatan_id = wk.id + # inner join wil_desa wkd on mid.desa_id = wk.id + # inner join wil_kecamatan wk on wk.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 mid.tahun = (select max(tahun) from metrik_indeks_desa limit 1) @@ -479,11 +491,11 @@ class apiController: # select wp.id provinsi_id, wp.kode kode_provinsi, # 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, + # wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, # mid.status, mid.status, mid.tahun # from metrik_indeks_desa mid - # inner join wil_desa wkd on mid.desa_id = wkd.id - # inner join wil_kecamatan wk on wkd.kecamatan_id = wk.id + # inner join wil_desa wkd on mid.desa_id = wk.id + # inner join wil_kecamatan wk on wk.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 mid.tahun = (select max(tahun) from metrik_indeks_desa limit 1) @@ -512,11 +524,11 @@ class apiController: # select wp.id provinsi_id, wp.kode kode_provinsi, # 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, + # wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, # mid.status, mid.status, mid.tahun # from metrik_indeks_desa mid - # inner join wil_desa wkd on mid.desa_id = wkd.id - # inner join wil_kecamatan wk on wkd.kecamatan_id = wk.id + # inner join wil_desa wkd on mid.desa_id = wk.id + # inner join wil_kecamatan wk on wk.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 mid.tahun = (select max(tahun) from metrik_indeks_desa limit 1) @@ -540,13 +552,13 @@ class apiController: 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, + wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, mb.tipe, mb.jumlah from metrik_bumdes mb - inner join wil_desa wkd on mb.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 + JOIN wil_desa wd on wd.kode_int = mb.kode_desa + JOIN wil_kecamatan wk on wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota wkk on wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi wp on wp.id = wkk.provinsi_id WHERE wp.kode = %s ) AS virtual_table GROUP BY tipe ORDER BY "SUM(jumlah)" DESC LIMIT 1000; @@ -568,13 +580,13 @@ class apiController: 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, + wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, mid.idm, mid.status, mid.tahun from metrik_indeks_desa mid - inner join wil_desa wkd on mid.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 + JOIN wil_desa wd on wd.kode_int = mid.kode_desa + JOIN wil_kecamatan wk on wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota wkk on wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi wp on wp.id = wkk.provinsi_id where mid.tahun = (select max(tahun) from metrik_indeks_desa limit 1) ) AS virtual_table WHERE provinsi_kode = %s @@ -593,11 +605,11 @@ class apiController: # select wp.id provinsi_id, wp.kode kode_provinsi, # 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, + # wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, # mid.status, mid.status, mid.tahun # from metrik_indeks_desa mid - # inner join wil_desa wkd on mid.desa_id = wkd.id - # inner join wil_kecamatan wk on wkd.kecamatan_id = wk.id + # inner join wil_desa wkd on mid.desa_id = wk.id + # inner join wil_kecamatan wk on wk.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 mid.tahun = (select max(tahun) from metrik_indeks_desa limit 1) @@ -619,10 +631,10 @@ class apiController: # WHEN mkd.jumlah > 0 THEN 'Kopmer' # ELSE 'Non Kopmer' # END AS status_koperasi, - # COUNT(DISTINCT wkd.id) AS jumlah_desa + # COUNT(DISTINCT wk.id) AS jumlah_desa # FROM metric_koperasi_desa mkd - # INNER JOIN wil_desa wkd ON mkd.kelurahan_desa_id = wkd.id - # INNER JOIN wil_kecamatan wk ON wkd.kecamatan_id = wk.id + # INNER JOIN wil_desa wkd ON mkd.kelurahan_desa_id = wk.id + # INNER JOIN wil_kecamatan wk ON wk.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 wp.kode = %s @@ -647,10 +659,10 @@ class apiController: 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 + JOIN wil_desa wd on wd.kode_int = mdd.kode_desa + JOIN wil_kecamatan wk on wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota wkk on wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi wp on wp.id = wkk.provinsi_id WHERE mdd.tahun = (SELECT tahun FROM latest_year) AND wp.kode = %s """ @@ -659,7 +671,46 @@ class apiController: for row in cur.fetchall(): total_serapan += row[1] return {'jumlah_per_m':toRupiah(row[0]), 'persentage':round(row[1],2)} - + @staticmethod + def getTotalDana(conn, level,kode_lvl): + print("data level:", level,kode_lvl) + cursor = conn.cursor() + level_conf = { + 'provinsi' : ('wil_provinsi','wp', 'kode'), + 'kabkota' : ('wil_kabupatenkota', 'wkk', 'kode'), + 'kecamatan' : ('wil_kecamatan', 'wk', 'kode'), + 'desa' : ('wil_desa', 'wd', 'kode') + } + + if level not in level_conf or not kode_lvl: + print('level tidak valid') + return + tabel,alias, key = level_conf[level] + query = f""" + WITH latest_year AS ( + SELECT MAX(tahun) AS tahun FROM metrik_dana_desa + ) + SELECT + SUM(mdd.pagu) AS serapan_per_1M + FROM metrik_dana_desa mdd + JOIN wil_desa wd on wd.kode_int = mdd.kode_desa + JOIN wil_kecamatan wk on wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota wkk on wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi wp on wp.id = wkk.provinsi_id + WHERE mdd.tahun = (SELECT tahun FROM latest_year) + AND {alias}.{key} = '{kode_lvl}' + """ + print("Query :", query) + try: + cursor.execute(query) + except Exception as e: + print(e) + return[] + + result = cursor.fetchone() + print("data:", query) + return result + @staticmethod # def getStatusKecamatan(conn, kode_prov, kode_kabkota, kode_kecamatan): # cur = conn.cursor() @@ -676,11 +727,11 @@ class apiController: # select wp.id provinsi_id, wp.kode kode_provinsi, # 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, + # wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, # mid.status, mid.status, mid.tahun # from metrik_indeks_desa mid - # inner join wil_desa wkd on mid.desa_id = wkd.id - # inner join wil_kecamatan wk on wkd.kecamatan_id = wk.id + # inner join wil_desa wkd on mid.desa_id = wk.id + # inner join wil_kecamatan wk on wk.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 mid.tahun = (select max(tahun) from metrik_indeks_desa limit 1) @@ -703,26 +754,27 @@ class apiController: def getBumdesKab(conn, kode_kab): cur = conn.cursor() SQL = """ - SELECT jenis AS jenis, sum(jumlah) AS "SUM(jumlah)" - FROM (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, - mb.jenis, mb.jumlah - from metric_bumdes mb - inner join wil_desa wkd on mb.kelurahan_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 + SELECT jenis, sum(jumlah) AS "SUM(jumlah)" + FROM ( + 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, + wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, + mb.tipe as jenis, mb.jumlah + FROM metrik_bumdes mb + JOIN wil_desa wd on wd.kode_int = mb.kode_desa + JOIN wil_kecamatan wk on wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota wkk on wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi wp on wp.id = wkk.provinsi_id WHERE wkk.kode = %s - ) AS virtual_table GROUP BY jenis ORDER BY "SUM(jumlah)" DESC - LIMIT 1000; + ) AS virtual_table GROUP BY jenis ORDER BY "SUM(jumlah)"; """ - try: - cur.execute(SQL, (kode_prov,)) - except Exception as e: - return [] + # try: + cur.execute(SQL, (kode_kab,)) + # except Exception as e: + # return [] + result = cur.fetchall() return result @@ -737,10 +789,10 @@ class apiController: 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 + JOIN wil_desa wd on wd.kode_int = mdd.kode_desa + JOIN wil_kecamatan wk on wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota wkk on wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi wp on wp.id = wkk.provinsi_id WHERE mdd.tahun = (SELECT tahun FROM latest_year) AND wkk.kode = %s """ @@ -764,13 +816,13 @@ class apiController: 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, + wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, mpd.jenis_pendamping, mpd.jumlah from metric_pendamping_desa mpd - inner join wil_desa wkd on mpd.kelurahan_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 + JOIN wil_desa wd on wd.kode_int = mpd.kode_desa + JOIN wil_kecamatan wk on wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota wkk on wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi wp on wp.id = wkk.provinsi_id WHERE wkk.kode = %s ) AS virtual_table GROUP BY jenis_pendamping ORDER BY "SUM(jumlah)" DESC LIMIT 1000; @@ -791,12 +843,12 @@ class apiController: WHEN mkd.jumlah > 0 THEN 'Kopmer' ELSE 'Non Kopmer' END AS status_koperasi, - COUNT(DISTINCT wkd.id) AS jumlah_desa + COUNT(DISTINCT wk.id) AS jumlah_desa FROM metric_koperasi_desa mkd - INNER JOIN wil_desa wkd ON mkd.kelurahan_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 + JOIN wil_desa wd on wd.kode_int = mkd.kode_desa + JOIN wil_kecamatan wk on wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota wkk on wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi wp on wp.id = wkk.provinsi_id WHERE wkk.kode = %s GROUP BY status_koperasi LIMIT 50000; @@ -816,21 +868,21 @@ class apiController: def getBumdesKec(conn, kode_kec): cur = conn.cursor() SQL = """ - SELECT jenis AS jenis, sum(jumlah) AS "SUM(jumlah)" - FROM (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, - mb.jenis, mb.jumlah - from metric_bumdes mb - inner join wil_desa wkd on mb.kelurahan_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 + SELECT jenis, sum(jumlah) AS "SUM(jumlah)" + FROM ( + 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, + wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, + mb.tipe as jenis, mb.jumlah + FROM metrik_bumdes mb + JOIN wil_desa wd on wd.kode_int = mb.kode_desa + JOIN wil_kecamatan wk on wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota wkk on wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi wp on wp.id = wkk.provinsi_id WHERE wk.kode = %s - ) AS virtual_table GROUP BY jenis ORDER BY "SUM(jumlah)" DESC - LIMIT 1000; + ) AS virtual_table GROUP BY jenis ORDER BY "SUM(jumlah)"; """ try: cur.execute(SQL,(kode_kec,)) @@ -843,37 +895,22 @@ class apiController: def getTotalSerapanKec(conn, kode_kec): cur = conn.cursor() SQL = """ - SELECT - SUM(serapan) / 1000000000 AS serapan_per_1M, - (SUM(serapan) / NULLIF(SUM(pagu), 0)) * 100 AS persentase_serapan - FROM ( - 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 - 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 wk.kode = %s - ) AS virtual_table - WHERE tahun_anggaran = 2024; + select + SUM(mdd.salur_pagu) serapan_per_milyar, + (SUM(mdd.salur_pagu) / NULLIF(SUM(mdd.pagu), 0)) * 100 AS persentase_serapan + from metrik_dana_desa mdd + join wil_desa as wd on wd.kode_int = mdd.kode_desa + JOIN wil_kecamatan AS wk ON wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota AS wkk ON wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi AS wp ON wp.id = wkk.provinsi_id + where wk.kode = %s """ try: cur.execute(SQL, (kode_kec,)) except Exception as e: return [] - - total_serapan = 0 - total_per_m = 0 - for row in cur.fetchall(): - total_serapan += row[1] or 0 - total_per_m += row[0] or 0 - - return {'jumlah_per_m':toRupiah(total_per_m), 'persentage':round(total_serapan,2)} + result = cur.fetchone() + return result @staticmethod def getPendampingPerKec(conn, kode_kec): cursor = conn.cursor() @@ -883,13 +920,13 @@ class apiController: 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, + wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, mpd.jenis_pendamping, mpd.jumlah from metric_pendamping_desa mpd - inner join wil_desa wkd on mpd.kelurahan_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 + JOIN wil_desa wd on wd.kode_int = mpd.kode_desa + JOIN wil_kecamatan wk on wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota wkk on wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi wp on wp.id = wkk.provinsi_id WHERE wk.kode = %s ) AS virtual_table GROUP BY jenis_pendamping ORDER BY "SUM(jumlah)" DESC LIMIT 1000; @@ -910,12 +947,12 @@ class apiController: WHEN mkd.jumlah > 0 THEN 'Kopmer' ELSE 'Non Kopmer' END AS status_koperasi, - COUNT(DISTINCT wkd.id) AS jumlah_desa + COUNT(DISTINCT wk.id) AS jumlah_desa FROM metric_koperasi_desa mkd - INNER JOIN wil_desa wkd ON mkd.kelurahan_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 + JOIN wil_desa wd on wd.kode_int = mkd.kode_desa + JOIN wil_kecamatan wk on wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota wkk on wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi wp on wp.id = wkk.provinsi_id WHERE wk.kode = %s GROUP BY status_koperasi LIMIT 50000; @@ -944,22 +981,21 @@ class apiController: select wp.id provinsi_id, wp.kode kode_provinsi, 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 desa_id, wkd.kode kelurahan_desa_kode, wkd.nama kelurahan_desa_nama, + wk.id desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, mid.idm, mid.status, mid.tahun from metrik_indeks_desa mid - inner join wil_desa wkd on mid.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 + JOIN wil_desa wd on wd.kode_int = mid.kode_desa + JOIN wil_kecamatan wk on wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota wkk on wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi wp on wp.id = wkk.provinsi_id where mid.tahun = (select max(tahun) from metrik_indeks_desa limit 1) AND - wp.kode = %s AND - wkk.kode = %s AND - wk.kode = %s AND - wkd.kode = %s + wp.id = %s AND + wd.kode = %s ) AS virtual_table GROUP BY tahun, status,kode_provinsi, kelurahan_desa_kode,kelurahan_desa_nama ORDER BY status, kelurahan_desa_kode DESC """ - cur.execute(SQL, (kode_prov, kode_kabkota, kode_kecamatan, kode_desa,)) + cur.execute(SQL, (kode_prov,kode_desa,)) + print(cur._executed) result = cur.fetchall() return result @@ -972,19 +1008,21 @@ class apiController: 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, - mb.jenis, mb.jumlah - from metric_bumdes mb - inner join wil_desa wkd on mb.kelurahan_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 wkd.kode = %s + wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, + mb.tipe as jenis, mb.jumlah + from metrik_bumdes mb + JOIN wil_desa wd on wd.kode_int = mb.kode_desa + JOIN wil_kecamatan wk on wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota wkk on wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi wp on wp.id = wkk.provinsi_id + WHERE wd.kode = %s ) AS virtual_table GROUP BY jenis ORDER BY "SUM(jumlah)" DESC LIMIT 1000; """ - - cur.execute(SQL,(kode_desa,)) + try: + cur.execute(SQL,(kode_desa,)) + except Exception as e: + return [] result = cur.fetchall() return result @@ -992,27 +1030,29 @@ class apiController: def getTotalSerapanDesa(conn, kode_desa): cur = conn.cursor() SQL = """ - SELECT - SUM(serapan) / 1000000000 AS serapan_per_1M,pagu, - (SUM(serapan) / NULLIF(SUM(pagu), 0)) * 100 AS persentase_serapan - FROM ( - 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 - 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 wkd.kode = %s - ) AS virtual_table - WHERE tahun_anggaran = 2024 - group by pagu; + SELECT + SUM(serapan) AS serapan_per_1M, + (SUM(serapan) / NULLIF(SUM(pagu), 0)) * 100 AS persentase_serapan + FROM ( + 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, + wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, + mdd.pagu, salur_pagu as serapan, mdd.tahun as tahun_anggaran + FROM metrik_dana_desa mdd + JOIN wil_desa wd on wd.kode_int = mdd.kode_desa + JOIN wil_kecamatan wk on wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota wkk on wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi wp on wp.id = wkk.provinsi_id + WHERE wd.kode = %s + ) AS virtual_table """ - cur.execute(SQL, (kode_desa,)) + try: + cur.execute(SQL, (kode_desa,)) + except Exception as e: + print(e) + return [] result = cur.fetchall() return result @@ -1025,14 +1065,14 @@ class apiController: # 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, + # wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, # mpd.jenis_pendamping, mpd.jumlah # from metric_pendamping_desa mpd - # inner join wil_desa wkd on mpd.kelurahan_desa_id = wkd.id - # inner join wil_kecamatan wk on wkd.kecamatan_id = wk.id + # inner join wil_desa wkd on mpd.kelurahan_desa_id = wk.id + # inner join wil_kecamatan wk on wk.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 wkd.kode = %s + # WHERE wk.kode = %s # ) AS virtual_table GROUP BY jenis_pendamping ORDER BY "SUM(jumlah)" DESC # LIMIT 1000; # """ @@ -1049,13 +1089,13 @@ class apiController: WHEN mkd.jumlah > 0 THEN 'Kopmer' ELSE 'Non Kopmer' END AS status_koperasi, - COUNT(DISTINCT wkd.id) AS jumlah_desa + COUNT(DISTINCT wk.id) AS jumlah_desa FROM metric_koperasi_desa mkd - INNER JOIN wil_desa wkd ON mkd.kelurahan_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 wkd.kode = %s + JOIN wil_desa wd on wd.kode_int = mkd.kode_desa + JOIN wil_kecamatan wk on wk.id = wd.kecamatan_id + JOIN wil_kabupatenkota wkk on wkk.id = wk.kabupatenkota_id + JOIN wil_provinsi wp on wp.id = wkk.provinsi_id + WHERE wk.kode = %s GROUP BY status_koperasi LIMIT 50000; """ diff --git a/app/routes.py b/app/routes.py index b9982b6..d092db8 100644 --- a/app/routes.py +++ b/app/routes.py @@ -31,7 +31,13 @@ def get_connection(): finally: if conn is not None and conn.is_connected(): conn.close() - + +@main.route('/api/status/danadesa//') +def get_total_dana_by_level(level,kode): + with get_connection() as conn: + result = apiController.getTotalDana(conn,level,kode ) + return jsonify(result) + #======================================================== # MAIN ROUTE #======================================================== @@ -243,7 +249,8 @@ def get_status_by_desa(kode_prov, kode_kabkota, kode_kecamatan, kode_desa): @main.route('/api/desa/koperasi/') def get_koperasi_by_desa(kode_desa): - data = apiController.getDesaDenganAtauTanpaKopmerDesa(conn, kode_desa) + with get_connection() as conn: + data = apiController.getDesaDenganAtauTanpaKopmerDesa(conn, kode_desa) return jsonify(data) @main.route('/api/desa/pendamping/') diff --git a/templates/index.html b/templates/index.html index 15abcc9..ddbbbb8 100644 --- a/templates/index.html +++ b/templates/index.html @@ -284,33 +284,27 @@ let klasifikasiHTML = "
  • Tidak ada data
  • "; if (Array.isArray(status?.[0])) { - indexDesaHTML = status[0] + provIndexDesaHTML = status[0] .map(d => `${d[1]}: ${d[4]} / `) .join(""); - bumdesHTML = status[1] + provBumdesHTML = status[1] .map(dt => `${dt[0]}:${dt[1]} / `) .join(""); - danadesaHTML = `Dana :${status[2].jumlah_per_m}, Persentase : ${status[2].persentage}%`; - serapanHTML = status[3] - .map(([jabatan, nilai]) => { - const alias = jabatan === 'Pendamping Lokal Desa' ? 'PLD' : - jabatan === 'Pendamping Desa' ? 'PD' : - jabatan; - return `${alias}: ${nilai}`; - }).join(""); - - koperasiHTML = status[4] + const raw = Number(status[5]); + provDanaTotalHTML = `Total : ${formatWithUnit(raw)}`; + provDanadesaHTML = `Total : ${status[2].jumlah_per_m}, Persentase : ${status[2].persentage}%`; + provKoperasiHTML = status[4] .map(dt => `${dt[0]}: ${dt[1]} / `) .join(""); } const popupContent = ` ${feature.properties.nama}
    Status Desa: -
  • IDM - ${indexDesaHTML}
  • -
  • BUM - ${bumdesHTML}
  • -
  • DD - ${danadesaHTML}
  • -
  • SERAPAN - ${serapanHTML}
  • -
  • KOPERASI - ${koperasiHTML}
  • +
  • IDM - ${provIndexDesaHTML}
  • +
  • BUM - ${provBumdesHTML}
  • +
  • DD - ${provDanaTotalHTML}
  • +
  • SERAPAN - ${provDanadesaHTML}
  • +
  • KOPERASI - ${provKoperasiHTML}
  • `; layer.bindPopup(popupContent).openPopup(e.latlng); @@ -322,15 +316,19 @@ let klasifikasiHTML = "
  • Tidak ada data
  • "; if (Array.isArray(status?.[0])) { - indexDesaHTML = status[0] + kabindexDesaHTML= status[0] .map(d => `${d[1]}: ${d[5]} / `) .join(""); - bumdesHTML = status[1] + kabbumdesHTML = status[1] .map(dt => `${dt[0]}:${dt[1]} / `) .join(""); - danadesaHTML = `Dana :${status[2].jumlah_per_m}, Persentase : ${status[2].persentage}%`; - serapanHTML = status[3] + + const raw = Number(status[5]); + kabdanaTotalHTML = `Total : ${formatWithUnit(raw)}`; + + kabdanadesaHTML = `Dana :${status[2].jumlah_per_m}, Persentase : ${status[2].persentage}%`; + kabserapanHTML = status[3] .map(([jabatan, nilai]) => { const alias = jabatan === 'Pendamping Lokal Desa' ? 'PLD' : jabatan === 'Pendamping Desa' ? 'PD' : @@ -338,18 +336,18 @@ return `${alias}: ${nilai} /`; }).join(""); - koperasiHTML = status[4] + kabkoperasiHTML = status[4] .map(dt => `${dt[0]}: ${dt[1]} / `) .join(""); } const popupContent = ` ${feature.properties.nama}
    Status Desa (Kabupaten): -
  • IDM - ${indexDesaHTML}
  • -
  • BUM - ${bumdesHTML}
  • -
  • DD - ${danadesaHTML}
  • -
  • SERAPAN - ${serapanHTML}
  • -
  • KOPERASI - ${koperasiHTML}
  • +
  • IDM - ${kabindexDesaHTML}
  • +
  • BUM - ${kabbumdesHTML}
  • +
  • DD - ${kabdanaTotalHTML}
  • +
  • SERAPAN - ${kabdanadesaHTML}
  • +
  • KOPERASI - ${kabkoperasiHTML}
  • `; layer.bindPopup(popupContent).openPopup(e.latlng); @@ -357,20 +355,25 @@ } else if (currentLevel === 'kecamatan'){ const province_code = localStorage.getItem('kode_provinsi') const region_code = localStorage.getItem('kode_kabupatenkota') - localStorage.setItem('kode_kecamatan',feature.properties.kode) + localStorage.setItem('kode_kecamatan',feature.properties.id) const status = await fetchStatusDesaByKecamatan(province_code, region_code, feature.properties.kode) let klasifikasiHTML = "
  • Tidak ada data
  • "; if (Array.isArray(status?.[0])) { - indexDesaHTML = status[0] + kecindexDesaHTML = status[0] .map(d => `${d[1]}: ${d[6]} / `) .join(""); - bumdesHTML = status[1] + kecbumdesHTML = status[1] .map(dt => `${dt[0]}:${dt[1]} / `) .join(""); - danadesaHTML = `Dana :${status[2].jumlah_per_m}, Persentase : ${status[2].persentage}%`; - serapanHTML = status[3] + + const raw = Number(status[5]); + kecdanaTotalHTML = `Total : ${formatWithUnit(raw)}`; + + kecdanadesaHTML = `Total: ${formatWithUnit(status[2][0])} / Persen: ${Math.round(status[2][1])}`; + + kecserapanHTML = status[3] .map(([jabatan, nilai]) => { const alias = jabatan === 'Pendamping Lokal Desa' ? 'PLD' : jabatan === 'Pendamping Desa' ? 'PD' : @@ -378,7 +381,7 @@ return `${alias}: ${nilai} /`; }).join(""); - koperasiHTML = status[4] + keckoperasiHTML = status[4] .map(dt => `${dt[0]}: ${dt[1]} / `) .join(""); } @@ -387,12 +390,11 @@ ` ${feature.properties.nama} Status Desa (Kecamatan): - Status Desa: -
  • IDM - ${indexDesaHTML}
  • -
  • BUM - ${bumdesHTML}
  • -
  • DD - ${danadesaHTML}
  • -
  • SERAPAN - ${serapanHTML}
  • -
  • KOPERASI - ${koperasiHTML}
  • +
  • IDM - ${kecindexDesaHTML}
  • +
  • BUM - ${kecbumdesHTML}
  • +
  • DD - ${kecdanaTotalHTML}
  • +
  • SERAPAN - ${kecdanadesaHTML}
  • +
  • KOPERASI - ${keckoperasiHTML}
  • ` layer.bindPopup(popupContent).openPopup(e.latlng); }else { @@ -400,19 +402,24 @@ const province_code = localStorage.getItem('kode_provinsi') const region_code = localStorage.getItem('kode_kabupatenkota') const district_code = localStorage.getItem('kode_kecamatan') - + console.log(province_code, region_code , district_code, feature.properties.kode) const status = await fetchStatusDesaByDesa(province_code, region_code , district_code, feature.properties.kode); let klasifikasiHTML = "
  • Tidak ada data
  • "; if (Array.isArray(status?.[0])) { indexDesaHTML = status[0] - .map(d => `${d[1]}: ${d[5]} / `) + .map(d => `${d[1]}`) .join(""); bumdesHTML = status[1] .map(dt => `${dt[0]}:${dt[1]} / `) .join(""); - danadesaHTML = `Dana :${status[2].jumlah_per_m}, Persentase : ${status[2].persentage}%`; + + const raw = Number(status[5]); + danaTotalHTML = `Total : ${formatWithUnit(raw)}`; + danadesaHTML = status[2].map(([serapan,persen]) => { + return `Nominal - ${formatWithUnit(serapan)} / Persen - ${Math.round(persen)}%`; + }); serapanHTML = status[3] .map(([jabatan, nilai]) => { const alias = jabatan === 'Pendamping Lokal Desa' ? 'PLD' : @@ -430,8 +437,8 @@ Status Desa (Desa):
  • IDM - ${indexDesaHTML}
  • BUM - ${bumdesHTML}
  • -
  • DD - ${danadesaHTML}
  • -
  • SERAPAN - ${serapanHTML}
  • +
  • DD - ${danaTotalHTML}
  • +
  • SERAPAN - ${danadesaHTML}
  • KOPERASI - ${koperasiHTML}
  • `; @@ -453,14 +460,35 @@ }); } + function formatWithUnit(value) { + const abs = Math.abs(value); + let scaled, unit; + + if (abs >= 1e12) { scaled = value / 1e12; unit = 'Triliun'; } + else if (abs >= 1e9) { scaled = value / 1e9; unit = 'Miliar'; } + else if (abs >= 1e6) { scaled = value / 1e6; unit = 'Juta'; } + else if (abs >= 1e3) { scaled = value / 1e3; unit = 'Ribu'; } + else { scaled = value; unit = ''; } + const formatted = scaled.toLocaleString('id-ID', { + minimumFractionDigits: unit ? 2 : 0, + maximumFractionDigits: unit ? 2 : 0 + }); + + return unit + ? `${formatted} ${unit}` + : formatted; + } + async function fetchStatusDesaByProvinsi(kodeProvinsi) { const url = `http://localhost:5000/api/status-provinsi/${kodeProvinsi}`; + const urltdd = `http://localhost:5000/api/status/danadesa/provinsi/${kodeProvinsi}`; const urldd = `http://localhost:5000/api/provinsi/serapan/${kodeProvinsi}`; const urlpd = `http://localhost:5000//api/provinsi/pendamping/${kodeProvinsi}` const urlkop = `http://localhost:5000//api/provinsi/koperasi/${kodeProvinsi}` const urlbd = `http://localhost:5000/api/provinsi/bumdes/${kodeProvinsi}`; try { const res = await fetch(url); + const tdd = await fetch(urltdd) const bumdes = await fetch(urlbd) const dd = await fetch(urldd) const pd = await fetch(urlpd) @@ -468,12 +496,13 @@ if (!res.ok && !bumdes.ok && !dd.ok) throw new Error(`HTTP ${res.status}`); const IPD = await res.json() + const dtdd = await tdd.json() const bd = await bumdes.json() const danadesa = await dd.json() const dtpd = await pd.json() const dtkop = await kop.json() - - return [IPD,bd, danadesa, dtpd, dtkop]; + console.log([IPD, bd, danadesa, dtpd, dtkop, dtdd]); + return [IPD, bd, danadesa, dtpd, dtkop, dtdd]; } catch (err) { console.error("Gagal ambil status desa:", err); return null; @@ -482,12 +511,14 @@ async function fetchStatusDesaByKabupatenkota(kode_prov, kode_kabkota) { const url = `http://localhost:5000/api/status-kabupatenkota/${kode_prov}/${kode_kabkota}` + const urltdd = `http://localhost:5000/api/status/danadesa/kabkota/${kode_kabkota}`; const urldd = `http://localhost:5000/api/kabkota/serapan/${kode_kabkota}`; const urlpd = `http://localhost:5000//api/kabkota/pendamping/${kode_kabkota}` const urlkop = `http://localhost:5000//api/kabkota/koperasi/${kode_kabkota}` const urlbd = `http://localhost:5000/api/kabkota/bumdes/${kode_kabkota}`; try{ const res = await fetch(url) + const tdd = await fetch(urltdd) const bumdes = await fetch(urlbd) const dd = await fetch(urldd) const pd = await fetch(urlpd) @@ -499,8 +530,9 @@ const danadesa = await dd.json() const dtpd = await pd.json() const dtkop = await kop.json() + const dttd = await tdd.json() - return [IPD,bd, danadesa, dtpd, dtkop]; + return [IPD,bd, danadesa, dtpd, dtkop,dttd]; }catch(err){ console.log(err) return null; @@ -509,12 +541,14 @@ async function fetchStatusDesaByKecamatan(province_code, region_code, district_code){ const url = `http://localhost:5000/api/status-kecamatan/${province_code}/${region_code}/${district_code}` + const urltdd = `http://localhost:5000/api/status/danadesa/kecamatan/${district_code}`; const urldd = `http://localhost:5000/api/kecamatan/serapan/${district_code}`; const urlpd = `http://localhost:5000//api/kecamatan/pendamping/${district_code}` const urlkop = `http://localhost:5000//api/kecamatan/koperasi/${district_code}` const urlbd = `http://localhost:5000/api/kecamatan/bumdes/${district_code}`; try { const res = await fetch(url) + const tdd = await fetch(urltdd) const bumdes = await fetch(urlbd) const dd = await fetch(urldd) const pd = await fetch(urlpd) @@ -526,8 +560,9 @@ const danadesa = await dd.json() const dtpd = await pd.json() const dtkop = await kop.json() + const dttd = await tdd.json() - return [IPD,bd, danadesa, dtpd, dtkop];; + return [IPD,bd, danadesa, dtpd, dtkop, dttd];; } catch (error) { console.log(error) return null @@ -536,12 +571,14 @@ async function fetchStatusDesaByDesa(province_code, region_code, district_code, village_code){ const url = `http://localhost:5000//api/desa/status/${province_code}/${region_code}/${district_code}/${village_code}` + const urltdd = `http://localhost:5000/api/status/danadesa/desa/${village_code}`; const urldd = `http://localhost:5000/api/desa/serapan/${village_code}`; const urlpd = `http://localhost:5000//api/desa/pendamping/${village_code}` const urlkop = `http://localhost:5000//api/desa/koperasi/${village_code}` const urlbd = `http://localhost:5000/api/desa/bumdes/${village_code}`; try { const res = await fetch(url) + const tdd = await fetch(urltdd) const bumdes = await fetch(urlbd) const dd = await fetch(urldd) const pd = await fetch(urlpd) @@ -553,8 +590,9 @@ const danadesa = await dd.json() const dtpd = await pd.json() const dtkop = await kop.json() + const dttd = await tdd.json() - return [IPD,bd, danadesa, dtpd, dtkop];; + return [IPD,bd, danadesa, dtpd, dtkop, dttd];; } catch (error) { console.log(error) return null