# Importações de bibliotecas padrão from typing import Union, List, Literal, Annotated, Optional from uuid import UUID # Importações de bibliotecas de terceiros from pydantic import BaseModel, Field, ConfigDict, EmailStr from app.schemas.utils import UUIDSchema from app.schemas.endereco_schemas import EnderecoCreate, EnderecoRequest, EnderecoBaseUpdate class PessoaPayload(BaseModel): model_config = ConfigDict(from_attributes=True) pessoa_status: bool = Field(default=True) pessoa_telefone: str = Field(min_length=8, max_length=20) pessoa_celular: str = Field(min_length=9, max_length=20) pessoa_email: EmailStr = Field(min_length=8, max_length=50) pessoa_local_evento: bool = Field(default=False) class FisicaCreate(PessoaPayload): pessoa_tipo: Literal["1"] fisica_cpf: str = Field(min_length=11, max_length=11) # Em produção usar validadores prontos fisica_rg: str = Field(min_length=5, max_length=20) fisica_genero: Literal["M", "F", "HT", "MT", "T", "NB", "O"] fisica_nome: str = Field(min_length=3, max_length=100) enderecos: List[EnderecoCreate] | None = None rc: List[UUIDSchema] | None = None class JuridicaCreate(PessoaPayload): pessoa_tipo: Literal["0"] juridica_cnpj: str = Field(min_length=14, max_length=14) # Em produção usar validadores prontos juridica_email_fiscal: EmailStr = Field(min_length=8, max_length=50) juridica_insc_est: Optional[Annotated[str, Field(min_length=5, max_length=50)]] = None juridica_ins_mun: Optional[Annotated[str, Field(min_length=5, max_length=50)]] = None juridica_razao_social: str = Field(min_length=5, max_length=200) juridica_representante: str = Field(min_length=3, max_length=100) enderecos: List[EnderecoCreate] | None = None rc: List[UUIDSchema] | None = None class PessoaBaseResponse(BaseModel): model_config = ConfigDict(from_attributes=True) uuid: UUID pessoa_status: bool pessoa_telefone: str | None = None pessoa_celular: str | None = None pessoa_email: str | None = None pessoa_local_evento: bool class RequestPJ(PessoaBaseResponse): pessoa_tipo: Literal["0"] juridica_cnpj: str | None = None juridica_email_fiscal: str | None = None juridica_insc_est: str | None = None juridica_ins_mun: str | None = None juridica_razao_social: str | None = None juridica_representante: str | None = None enderecos: List[EnderecoRequest] = [] class RequestPF(PessoaBaseResponse): pessoa_tipo: Literal["1"] fisica_cpf: str | None = None fisica_rg: str | None = None fisica_genero: str | None = None fisica_nome: str enderecos: List[EnderecoRequest] = [] RequestPessoa = Annotated[ Union[RequestPF, RequestPJ], Field(discriminator='pessoa_tipo') ] class IdRequestPessoa(BaseModel): uuid: UUID = None class IdsRequestPessoas(BaseModel): uuids: List[UUID] = None class PessoaBaseUpdate(IdRequestPessoa): pessoa_status: bool pessoa_telefone: Optional[Annotated[str, Field(min_length=8, max_length=20)]] = None pessoa_celular: Optional[Annotated[str, Field(min_length=8, max_length=20)]] = None pessoa_email: Optional[Annotated[EmailStr, Field(min_length=8, max_length=50)]] = None pessoa_local_evento: bool pessoa_tipo: Optional[Literal["0", "1"]] = None class PessoaFisicaUpdate(PessoaBaseUpdate): fisica_cpf: str = Field(min_length=11, max_length=11) fisica_rg: Optional[Annotated[str, Field(min_length=5, max_length=20)]] = None fisica_genero: Optional[Literal["M", "F", "HT", "MT", "T", "NB", "O"]] = None fisica_nome: Optional[Annotated[str, Field(min_length=3, max_length=100)]] = None enderecos: List[EnderecoBaseUpdate] | None = None rc: List[UUIDSchema] | None = None class PessoaJuridicaUpdate(PessoaBaseUpdate): juridica_cnpj: str = Field(min_length=14, max_length=14) juridica_email_fiscal: Optional[Annotated[EmailStr, Field(min_length=8, max_length=50)]] = None juridica_insc_est: Optional[Annotated[str, Field(min_length=5, max_length=50)]] = None juridica_ins_mun: Optional[Annotated[str, Field(min_length=5, max_length=50)]] = None juridica_razao_social: Optional[Annotated[str, Field(min_length=5, max_length=200)]] = None juridica_representante: Optional[Annotated[str, Field(min_length=3, max_length=100)]] = None enderecos: List[EnderecoBaseUpdate] | None = None rc: List[UUIDSchema] | None = None class ValidaGetAll(BaseModel): validador: Literal["0", "1"] | None = None