68 lines
2.2 KiB
Python
68 lines
2.2 KiB
Python
"""Business logic for break periods (family home-together windows)."""
|
|
|
|
from datetime import datetime
|
|
from uuid import UUID, uuid4
|
|
|
|
from app.entities.break_period import BreakPeriod
|
|
from app.repositories.break_period_repository import BreakPeriodRepository
|
|
from app.utils.errors import NotFoundError, ValidationError
|
|
|
|
|
|
class BreakPeriodService:
|
|
def __init__(self, repo: BreakPeriodRepository) -> None:
|
|
self._repo = repo
|
|
|
|
async def create(
|
|
self,
|
|
workspace_id: UUID,
|
|
name: str,
|
|
start_date: object,
|
|
end_date: object,
|
|
target_weeks: int,
|
|
) -> BreakPeriod:
|
|
if end_date < start_date:
|
|
raise ValidationError("end_date must be on or after start_date")
|
|
now = datetime.now()
|
|
entity = BreakPeriod(
|
|
id=uuid4(),
|
|
workspace_id=workspace_id,
|
|
name=name,
|
|
start_date=start_date,
|
|
end_date=end_date,
|
|
target_weeks=target_weeks,
|
|
created_at=now,
|
|
updated_at=now,
|
|
)
|
|
return await self._repo.create(entity)
|
|
|
|
async def get(self, break_period_id: UUID) -> BreakPeriod:
|
|
entity = await self._repo.get_by_id(break_period_id)
|
|
if entity is None:
|
|
raise NotFoundError(f"BreakPeriod {break_period_id} not found")
|
|
return entity
|
|
|
|
async def list_for_workspace(self, workspace_id: UUID) -> list[BreakPeriod]:
|
|
return await self._repo.get_by_workspace(workspace_id)
|
|
|
|
async def update(
|
|
self,
|
|
break_period_id: UUID,
|
|
name: str,
|
|
start_date: object,
|
|
end_date: object,
|
|
target_weeks: int,
|
|
) -> BreakPeriod:
|
|
entity = await self.get(break_period_id)
|
|
if end_date < start_date:
|
|
raise ValidationError("end_date must be on or after start_date")
|
|
entity.name = name
|
|
entity.start_date = start_date
|
|
entity.end_date = end_date
|
|
entity.target_weeks = target_weeks
|
|
entity.updated_at = datetime.now()
|
|
return await self._repo.update(break_period_id, entity)
|
|
|
|
async def delete(self, break_period_id: UUID) -> None:
|
|
await self.get(break_period_id) # raises NotFoundError if missing
|
|
await self._repo.delete(break_period_id)
|