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
# ----------------------------------------------------
class AtoDocumentoSaveSchema(BaseModel):
# Campos obrigatórios
ato_principal_id: Optional[int] = None
# Campo obrigatório
ato_principal_id: int
# Campos opcionais
arquivo: Optional[str] = None
nome_documento: constr(max_length=255)
tipo_documento: constr(max_length=50)
nome_documento: Optional[str] = None
tipo_documento: Optional[str] = None
# Validação e Sanitização de Tipo Documento (chk_tipo_documento_not_empty)
@field_validator("tipo_documento")
def validate_tipo_documento(cls, v: str):
v = v.strip()
if not v:
# Validação obrigatória para ato_principal_id
@field_validator("ato_principal_id")
def validate_ato_principal_id(cls, v):
if v is None:
raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
detail=[
{
"input": "tipo_documento",
"message": "O tipo de documento não pode ser vazio.",
"input": "ato_principal_id",
"message": "O campo 'ato_principal_id' deve ser informado.",
}
],
)
return v
# Sanitiza o campo
return Text.sanitize_input(v)
# Validação e Sanitização de Nome Documento
@field_validator("nome_documento")
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
# Sanitização dos campos opcionais
@field_validator("arquivo", "nome_documento", "tipo_documento", mode="before")
def sanitize_optional_fields(cls, v: Optional[str]):
if v is None:
return None
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
# ----------------------------------------------------
class AtoParteSaveSchema(BaseModel):
# Campos obrigatórios
ato_principal_id: Optional[int] = None # <<< tornar opcional
nome: constr(max_length=255)
cpf_cnpj: constr(
max_length=20
) # Permitindo até 20 para acomodar a entrada antes de limpar
# Campo obrigatório
ato_principal_id: int
# Campo opcional (nullable na DDL)
telefone: Optional[constr(max_length=20)] = None
# Campos opcionais
nome: Optional[str] = None
cpf_cnpj: Optional[str] = None
telefone: Optional[str] = None
# Validação de Nome
@field_validator("nome")
def validate_nome(cls, v: str):
return validate_nome_not_empty(cls, Text.sanitize_input(v))
# Validação obrigatória para ato_principal_id
@field_validator("ato_principal_id")
def validate_ato_principal_id(cls, 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
@field_validator("cpf_cnpj")
def validate_cpf_cnpj_field(cls, v: str):
return validate_cpf_cnpj(cls, Text.sanitize_input(v))
# Sanitização dos campos opcionais
@field_validator("nome", "cpf_cnpj", "telefone", mode="before")
def sanitize_optional_fields(cls, v: Optional[str]):
if v is None:
return None
return Text.sanitize_input(v)
# ----------------------------------------------------
@ -134,7 +144,7 @@ class AtoParteUpdateSchema(BaseModel):
@field_validator("cpf_cnpj")
def validate_cpf_cnpj_update(cls, v: Optional[str]):
if v is None:
return Text.sanitize_input(v)
return 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)

View file

@ -134,35 +134,38 @@ class AtoPrincipalCodigoAtoSchema(BaseModel):
# Schema para Criação (SAVE): Campos obrigatórios e sem ID
# ----------------------------------------------------
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)
origem_ato_principal_id: Optional[int] = None # bigint DEFAULT NULL
identificacao_pedido_cgj: int # bigint NOT NULL
tipo_ato: int # int NOT NULL
codigo_selo: constr(max_length=50) # varchar(50) NOT NULL
codigo_ato: constr(max_length=50) # varchar(50) NOT NULL
nome_civil_ato: constr(max_length=255) # varchar(255) NOT NULL
nome_serventuario_praticou_ato: constr(max_length=255) # varchar(255) NOT NULL
data_solicitacao: datetime # datetime NOT NULL
ip_maquina: Optional[constr(max_length=45)] = None # varchar(45) DEFAULT NULL
inteiro_teor: str # text NOT NULL
valor_entrada: Optional[Decimal] = None # decimal(12,2) DEFAULT NULL
emolumento: Decimal # decimal(12,2) NOT NULL
taxa_judiciaria: Decimal # decimal(12,2) NOT NULL
fundos_estaduais: Decimal # decimal(12,2) NOT NULL
protocolo_protesto: Optional[constr(max_length=50)] = (
None # varchar(50) DEFAULT NULL
# Campos obrigatórios (NOT NULL)
identificacao_pedido_cgj: int
tipo_ato: int
codigo_selo: constr(max_length=50)
codigo_ato: constr(max_length=50)
nome_civil_ato: constr(max_length=255)
nome_serventuario_praticou_ato: constr(max_length=255)
data_solicitacao: datetime
inteiro_teor: str
# Campos opcionais
ip_maquina: Optional[constr(max_length=45)] = None
valor_entrada: Optional[Decimal] = None # Aceita None
emolumento: Decimal = Decimal(0) # Valor padrão = 0
taxa_judiciaria: Decimal = Decimal(0) # Valor padrão = 0
fundos_estaduais: Decimal = Decimal(0) # Valor padrão = 0
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
atos_vinculados: Optional[List["AtoPrincipalSaveSchema"]] = None
# Validação e Sanitização de campos de texto obrigatórios (adaptado do código fonte)
# ----------------------------------------------------
# Validação e sanitização de campos de texto obrigatórios
# ----------------------------------------------------
@field_validator(
"codigo_selo",
"codigo_ato",
@ -170,46 +173,43 @@ class AtoPrincipalSaveSchema(BaseModel):
"nome_serventuario_praticou_ato",
"inteiro_teor",
)
def validate_required_strings(cls, v: str):
v = 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
)
def validate_required_strings(cls, v: str, info):
if not v or not v.strip():
raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
detail=[
{
"input": input_name,
"message": "Este campo obrigatório não pode ser vazio.",
"input": info.field_name,
"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
return Text.sanitize_input(v)
# Sanitiza o texto antes de retornar
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(
"valor_entrada", "emolumento", "taxa_judiciaria", "fundos_estaduais"
)
def validate_positive_values(cls, v: Optional[Decimal]):
if v is None and (
"valor_entrada" in cls.__annotations__
and cls.__annotations__["valor_entrada"] == Optional[Decimal]
):
# valor_entrada é o único campo DEFAULT NULL, aceita None
def validate_positive_values(cls, v: Optional[Decimal], info):
# valor_entrada pode ser None
if info.field_name == "valor_entrada" and v is None:
return v
# Se valor foi informado, valida
if v is not None and v < 0:
raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
detail=[
{
"input": "campo_monetario",
"input": info.field_name,
"message": "Os valores monetários não podem ser negativos.",
}
],
)
# Retorna o valor (inclusive 0 é aceito)
return v
class Config: