feat: top 10 equipment economic life GET API

main
MrWaradana 11 months ago
parent c239acd6d4
commit c3d191182e

@ -7,6 +7,7 @@ from .schema import (
EquipmentPagination, EquipmentPagination,
EquipmentRead, EquipmentRead,
EquipmentCreate, EquipmentCreate,
EquipmentTop10EconomicLife,
EquipmentUpdate, EquipmentUpdate,
) )
from .service import ( from .service import (
@ -17,6 +18,7 @@ from .service import (
update, update,
delete, delete,
generate_all_transaction, generate_all_transaction,
get_top_10_economic_life,
) )
from src.database.service import CommonParameters, search_filter_sort_paginate 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]) @router.get("/tree", response_model=StandardResponse[EquipmentRead])
async def get_equipment_tree(): async def get_equipment_tree():
"""Get as tree structure.""" """Get as tree structure."""

@ -84,6 +84,22 @@ class EquipmentRead(DefaultBase):
last_actual_year: Optional[int] = Field(None, nullable=True) 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): class EquipmentDataMaster(EquipmentBase):
id: UUID id: UUID
equipment_master: EquipmentMasterBase equipment_master: EquipmentMasterBase
@ -99,5 +115,10 @@ class EquipmentDataMaster(EquipmentBase):
harga_saat_ini: Optional[float] = Field(None, nullable=True) harga_saat_ini: Optional[float] = Field(None, nullable=True)
# class EquipmentTop10EconomicLife(DefaultBase):
# equipment: EquipmentDataMaster
# economic_life: int
class EquipmentPagination(Pagination): class EquipmentPagination(Pagination):
items: List[EquipmentDataMaster] = [] items: List[EquipmentDataMaster] = []

@ -14,6 +14,7 @@ from src.config import RELIABILITY_APP_URL
import httpx import httpx
from src.modules.equipment.run import main from src.modules.equipment.run import main
import datetime
async def get_master_by_assetnum( async def get_master_by_assetnum(
@ -107,6 +108,35 @@ async def get_all(
return result 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): async def generate_all_transaction(*, db_session: DbSession, token):
"""Generate transaction for all equipments in the database based on equipments assetnum.""" """Generate transaction for all equipments in the database based on equipments assetnum."""
query = Select(Equipment) query = Select(Equipment)

Loading…
Cancel
Save