fix overhaul equipments
parent
9204d75de3
commit
93158c0055
@ -0,0 +1,28 @@
|
||||
|
||||
from sqlalchemy import UUID, Column, Float, Integer, String, ForeignKey
|
||||
from src.database.core import Base
|
||||
from src.models import DefaultMixin, IdentityMixin, TimeStampMixin
|
||||
from sqlalchemy.orm import relationship
|
||||
from src.workorder.model import MasterWorkOrder
|
||||
from sqlalchemy.ext.hybrid import hybrid_property
|
||||
|
||||
|
||||
class MasterActivity(Base, DefaultMixin):
|
||||
__tablename__ = "oh_ms_activity"
|
||||
|
||||
name = Column(String, nullable=False)
|
||||
|
||||
details = relationship(
|
||||
"MasterActivityDetail",
|
||||
lazy="raise",
|
||||
primaryjoin="and_(MasterActivity.id == foreign(MasterActivityDetail.activity_id))",
|
||||
)
|
||||
|
||||
|
||||
class MasterActivityDetail(Base, DefaultMixin):
|
||||
__tablename__ = "oh_ms_activity_detail"
|
||||
|
||||
name = Column(String, nullable=False)
|
||||
activity_id = Column(UUID(as_uuid=True))
|
||||
|
||||
|
||||
@ -0,0 +1,71 @@
|
||||
|
||||
from fastapi import APIRouter, HTTPException, Query, status
|
||||
|
||||
|
||||
from .service import get_all, create, get, update, delete
|
||||
from .schema import ActivityMaster, ActivityMasterCreate, ActivityMasterPagination
|
||||
|
||||
from src.models import StandardResponse
|
||||
from src.database.service import CommonParameters, search_filter_sort_paginate, DbSession
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.get("", response_model=StandardResponse[ActivityMasterPagination])
|
||||
async def get_activities(common: CommonParameters):
|
||||
"""Get all scope activity pagination."""
|
||||
# return
|
||||
data = await get_all(common=common)
|
||||
|
||||
return StandardResponse(
|
||||
data=data,
|
||||
message="Data retrieved successfully",
|
||||
)
|
||||
|
||||
|
||||
@router.post("", response_model=StandardResponse[ActivityMasterCreate])
|
||||
async def create_activity(db_session: DbSession, activity_in: ActivityMasterCreate):
|
||||
|
||||
activity = await create(db_session=db_session, activty_in=activity_in)
|
||||
|
||||
return StandardResponse(data=activity, message="Data created successfully")
|
||||
|
||||
|
||||
@router.get("/{scope_equipment_activity_id}", response_model=StandardResponse[ActivityMaster])
|
||||
async def get_activity(db_session: DbSession, activity_id: str):
|
||||
activity = await get(db_session=db_session, activity_id=activity_id)
|
||||
if not activity:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="A data with this id does not exist.",
|
||||
)
|
||||
|
||||
return StandardResponse(data=activity, message="Data retrieved successfully")
|
||||
|
||||
|
||||
@router.put("/{scope_equipment_activity_id}", response_model=StandardResponse[ActivityMaster])
|
||||
async def update_scope(db_session: DbSession, activity_in: ActivityMasterCreate, activity_id):
|
||||
activity = await get(db_session=db_session, activity_id=activity_id)
|
||||
|
||||
if not activity:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="A data with this id does not exist.",
|
||||
)
|
||||
|
||||
return StandardResponse(data=await update(db_session=db_session, activity=activity, activity_in=activity_in), message="Data updated successfully")
|
||||
|
||||
|
||||
@router.delete("/{scope_equipment_activity_id}", response_model=StandardResponse[ActivityMaster])
|
||||
async def delete_scope(db_session: DbSession, activity_id: str):
|
||||
activity = await get(db_session=db_session, activity_id=activity_id)
|
||||
|
||||
if not activity:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail=[{"msg": "A data with this id does not exist."}],
|
||||
)
|
||||
|
||||
await delete(db_session=db_session, activity_id=activity_id)
|
||||
|
||||
return StandardResponse(message="Data deleted successfully", data=activity)
|
||||
@ -0,0 +1,57 @@
|
||||
|
||||
|
||||
from sqlalchemy import Select, Delete
|
||||
from sqlalchemy.orm import joinedload, selectinload
|
||||
from typing import Optional
|
||||
|
||||
from .model import MasterActivity, MasterActivityDetail
|
||||
from .schema import ActivityMaster, ActivityMasterCreate
|
||||
|
||||
from src.database.core import DbSession
|
||||
from src.database.service import CommonParameters, search_filter_sort_paginate
|
||||
from src.auth.service import CurrentUser
|
||||
|
||||
|
||||
async def get(*, db_session: DbSession, activity_id: str) -> Optional[ActivityMaster]:
|
||||
"""Returns a document based on the given document id."""
|
||||
result = await db_session.get(MasterActivity, activity_id)
|
||||
return result
|
||||
|
||||
|
||||
async def get_all(common: CommonParameters):
|
||||
query = Select(MasterActivity).options(
|
||||
selectinload(MasterActivity.details))
|
||||
|
||||
results = await search_filter_sort_paginate(model=query, **common)
|
||||
|
||||
return results
|
||||
|
||||
|
||||
async def create(*, db_session: DbSession, activty_in: ActivityMasterCreate):
|
||||
activity = MasterActivity(
|
||||
**activty_in.model_dump())
|
||||
db_session.add(activity)
|
||||
await db_session.commit()
|
||||
return activity
|
||||
|
||||
|
||||
async def update(*, db_session: DbSession, activity: MasterActivity, activity_in: ActivityMasterCreate):
|
||||
"""Updates a document."""
|
||||
data = activity_in.model_dump()
|
||||
|
||||
update_data = activity_in.model_dump(exclude_defaults=True)
|
||||
|
||||
for field in data:
|
||||
if field in update_data:
|
||||
setattr(activity, field, update_data[field])
|
||||
|
||||
await db_session.commit()
|
||||
|
||||
return activity
|
||||
|
||||
|
||||
async def delete(*, db_session: DbSession, activity_id: str):
|
||||
"""Deletes a document."""
|
||||
activity = await db_session.get(MasterActivity, activity_id)
|
||||
await db_session.delete(activity)
|
||||
await db_session.commit()
|
||||
@ -0,0 +1,31 @@
|
||||
|
||||
from sqlalchemy import UUID, Column, Float, Integer, String, ForeignKey
|
||||
from src.database.core import Base
|
||||
from src.models import DefaultMixin, IdentityMixin, TimeStampMixin
|
||||
from sqlalchemy.orm import relationship
|
||||
from src.workorder.model import MasterWorkOrder
|
||||
from sqlalchemy.ext.hybrid import hybrid_property
|
||||
|
||||
|
||||
class OverhaulActivity(Base, DefaultMixin):
|
||||
__tablename__ = "oh_tr_overhaul_activity"
|
||||
|
||||
assetnum = Column(String, nullable=True)
|
||||
overhaul_scope_id = Column(UUID(as_uuid=True), ForeignKey(
|
||||
"oh_ms_overhaul_scope.id"), nullable=False)
|
||||
material_cost = Column(Float, nullable=False, default=0)
|
||||
service_cost = Column(Float, nullable=False, default=0)
|
||||
status = Column(String, nullable=False, default="pending")
|
||||
|
||||
equipment = relationship(
|
||||
"MasterEquipment",
|
||||
lazy="raise",
|
||||
primaryjoin="and_(OverhaulActivity.assetnum == foreign(MasterEquipment.assetnum))",
|
||||
uselist=False # Add this if it's a one-to-one relationship
|
||||
)
|
||||
|
||||
overhaul_scope = relationship(
|
||||
"OverhaulScope",
|
||||
lazy="raise",
|
||||
)
|
||||
|
||||
@ -0,0 +1,73 @@
|
||||
|
||||
from typing import Optional
|
||||
from uuid import UUID
|
||||
from fastapi import APIRouter, HTTPException, Query, status
|
||||
|
||||
|
||||
from .service import get_all, create, get, update, delete
|
||||
from .schema import OverhaulActivityCreate, OverhaulActivityPagination, OverhaulActivityRead, OverhaulActivityUpdate
|
||||
|
||||
from src.models import StandardResponse
|
||||
from src.database.service import CommonParameters, search_filter_sort_paginate, DbSession
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.get("/{overhaul_session}", response_model=StandardResponse[OverhaulActivityPagination])
|
||||
async def get_scope_equipments(common: CommonParameters, overhaul_session: str, assetnum: Optional[str] = Query(None), scope_name: Optional[str] = Query(None)):
|
||||
"""Get all scope activity pagination."""
|
||||
# return
|
||||
data = await get_all(common=common, assetnum=assetnum, scope_name=scope_name, overhaul_session_id=overhaul_session)
|
||||
|
||||
return StandardResponse(
|
||||
data=data,
|
||||
message="Data retrieved successfully",
|
||||
)
|
||||
|
||||
|
||||
@ router.post("/{overhaul_session}", response_model=StandardResponse[OverhaulActivityRead])
|
||||
async def create_overhaul_equipment(db_session: DbSession, overhaul_activty_in: OverhaulActivityCreate, overhaul_session: str):
|
||||
|
||||
activity = await create(db_session=db_session, overhaul_activty_in=overhaul_activty_in, overhaul_session_id=overhaul_session)
|
||||
|
||||
return StandardResponse(data=activity, message="Data created successfully")
|
||||
|
||||
|
||||
@ router.get("/{overhaul_session}/{assetnum}", response_model=StandardResponse[OverhaulActivityRead])
|
||||
async def get_overhaul_equipment(db_session: DbSession, assetnum: str, overhaul_session):
|
||||
equipment = await get(db_session=db_session, assetnum=assetnum, overhaul_session_id=overhaul_session)
|
||||
if not equipment:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="A data with this id does not exist.",
|
||||
)
|
||||
|
||||
return StandardResponse(data=equipment, message="Data retrieved successfully")
|
||||
|
||||
|
||||
@ router.put("/{overhaul_session}/{assetnum}", response_model=StandardResponse[OverhaulActivityRead])
|
||||
async def update_scope(db_session: DbSession, scope_equipment_activity_in: OverhaulActivityUpdate, assetnum: str):
|
||||
activity = await get(db_session=db_session, assetnum=assetnum)
|
||||
|
||||
if not activity:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="A data with this id does not exist.",
|
||||
)
|
||||
|
||||
return StandardResponse(data=await update(db_session=db_session, activity=activity, scope_equipment_activity_in=scope_equipment_activity_in), message="Data updated successfully")
|
||||
|
||||
|
||||
@ router.delete("/{overhaul_session}/{assetnum}", response_model=StandardResponse[OverhaulActivityRead])
|
||||
async def delete_scope(db_session: DbSession, assetnum: str):
|
||||
activity = await get(db_session=db_session, assetnum=assetnum)
|
||||
|
||||
if not activity:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail=[{"msg": "A data with this id does not exist."}],
|
||||
)
|
||||
|
||||
await delete(db_session=db_session, assetnum=assetnum)
|
||||
|
||||
return StandardResponse(message="Data deleted successfully", data=activity)
|
||||
@ -0,0 +1,35 @@
|
||||
|
||||
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 src.models import DefultBase, Pagination
|
||||
from src.scope_equipment.schema import MasterEquipmentRead
|
||||
|
||||
|
||||
class OverhaulActivityBase(DefultBase):
|
||||
assetnum: str = Field(..., description="Assetnum is required")
|
||||
|
||||
|
||||
class OverhaulActivityCreate(OverhaulActivityBase):
|
||||
material_cost: Optional[float] = Field(0)
|
||||
service_cost: Optional[float] = Field(0)
|
||||
|
||||
|
||||
class OverhaulActivityUpdate(OverhaulActivityBase):
|
||||
material_cost: Optional[float] = Field(0)
|
||||
service_cost: Optional[float] = Field(0)
|
||||
|
||||
|
||||
class OverhaulActivityRead(OverhaulActivityBase):
|
||||
id: UUID
|
||||
material_cost: Optional[float] = Field(0)
|
||||
service_cost: Optional[float] = Field(0)
|
||||
status: str
|
||||
equipment: MasterEquipmentRead
|
||||
|
||||
|
||||
class OverhaulActivityPagination(Pagination):
|
||||
items: List[OverhaulActivityRead] = []
|
||||
@ -0,0 +1,101 @@
|
||||
|
||||
|
||||
from uuid import UUID
|
||||
from sqlalchemy import Select, Delete
|
||||
from sqlalchemy.orm import joinedload
|
||||
from typing import List, Optional
|
||||
|
||||
from src.scope_equipment.model import ScopeEquipment
|
||||
|
||||
from .model import OverhaulActivity
|
||||
from .schema import OverhaulActivityCreate, OverhaulActivityUpdate, OverhaulActivityRead
|
||||
|
||||
from src.database.core import DbSession
|
||||
from src.database.service import CommonParameters, search_filter_sort_paginate
|
||||
from src.auth.service import CurrentUser
|
||||
|
||||
|
||||
async def get(*, db_session: DbSession, assetnum: str, overhaul_session_id: Optional[UUID] = None) -> Optional[OverhaulActivityRead]:
|
||||
"""Returns a document based on the given document id."""
|
||||
query = Select(OverhaulActivity).where(
|
||||
OverhaulActivity.assetnum == assetnum).options(joinedload(OverhaulActivity.equipment))
|
||||
|
||||
if overhaul_session_id:
|
||||
query = query.filter(
|
||||
OverhaulActivity.overhaul_scope_id == overhaul_session_id)
|
||||
|
||||
result = await db_session.execute(query)
|
||||
return result.scalar()
|
||||
|
||||
|
||||
async def get_all(*, common: CommonParameters, overhaul_session_id: UUID, assetnum: Optional[str] = None, scope_name: Optional[str] = None):
|
||||
query = Select(OverhaulActivity).where(
|
||||
OverhaulActivity.overhaul_scope_id == overhaul_session_id).options(joinedload(OverhaulActivity.equipment))
|
||||
|
||||
if assetnum:
|
||||
query = query.filter(OverhaulActivity.assetnum == assetnum).options(
|
||||
joinedload(OverhaulActivity.overhaul_scope))
|
||||
|
||||
if scope_name:
|
||||
query = query.filter(OverhaulActivity.assetnum == assetnum).options(
|
||||
joinedload(OverhaulActivity.overhaul_scope))
|
||||
|
||||
results = await search_filter_sort_paginate(model=query, **common)
|
||||
|
||||
return results
|
||||
|
||||
|
||||
async def create(*, db_session: DbSession, overhaul_activty_in: OverhaulActivityCreate, overhaul_session_id: UUID):
|
||||
# Check if the combination of assetnum and activity_id already exists
|
||||
existing_equipment_query = (
|
||||
Select(OverhaulActivity)
|
||||
.where(
|
||||
OverhaulActivity.assetnum == overhaul_activty_in.assetnum,
|
||||
OverhaulActivity.overhaul_scope_id == overhaul_session_id
|
||||
)
|
||||
)
|
||||
result = await db_session.execute(existing_equipment_query)
|
||||
existing_activity = result.scalar_one_or_none()
|
||||
|
||||
# If the combination exists, raise an exception or return the existing activity
|
||||
if existing_activity:
|
||||
raise ValueError("This assetnum already exist.")
|
||||
|
||||
activity = OverhaulActivity(
|
||||
**overhaul_activty_in.model_dump(),
|
||||
overhaul_scope_id=overhaul_session_id)
|
||||
db_session.add(activity)
|
||||
await db_session.commit()
|
||||
|
||||
# Refresh and load relationships using joinedload
|
||||
query = (
|
||||
Select(OverhaulActivity)
|
||||
.options(joinedload(OverhaulActivity.equipment))
|
||||
.where(OverhaulActivity.id == activity.id)
|
||||
)
|
||||
result = await db_session.execute(query)
|
||||
activity_with_relationship = result.scalar_one()
|
||||
|
||||
return activity_with_relationship
|
||||
|
||||
|
||||
async def update(*, db_session: DbSession, activity: OverhaulActivity, overhaul_activity_in: OverhaulActivityUpdate):
|
||||
"""Updates a document."""
|
||||
data = overhaul_activity_in.model_dump()
|
||||
|
||||
update_data = overhaul_activity_in.model_dump(exclude_defaults=True)
|
||||
|
||||
for field in data:
|
||||
if field in update_data:
|
||||
setattr(activity, field, update_data[field])
|
||||
|
||||
await db_session.commit()
|
||||
|
||||
return activity
|
||||
|
||||
|
||||
async def delete(*, db_session: DbSession, overhaul_activity_id: str):
|
||||
"""Deletes a document."""
|
||||
activity = await db_session.get(OverhaulActivity, overhaul_activity_id)
|
||||
await db_session.delete(activity)
|
||||
await db_session.commit()
|
||||
@ -1,9 +0,0 @@
|
||||
from src.enums import OptimumOHEnum
|
||||
|
||||
class OverhaulStatus(OptimumOHEnum):
|
||||
PLANNED = "PLANNED"
|
||||
IN_PROGRESS = "IN_PROGRESS"
|
||||
COMPLETED = "COMPLETED"
|
||||
DELAYED = "DELAYED"
|
||||
CANCELLED = "CANCELLED"
|
||||
ON_HOLD = "ON_HOLD"
|
||||
@ -1,35 +0,0 @@
|
||||
|
||||
from sqlalchemy import UUID, Column, DateTime, Float, ForeignKey, Integer, String
|
||||
from sqlalchemy.orm import relationship
|
||||
from src.database.core import Base
|
||||
from src.models import DefaultMixin
|
||||
from .enums import OverhaulStatus
|
||||
|
||||
|
||||
class OverhaulHistory(Base, DefaultMixin):
|
||||
__tablename__ = "oh_tr_overhaul_history"
|
||||
|
||||
scope_id = Column(UUID(as_uuid=True), ForeignKey(
|
||||
"oh_scope.id"), nullable=True)
|
||||
schedule_start_date = Column(DateTime(timezone=True))
|
||||
schedule_end_date = Column(DateTime(timezone=True))
|
||||
total_cost = Column(Float, nullable=False, default=0)
|
||||
status = Column(String, nullable=False, default=OverhaulStatus.PLANNED)
|
||||
maximo_id = Column(String, nullable=True,
|
||||
comment="Id From MAXIMO regarding overhaul schedule")
|
||||
|
||||
equipments = relationship("OverhaulHistoryEquip",
|
||||
back_populates="overhaul_history",
|
||||
cascade="all, delete-orphan")
|
||||
|
||||
|
||||
class OverhaulHistoryEquip(Base, DefaultMixin):
|
||||
__tablename__ = "oh_tr_overhaul_history_equip"
|
||||
|
||||
assetnum = Column(String(10), nullable=False)
|
||||
overhaul_history_id = Column(
|
||||
UUID(as_uuid=True), ForeignKey("oh_tr_overhaul_history.id"), nullable=False)
|
||||
|
||||
# Relationship to OverhaulHistory
|
||||
overhaul_history = relationship("OverhaulHistory",
|
||||
back_populates="equipments")
|
||||
@ -1,52 +0,0 @@
|
||||
|
||||
from fastapi import APIRouter, HTTPException, status
|
||||
|
||||
from src.maximo.service import MaximoService
|
||||
|
||||
from .model import OverhaulHistory
|
||||
from .schema import OverhaulHistoryCreate, OverhaulHistoryRead, OverhaulHistoryUpdate, OverhaulHistoryPagination
|
||||
from .service import get, get_all, start_overhaul
|
||||
|
||||
from src.database.service import CommonParameters, search_filter_sort_paginate
|
||||
from src.database.core import DbSession
|
||||
from src.auth.service import CurrentUser
|
||||
from src.models import StandardResponse
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.get("", response_model=StandardResponse[OverhaulHistoryPagination])
|
||||
async def get_histories(common: CommonParameters):
|
||||
"""Get all scope pagination."""
|
||||
# return
|
||||
return StandardResponse(
|
||||
data=await search_filter_sort_paginate(model=OverhaulHistory, **common),
|
||||
message="Data retrieved successfully",
|
||||
)
|
||||
|
||||
|
||||
@router.get("/{overhaul_history_id}", response_model=StandardResponse[OverhaulHistoryRead])
|
||||
async def get_history(db_session: DbSession, overhaul_history_id: str):
|
||||
overhaul_history = await get(db_session=db_session, overhaul_history_id=overhaul_history_id)
|
||||
if not overhaul_history:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="A data with this id does not exist.",
|
||||
)
|
||||
|
||||
return StandardResponse(data=overhaul_history, message="Data retrieved successfully")
|
||||
|
||||
|
||||
@router.post("", response_model=StandardResponse[OverhaulHistoryRead])
|
||||
async def create_history(db_session: DbSession, scope_in: OverhaulHistoryCreate):
|
||||
|
||||
try:
|
||||
maximo_service = MaximoService()
|
||||
maximo_data = await maximo_service.get_recent_overhaul()
|
||||
overhaul = await start_overhaul(db_session=db_session, maximo_data=maximo_data)
|
||||
|
||||
|
||||
except HTTPException as he:
|
||||
raise he
|
||||
|
||||
return StandardResponse(data=overhaul, message="Data created successfully")
|
||||
@ -1,33 +0,0 @@
|
||||
from datetime import datetime
|
||||
from typing import List, Optional
|
||||
from uuid import UUID
|
||||
|
||||
|
||||
from pydantic import Field
|
||||
from src.models import DefultBase, Pagination
|
||||
from src.scope.schema import ScopeRead
|
||||
|
||||
|
||||
class OverhaulHistoryBase(DefultBase):
|
||||
pass
|
||||
|
||||
|
||||
class OverhaulHistoryCreate(OverhaulHistoryBase):
|
||||
pass
|
||||
|
||||
|
||||
class OverhaulHistoryUpdate(OverhaulHistoryBase):
|
||||
pass
|
||||
|
||||
|
||||
class OverhaulHistoryRead(OverhaulHistoryBase):
|
||||
id: UUID
|
||||
scope_id: UUID
|
||||
schedule_start_date: datetime
|
||||
schedule_end_date: Optional[datetime]
|
||||
total_cost: Optional[float] = Field(0)
|
||||
maximo_id: Optional[str]
|
||||
|
||||
|
||||
class OverhaulHistoryPagination(Pagination):
|
||||
items: List[OverhaulHistoryRead] = []
|
||||
@ -1,81 +0,0 @@
|
||||
|
||||
|
||||
from fastapi import HTTPException
|
||||
from sqlalchemy import Select, Delete, and_
|
||||
|
||||
from src.maximo.service import MaximoDataMapper
|
||||
from src.overhaul_history.enums import OverhaulStatus
|
||||
from src.overhaul_history.utils import determine_overhaul_status
|
||||
from .model import OverhaulHistory, OverhaulHistoryEquip
|
||||
from .schema import OverhaulHistoryRead, OverhaulHistoryCreate
|
||||
from typing import Optional
|
||||
|
||||
from src.database.core import DbSession
|
||||
from src.auth.service import CurrentUser
|
||||
from src.scope.service import get_by_scope_name
|
||||
from src.scope_equipment.service import get_by_scope_name as scope_equipment_by_scope_name
|
||||
|
||||
|
||||
async def get(*, db_session: DbSession, overhaul_history_id: str) -> Optional[OverhaulHistory]:
|
||||
"""Returns a document based on the given document id."""
|
||||
result = await db_session.get(OverhaulHistory, overhaul_history_id)
|
||||
return result.scalars().one_or_none()
|
||||
|
||||
|
||||
async def get_all(*, db_session: DbSession):
|
||||
"""Returns all documents."""
|
||||
query = Select(OverhaulHistory)
|
||||
result = await db_session.execute(query)
|
||||
return result.scalars().all()
|
||||
|
||||
|
||||
async def start_overhaul(*, db_session: DbSession, maximo_data: dict):
|
||||
mapper = MaximoDataMapper(maximo_data)
|
||||
maximo_id = mapper.get_maximo_id()
|
||||
|
||||
# Check for existing overhaul
|
||||
existing_overhaul = Select(OverhaulHistory).filter(
|
||||
and_(
|
||||
OverhaulHistory.maximo_id == maximo_id,
|
||||
OverhaulHistory.status == OverhaulStatus.IN_PROGRESS
|
||||
)
|
||||
)
|
||||
res = await db_session.execute(existing_overhaul)
|
||||
|
||||
|
||||
if res.first():
|
||||
raise HTTPException(
|
||||
status_code=409,
|
||||
detail=f"Overhaul with MAXIMO ID {maximo_id} already started"
|
||||
)
|
||||
|
||||
status, status_reason = await determine_overhaul_status(maximo_data)
|
||||
scope = await get_by_scope_name(db_session=db_session, scope_name=mapper.get_scope_name())
|
||||
|
||||
overhaul = OverhaulHistory(
|
||||
scope_id=scope.id,
|
||||
schedule_start_date=mapper.get_start_date(),
|
||||
schedule_end_date=mapper.get_end_date(),
|
||||
total_cost=mapper.get_total_cost(),
|
||||
maximo_id=maximo_id,
|
||||
status=status
|
||||
)
|
||||
# Get equipment list asynchronously
|
||||
scope_equipment = await scope_equipment_by_scope_name(
|
||||
db_session=db_session,
|
||||
scope_name="A"
|
||||
)
|
||||
|
||||
# Create equipment instances
|
||||
equipments = [OverhaulHistoryEquip(assetnum=eq.assetnum)
|
||||
for eq in scope_equipment]
|
||||
|
||||
# Assign equipment to overhaul
|
||||
overhaul.equipments = equipments
|
||||
|
||||
# Get All Equipment
|
||||
|
||||
db_session.add(overhaul)
|
||||
await db_session.commit()
|
||||
await db_session.refresh(overhaul)
|
||||
return overhaul
|
||||
@ -1,20 +0,0 @@
|
||||
from typing import Any, Dict, Optional
|
||||
from .enums import OverhaulStatus
|
||||
from src.maximo.service import MaximoDataMapper
|
||||
|
||||
|
||||
async def determine_overhaul_status(maximo_data: Dict[Any, Any]) -> tuple[str, Optional[str]]:
|
||||
"""Map MAXIMO status to our status enum"""
|
||||
mapper = MaximoDataMapper(maximo_data)
|
||||
maximo_status = mapper.get_status()
|
||||
|
||||
# TODO: Update these mappings based on actual MAXIMO status values
|
||||
status_mapping = {
|
||||
'COMP': OverhaulStatus.COMPLETED,
|
||||
'INPRG': OverhaulStatus.IN_PROGRESS,
|
||||
'PLAN': OverhaulStatus.PLANNED,
|
||||
'HOLD': OverhaulStatus.ON_HOLD,
|
||||
# Add other status mappings based on actual MAXIMO statuses
|
||||
}
|
||||
|
||||
return status_mapping.get(maximo_status, OverhaulStatus.PLANNED), None
|
||||
@ -1,16 +0,0 @@
|
||||
|
||||
from sqlalchemy import UUID, Column, DateTime, Float, ForeignKey, Integer, String
|
||||
from sqlalchemy.orm import relationship
|
||||
from src.database.core import Base
|
||||
from src.models import DefaultMixin
|
||||
|
||||
|
||||
class OverhaulSchedule(Base, DefaultMixin):
|
||||
__tablename__ = "oh_tr_overhaul_schedule"
|
||||
|
||||
scope_id = Column(UUID(as_uuid=True), ForeignKey(
|
||||
"oh_scope.id"), nullable=True)
|
||||
start_date = Column(DateTime(timezone=True))
|
||||
end_date = Column(DateTime(timezone=True))
|
||||
|
||||
scope = relationship("Scope", backref="overhaul_schedules", lazy="raise")
|
||||
@ -1,37 +0,0 @@
|
||||
|
||||
from typing import List
|
||||
from fastapi import APIRouter, HTTPException, status
|
||||
|
||||
from src.maximo.service import MaximoService
|
||||
|
||||
from .schema import OverhaulScheduleCreate, OverhaulScheduleRead
|
||||
from .service import get, get_all, create
|
||||
|
||||
from src.database.service import CommonParameters, search_filter_sort_paginate
|
||||
from src.database.core import DbSession
|
||||
from src.auth.service import CurrentUser
|
||||
from src.models import StandardResponse
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.get("", response_model=StandardResponse[List[OverhaulScheduleRead]])
|
||||
async def get_schedules(db_session: DbSession):
|
||||
"""Get all scope pagination."""
|
||||
schedules = await get_all(db_session=db_session)
|
||||
# return
|
||||
return StandardResponse(
|
||||
data=schedules,
|
||||
message="Data retrieved successfully",
|
||||
)
|
||||
|
||||
|
||||
|
||||
@router.post("", response_model=StandardResponse[OverhaulScheduleRead])
|
||||
async def create_schedule(db_session: DbSession, overhaul_schedule_in: OverhaulScheduleCreate):
|
||||
|
||||
schedule = await create(db_session=db_session, overhaul_schedule_in=overhaul_schedule_in)
|
||||
|
||||
# raise Exception(schedule.scope)
|
||||
|
||||
return StandardResponse(data=schedule, message="Data created successfully")
|
||||
@ -1,33 +0,0 @@
|
||||
from datetime import datetime
|
||||
from typing import List, Optional, Union
|
||||
from uuid import UUID
|
||||
|
||||
|
||||
from pydantic import Field
|
||||
from src.models import DefultBase, Pagination
|
||||
from src.scope.schema import ScopeRead
|
||||
|
||||
|
||||
class OverhaulScheduleBase(DefultBase):
|
||||
pass
|
||||
|
||||
|
||||
class OverhaulScheduleCreate(OverhaulScheduleBase):
|
||||
scope_id: Union[UUID, str]
|
||||
start_date: datetime
|
||||
end_date: Optional[datetime] = Field(None)
|
||||
|
||||
|
||||
class OverhaulScheduleUpdate(OverhaulScheduleBase):
|
||||
pass
|
||||
|
||||
|
||||
class OverhaulScheduleRead(OverhaulScheduleBase):
|
||||
id: UUID
|
||||
scope: Optional[ScopeRead] = Field(None)
|
||||
start_date: datetime
|
||||
end_date: Optional[datetime]
|
||||
|
||||
|
||||
class OverhaulSchedulePagination(Pagination):
|
||||
items: List[OverhaulScheduleRead] = []
|
||||
@ -1,68 +0,0 @@
|
||||
|
||||
|
||||
from fastapi import HTTPException
|
||||
from sqlalchemy import Select, Delete, and_
|
||||
from sqlalchemy.orm import selectinload
|
||||
|
||||
from .model import OverhaulSchedule
|
||||
from .schema import OverhaulScheduleCreate, OverhaulScheduleUpdate
|
||||
from typing import Optional
|
||||
|
||||
from src.database.core import DbSession
|
||||
from src.scope.service import get_by_scope_name
|
||||
|
||||
|
||||
async def get(*, db_session: DbSession, overhaul_history_id: str) -> Optional[OverhaulSchedule]:
|
||||
"""Returns a document based on the given document id."""
|
||||
result = await db_session.get(OverhaulSchedule, overhaul_history_id)
|
||||
return result.scalars().one_or_none()
|
||||
|
||||
|
||||
async def get_all(*, db_session: DbSession):
|
||||
"""Returns all documents."""
|
||||
query = Select(OverhaulSchedule).options(
|
||||
selectinload(OverhaulSchedule.scope))
|
||||
result = await db_session.execute(query)
|
||||
return result.scalars().all()
|
||||
|
||||
|
||||
async def create(*, db_session: DbSession, overhaul_schedule_in: OverhaulScheduleCreate):
|
||||
"""Creates a new document."""
|
||||
scope = await get_by_scope_name(db_session=db_session, scope_name=overhaul_schedule_in.scope_id)
|
||||
|
||||
if not scope:
|
||||
raise HTTPException(
|
||||
status_code=404,
|
||||
detail="Not Found"
|
||||
)
|
||||
overhaul_schedule_in.scope_id = scope.id
|
||||
|
||||
overhaul_schedule = OverhaulSchedule(**overhaul_schedule_in.model_dump())
|
||||
|
||||
db_session.add(overhaul_schedule)
|
||||
await db_session.commit()
|
||||
results = Select(OverhaulSchedule).options(selectinload(OverhaulSchedule.scope)).filter(OverhaulSchedule.id == overhaul_schedule.id)
|
||||
return await db_session.scalar(results)
|
||||
|
||||
|
||||
async def update(*, db_session: DbSession, overhaul_schedule: OverhaulSchedule, overhaul_schedule_in: OverhaulScheduleUpdate):
|
||||
"""Updates a document."""
|
||||
data = overhaul_schedule_in.model_dump()
|
||||
|
||||
update_data = overhaul_schedule_in.model_dump(exclude_defaults=True)
|
||||
|
||||
for field in data:
|
||||
if field in update_data:
|
||||
setattr(overhaul_schedule, field, update_data[field])
|
||||
|
||||
await db_session.commit()
|
||||
|
||||
return overhaul_schedule
|
||||
|
||||
|
||||
async def delete(*, db_session: DbSession, overhaul_schedule_id: str):
|
||||
"""Deletes a document."""
|
||||
query = Delete(OverhaulSchedule).where(
|
||||
overhaul_schedule_id == overhaul_schedule_id)
|
||||
await db_session.execute(query)
|
||||
await db_session.commit()
|
||||
@ -0,0 +1,17 @@
|
||||
|
||||
from sqlalchemy import Column, DateTime, Float, Integer, String
|
||||
from src.database.core import Base
|
||||
from src.models import DefaultMixin, IdentityMixin, TimeStampMixin
|
||||
|
||||
|
||||
class OverhaulScope(Base, DefaultMixin):
|
||||
__tablename__ = "oh_ms_overhaul_scope"
|
||||
|
||||
type = Column(String, nullable=True)
|
||||
start_date = Column(DateTime(timezone=True))
|
||||
end_date = Column(DateTime(timezone=True))
|
||||
duration_oh = Column(Integer, nullable=True)
|
||||
crew_number = Column(Integer, nullable=True, default=1)
|
||||
status = Column(String, nullable=False, default="upcoming")
|
||||
|
||||
|
||||
@ -0,0 +1,93 @@
|
||||
|
||||
|
||||
from sqlalchemy import Select, Delete
|
||||
|
||||
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 .model import OverhaulScope
|
||||
from .schema import ScopeCreate, ScopeUpdate
|
||||
from typing import Optional
|
||||
|
||||
from src.database.core import DbSession
|
||||
from src.auth.service import CurrentUser
|
||||
|
||||
|
||||
async def get(*, db_session: DbSession, overhaul_session_id: str) -> Optional[OverhaulScope]:
|
||||
"""Returns a document based on the given document id."""
|
||||
query = Select(OverhaulScope).filter(
|
||||
OverhaulScope.id == overhaul_session_id)
|
||||
result = await db_session.execute(query)
|
||||
return result.scalars().one_or_none()
|
||||
|
||||
|
||||
async def get_all(*, common, scope_name: Optional[str] = None):
|
||||
"""Returns all documents."""
|
||||
query = Select(OverhaulScope)
|
||||
|
||||
if scope_name:
|
||||
query = query.filter(OverhaulScope.type == scope_name)
|
||||
|
||||
results = await search_filter_sort_paginate(model=query, **common)
|
||||
return results
|
||||
|
||||
|
||||
async def create(*, db_session: DbSession, scope_in: ScopeCreate):
|
||||
"""Creates a new document."""
|
||||
overhaul_session = OverhaulScope(**scope_in.model_dump())
|
||||
db_session.add(overhaul_session)
|
||||
# Need to flush to get the id
|
||||
await db_session.flush()
|
||||
|
||||
scope_name = scope_in.type
|
||||
|
||||
# Fix the function call - parameters were in wrong order
|
||||
equipments = await get_by_scope_name(
|
||||
db_session=db_session,
|
||||
scope_name=scope_name
|
||||
)
|
||||
|
||||
scope_equipments = [
|
||||
OverhaulActivity(
|
||||
assetnum=equipment.assetnum,
|
||||
overhaul_scope_id=overhaul_session.id,
|
||||
material_cost=100000,
|
||||
service_cost=100000,
|
||||
)
|
||||
for equipment in equipments
|
||||
]
|
||||
|
||||
if scope_equipments: # Only add if there are items
|
||||
db_session.add_all(scope_equipments)
|
||||
|
||||
await db_session.commit()
|
||||
return overhaul_session
|
||||
|
||||
|
||||
async def update(*, db_session: DbSession, scope: OverhaulScope, scope_in: ScopeUpdate):
|
||||
"""Updates a document."""
|
||||
data = scope_in.model_dump()
|
||||
|
||||
update_data = scope_in.model_dump(exclude_defaults=True)
|
||||
|
||||
for field in data:
|
||||
if field in update_data:
|
||||
setattr(scope, field, update_data[field])
|
||||
|
||||
await db_session.commit()
|
||||
|
||||
return scope
|
||||
|
||||
|
||||
async def delete(*, db_session: DbSession, scope_id: str):
|
||||
"""Deletes a document."""
|
||||
query = Delete(OverhaulScope).where(OverhaulScope.id == scope_id)
|
||||
await db_session.execute(query)
|
||||
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()
|
||||
@ -1,12 +0,0 @@
|
||||
|
||||
from sqlalchemy import Column, Float, Integer, String
|
||||
from src.database.core import Base
|
||||
from src.models import DefaultMixin, IdentityMixin, TimeStampMixin
|
||||
|
||||
|
||||
class Scope(Base, DefaultMixin):
|
||||
__tablename__ = "oh_scope"
|
||||
|
||||
scope_name = Column(String, nullable=True)
|
||||
duration_oh = Column(Integer, nullable=True)
|
||||
crew = Column(Integer, nullable=True)
|
||||
@ -1,60 +0,0 @@
|
||||
|
||||
|
||||
from sqlalchemy import Select, Delete
|
||||
from .model import Scope
|
||||
from .schema import ScopeCreate, ScopeUpdate
|
||||
from typing import Optional
|
||||
|
||||
from src.database.core import DbSession
|
||||
from src.auth.service import CurrentUser
|
||||
|
||||
|
||||
async def get(*, db_session: DbSession, scope_id: str) -> Optional[Scope]:
|
||||
"""Returns a document based on the given document id."""
|
||||
query = Select(Scope).filter(Scope.id == scope_id)
|
||||
result = await db_session.execute(query)
|
||||
return result.scalars().one_or_none()
|
||||
|
||||
|
||||
async def get_all(*, db_session: DbSession):
|
||||
"""Returns all documents."""
|
||||
query = Select(Scope)
|
||||
result = await db_session.execute(query)
|
||||
return result.scalars().all()
|
||||
|
||||
|
||||
async def create(*, db_session: DbSession, scope_in: ScopeCreate):
|
||||
"""Creates a new document."""
|
||||
scope = Scope(**scope_in.model_dump())
|
||||
db_session.add(scope)
|
||||
await db_session.commit()
|
||||
return scope
|
||||
|
||||
|
||||
async def update(*, db_session: DbSession, scope: Scope, scope_in: ScopeUpdate):
|
||||
"""Updates a document."""
|
||||
data = scope_in.model_dump()
|
||||
|
||||
update_data = scope_in.model_dump(exclude_defaults=True)
|
||||
|
||||
for field in data:
|
||||
if field in update_data:
|
||||
setattr(scope, field, update_data[field])
|
||||
|
||||
await db_session.commit()
|
||||
|
||||
return scope
|
||||
|
||||
|
||||
async def delete(*, db_session: DbSession, scope_id: str):
|
||||
"""Deletes a document."""
|
||||
query = Delete(Scope).where(Scope.id == scope_id)
|
||||
await db_session.execute(query)
|
||||
await db_session.commit()
|
||||
|
||||
|
||||
async def get_by_scope_name(*, db_session: DbSession, scope_name: str) -> Optional[Scope]:
|
||||
"""Returns a document based on the given document id."""
|
||||
query = Select(Scope).filter(Scope.scope_name == scope_name)
|
||||
result = await db_session.execute(query)
|
||||
return result.scalars().one_or_none()
|
||||
@ -0,0 +1,8 @@
|
||||
|
||||
|
||||
from src.enums import OptimumOHEnum
|
||||
|
||||
|
||||
class ScopeEquipmentType(OptimumOHEnum):
|
||||
TEMP = "Temporary"
|
||||
PERM = "Permanent"
|
||||
@ -1,18 +0,0 @@
|
||||
|
||||
from sqlalchemy import UUID, Column, Float, Integer, String, ForeignKey
|
||||
from src.database.core import Base
|
||||
from src.models import DefaultMixin, IdentityMixin, TimeStampMixin
|
||||
from sqlalchemy.orm import relationship
|
||||
from src.workorder.model import MasterWorkOrder
|
||||
from sqlalchemy.ext.hybrid import hybrid_property
|
||||
|
||||
|
||||
class ScopeEquipmentActivity(Base, DefaultMixin):
|
||||
__tablename__ = "oh_tr_overhaul_activity"
|
||||
|
||||
assetnum = Column(String, nullable=True)
|
||||
name = Column(String, nullable=False)
|
||||
cost = Column(Float, nullable=False, default=0)
|
||||
|
||||
scope_equipments = relationship(
|
||||
"ScopeEquipment", lazy="raise", primaryjoin="and_(ScopeEquipmentActivity.assetnum == foreign(ScopeEquipment.assetnum))", uselist=False)
|
||||
@ -1,71 +0,0 @@
|
||||
|
||||
from fastapi import APIRouter, HTTPException, Query, status
|
||||
|
||||
|
||||
from .service import get_all, create, get, update, delete
|
||||
from .schema import ScopeEquipmentActivityCreate, ScopeEquipmentActivityPagination, ScopeEquipmentActivityRead, ScopeEquipmentActivityUpdate
|
||||
|
||||
from src.models import StandardResponse
|
||||
from src.database.service import CommonParameters, search_filter_sort_paginate, DbSession
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.get("", response_model=StandardResponse[ScopeEquipmentActivityPagination])
|
||||
async def get_scope_equipment_activities(common: CommonParameters, assetnum: str = Query(None)):
|
||||
"""Get all scope activity pagination."""
|
||||
# return
|
||||
data = await get_all(common=common, assetnum=assetnum)
|
||||
|
||||
return StandardResponse(
|
||||
data=data,
|
||||
message="Data retrieved successfully",
|
||||
)
|
||||
|
||||
|
||||
@router.post("", response_model=StandardResponse[ScopeEquipmentActivityRead])
|
||||
async def create_activity(db_session: DbSession, scope_equipment_activity_in: ScopeEquipmentActivityCreate):
|
||||
|
||||
activity = await create(db_session=db_session, scope_equipment_activty_in=scope_equipment_activity_in)
|
||||
|
||||
return StandardResponse(data=activity, message="Data created successfully")
|
||||
|
||||
|
||||
@router.get("/{scope_equipment_activity_id}", response_model=StandardResponse[ScopeEquipmentActivityRead])
|
||||
async def get_activity(db_session: DbSession, scope_equipment_activity_id: str):
|
||||
activity = await get(db_session=db_session, scope_equipment_activity_id=scope_equipment_activity_id)
|
||||
if not activity:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="A data with this id does not exist.",
|
||||
)
|
||||
|
||||
return StandardResponse(data=activity, message="Data retrieved successfully")
|
||||
|
||||
|
||||
@router.put("/{scope_equipment_activity_id}", response_model=StandardResponse[ScopeEquipmentActivityRead])
|
||||
async def update_scope(db_session: DbSession, scope_equipment_activity_in: ScopeEquipmentActivityUpdate, scope_equipment_activity_id):
|
||||
activity = await get(db_session=db_session, scope_equipment_activity_id=scope_equipment_activity_id)
|
||||
|
||||
if not activity:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="A data with this id does not exist.",
|
||||
)
|
||||
|
||||
return StandardResponse(data=await update(db_session=db_session, activity=activity, scope_equipment_activity_in=scope_equipment_activity_in), message="Data updated successfully")
|
||||
|
||||
|
||||
@router.delete("/{scope_equipment_activity_id}", response_model=StandardResponse[ScopeEquipmentActivityRead])
|
||||
async def delete_scope(db_session: DbSession, scope_equipment_activity_id: str):
|
||||
activity = await get(db_session=db_session, scope_equipment_activity_id=scope_equipment_activity_id)
|
||||
|
||||
if not activity:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail=[{"msg": "A data with this id does not exist."}],
|
||||
)
|
||||
|
||||
await delete(db_session=db_session, scope_equipment_activity_id=scope_equipment_activity_id)
|
||||
|
||||
return StandardResponse(message="Data deleted successfully", data=activity)
|
||||
@ -1,58 +0,0 @@
|
||||
|
||||
|
||||
from sqlalchemy import Select, Delete
|
||||
from typing import Optional
|
||||
|
||||
from .model import ScopeEquipmentActivity
|
||||
from .schema import ScopeEquipmentActivityCreate, ScopeEquipmentActivityUpdate
|
||||
|
||||
from src.database.core import DbSession
|
||||
from src.database.service import CommonParameters, search_filter_sort_paginate
|
||||
from src.auth.service import CurrentUser
|
||||
|
||||
|
||||
async def get(*, db_session: DbSession, scope_equipment_activity_id: str) -> Optional[ScopeEquipmentActivity]:
|
||||
"""Returns a document based on the given document id."""
|
||||
result = await db_session.get(ScopeEquipmentActivity, scope_equipment_activity_id)
|
||||
return result
|
||||
|
||||
|
||||
async def get_all(common: CommonParameters, assetnum: Optional[str]):
|
||||
query = Select(ScopeEquipmentActivity)
|
||||
|
||||
if assetnum:
|
||||
query = query.filter(ScopeEquipmentActivity.assetnum == assetnum)
|
||||
|
||||
results = await search_filter_sort_paginate(model=query, **common)
|
||||
|
||||
return results
|
||||
|
||||
|
||||
async def create(*, db_session: DbSession, scope_equipment_activty_in: ScopeEquipmentActivityCreate):
|
||||
activity = ScopeEquipmentActivity(
|
||||
**scope_equipment_activty_in.model_dump())
|
||||
db_session.add(activity)
|
||||
await db_session.commit()
|
||||
return activity
|
||||
|
||||
|
||||
async def update(*, db_session: DbSession, activity: ScopeEquipmentActivity, scope_equipment_activity_in: ScopeEquipmentActivityUpdate):
|
||||
"""Updates a document."""
|
||||
data = scope_equipment_activity_in.model_dump()
|
||||
|
||||
update_data = scope_equipment_activity_in.model_dump(exclude_defaults=True)
|
||||
|
||||
for field in data:
|
||||
if field in update_data:
|
||||
setattr(activity, field, update_data[field])
|
||||
|
||||
await db_session.commit()
|
||||
|
||||
return activity
|
||||
|
||||
|
||||
async def delete(*, db_session: DbSession, scope_equipment_activity_id: str):
|
||||
"""Deletes a document."""
|
||||
activity = await db_session.get(ScopeEquipmentActivity, scope_equipment_activity_id)
|
||||
await db_session.delete(activity)
|
||||
await db_session.commit()
|
||||
Loading…
Reference in New Issue