fix the simulation tables used

main
MrWaradana 2 weeks ago
parent 37a67c2fd2
commit 835224a854

@ -144,22 +144,32 @@ def main():
try: try:
conn.autocommit = False conn.autocommit = False
except Exception: except Exception:
# Kalau driver tidak punya autocommit, abaikan
pass pass
cur = conn.cursor() cur = conn.cursor()
# Check for simulation ID
simulation_id = os.environ.get("PLANT_SIMULATION_ID")
is_simulation = bool(simulation_id)
table_master = "lcc_ms_master_simulations" if is_simulation else "lcc_ms_master"
table_tr_data = "lcc_plant_tr_data_simulations" if is_simulation else "lcc_plant_tr_data"
def get_filter_where():
return f"WHERE simulation_id = '{simulation_id}'" if is_simulation else ""
def get_filter_and():
return f"AND simulation_id = '{simulation_id}'" if is_simulation else ""
# ### LOCKING: kunci tabel lcc_plant_tr_data # ### LOCKING: kunci tabel lcc_plant_tr_data
# Mode SHARE ROW EXCLUSIVE: cur.execute(f"LOCK TABLE {table_tr_data} IN SHARE ROW EXCLUSIVE MODE")
# - Menghalangi INSERT/UPDATE/DELETE di tabel ini
# - Menghalangi lock SHARE ROW EXCLUSIVE lain → script ngantri satu per satu
cur.execute("LOCK TABLE lcc_plant_tr_data IN SHARE ROW EXCLUSIVE MODE")
# 0 Mendapatkan master parameter dari tabel lcc_ms_master # 0 Mendapatkan master parameter dari tabel master
cur.execute(""" cur.execute(f"""
SELECT name, SELECT name,
value_num AS value value_num AS value
FROM lcc_ms_master FROM {table_master}
{get_filter_where()}
""") """)
param_rows = cur.fetchall() param_rows = cur.fetchall()
param_map = {name: val for (name, val) in param_rows} param_map = {name: val for (name, val) in param_rows}
@ -171,18 +181,18 @@ def main():
# 0-1 Generate New data Projection (is_actual=0) if not exist # 0-1 Generate New data Projection (is_actual=0) if not exist
# Hapus data projection lama (is_actual = 0) # Hapus data projection lama (is_actual = 0)
cur.execute(""" cur.execute(f"""
DELETE DELETE
FROM lcc_plant_tr_data FROM {table_tr_data}
WHERE is_actual = 0 WHERE is_actual = 0 {get_filter_and()}
""") """)
# Hitung kebutuhan jumlah baris projection baru agar total (actual + projection) # Hitung kebutuhan jumlah baris projection baru agar total (actual + projection)
# sama dengan parameter umur_teknis # sama dengan parameter umur_teknis
cur.execute(""" cur.execute(f"""
SELECT COALESCE(COUNT(*), 0) SELECT COALESCE(COUNT(*), 0)
FROM lcc_plant_tr_data FROM {table_tr_data}
WHERE is_actual = 1 WHERE is_actual = 1 {get_filter_and()}
""") """)
count_actual = cur.fetchone()[0] if cur.rowcount != -1 else 0 count_actual = cur.fetchone()[0] if cur.rowcount != -1 else 0
@ -190,10 +200,10 @@ def main():
proj_needed = max(0, umur_teknis - int(count_actual)) proj_needed = max(0, umur_teknis - int(count_actual))
# Ambil seq dan tahun terakhir sebagai titik awal penomoran berikutnya # Ambil seq dan tahun terakhir sebagai titik awal penomoran berikutnya
cur.execute("SELECT COALESCE(MAX(seq), 0) FROM lcc_plant_tr_data") cur.execute(f"SELECT COALESCE(MAX(seq), 0) FROM {table_tr_data} {get_filter_where()}")
last_seq = int(cur.fetchone()[0]) last_seq = int(cur.fetchone()[0])
cur.execute("SELECT COALESCE(MAX(tahun), 0) FROM lcc_plant_tr_data") cur.execute(f"SELECT COALESCE(MAX(tahun), 0) FROM {table_tr_data} {get_filter_where()}")
last_year = int(cur.fetchone()[0]) last_year = int(cur.fetchone()[0])
# Jika belum ada tahun sama sekali, gunakan tahun_cod-1 sebagai dasar # Jika belum ada tahun sama sekali, gunakan tahun_cod-1 sebagai dasar
@ -213,17 +223,24 @@ def main():
next_seq += 1 next_seq += 1
next_year += 1 next_year += 1
insert_sql = ( if is_simulation:
"INSERT INTO lcc_plant_tr_data (id, seq, tahun, is_actual, created_at, created_by) " insert_sql = (
"VALUES (%s, %s, %s, 0, CURRENT_TIMESTAMP, 'SYS')" f"INSERT INTO {table_tr_data} (id, seq, tahun, is_actual, created_at, created_by, simulation_id) "
) f"VALUES (%s, %s, %s, 0, CURRENT_TIMESTAMP, 'SYS', '{simulation_id}')"
)
else:
insert_sql = (
f"INSERT INTO {table_tr_data} (id, seq, tahun, is_actual, created_at, created_by) "
"VALUES (%s, %s, %s, 0, CURRENT_TIMESTAMP, 'SYS')"
)
cur.executemany(insert_sql, values) cur.executemany(insert_sql, values)
# 1. Ambil data awal # 1. Ambil data awal
select_sql = """ select_sql = f"""
SELECT * SELECT *
FROM lcc_plant_tr_data FROM {table_tr_data}
ORDER BY seq \ {get_filter_where()}
ORDER BY seq
""" """
cur.execute(select_sql) cur.execute(select_sql)
@ -268,8 +285,8 @@ def main():
print(f"Jumlah baris yang akan di-update: {len(rows)}") print(f"Jumlah baris yang akan di-update: {len(rows)}")
# 2. Siapkan data untuk bulk UPDATE # 2. Siapkan data untuk bulk UPDATE
update_sql = """ update_sql = f"""
UPDATE lcc_plant_tr_data UPDATE {table_tr_data}
SET net_capacity_factor = %s, SET net_capacity_factor = %s,
eaf = %s, eaf = %s,
production_bruto = %s, production_bruto = %s,
@ -337,7 +354,7 @@ def main():
chart_capex_acquisition_cost = %s, chart_capex_acquisition_cost = %s,
chart_capex_annualized = %s, chart_capex_annualized = %s,
cost_disposal_cost = %s cost_disposal_cost = %s
WHERE seq = %s \ WHERE seq = %s {get_filter_and()}
""" """
# Ambil parameter dari tabel (fungsi get_param sudah kamu buat sebelumnya) # Ambil parameter dari tabel (fungsi get_param sudah kamu buat sebelumnya)
@ -724,10 +741,10 @@ def main():
ROA_TO_L = sum(calc2_earning_after_tax_array_sampai_sekarang) / sum( ROA_TO_L = sum(calc2_earning_after_tax_array_sampai_sekarang) / sum(
total_residual_value_array_sampai_sekarang) * 100 # dalam % total_residual_value_array_sampai_sekarang) * 100 # dalam %
update_kpi_sql = """ update_kpi_sql = f"""
UPDATE lcc_ms_master UPDATE {table_master}
SET value_num = %s SET value_num = %s
WHERE name = %s \ WHERE name = %s {get_filter_and()}
""" """
kpi_params_raw = [ kpi_params_raw = [

Loading…
Cancel
Save