map-controller/app/apiController.py
2025-06-30 12:47:53 +07:00

1057 lines
48 KiB
Python

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;
"""
cur.execute(SQL)
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(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, koordinat 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