diff --git a/api/src/api/v1/expense_item.py b/api/src/api/v1/expense_item.py index 27ec439..b919b96 100644 --- a/api/src/api/v1/expense_item.py +++ b/api/src/api/v1/expense_item.py @@ -2,6 +2,7 @@ from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession +from src.db.models.form_type import FormTypeEnum from src.services.expense_item_service import ExpenseItemService from src.db.models.app_user import AppUser from src.api.v1.deps import require_admin, require_executor @@ -41,10 +42,18 @@ async def get_expense_item_by_id( db: AsyncSession = Depends(get_db), current_user: AppUser = Depends(require_executor), r_start: bool | None = None, + sheet: str | None = None, + direction: str | None = None, + form_type: FormTypeEnum | str | None = None ): """Получение записей expense item""" service = ExpenseItemService(db) - result = await service.get_list(r_start=r_start) + result = await service.get_list( + r_start=r_start, + sheet=sheet, + direction=direction, + form_type=form_type, + ) return BaseListResponse( success=True, diff --git a/api/src/db/models/__init__.py b/api/src/db/models/__init__.py index d8e60fa..b54b077 100644 --- a/api/src/db/models/__init__.py +++ b/api/src/db/models/__init__.py @@ -9,7 +9,7 @@ from src.db.models.ckk import Ckk from src.db.models.collegial_approval import CollegialApproval from src.db.models.contract_detail import ContractDetail from src.db.models.contract_summary import ContractSummary -from src.db.models.expense_item import ExpenseItem +from src.db.models.expense_item import ExpenseItem, ExpenseItemFormType from src.db.models.form3_phase import Form3Phase from src.db.models.form_limit import FormLimit from src.db.models.form_phase import FormPhase diff --git a/api/src/db/models/expense_item.py b/api/src/db/models/expense_item.py index b052809..6f1dc62 100644 --- a/api/src/db/models/expense_item.py +++ b/api/src/db/models/expense_item.py @@ -25,3 +25,12 @@ class ExpenseItem(Base): direction: Mapped[str | None] = mapped_column(String) parent_id: Mapped[int | None] = mapped_column(Integer, ForeignKey("v3.expense_item.id")) depth: Mapped[int | None] = mapped_column(Integer, default=0) + + + +class ExpenseItemFormType(Base): + __tablename__ = "expense_item_form_type" + __table_args__ = {"schema": "v3"} + + form_type_code: Mapped[str] = mapped_column(String, primary_key=True) + expense_item_id: Mapped[int] = mapped_column(Integer, ForeignKey("v3.expense_item.id"), primary_key=True) diff --git a/api/src/repository/expense_item_repository.py b/api/src/repository/expense_item_repository.py index 7b109e6..7d115c4 100644 --- a/api/src/repository/expense_item_repository.py +++ b/api/src/repository/expense_item_repository.py @@ -1,7 +1,8 @@ from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession -from src.db.models.expense_item import ExpenseItem +from src.db.models.form_type import FormTypeEnum +from src.db.models.expense_item import ExpenseItem, ExpenseItemFormType class ExpenseItemRepository: @@ -12,10 +13,31 @@ class ExpenseItemRepository: query = select(ExpenseItem).where(ExpenseItem.id == item_id).limit(1) return (await self.db.execute(query)).scalar_one_or_none() - async def get_list(self, r_start: bool | None = None) -> list[ExpenseItem]: + async def get_list( + self, + r_start: bool | None = None, + sheet: str | None = None, + direction: str | None = None, + form_type: FormTypeEnum | str | None = None, + ) -> list[ExpenseItem]: where = [] + query = select(ExpenseItem) + if form_type is not None: + query = query.join( + ExpenseItemFormType, + ExpenseItemFormType.expense_item_id == ExpenseItem.id, + ).where( + ExpenseItemFormType.form_type_code == (form_type.value if isinstance(form_type, FormTypeEnum) else form_type) + ) if r_start is not None: where.append(ExpenseItem.item_id.startswith("R")) + if sheet is not None: + where.append(ExpenseItem.sheet == sheet) + if direction is not None: + where.append(ExpenseItem.direction == direction) + query = query.where(*where) - query = select(ExpenseItem).where(*where) + + + return (await self.db.execute(query)).scalars().all() diff --git a/api/src/services/expense_item_service.py b/api/src/services/expense_item_service.py index e3982d8..d3b82cd 100644 --- a/api/src/services/expense_item_service.py +++ b/api/src/services/expense_item_service.py @@ -1,5 +1,6 @@ from sqlalchemy.ext.asyncio import AsyncSession +from src.db.models.form_type import FormTypeEnum from src.db.models.role import UserRoleEnum from src.db.models.app_user import AppUser from src.db.models.expense_item import ExpenseItem @@ -22,5 +23,13 @@ class ExpenseItemService: async def get_list( self, r_start: bool | None = None, + sheet: str | None = None, + direction: str | None = None, + form_type: FormTypeEnum | str | None = None, ) -> list[ExpenseItem]: - return await self.repo.get_list(r_start=r_start) + return await self.repo.get_list( + r_start=r_start, + sheet=sheet, + direction=direction, + form_type=form_type, + )