Ajustado campos de valores para aceitar 0, "emolumento": 0, "taxa_judiciaria": 0, "fundos_estaduais": 0. Removida validação de cpf CNPJ válido, aceitar vazio ou formato inválido

This commit is contained in:
Kenio 2025-11-06 11:16:23 -03:00
parent c6eb6c38c5
commit 8dd6191179
3 changed files with 90 additions and 92 deletions

View file

@ -53,46 +53,34 @@ class AtoDocumentoIdSchema(BaseModel):
# Schema para Criação (SAVE): Campos obrigatórios e sem ID # Schema para Criação (SAVE): Campos obrigatórios e sem ID
# ---------------------------------------------------- # ----------------------------------------------------
class AtoDocumentoSaveSchema(BaseModel): class AtoDocumentoSaveSchema(BaseModel):
# Campos obrigatórios # Campo obrigatório
ato_principal_id: Optional[int] = None ato_principal_id: int
# Campos opcionais
arquivo: Optional[str] = None arquivo: Optional[str] = None
nome_documento: constr(max_length=255) nome_documento: Optional[str] = None
tipo_documento: constr(max_length=50) tipo_documento: Optional[str] = None
# Validação e Sanitização de Tipo Documento (chk_tipo_documento_not_empty) # Validação obrigatória para ato_principal_id
@field_validator("tipo_documento") @field_validator("ato_principal_id")
def validate_tipo_documento(cls, v: str): def validate_ato_principal_id(cls, v):
v = v.strip() if v is None:
if not v:
raise HTTPException( raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
detail=[ detail=[
{ {
"input": "tipo_documento", "input": "ato_principal_id",
"message": "O tipo de documento não pode ser vazio.", "message": "O campo 'ato_principal_id' deve ser informado.",
} }
], ],
) )
return v
# Sanitiza o campo # Sanitização dos campos opcionais
return Text.sanitize_input(v) @field_validator("arquivo", "nome_documento", "tipo_documento", mode="before")
def sanitize_optional_fields(cls, v: Optional[str]):
# Validação e Sanitização de Nome Documento if v is None:
@field_validator("nome_documento") return None
def validate_nome_documento(cls, v: str):
v = v.strip()
if not v:
raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
detail=[
{
"input": "nome_documento",
"message": "O nome do documento não pode ser vazio.",
}
],
)
# Sanitiza o campo
return Text.sanitize_input(v) return Text.sanitize_input(v)

View file

@ -92,25 +92,35 @@ def validate_nome_not_empty(cls, v: str):
# Schema para Criação (SAVE): Campos obrigatórios e sem ID # Schema para Criação (SAVE): Campos obrigatórios e sem ID
# ---------------------------------------------------- # ----------------------------------------------------
class AtoParteSaveSchema(BaseModel): class AtoParteSaveSchema(BaseModel):
# Campos obrigatórios # Campo obrigatório
ato_principal_id: Optional[int] = None # <<< tornar opcional ato_principal_id: int
nome: constr(max_length=255)
cpf_cnpj: constr(
max_length=20
) # Permitindo até 20 para acomodar a entrada antes de limpar
# Campo opcional (nullable na DDL) # Campos opcionais
telefone: Optional[constr(max_length=20)] = None nome: Optional[str] = None
cpf_cnpj: Optional[str] = None
telefone: Optional[str] = None
# Validação de Nome # Validação obrigatória para ato_principal_id
@field_validator("nome") @field_validator("ato_principal_id")
def validate_nome(cls, v: str): def validate_ato_principal_id(cls, v):
return validate_nome_not_empty(cls, Text.sanitize_input(v)) if v is None:
raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
detail=[
{
"input": "ato_principal_id",
"message": "O campo 'ato_principal_id' deve ser informado.",
}
],
)
return v
# Validação de CPF/CNPJ # Sanitização dos campos opcionais
@field_validator("cpf_cnpj") @field_validator("nome", "cpf_cnpj", "telefone", mode="before")
def validate_cpf_cnpj_field(cls, v: str): def sanitize_optional_fields(cls, v: Optional[str]):
return validate_cpf_cnpj(cls, Text.sanitize_input(v)) if v is None:
return None
return Text.sanitize_input(v)
# ---------------------------------------------------- # ----------------------------------------------------
@ -134,7 +144,7 @@ class AtoParteUpdateSchema(BaseModel):
@field_validator("cpf_cnpj") @field_validator("cpf_cnpj")
def validate_cpf_cnpj_update(cls, v: Optional[str]): def validate_cpf_cnpj_update(cls, v: Optional[str]):
if v is None: if v is None:
return Text.sanitize_input(v) return v
return validate_cpf_cnpj(cls, Text.sanitize_input(v)) return validate_cpf_cnpj(cls, Text.sanitize_input(v))
# Nota: Telefone não precisa de validação complexa além do constr(max_length) # Nota: Telefone não precisa de validação complexa além do constr(max_length)

View file

