Compare commits

..

No commits in common. '398a2b14a29d8b8312da1be9b69fe320c3f66b7f' and '0e954d2dc0532e5615c21b83090ad931fa169c56' have entirely different histories.

@ -5,12 +5,18 @@ import sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from config import get_connection # harus mengembalikan koneksi psycopg2
from math import pow
import numpy as np
import numpy_financial as npf
import math
import uuid
import numpy as np
def normalize_db_value(value):
"""Convert numpy scalars to native Python types for psycopg2."""
if isinstance(value, np.generic):
return value.item()
return value
def validate_number(n):
return n if n is not None else 0
@ -64,7 +70,6 @@ def hitung_pv(rate, nper, fv):
def hitung_irr(cashflows: list):
return npf.irr(cashflows)
def getproyeksilinier(years, values, iterations=30, target_years=None):
"""
Jika target_years diberikan (list[int]), fungsi mengembalikan prediksi untuk tahun-tahun tersebut.
@ -126,8 +131,10 @@ def getproyeksilinier(years, values, iterations=30, target_years=None):
return {start_year + i: _predict(start_year + i) for i in range(n_projection)}
def main():
conn = get_connection()
connections = get_connection()
conn = connections[0] if isinstance(connections, tuple) else connections
if conn is None:
print("Koneksi ke database gagal.")
sys.exit(1)
@ -364,7 +371,7 @@ def main():
tahun_cod = get_param("tahun_cod")
daya_terpasang = get_param("daya_terpasang")
equity = get_param("equity")
params = []
revenue_total_array = []
cost_a_acquisition_array = []
@ -396,10 +403,8 @@ def main():
cur.execute("""
SELECT year as tahun, cf, eaf
FROM lcc_ms_year_data
order by year asc
""")
year_rows = cur.fetchall()
print(year_rows)
year_data_map = {int(t): (validate_number(cf), validate_number(eaf)) for (t, cf, eaf) in year_rows if
t is not None}
@ -441,6 +446,7 @@ def main():
revenue_c = price_c * production_netto * 1000 / 1000000
revenue_d = price_d * production_netto * 1000 / 1000000
cost_c_fuel = fuel_consumption * harga_bahan_bakar / 1000000
# default fallback tetap pakai last value kalau tahun kosong / prediksi tidak ada
if yr is not None:
cost_bd_om = proj_cost_bd_om.get(yr, cost_bd_om)
cost_bd_pm_nonmi = proj_cost_bd_pm.get(yr, cost_bd_pm_nonmi)
@ -493,7 +499,8 @@ def main():
+ cost_a_pm
# + cost_a_pinjaman
# + cost_a_depreciation
)
)
else:
cost_a_replacement = 0
cost_a_pm = 0
@ -518,6 +525,7 @@ def main():
cost_a_annualized = 0
cost_disposal_cost = 0
chart_capex_biaya_investasi_tambahan = 0
chart_capex_acquisition_cost = 0
@ -601,7 +609,9 @@ def main():
calc4_free_cash_flow_on_equity_array.append(calc4_free_cash_flow_on_equity)
calc4_discounted_fcf_on_equity = hitung_pv(wacc_on_equity, seq, calc4_free_cash_flow_on_equity)
params.append((
row_params = (
net_capacity_factor,
eaf,
production_bruto,
@ -669,8 +679,9 @@ def main():
chart_capex_acquisition_cost,
chart_capex_annualized,
cost_disposal_cost,
seq # <-- penting: ini untuk WHERE
))
seq # <-- penting: ini untuk WHERE
)
params.append(tuple(normalize_db_value(v) for v in row_params))
# 3. Bulk update dengan executemany
if params:
@ -723,13 +734,15 @@ def main():
conn.close()
except Exception as e:
conn.rollback()
if conn:
conn.rollback()
print(f"Terjadi error, transaksi di-rollback. Error: {e}")
try:
cur.close()
except Exception:
pass
conn.close()
if conn:
conn.close()
if __name__ == "__main__":

Loading…
Cancel
Save