diff --git a/src/equipment/__pycache__/model.cpython-311.pyc b/src/equipment/__pycache__/model.cpython-311.pyc index 765df7e..b10150a 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 40ff91a..4726dee 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 46c3bba..3744154 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 1905fec..83de7cf 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 24578ca..3b27bb3 100644 --- a/src/equipment/model.py +++ b/src/equipment/model.py @@ -158,3 +158,38 @@ class EquipmentHistoricalTransactionRecords(Base, DefaultMixin, IdentityMixin): efdh_equivalent_forced_derated_hours = Column(Float, nullable=False) foh_forced_outage_hours = Column(Float, nullable=False) acquisition_year_ref = Column(String, nullable=True) + + +class EquipmentHistoricalMasterData(Base, DefaultMixin, IdentityMixin): + """Historical master data for equipment (archived when acquisition data changes).""" + __tablename__ = "lcc_ms_equipment_historical_data" + + assetnum = Column(String, nullable=False) + acquisition_year = Column(Integer, nullable=False) + acquisition_cost = Column(Float, nullable=False) + capital_cost_record_time = Column(Integer, nullable=True) + design_life = Column(Integer, nullable=True) + forecasting_start_year = Column(Integer, nullable=True) + forecasting_target_year = Column(Integer, nullable=True) + manhours_rate = Column(Float, nullable=True) + harga_saat_ini = Column(Float, nullable=True) + min_eac_info = Column(String, nullable=True) + minimum_eac_seq = Column(Integer, nullable=True) + minimum_eac_year = Column(Integer, nullable=True) + minimum_eac = Column(Float, nullable=True) + minimum_npv = Column(Float, nullable=True) + minimum_pmt = Column(Float, nullable=True) + minimum_pmt_aq_cost = Column(Float, nullable=True) + minimum_is_actual = Column(Integer, nullable=True) + efdh_equivalent_forced_derated_hours = Column(Float, nullable=True) + foh_forced_outage_hours = Column(Float, nullable=True) + category_no = Column(String, nullable=True) + proportion = Column(Float, nullable=True) + acquisition_year_ref = Column(String, nullable=True) + + equipment = relationship( + "Equipment", + lazy="raise", + primaryjoin="and_(EquipmentHistoricalMasterData.assetnum == foreign(Equipment.assetnum))", + viewonly=True, + ) diff --git a/src/equipment/router.py b/src/equipment/router.py index ae1ac28..cbcf66b 100644 --- a/src/equipment/router.py +++ b/src/equipment/router.py @@ -242,10 +242,6 @@ async def get_generated_equipment_transaction(db_session: DbSession, token: Toke message="Equipment transactions generated successfully", ) - - - - @router.get("/{assetnum}", response_model=StandardResponse[EquipmentRead]) async def get_equipment(db_session: DbSession, collector_db_session: CollectorDbSession, assetnum: str): ( @@ -259,7 +255,8 @@ async def get_equipment(db_session: DbSession, collector_db_session: CollectorDb maximo_data, joined_maximo_record, min_eac_disposal_cost, - historical_records + historical_records, + replacement_records, ) = await get_master_by_assetnum(db_session=db_session, collector_db_session=collector_db_session, assetnum=assetnum) # raise Exception(equipment[0]) if not chart_data: @@ -280,7 +277,8 @@ async def get_equipment(db_session: DbSession, collector_db_session: CollectorDb maximo_data=maximo_data, joined_maximo=joined_maximo_record, min_eac_disposal_cost=min_eac_disposal_cost, - historical_data=historical_records + historical_data=historical_records, + replacement_data=replacement_records, ), message="Data retrieved successfully", ) diff --git a/src/equipment/schema.py b/src/equipment/schema.py index c61594b..edd29a9 100644 --- a/src/equipment/schema.py +++ b/src/equipment/schema.py @@ -97,6 +97,13 @@ class EquipmentCreate(EquipmentBase): class EquipmentUpdate(EquipmentBase): pass +class ReplacementBase(DefaultBase): + """Schema for replacement history (from lcc_ms_equipment_historical_data).""" + acquisition_year: Optional[int] = Field(None, nullable=True) + acquisition_cost: Optional[float] = Field(None, nullable=True, le=MAX_PRICE) + acquisition_year_ref: Optional[str] = Field(None, nullable=True) + created_at: Optional[datetime] = Field(None, nullable=True) + class EquipmentRead(DefaultBase): equipment_master_record: EquipmentMasterBase equipment_data: EquipmentBase @@ -109,6 +116,7 @@ class EquipmentRead(DefaultBase): joined_maximo: Optional[List[dict]] = Field(None, nullable=True) min_eac_disposal_cost: Optional[float] = Field(None, nullable=True, le=MAX_PRICE) historical_data: Optional[List[HistoricalBase]] = Field(None, nullable=True) + replacement_data: Optional[List[ReplacementBase]] = Field(None, nullable=True) class EquipmentTop10(EquipmentBase): id: UUID diff --git a/src/equipment/service.py b/src/equipment/service.py index 9c507d0..5a4a8ad 100644 --- a/src/equipment/service.py +++ b/src/equipment/service.py @@ -9,7 +9,7 @@ from sqlalchemy.ext.asyncio import AsyncSession from asyncpg.exceptions import InterfaceError as AsyncpgInterfaceError from src.database.service import search_filter_sort_paginate -from src.equipment.model import Equipment, EquipmentTransactionRecords, EquipmentHistoricalTransactionRecords +from src.equipment.model import Equipment, EquipmentTransactionRecords, EquipmentHistoricalTransactionRecords, EquipmentHistoricalMasterData from src.acquisition_cost.model import AcquisitionData from src.yeardata.model import Yeardata from ..equipment_master.model import EquipmentMaster @@ -311,6 +311,15 @@ async def get_master_by_assetnum( historical_result = await db_session.execute(historical_query) historical_records = historical_result.scalars().all() + # Replacement history query (from lcc_ms_equipment_historical_data) + replacement_query = ( + Select(EquipmentHistoricalMasterData) + .filter(EquipmentHistoricalMasterData.assetnum == assetnum) + .order_by(EquipmentHistoricalMasterData.acquisition_year.asc()) + ) + replacement_result = await db_session.execute(replacement_query) + replacement_records = replacement_result.scalars().all() + return ( equipment_master_record, equipment_record, @@ -323,6 +332,7 @@ async def get_master_by_assetnum( joined_maximo_record, min_eac_disposal_cost, historical_records, + replacement_records ) # return result.scalars().all()