import uuid from typing import Sequence from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.models.startup_feasibility import StartupFeasibility from app.models.startup_ethics import StartupEthics from app.models.kickoff_meeting import KickoffMeeting from app.models.training_authorization import TrainingAuthorization from app.schemas.startup import ( KickoffMeetingCreate, KickoffMeetingUpdate, StartupEthicsCreate, StartupEthicsUpdate, StartupFeasibilityCreate, StartupFeasibilityUpdate, TrainingAuthorizationCreate, TrainingAuthorizationUpdate, ) async def create_feasibility( db: AsyncSession, study_id: uuid.UUID, record_in: StartupFeasibilityCreate, created_by: uuid.UUID | None, ) -> StartupFeasibility: record = StartupFeasibility( study_id=study_id, site_id=record_in.site_id, submit_date=record_in.submit_date, accept_date=record_in.accept_date, approved_date=record_in.approved_date, project_no=record_in.project_no, created_by=created_by, ) db.add(record) await db.commit() await db.refresh(record) return record async def get_feasibility(db: AsyncSession, record_id: uuid.UUID) -> StartupFeasibility | None: result = await db.execute(select(StartupFeasibility).where(StartupFeasibility.id == record_id)) return result.scalar_one_or_none() async def list_feasibilities( db: AsyncSession, study_id: uuid.UUID, skip: int = 0, limit: int = 100, ) -> Sequence[StartupFeasibility]: stmt = ( select(StartupFeasibility) .where(StartupFeasibility.study_id == study_id) .order_by(StartupFeasibility.created_at.desc()) .offset(skip) .limit(limit) ) result = await db.execute(stmt) return result.scalars().all() async def update_feasibility( db: AsyncSession, record: StartupFeasibility, record_in: StartupFeasibilityUpdate ) -> StartupFeasibility: update_data = record_in.model_dump(exclude_unset=True) for key, value in update_data.items(): setattr(record, key, value) await db.commit() await db.refresh(record) return record async def delete_feasibility(db: AsyncSession, record: StartupFeasibility) -> None: await db.delete(record) await db.commit() async def create_ethics( db: AsyncSession, study_id: uuid.UUID, record_in: StartupEthicsCreate, created_by: uuid.UUID | None, ) -> StartupEthics: record = StartupEthics( study_id=study_id, site_id=record_in.site_id, submit_date=record_in.submit_date, accept_date=record_in.accept_date, meeting_date=record_in.meeting_date, approved_date=record_in.approved_date, approval_no=record_in.approval_no, created_by=created_by, ) db.add(record) await db.commit() await db.refresh(record) return record async def get_ethics(db: AsyncSession, record_id: uuid.UUID) -> StartupEthics | None: result = await db.execute(select(StartupEthics).where(StartupEthics.id == record_id)) return result.scalar_one_or_none() async def list_ethics( db: AsyncSession, study_id: uuid.UUID, skip: int = 0, limit: int = 100, ) -> Sequence[StartupEthics]: stmt = ( select(StartupEthics) .where(StartupEthics.study_id == study_id) .order_by(StartupEthics.created_at.desc()) .offset(skip) .limit(limit) ) result = await db.execute(stmt) return result.scalars().all() async def update_ethics( db: AsyncSession, record: StartupEthics, record_in: StartupEthicsUpdate ) -> StartupEthics: update_data = record_in.model_dump(exclude_unset=True) for key, value in update_data.items(): setattr(record, key, value) await db.commit() await db.refresh(record) return record async def delete_ethics(db: AsyncSession, record: StartupEthics) -> None: await db.delete(record) await db.commit() async def create_kickoff( db: AsyncSession, study_id: uuid.UUID, meeting_in: KickoffMeetingCreate, created_by: uuid.UUID | None, ) -> KickoffMeeting: meeting = KickoffMeeting( study_id=study_id, site_id=meeting_in.site_id, kickoff_date=meeting_in.kickoff_date, attendees=meeting_in.attendees, created_by=created_by, ) db.add(meeting) await db.commit() await db.refresh(meeting) return meeting async def get_kickoff(db: AsyncSession, meeting_id: uuid.UUID) -> KickoffMeeting | None: result = await db.execute(select(KickoffMeeting).where(KickoffMeeting.id == meeting_id)) return result.scalar_one_or_none() async def list_kickoffs( db: AsyncSession, study_id: uuid.UUID, skip: int = 0, limit: int = 100, ) -> Sequence[KickoffMeeting]: stmt = ( select(KickoffMeeting) .where(KickoffMeeting.study_id == study_id) .order_by(KickoffMeeting.created_at.desc()) .offset(skip) .limit(limit) ) result = await db.execute(stmt) return result.scalars().all() async def update_kickoff( db: AsyncSession, meeting: KickoffMeeting, meeting_in: KickoffMeetingUpdate ) -> KickoffMeeting: update_data = meeting_in.model_dump(exclude_unset=True) for key, value in update_data.items(): setattr(meeting, key, value) await db.commit() await db.refresh(meeting) return meeting async def create_training_authorization( db: AsyncSession, study_id: uuid.UUID, record_in: TrainingAuthorizationCreate, created_by: uuid.UUID | None, ) -> TrainingAuthorization: record = TrainingAuthorization( study_id=study_id, name=record_in.name, role=record_in.role, site_name=record_in.site_name, trained=record_in.trained, authorized=record_in.authorized, trained_date=record_in.trained_date, authorized_date=record_in.authorized_date, remark=record_in.remark, created_by=created_by, ) db.add(record) await db.commit() await db.refresh(record) return record async def get_training_authorization( db: AsyncSession, record_id: uuid.UUID ) -> TrainingAuthorization | None: result = await db.execute(select(TrainingAuthorization).where(TrainingAuthorization.id == record_id)) return result.scalar_one_or_none() async def list_training_authorizations( db: AsyncSession, study_id: uuid.UUID, skip: int = 0, limit: int = 200, ) -> Sequence[TrainingAuthorization]: stmt = ( select(TrainingAuthorization) .where(TrainingAuthorization.study_id == study_id) .order_by(TrainingAuthorization.created_at.desc()) .offset(skip) .limit(limit) ) result = await db.execute(stmt) return result.scalars().all() async def update_training_authorization( db: AsyncSession, record: TrainingAuthorization, record_in: TrainingAuthorizationUpdate ) -> TrainingAuthorization: update_data = record_in.model_dump(exclude_unset=True) for key, value in update_data.items(): setattr(record, key, value) await db.commit() await db.refresh(record) return record async def delete_training_authorization(db: AsyncSession, record: TrainingAuthorization) -> None: await db.delete(record) await db.commit()