import uuid from typing import Sequence from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.models.finance_special import FinanceSpecial from app.schemas.finance_special import FinanceSpecialCreate, FinanceSpecialUpdate async def create_special( db: AsyncSession, study_id: uuid.UUID, special_in: FinanceSpecialCreate, created_by: uuid.UUID | None, ) -> FinanceSpecial: special = FinanceSpecial( study_id=study_id, site_name=special_in.site_name, fee_type=special_in.fee_type, amount=special_in.amount, occur_date=special_in.occur_date, staff_name=special_in.staff_name, remark=special_in.remark, created_by=created_by, ) db.add(special) await db.commit() await db.refresh(special) return special async def get_special(db: AsyncSession, special_id: uuid.UUID) -> FinanceSpecial | None: result = await db.execute(select(FinanceSpecial).where(FinanceSpecial.id == special_id)) return result.scalar_one_or_none() async def list_specials( db: AsyncSession, study_id: uuid.UUID, site_name: str | None = None, fee_type: str | None = None, skip: int = 0, limit: int = 100, ) -> Sequence[FinanceSpecial]: stmt = select(FinanceSpecial).where(FinanceSpecial.study_id == study_id) if site_name: stmt = stmt.where(FinanceSpecial.site_name.ilike(f"%{site_name}%")) if fee_type: stmt = stmt.where(FinanceSpecial.fee_type == fee_type) stmt = stmt.order_by(FinanceSpecial.created_at.desc()).offset(skip).limit(limit) result = await db.execute(stmt) return result.scalars().all() async def update_special( db: AsyncSession, special: FinanceSpecial, special_in: FinanceSpecialUpdate ) -> FinanceSpecial: update_data = special_in.model_dump(exclude_unset=True) for key, value in update_data.items(): setattr(special, key, value) await db.commit() await db.refresh(special) return special async def delete_special(db: AsyncSession, special: FinanceSpecial) -> None: await db.delete(special) await db.commit()