From 8dd6191179032520efbed4a339363cf7a5b558af Mon Sep 17 00:00:00 2001 From: Kenio de Souza Date: Thu, 6 Nov 2025 11:16:23 -0300 Subject: [PATCH] =?UTF-8?q?Ajustado=20campos=20de=20valores=20para=20aceit?= =?UTF-8?q?ar=200,=20"emolumento":=200,=20"taxa=5Fjudiciaria":=200,=20"fun?= =?UTF-8?q?dos=5Festaduais":=200.=20Removida=20valida=C3=A7=C3=A3o=20de=20?= =?UTF-8?q?cpf=20CNPJ=20v=C3=A1lido,=20aceitar=20vazio=20ou=20formato=20in?= =?UTF-8?q?v=C3=A1lido?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../schemas/ato_documento_schema.py | 48 ++++------ .../schemas/ato_parte_schema.py | 44 +++++---- .../schemas/ato_principal_schema.py | 90 +++++++++---------- 3 files changed, 90 insertions(+), 92 deletions(-) diff --git a/packages/v1/administrativo/schemas/ato_documento_schema.py b/packages/v1/administrativo/schemas/ato_documento_schema.py index 04c85a7..8c0e326 100644 --- a/packages/v1/administrativo/schemas/ato_documento_schema.py +++ b/packages/v1/administrativo/schemas/ato_documento_schema.py @@ -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) diff --git a/packages/v1/administrativo/schemas/ato_parte_schema.py b/packages/v1/administrativo/schemas/ato_parte_schema.py index dadd32e..9ac6883 100644 --- a/packages/v1/administrativo/schemas/ato_parte_schema.py +++ b/packages/v1/administrativo/schemas/ato_parte_schema.py @@ -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) diff --git a/packages/v1/administrativo/schemas/ato_principal_schema.py b/packages/v1/administrativo/schemas/ato_principal_schema.py index 4c12361..163d61b 100644 --- a/packages/v1/administrativo/schemas/ato_principal_schema.py +++ b/packages/v1/administrativo/schemas/ato_principal_schema.py @@ -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: