"""Pydantic schemas for API request/response shapes.""" from datetime import date, datetime from typing import Optional from pydantic import BaseModel from ten31portal.models import UserRole, EntityType, EntityStatus, RoundStatus # --- Auth --- class LoginRequest(BaseModel): email: str password: str class UserResponse(BaseModel): id: int name: str email: str role: UserRole is_active: bool created_at: datetime # --- Entity --- class EntityCreate(BaseModel): name: str type: EntityType vintage_year: int | None = None fund_size_cents: int | None = None class EntityUpdate(BaseModel): name: str | None = None type: EntityType | None = None vintage_year: int | None = None fund_size_cents: int | None = None status: EntityStatus | None = None class EntityResponse(BaseModel): id: int name: str type: EntityType vintage_year: int | None fund_size_cents: int | None status: EntityStatus created_at: datetime # --- Holding --- class HoldingCreate(BaseModel): company_name: str class HoldingUpdate(BaseModel): company_name: str | None = None class HoldingResponse(BaseModel): id: int entity_id: int company_name: str created_at: datetime # --- Position --- class PositionCreate(BaseModel): security_name: str investment_date: date shares: str | None = None cost_dollars: float # Accept dollars at API boundary, store as cents class PositionUpdate(BaseModel): security_name: str | None = None investment_date: date | None = None shares: str | None = None cost_dollars: float | None = None class PositionResponse(BaseModel): id: int holding_id: int security_name: str investment_date: date shares: str | None cost_cents: int created_at: datetime # --- Valuation Round --- class RoundCreate(BaseModel): quarter_end: date class ValuationBulkItem(BaseModel): position_id: int value_cents: int class ValuationBulkUpdate(BaseModel): valuations: list[ValuationBulkItem] class ReturnNote(BaseModel): note: str class ValuationResponse(BaseModel): id: int round_id: int position_id: int value_cents: int created_at: datetime class RoundResponse(BaseModel): id: int entity_id: int quarter_end: date status: RoundStatus submitted_by: int | None submitted_at: datetime | None approved_by: int | None approved_at: datetime | None return_note: str | None is_seed: bool created_at: datetime valuations: list[ValuationResponse] = [] # --- Audit --- class AuditLogResponse(BaseModel): id: int actor_user_id: int | None action: str object_type: str object_id: int | None detail: dict | list | str | None created_at: datetime