diff --git a/src/master_activity/__init__.py b/src/job/__init__.py similarity index 100% rename from src/master_activity/__init__.py rename to src/job/__init__.py diff --git a/src/master_activity/model.py b/src/job/model.py similarity index 100% rename from src/master_activity/model.py rename to src/job/model.py diff --git a/src/master_activity/router.py b/src/job/router.py similarity index 100% rename from src/master_activity/router.py rename to src/job/router.py diff --git a/src/master_activity/schema.py b/src/job/schema.py similarity index 100% rename from src/master_activity/schema.py rename to src/job/schema.py diff --git a/src/master_activity/service.py b/src/job/service.py similarity index 100% rename from src/master_activity/service.py rename to src/job/service.py diff --git a/src/overhaul/router.py b/src/overhaul/router.py index a6cf5a1..0aab2a8 100644 --- a/src/overhaul/router.py +++ b/src/overhaul/router.py @@ -5,7 +5,7 @@ from fastapi import APIRouter, HTTPException, status from src.overhaul.service import get_overhaul_critical_parts, get_overhaul_overview, get_overhaul_schedules, get_overhaul_system_components from src.overhaul_scope.schema import ScopeRead -from .schema import OverhaulRead, OverhaulSchedules, OverhaulCriticalParts, OverhaulSystemComponents +from .schema import OverhaulRead, OverhaulCriticalParts, OverhaulSystemComponents from src.models import StandardResponse from src.database.core import DbSession @@ -15,7 +15,7 @@ router = APIRouter() @router.get("", response_model=StandardResponse[OverhaulRead]) async def get_overhaul(db_session: DbSession): """Get all scope pagination.""" - overview = get_overhaul_overview() + overview = await get_overhaul_overview(db_session=db_session) schedules = await get_overhaul_schedules(db_session=db_session) criticalParts = get_overhaul_critical_parts() systemComponents = get_overhaul_system_components() diff --git a/src/overhaul/schema.py b/src/overhaul/schema.py index 4cc6b19..7b1f7e4 100644 --- a/src/overhaul/schema.py +++ b/src/overhaul/schema.py @@ -5,7 +5,7 @@ from uuid import UUID from pydantic import Field, BaseModel from src.models import DefultBase, Pagination -from src.overhaul_schedule.schema import OverhaulScheduleRead +from src.overhaul_scope.schema import ScopeRead class OverhaulBase(BaseModel): @@ -29,7 +29,7 @@ class OverhaulSystemComponents(OverhaulBase): class OverhaulRead(OverhaulBase): overview: Dict[str, Any] criticalParts: List[str] - schedules: List[OverhaulScheduleRead] + schedules: List[ScopeRead] systemComponents: Dict[str, Any] diff --git a/src/overhaul/service.py b/src/overhaul/service.py index a266194..162a415 100644 --- a/src/overhaul/service.py +++ b/src/overhaul/service.py @@ -5,21 +5,15 @@ from typing import Optional from src.database.core import DbSession from src.auth.service import CurrentUser -from src.overhaul_scope.service import get_all as get_all_session +from src.overhaul_scope.model import OverhaulScope +from src.overhaul_scope.service import get_all as get_all_session, get_overview_overhaul -def get_overhaul_overview(): +async def get_overhaul_overview(db_session: DbSession): """Get all overhaul overview.""" - return { - "totalEquipment": 30, - "nextSchedule": { - "start_date": "2025-01-12", - "end_date": "2025-01-15", - "duration": 3, - "Overhaul": "B", - "equipmentCount": 30 - } - } + results = await get_overview_overhaul(db_session=db_session) + + return results def get_overhaul_critical_parts(): @@ -35,8 +29,11 @@ def get_overhaul_critical_parts(): async def get_overhaul_schedules(*, db_session: DbSession): """Get all overhaul schedules.""" - schedules = await get_all_session(db_session=db_session) - return schedules + query = Select(OverhaulScope) + + results = await db_session.execute(query) + + return results.scalars().all() def get_overhaul_system_components(): diff --git a/src/overhaul_activity/schema.py b/src/overhaul_activity/schema.py index 03f4b33..4a01fc8 100644 --- a/src/overhaul_activity/schema.py +++ b/src/overhaul_activity/schema.py @@ -3,8 +3,7 @@ from datetime import datetime from typing import Any, Dict, List, Optional from uuid import UUID -from pydantic import Field, BaseModel -from src.master_activity.schema import ActivityMaster +from pydantic import Field from src.models import DefultBase, Pagination from src.scope_equipment.schema import MasterEquipmentRead diff --git a/src/overhaul_scope/model.py b/src/overhaul_scope/model.py index ae6b66d..4728f84 100644 --- a/src/overhaul_scope/model.py +++ b/src/overhaul_scope/model.py @@ -2,6 +2,7 @@ from sqlalchemy import Column, DateTime, Float, Integer, String from src.database.core import Base from src.models import DefaultMixin, IdentityMixin, TimeStampMixin +from sqlalchemy.orm import relationship class OverhaulScope(Base, DefaultMixin): @@ -14,4 +15,7 @@ class OverhaulScope(Base, DefaultMixin): crew_number = Column(Integer, nullable=True, default=1) status = Column(String, nullable=False, default="upcoming") - \ No newline at end of file + activity_equipments = relationship( + "OverhaulActivity", + lazy="selectin" + ) diff --git a/src/overhaul_scope/service.py b/src/overhaul_scope/service.py index dadd67d..615c153 100644 --- a/src/overhaul_scope/service.py +++ b/src/overhaul_scope/service.py @@ -1,10 +1,11 @@ -from sqlalchemy import Select, Delete +from sqlalchemy import Select, Delete, func from src.database.service import search_filter_sort_paginate from src.overhaul_activity.model import OverhaulActivity from src.scope_equipment.service import get_by_scope_name +from src.utils import time_now from .model import OverhaulScope from .schema import ScopeCreate, ScopeUpdate from typing import Optional @@ -86,8 +87,84 @@ async def delete(*, db_session: DbSession, scope_id: str): await db_session.commit() -# async def get_by_scope_name(*, db_session: DbSession, scope_name: str) -> Optional[OverhaulScope]: -# """Returns a document based on the given document id.""" -# query = Select(OverhaulScope).filter(OverhaulScope.tyoe == scope_name) -# result = await db_session.execute(query) -# return result.scalars().one_or_none() +async def get_overview_overhaul(*, db_session: DbSession): + + current_date = time_now().date() + + + # For ongoing overhaul with count + ongoing_query = Select( + OverhaulScope, + func.count(OverhaulActivity.id).label('equipment_count') + ).outerjoin( + OverhaulScope.activity_equipments + ).where( + OverhaulScope.start_date <= current_date, + OverhaulScope.end_date >= current_date, + OverhaulScope.status != 'Completed' + ).group_by( + OverhaulScope.id + ) + + ongoing_result = await db_session.execute(ongoing_query) + # Use first() instead of scalar_one_or_none() + ongoing_result = ongoing_result.first() + + + if ongoing_result: + ongoing_overhaul, equipment_count = ongoing_result # Unpack the result tuple + return { + "status": "Ongoing", + "overhaul": { + "type": ongoing_overhaul.type, + "start_date": ongoing_overhaul.start_date, + "end_date": ongoing_overhaul.end_date, + "duration_oh": ongoing_overhaul.duration_oh, + "crew_number": ongoing_overhaul.crew_number, + "remaining_days": (ongoing_overhaul.end_date - current_date).days, + "equipment_count": equipment_count + } + } + + # For upcoming overhaul with count + upcoming_query = Select( + OverhaulScope, + func.count(OverhaulActivity.id).label('equipment_count') + ).outerjoin( + OverhaulScope.activity_equipments + ).where( + OverhaulScope.start_date > current_date, + OverhaulScope.status == 'Upcoming' + ).group_by( + OverhaulScope.id + ).order_by( + OverhaulScope.start_date + ) + + upcoming_result = await db_session.execute(upcoming_query) + upcoming_result = upcoming_result.first() + + if upcoming_result: + upcoming_overhaul, equipment_count = upcoming_result # Unpack the result tuple + days_until = (upcoming_overhaul.start_date - current_date).days + + return { + "status": "Upcoming", + "overhaul": { + "type": upcoming_overhaul.type, + "start_date": upcoming_overhaul.start_date, + "end_date": upcoming_overhaul.end_date, + "duration_oh": upcoming_overhaul.duration_oh, + "crew_number": upcoming_overhaul.crew_number, + "remaining_days": days_until, + "equipment_count": equipment_count + } + } + + return { + "status": "no_overhaul", + "overhaul": None + } + + + \ No newline at end of file diff --git a/src/utils.py b/src/utils.py index dcb9421..d6a7012 100644 --- a/src/utils.py +++ b/src/utils.py @@ -4,6 +4,9 @@ from datetime import datetime, timedelta, timezone import re from typing import Optional from dateutil.relativedelta import relativedelta +import pytz + +from src.config import TIMEZONE def parse_relative_expression(date_str: str) -> Optional[datetime]: @@ -78,3 +81,7 @@ def parse_date_string(date_str: str) -> Optional[datetime]: "- YYYY.MM.DD\n" "- DD.MM.YYYY" ) + + +def time_now(): + return datetime.now(pytz.timezone(TIMEZONE))