feat: Introduce `EquipmentHistoricalMasterData` model and expose replacement history in equipment details.

rest-api
MrWaradana 1 month ago
parent 8913ba6611
commit f381a46186

@ -158,3 +158,38 @@ class EquipmentHistoricalTransactionRecords(Base, DefaultMixin, IdentityMixin):
efdh_equivalent_forced_derated_hours = Column(Float, nullable=False) efdh_equivalent_forced_derated_hours = Column(Float, nullable=False)
foh_forced_outage_hours = Column(Float, nullable=False) foh_forced_outage_hours = Column(Float, nullable=False)
acquisition_year_ref = Column(String, nullable=True) 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,
)

@ -242,10 +242,6 @@ async def get_generated_equipment_transaction(db_session: DbSession, token: Toke
message="Equipment transactions generated successfully", message="Equipment transactions generated successfully",
) )
@router.get("/{assetnum}", response_model=StandardResponse[EquipmentRead]) @router.get("/{assetnum}", response_model=StandardResponse[EquipmentRead])
async def get_equipment(db_session: DbSession, collector_db_session: CollectorDbSession, assetnum: str): 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, maximo_data,
joined_maximo_record, joined_maximo_record,
min_eac_disposal_cost, 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) ) = await get_master_by_assetnum(db_session=db_session, collector_db_session=collector_db_session, assetnum=assetnum)
# raise Exception(equipment[0]) # raise Exception(equipment[0])
if not chart_data: if not chart_data:
@ -280,7 +277,8 @@ async def get_equipment(db_session: DbSession, collector_db_session: CollectorDb
maximo_data=maximo_data, maximo_data=maximo_data,
joined_maximo=joined_maximo_record, joined_maximo=joined_maximo_record,
min_eac_disposal_cost=min_eac_disposal_cost, min_eac_disposal_cost=min_eac_disposal_cost,
historical_data=historical_records historical_data=historical_records,
replacement_data=replacement_records,
), ),
message="Data retrieved successfully", message="Data retrieved successfully",
) )

@ -97,6 +97,13 @@ class EquipmentCreate(EquipmentBase):
class EquipmentUpdate(EquipmentBase): class EquipmentUpdate(EquipmentBase):
pass 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): class EquipmentRead(DefaultBase):
equipment_master_record: EquipmentMasterBase equipment_master_record: EquipmentMasterBase
equipment_data: EquipmentBase equipment_data: EquipmentBase
@ -109,6 +116,7 @@ class EquipmentRead(DefaultBase):
joined_maximo: Optional[List[dict]] = Field(None, nullable=True) joined_maximo: Optional[List[dict]] = Field(None, nullable=True)
min_eac_disposal_cost: Optional[float] = Field(None, nullable=True, le=MAX_PRICE) min_eac_disposal_cost: Optional[float] = Field(None, nullable=True, le=MAX_PRICE)
historical_data: Optional[List[HistoricalBase]] = Field(None, nullable=True) historical_data: Optional[List[HistoricalBase]] = Field(None, nullable=True)
replacement_data: Optional[List[ReplacementBase]] = Field(None, nullable=True)
class EquipmentTop10(EquipmentBase): class EquipmentTop10(EquipmentBase):
id: UUID id: UUID

@ -9,7 +9,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
from asyncpg.exceptions import InterfaceError as AsyncpgInterfaceError from asyncpg.exceptions import InterfaceError as AsyncpgInterfaceError
from src.database.service import search_filter_sort_paginate 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.acquisition_cost.model import AcquisitionData
from src.yeardata.model import Yeardata from src.yeardata.model import Yeardata
from ..equipment_master.model import EquipmentMaster 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_result = await db_session.execute(historical_query)
historical_records = historical_result.scalars().all() 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 ( return (
equipment_master_record, equipment_master_record,
equipment_record, equipment_record,
@ -323,6 +332,7 @@ async def get_master_by_assetnum(
joined_maximo_record, joined_maximo_record,
min_eac_disposal_cost, min_eac_disposal_cost,
historical_records, historical_records,
replacement_records
) )
# return result.scalars().all() # return result.scalars().all()

Loading…
Cancel
Save