|
|
|
|
@ -144,22 +144,32 @@ def main():
|
|
|
|
|
try:
|
|
|
|
|
conn.autocommit = False
|
|
|
|
|
except Exception:
|
|
|
|
|
# Kalau driver tidak punya autocommit, abaikan
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
# Mode SHARE ROW EXCLUSIVE:
|
|
|
|
|
# - 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")
|
|
|
|
|
cur.execute(f"LOCK TABLE {table_tr_data} IN SHARE ROW EXCLUSIVE MODE")
|
|
|
|
|
|
|
|
|
|
# 0 Mendapatkan master parameter dari tabel lcc_ms_master
|
|
|
|
|
cur.execute("""
|
|
|
|
|
# 0 Mendapatkan master parameter dari tabel master
|
|
|
|
|
cur.execute(f"""
|
|
|
|
|
SELECT name,
|
|
|
|
|
value_num AS value
|
|
|
|
|
FROM lcc_ms_master
|
|
|
|
|
FROM {table_master}
|
|
|
|
|
{get_filter_where()}
|
|
|
|
|
""")
|
|
|
|
|
param_rows = cur.fetchall()
|
|
|
|
|
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
|
|
|
|
|
# Hapus data projection lama (is_actual = 0)
|
|
|
|
|
cur.execute("""
|
|
|
|
|
cur.execute(f"""
|
|
|
|
|
DELETE
|
|
|
|
|
FROM lcc_plant_tr_data
|
|
|
|
|
WHERE is_actual = 0
|
|
|
|
|
FROM {table_tr_data}
|
|
|
|
|
WHERE is_actual = 0 {get_filter_and()}
|
|
|
|
|
""")
|
|
|
|
|
|
|
|
|
|
# Hitung kebutuhan jumlah baris projection baru agar total (actual + projection)
|
|
|
|
|
# sama dengan parameter umur_teknis
|
|
|
|
|
cur.execute("""
|
|
|
|
|
cur.execute(f"""
|
|
|
|
|
SELECT COALESCE(COUNT(*), 0)
|
|
|
|
|
FROM lcc_plant_tr_data
|
|
|
|
|
WHERE is_actual = 1
|
|
|
|
|
FROM {table_tr_data}
|
|
|
|
|
WHERE is_actual = 1 {get_filter_and()}
|
|
|
|
|
""")
|
|
|
|
|
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))
|
|
|
|
|
|
|
|
|
|
# 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])
|
|
|
|
|
|
|
|
|
|
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])
|
|
|
|
|
|
|
|
|
|
# Jika belum ada tahun sama sekali, gunakan tahun_cod-1 sebagai dasar
|
|
|
|
|
@ -213,17 +223,24 @@ def main():
|
|
|
|
|
next_seq += 1
|
|
|
|
|
next_year += 1
|
|
|
|
|
|
|
|
|
|
insert_sql = (
|
|
|
|
|
"INSERT INTO lcc_plant_tr_data (id, seq, tahun, is_actual, created_at, created_by) "
|
|
|
|
|
"VALUES (%s, %s, %s, 0, CURRENT_TIMESTAMP, 'SYS')"
|
|
|
|
|
)
|
|
|
|
|
if is_simulation:
|
|
|
|
|
insert_sql = (
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
# 1. Ambil data awal
|
|
|
|
|
select_sql = """
|
|
|
|
|
select_sql = f"""
|
|
|
|
|
SELECT *
|
|
|
|
|
FROM lcc_plant_tr_data
|
|
|
|
|
ORDER BY seq \
|
|
|
|
|
FROM {table_tr_data}
|
|
|
|
|
{get_filter_where()}
|
|
|
|
|
ORDER BY seq
|
|
|
|
|
"""
|
|
|
|
|
cur.execute(select_sql)
|
|
|
|
|
|
|
|
|
|
@ -268,8 +285,8 @@ def main():
|
|
|
|
|
print(f"Jumlah baris yang akan di-update: {len(rows)}")
|
|
|
|
|
|
|
|
|
|
# 2. Siapkan data untuk bulk UPDATE
|
|
|
|
|
update_sql = """
|
|
|
|
|
UPDATE lcc_plant_tr_data
|
|
|
|
|
update_sql = f"""
|
|
|
|
|
UPDATE {table_tr_data}
|
|
|
|
|
SET net_capacity_factor = %s,
|
|
|
|
|
eaf = %s,
|
|
|
|
|
production_bruto = %s,
|
|
|
|
|
@ -337,7 +354,7 @@ def main():
|
|
|
|
|
chart_capex_acquisition_cost = %s,
|
|
|
|
|
chart_capex_annualized = %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)
|
|
|
|
|
@ -724,10 +741,10 @@ def main():
|
|
|
|
|
ROA_TO_L = sum(calc2_earning_after_tax_array_sampai_sekarang) / sum(
|
|
|
|
|
total_residual_value_array_sampai_sekarang) * 100 # dalam %
|
|
|
|
|
|
|
|
|
|
update_kpi_sql = """
|
|
|
|
|
UPDATE lcc_ms_master
|
|
|
|
|
update_kpi_sql = f"""
|
|
|
|
|
UPDATE {table_master}
|
|
|
|
|
SET value_num = %s
|
|
|
|
|
WHERE name = %s \
|
|
|
|
|
WHERE name = %s {get_filter_and()}
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
kpi_params_raw = [
|
|
|
|
|
|