[MVPTN-100] fix(CRUD): Ajustes diversos no CRUD de Imóveis e Unidades dos Imóveis

This commit is contained in:
Keven Willian Pereira de Souza 2025-10-10 18:05:28 -03:00
parent 765d36a5f6
commit b6cb92d2c1
4 changed files with 38 additions and 102 deletions

View file

@ -18,8 +18,9 @@ class TImovelIndexRepository(BaseRepository):
sql = """ SELECT TI.*,
GTBB.DESCRICAO AS GTBB_DESCRICAO
FROM T_IMOVEL TI
JOIN G_TB_BAIRRO GTBB ON TI.TB_BAIRRO_ID = GTBB.TB_BAIRRO_ID
WHERE TI.TIPO_CLASSE = :tipoClasse """
LEFT JOIN G_TB_BAIRRO GTBB ON TI.TB_BAIRRO_ID = GTBB.TB_BAIRRO_ID
WHERE TI.TIPO_CLASSE = :tipoClasse
ORDER BY imovel_id DESC """
params = {
"tipoClasse": t_imovel_index_schema.tipo_classe

View file

@ -1,82 +1,33 @@
from abstracts.repository import BaseRepository
from api.actions.data.prepare_update_data import prepare_update_data
from packages.v1.administrativo.schemas.t_imovel_schema import TImovelUpdateSchema
from fastapi import HTTPException, status
class TImovelUpdateRepository(BaseRepository):
"""
Repositório para atualização de registros na tabela T_IMOVEL.
"""
def execute(self, t_imovel_schema: TImovelUpdateSchema):
"""
Executa a atualização de um imóvel pelo ID.
"""
def execute(self, t_imovel_update_schema: TImovelUpdateSchema):
try:
# ----------------------------------------------------
# Mapeamento de atributos → colunas SQL
# ----------------------------------------------------
field_map = {
"tipo_classe": "TIPO_CLASSE",
"tipo_registro": "TIPO_REGISTRO",
"data_registro": "DATA_REGISTRO",
"numero": "NUMERO",
"numero_letra": "NUMERO_LETRA",
"cidade": "CIDADE",
"cep": "CEP",
"uf": "UF",
"tb_bairro_id": "TB_BAIRRO_ID",
"cartorio": "CARTORIO",
"livro": "LIVRO",
"cns": "CNS",
}
params, update_columns = prepare_update_data(
t_imovel_update_schema,
exclude_fields=["imovel_id"],
id_field="imovel_id"
)
# ----------------------------------------------------
# Montagem dinâmica dos campos
# ----------------------------------------------------
updates = []
params = {}
for attr, column in field_map.items():
value = getattr(t_imovel_schema, attr, None)
if value is not None:
updates.append(f"{column} = :{attr}")
params[attr] = value
if not updates:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Nenhum campo válido foi enviado para atualização."
)
params["imovel_id"] = t_imovel_schema.imovel_id
# ----------------------------------------------------
# Montagem do SQL dinâmico
# ----------------------------------------------------
sql = f"""
UPDATE T_IMOVEL
SET {', '.join(updates)}
WHERE IMOVEL_ID = :imovel_id
RETURNING *;
"""
UPDATE T_IMOVEL
SET {update_columns}
WHERE IMOVEL_ID = :imovel_id
RETURNING *
"""
# ----------------------------------------------------
# Execução e retorno
# ----------------------------------------------------
result = self.run_and_return(sql, params)
# Executa o update
response = self.run_and_return(sql, params)
if not result:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Nenhum imóvel encontrado para o ID informado."
)
return response
return result
except HTTPException:
raise
except Exception as e:
raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,

View file

@ -35,7 +35,8 @@ class TPessoaIndexRepository(BaseRepository):
TP.CEP
FROM T_PESSOA TP
WHERE TP.PESSOA_TIPO = :pessoa_tipo
ORDER BY TP.PESSOA_ID DESC"""
ORDER BY TP.PESSOA_ID DESC
"""
params = {
"pessoa_tipo": t_pessoa_tipo_schema.pessoa_tipo
}

View file

@ -1,17 +1,13 @@
from pydantic import BaseModel, field_validator, model_validator
from fastapi import HTTPException, status
from pydantic import BaseModel
from typing import Optional
from datetime import datetime
# Função de sanitização
from actions.validations.text import Text
# ----------------------------------------------------
# Schema base
# ----------------------------------------------------
class TImovelSchema(BaseModel):
imovel_id: Optional[int] = None
tipo_classe: Optional[str] = None
tipo_classe: Optional[int] = None
tipo_registro: Optional[str] = None
data_registro: Optional[datetime] = None
numero: Optional[float] = None
@ -20,9 +16,10 @@ class TImovelSchema(BaseModel):
cep: Optional[float] = None
uf: Optional[str] = None
tb_bairro_id: Optional[int] = None
cartorio: Optional[str] = None
cartorio: Optional[int] = None
livro: Optional[str] = None
cns: Optional[float] = None
class Config:
from_attributes = True
@ -30,7 +27,8 @@ class TImovelSchema(BaseModel):
# Schema base
# ----------------------------------------------------
class TImovelIndexSchema(BaseModel):
tipo_classe: int = None
tipo_classe: int
class Config:
from_attributes = True
@ -40,21 +38,24 @@ class TImovelIndexSchema(BaseModel):
class TImovelIdSchema(BaseModel):
imovel_id: int
class Config:
from_attributes = True
# ----------------------------------------------------
# Schema para criação de novo IMÓVEL (POST)
# ----------------------------------------------------
class TImovelSaveSchema(BaseModel):
imovel_id: Optional[int] = None
tipo_classe: Optional[str] = None
tipo_classe: Optional[int] = None
tipo_registro: Optional[str] = None
data_registro: Optional[datetime] = None
numero: float
numero: Optional[float] = None
numero_letra: Optional[str] = None
cidade: Optional[str] = None
cep: Optional[float] = None
uf: Optional[str] = None
tb_bairro_id: Optional[int] = None
cartorio: Optional[str] = None
cartorio: Optional[int] = None
livro: Optional[str] = None
cns: Optional[float] = None
@ -65,8 +66,8 @@ class TImovelSaveSchema(BaseModel):
# Schema para atualização de IMÓVEL (PUT)
# ----------------------------------------------------
class TImovelUpdateSchema(BaseModel):
imovel_id: int = None
tipo_classe: Optional[str] = None
imovel_id: int
tipo_classe: Optional[int] = None
tipo_registro: Optional[str] = None
data_registro: Optional[datetime] = None
numero: Optional[float] = None
@ -75,27 +76,9 @@ class TImovelUpdateSchema(BaseModel):
cep: Optional[float] = None
uf: Optional[str] = None
tb_bairro_id: Optional[int] = None
cartorio: Optional[str] = None
cartorio: Optional[int] = None
livro: Optional[str] = None
cns: Optional[float] = None
# Sanitiza os campos textuais
@field_validator('tipo_classe', 'tipo_registro', 'numero_letra', 'cidade', 'uf', 'cartorio', 'livro')
def sanitize_fields(cls, v):
if v:
return Text.sanitize_input(v)
return v
# Garante que ao menos um campo seja enviado
@model_validator(mode='after')
def validate_partial_update(self):
if not any([
self.tipo_classe, self.tipo_registro, self.data_registro, self.numero,
self.numero_letra, self.cidade, self.cep, self.uf, self.tb_bairro_id,
self.cartorio, self.livro, self.cns
]):
raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
detail="Pelo menos um campo deve ser fornecido para a atualização."
)
return self
class Config:
from_attributes = True