import json from app.utils import toRupiah class apiController: #==================================================================== # Kabupaten Kota #=================================================================== @staticmethod def provinsi(conn): cur = conn.cursor() SQL = "SELECT id, nama FROM wil_provinsi ORDER BY nama" cur.execute(SQL) result = cur.fetchall() return result @staticmethod def kabkota(conn, provinsi_id=None): cur = conn.cursor() 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) result = cur.fetchall() return result @staticmethod def kecamatan(conn, kabkota_id): cur = conn.cursor() 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 @staticmethod def getStatusKecamatan(conn,kode_prov, kode_kabkota, kode_kecamatan): cur = conn.cursor() SQL = """ SELECT tahun as tahun, status as th, kode_provinsi, kabupaten_kota_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, 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_kecamatan)) print('status kecamtan :', cur._executed) except Exception as e: print(e) return [] print(kode_prov, kode_kabkota, kode_kecamatan) result = cur.fetchall() return result #Status Desa #=========================================================== @staticmethod def getTotalPersentaseSerapan(conn): cur = conn.cursor() SQL = """ WITH latest_year AS ( SELECT MAX(tahun) AS tahun_terbaru FROM metrik_dana_desa ) SELECT SUM(total_pagu) AS total_dana, SUM(salur_pagu) as total_serapan FROM metrik_dana_desa """ cur = conn.cursor() cur.execute(SQL) row = cur.fetchone() if row: total_dana, total_serapan = row return { 'jumlah_per_m':toRupiah(total_dana), 'serapan_per_m':toRupiah(total_serapan), 'persentage':round((total_serapan / total_dana * 100) if total_dana else 0, 2) } return { 'jumlah_per_m': toRupiah(0), 'serapan_per_m': toRupiah(0), 'persentage': 0 } #Status Wilayah #=========================================== @staticmethod # def getStatusProvinsi(conn,kode): # cur = conn.cursor() # SQL = """ # SELECT tahun AS tahun, status AS status,provinsi_kode,provinsi_nama,count(DISTINCT kelurahan_desa_id) AS "COUNT_DISTINCT(kelurahan_desa_id)" # 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, # mid.status, mid.status, mid.tahun # from metrik_indeks_desa mid # 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) # ) AS virtual_table # WHERE provinsi_kode = %s # GROUP BY tahun, status, provinsi_nama,provinsi_kode ORDER BY status, provinsi_nama DESC # """; # cur.execute(SQL, (kode,)) # result = cur.fetchall() # return result @staticmethod def getStatusKabkota(conn,kode_prov, kode_kabkota): cur = conn.cursor() SQL = """ SELECT tahun, status, kode_provinsi, kabupaten_kota_kode, kabupaten_kota_nama, COUNT(DISTINCT kelurahan_desa_id) AS jumlah_desa FROM ( SELECT wp.kode AS kode_provinsi, wkk.kode AS kabupaten_kota_kode, wkk.nama AS kabupaten_kota_nama, wk.id AS kelurahan_desa_id, 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) AND wp.id = %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() return result @staticmethod # def getStatusKecamatan(conn, kode_prov, kode_kabkota, kode_kecamatan): # cur = conn.cursor() # SQL = """ # SELECT # tahun AS tahun, # status AS status, # kode_provinsi, # kabupaten_kota_kode, # kecamatan_kode, # kecamatan_nama, # count(DISTINCT kelurahan_desa_id) AS "COUNT_DISTINCT(kelurahan_desa_id)" # FROM ( # 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, # 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 = 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) # ) AS virtual_table # WHERE kode_provinsi = %s # AND kabupaten_kota_kode = %s # AND kecamatan_kode = %s # GROUP BY tahun, status,kode_provinsi, kabupaten_kota_kode,kecamatan_kode, kecamatan_nama ORDER BY status, kecamatan_kode DESC # """ # cur.execute(SQL, (kode_prov, kode_kabkota, kode_kecamatan)) # print(kode_prov, kode_kabkota, kode_kecamatan) # result = cur.fetchall() # return result #Status Bumdes #=========================================== @staticmethod def getBumdes(conn): 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, wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, mb.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 ) AS virtual_table GROUP BY jenis ORDER BY "SUM(jumlah)" DESC LIMIT 1000; """ cur.execute(SQL) result = cur.fetchall() return result @staticmethod def getPendamping(conn): cursor = conn.cursor() SQL = """ SELECT jenis_pendamping AS jenis_pendamping, 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, mpd.jenis_pendamping, mpd.jumlah from metric_pendamping_desa mpd 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; """ cursor.execute(SQL) result = cursor.fetchall() return result @staticmethod def getPendampingPerProv(conn, kode_prov): cursor = conn.cursor() SQL = """ SELECT jenis_pendamping AS jenis_pendamping, 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, mpd.jenis_pendamping, mpd.jumlah from metric_pendamping_desa mpd 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; """ try: cursor.execute(SQL, (kode_prov,)) except Exception as e: return [] result = cursor.fetchall() return result @staticmethod 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)" 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, mpd.jenis_pendamping, mpd.jumlah from metric_pendamping_desa mpd 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 @staticmethod def getDesaDenganKopmer(conn): cur = conn.cursor() SQL = """ SELECT 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, mkd.jumlah from metric_koperasi_desa mkd 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) result = cur.fetchall() return result @staticmethod def getDesaTanpaKopmer(connection): cur = connection.cursor() SQL = """ SELECT count(DISTINCT kelurahan_desa_id) AS "COUNT_DISTINCT(kelurahan_desa_id)" 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, mkd.jumlah from metric_koperasi_desa mkd 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; """ cur.excute(SQL) result = cur.fetchall() return result #====================================================== #MAP DATA #========================================================= def fetch_geojson(conn,level, parent_code=None): # cur = conn.cursor() # cur.execute(f"SELECT id, kode, nama, lat, lng, path, iso FROM {table_name} WHERE id = 1 LIMIT 1") cur = conn.cursor() if level == 'provinsi': cur.execute(""" SELECT id, kode, nama, null as lat, null as lng, koordinat as path FROM wil_provinsi """) elif level == 'kabupaten': cur.execute(""" SELECT id, kode, nama, null as lat, null as lng, CONCAT( REPEAT('[', 4 - (LENGTH(path) - LENGTH(REPLACE(path, '[', '')))), path, REPEAT(']', 4 - (LENGTH(path) - LENGTH(REPLACE(path, ']', '')))) ) AS path FROM wil_kabupatenkota WHERE provinsi_id = %s""", (parent_code,)) elif level == 'kecamatan': cur.execute(""" SELECT id, kode, nama, null as lat, null as lng, CONCAT( REPEAT('[', 4 - (LENGTH(path) - LENGTH(REPLACE(path, '[', '')))), path, REPEAT(']', 4 - (LENGTH(path) - LENGTH(REPLACE(path, ']', '')))) ) AS path FROM wil_kecamatan WHERE kabupaten_kota_id = %s """, (parent_code,)) elif level == 'desa': # cur.execute("SELECT id, kode, nama, null as lat, null as lng,path FROM wil_desa WHERE kecamatan_id = %s", (parent_code,)) cur.execute((""" SELECT id, kode, nama, null as lat, null as lng, CONCAT( REPEAT('[', 4 - (LENGTH(path) - LENGTH(REPLACE(path, '[', '')))), path, REPEAT(']', 4 - (LENGTH(path) - LENGTH(REPLACE(path, ']', '')))) ) AS path FROM wil_desa WHERE kecamatan_id = %s""", (parent_code,))) else: return {"type": "FeatureCollection", "features": []} features = [] for row in cur.fetchall(): path = row[5] # path = swap_latlon(path) # if not path: # continue # geometry = { # "type": "Polygon", # "coordinates": json.loads(path) # } #Multi poligons try: parsed_path = json.loads(path) corrected_path = swap_latlon(parsed_path) except Exception as e: print(f"Error parsing path for row {row[0]}: {e}") continue if not corrected_path: continue geometry = { "type": "MultiPolygon", "coordinates": parsed_path } feature = { "type": "Feature", "geometry": geometry, "properties": { "id": row[0], "kode": row[1], "nama": row[2], "lat": row[3], "lng": row[4] } } features.append(feature) return { "type": "FeatureCollection", "features": features } #Status Wilayah #=========================================== # @staticmethod # def getStatusProvinsi(conn,kode): # cur = conn.cursor() # SQL = """ # SELECT tahun AS tahun, status AS status,provinsi_kode,provinsi_nama,count(DISTINCT kelurahan_desa_id) AS "COUNT_DISTINCT(kelurahan_desa_id)" # 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, # mid.status, mid.status, mid.tahun # from metrik_indeks_desa mid # 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) # ) AS virtual_table # WHERE provinsi_kode = %s # GROUP BY tahun, status, provinsi_nama,provinsi_kode ORDER BY status, provinsi_nama DESC # """; # cur.execute(SQL, (kode,)) # result = cur.fetchall() # return result # @staticmethod # def getStatusKabkota(conn, kode_prov, kode_kabkota): # cur = conn.cursor() # SQL = """ # SELECT tahun AS tahun, status AS status,kode_provinsi,kabupaten_kota_kode,kabupaten_kota_nama,count(DISTINCT kelurahan_desa_id) AS "COUNT_DISTINCT(kelurahan_desa_id)" # FROM ( # 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, # 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 = 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) # ) AS virtual_table # WHERE kode_provinsi = %s # AND virtual_table.kabupaten_kota_kode = %s # GROUP BY tahun, status,kode_provinsi, kabupaten_kota_kode,kabupaten_kota_nama ORDER BY status, kabupaten_kota_kode DESC # """ # cur.execute(SQL, (kode_prov, kode_kabkota)) # result = cur.fetchall() # return result @staticmethod # def getStatusKecamatan(conn, kode_prov, kode_kabkota, kode_kecamatan): # cur = conn.cursor() # SQL = """ # SELECT # tahun AS tahun, # status AS status, # kode_provinsi, # kabupaten_kota_kode, # kecamatan_kode, # kecamatan_nama, # count(DISTINCT kelurahan_desa_id) AS "COUNT_DISTINCT(kelurahan_desa_id)" # FROM ( # 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, # 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 = 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) # ) AS virtual_table # WHERE kode_provinsi = %s # AND kabupaten_kota_kode = %s # AND kecamatan_kode = %s # GROUP BY tahun, status,kode_provinsi, kabupaten_kota_kode,kecamatan_kode, kecamatan_nama ORDER BY status, kecamatan_kode DESC # """ # cur.execute(SQL, (kode_prov, kode_kabkota, kode_kecamatan)) # print(kode_prov, kode_kabkota, kode_kecamatan) # result = cur.fetchall() # return result @staticmethod def getBumdesProv(conn, kode_prov): cur = conn.cursor() SQL = """ SELECT tipe 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, wk.id kelurahan_desa_id, wk.kode kelurahan_desa_kode, wk.nama kelurahan_desa_nama, mb.tipe, 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 wp.kode = %s ) AS virtual_table GROUP BY tipe ORDER BY "SUM(jumlah)" DESC LIMIT 1000; """ cur.execute(SQL,(kode_prov,)) result = cur.fetchall() return result #Status Wilayah #=========================================== @staticmethod def getStatusProvinsi(conn,kode): cur = conn.cursor() SQL = """ SELECT tahun AS tahun, status AS status,provinsi_kode,provinsi_nama,count(DISTINCT kelurahan_desa_id) AS "COUNT_DISTINCT(kelurahan_desa_id)" 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, mid.idm, 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_kode = %s GROUP BY tahun, status, provinsi_nama,provinsi_kode ORDER BY status, provinsi_nama DESC """; cur.execute(SQL, (kode,)) result = cur.fetchall() return result # @staticmethod # def getStatusKabkota(conn, kode_prov, kode_kabkota): # cur = conn.cursor() # SQL = """ # SELECT tahun AS tahun, status AS status,kode_provinsi,kabupaten_kota_kode,kabupaten_kota_nama,count(DISTINCT kelurahan_desa_id) AS "COUNT_DISTINCT(kelurahan_desa_id)" # FROM ( # 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, # 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 = 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) # ) AS virtual_table # WHERE kode_provinsi = %s # AND virtual_table.kabupaten_kota_kode = %s # GROUP BY tahun, status,kode_provinsi, kabupaten_kota_kode,kabupaten_kota_nama ORDER BY status, kabupaten_kota_kode DESC # """ # cur.execute(SQL, (kode_prov, kode_kabkota)) # result = cur.fetchall() # return result # @staticmethod # def getDesaDenganAtauTanpaKopmer(conn, kode_prov): # cur = conn.cursor() # SQL = """ # SELECT # CASE # WHEN mkd.jumlah > 0 THEN 'Kopmer' # ELSE 'Non Kopmer' # END AS status_koperasi, # COUNT(DISTINCT wk.id) AS jumlah_desa # FROM metric_koperasi_desa mkd # 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 # GROUP BY status_koperasi # LIMIT 50000; # """ # try: # cur.execute(SQL, (kode_prov,)) # except Exception as e: # return [] # result = cur.fetchall() # return result @staticmethod def getTotalSerapanProv(conn, kode_prov): cur = conn.cursor() SQL = """ WITH latest_year AS ( SELECT MAX(tahun) AS tahun FROM metrik_dana_desa ) SELECT 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 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 """ cur.execute(SQL, (kode_prov,)) total_serapan = 0 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() # SQL = """ # SELECT # tahun AS tahun, # status AS status, # kode_provinsi, # kabupaten_kota_kode, # kecamatan_kode, # kecamatan_nama, # count(DISTINCT kelurahan_desa_id) AS "COUNT_DISTINCT(kelurahan_desa_id)" # FROM ( # 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, # 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 = 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) # ) AS virtual_table # WHERE kode_provinsi = %s # AND kabupaten_kota_kode = %s # AND kecamatan_kode = %s # GROUP BY tahun, status,kode_provinsi, kabupaten_kota_kode,kecamatan_kode, kecamatan_nama ORDER BY status, kecamatan_kode DESC # """ # cur.execute(SQL, (kode_prov, kode_kabkota, kode_kecamatan)) # print(kode_prov, kode_kabkota, kode_kecamatan) # result = cur.fetchall() # return result #==================================================================== # Kabupaten Kota #=================================================================== @staticmethod def getBumdesKab(conn, kode_kab): cur = conn.cursor() SQL = """ 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)"; """ # try: cur.execute(SQL, (kode_kab,)) # except Exception as e: # return [] result = cur.fetchall() return result @staticmethod def getTotalSerapanKab(conn, kode_kab): cur = conn.cursor() SQL = """ WITH latest_year AS ( SELECT MAX(tahun) AS tahun FROM metrik_dana_desa ) SELECT 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 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 """ try: cur.execute(SQL, (kode_kab,)) 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)} @staticmethod def getPendampingPerKab(conn, kode_kab): cursor = conn.cursor() SQL = """ SELECT jenis_pendamping AS jenis_pendamping, 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, mpd.jenis_pendamping, mpd.jumlah from metric_pendamping_desa mpd 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; """ try: cursor.execute(SQL, (kode_kab,)) except Exception as e: return [] result = cursor.fetchall() return result @staticmethod def getDesaDenganAtauTanpaKopmerKab(conn, kode_kab): cur = conn.cursor() SQL = """ SELECT CASE WHEN mkd.jumlah > 0 THEN 'Kopmer' ELSE 'Non Kopmer' END AS status_koperasi, COUNT(DISTINCT wk.id) AS jumlah_desa FROM metric_koperasi_desa mkd 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; """ try: cur.execute(SQL, (kode_kab,)) except Exception as e: return [] result = cur.fetchall() return result #==================================================================== # Kecamatan #=================================================================== @staticmethod def getBumdesKec(conn, kode_kec): cur = conn.cursor() SQL = """ 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)"; """ try: cur.execute(SQL,(kode_kec,)) except Exception as e: return [] result = cur.fetchall() return result @staticmethod def getTotalSerapanKec(conn, kode_kec): cur = conn.cursor() SQL = """ 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 [] result = cur.fetchone() return result @staticmethod def getPendampingPerKec(conn, kode_kec): cursor = conn.cursor() SQL = """ SELECT jenis_pendamping AS jenis_pendamping, 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, mpd.jenis_pendamping, mpd.jumlah from metric_pendamping_desa mpd 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; """ try: cursor.execute(SQL, (kode_kec,)) except Exception as e: return [] result = cursor.fetchall() return result @staticmethod def getDesaDenganAtauTanpaKopmerKec(conn, kode_kec): cur = conn.cursor() SQL = """ SELECT CASE WHEN mkd.jumlah > 0 THEN 'Kopmer' ELSE 'Non Kopmer' END AS status_koperasi, COUNT(DISTINCT wk.id) AS jumlah_desa FROM metric_koperasi_desa mkd 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; """ # cur.execute(SQL, (kode_kec,)) try: cur.execute(SQL, (kode_kec,)) except Exception as e: return [] result = cur.fetchall() return result #==================================================================== # Desa #=================================================================== def getStatusDesaByDesa(conn,kode_prov, kode_kabkota, kode_kecamatan, kode_desa): cur = conn.cursor() SQL = """ SELECT tahun AS tahun, status AS status, kelurahan_desa_kode, kelurahan_desa_nama, count(DISTINCT desa_id) AS "COUNT_DISTINCT(desa_id)" FROM ( 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, 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 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.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_desa,)) print(cur._executed) result = cur.fetchall() return result @staticmethod def getBumdesDesa(conn, kode_desa): 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, 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; """ try: cur.execute(SQL,(kode_desa,)) except Exception as e: return [] result = cur.fetchall() return result @staticmethod def getTotalSerapanDesa(conn, kode_desa): cur = conn.cursor() SQL = """ 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 """ try: cur.execute(SQL, (kode_desa,)) except Exception as e: print(e) return [] result = cur.fetchall() return result @staticmethod # def getPendampingPerDesa(conn, kode_desa): # cursor = conn.cursor() # SQL = """ # SELECT jenis_pendamping AS jenis_pendamping, 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, # mpd.jenis_pendamping, mpd.jumlah # from metric_pendamping_desa mpd # 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 wk.kode = %s # ) AS virtual_table GROUP BY jenis_pendamping ORDER BY "SUM(jumlah)" DESC # LIMIT 1000; # """ # cursor.execute(SQL, (kode_desa,)) # result = cursor.fetchall() # return result @staticmethod def getDesaDenganAtauTanpaKopmerDesa(conn, kode_desa): cur = conn.cursor() SQL = """ SELECT CASE WHEN mkd.jumlah > 0 THEN 'Kopmer' ELSE 'Non Kopmer' END AS status_koperasi, COUNT(DISTINCT wk.id) AS jumlah_desa FROM metric_koperasi_desa mkd 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; """ # cur.execute(SQL, (kode_desa,)) try: cur.execute(SQL, (kode_desa,)) except Exception as e: return [] result = cur.fetchall() return result