api-admim/app/schemas/pessoa_schemas.py

119 lines
4.4 KiB
Python

# 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