From 8f38f0588b211fee38700d2fda894c4826ed7412 Mon Sep 17 00:00:00 2001 From: Kenio de Souza Date: Tue, 16 Sep 2025 08:53:55 -0300 Subject: [PATCH] [MVPTN-5] feat(CRUD): Crud completo para a tabela g_tb_txmodelogrupo --- .../g_tb_txmodelogrupo_delete_action.py | 25 ++++ ...b_txmodelogrupo_get_by_descricao_action.py | 29 +++++ .../g_tb_txmodelogrupo_index_action.py | 25 ++++ .../g_tb_txmodelogrupo_save_action.py | 29 +++++ .../g_tb_txmodelogrupo_show_action.py | 29 +++++ .../g_tb_txmodelogrupo_update_action.py | 25 ++++ .../g_tb_txmodelogrupo_controller.py | 112 ++++++++++++++++++ .../endpoints/g_tb_txmodelogrupo_endpoint.py | 78 ++++++++++++ .../g_tb_txmodelogrupo_delete_repository.py | 44 +++++++ ...modelogrupo_get_by_descricao_repository.py | 17 +++ .../g_tb_txmodelogrupo_index_repository.py | 37 ++++++ .../g_tb_txmodelogrupo_save_repository.py | 41 +++++++ .../g_tb_txmodelogrupo_show_repository.py | 46 +++++++ .../g_tb_txmodelogrupo_update_repository.py | 50 ++++++++ .../schemas/g_tb_txmodelogrupo_schema.py | 101 ++++++++++++++++ .../go/g_tb_txmodelogrupo_delete_service.py | 26 ++++ ..._txmodelogrupo_get_by_descricao_service.py | 40 +++++++ .../go/g_tb_txmodelogrupo_index_service.py | 34 ++++++ .../go/g_tb_txmodelogrupo_save_service.py | 70 +++++++++++ .../go/g_tb_txmodelogrupo_show_service.py | 26 ++++ .../go/g_tb_txmodelogrupo_update_service.py | 22 ++++ packages/v1/api.py | 6 + 22 files changed, 912 insertions(+) create mode 100644 packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_delete_action.py create mode 100644 packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_get_by_descricao_action.py create mode 100644 packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_index_action.py create mode 100644 packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_save_action.py create mode 100644 packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_show_action.py create mode 100644 packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_update_action.py create mode 100644 packages/v1/administrativo/controllers/g_tb_txmodelogrupo_controller.py create mode 100644 packages/v1/administrativo/endpoints/g_tb_txmodelogrupo_endpoint.py create mode 100644 packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_delete_repository.py create mode 100644 packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_get_by_descricao_repository.py create mode 100644 packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_index_repository.py create mode 100644 packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_save_repository.py create mode 100644 packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_show_repository.py create mode 100644 packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_update_repository.py create mode 100644 packages/v1/administrativo/schemas/g_tb_txmodelogrupo_schema.py create mode 100644 packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_delete_service.py create mode 100644 packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_get_by_descricao_service.py create mode 100644 packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_index_service.py create mode 100644 packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_save_service.py create mode 100644 packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_show_service.py create mode 100644 packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_update_service.py diff --git a/packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_delete_action.py b/packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_delete_action.py new file mode 100644 index 0000000..43b5fab --- /dev/null +++ b/packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_delete_action.py @@ -0,0 +1,25 @@ +from abstracts.action import BaseAction +from packages.v1.administrativo.schemas.g_tb_txmodelogrupo_schema import GTbTxmodelogrupoIdSchema +from packages.v1.administrativo.repositories.g_tb_txmodelogrupo.g_tb_txmodelogrupo_delete_repository import DeleteRepository + +class DeleteAction(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_TXMODELOGRUPO. + """ + + def execute(self, txmodelogrupo_schema: GTbTxmodelogrupoIdSchema): + """ + Executa a operação de exclusão no banco de dados. + + Args: + txmodelogrupo_schema (GTbTxmodelogrupoIdSchema): O esquema com o ID a ser excluído. + + Returns: + O resultado da operação de exclusão. + """ + # Instanciamento do repositório + delete_repository = DeleteRepository() + + # Execução do repositório + return delete_repository.execute(txmodelogrupo_schema) \ No newline at end of file diff --git a/packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_get_by_descricao_action.py b/packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_get_by_descricao_action.py new file mode 100644 index 0000000..ab8c522 --- /dev/null +++ b/packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_get_by_descricao_action.py @@ -0,0 +1,29 @@ +from abstracts.action import BaseAction +from packages.v1.administrativo.schemas.g_tb_txmodelogrupo_schema import GTbTxmodelogrupoDescricaoSchema # Assumindo que um schema similar será criado +from packages.v1.administrativo.repositories.g_tb_txmodelogrupo.g_tb_txmodelogrupo_get_by_descricao_repository import GetByDescricaoRepository # Assumindo que um repositório similar será criado + + +class GetByDescricaoAction(BaseAction): + """ + 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_TXMODELOGRUPO por descrição. + """ + + def execute(self, txmodelogrupo_schema: GTbTxmodelogrupoDescricaoSchema): + """ + Executa a operação de busca no banco de dados. + + Args: + txmodelogrupo_schema (GTbTxmodelogrupoDescricaoSchema): O esquema com a descrição a ser buscada. + + Returns: + O registro encontrado ou None. + """ + # Instanciamento do repositório + get_by_descricao_repository = GetByDescricaoRepository() + + # Execução do repositório + response = get_by_descricao_repository.execute(txmodelogrupo_schema) + + # Retorno da informação + return response \ No newline at end of file diff --git a/packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_index_action.py b/packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_index_action.py new file mode 100644 index 0000000..f51f2e1 --- /dev/null +++ b/packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_index_action.py @@ -0,0 +1,25 @@ +from abstracts.action import BaseAction +from packages.v1.administrativo.repositories.g_tb_txmodelogrupo.g_tb_txmodelogrupo_index_repository import IndexRepository + + +class IndexAction(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_TXMODELOGRUPO. + """ + + def execute(self): + """ + Executa a operação de listagem no banco de dados. + + Returns: + A lista de todos os registros da tabela G_TB_TXMODELOGRUPO. + """ + # Instanciamento do repositório + index_repository = IndexRepository() + + # Execução do repositório + response = index_repository.execute() + + # Retorno da informação + return response \ No newline at end of file diff --git a/packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_save_action.py b/packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_save_action.py new file mode 100644 index 0000000..1c0af2a --- /dev/null +++ b/packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_save_action.py @@ -0,0 +1,29 @@ +from abstracts.action import BaseAction +from packages.v1.administrativo.schemas.g_tb_txmodelogrupo_schema import GTbTxmodelogrupoSaveSchema +from packages.v1.administrativo.repositories.g_tb_txmodelogrupo.g_tb_txmodelogrupo_save_repository import SaveRepository + + +class SaveAction(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_TXMODELOGRUPO. + """ + + def execute(self, txmodelogrupo_schema: GTbTxmodelogrupoSaveSchema): + """ + Executa a operação de salvamento. + + Args: + txmodelogrupo_schema (GTbTxmodelogrupoSaveSchema): O esquema com os dados a serem salvos. + + Returns: + O resultado da operação de salvamento. + """ + # Instanciamento do repositório + save_repository = SaveRepository() + + # Execução do repositório + response = save_repository.execute(txmodelogrupo_schema) + + # Retorno da informação + return response \ No newline at end of file diff --git a/packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_show_action.py b/packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_show_action.py new file mode 100644 index 0000000..ac61ab4 --- /dev/null +++ b/packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_show_action.py @@ -0,0 +1,29 @@ +from abstracts.action import BaseAction +from packages.v1.administrativo.schemas.g_tb_txmodelogrupo_schema import GTbTxmodelogrupoIdSchema +from packages.v1.administrativo.repositories.g_tb_txmodelogrupo.g_tb_txmodelogrupo_show_repository import ShowRepository + + +class ShowAction(BaseAction): + """ + Serviço responsável por encapsular a lógica de negócio para a exibição + de um registro na tabela G_TB_TXMODELOGRUPO. + """ + + def execute(self, txmodelogrupo_schema: GTbTxmodelogrupoIdSchema): + """ + Executa a operação de exibição. + + Args: + txmodelogrupo_schema (GTbTxModeloGrupoIdSchema): O esquema com o ID do registro a ser exibido. + + Returns: + O resultado da operação de exibição. + """ + # Instânciamento do repositório + show_repository = ShowRepository() + + # Execução do repositório + response = show_repository.execute(txmodelogrupo_schema) + + # Retorno da informação + return response \ No newline at end of file diff --git a/packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_update_action.py b/packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_update_action.py new file mode 100644 index 0000000..9492a4c --- /dev/null +++ b/packages/v1/administrativo/actions/g_tb_txmodelogrupo/g_tb_txmodelogrupo_update_action.py @@ -0,0 +1,25 @@ +from packages.v1.administrativo.schemas.g_tb_txmodelogrupo_schema import GTbTxmodelogrupoUpdateSchema +from packages.v1.administrativo.repositories.g_tb_txmodelogrupo.g_tb_txmodelogrupo_update_repository import UpdateRepository + + +class UpdateAction: + """ + Serviço responsável por encapsular a lógica de negócio para a atualização + de um registro na tabela G_TB_TXMODELOGRUPO. + """ + + def execute(self, tb_txmodelogrupo_id: int, txmodelogrupo_schema: GTbTxmodelogrupoUpdateSchema): + """ + Executa a operação de atualização. + + Args: + txmodelogrupo_schema (GTbTxmodelogrupoUpdateSchema): 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 + update_repository = UpdateRepository() + + # Chama o método de execução do repositório para realizar a atualização + return update_repository.execute(tb_txmodelogrupo_id, txmodelogrupo_schema) \ No newline at end of file diff --git a/packages/v1/administrativo/controllers/g_tb_txmodelogrupo_controller.py b/packages/v1/administrativo/controllers/g_tb_txmodelogrupo_controller.py new file mode 100644 index 0000000..d6d46dc --- /dev/null +++ b/packages/v1/administrativo/controllers/g_tb_txmodelogrupo_controller.py @@ -0,0 +1,112 @@ +from actions.dynamic_import.dynamic_import import DynamicImport +from packages.v1.administrativo.schemas.g_tb_txmodelogrupo_schema import ( + GTbTxmodelogrupoSchema, + GTbTxmodelogrupoSaveSchema, + GTbTxmodelogrupoUpdateSchema, + GTbTxmodelogrupoIdSchema, + GTbTxmodelogrupoDescricaoSchema +) + + +class GTbTxmodelogrupoController: + + 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("g_tb_txmodelogrupo") + pass + + # Lista todos os grupos de modelo de texto + def index(self): + + # Importação da classe desejada + index_service = self.dynamic_import.service("g_tb_txmodelogrupo_index_service", "IndexService") + + # Instância da classe service + self.index_service = index_service() + + # Lista todos os grupos de modelo de texto + return { + 'message': 'Grupos de modelo de texto localizados com sucesso', + 'data': self.index_service.execute() + } + + # Busca um grupo de modelo de texto específico pelo ID + def show(self, txmodelogrupo_schema: GTbTxmodelogrupoIdSchema): + + # Importação da classe desejada + show_service = self.dynamic_import.service('g_tb_txmodelogrupo_show_service', 'ShowService') + + # Instância da classe desejada + self.show_service = show_service() + + # Busca e retorna o grupo de modelo de texto desejado + return { + 'message': 'Grupo de modelo de texto localizado com sucesso', + 'data': self.show_service.execute(txmodelogrupo_schema) + } + + # Busca um grupo de modelo de texto pela descrição + def get_by_descricao(self, txmodelogrupo_schema: GTbTxmodelogrupoDescricaoSchema): + + # Importação da classe desejada + show_service = self.dynamic_import.service('g_tb_txmodelogrupo_get_by_descricao_service', 'GetByDescricaoService') + + # Instância da classe desejada + self.show_service = show_service() + + # Busca e retorna o grupo de modelo de texto desejado + return { + 'message': 'Grupo de modelo de texto localizado com sucesso', + 'data': self.show_service.execute(txmodelogrupo_schema, True) # True para retornar a mensagem de erro caso não localize o serviço + } + + # Cadastra um novo grupo de modelo de texto + def save(self, txmodelogrupo_schema: GTbTxmodelogrupoSaveSchema): + + # Importação da classe desejada + save_service = self.dynamic_import.service('g_tb_txmodelogrupo_save_service', 'GTbTxmodelogrupoSaveService') + + # Instância da classe desejada + self.save_service = save_service() + + # Busca e retorna o grupo de modelo de texto desejado + return { + 'message': 'Grupo de modelo de texto salvo com sucesso', + 'data': self.save_service.execute(txmodelogrupo_schema) + } + + # Atualiza os dados de um grupo de modelo de texto + def update(self, tb_txmodelogrupo_id: int, txmodelogrupo_schema: GTbTxmodelogrupoUpdateSchema): + + # Importação da classe desejada + update_service = self.dynamic_import.service('g_tb_txmodelogrupo_update_service', 'GTbTxmodelogrupoUpdateService') + + # Instância da classe desejada + self.update_service = update_service() + + # Busca e retorna o grupo de modelo de texto desejado + return { + 'message': 'Grupo de modelo de texto atualizado com sucesso', + 'data': self.update_service.execute(tb_txmodelogrupo_id, txmodelogrupo_schema) + } + + # Exclui um grupo de modelo de texto + def delete(self, txmodelogrupo_schema: GTbTxmodelogrupoIdSchema): + + # Importação da classe desejada + delete_service = self.dynamic_import.service('g_tb_txmodelogrupo_delete_service', 'DeleteService') + + # Instância da classe desejada + self.delete_service = delete_service() + + # Busca e retorna o grupo de modelo de texto desejado + return { + 'message': 'Grupo de modelo de texto removido com sucesso', + 'data': self.delete_service.execute(txmodelogrupo_schema) + } \ No newline at end of file diff --git a/packages/v1/administrativo/endpoints/g_tb_txmodelogrupo_endpoint.py b/packages/v1/administrativo/endpoints/g_tb_txmodelogrupo_endpoint.py new file mode 100644 index 0000000..235d7ac --- /dev/null +++ b/packages/v1/administrativo/endpoints/g_tb_txmodelogrupo_endpoint.py @@ -0,0 +1,78 @@ +from typing import Optional +from fastapi import APIRouter, Body, Depends, status +from actions.jwt.get_current_user import get_current_user +from packages.v1.administrativo.schemas.g_tb_txmodelogrupo_schema import ( + GTbTxmodelogrupoSchema, + GTbTxmodelogrupoSaveSchema, + GTbTxmodelogrupoUpdateSchema, + GTbTxmodelogrupoDescricaoSchema, + GTbTxmodelogrupoIdSchema +) +from packages.v1.administrativo.controllers.g_tb_txmodelogrupo_controller import GTbTxmodelogrupoController + +router = APIRouter() + +g_tb_txmodelogrupo_controller = GTbTxmodelogrupoController() + +@router.get( + '/', + status_code=status.HTTP_200_OK, + summary='Lista todos os grupos de modelo de texto cadastrados', + response_description='Lista todos os grupos de modelo de texto cadastrados' +) +async def index(current_user: dict = Depends(get_current_user)): + response = g_tb_txmodelogrupo_controller.index() + return response + +@router.get( + '/descricao', + status_code=status.HTTP_200_OK, + summary='Busca um grupo de modelo de texto pela descrição', + response_description='Busca um grupo de modelo de texto pela descrição' +) +async def get_by_descricao(descricao: str, current_user: dict = Depends(get_current_user)): + txmodelogrupo_schema = GTbTxmodelogrupoDescricaoSchema(descricao=descricao) + response = g_tb_txmodelogrupo_controller.get_by_descricao(txmodelogrupo_schema) + return response + +@router.get( + '/{tb_txmodelogrupo_id}', + status_code=status.HTTP_200_OK, + summary='Busca um grupo de modelo de texto pelo ID', + response_description='Busca um grupo de modelo de texto pelo ID' +) +async def show(tb_txmodelogrupo_id: int, current_user: dict = Depends(get_current_user)): + txmodelogrupo_schema = GTbTxmodelogrupoIdSchema(tb_txmodelogrupo_id=tb_txmodelogrupo_id) + response = g_tb_txmodelogrupo_controller.show(txmodelogrupo_schema) + return response + +@router.post( + '/', + status_code=status.HTTP_200_OK, + summary='Cadastra um novo grupo de modelo de texto', + response_description='Cadastra um novo grupo de modelo de texto' +) +async def save(txmodelogrupo_schema: GTbTxmodelogrupoSaveSchema, current_user: dict = Depends(get_current_user)): + response = g_tb_txmodelogrupo_controller.save(txmodelogrupo_schema) + return response + +@router.put( + '/{tb_txmodelogrupo_id}', + status_code=status.HTTP_200_OK, + summary='Atualiza um grupo de modelo de texto', + response_description='Atualiza um grupo de modelo de texto' +) +async def update(tb_txmodelogrupo_id: int, txmodelogrupo_schema: GTbTxmodelogrupoUpdateSchema, current_user: dict = Depends(get_current_user)): + response = g_tb_txmodelogrupo_controller.update(tb_txmodelogrupo_id, txmodelogrupo_schema) + return response + +@router.delete( + '/{tb_txmodelogrupo_id}', + status_code=status.HTTP_200_OK, + summary='Remove um grupo de modelo de texto', + response_description='Remove um grupo de modelo de texto' +) +async def delete(tb_txmodelogrupo_id: int, current_user: dict = Depends(get_current_user)): + txmodelogrupo_schema = GTbTxmodelogrupoIdSchema(tb_txmodelogrupo_id=tb_txmodelogrupo_id) + response = g_tb_txmodelogrupo_controller.delete(txmodelogrupo_schema) + return response \ No newline at end of file diff --git a/packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_delete_repository.py b/packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_delete_repository.py new file mode 100644 index 0000000..3da883d --- /dev/null +++ b/packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_delete_repository.py @@ -0,0 +1,44 @@ +from packages.v1.administrativo.schemas.g_tb_txmodelogrupo_schema import GTbTxmodelogrupoIdSchema +from abstracts.repository import BaseRepository +from fastapi import HTTPException, status + + +class DeleteRepository(BaseRepository): + + def execute(self, txmodelogrupo_schema: GTbTxmodelogrupoIdSchema): + """ + Executa a exclusão de um registro na tabela G_TB_TXMODELOGRUPO. + + Args: + txmodelogrupo_schema (GTbTxModeloGrupoIdSchema): O schema com o ID a ser excluído. + + Returns: + O resultado da operação de exclusão. + + Raises: + HTTPException: Se ocorrer um erro durante a exclusão. + """ + try: + # Montagem do SQL para exclusão + sql = """ + DELETE FROM G_TB_TXMODELOGRUPO + WHERE TB_TXMODELOGRUPO_ID = :tb_txmodelogrupo_id + """ + + # Preenchimento de parâmetros + params = { + "tb_txmodelogrupo_id": txmodelogrupo_schema.tb_txmodelogrupo_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 modelo de grupo: {e}" + ) \ No newline at end of file diff --git a/packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_get_by_descricao_repository.py b/packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_get_by_descricao_repository.py new file mode 100644 index 0000000..a03753e --- /dev/null +++ b/packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_get_by_descricao_repository.py @@ -0,0 +1,17 @@ +from abstracts.repository import BaseRepository +from packages.v1.administrativo.schemas.g_tb_txmodelogrupo_schema import GTbTxmodelogrupoDescricaoSchema + +class GetByDescricaoRepository(BaseRepository): + + def execute(self, txmodelogrupo_schema: GTbTxmodelogrupoDescricaoSchema): + + # Montagem do sql + sql = """ SELECT * FROM G_TB_TXMODELOGRUPO WHERE DESCRICAO = :descricao """ + + # Preenchimento de parâmetros + params = { + 'descricao': txmodelogrupo_schema.descricao + } + + # Execução do sql + return self.fetch_one(sql, params) \ No newline at end of file diff --git a/packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_index_repository.py b/packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_index_repository.py new file mode 100644 index 0000000..78852e9 --- /dev/null +++ b/packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_index_repository.py @@ -0,0 +1,37 @@ +from abstracts.repository import BaseRepository +from fastapi import HTTPException, status + +class IndexRepository(BaseRepository): + """ + Repositório responsável por buscar todos os registros da tabela G_TB_TXMODELOGRUPO. + """ + + def execute(self): + """ + Executa a operação de listagem de todos os registros na tabela G_TB_TXMODELOGRUPO. + + Returns: + list: Uma lista de dicionários representando os registros encontrados. + """ + try: + # Montagem do SQL para buscar todos os registros da tabela G_TB_TXMODELOGRUPO + sql = """ + SELECT + TB_TXMODELOGRUPO_ID, + DESCRICAO, + SITUACAO, + SISTEMA_ID + FROM + G_TB_TXMODELOGRUPO + """ + + # Execução do SQL e retorno de todos os resultados + response = self.fetch_all(sql) + return response + + except Exception as e: + # Em caso de erro, lança uma exceção HTTP detalhando o problema + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail=f"Erro ao buscar todos os registros de G_TB_TXMODELOGRUPO: {e}" + ) \ No newline at end of file diff --git a/packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_save_repository.py b/packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_save_repository.py new file mode 100644 index 0000000..85dd771 --- /dev/null +++ b/packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_save_repository.py @@ -0,0 +1,41 @@ +from fastapi import HTTPException, status +from abstracts.repository import BaseRepository +from packages.v1.administrativo.schemas.g_tb_txmodelogrupo_schema import GTbTxmodelogrupoSaveSchema + + +class SaveRepository(BaseRepository): + + def execute(self, txmodelogrupo_schema: GTbTxmodelogrupoSaveSchema): + try: + # Montagem do SQL + sql = """ + INSERT INTO G_TB_TXMODELOGRUPO ( + TB_TXMODELOGRUPO_ID, + DESCRICAO, + SITUACAO, + SISTEMA_ID + ) VALUES ( + :tb_txmodelogrupo_id, + :descricao, + :situacao, + :sistema_id + ) RETURNING *; + """ + + # Preenchimento de parâmetros + params = { + 'tb_txmodelogrupo_id': txmodelogrupo_schema.tb_txmodelogrupo_id, + 'descricao': txmodelogrupo_schema.descricao, + 'situacao': txmodelogrupo_schema.situacao, + 'sistema_id': txmodelogrupo_schema.sistema_id + } + + # Execução do SQL + return self.run_and_return(sql, params) + + except Exception as e: + # Informa que houve uma falha ao salvar o registro + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail=f"Erro ao salvar modelo de grupo: {e}" + ) \ No newline at end of file diff --git a/packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_show_repository.py b/packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_show_repository.py new file mode 100644 index 0000000..a7ad2b0 --- /dev/null +++ b/packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_show_repository.py @@ -0,0 +1,46 @@ +from fastapi import HTTPException, status +from abstracts.repository import BaseRepository +from packages.v1.administrativo.schemas.g_tb_txmodelogrupo_schema import GTbTxmodelogrupoIdSchema + + +class ShowRepository(BaseRepository): + + def execute(self, txmodelogrupo_schema: GTbTxmodelogrupoIdSchema): + """ + Executa a operação de busca de um registro na tabela G_TB_TXMODELOGRUPO por ID. + + Args: + txmodelogrupo_schema (GTbTxmodelogrupoIdSchema): O esquema com o ID a ser buscado. + + Returns: + Um dicionário representando o registro encontrado ou None. + + Raises: + HTTPException: Se ocorrer um erro durante a execução da consulta. + """ + try: + # Montagem do SQL para buscar o registro pelo ID + sql = """ + SELECT + TB_TXMODELOGRUPO_ID, + DESCRICAO, + SITUACAO, + SISTEMA_ID + FROM G_TB_TXMODELOGRUPO + WHERE TB_TXMODELOGRUPO_ID = :tb_txmodelogrupo_id + """ + + # Preenchimento de parâmetros + params = { + "tb_txmodelogrupo_id": txmodelogrupo_schema.tb_txmodelogrupo_id + } + + # Execução do SQL e retorno do resultado + return self.fetch_one(sql, params) + + except Exception as e: + # Levanta uma exceção HTTP em caso de erro + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail=f"Erro ao buscar registro em G_TB_TXMODELOGRUPO: {e}" + ) \ No newline at end of file diff --git a/packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_update_repository.py b/packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_update_repository.py new file mode 100644 index 0000000..5c7952b --- /dev/null +++ b/packages/v1/administrativo/repositories/g_tb_txmodelogrupo/g_tb_txmodelogrupo_update_repository.py @@ -0,0 +1,50 @@ +from abstracts.repository import BaseRepository +from packages.v1.administrativo.schemas.g_tb_txmodelogrupo_schema import GTbTxmodelogrupoUpdateSchema +from fastapi import HTTPException, status + +class UpdateRepository(BaseRepository): + + def execute(self, tb_txmodelogrupo_id: int, txmodelogrupo_schema: GTbTxmodelogrupoUpdateSchema): + try: + updates = [] + params = {} + + if txmodelogrupo_schema.descricao is not None: + updates.append("DESCRICAO = :descricao") + params["descricao"] = txmodelogrupo_schema.descricao + + if txmodelogrupo_schema.situacao is not None: + updates.append("SITUACAO = :situacao") + params["situacao"] = txmodelogrupo_schema.situacao + + if txmodelogrupo_schema.sistema_id is not None: + updates.append("SISTEMA_ID = :sistema_id") + params["sistema_id"] = txmodelogrupo_schema.sistema_id + + if not updates: + return False + + params["tb_txmodelogrupo_id"] = tb_txmodelogrupo_id + sql = f"UPDATE G_TB_TXMODELOGRUPO SET {', '.join(updates)} WHERE tb_txmodelogrupo_id = :tb_txmodelogrupo_id RETURNING *;" + + # Executa a query + result = self.run_and_return(sql, params) + + if not result or not hasattr(result, 'tb_txmodelogrupo_id') or result.tb_txmodelogrupo_id is None: + # Informa que não existe o registro a ser modificado + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail='Nenhum registro de modelo de grupo localizado para esta solicitação' + ) + + # Verifica o resultado da execução + if result: + # Se houver um resultado, a atualização foi bem-sucedida + return result + + except Exception as e: + # Informa que houve uma falha na atualização + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail=f"Erro ao atualizar modelo de grupo: {e}" + ) \ No newline at end of file diff --git a/packages/v1/administrativo/schemas/g_tb_txmodelogrupo_schema.py b/packages/v1/administrativo/schemas/g_tb_txmodelogrupo_schema.py new file mode 100644 index 0000000..745b9f9 --- /dev/null +++ b/packages/v1/administrativo/schemas/g_tb_txmodelogrupo_schema.py @@ -0,0 +1,101 @@ +from pydantic import BaseModel, field_validator, model_validator +from fastapi import HTTPException, status +from typing import Optional + +# Funções para sanitização de entradas (evitar XSS, SQLi etc.) +from actions.validations.text import Text + +# ---------------------------------------------------- +# Schema base para G_TB_TXMODELOGRUPO +# ---------------------------------------------------- +class GTbTxmodelogrupoSchema(BaseModel): + tb_txmodelogrupo_id: int # NUMERIC(10,2) + descricao: Optional[str] = None + situacao: Optional[str] = None + sistema_id: Optional[int] = None # NUMERIC(10,2) + + class Config: + from_attributes = True + +# ---------------------------------------------------- +# Schema para criação de novo registro (POST) para G_TB_TXMODELOGRUPO +# ---------------------------------------------------- +class GTbTxmodelogrupoSaveSchema(BaseModel): + tb_txmodelogrupo_id: Optional[int] = None # NUMERIC(10,2) + descricao: str + situacao: Optional[str] = None + sistema_id: Optional[int] = None # NUMERIC(10,2) + + @field_validator('descricao') + def validate_descricao(cls, v): + if not v or len(v.strip()) == 0: + raise ValueError("A descrição é obrigatória.") + return Text.sanitize_input(v) + + @model_validator(mode='after') + def validate_all_fields(self): + errors = [] + if not self.descricao or len(self.descricao.strip()) == 0: + errors.append({'input': 'descricao', 'message': 'A descrição é obrigatória.'}) + + # Validação específica para TB_TXMODELOGRUPO_ID se não for fornecido e for obrigatório para criação + # Se TB_TXMODELOGRUPO_ID é gerado pelo banco, esta validação pode ser removida ou ajustada + if self.tb_txmodelogrupo_id is None: + # Assumindo que TB_TXMODELOGRUPO_ID é gerado pelo DB, caso contrário, descomente e ajuste: + # errors.append({'input': 'tb_txmodelogrupo_id', 'message': 'O ID do modelo de grupo é obrigatório.'}) + pass + + if errors: + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail=errors + ) + return self + +# ---------------------------------------------------- +# Schema para atualização de registro (PUT) para G_TB_TXMODELOGRUPO +# ---------------------------------------------------- +class GTbTxmodelogrupoUpdateSchema(BaseModel): + descricao: Optional[str] = None + situacao: Optional[str] = None + sistema_id: Optional[int] = None # NUMERIC(10,2) + + @field_validator('descricao') + def validate_descricao_field(cls, v): + # Permite que a descrição seja None para atualizações parciais + if v is not None: + return Text.sanitize_input(v) + return v + +# ---------------------------------------------------- +# Schema para localizar um registro específico pelo ID (GET, DELETE) para G_TB_TXMODELOGRUPO +# ---------------------------------------------------- +class GTbTxmodelogrupoIdSchema(BaseModel): + # Campos utilizados + tb_txmodelogrupo_id: int # NUMERIC(10,2) + + @field_validator('tb_txmodelogrupo_id') + def validate_id(cls, v): + if v is None: + raise ValueError("O ID do modelo de grupo é obrigatório.") + # Pode adicionar validação de formato ou valor se necessário + return v + +# ---------------------------------------------------- +# Schema para localizar um registro pela descrição (GET) para G_TB_TXMODELOGRUPO +# ---------------------------------------------------- +class GTbTxmodelogrupoDescricaoSchema(BaseModel): + # Campos utilizados + descricao: str + + @field_validator('descricao') + def validar_e_sanitizar_descricao(cls, v): + if not v: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail='Informe a descrição' + ) + return Text.sanitize_input(v) + + class Config: + from_attributes = True \ No newline at end of file diff --git a/packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_delete_service.py b/packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_delete_service.py new file mode 100644 index 0000000..e6f615e --- /dev/null +++ b/packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_delete_service.py @@ -0,0 +1,26 @@ +from packages.v1.administrativo.schemas.g_tb_txmodelogrupo_schema import GTbTxmodelogrupoIdSchema +from packages.v1.administrativo.actions.g_tb_txmodelogrupo.g_tb_txmodelogrupo_delete_action import DeleteAction + +class DeleteService: + """ + Serviço responsável por encapsular a lógica de negócio para a exclusão de um registro na tabela G_TB_TXMODELOGRUPO. + """ + + def execute(self, txmodelogrupo_schema: GTbTxmodelogrupoIdSchema): + """ + Executa a lógica de negócio para a exclusão de um registro na tabela G_TB_TXMODELOGRUPO. + + Args: + txmodelogrupo_schema (GTbTxmodelogrupoIdSchema): O schema com o ID a ser excluído. + + Returns: + O resultado da operação de exclusão. + """ + # Instanciamento de ação + delete_action = DeleteAction() + + # Executa a ação em questão + data = delete_action.execute(txmodelogrupo_schema) + + # Retorno da informação + return data \ No newline at end of file diff --git a/packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_get_by_descricao_service.py b/packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_get_by_descricao_service.py new file mode 100644 index 0000000..66c5af3 --- /dev/null +++ b/packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_get_by_descricao_service.py @@ -0,0 +1,40 @@ +from fastapi import HTTPException, status +from packages.v1.administrativo.schemas.g_tb_txmodelogrupo_schema import GTbTxmodelogrupoDescricaoSchema +from packages.v1.administrativo.actions.g_tb_txmodelogrupo.g_tb_txmodelogrupo_get_by_descricao_action import GetByDescricaoAction + +class GetByDescricaoService: + """ + Serviço responsável por encapsular a lógica de negócio para a exibição de um registro na tabela + G_TB_TXMODELOGRUPO pela descrição. + """ + + def execute(self, txmodelogrupo_schema: GTbTxmodelogrupoDescricaoSchema, messageValidate: bool): + """ + Executa a lógica de negócio para a exibição de um registro na tabela G_TB_TXMODELOGRUPO pela descrição. + + Args: + txmodelogrupo_schema (GTbTxmodelogrupoDescricaoSchema): O esquema com a descrição a ser buscada. + messageValidate (bool): Indica se a validação de mensagem deve ser realizada. + + Returns: + dict: O registro encontrado ou None. + + Raises: + HTTPException: Se o registro não for encontrado e messageValidate for True. + """ + # Instanciamento de ação + get_by_descricao_action = GetByDescricaoAction() + + # Executa a ação em questão + data = get_by_descricao_action.execute(txmodelogrupo_schema) + + if messageValidate: + if not data: + # Retorna uma exceção se o registro não for encontrado + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail='Não foi possível localizar o registro' + ) + + # Retorno da informação + return data \ No newline at end of file diff --git a/packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_index_service.py b/packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_index_service.py new file mode 100644 index 0000000..79d3edb --- /dev/null +++ b/packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_index_service.py @@ -0,0 +1,34 @@ +from fastapi import HTTPException, status +from packages.v1.administrativo.schemas.g_tb_txmodelogrupo_schema import GTbTxmodelogrupoSchema +from packages.v1.administrativo.actions.g_tb_txmodelogrupo.g_tb_txmodelogrupo_index_action import IndexAction + + +class IndexService: + """ + Serviço responsável por encapsular a lógica de negócio para a listagem de todos os registros na tabela + G_TB_TXMODELOGRUPO. + """ + + def execute(self): + """ + Executa a lógica de negócio para a listagem de todos os registros. + + Returns: + A lista de todos os registros encontrados. + """ + # Instanciamento de ação + index_action = IndexAction() + + # Executa a busca de todas as ações + data = index_action.execute() + + # Verifica se foi localizado registros + if not data: + # Retorna uma exceção + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail='Não foi possível localizar os grupos de modelo de texto' + ) + + # Retorna as informações localizadas + return data \ No newline at end of file diff --git a/packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_save_service.py b/packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_save_service.py new file mode 100644 index 0000000..9fd7cd5 --- /dev/null +++ b/packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_save_service.py @@ -0,0 +1,70 @@ +from actions.dynamic_import.dynamic_import import DynamicImport +from packages.v1.sequencia.schemas.g_sequencia import GSequenciaSchema +from packages.v1.sequencia.services.g_sequencia.generate_service import GenerateService +from packages.v1.administrativo.schemas.g_tb_txmodelogrupo_schema import GTbTxmodelogrupoSaveSchema, GTbTxmodelogrupoDescricaoSchema +from packages.v1.administrativo.actions.g_tb_txmodelogrupo.g_tb_txmodelogrupo_save_action import SaveAction +from fastapi import HTTPException, status + +class GTbTxmodelogrupoSaveService: + + 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("g_tb_txmodelogrupo") + pass + + # Cadastra o novo modelo de grupo serviço + def execute(self, txmodelogrupo_schema: GTbTxmodelogrupoSaveSchema): + + # Armazena possíveis erros + errors = [] + + # Verifica se a descrição já está sendo utilizada + # Importação de service de get_by_descricao + get_by_descricao_service = self.dynamic_import.service("g_tb_txmodelogrupo_get_by_descricao_service", "GetByDescricaoService") + + # Instanciamento da service + self.get_by_descricao_service = get_by_descricao_service() + + # Verifica se a descrição já está sendo utilizada + self.response = self.get_by_descricao_service.execute(GTbTxmodelogrupoDescricaoSchema(descricao=txmodelogrupo_schema.descricao), False) + + # Se houver retorno significa que a descrição já está sendo utilizada + if self.response: + errors.append({'input': 'descricao', 'message': 'A descrição informada já está sendo utilizada.'}) + + # Se houver erros, informo + if errors: + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail=errors + ) + + # Verifica se precisa gerar o id de sequência + if not txmodelogrupo_schema.tb_txmodelogrupo_id: + + # Crio um objeto de sequencia + sequencia_schema = GSequenciaSchema() + + # Define os dados para atualizar a sequência + sequencia_schema.tabela = 'G_TB_TXMODELOGRUPO' + + # Busco a sequência atualizada + generate_service = GenerateService() + + # Busco a sequência atualizada + sequencia = generate_service.execute(sequencia_schema) + + # Atualiza os dados da chave primária + txmodelogrupo_schema.tb_txmodelogrupo_id = sequencia.sequencia + + # Instânciamento de ações + saveAction = SaveAction() + + # Retorna todos os produtos desejados + return saveAction.execute(txmodelogrupo_schema) \ No newline at end of file diff --git a/packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_show_service.py b/packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_show_service.py new file mode 100644 index 0000000..00d192a --- /dev/null +++ b/packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_show_service.py @@ -0,0 +1,26 @@ +from fastapi import HTTPException, status +from packages.v1.administrativo.schemas.g_tb_txmodelogrupo_schema import GTbTxmodelogrupoIdSchema # Assumindo que este schema será criado +from packages.v1.administrativo.actions.g_tb_txmodelogrupo.g_tb_txmodelogrupo_show_action import ShowAction # Assumindo que esta action será criada + +class ShowService: + + def execute(self, txmodelogrupo_schema: GTbTxmodelogrupoIdSchema): + """ + Executa a lógica de negócio para a exibição de um registro na tabela + G_TB_TXMODELOGRUPO pelo ID. + """ + # Instanciamento de ação + show_action = ShowAction() + + # Executa a ação em questão + data = show_action.execute(txmodelogrupo_schema) + + if not data: + # Retorna uma exceção se o registro não for encontrado + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail='Não foi possível localizar o registro do grupo de modelo de texto.' + ) + + # Retorno da informação + return data \ No newline at end of file diff --git a/packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_update_service.py b/packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_update_service.py new file mode 100644 index 0000000..72c040a --- /dev/null +++ b/packages/v1/administrativo/services/g_tb_txmodelogrupo/go/g_tb_txmodelogrupo_update_service.py @@ -0,0 +1,22 @@ +from packages.v1.administrativo.schemas.g_tb_txmodelogrupo_schema import GTbTxmodelogrupoUpdateSchema +from packages.v1.administrativo.actions.g_tb_txmodelogrupo.g_tb_txmodelogrupo_update_action import UpdateAction + +class GTbTxmodelogrupoUpdateService: + + def execute(self, tb_txmodelogrupo_id : int, txmodelogrupo_schema: GTbTxmodelogrupoUpdateSchema): + """ + Executa a lógica de negócio para a atualização de um registro na tabela + G_TB_TXMODELOGRUPO. + + Args: + tb_txmodelogrupo_id (int): O ID do registro a ser atualizado. + txmodelogrupo_schema (GTbTxmodelogrupoUpdateSchema): O schema com os dados atualizados. + + Returns: + O resultado da operação de atualização. + """ + # Instanciamento de ação + updateAction = UpdateAction() + + # Retorna o resultado da execução da ação de atualização + return updateAction.execute(tb_txmodelogrupo_id, txmodelogrupo_schema) \ No newline at end of file diff --git a/packages/v1/api.py b/packages/v1/api.py index 497a61c..99a48f6 100644 --- a/packages/v1/api.py +++ b/packages/v1/api.py @@ -4,6 +4,7 @@ from fastapi import APIRouter # Importa os módulos de rotas específicos from packages.v1.administrativo.endpoints import c_caixa_item from packages.v1.administrativo.endpoints import g_usuario +from packages.v1.administrativo.endpoints import g_tb_txmodelogrupo_endpoint # Cria uma instância do APIRouter que vai agregar todas as rotas da API api_router = APIRouter() @@ -17,3 +18,8 @@ api_router.include_router( api_router.include_router( g_usuario.router, prefix="/administrativo/usuarios", tags=["Usuário"] ) + +# Inclui as rotas de g_tb_txmodelogrupo +api_router.include_router( + g_tb_txmodelogrupo_endpoint.router, prefix="/administrativo/g_tb_txmodelogrupo", tags=["Modelo grupo"] +) \ No newline at end of file