"""API schemas (Pydantic) for PersonalData. Schemas validate request bodies and shape responses. Separate from domain entities so the wire format can evolve independently. """ from datetime import datetime from uuid import UUID from pydantic import BaseModel, Field from app.entities.personal_data import PersonalData class PersonalDataUpdate(BaseModel): """Partial update — all fields optional.""" salary_type: str | None = Field(None, pattern="^(monthly|hourly)$") employment_status: str | None = Field(None, pattern="^(employed|jobseeking|none)$") # Semesterlagen minimum (statutory 20; employers may set higher). Bounded # generously (0-60) at the wire level — the service layer is the source # of truth for the real constraint. min_vacation_days_per_year: int | None = Field(None, ge=0, le=60) class PersonalDataResponse(BaseModel): uuid: UUID workspace_id: UUID name: str salary_type: str employment_status: str min_vacation_days_per_year: int created_at: datetime | None deleted_at: datetime | None @classmethod def from_entity(cls, entity: PersonalData) -> "PersonalDataResponse": return cls( uuid=entity.uuid, workspace_id=entity.workspace_id, name=entity.name, salary_type=entity.salary_type, employment_status=entity.employment_status, min_vacation_days_per_year=entity.min_vacation_days_per_year, created_at=entity.created_at, deleted_at=entity.deleted_at, )