diff --git a/src/equipment/__pycache__/router.cpython-311.pyc b/src/equipment/__pycache__/router.cpython-311.pyc index b42a9ed..234e8a8 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 86ca1f8..8e257be 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 0c970e4..ea6d475 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/router.py b/src/equipment/router.py index a27006c..023defe 100644 --- a/src/equipment/router.py +++ b/src/equipment/router.py @@ -7,6 +7,7 @@ from .schema import ( EquipmentPagination, EquipmentRead, EquipmentCreate, + EquipmentTop10EconomicLife, EquipmentUpdate, ) from .service import ( @@ -17,6 +18,7 @@ from .service import ( update, delete, generate_all_transaction, + get_top_10_economic_life, ) from src.database.service import CommonParameters, search_filter_sort_paginate @@ -48,6 +50,18 @@ async def get_equipments( ) +@router.get( + "/top-10-economic-life", + response_model=StandardResponse[List[EquipmentTop10EconomicLife]], +) +async def get_calculated_top_10_economic_life(db_session: DbSession): + equipment_data = await get_top_10_economic_life(db_session=db_session) + return StandardResponse( + data=equipment_data, + message="Top 10 Economic Life Data retrieved successfully", + ) + + @router.get("/tree", response_model=StandardResponse[EquipmentRead]) async def get_equipment_tree(): """Get as tree structure.""" diff --git a/src/equipment/schema.py b/src/equipment/schema.py index 21ebfff..5e2094d 100644 --- a/src/equipment/schema.py +++ b/src/equipment/schema.py @@ -84,6 +84,22 @@ class EquipmentRead(DefaultBase): last_actual_year: Optional[int] = Field(None, nullable=True) +class EquipmentTop10EconomicLife(EquipmentBase): + id: UUID + equipment_master: EquipmentMasterBase + forecasting_target_year: Optional[int] = Field(None, nullable=True) + minimum_eac_seq: Optional[int] = Field(None, nullable=True) + minimum_eac_year: Optional[int] = Field(None, nullable=True) + minimum_eac: Optional[float] = Field(None, nullable=True) + minimum_npv: Optional[float] = Field(None, nullable=True) + minimum_pmt: Optional[float] = Field(None, nullable=True) + minimum_pmt_aq_cost: Optional[float] = Field(None, nullable=True) + minimum_is_actual: Optional[int] = Field(None, nullable=True) + # min_eac_info: Optional[str] = Field(None, nullable=True) + harga_saat_ini: Optional[float] = Field(None, nullable=True) + economic_life: Optional[int] = Field(None, nullable=True) + + class EquipmentDataMaster(EquipmentBase): id: UUID equipment_master: EquipmentMasterBase @@ -99,5 +115,10 @@ class EquipmentDataMaster(EquipmentBase): harga_saat_ini: Optional[float] = Field(None, nullable=True) +# class EquipmentTop10EconomicLife(DefaultBase): +# equipment: EquipmentDataMaster +# economic_life: int + + class EquipmentPagination(Pagination): items: List[EquipmentDataMaster] = [] diff --git a/src/equipment/service.py b/src/equipment/service.py index 4f248d4..2ee2b96 100644 --- a/src/equipment/service.py +++ b/src/equipment/service.py @@ -14,6 +14,7 @@ from src.config import RELIABILITY_APP_URL import httpx from src.modules.equipment.run import main +import datetime async def get_master_by_assetnum( @@ -107,6 +108,35 @@ async def get_all( return result +async def get_top_10_economic_life(*, db_session: DbSession) -> list[Equipment]: + """Returns top 10 economic life.""" + query = ( + Select(Equipment) + .join(EquipmentMaster, Equipment.assetnum == EquipmentMaster.assetnum) + .options(selectinload(Equipment.equipment_master)) + ) + + # Get current year + current_year = datetime.datetime.now().year + + # Order by difference between current year and minimum_year + # Add absolute difference between current year and minimum_eac_year as a new column + query = query.add_columns( + func.abs(current_year - Equipment.minimum_eac_year).label("economic_life") + ).order_by(func.abs(current_year - Equipment.minimum_eac_year).desc()) + + result = await db_session.execute(query) + + # Set economic_life value inside equipment objects + equipment_list = [] + for row in result.all(): + equipment = row[0] + equipment.economic_life = row[1] + equipment_list.append(equipment) + + return equipment_list + + async def generate_all_transaction(*, db_session: DbSession, token): """Generate transaction for all equipments in the database based on equipments assetnum.""" query = Select(Equipment)