diff --git a/backend/app/services/psa/autotask/provider.py b/backend/app/services/psa/autotask/provider.py index f7fb21fe..3af30de9 100644 --- a/backend/app/services/psa/autotask/provider.py +++ b/backend/app/services/psa/autotask/provider.py @@ -13,6 +13,9 @@ from app.services.psa.types import ( PSATimeEntry, PSABoard, PaginatedTicketResult, + PSAResource, + PSACreatedTicket, + TicketCreatePayload, ) @@ -75,3 +78,18 @@ class AutotaskProvider(PSAProvider): work_type: str | None = None, ) -> PSATimeEntry: raise NotImplementedError("Autotask integration coming soon") + + async def list_resources(self, ticket_id: int) -> list[PSAResource]: + raise NotImplementedError("Autotask integration coming soon") + + async def add_resource(self, ticket_id: int, member_id: int) -> PSAResource: + raise NotImplementedError("Autotask integration coming soon") + + async def remove_resource(self, ticket_id: int, member_id: int) -> None: + raise NotImplementedError("Autotask integration coming soon") + + async def create_ticket(self, payload: TicketCreatePayload) -> PSACreatedTicket: + raise NotImplementedError("Autotask integration coming soon") + + async def list_priorities(self) -> list[dict]: + raise NotImplementedError("Autotask integration coming soon") diff --git a/backend/app/services/psa/base.py b/backend/app/services/psa/base.py index 913dbaee..8f3ab8a8 100644 --- a/backend/app/services/psa/base.py +++ b/backend/app/services/psa/base.py @@ -14,6 +14,9 @@ from .types import ( PSATimeEntry, PSABoard, PaginatedTicketResult, + PSAResource, + PSACreatedTicket, + TicketCreatePayload, ) @@ -84,3 +87,23 @@ class PSAProvider(ABC): work_type: str | None = None, ) -> PSATimeEntry: ... + + @abstractmethod + async def list_resources(self, ticket_id: int) -> list[PSAResource]: + ... + + @abstractmethod + async def add_resource(self, ticket_id: int, member_id: int) -> PSAResource: + ... + + @abstractmethod + async def remove_resource(self, ticket_id: int, member_id: int) -> None: + ... + + @abstractmethod + async def create_ticket(self, payload: TicketCreatePayload) -> PSACreatedTicket: + ... + + @abstractmethod + async def list_priorities(self) -> list[dict]: + ... diff --git a/backend/app/services/psa/halopsa/provider.py b/backend/app/services/psa/halopsa/provider.py index 2855d5e2..d8f2573e 100644 --- a/backend/app/services/psa/halopsa/provider.py +++ b/backend/app/services/psa/halopsa/provider.py @@ -13,6 +13,9 @@ from app.services.psa.types import ( PSATimeEntry, PSABoard, PaginatedTicketResult, + PSAResource, + PSACreatedTicket, + TicketCreatePayload, ) @@ -75,3 +78,18 @@ class HaloPSAProvider(PSAProvider): work_type: str | None = None, ) -> PSATimeEntry: raise NotImplementedError("Halo PSA integration coming soon") + + async def list_resources(self, ticket_id: int) -> list[PSAResource]: + raise NotImplementedError("Halo PSA integration coming soon") + + async def add_resource(self, ticket_id: int, member_id: int) -> PSAResource: + raise NotImplementedError("Halo PSA integration coming soon") + + async def remove_resource(self, ticket_id: int, member_id: int) -> None: + raise NotImplementedError("Halo PSA integration coming soon") + + async def create_ticket(self, payload: TicketCreatePayload) -> PSACreatedTicket: + raise NotImplementedError("Halo PSA integration coming soon") + + async def list_priorities(self) -> list[dict]: + raise NotImplementedError("Halo PSA integration coming soon") diff --git a/backend/app/services/psa/types.py b/backend/app/services/psa/types.py index 025fe756..2ac841b5 100644 --- a/backend/app/services/psa/types.py +++ b/backend/app/services/psa/types.py @@ -80,6 +80,33 @@ class PaginatedTicketResult(BaseModel): page_size: int +class PSAResource(BaseModel): + member_id: int + member_name: str + member_identifier: str + is_rf_user: bool = False + + +class PSACreatedTicket(BaseModel): + id: int + summary: str + board_name: str + status_name: str + priority_name: str + company_name: str + resources: list[PSAResource] = [] + + +class TicketCreatePayload(BaseModel): + summary: str + company_id: int + board_id: int + status_id: int + priority_id: int + description: str | None = None + assigned_member_id: int | None = None + + class NoteType: INTERNAL_ANALYSIS = "internal_analysis" RESOLUTION = "resolution"