@ -134,35 +134,38 @@ class AtoPrincipalCodigoAtoSchema(BaseModel):
# Schema para Criação (SAVE): Campos obrigatórios e sem ID # Schema para Criação (SAVE): Campos obrigatórios e sem ID
# ---------------------------------------------------- # ----------------------------------------------------
class AtoPrincipalSaveSchema(BaseModel): class AtoPrincipalSaveSchema(BaseModel):
ato_principal_id: Optional[int] = None # <<< tornar opcional ato_principal_id: Optional[int] = None # Opcional no SAVE
origem_ato_principal_id: Optional[int] = None
# Campos obrigatórios baseados na DDL (NOT NULL) # Campos obrigatórios (NOT NULL)
origem_ato_principal_id: Optional[int] = None # bigint DEFAULT NULL identificacao_pedido_cgj: int
identificacao_pedido_cgj: int # bigint NOT NULL tipo_ato: int
tipo_ato: int # int NOT NULL codigo_selo: constr(max_length=50)
codigo_selo: constr(max_length=50) # varchar(50) NOT NULL codigo_ato: constr(max_length=50)
codigo_ato: constr(max_length=50) # varchar(50) NOT NULL nome_civil_ato: constr(max_length=255)
nome_civil_ato: constr(max_length=255) # varchar(255) NOT NULL nome_serventuario_praticou_ato: constr(max_length=255)
nome_serventuario_praticou_ato: constr(max_length=255) # varchar(255) NOT NULL data_solicitacao: datetime
data_solicitacao: datetime # datetime NOT NULL inteiro_teor: str
ip_maquina: Optional[constr(max_length=45)] = None # varchar(45) DEFAULT NULL
inteiro_teor: str # text NOT NULL # Campos opcionais
valor_entrada: Optional[Decimal] = None # decimal(12,2) DEFAULT NULL ip_maquina: Optional[constr(max_length=45)] = None
emolumento: Decimal # decimal(12,2) NOT NULL valor_entrada: Optional[Decimal] = None # Aceita None
taxa_judiciaria: Decimal # decimal(12,2) NOT NULL emolumento: Decimal = Decimal(0) # Valor padrão = 0
fundos_estaduais: Decimal # decimal(12,2) NOT NULL taxa_judiciaria: Decimal = Decimal(0) # Valor padrão = 0
protocolo_protesto: Optional[constr(max_length=50)] = ( fundos_estaduais: Decimal = Decimal(0) # Valor padrão = 0
None # varchar(50) DEFAULT NULL protocolo_protesto: Optional[constr(max_length=50)] = None
protocolo_imovel: Optional[constr(max_length=50)] = None
# Relações
ato_partes: List[AtoParteSaveSchema] = []
ato_documentos: List[AtoDocumentoSaveSchema] = []
atos_vinculados: Optional[List["AtoPrincipalSaveSchema"]] = (
None # referência recursiva
) )
protocolo_imovel: Optional[constr(max_length=50)] = None # varchar(50) DEFAULT NULL
ato_partes: List[AtoParteSaveSchema] = [] # precisa existir
ato_documentos: List[AtoDocumentoSaveSchema] = [] # precisa existir
# NOVO CAMPO: Referência recursiva a outros atos principais # ----------------------------------------------------
# Usando string para forward reference # Validação e sanitização de campos de texto obrigatórios
atos_vinculados: Optional[List["AtoPrincipalSaveSchema"]] = None # ----------------------------------------------------
# Validação e Sanitização de campos de texto obrigatórios (adaptado do código fonte)
@field_validator( @field_validator(
"codigo_selo", "codigo_selo",
"codigo_ato", "codigo_ato",
@ -170,46 +173,43 @@ class AtoPrincipalSaveSchema(BaseModel):
"nome_serventuario_praticou_ato", "nome_serventuario_praticou_ato",
"inteiro_teor", "inteiro_teor",
) )
def validate_required_strings(cls, v: str): def validate_required_strings(cls, v: str, info):
v = v.strip() if not v or not v.strip():
if not v:
# Identifica o campo que falhou a validação
input_name = (
"Erro de campo" # Será substituído se a função for mais complexa
)
raise HTTPException( raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
detail=[ detail=[
{ {
"input": input_name, "input": info.field_name,
"message": "Este campo obrigatório não pode ser vazio.", "message": f"O campo '{info.field_name}' não pode ser vazio.",
} }
], ],
) )
# Adicionar aqui a sanitização de texto (ex: Text.sanitize(v)) se disponível # Sanitiza o texto antes de retornar
return Text.sanitize_input(v) return Text.sanitize_input(v.strip())
# Validação dos campos monetários (baseado na CHECK CONSTRAINT da DDL) # ----------------------------------------------------
# Validação de campos monetários (aceita 0 e None em valor_entrada)
# ----------------------------------------------------
@field_validator( @field_validator(
"valor_entrada", "emolumento", "taxa_judiciaria", "fundos_estaduais" "valor_entrada", "emolumento", "taxa_judiciaria", "fundos_estaduais"
) )
def validate_positive_values(cls, v: Optional[Decimal]): def validate_positive_values(cls, v: Optional[Decimal], info):
if v is None and ( # valor_entrada pode ser None
"valor_entrada" in cls.__annotations__ if info.field_name == "valor_entrada" and v is None:
and cls.__annotations__["valor_entrada"] == Optional[Decimal]
):
# valor_entrada é o único campo DEFAULT NULL, aceita None
return v return v
# Se valor foi informado, valida
if v is not None and v < 0: if v is not None and v < 0:
raise HTTPException( raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
detail=[ detail=[
{ {
"input": "campo_monetario", "input": info.field_name,
"message": "Os valores monetários não podem ser negativos.", "message": "Os valores monetários não podem ser negativos.",
} }
], ],
) )
# Retorna o valor (inclusive 0 é aceito)
return v return v
class Config: class Config: