From 355dda6f53d75681a05611ada00e1c8f58a750d9 Mon Sep 17 00:00:00 2001 From: keven Date: Thu, 9 Oct 2025 16:20:10 -0300 Subject: [PATCH] [MVPTN-100] fix(Diversos): Ajustes diversos --- .../t_imovel_unidade_update_repository.py | 69 +++++----- .../administrativo/schemas/t_imovel_schema.py | 49 +------ .../schemas/t_imovel_unidade_schema.py | 128 ++++++------------ .../t_imovel/go/t_imovel_save_service.py | 12 +- .../t_pessoa/go/t_pessoa_save_service.py | 2 +- .../go/t_pessoa_representante_save_service.py | 2 +- 6 files changed, 95 insertions(+), 167 deletions(-) diff --git a/packages/v1/administrativo/repositories/t_imovel_unidade/t_imovel_unidade_update_repository.py b/packages/v1/administrativo/repositories/t_imovel_unidade/t_imovel_unidade_update_repository.py index a0ea936..001c632 100644 --- a/packages/v1/administrativo/repositories/t_imovel_unidade/t_imovel_unidade_update_repository.py +++ b/packages/v1/administrativo/repositories/t_imovel_unidade/t_imovel_unidade_update_repository.py @@ -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 diff --git a/packages/v1/administrativo/schemas/t_imovel_schema.py b/packages/v1/administrativo/schemas/t_imovel_schema.py index 927b261..7f34508 100644 --- a/packages/v1/administrativo/schemas/t_imovel_schema.py +++ b/packages/v1/administrativo/schemas/t_imovel_schema.py @@ -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) diff --git a/packages/v1/administrativo/schemas/t_imovel_unidade_schema.py b/packages/v1/administrativo/schemas/t_imovel_unidade_schema.py index eb32efe..528f8d7 100644 --- a/packages/v1/administrativo/schemas/t_imovel_unidade_schema.py +++ b/packages/v1/administrativo/schemas/t_imovel_unidade_schema.py @@ -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 \ No newline at end of file diff --git a/packages/v1/administrativo/services/t_imovel/go/t_imovel_save_service.py b/packages/v1/administrativo/services/t_imovel/go/t_imovel_save_service.py index 8ea0806..a2923df 100644 --- a/packages/v1/administrativo/services/t_imovel/go/t_imovel_save_service.py +++ b/packages/v1/administrativo/services/t_imovel/go/t_imovel_save_service.py @@ -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 diff --git a/packages/v1/administrativo/services/t_pessoa/go/t_pessoa_save_service.py b/packages/v1/administrativo/services/t_pessoa/go/t_pessoa_save_service.py index 37d1ae1..8cabd8e 100644 --- a/packages/v1/administrativo/services/t_pessoa/go/t_pessoa_save_service.py +++ b/packages/v1/administrativo/services/t_pessoa/go/t_pessoa_save_service.py @@ -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: diff --git a/packages/v1/administrativo/services/t_pessoa_representante/go/t_pessoa_representante_save_service.py b/packages/v1/administrativo/services/t_pessoa_representante/go/t_pessoa_representante_save_service.py index 5167dce..e77068e 100644 --- a/packages/v1/administrativo/services/t_pessoa_representante/go/t_pessoa_representante_save_service.py +++ b/packages/v1/administrativo/services/t_pessoa_representante/go/t_pessoa_representante_save_service.py @@ -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: