diff --git a/src/equipment/__pycache__/model.cpython-311.pyc b/src/equipment/__pycache__/model.cpython-311.pyc index e7bc790..06ea0b0 100644 Binary files a/src/equipment/__pycache__/model.cpython-311.pyc and b/src/equipment/__pycache__/model.cpython-311.pyc differ diff --git a/src/equipment/__pycache__/router.cpython-311.pyc b/src/equipment/__pycache__/router.cpython-311.pyc index 72c5312..d70c62c 100644 Binary files a/src/equipment/__pycache__/router.cpython-311.pyc and b/src/equipment/__pycache__/router.cpython-311.pyc differ diff --git a/src/equipment/__pycache__/schema.cpython-311.pyc b/src/equipment/__pycache__/schema.cpython-311.pyc index 4d2972e..754cd1c 100644 Binary files a/src/equipment/__pycache__/schema.cpython-311.pyc and b/src/equipment/__pycache__/schema.cpython-311.pyc differ diff --git a/src/equipment/__pycache__/service.cpython-311.pyc b/src/equipment/__pycache__/service.cpython-311.pyc index 03dd30b..778a0a2 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/model.py b/src/equipment/model.py index 4c654a4..0c74809 100644 --- a/src/equipment/model.py +++ b/src/equipment/model.py @@ -38,40 +38,40 @@ class MasterRecords(Base, DefaultMixin, IdentityMixin): # ) assetnum = Column(String, nullable=False) - tahun = Column(String, nullable=False) - seq = Column(String, nullable=False) - is_actual = Column(String, nullable=False) - raw_cm_interval = Column(String, nullable=False) - raw_cm_material_cost = Column(String, nullable=False) - raw_cm_labor_time = Column(String, nullable=False) - raw_cm_labor_human = Column(String, nullable=False) - raw_pm_interval = Column(String, nullable=False) - raw_pm_material_cost = Column(String, nullable=False) - raw_pm_labor_time = Column(String, nullable=False) - raw_pm_labor_human = Column(String, nullable=False) - raw_predictive_labor_time = Column(String, nullable=False) - raw_predictive_labor_human = Column(String, nullable=False) - raw_oh_material_cost = Column(String, nullable=False) - raw_oh_labor_time = Column(String, nullable=False) - raw_oh_labor_human = Column(String, nullable=False) - raw_project_task_material_cost = Column(String, nullable=False) - raw_loss_output_MW = Column(String, nullable=False) - raw_loss_output_price = Column(String, nullable=False) - raw_operational_cost = Column(String, nullable=False) - raw_maintenance_cost = Column(String, nullable=False) - rc_cm_material_cost = Column(String, nullable=False) - rc_cm_labor_cost = Column(String, nullable=False) - rc_pm_material_cost = Column(String, nullable=False) - rc_pm_labor_cost = Column(String, nullable=False) - rc_predictive_labor_cost = Column(String, nullable=False) - rc_oh_material_cost = Column(String, nullable=False) - rc_oh_labor_cost = Column(String, nullable=False) - rc_project_material_cost = Column(String, nullable=False) - rc_lost_cost = Column(String, nullable=False) - rc_operation_cost = Column(String, nullable=False) - rc_maintenance_cost = Column(String, nullable=False) - rc_total_cost = Column(String, nullable=False) - eac_npv = Column(String, nullable=False) - eac_annual_mnt_cost = Column(String, nullable=False) - eac_annual_acq_cost = Column(String, nullable=False) - eac_eac = Column(String, nullable=False) + tahun = Column(Integer, nullable=False) + seq = Column(Integer, nullable=False) + is_actual = Column(Integer, nullable=False) + raw_cm_interval = Column(Float, nullable=False) + raw_cm_material_cost = Column(Float, nullable=False) + raw_cm_labor_time = Column(Float, nullable=False) + raw_cm_labor_human = Column(Float, nullable=False) + raw_pm_interval = Column(Float, nullable=False) + raw_pm_material_cost = Column(Float, nullable=False) + raw_pm_labor_time = Column(Float, nullable=False) + raw_pm_labor_human = Column(Float, nullable=False) + raw_predictive_labor_time = Column(Float, nullable=False) + raw_predictive_labor_human = Column(Float, nullable=False) + raw_oh_material_cost = Column(Float, nullable=False) + raw_oh_labor_time = Column(Float, nullable=False) + raw_oh_labor_human = Column(Float, nullable=False) + raw_project_task_material_cost = Column(Float, nullable=False) + raw_loss_output_MW = Column(Float, nullable=False) + raw_loss_output_price = Column(Float, nullable=False) + raw_operational_cost = Column(Float, nullable=False) + raw_maintenance_cost = Column(Float, nullable=False) + rc_cm_material_cost = Column(Float, nullable=False) + rc_cm_labor_cost = Column(Float, nullable=False) + rc_pm_material_cost = Column(Float, nullable=False) + rc_pm_labor_cost = Column(Float, nullable=False) + rc_predictive_labor_cost = Column(Float, nullable=False) + rc_oh_material_cost = Column(Float, nullable=False) + rc_oh_labor_cost = Column(Float, nullable=False) + rc_project_material_cost = Column(Float, nullable=False) + rc_lost_cost = Column(Float, nullable=False) + rc_operation_cost = Column(Float, nullable=False) + rc_maintenance_cost = Column(Float, nullable=False) + rc_total_cost = Column(Float, nullable=False) + eac_npv = Column(Float, nullable=False) + eac_annual_mnt_cost = Column(Float, nullable=False) + eac_annual_acq_cost = Column(Float, nullable=False) + eac_eac = Column(Float, nullable=False) diff --git a/src/equipment/router.py b/src/equipment/router.py index cd04937..07a7340 100644 --- a/src/equipment/router.py +++ b/src/equipment/router.py @@ -48,9 +48,14 @@ async def get_equipment_tree(): @router.get("/{assetnum}", response_model=StandardResponse[EquipmentRead]) async def get_equipment(db_session: DbSession, assetnum: str): - equipment_master_record, equipment_data, chart_data, min_eac_value, min_seq = ( - await get_master_by_assetnum(db_session=db_session, assetnum=assetnum) - ) + ( + equipment_master_record, + equipment_data, + chart_data, + min_eac_value, + min_seq, + last_actual_year, + ) = await get_master_by_assetnum(db_session=db_session, assetnum=assetnum) # raise Exception(equipment[0]) if not chart_data: raise HTTPException( @@ -65,6 +70,7 @@ async def get_equipment(db_session: DbSession, assetnum: str): chart_data=chart_data, min_eac_value=min_eac_value, min_seq=min_seq, + last_actual_year=last_actual_year, ), message="Data retrieved successfully", ) diff --git a/src/equipment/schema.py b/src/equipment/schema.py index 4e879a8..0ccbf81 100644 --- a/src/equipment/schema.py +++ b/src/equipment/schema.py @@ -28,8 +28,8 @@ class EquipmentMasterBase(DefaultBase): class MasterBase(DefaultBase): assetnum: Optional[str] = Field(None, nullable=True) - tahun: Optional[float] = Field(None, nullable=True) - seq: Optional[float] = Field(None, nullable=True) + tahun: Optional[int] = Field(None, nullable=True) + seq: Optional[int] = Field(None, nullable=True) is_actual: Optional[float] = Field(None, nullable=True) raw_cm_interval: Optional[float] = Field(None, nullable=True) raw_cm_material_cost: Optional[float] = Field(None, nullable=True) @@ -81,6 +81,7 @@ class EquipmentRead(DefaultBase): chart_data: List[MasterBase] min_eac_value: Optional[float] = Field(None, nullable=True) min_seq: Optional[float] = Field(None, nullable=True) + last_actual_year: Optional[int] = Field(None, nullable=True) class EquipmentDataMaster(EquipmentBase): diff --git a/src/equipment/service.py b/src/equipment/service.py index e35e224..5fac574 100644 --- a/src/equipment/service.py +++ b/src/equipment/service.py @@ -4,7 +4,7 @@ from sqlalchemy.orm import selectinload from src.database.service import search_filter_sort_paginate from .model import Equipment, MasterRecords from ..equipment_master.model import EquipmentMaster -from .schema import EquipmentCreate, EquipmentUpdate +from .schema import EquipmentCreate, EquipmentUpdate, MasterBase from typing import Optional from src.database.core import DbSession @@ -37,6 +37,16 @@ async def get_master_by_assetnum( master_result = await db_session.execute(master_query) records = master_result.scalars().all() + # Get the last actual year + last_actual_year_query = ( + Select(func.max(MasterRecords.tahun)) + .join(MasterRecords.equipment) + .filter(Equipment.assetnum == assetnum) + .filter(MasterRecords.is_actual == 1) + ) + last_actual_year_result = await db_session.execute(last_actual_year_query) + last_actual_year = last_actual_year_result.scalar() + # Third query specifically for minimum eac_eac min_query = ( Select(func.min(func.cast(MasterRecords.eac_eac, Float)), MasterRecords.seq) @@ -53,7 +63,7 @@ async def get_master_by_assetnum( ) min_seq = min_record[1] if min_record else None - return equipment_master_record, equipment_record, records, min_eac_value, min_seq + return equipment_master_record, equipment_record, records, min_eac_value, min_seq, last_actual_year # return result.scalars().all() @@ -81,11 +91,77 @@ async def get_all( return result +async def generate_transaction(*, db_session: DbSession, data_in: EquipmentCreate): + # Delete all existing master records for this asset number and prediction data + query = ( + Delete(MasterRecords) + .where(MasterRecords.assetnum == data_in.assetnum) + .where(MasterRecords.is_actual == 0) + ) + await db_session.execute(query) + await db_session.commit() + """Generate transaction for equipment.""" + base_transaction = { + "assetnum": data_in.assetnum, + "is_actual": 0, + "raw_cm_interval": None, + "raw_cm_material_cost": None, + "raw_cm_labor_time": None, + "raw_cm_labor_human": None, + "raw_pm_interval": None, + "raw_pm_material_cost": None, + "raw_pm_labor_time": None, + "raw_pm_labor_human": None, + "raw_predictive_labor_time": None, + "raw_predictive_labor_human": None, + "raw_oh_material_cost": None, + "raw_oh_labor_time": None, + "raw_oh_labor_human": None, + "raw_project_task_material_cost": None, + "raw_loss_output_MW": None, + "raw_loss_output_price": None, + "raw_operational_cost": None, + "raw_maintenance_cost": None, + "rc_cm_material_cost": None, + "rc_cm_labor_cost": None, + "rc_pm_material_cost": None, + "rc_pm_labor_cost": None, + "rc_predictive_labor_cost": None, + "rc_oh_material_cost": None, + "rc_oh_labor_cost": None, + "rc_project_material_cost": None, + "rc_lost_cost": None, + "rc_operation_cost": None, + "rc_maintenance_cost": None, + "rc_total_cost": None, + "eac_npv": None, + "eac_annual_mnt_cost": None, + "eac_annual_acq_cost": None, + "eac_eac": None, + } + + transactions = [] + + for sequence, year in enumerate( + range(data_in.acquisition_year - 1, data_in.forecasting_target_year + 1), 0 + ): + transaction = base_transaction.copy() + transaction.update({"tahun": int(year), "seq": int(sequence)}) + transactions.append(MasterRecords(**transaction)) + + db_session.add_all(transactions) + await db_session.commit() + + # Return the number of transactions created + return len(transactions) + + async def create(*, db_session: DbSession, equipment_in: EquipmentCreate): """Creates a new document.""" equipment = Equipment(**equipment_in.model_dump()) db_session.add(equipment) await db_session.commit() + await generate_transaction(db_session=db_session, data_in=equipment_in) return equipment