diff --git a/src/database/__pycache__/service.cpython-311.pyc b/src/database/__pycache__/service.cpython-311.pyc index 1146faf..1744fcc 100644 Binary files a/src/database/__pycache__/service.cpython-311.pyc and b/src/database/__pycache__/service.cpython-311.pyc differ diff --git a/src/database/service.py b/src/database/service.py index fb82d27..b797248 100644 --- a/src/database/service.py +++ b/src/database/service.py @@ -77,6 +77,36 @@ def search(*, query_str: str, query: Query, model, sort=False): return query.params(term=query_str) +def _extract_result_items(result): + """Normalize SQLAlchemy result rows into ORM entities with labeled columns attached.""" + + rows = result.fetchall() + items = [] + + for row in rows: + row_values = tuple(row) + if not row_values: + continue + + primary = row_values[0] + + if hasattr(primary, "__table__"): + mapping = getattr(row, "_mapping", None) + if mapping: + for key, value in mapping.items(): + if isinstance(key, str): + setattr(primary, key, value) + items.append(primary) + else: + # Fall back to first column (scalar or tuple) if no ORM entity is present. + if len(row_values) == 1: + items.append(primary) + else: + items.append(row_values) + + return items + + async def search_filter_sort_paginate( db_session: DbSession, model, @@ -106,7 +136,7 @@ async def search_filter_sort_paginate( total = await db_session.scalar(count_query) if all: result = await db_session.execute(query) - items = result.scalars().all() + items = _extract_result_items(result) return { "items": items, "itemsPerPage": total, @@ -118,7 +148,7 @@ async def search_filter_sort_paginate( query = query.offset((page - 1) * items_per_page).limit(items_per_page) result = await db_session.execute(query) - items = result.scalars().all() + items = _extract_result_items(result) # try: # query, pagination = apply_pagination( diff --git a/src/equipment/__pycache__/router.cpython-311.pyc b/src/equipment/__pycache__/router.cpython-311.pyc index a8404e0..9e29140 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 2b051e6..a5e2cd8 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 a3d79d8..bd6abfe 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 69bf13a..2905947 100644 --- a/src/equipment/router.py +++ b/src/equipment/router.py @@ -9,7 +9,8 @@ from src.equipment.schema import ( EquipmentPagination, EquipmentRead, EquipmentCreate, - EquipmentTop10EconomicLife, + EquipmentTop10, + EquipmentTop10Pagination, EquipmentUpdate, ) from src.equipment.service import ( @@ -115,10 +116,10 @@ async def simulate_equipment(db_session: DbSession, assetnum: str): @router.get( "/top-10-replacement-priorities", - response_model=StandardResponse[List[EquipmentTop10EconomicLife]], + response_model=StandardResponse[EquipmentTop10Pagination], ) -async def get_calculated_top_10_replacement_priorities(db_session: DbSession): - equipment_data = await get_top_10_replacement_priorities(db_session=db_session) +async def get_calculated_top_10_replacement_priorities(db_session: DbSession, common: CommonParameters): + equipment_data = await get_top_10_replacement_priorities(db_session=db_session, common=common) return StandardResponse( data=equipment_data, message="Top 10 Replacement Priorities Data retrieved successfully", @@ -126,10 +127,10 @@ async def get_calculated_top_10_replacement_priorities(db_session: DbSession): @router.get( "/top-10-economic-life", - response_model=StandardResponse[List[EquipmentTop10EconomicLife]], + response_model=StandardResponse[EquipmentTop10Pagination], ) -async def get_calculated_top_10_economic_life(db_session: DbSession): - equipment_data = await get_top_10_economic_life(db_session=db_session) +async def get_calculated_top_10_economic_life(db_session: DbSession, common: CommonParameters): + equipment_data = await get_top_10_economic_life(db_session=db_session, common=common) return StandardResponse( data=equipment_data, message="Top 10 Economic Life Data retrieved successfully", diff --git a/src/equipment/schema.py b/src/equipment/schema.py index ef11c1f..20f91a7 100644 --- a/src/equipment/schema.py +++ b/src/equipment/schema.py @@ -108,7 +108,7 @@ class EquipmentRead(DefaultBase): maximo_data: Optional[List[dict]] = Field(None, nullable=True) -class EquipmentTop10EconomicLife(EquipmentBase): +class EquipmentTop10(EquipmentBase): id: UUID equipment_master: EquipmentMasterBase forecasting_target_year: Optional[int] = Field(None, nullable=True) @@ -123,6 +123,8 @@ class EquipmentTop10EconomicLife(EquipmentBase): harga_saat_ini: Optional[float] = Field(None, nullable=True, le=MAX_PRICE) economic_life: Optional[int] = Field(None, nullable=True) +class EquipmentTop10Pagination(Pagination): + items: List[EquipmentTop10] = [] class EquipmentDataMaster(EquipmentBase): id: UUID diff --git a/src/equipment/service.py b/src/equipment/service.py index 98447e6..5987ac3 100644 --- a/src/equipment/service.py +++ b/src/equipment/service.py @@ -338,7 +338,7 @@ async def get_all( return result -async def get_top_10_economic_life(*, db_session: DbSession) -> list[Equipment]: +async def get_top_10_economic_life(*, db_session: DbSession, common) -> list[Equipment]: """Returns top 10 economic life.""" query = ( Select(Equipment) @@ -354,20 +354,13 @@ async def get_top_10_economic_life(*, db_session: DbSession) -> list[Equipment]: ) .filter(Equipment.minimum_eac_year != None) .order_by(func.abs(current_year - Equipment.minimum_eac_year).desc()) - .limit(10) ) - result = await db_session.execute(query) - - equipment_list = [] - for row in result.all(): - equipment = row[0] - equipment.economic_life = row[1] - equipment_list.append(equipment) - - return equipment_list + # result = await db_session.execute(query) + result = await search_filter_sort_paginate(model=query, **common) + return result -async def get_top_10_replacement_priorities(*, db_session: DbSession) -> list[Equipment]: +async def get_top_10_replacement_priorities(*, db_session: DbSession, common) -> list[Equipment]: """Returns top 10 replacement priorities.""" query = ( Select(Equipment) @@ -384,18 +377,11 @@ async def get_top_10_replacement_priorities(*, db_session: DbSession) -> list[Eq .filter(Equipment.minimum_eac_year != None) .order_by(func.abs(current_year - Equipment.minimum_eac_year).asc()) .order_by(func.abs(Equipment.minimum_eac).desc()) - .limit(10) ) - result = await db_session.execute(query) - - equipment_list = [] - for row in result.all(): - equipment = row[0] - equipment.economic_life = row[1] - equipment_list.append(equipment) - - return equipment_list + # result = await db_session.execute(query) + result = await search_filter_sort_paginate(model=query, **common) + return result async def generate_all_transaction(*, db_session: DbSession, token): """Generate transaction for all equipments in the database based on equipments assetnum."""