diff --git a/src/equipment/__pycache__/service.cpython-311.pyc b/src/equipment/__pycache__/service.cpython-311.pyc index 3e0e7b3..0ca7f41 100644 Binary files a/src/equipment/__pycache__/service.cpython-311.pyc and b/src/equipment/__pycache__/service.cpython-311.pyc differ diff --git a/src/equipment/service.py b/src/equipment/service.py index 1f3a559..50f7b74 100644 --- a/src/equipment/service.py +++ b/src/equipment/service.py @@ -694,30 +694,104 @@ async def update_initial_simulation_data(db_session: DbSession, assetnum: str): current_acq = eq.acquisition_year current_life = eq.design_life current_target = eq.forecasting_target_year + current_acq_cost = eq.acquisition_cost # If current_target is logically "default", we update it. - # If user changed it to something else, we might want to preserve it? - # User request: "must be default acquisition_year+design_life if not changes" - # We interpret "if not changes" as: if it currently holds the default value (based on old acq year). + # If user changed it to something else, we might want to preserve it + # if it currently holds the default value (based on old acq year). is_valid_default = False if current_acq and current_life and current_target: is_valid_default = current_target == (current_acq + current_life) - updates_needed = False + # Check for changes + change_year = (eq.acquisition_year != first_year) + change_cost = (first_cost is not None and eq.acquisition_cost != first_cost) - # Update acquisition_cost - if first_cost is not None and eq.acquisition_cost != first_cost: - eq.acquisition_cost = first_cost - updates_needed = True - - # Update acquisition_year - if eq.acquisition_year != first_year: - eq.acquisition_year = first_year - updates_needed = True + if change_year or change_cost: + print(f"Acquisition change detected for {assetnum}: Year {current_acq}->{first_year}, Cost {current_acq_cost}->{first_cost}. Archiving history.") - if is_valid_default and current_life: - eq.forecasting_target_year = first_year + current_life + acq_year_ref = f"{current_acq}_{current_target}" + + # --- ARCHIVE HISTORICAL DATA --- + + # 1. Copy old equipment master data to history + history_ms_query = text(""" + INSERT INTO lcc_ms_equipment_historical_data ( + id, assetnum, acquisition_year, acquisition_cost, capital_cost_record_time, design_life, + forecasting_start_year, forecasting_target_year, manhours_rate, created_at, created_by, + updated_at, updated_by, min_eac_info, harga_saat_ini, minimum_eac_seq, minimum_eac_year, + minimum_eac, minimum_npv, minimum_pmt, minimum_pmt_aq_cost, minimum_is_actual, + efdh_equivalent_forced_derated_hours, foh_forced_outage_hours, category_no, proportion, + acquisition_year_ref + ) + SELECT + uuid_generate_v4(), assetnum, acquisition_year, acquisition_cost, capital_cost_record_time, design_life, + forecasting_start_year, forecasting_target_year, manhours_rate, created_at, created_by, + updated_at, updated_by, min_eac_info, harga_saat_ini, minimum_eac_seq, minimum_eac_year, + minimum_eac, minimum_npv, minimum_pmt, minimum_pmt_aq_cost, minimum_is_actual, + efdh_equivalent_forced_derated_hours, foh_forced_outage_hours, category_no, proportion, + :acq_year_ref + FROM lcc_ms_equipment_data + WHERE assetnum = :assetnum + """) + await db_session.execute(history_ms_query, {"acq_year_ref": acq_year_ref, "assetnum": assetnum}) + + # 2. Copy old transaction data to lcc_equipment_historical_tr_data + # Format: {acquisition_year}_{forecasting_target_year} + + history_tr_query = text(""" + INSERT INTO lcc_equipment_historical_tr_data ( + id, assetnum, tahun, seq, is_actual, + raw_cm_interval, raw_cm_material_cost, raw_cm_labor_time, raw_cm_labor_human, + raw_pm_interval, raw_pm_material_cost, raw_pm_labor_time, raw_pm_labor_human, + raw_oh_interval, raw_oh_material_cost, raw_oh_labor_time, raw_oh_labor_human, + raw_predictive_interval, raw_predictive_material_cost, raw_predictive_labor_time, raw_predictive_labor_human, + raw_project_task_material_cost, raw_loss_output_MW, raw_loss_output_price, + raw_operational_cost, raw_maintenance_cost, + rc_cm_material_cost, rc_cm_labor_cost, + rc_pm_material_cost, rc_pm_labor_cost, + rc_oh_material_cost, rc_oh_labor_cost, + rc_predictive_labor_cost, + rc_project_material_cost, rc_lost_cost, rc_operation_cost, rc_maintenance_cost, + rc_total_cost, + eac_npv, eac_annual_mnt_cost, eac_annual_acq_cost, eac_disposal_cost, eac_eac, + efdh_equivalent_forced_derated_hours, foh_forced_outage_hours, + created_by, created_at, acquisition_year_ref + ) + SELECT + uuid_generate_v4(), assetnum, tahun, seq, is_actual, + raw_cm_interval, raw_cm_material_cost, raw_cm_labor_time, raw_cm_labor_human, + raw_pm_interval, raw_pm_material_cost, raw_pm_labor_time, raw_pm_labor_human, + raw_oh_interval, raw_oh_material_cost, raw_oh_labor_time, raw_oh_labor_human, + raw_predictive_interval, raw_predictive_material_cost, raw_predictive_labor_time, raw_predictive_labor_human, + raw_project_task_material_cost, raw_loss_output_MW, raw_loss_output_price, + raw_operational_cost, raw_maintenance_cost, + rc_cm_material_cost, rc_cm_labor_cost, + rc_pm_material_cost, rc_pm_labor_cost, + rc_oh_material_cost, rc_oh_labor_cost, + rc_predictive_labor_cost, + rc_project_material_cost, rc_lost_cost, rc_operation_cost, rc_maintenance_cost, + rc_total_cost, + eac_npv, eac_annual_mnt_cost, eac_annual_acq_cost, eac_disposal_cost, eac_eac, + efdh_equivalent_forced_derated_hours, foh_forced_outage_hours, + created_by, NOW(), :acq_year_ref + FROM lcc_equipment_tr_data + WHERE assetnum = :assetnum + """) + await db_session.execute(history_tr_query, {"acq_year_ref": acq_year_ref, "assetnum": assetnum}) + + # 3. Delete old data + del_query = text("DELETE FROM lcc_equipment_tr_data WHERE assetnum = :assetnum") + await db_session.execute(del_query, {"assetnum": assetnum}) + + # Update Equipment Master + if first_cost is not None and eq.acquisition_cost != first_cost: + eq.acquisition_cost = first_cost + + if eq.acquisition_year != first_year: + eq.acquisition_year = first_year + if is_valid_default and current_life: + eq.forecasting_target_year = first_year + current_life - if updates_needed: await db_session.commit() # await db_session.refresh(eq)