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