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, 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 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)) except Exception as 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, # wkd.id kelurahan_desa_id, wkd.kode kelurahan_desa_kode, wkd.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_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, wkd.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 WHERE mid.tahun = (SELECT MAX(tahun) FROM metrik_indeks_desa) 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() 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, # wkd.id kelurahan_desa_id, wkd.kode kelurahan_desa_kode, wkd.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_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, 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 ) 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, wkd.id kelurahan_desa_id, wkd.kode kelurahan_desa_kode, wkd.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)" 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, wkd.id kelurahan_desa_id, wkd.kode kelurahan_desa_kode, wkd.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 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): 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, wkd.id kelurahan_desa_id, wkd.kode kelurahan_desa_kode, wkd.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 LIMIT 10000; """ try: cur.execute(SQL) except Exception as 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, wkd.id kelurahan_desa_id, wkd.kode kelurahan_desa_kode, wkd.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 ) 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, wkd.id kelurahan_desa_id, wkd.kode kelurahan_desa_kode, wkd.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 ) 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, koordinat 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, koordinat 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", # karena bentuk datamu seperti itu "coordinates": corrected_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, # wkd.id kelurahan_desa_id, wkd.kode kelurahan_desa_kode, wkd.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_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, # wkd.id kelurahan_desa_id, wkd.kode kelurahan_desa_kode, wkd.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_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, # wkd.id kelurahan_desa_id, wkd.kode kelurahan_desa_kode, wkd.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_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, wkd.id kelurahan_desa_id, wkd.kode kelurahan_desa_kode, wkd.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 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, wkd.id kelurahan_desa_id, wkd.kode kelurahan_desa_kode, wkd.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 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, # wkd.id kelurahan_desa_id, wkd.kode kelurahan_desa_kode, wkd.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_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 wkd.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 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 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 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 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, # wkd.id kelurahan_desa_id, wkd.kode kelurahan_desa_kode, wkd.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_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 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 WHERE wkk.kode = %s ) AS virtual_table GROUP BY jenis ORDER BY "SUM(jumlah)" DESC LIMIT 1000; """ try: cur.execute(SQL, (kode_prov,)) 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 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 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, wkd.id kelurahan_desa_id, wkd.kode kelurahan_desa_kode, wkd.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 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 wkd.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 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 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 WHERE wk.kode = %s ) AS virtual_table GROUP BY jenis ORDER BY "SUM(jumlah)" DESC LIMIT 1000; """ 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(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; """ 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)} @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, wkd.id kelurahan_desa_id, wkd.kode kelurahan_desa_kode, wkd.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 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 wkd.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 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, wkd.id desa_id, wkd.kode kelurahan_desa_kode, wkd.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 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 ) 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,)) 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, 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 ) AS virtual_table GROUP BY jenis ORDER BY "SUM(jumlah)" DESC LIMIT 1000; """ cur.execute(SQL,(kode_desa,)) result = cur.fetchall() return result @staticmethod 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; """ cur.execute(SQL, (kode_desa,)) 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, # wkd.id kelurahan_desa_id, wkd.kode kelurahan_desa_kode, wkd.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 # WHERE wkd.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 wkd.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 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