[MVPTN-100] fix(Diversos): Ajustes diversos

This commit is contained in:
Keven Willian Pereira de Souza 2025-10-09 16:20:10 -03:00
parent 2f1461d1e0
commit 355dda6f53
6 changed files with 95 additions and 167 deletions

View file

@ -24,40 +24,41 @@ class TImovelUnidadeUpdateRepository(BaseRepository):
try:
# Dicionário de mapeamento: atributo → coluna SQL
field_map = {
"imovel_id": "IMOVEL_ID",
"numero_unidade": "NUMERO_UNIDADE",
"quadra": "QUADRA",
"area": "AREA",
"superquadra": "SUPERQUADRA",
"conjunto": "CONJUNTO",
"bloco": "BLOCO",
"area_descritiva": "AREA_DESCRITIVA",
"caracteristica": "CARACTERISTICA",
"reserva_florestal": "RESERVA_FLORESTAL",
"geo_referenciamento": "GEO_REFERENCIAMENTO",
"logradouro": "LOGRADOURO",
"tb_tipologradouro_id": "TB_TIPOLOGRADOURO_ID",
"selecionado": "SELECIONADO",
"complemento": "COMPLEMENTO",
"tipo_imovel": "TIPO_IMOVEL",
"tipo_construcao": "TIPO_CONSTRUCAO",
"texto": "TEXTO",
"numero_edificacao": "NUMERO_EDIFICACAO",
"iptu": "IPTU",
"ccir": "CCIR",
"nirf": "NIRF",
"lote": "LOTE",
"torre": "TORRE",
"nomeloteamento": "NOMELOTEAMENTO",
"nomecondominio": "NOMECONDOMINIO",
"numero": "NUMERO",
"cnm_numero": "CNM_NUMERO",
"imovel_publico_uniao": "IMOVEL_PUBLICO_UNIAO",
"spu_rip": "SPU_RIP",
"cat": "CAT",
"inscricao_municipal": "INSCRICAO_MUNICIPAL",
"cib": "CIB",
"area_construida": "AREA_CONSTRUIDA"
"imovel_unidade_id" : "IMOVEL_UNIDADE_ID",
"imovel_id" : "IMOVEL_ID",
"numero_unidade" : "NUMERO_UNIDADE",
"quadra" : "QUADRA",
"area" : "AREA",
"superquadra" : "SUPERQUADRA",
"conjunto" : "CONJUNTO",
"bloco" : "BLOCO",
"area_descritiva" : "AREA_DESCRITIVA",
"caracteristica" : "CARACTERISTICA",
"reserva_florestal" : "RESERVA_FLORESTAL",
"geo_referenciamento" : "GEO_REFERENCIAMENTO",
"logradouro" : "LOGRADOURO",
"tb_tipologradouro_id" : "TB_TIPOLOGRADOURO_ID",
"selecionado" : "SELECIONADO",
"complemento" : "COMPLEMENTO",
"tipo_imovel" : "TIPO_IMOVEL",
"tipo_construcao" : "TIPO_CONSTRUCAO",
"texto" : "TEXTO",
"numero_edificacao" : "NUMERO_EDIFICACAO",
"iptu" : "IPTU",
"ccir" : "CCIR",
"nirf" : "NIRF",
"lote" : "LOTE",
"torre" : "TORRE",
"nomeloteamento" : "NOMELOTEAMENTO",
"nomecondominio" : "NOMECONDOMINIO",
"numero" : "NUMERO",
"cnm_numero" : "CNM_NUMERO",
"imovel_publico_uniao" : "IMOVEL_PUBLICO_UNIAO",
"spu_rip" : "SPU_RIP",
"cat" : "CAT",
"inscricao_municipal" : "INSCRICAO_MUNICIPAL",
"cib" : "CIB",
"area_construida" : "AREA_CONSTRUIDA",
}
# Lista de campos que serão atualizados

View file

