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:
parent
c6eb6c38c5
commit
8dd6191179
3 changed files with 90 additions and 92 deletions
|
|
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue