Files
group_fqcd_jr/app/repository/investment_goal_repository.py
T

54 lines
2.0 KiB
Python

"""Repository for investment goals and reviewed goal-book content."""
from datetime import datetime
from typing import cast
from sqlalchemy import select, update
from sqlalchemy.ext.asyncio import AsyncSession
from app.model.investment_goal import AdvisorInvestmentGoal, ClientFacingContent
class InvestmentGoalRepository:
def __init__(self, session: AsyncSession) -> None:
self.session = session
def add_goal(self, goal: AdvisorInvestmentGoal) -> None:
self.session.add(goal)
def add_goal_book(self, content: ClientFacingContent) -> None:
self.session.add(content)
async def goal(self, goal_no: str, *, lock: bool = False) -> AdvisorInvestmentGoal | None:
query = select(AdvisorInvestmentGoal).where(AdvisorInvestmentGoal.goal_no == goal_no)
if lock:
query = query.with_for_update()
return cast(AdvisorInvestmentGoal | None, await self.session.scalar(query))
async def latest_for_customer(self, customer_id: int) -> AdvisorInvestmentGoal | None:
return cast(AdvisorInvestmentGoal | None, await self.session.scalar(
select(AdvisorInvestmentGoal)
.where(
AdvisorInvestmentGoal.customer_id == customer_id,
AdvisorInvestmentGoal.status != "superseded",
)
.order_by(AdvisorInvestmentGoal.created_at.desc(), AdvisorInvestmentGoal.id.desc())
.limit(1)
))
async def goal_book(self, content_id: int) -> ClientFacingContent | None:
return await self.session.get(ClientFacingContent, content_id)
async def supersede_confirmed(
self, customer_id: int, except_goal_no: str, now: datetime
) -> None:
await self.session.execute(
update(AdvisorInvestmentGoal)
.where(
AdvisorInvestmentGoal.customer_id == customer_id,
AdvisorInvestmentGoal.status == "confirmed",
AdvisorInvestmentGoal.goal_no != except_goal_no,
)
.values(status="superseded", updated_at=now)
)