From 2f1461d1e085bbc76c911fca6447092a32131eac Mon Sep 17 00:00:00 2001 From: keven Date: Wed, 8 Oct 2025 18:20:54 -0300 Subject: [PATCH] [MVPTN-100] feat(CRUD): Implementa endpoints para maniputar T_PEssoa_Representante --- .../t_pessoa_representante_delete_action.py | 26 ++++ .../t_pessoa_representante_index_action.py | 26 ++++ .../t_pessoa_representante_save_action.py | 28 +++++ .../t_pessoa_representante_show_action.py | 28 +++++ .../t_pessoa_representante_update_action.py | 26 ++++ .../t_pessoa_representante_controller.py | 90 ++++++++++++++ .../t_pessoa_representante_endpoint.py | 90 ++++++++++++++ ..._pessoa_representante_delete_repository.py | 43 +++++++ ...t_pessoa_representante_index_repository.py | 42 +++++++ .../t_pessoa_representante_save_repository.py | 67 +++++++++++ .../t_pessoa_representante_show_repository.py | 47 ++++++++ ..._pessoa_representante_update_repository.py | 71 +++++++++++ .../schemas/t_pessoa_representante_schema.py | 113 ++++++++++++++++++ .../t_pessoa_representante_delete_service.py | 27 +++++ .../t_pessoa_representante_index_service.py | 34 ++++++ .../go/t_pessoa_representante_save_service.py | 45 +++++++ .../go/t_pessoa_representante_show_service.py | 36 ++++++ .../t_pessoa_representante_update_service.py | 24 ++++ packages/v1/api.py | 8 +- 19 files changed, 870 insertions(+), 1 deletion(-) create mode 100644 packages/v1/administrativo/actions/t_pessoa_representante/t_pessoa_representante_delete_action.py create mode 100644 packages/v1/administrativo/actions/t_pessoa_representante/t_pessoa_representante_index_action.py create mode 100644 packages/v1/administrativo/actions/t_pessoa_representante/t_pessoa_representante_save_action.py create mode 100644 packages/v1/administrativo/actions/t_pessoa_representante/t_pessoa_representante_show_action.py create mode 100644 packages/v1/administrativo/actions/t_pessoa_representante/t_pessoa_representante_update_action.py create mode 100644 packages/v1/administrativo/controllers/t_pessoa_representante_controller.py create mode 100644 packages/v1/administrativo/endpoints/t_pessoa_representante_endpoint.py create mode 100644 packages/v1/administrativo/repositories/t_pessoa_representante/t_pessoa_representante_delete_repository.py create mode 100644 packages/v1/administrativo/repositories/t_pessoa_representante/t_pessoa_representante_index_repository.py create mode 100644 packages/v1/administrativo/repositories/t_pessoa_representante/t_pessoa_representante_save_repository.py create mode 100644 packages/v1/administrativo/repositories/t_pessoa_representante/t_pessoa_representante_show_repository.py create mode 100644 packages/v1/administrativo/repositories/t_pessoa_representante/t_pessoa_representante_update_repository.py create mode 100644 packages/v1/administrativo/schemas/t_pessoa_representante_schema.py create mode 100644 packages/v1/administrativo/services/t_pessoa_representante/go/t_pessoa_representante_delete_service.py create mode 100644 packages/v1/administrativo/services/t_pessoa_representante/go/t_pessoa_representante_index_service.py create mode 100644 packages/v1/administrativo/services/t_pessoa_representante/go/t_pessoa_representante_save_service.py create mode 100644 packages/v1/administrativo/services/t_pessoa_representante/go/t_pessoa_representante_show_service.py create mode 100644 packages/v1/administrativo/services/t_pessoa_representante/go/t_pessoa_representante_update_service.py diff --git a/packages/v1/administrativo/actions/t_pessoa_representante/t_pessoa_representante_delete_action.py b/packages/v1/administrativo/actions/t_pessoa_representante/t_pessoa_representante_delete_action.py new file mode 100644 index 0000000..2ece9c8 --- /dev/null +++ b/packages/v1/administrativo/actions/t_pessoa_representante/t_pessoa_representante_delete_action.py @@ -0,0 +1,26 @@ +from abstracts.action import BaseAction +from api.packages.v1.administrativo.repositories.t_pessoa_representante.t_pessoa_representante_delete_repository import TPessoaRepresentanteDeleteRepository +from api.packages.v1.administrativo.schemas.t_pessoa_representante_schema import TPessoaRepresentanteIdSchema + + +class TPessoaRepresentanteDeleteAction(BaseAction): + """ + Serviço responsável por encapsular a lógica de negócio para a operação + de exclusão de um registro na tabela g_tb_regimebens. + """ + + def execute(self, t_pessoa_representante_id_schema: TPessoaRepresentanteIdSchema): + """ + Executa a operação de exclusão no banco de dados. + + Args: + regimebens_schema (GTbRegimebensIdSchema): O esquema com o ID a ser excluído. + + Returns: + O resultado da operação de exclusão. + """ + # Instanciamento do repositório + t_pessoa_representante_delete_repository = TPessoaRepresentanteDeleteRepository() + + # Execução do repositório + return t_pessoa_representante_delete_repository.execute(t_pessoa_representante_id_schema) \ No newline at end of file diff --git a/packages/v1/administrativo/actions/t_pessoa_representante/t_pessoa_representante_index_action.py b/packages/v1/administrativo/actions/t_pessoa_representante/t_pessoa_representante_index_action.py new file mode 100644 index 0000000..e659e29 --- /dev/null +++ b/packages/v1/administrativo/actions/t_pessoa_representante/t_pessoa_representante_index_action.py @@ -0,0 +1,26 @@ +from api.abstracts.action import BaseAction +from api.packages.v1.administrativo.repositories.t_pessoa_representante.t_pessoa_representante_index_repository import TPessoaRepresentanteIndexRepository +from api.packages.v1.administrativo.schemas.t_pessoa_representante_schema import TPessoaRepresentantePessoaIdSchema + + +class TPessoaRepresentanteIndexAction(BaseAction): + """ + Serviço responsável por encapsular a lógica de negócio para a operação + de listagem de todos os registros na tabela g_tb_regimebens. + """ + + def execute(self, t_pessoa_representante_pessoa_id_schema: TPessoaRepresentantePessoaIdSchema): + """ + Executa a operação de listagem no banco de dados. + + Returns: + A lista de todos os registros. + """ + # Instanciamento do repositório + t_pessoa_representante_index_repository = TPessoaRepresentanteIndexRepository() + + # Execução do repositório + response = t_pessoa_representante_index_repository.execute(t_pessoa_representante_pessoa_id_schema) + + # Retorno da informação + return response \ No newline at end of file diff --git a/packages/v1/administrativo/actions/t_pessoa_representante/t_pessoa_representante_save_action.py b/packages/v1/administrativo/actions/t_pessoa_representante/t_pessoa_representante_save_action.py new file mode 100644 index 0000000..6f59989 --- /dev/null +++ b/packages/v1/administrativo/actions/t_pessoa_representante/t_pessoa_representante_save_action.py @@ -0,0 +1,28 @@ +from abstracts.action import BaseAction +from api.packages.v1.administrativo.repositories.t_pessoa_representante.t_pessoa_representante_save_repository import TPessoaRepresentanteSaveRepository +from api.packages.v1.administrativo.schemas.t_pessoa_representante_schema import TPessoaRepresentanteSaveSchema + +class TPessoaRepresentanteSaveAction(BaseAction): + """ + Serviço responsável por encapsular a lógica de negócio para a operação + de salvar um novo registro na tabela g_tb_regimebens. + """ + + def execute(self, t_pessoa_representante_save_schema: TPessoaRepresentanteSaveSchema): + """ + Executa a operação de salvamento. + + Args: + regimebens_schema (GTbRegimebensSaveSchema): O esquema com os dados a serem salvos. + + Returns: + O resultado da operação de salvamento. + """ + # Instânciamento do repositório + t_pessoa_representante_save_repository = TPessoaRepresentanteSaveRepository() + + # Execução do repositório + response = t_pessoa_representante_save_repository.execute(t_pessoa_representante_save_schema) + + # Retorno da informação + return response \ No newline at end of file diff --git a/packages/v1/administrativo/actions/t_pessoa_representante/t_pessoa_representante_show_action.py b/packages/v1/administrativo/actions/t_pessoa_representante/t_pessoa_representante_show_action.py new file mode 100644 index 0000000..a0b9e9c --- /dev/null +++ b/packages/v1/administrativo/actions/t_pessoa_representante/t_pessoa_representante_show_action.py @@ -0,0 +1,28 @@ +from abstracts.action import BaseAction +from api.packages.v1.administrativo.repositories.t_pessoa_representante.t_pessoa_representante_delete_repository import TPessoaRepresentanteIdSchema +from api.packages.v1.administrativo.repositories.t_pessoa_representante.t_pessoa_representante_show_repository import TPessoaRepresentanteShowRepository + +class TPessoaRepresentanteShowAction(BaseAction): + """ + Serviço responsável por encapsular a lógica de negócio para a exibição + de um registro na tabela g_tb_regimebens. + """ + + def execute(self, t_pessoa_representante_id_schema: TPessoaRepresentanteIdSchema): + """ + Executa a operação de exibição. + + Args: + regimebens_schema (GTbRegimebensIdSchema): O esquema com o ID do registro a ser exibido. + + Returns: + O resultado da operação de exibição. + """ + # Instânciamento do repositório + t_pessoa_representante_show_repository = TPessoaRepresentanteShowRepository() + + # Execução do repositório + response = t_pessoa_representante_show_repository.execute(t_pessoa_representante_id_schema) + + # Retorno da informação + return response \ No newline at end of file diff --git a/packages/v1/administrativo/actions/t_pessoa_representante/t_pessoa_representante_update_action.py b/packages/v1/administrativo/actions/t_pessoa_representante/t_pessoa_representante_update_action.py new file mode 100644 index 0000000..c3b6c91 --- /dev/null +++ b/packages/v1/administrativo/actions/t_pessoa_representante/t_pessoa_representante_update_action.py @@ -0,0 +1,26 @@ +from api.abstracts.action import BaseAction +from api.packages.v1.administrativo.repositories.t_pessoa_representante.t_pessoa_representante_update_repository import TPessoaRepresentanteUpdateRepository +from api.packages.v1.administrativo.schemas.t_pessoa_representante_schema import TPessoaRepresentanteUpdateSchema + + +class TPessoaRepresentanteUpdateAction(BaseAction): + """ + Service responsável por encapsular a lógica de negócio para a atualização + de um registro na tabela g_tb_regimebens. + """ + + def execute(self, t_pessoa_representanteupdate_schema: TPessoaRepresentanteUpdateSchema): + """ + Executa a operação de atualização. + + Args: + regimebens_schema (GTbRegimebensUpdateSchema): O esquema com os dados a serem atualizados. + + Returns: + O resultado da operação de atualização. + """ + # Instância o repositório de atualização + t_pessoa_representanteupdate_repository = TPessoaRepresentanteUpdateRepository() + + # Chama o método de execução do repositório para realizar a atualização + return t_pessoa_representanteupdate_repository.execute(t_pessoa_representanteupdate_schema) \ No newline at end of file diff --git a/packages/v1/administrativo/controllers/t_pessoa_representante_controller.py b/packages/v1/administrativo/controllers/t_pessoa_representante_controller.py new file mode 100644 index 0000000..466ad42 --- /dev/null +++ b/packages/v1/administrativo/controllers/t_pessoa_representante_controller.py @@ -0,0 +1,90 @@ +from actions.dynamic_import.dynamic_import import DynamicImport +from api.packages.v1.administrativo.schemas.t_pessoa_representante_schema import TPessoaRepresentanteIdSchema, TPessoaRepresentantePessoaIdSchema, TPessoaRepresentanteSaveSchema, TPessoaRepresentanteUpdateSchema + +class TPessoaRepresentanteController: + + def __init__(self): + # Action responsável por carregar as services de acordo com o estado + self.dynamic_import = DynamicImport() + + # Define o pacote que deve ser carregado + self.dynamic_import.set_package("administrativo") + + # Define a tabela que o pacote pertence + self.dynamic_import.set_table("t_pessoa_representante") + pass + + # Lista todos os regimes de bens + def index(self, t_pessoa_representante_pessoa_id_schema : TPessoaRepresentantePessoaIdSchema): + + # Importação da classe desejada + t_pessoa_representante_index_service = self.dynamic_import.service("t_pessoa_representante_index_service", "TPessoaRepresentanteIndexService") + + # Instância da classe service + self.t_pessoa_representante_index_service = t_pessoa_representante_index_service() + + # Lista todos os regimes de bens + return { + 'message': 'Pessoas localizados com sucesso', + 'data': self.t_pessoa_representante_index_service.execute(t_pessoa_representante_pessoa_id_schema) + } + + + # Busca um regime de bens específico pelo ID + def show(self, t_pessoa_representante_id_schema : TPessoaRepresentanteIdSchema): + + #Importação da classe desejada + t_pessoa_representante_show_service = self.dynamic_import.service('t_pessoa_representante_show_service', 'TPessoaRepresentanteShowService') + + # Instância da classe desejada + self.t_pessoa_representante_show_service = t_pessoa_representante_show_service() + + # Busca e retorna o regime de bens desejado + return { + 'message' : 'Pessoa localizado com sucesso', + 'data': self.t_pessoa_representante_show_service.execute(t_pessoa_representante_id_schema) + } + + # Cadastra um novo regime de bens + def save(self, t_pessoa_representante_save_schema : TPessoaRepresentanteSaveSchema): + + #Importação da classe desejada + t_pessoa_representante_save_service = self.dynamic_import.service('t_pessoa_representante_save_service', 'TPessoaRepresentanteSaveService') + + # Instância da classe desejada + self.t_pessoa_representante_save_service = t_pessoa_representante_save_service() + # Busca e retorna o regime de bens desejado + return { + 'message' : 'Pessoa salvo com sucesso', + 'data': self.t_pessoa_representante_save_service.execute(t_pessoa_representante_save_schema) + } + + # Atualiza os dados de um regime de bens + def update(self, t_pessoa_representante_update_schame : TPessoaRepresentanteUpdateSchema): + + #Importação da classe desejada + t_pessoa_representante_update_service = self.dynamic_import.service('t_pessoa_representante_update_service', 'TPessoaRepresentanteUpdateService') + + # Instância da classe desejada + self.t_pessoa_representante_update_service = t_pessoa_representante_update_service() + + # Busca e retorna o regime de bens desejado + return { + 'message' : 'Pessoa atualizado com sucesso', + 'data': self.t_pessoa_representante_update_service.execute(t_pessoa_representante_update_schame) + } + + # Exclui um regime de bens + def delete(self, t_pessoa_representante_id_schema : TPessoaRepresentanteIdSchema): + + #Importação da classe desejada + t_pessoa_representante_delete_service = self.dynamic_import.service('t_pessoa_representante_delete_service', 'TPessoaRepresentanteDeleteService') + + # Instância da classe desejada + self.t_pessoa_representante_delete_service = t_pessoa_representante_delete_service() + + # Busca e retorna o regime de bens desejado + return { + 'message' : 'Pessoa removido com sucesso', + 'data': self.t_pessoa_representante_delete_service.execute(t_pessoa_representante_id_schema) + } \ No newline at end of file diff --git a/packages/v1/administrativo/endpoints/t_pessoa_representante_endpoint.py b/packages/v1/administrativo/endpoints/t_pessoa_representante_endpoint.py new file mode 100644 index 0000000..47af079 --- /dev/null +++ b/packages/v1/administrativo/endpoints/t_pessoa_representante_endpoint.py @@ -0,0 +1,90 @@ +# Importação de bibliotecas +from fastapi import APIRouter, Depends, status +from actions.jwt.get_current_user import get_current_user +from api.packages.v1.administrativo.controllers.t_pessoa_representante_controller import TPessoaRepresentanteController +from api.packages.v1.administrativo.schemas.t_pessoa_representante_schema import TPessoaRepresentanteIdSchema, TPessoaRepresentantePessoaIdSchema, TPessoaRepresentanteSaveSchema, TPessoaRepresentanteUpdateSchema + +# Inicializa o roteador para as rotas do regime de bens +router = APIRouter() + +# Instânciamento do controller desejado +t_pessoa_representante_controller = TPessoaRepresentanteController() + +# Lista todos as pessoas +@router.get('/pessoa/{pessoa_id}', + status_code=status.HTTP_200_OK, + summary='Lista todos as pessoas cadastrados', + response_description='Lista todos as pessoas cadastrados') +async def index(pessoa_id : int, current_user: dict = Depends(get_current_user)): + + # Cria o schema com os dados recebidos + t_pessoa_representante_pessoa_id_schema = TPessoaRepresentantePessoaIdSchema(pessoa_id=pessoa_id) + + # Busca todos as pessoas cadastrados + response = t_pessoa_representante_controller.index(t_pessoa_representante_pessoa_id_schema) + + # Retorna os dados localizados + return response + +# Localiza um regime de bens pelo ID +@router.get('/{pessoa_representante_id}', + status_code=status.HTTP_200_OK, + summary='Busca um registro em específico pelo ID da pessoa', + response_description='Busca um registro em específico') +async def show(pessoa_representante_id : int, current_user: dict = Depends(get_current_user)): + + # Cria o schema com os dados recebidos + t_pessoa_representante_id_schema = TPessoaRepresentanteIdSchema(pessoa_representante_id=pessoa_representante_id) + + # Busca um regime de bens específico pelo ID + response = t_pessoa_representante_controller.show(t_pessoa_representante_id_schema) + + # Retorna os dados localizados + return response + + +# Cadastro de regime de bens +@router.post('/', + status_code=status.HTTP_201_CREATED, + summary='Cadastra um regime de bens', + response_description='Cadastra um regime de bens') +async def save(t_pessoa_representante_save_schema : TPessoaRepresentanteSaveSchema, current_user: dict = Depends(get_current_user)): + + # Efetua o cadastro no banco de dados + response = t_pessoa_representante_controller.save(t_pessoa_representante_save_schema) + + # Retorna os dados localizados + return response + + +# Atualiza os dados de um regime de bens +@router.put('/{pessoa_id}', + status_code=status.HTTP_200_OK, + summary='Atualiza um regime de bens', + response_description='Atualiza um regime de bens') +async def update(pessoa_id : int, t_pessoa_representante_update_schema : TPessoaRepresentanteUpdateSchema, current_user: dict = Depends(get_current_user)): + + # Adiciona o ID do registro ao schema + t_pessoa_representante_update_schema.pessoa_id = pessoa_id + + # Efetua a atualização dos dados + response = t_pessoa_representante_controller.update(t_pessoa_representante_update_schema) + + # Retorna os dados localizados + return response + +# Exclui um determinado regime de bens +@router.delete('/{pessoa_representante_id}', + status_code=status.HTTP_200_OK, + summary='Remove um regime de bens', + response_description='Remove um regime de bens') +async def delete(pessoa_representante_id : int, current_user: dict = Depends(get_current_user)): + + # Cria o schema com os dados recebidos + t_pessoa_representante_id_schema = TPessoaRepresentanteIdSchema(pessoa_representante_id=pessoa_representante_id) + + # Efetua a exclusão do regime de bens + response = t_pessoa_representante_controller.delete(t_pessoa_representante_id_schema) + + # Retorna os dados localizados + return response \ No newline at end of file diff --git a/packages/v1/administrativo/repositories/t_pessoa_representante/t_pessoa_representante_delete_repository.py b/packages/v1/administrativo/repositories/t_pessoa_representante/t_pessoa_representante_delete_repository.py new file mode 100644 index 0000000..3ddb296 --- /dev/null +++ b/packages/v1/administrativo/repositories/t_pessoa_representante/t_pessoa_representante_delete_repository.py @@ -0,0 +1,43 @@ +from abstracts.repository import BaseRepository +from fastapi import HTTPException, status + +from api.packages.v1.administrativo.schemas.t_pessoa_representante_schema import TPessoaRepresentanteIdSchema + + +class TPessoaRepresentanteDeleteRepository(BaseRepository): + """ + Repositório para a operação de exclusão de um registro na tabela + g_tb_regimebens. + """ + + def execute(self, t_pessoa_representante_id_schema: TPessoaRepresentanteIdSchema): + """ + Executa a consulta SQL para remover um registro pelo ID. + + Args: + regimebens_schema (GTbRegimebensIdSchema): O esquema com o ID a ser removido. + + Returns: + O resultado da operação de exclusão. + """ + try: + # Montagem do sql + sql = """ DELETE FROM T_PESSOA_REPRESENTANTE TPR WHERE TPR.PESSOA_REPRESENTANTE_ID = :pessoaRepresentanteId """ + + # Preenchimento de parâmetros + params = { + "pessoaRepresentanteId": t_pessoa_representante_id_schema.pessoa_representante_id + } + + # Execução do sql + response = self.run(sql, params) + + # Retorna o resultado + return response + + except Exception as e: + # Informa que houve uma falha na exclusão + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail=f"Erro ao excluir regime de bens: {e}" + ) \ No newline at end of file diff --git a/packages/v1/administrativo/repositories/t_pessoa_representante/t_pessoa_representante_index_repository.py b/packages/v1/administrativo/repositories/t_pessoa_representante/t_pessoa_representante_index_repository.py new file mode 100644 index 0000000..2542a61 --- /dev/null +++ b/packages/v1/administrativo/repositories/t_pessoa_representante/t_pessoa_representante_index_repository.py @@ -0,0 +1,42 @@ +from abstracts.repository import BaseRepository +from api.packages.v1.administrativo.schemas.t_pessoa_representante_schema import TPessoaRepresentantePessoaIdSchema + +class TPessoaRepresentanteIndexRepository(BaseRepository): + """ + Repositório para a operação de listagem de todos os registros + na tabela g_tb_regimebens. + """ + + def execute(self, t_pessoa_representante_pessoa_id_schema : TPessoaRepresentantePessoaIdSchema): + """ + Executa a consulta SQL para buscar todos os registros. + + Returns: + Uma lista de dicionários contendo os dados dos registros. + """ + # Montagem do SQL + sql = """ SELECT + TPR.PESSOA_ID, + TPR.REPRESENTANTE_ID, + TPR.PESSOA_REPRESENTANTE_ID, + TPJ.NOME AS TPJ_NOME, + TPF.NOME AS TPF_NOME, + TPF.EMAIL AS TPF_EMAIL, + TPF.TELEFONE AS TPF_TELEFONE + FROM + T_PESSOA_REPRESENTANTE TPR + JOIN T_PESSOA TPF ON + TPR.REPRESENTANTE_ID = TPF.PESSOA_ID + JOIN T_PESSOA TPJ ON + TPR.PESSOA_ID = TPJ.PESSOA_ID + WHERE TPR.PESSOA_ID = :pessoa_id""" + + params = { + "pessoa_id": t_pessoa_representante_pessoa_id_schema.pessoa_id + } + + # Execução do sql + response = self.fetch_all(sql, params) + + # Retorna os dados localizados + return response \ No newline at end of file diff --git a/packages/v1/administrativo/repositories/t_pessoa_representante/t_pessoa_representante_save_repository.py b/packages/v1/administrativo/repositories/t_pessoa_representante/t_pessoa_representante_save_repository.py new file mode 100644 index 0000000..8e085db --- /dev/null +++ b/packages/v1/administrativo/repositories/t_pessoa_representante/t_pessoa_representante_save_repository.py @@ -0,0 +1,67 @@ +from fastapi import HTTPException, status +from abstracts.repository import BaseRepository +from api.packages.v1.administrativo.schemas.t_pessoa_representante_schema import TPessoaRepresentanteSaveSchema + + +class TPessoaRepresentanteSaveRepository(BaseRepository): + """ + Repositório para a operação de salvamento de um novo registro na tabela g_tb_regimebens. + """ + + def execute(self, t_pessoa_representante_save_schema: TPessoaRepresentanteSaveSchema): + """ + Executa a operação de salvamento no banco de dados. + + Args: + regimebens_schema (GTbRegimebensSaveSchema): O esquema com os dados a serem salvos. + + Returns: + O registro recém-criado. + + Raises: + HTTPException: Caso ocorra um erro na execução da query. + """ + try: + + # Montagem do SQL + sql = """ + INSERT INTO T_PESSOA_REPRESENTANTE( + REPRESENTANTE_ID, + PESSOA_REPRESENTANTE_ID, + PESSOA_ID, + PESSOA_AUXILIAR_ID, + MARCACAO_TIPO_ID, + ATO_PARTETIPO_ID, + ASSINATURA_TIPO + ) VALUES ( + :representante_id, + :pessoa_representante_id, + :pessoa_id, + :pessoa_auxiliar_id, + :marcacao_tipo_id, + :ato_partetipo_id, + :assinatura_tipo + ) RETURNING *; + """ + + # Preenchimento de parâmetros + params = { + "representante_id": t_pessoa_representante_save_schema.representante_id, + "pessoa_representante_id": t_pessoa_representante_save_schema.pessoa_representante_id, + "pessoa_id": t_pessoa_representante_save_schema.pessoa_id, + "pessoa_auxiliar_id": t_pessoa_representante_save_schema.pessoa_auxiliar_id, + "marcacao_tipo_id": t_pessoa_representante_save_schema.marcacao_tipo_id, + "ato_partetipo_id": t_pessoa_representante_save_schema.ato_partetipo_id, + "assinatura_tipo": t_pessoa_representante_save_schema.assinatura_tipo, + } + + # Execução do sql + return self.run_and_return(sql, params) + + except Exception as e: + + # Informa que houve uma falha no salvamento do registro + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail=f"Erro ao salvar registro: {e}" + ) \ No newline at end of file diff --git a/packages/v1/administrativo/repositories/t_pessoa_representante/t_pessoa_representante_show_repository.py b/packages/v1/administrativo/repositories/t_pessoa_representante/t_pessoa_representante_show_repository.py new file mode 100644 index 0000000..76ab971 --- /dev/null +++ b/packages/v1/administrativo/repositories/t_pessoa_representante/t_pessoa_representante_show_repository.py @@ -0,0 +1,47 @@ +from abstracts.repository import BaseRepository +from fastapi import HTTPException, status + +from api.packages.v1.administrativo.repositories.t_pessoa_representante.t_pessoa_representante_delete_repository import TPessoaRepresentanteIdSchema + +class TPessoaRepresentanteShowRepository(BaseRepository): + """ + Repositório para a operação de exibição de um registro na tabela g_tb_regimebens. + """ + + def execute(self, t_pessoa_representante_id_schema: TPessoaRepresentanteIdSchema): + """ + Busca um tipo de regime de bens específico pelo ID. + + Args: + regimebens_schema (GTbRegimebensIdSchema): O esquema que contém o ID do registro. + + Returns: + O registro encontrado ou None se não existir. + + Raises: + HTTPException: Caso ocorra um erro na execução da query. + """ + try: + # Montagem do SQL + sql = "SELECT * FROM T_PESSOA_REPRESENTANTE TPR WHERE TPR.PESSOA_REPRESENTANTE_ID = :pessoa_representante_id;" + + # Preenchimento de parâmetros + params = { + 'pessoa_representante_id': t_pessoa_representante_id_schema.pessoa_representante_id + } + + # Execução do SQL + result = self.fetch_one(sql, params) + + if not result: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Registro não encontrado" + ) + + return result + except Exception as e: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail=f"Erro ao buscar registro: {str(e)}" + ) \ No newline at end of file diff --git a/packages/v1/administrativo/repositories/t_pessoa_representante/t_pessoa_representante_update_repository.py b/packages/v1/administrativo/repositories/t_pessoa_representante/t_pessoa_representante_update_repository.py new file mode 100644 index 0000000..0e946cf --- /dev/null +++ b/packages/v1/administrativo/repositories/t_pessoa_representante/t_pessoa_representante_update_repository.py @@ -0,0 +1,71 @@ +from abstracts.repository import BaseRepository +from fastapi import HTTPException, status +from datetime import datetime + +from api.packages.v1.administrativo.schemas.t_pessoa_representante_schema import TPessoaRepresentanteUpdateSchema + + +class TPessoaRepresentanteUpdateRepository(BaseRepository): + """ + Repositório responsável por atualizar parcialmente registros na tabela T_PESSOA_REPRESENTANTE. + """ + + def execute(self, t_pessoa_representante_update_schema: TPessoaRepresentanteUpdateSchema): + """ + Executa a atualização de um registro da tabela T_PESSOA_REPRESENTANTE. + + Args: + t_pessoa_representante_update_schema (TPessoaRepresentanteUpdateSchema): Dados enviados para atualização. + + Returns: + dict: Registro atualizado. + + Raises: + HTTPException: Caso o registro não exista ou ocorra erro de execução. + """ + try: + # Extrai apenas campos enviados + data = t_pessoa_representante_update_schema.model_dump(exclude_unset=True) + updates = [] + params = {"pessoa_representante_id": t_pessoa_representante_update_schema.pessoa_representante_id} + + # Monta dinamicamente os campos que serão atualizados + for field, value in data.items(): + if field != "pessoa_representante_id" and value is not None: + updates.append(f"{field.upper()} = :{field}") + params[field] = value + + # Nenhum campo informado + if not updates: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail="Nenhum campo informado para atualização." + ) + + # SQL dinâmico corrigido + sql = f""" + UPDATE T_PESSOA_REPRESENTANTE + SET {', '.join(updates)} + WHERE PESSOA_REPRESENTANTE_ID = :pessoa_representante_id + RETURNING *; + """ + + # Executa e retorna o resultado + result = self.run_and_return(sql, params) + + if not result: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=f"Nenhum registro encontrado com o ID {t_pessoa_representante_update_schema.pessoa_representante_id}." + ) + + return result + + except HTTPException: + raise + + except Exception as e: + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail=f"Erro ao atualizar o representante/pessoa: {e}" + ) diff --git a/packages/v1/administrativo/schemas/t_pessoa_representante_schema.py b/packages/v1/administrativo/schemas/t_pessoa_representante_schema.py new file mode 100644 index 0000000..73f75e9 --- /dev/null +++ b/packages/v1/administrativo/schemas/t_pessoa_representante_schema.py @@ -0,0 +1,113 @@ +from pydantic import BaseModel, field_validator, model_validator +from fastapi import HTTPException, status +from typing import Optional +from actions.validations.text import Text + + +# ---------------------------------------------------- +# Schema base +# ---------------------------------------------------- +class TPessoaRepresentanteSchema(BaseModel): + representante_id: Optional[int] = None + pessoa_representante_id: Optional[int] = None + pessoa_id: Optional[int] = None + pessoa_auxiliar_id: Optional[int] = None + marcacao_tipo_id: Optional[int] = None + ato_partetipo_id: Optional[int] = None + assinatura_tipo: Optional[str] = None + + class Config: + from_attributes = True + + +# ---------------------------------------------------- +# Schema para localizar (GET) +# ---------------------------------------------------- +class TPessoaRepresentanteIdSchema(BaseModel): + pessoa_representante_id: int + +# ---------------------------------------------------- +# Schema para localizar (GET) +# ---------------------------------------------------- +class TPessoaRepresentantePessoaIdSchema(BaseModel): + pessoa_id: int + + +# ---------------------------------------------------- +# Schema para criação (POST) +# ---------------------------------------------------- +class TPessoaRepresentanteSaveSchema(BaseModel): + representante_id: Optional[int] = None + pessoa_representante_id: Optional[int] = None + pessoa_id: Optional[int] + pessoa_auxiliar_id: Optional[int] + marcacao_tipo_id: Optional[int] + ato_partetipo_id: Optional[int] + assinatura_tipo: Optional[str] + + # Sanitiza o campo assinatura_tipo (texto) + @field_validator('assinatura_tipo') + def sanitize_fields(cls, v): + if v: + return Text.sanitize_input(v) + return v + + # Valida campos obrigatórios + @model_validator(mode='after') + def validate_required_fields(self): + errors = [] + + if not self.pessoa_id: + errors.append({'input': 'pessoa_id', 'message': 'O campo pessoa_id é obrigatório.'}) + + if not self.marcacao_tipo_id: + errors.append({'input': 'marcacao_tipo_id', 'message': 'O campo marcacao_tipo_id é obrigatório.'}) + + if not self.ato_partetipo_id: + errors.append({'input': 'ato_partetipo_id', 'message': 'O campo ato_partetipo_id é obrigatório.'}) + + if not self.assinatura_tipo or len(self.assinatura_tipo.strip()) == 0: + errors.append({'input': 'assinatura_tipo', 'message': 'O campo assinatura_tipo é obrigatório.'}) + + if errors: + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail=errors + ) + + return self + + +# ---------------------------------------------------- +# Schema para atualização (PUT) +# ---------------------------------------------------- +class TPessoaRepresentanteUpdateSchema(BaseModel): + pessoa_representante_id: Optional[int] = None + pessoa_id: Optional[int] = None + pessoa_auxiliar_id: Optional[int] = None + marcacao_tipo_id: Optional[int] = None + ato_partetipo_id: Optional[int] = None + assinatura_tipo: Optional[str] = None + + # Sanitiza + @field_validator('assinatura_tipo') + def sanitize_fields(cls, v): + if v: + return Text.sanitize_input(v) + return v + + # Valida se o campo texto não está vazio + @model_validator(mode='after') + def validate_fields(self): + errors = [] + + if self.assinatura_tipo is not None and len(self.assinatura_tipo.strip()) == 0: + errors.append({'input': 'assinatura_tipo', 'message': 'O campo assinatura_tipo não pode estar vazio.'}) + + if errors: + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail=errors + ) + + return self diff --git a/packages/v1/administrativo/services/t_pessoa_representante/go/t_pessoa_representante_delete_service.py b/packages/v1/administrativo/services/t_pessoa_representante/go/t_pessoa_representante_delete_service.py new file mode 100644 index 0000000..738e09d --- /dev/null +++ b/packages/v1/administrativo/services/t_pessoa_representante/go/t_pessoa_representante_delete_service.py @@ -0,0 +1,27 @@ +from api.packages.v1.administrativo.actions.t_pessoa_representante.t_pessoa_representante_delete_action import TPessoaRepresentanteDeleteAction +from api.packages.v1.administrativo.schemas.t_pessoa_representante_schema import TPessoaRepresentanteIdSchema + +class TPessoaRepresentanteDeleteService: + """ + Serviço responsável por encapsular a lógica de negócio para a operação + de exclusão de um registro na tabela g_tb_regimebens. + """ + + def execute(self, t_pessoa_representante_id_schema: TPessoaRepresentanteIdSchema): + """ + Executa a operação de exclusão do registro no banco de dados. + + Args: + regimebens_schema (GTbRegimebensIdSchema): O esquema com o ID do registro a ser excluído. + + Returns: + O resultado da operação de exclusão. + """ + # Instanciamento da ação + t_pessoa_representante_delete_action = TPessoaRepresentanteDeleteAction() + + # Executa a ação em questão + data = t_pessoa_representante_delete_action.execute(t_pessoa_representante_id_schema) + + # Retorno da informação + return data \ No newline at end of file diff --git a/packages/v1/administrativo/services/t_pessoa_representante/go/t_pessoa_representante_index_service.py b/packages/v1/administrativo/services/t_pessoa_representante/go/t_pessoa_representante_index_service.py new file mode 100644 index 0000000..0dead47 --- /dev/null +++ b/packages/v1/administrativo/services/t_pessoa_representante/go/t_pessoa_representante_index_service.py @@ -0,0 +1,34 @@ +from fastapi import HTTPException, status + +from api.packages.v1.administrativo.actions.t_pessoa_representante.t_pessoa_representante_index_action import TPessoaRepresentanteIndexAction +from api.packages.v1.administrativo.schemas.t_pessoa_representante_schema import TPessoaRepresentantePessoaIdSchema + +class TPessoaRepresentanteIndexService: + """ + Serviço responsável por encapsular a lógica de negócio para a operação + de listagem de registros na tabela g_tb_regimebens. + """ + + def execute(self, t_pessoa_representante_pessoa_id_schema: TPessoaRepresentantePessoaIdSchema): + """ + Executa a operação de busca de todos os registros no banco de dados. + + Returns: + A lista de registros encontrados. + """ + # Instanciamento da ação + t_pessoa_representante_index_action = TPessoaRepresentanteIndexAction() + + # Executa a busca de todas as ações + data = t_pessoa_representante_index_action.execute(t_pessoa_representante_pessoa_id_schema) + + # Verifica se foram localizados registros + if not data: + # Retorna uma exceção + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail='Não foi possível localizar as pessoas' + ) + + # Retorna as informações localizadas + return data \ No newline at end of file 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 new file mode 100644 index 0000000..5167dce --- /dev/null +++ b/packages/v1/administrativo/services/t_pessoa_representante/go/t_pessoa_representante_save_service.py @@ -0,0 +1,45 @@ +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 + +class TPessoaRepresentanteSaveService: + + def __init__(self): + # Ação responsável por carregar as services de acordo com o estado + self.dynamic_import = DynamicImport() + + # Define o pacote que deve ser carregado + self.dynamic_import.set_package("administrativo") + + # Define a tabela que o pacote pertence + self.dynamic_import.set_table("t_pessoa_representante") + pass + + # Cadastra o novo regime de bens + def execute(self, t_pessoa_representante_save_schema: TPessoaRepresentanteSaveSchema): + + # Verifica se precisa gerar o ID de sequência + if not t_pessoa_representante_save_schema.pessoa_representante_id: + + # Crio um objeto de sequencia + sequencia_schema = GSequenciaSchema() + + # Define os dados para atualizar a sequencia + sequencia_schema.tabela = 'T_PESSOA_REPRESENTANTE' + + # Busco a sequência atualizada + generate = GenerateService() + + # Busco a sequência atualizada + sequencia = generate.execute(sequencia_schema) + + # Atualiza os dados da chave primária + t_pessoa_representante_save_schema.pessoa_representante_id = sequencia.sequencia + + # Instanciamento de ações + t_pessoa_representante_save_action = TPessoaRepresentanteSaveAction() + + # Retorna o resultado da operação + return t_pessoa_representante_save_action.execute(t_pessoa_representante_save_schema) \ No newline at end of file diff --git a/packages/v1/administrativo/services/t_pessoa_representante/go/t_pessoa_representante_show_service.py b/packages/v1/administrativo/services/t_pessoa_representante/go/t_pessoa_representante_show_service.py new file mode 100644 index 0000000..dc1ce49 --- /dev/null +++ b/packages/v1/administrativo/services/t_pessoa_representante/go/t_pessoa_representante_show_service.py @@ -0,0 +1,36 @@ +from fastapi import HTTPException, status + +from api.packages.v1.administrativo.actions.t_pessoa_representante.t_pessoa_representante_show_action import TPessoaRepresentanteShowAction +from api.packages.v1.administrativo.schemas.t_pessoa_representante_schema import TPessoaRepresentanteIdSchema + +class TPessoaRepresentanteShowService: + """ + Serviço responsável por encapsular a lógica de negócio para a operação + de busca de um registro na tabela g_tb_regimebens. + """ + + def execute(self, t_pessoa_representante_id_schema: TPessoaRepresentanteIdSchema): + """ + Executa a operação de busca no banco de dados. + + Args: + regimebens_schema (GTbRegimebensIdSchema): O esquema com o ID a ser buscado. + + Returns: + O resultado da busca. + """ + # Instanciamento da ação + t_pessoa_representante_show_action = TPessoaRepresentanteShowAction() + + # Executa a ação em questão + data = t_pessoa_representante_show_action.execute(t_pessoa_representante_id_schema) + + if not data: + # Retorna uma exceção + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail='Não foi possivel localizar a pessoa desejada' + ) + + # Retorno da informação + return data \ No newline at end of file diff --git a/packages/v1/administrativo/services/t_pessoa_representante/go/t_pessoa_representante_update_service.py b/packages/v1/administrativo/services/t_pessoa_representante/go/t_pessoa_representante_update_service.py new file mode 100644 index 0000000..0c04351 --- /dev/null +++ b/packages/v1/administrativo/services/t_pessoa_representante/go/t_pessoa_representante_update_service.py @@ -0,0 +1,24 @@ +from api.packages.v1.administrativo.actions.t_pessoa_representante.t_pessoa_representante_update_action import TPessoaRepresentanteUpdateAction +from api.packages.v1.administrativo.repositories.t_pessoa_representante.t_pessoa_representante_update_repository import TPessoaRepresentanteUpdateSchema + + +class TPessoaRepresentanteUpdateService: + """ + Serviço para a operação de atualização de um registro na tabela + g_tb_regimebens. + """ + def execute(self, t_pessoa_representante_update_schema: TPessoaRepresentanteUpdateSchema): + """ + Executa a operação de atualização no banco de dados. + + Args: + regimebens_schema (GTbRegimebensUpdateSchema): O esquema com os dados a serem atualizados. + + Returns: + O resultado da operação de atualização. + """ + # Instanciamento de ações + t_pessoa_representante_update_action = TPessoaRepresentanteUpdateAction() + + # Retorna o resultado da operação + return t_pessoa_representante_update_action.execute(t_pessoa_representante_update_schema) \ No newline at end of file diff --git a/packages/v1/api.py b/packages/v1/api.py index 7e6e379..cc6e75e 100644 --- a/packages/v1/api.py +++ b/packages/v1/api.py @@ -29,6 +29,7 @@ from packages.v1.administrativo.endpoints import g_uf_endpoint from packages.v1.administrativo.endpoints import t_imovel_endpoint from packages.v1.administrativo.endpoints import t_imovel_unidade_endpoint from packages.v1.administrativo.endpoints import t_pessoa_endpoint +from packages.v1.administrativo.endpoints import t_pessoa_representante_endpoint # Cria uma instância do APIRouter que vai agregar todas as rotas da API api_router = APIRouter() @@ -167,7 +168,12 @@ api_router.include_router( t_imovel_unidade_endpoint.router, prefix="/administrativo/t_imovel_unidade", tags=["Imóveis Unidades"] ) -# Inclui as rotas de t_imovel_unidade +# Inclui as rotas de t_pessoa api_router.include_router( t_pessoa_endpoint.router, prefix="/administrativo/t_pessoa", tags=["Pessoas Fisicas e Jurídicas"] +) + +# Inclui as rotas de t_imovel_unidade +api_router.include_router( + t_pessoa_representante_endpoint.router, prefix="/administrativo/t_pessoa_representante", tags=["Representante de pessoas jurídicas"] ) \ No newline at end of file