first commit

This commit is contained in:
='fauz
2025-06-29 23:00:50 +07:00
commit 3e2b383e87
42 changed files with 35941 additions and 0 deletions
+11
View File
@@ -0,0 +1,11 @@
from flask import Flask
from app.routes import main
import os
def create_app():
base_dir = os.path.abspath(os.path.dirname(__file__))
template_path = os.path.join(base_dir, '..', 'templates')
static_path = os.path.join(base_dir, '..','static')
app = Flask(__name__, template_folder=template_path, static_folder=static_path)
app.register_blueprint(main)
return app
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1051
View File
File diff suppressed because it is too large Load Diff
+111
View File
@@ -0,0 +1,111 @@
import json
from app.apiController import apiController
def swap_latlon(coords):
# return [[lon, lat] for lat, lon in coords]
# print(coords)
# return [
# [ [lon, lat] for lat, lon in ring ]
# for ring in coords
# ]
return coords
return [
[ # Polygon
[ # Ring
[lon, lat] for lat, lon in ring
] for ring in polygon
] for polygon in coords
]
#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':
old_sql = """
SELECT id, kode, nama, lat, lng,
CONCAT(
REPEAT('[', 4 - (LENGTH(path) - LENGTH(REPLACE(path, '[', '')))),
path,
REPEAT(']', 4 - (LENGTH(path) - LENGTH(REPLACE(path, ']', ''))))
) AS path
FROM wil_provinsi
"""
cur.execute(old_sql)
elif level == 'kabupaten':
cur.execute(""" SELECT id, kode, nama,lat,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,lat,lng,
CONCAT(
REPEAT('[', 4 - (LENGTH(path) - LENGTH(REPLACE(path, '[', '')))),
path,
REPEAT(']', 4 - (LENGTH(path) - LENGTH(REPLACE(path, ']', ''))))
) AS path
FROM wil_kecamatan WHERE kabupatenkota_id = %s""", (parent_code,))
elif level == 'desa':
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
}
+285
View File
@@ -0,0 +1,285 @@
from flask import Blueprint, jsonify, render_template
import psycopg2
from app import mapController
from app.apiController import apiController
from app.utils import toRupiah
import mysql.connector
from contextlib import contextmanager
main = Blueprint('main', __name__)
# conn = mysql.connector.connect(
# host="192.168.91.102",
# database="dbwarehouse",
# user="dwhadmin",
# password="K3m3nd3s4@2025"
# )
@contextmanager
def get_connection():
conn = None
try:
conn = mysql.connector.connect(
# 192.168.91.102
host="localhost",
database="dbwarehouse",
# dwhadmin
user="root",
# K3m3nd3s4@2025
password="asalada123"
)
yield conn
finally:
if conn is not None and conn.is_connected():
conn.close()
#========================================================
# MAIN ROUTE
#========================================================
@main.route('/')
def index():
return render_template('index.html')
@main.route("/geojson/provinsi")
def get_provinsi():
with get_connection() as conn:
data = mapController.fetch_geojson(conn,'provinsi')
return jsonify(data)
@main.route("/geojson/kabupaten/<kode_provinsi>")
def get_kabupaten(kode_provinsi):
with get_connection() as conn:
print("PRovinsi kode: ", kode_provinsi)
data = mapController.fetch_geojson(conn,'kabupaten', kode_provinsi)
return jsonify(data)
@main.route("/geojson/kecamatan/<kode_kabupaten>")
def get_kecamatan(kode_kabupaten):
with get_connection() as conn:
data = mapController.fetch_geojson(conn,'kecamatan', kode_kabupaten)
return jsonify(data)
@main.route("/geojson/desa/<kode_kecamatan>")
def get_desa(kode_kecamatan):
with get_connection() as conn:
data = mapController.fetch_geojson(conn,'desa', kode_kecamatan)
return jsonify(data)
#=========================================================
# API DATA
#=============================================================
@main.route('/api/desa/total-dana-desa')
def get_total_dd():
with get_connection() as conn:
datas = apiController.getTotalPersentaseSerapan(conn)
data = datas['jumlah_per_m']
return jsonify(data)
@main.route("/api/desa/total-serapan-dana")
def get_total_Serapan():
with get_connection() as conn:
data = apiController.getTotalPersentaseSerapan(conn)
return jsonify(data)
@main.route('/api/geojson/<level>')
def get_geojson(level):
print(level)
allowed = ['wil_provinsi', 'wil_kabupaten_kota', 'wil_kecamatan', 'wil_kelurahan_desa']
if level not in allowed:
return jsonify({"error": "Invalid level"}), 400
geojson_data = mapController.fetch_geojson(conn,level)
return jsonify(geojson_data)
#Informasi desa per provinsi
@main.route('/api/status-provinsi/<kode_provinsi>')
def get_status_provinsi(kode_provinsi):
with get_connection() as conn:
data = apiController.getStatusProvinsi(conn,kode_provinsi)
return jsonify(data)
#informasi desa per kabupaten/kota
@main.route('/api/status-kabupatenkota/<kode_prov>/<kode_kabkota>')
def get_status_kabkota(kode_prov, kode_kabkota):
with get_connection() as conn:
data = apiController.getStatusKabkota(conn,kode_prov, kode_kabkota)
return jsonify(data)
#informasi desa per kecamatan
@main.route('/api/status-kecamatan/<kode_provinsi>/<kode_kabupatenkota>/<kode_kecamatan>')
def get_status_kecamatan(kode_provinsi, kode_kabupatenkota, kode_kecamatan):
print(kode_provinsi, kode_kabupatenkota, kode_kecamatan)
with get_connection() as conn:
data = apiController.getStatusKecamatan(conn,kode_provinsi, kode_kabupatenkota, kode_kecamatan)
data = jsonify(data)
return data
@main.route("/api/status-bumdes")
def get_status_bumdes():
with get_connection() as conn:
data = apiController.getBumdes(conn)
return jsonify(data[0])
#informasi bumdes Bersama
@main.route("/api/status-bumdes-bersama")
def get_status_bumdes_bersma():
with get_connection() as conn:
data = apiController.getBumdes(conn)
return jsonify(data[1])
#informasi pendamping
@main.route('/api/pendamping-desa')
def get_pendamping():
with get_connection() as conn:
data = apiController.getPendamping(conn)
return jsonify(data[1])
#informasi pendamping per desa
@main.route('/api/pendamping-per-desa')
def get_pendamping_perdesa():
with get_connection() as conn:
data = apiController.getPendampingPerDesa(conn)
return jsonify(data[0])
#=======================================================================
#=======================================================================
#informasi Koperasi
@main.route('/api/provinsi/koperasi/<kode_prov>')
def get_koperasi_by_provinsi(kode_prov):
with get_connection() as conn:
data = apiController.getDesaDenganAtauTanpaKopmerKab(conn, kode_prov)
return jsonify(data)
@main.route('/api/provinsi/pendamping/<kode_prov>')
def get_pendamping_per_provinsi(kode_prov):
with get_connection() as conn:
data = apiController.getPendampingPerProv(conn, kode_prov)
return jsonify(data)
#informasi bumdes per provinsi
@main.route("/api/provinsi/bumdes/<kode_provinsi>")
def get_status_bumdes_prov(kode_provinsi):
with get_connection() as conn:
data = apiController.getBumdesProv(conn,kode_provinsi)
return jsonify(data)
#informasi serapan per provinsi
@main.route("/api/provinsi/serapan/<kode_provinsi>")
def get_provinsi_serapan(kode_provinsi):
with get_connection() as conn:
data = apiController.getTotalSerapanProv(conn,kode_provinsi)
return jsonify(data)
#=======================================================================
#=======================================================================
#informasi Koperasi
@main.route('/api/kabkota/koperasi/<kode_kabkota>')
def get_koperasi_by_kabkota(kode_kabkota):
with get_connection() as conn:
data = apiController.getDesaDenganAtauTanpaKopmerKab(conn, kode_kabkota)
return jsonify(data)
@main.route('/api/kabkota/pendamping/<kode_kabkota>')
def get_pendamping_per_kabkota(kode_kabkota):
with get_connection() as conn:
data = apiController.getPendampingPerKab(conn, kode_kabkota)
return jsonify(data)
#informasi bumdes
@main.route("/api/kabkota/bumdes/<kode_kabkota>")
def get_status_bumdes_kabkota(kode_kabkota):
with get_connection() as conn:
data = apiController.getBumdesKab(conn,kode_kabkota)
return jsonify(data)
#informasi serapan
@main.route("/api/kabkota/serapan/<kode_kabkota>")
def get_kabkota_serapan(kode_kabkota):
with get_connection() as conn:
data = apiController.getTotalSerapanKab(conn,kode_kabkota)
return jsonify(data)
#=======================================================================
#=======================================================================
#informasi Koperasi
@main.route('/api/kecamatan/koperasi/<kode_kecamatan>')
def get_koperasi_by_kecamatan(kode_kecamatan):
with get_connection() as conn:
data = apiController.getDesaDenganAtauTanpaKopmerKec(conn, kode_kecamatan)
return jsonify(data)
@main.route('/api/kecamatan/pendamping/<kode_kecamatan>')
def get_pendamping_per_kecamatan(kode_kecamatan):
with get_connection() as conn:
data = apiController.getPendampingPerKec(conn, kode_kecamatan)
return jsonify(data)
#informasi bumdes
@main.route("/api/kecamatan/bumdes/<kode_kecamatan>")
def get_status_bumdes_kecamatan(kode_kecamatan):
with get_connection() as conn:
data = apiController.getBumdesKec(conn,kode_kecamatan)
return jsonify(data)
#informasi serapan
@main.route("/api/kecamatan/serapan/<kode_kecamatan>")
def get_kecamatan_serapan(kode_kecamatan):
with get_connection() as conn:
data = apiController.getTotalSerapanKec(conn,kode_kecamatan)
return jsonify(data)
#=======================================================================
#=======================================================================
#informasi Koperasi
@main.route('/api/desa/status/<kode_prov>/<kode_kabkota>/<kode_kecamatan>/<kode_desa>')
def get_status_by_desa(kode_prov, kode_kabkota, kode_kecamatan, kode_desa):
with get_connection() as conn:
data = apiController.getStatusDesaByDesa(conn, kode_prov, kode_kabkota, kode_kecamatan, kode_desa)
return jsonify(data)
@main.route('/api/desa/koperasi/<kode_desa>')
def get_koperasi_by_desa(kode_desa):
data = apiController.getDesaDenganAtauTanpaKopmerDesa(conn, kode_desa)
return jsonify(data)
@main.route('/api/desa/pendamping/<kode_desa>')
def get_pendamping_per_desa(kode_desa):
with get_connection() as conn:
data = apiController.getPendampingPerDesa(conn, kode_desa)
return jsonify(data)
#informasi bumdes
@main.route("/api/desa/bumdes/<kode_desa>")
def get_status_bumdes_desa(kode_desa):
data = apiController.getBumdesDesa(conn,kode_desa)
return jsonify(data)
#informasi serapan
@main.route("/api/desa/serapan/<kode_desa>")
def get_pdesa_serapan(kode_desa):
data = apiController.getTotalSerapanDesa(conn,kode_desa)
return jsonify(data)
#==================
# MASTER
#===============
@main.route('/app/master/provinsi')
def get_master_provinsi():
with get_connection() as conn:
data = apiController.provinsi(conn)
return data
@main.route('/api/master/kabkota')
def get_master_kabkota():
with get_connection() as conn:
data = apiController.kabkota
return jsonify(data)
@main.route('/api/master/kecamatan')
def get_master_kecamatan():
with get_connection() as conn:
data = apiController.kecamatan(conn)
return jsonify(data)
+3
View File
@@ -0,0 +1,3 @@
from babel.numbers import format_currency
def toRupiah(money):
return format_currency(money, 'IDR', locale='id_ID')