diff --git a/src/modules/plant/run_plant_simulation.py b/src/modules/plant/run_plant_simulation.py index e11efa7..0da9040 100644 --- a/src/modules/plant/run_plant_simulation.py +++ b/src/modules/plant/run_plant_simulation.py @@ -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 = [