@ -45,56 +45,21 @@ class TImovelIdSchema(BaseModel):
# ----------------------------------------------------
class TImovelSaveSchema(BaseModel):
imovel_id: Optional[int] = None
tipo_classe: str
tipo_registro: str
data_registro: datetime
tipo_classe: Optional[str] = None
tipo_registro: Optional[str] = None
data_registro: Optional[datetime] = None
numero: float
numero_letra: Optional[str] = None
cidade: str
cidade: Optional[str] = None
cep: Optional[float] = None
uf: str
uf: Optional[str] = None
tb_bairro_id: Optional[int] = None
cartorio: Optional[str] = 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
# Validações adicionais
@model_validator(mode='after')
def validate_fields(self):
errors = []
if not self.tipo_classe or len(self.tipo_classe.strip()) == 0:
errors.append({'input': 'tipo_classe', 'message': 'O tipo de classe é obrigatório.'})
if not self.tipo_registro or len(self.tipo_registro.strip()) == 0:
errors.append({'input': 'tipo_registro', 'message': 'O tipo de registro é obrigatório.'})
if not self.data_registro:
errors.append({'input': 'data_registro', 'message': 'A data de registro é obrigatória.'})
if not self.numero:
errors.append({'input': 'numero', 'message': 'O número é obrigatório.'})
if not self.cidade or len(self.cidade.strip()) == 0:
errors.append({'input': 'cidade', 'message': 'A cidade é obrigatória.'})
if not self.uf or len(self.uf.strip()) == 0:
errors.append({'input': 'uf', 'message': 'A UF é obrigatória.'})
if errors:
raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
detail=errors
)
return self
class Config:
from_attributes = True
# ----------------------------------------------------
# Schema para atualização de IMÓVEL (PUT)

View file

@ -70,91 +70,8 @@ class TImovelUnidadeIdSchema(BaseModel):
# Schema para criação de nova unidade (POST)
# ----------------------------------------------------
class TImovelUnidadeSaveSchema(BaseModel):
imovel_id: int
imovel_unidade_id: Optional[int] = None
numero_unidade: str
area: float
logradouro: str
tb_tipologradouro_id: int
texto: Optional[bytes] = None
# Outros campos opcionais
quadra: Optional[str] = None
superquadra: Optional[str] = None
conjunto: Optional[str] = None
bloco: Optional[str] = None
area_descritiva: Optional[str] = None
caracteristica: Optional[str] = None
reserva_florestal: Optional[str] = None
geo_referenciamento: Optional[str] = None
selecionado: Optional[str] = None
complemento: Optional[str] = None
tipo_imovel: Optional[int] = None
tipo_construcao: Optional[int] = None
numero_edificacao: Optional[str] = None
iptu: Optional[str] = None
ccir: Optional[str] = None
nirf: Optional[str] = None
lote: Optional[str] = None
torre: Optional[str] = None
nomeloteamento: Optional[str] = None
nomecondominio: Optional[str] = None
numero: Optional[float] = None
cnm_numero: Optional[str] = None
imovel_publico_uniao: Optional[str] = None
spu_rip: Optional[str] = None
cat: Optional[str] = None
inscricao_municipal: Optional[str] = None
cib: Optional[str] = None
area_construida: Optional[float] = None
# Sanitiza campos textuais
@field_validator(
'numero_unidade', 'quadra', 'superquadra', 'conjunto', 'bloco',
'area_descritiva', 'caracteristica', 'reserva_florestal', 'geo_referenciamento',
'logradouro', 'selecionado', 'complemento', 'numero_edificacao',
'iptu', 'ccir', 'nirf', 'lote', 'torre', 'nomeloteamento', 'nomecondominio',
'cnm_numero', 'imovel_publico_uniao', 'spu_rip', 'cat', 'inscricao_municipal', 'cib'
)
def sanitize_fields(cls, v):
if v:
return Text.sanitize_input(v)
return v
# Valida campo BLOB
@field_validator('texto')
def validate_blob(cls, v):
if v is not None and not isinstance(v, bytes):
raise ValueError('O campo TEXTO deve ser do tipo bytes.')
return v
# Valida campos obrigatórios
@model_validator(mode='after')
def validate_required_fields(self):
errors = []
if not self.imovel_id:
errors.append({'input': 'imovel_id', 'message': 'O ID do imóvel é obrigatório.'})
if not self.numero_unidade or len(self.numero_unidade.strip()) == 0:
errors.append({'input': 'numero_unidade', 'message': 'O número da unidade é obrigatório.'})
if not self.area:
errors.append({'input': 'area', 'message': 'A área é obrigatória.'})
if not self.logradouro or len(self.logradouro.strip()) == 0:
errors.append({'input': 'logradouro', 'message': 'O logradouro é obrigatório.'})
if not self.tb_tipologradouro_id:
errors.append({'input': 'tb_tipologradouro_id', 'message': 'O tipo de logradouro é obrigatório.'})
if errors:
raise HTTPException(status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, detail=errors)
return self
# ----------------------------------------------------
# Schema para atualização de unidade (PUT)
# ----------------------------------------------------
class TImovelUnidadeUpdateSchema(BaseModel):
imovel_unidade_id: Optional[int] = None
imovel_id: Optional[int] = None
imovel_unidade_id: Optional[int] = None
numero_unidade: Optional[str] = None
area: Optional[float] = None
logradouro: Optional[str] = None
@ -191,5 +108,48 @@ class TImovelUnidadeUpdateSchema(BaseModel):
cib: Optional[str] = None
area_construida: Optional[float] = None
class Config:
from_attributes = True
# ----------------------------------------------------
# Schema para atualização de unidade (PUT)
# ----------------------------------------------------
class TImovelUnidadeUpdateSchema(BaseModel):
imovel_unidade_id: Optional[int] = None
imovel_id: Optional[int] = None
numero_unidade: Optional[str] = None
area: Optional[float] = None
logradouro: Optional[str] = None
tb_tipologradouro_id: Optional[int] = None
texto: Optional[bytes] = None
quadra: Optional[str] = None
superquadra: Optional[str] = None
conjunto: Optional[str] = None
bloco: Optional[str] = None
area_descritiva: Optional[str] = None
caracteristica: Optional[str] = None
reserva_florestal: Optional[str] = None
geo_referenciamento: Optional[str] = None
selecionado: Optional[str] = None
complemento: Optional[str] = None
tipo_imovel: Optional[int] = None
tipo_construcao: Optional[int] = None
numero_edificacao: Optional[str] = None
iptu: Optional[str] = None
ccir: Optional[str] = None
nirf: Optional[str] = None
lote: Optional[str] = None
torre: Optional[str] = None
nomeloteamento: Optional[str] = None
nomecondominio: Optional[str] = None
numero: Optional[float] = None
cnm_numero: Optional[str] = None
imovel_publico_uniao: Optional[str] = None
spu_rip: Optional[str] = None
cat: Optional[str] = None
inscricao_municipal: Optional[str] = None
cib: Optional[str] = None
area_construida: Optional[float] = None
class Config:
from_attributes = True

