"""B01_Dashboard 요청 스키마.""" from datetime import date from pydantic import BaseModel, Field class UpdateUserRequest(BaseModel): name: str = Field(min_length=1, max_length=100) position: str | None = Field(default=None, max_length=100) department: str | None = Field(default=None, max_length=100) phone: str | None = Field(default=None, max_length=50) class CreateCompanyRequest(BaseModel): name: str = Field(min_length=1, max_length=255) business_registration_number: str = Field(min_length=1, max_length=20) business_address: str | None = Field(default=None, max_length=500) business_owner: str | None = Field(default=None, max_length=100) class JoinCompanyRequest(BaseModel): company_id: int = Field(gt=0) class AddMemberRequest(BaseModel): email: str = Field(min_length=3, max_length=255) # 계정이 아직 없는 사람도 담당자로 넣는다 (2026-09-02 사용자 확정) — 이름이 있으면 # 그 자리에서 계정을 만든다. 비어 있으면 기존 사용자를 회사에 붙이는 옛 동작이다. name: str | None = Field(default=None, max_length=100) position: str | None = Field(default=None, max_length=100) department: str | None = Field(default=None, max_length=100) class UpdateCompanyLogoRequest(BaseModel): # 회사 대표 로고 (company_assets.id, kind=LOGO). None 이면 지정을 지운다. logo_asset_id: int | None = Field(default=None, gt=0) class ProcessJoinRequest(BaseModel): action: str = Field(pattern="^(APPROVE|REJECT)$") reason: str | None = Field(default=None, max_length=500) class ChangeUserRoleRequest(BaseModel): role: str = Field(pattern="^(SYSTEM_ADMIN|ADMIN|USER)$") class AssignCompanyRequest(BaseModel): company_id: int | None = Field(default=None, gt=0) class UpdateProjectRequest(BaseModel): name: str = Field(min_length=1, max_length=255) region: str | None = Field(default=None, max_length=100) road_type: str | None = Field(default=None, max_length=100) project_year: int | None = Field(default=None, ge=1900, le=2100) estimated_length_m: float | None = Field(default=None, ge=0) memo: str | None = Field(default=None, max_length=5000) status: str | None = Field(default=None, max_length=50) # 도면 표제란·표지에 실리는 값 (2026-09-02). 프로그램이 지어낼 수 없어 사람이 넣는다. client_org: str | None = Field(default=None, max_length=255) project_number: str | None = Field(default=None, max_length=100) work_amount: str | None = Field(default=None, max_length=100) # 설계일자는 확정일 자동이 아니라 사용자 지정이다 (2026-09-02 사용자 확정). design_date: date | None = None # 담당자는 회사 구성원(users) 중에서, 로고·서명은 회사 공유 자산(company_assets) 중에서 # 고른다 — 같은 회사 것인지는 라우터가 확인한다. pm_user_id: int | None = Field(default=None, gt=0) field_lead_user_id: int | None = Field(default=None, gt=0) designer_user_id: int | None = Field(default=None, gt=0) logo_asset_id: int | None = Field(default=None, gt=0) signature_asset_id: int | None = Field(default=None, gt=0) class AdminUpdateUserRequest(UpdateUserRequest): status: str | None = Field( default=None, pattern="^(NO_COMPANY|PENDING|ACTIVE|INACTIVE|REJECTED)$" ) class UpdateCompanyAssetRequest(BaseModel): label: str = Field(min_length=1, max_length=100) # 사용자 계정에 물릴 수도(개인 서명) 아닐 수도(회사 공용 직인) 있다. user_id: int | None = Field(default=None, gt=0)