View file

@ -1,9 +1,9 @@
from datetime import datetime
from api.actions.dynamic_import.dynamic_import import DynamicImport
from api.packages.v1.administrativo.actions.t_imovel.t_imovel_save_action import TImovelSaveAction
from api.packages.v1.sequencia.schemas.g_sequencia import GSequenciaSchema
from api.packages.v1.administrativo.schemas.t_imovel_schema import TImovelSaveSchema
from api.packages.v1.sequencia.services.g_sequencia.checkout_service import GenerateService
from fastapi import HTTPException, status
from api.packages.v1.sequencia.services.g_sequencia.generate_service import GenerateService
class TImovelSaveService:
@ -21,15 +21,17 @@ class TImovelSaveService:
# Cadastra o novo CENSEC_QUALIDADE
def execute(self, t_imovel_save_schema: TImovelSaveSchema):
t_imovel_save_schema.data_registro = datetime.now()
# Verifica se precisa gerar o ID de sequência
# Coluna primária ajustada
# Coluna primária ajustadaA
if not t_imovel_save_schema.imovel_id:
# Crio um objeto de sequencia
sequencia_schema = GSequenciaSchema()
# Define os dados para atualizar a sequencia
sequencia_schema.tabela = 'T_IMOVEL' # Nome da tabela ajustado
sequencia_schema.tabela = 'T_IMOVEL'
# Busco a sequência atualizada
generate = GenerateService()
@ -38,7 +40,7 @@ class TImovelSaveService:
sequencia = generate.execute(sequencia_schema)
# Atualiza os dados da chave primária
t_imovel_save_schema.imovel_id = sequencia.sequencia # Coluna primária ajustada
t_imovel_save_schema.imovel_id = sequencia.sequencia
# Instanciamento de ações
# Ação já é importada como SaveAction

View file

@ -2,7 +2,7 @@ from actions.dynamic_import.dynamic_import import DynamicImport
from api.packages.v1.administrativo.actions.t_pessoa.t_pessoa_save_action import TPessoaSaveAction
from api.packages.v1.administrativo.schemas.t_pessoa_schema import TPessoaSaveSchema
from api.packages.v1.sequencia.schemas.g_sequencia import GSequenciaSchema
from api.packages.v1.sequencia.services.g_sequencia.checkout_service import GenerateService
from api.packages.v1.sequencia.services.g_sequencia.generate_service import GenerateService
class TPessoaSaveService:

View file

@ -2,7 +2,7 @@ from actions.dynamic_import.dynamic_import import DynamicImport
from api.packages.v1.administrativo.actions.t_pessoa_representante.t_pessoa_representante_save_action import TPessoaRepresentanteSaveAction
from api.packages.v1.administrativo.schemas.t_pessoa_representante_schema import TPessoaRepresentanteSaveSchema
from api.packages.v1.sequencia.schemas.g_sequencia import GSequenciaSchema
from api.packages.v1.sequencia.services.g_sequencia.checkout_service import GenerateService
from api.packages.v1.sequencia.services.g_sequencia.generate_service import GenerateService
class TPessoaRepresentanteSaveService: