diff --git a/packages/v1/servicos/balcao/actions/t_servico_pedido/t_servico_pedido_save_situacao_action.py b/packages/v1/servicos/balcao/actions/t_servico_pedido/t_servico_pedido_save_situacao_action.py new file mode 100644 index 0000000..932e44d --- /dev/null +++ b/packages/v1/servicos/balcao/actions/t_servico_pedido/t_servico_pedido_save_situacao_action.py @@ -0,0 +1,42 @@ +from abstracts.action import BaseAction +from packages.v1.servicos.balcao.repositories.t_servico_pedido.t_servico_pedido_save_situacao_repository import ( + TServicoPedidoSaveSituacaoRepository, +) +from packages.v1.servicos.balcao.schemas.t_servico_pedido_schema import ( + TServicoPedidoSaveSituacaoSchema, +) + + +class TServicoPedidoSaveSituacaoAction(BaseAction): + """ + Serviço responsável por encapsular a lógica de negócio para a operação + de salvamento de um novo registro na tabela T_SERVICO_PEDIDO. + """ + + def execute(self, data: TServicoPedidoSaveSituacaoSchema): + """ + Executa a operação de salvamento. + + Args: + t_servico_pedido_schema (TServicoPedidoSchema): + O esquema com os dados a serem persistidos. + + Returns: + O resultado da operação de salvamento. + """ + # ---------------------------------------------------- + # Instanciamento do repositório + # ---------------------------------------------------- + t_servico_pedido_save_situacao_repository = ( + TServicoPedidoSaveSituacaoRepository() + ) + + # ---------------------------------------------------- + # Execução do repositório + # ---------------------------------------------------- + response = t_servico_pedido_save_situacao_repository.execute(data) + + # ---------------------------------------------------- + # Retorno da informação + # ---------------------------------------------------- + return response diff --git a/packages/v1/servicos/balcao/controllers/t_servico_pedido_controller.py b/packages/v1/servicos/balcao/controllers/t_servico_pedido_controller.py index d327a21..8c48dc5 100644 --- a/packages/v1/servicos/balcao/controllers/t_servico_pedido_controller.py +++ b/packages/v1/servicos/balcao/controllers/t_servico_pedido_controller.py @@ -1,9 +1,13 @@ from actions.dynamic_import.dynamic_import import DynamicImport from packages.v1.servicos.balcao.schemas.t_servico_pedido_schema import ( TServicoPedidoSaveSchema, + TServicoPedidoSituacaoSchema, TServicoPedidoUpdateSchema, TServicoPedidoIdSchema, ) +from packages.v1.servicos.balcao.services.t_servico_pedido.go.t_servico_pedido_cancelar_service import ( + TServicoPedidoCancelarService, +) class TServicoPedidoController: @@ -74,6 +78,46 @@ class TServicoPedidoController: "data": self.save_service.execute(t_servico_pedido_save_schema), } + # ---------------------------------------------------- + # Cancela um pedido + # ---------------------------------------------------- + def cancelar(self, data: TServicoPedidoSituacaoSchema): + + # Importação da classe desejada + cancelar_service = self.dynamic_import.service( + "t_servico_pedido_cancelar_service", + "TServicoPedidoCancelarService", + ) + + # Instância da classe service + self.cancelar_service = cancelar_service() + + # Execução do salvamento + return { + "message": "Registro de T_SERVICO_ITEMPEDIDO cancelado com sucesso.", + "data": self.cancelar_service.execute(data), + } + + # ---------------------------------------------------- + # Ativa um pedido + # ---------------------------------------------------- + def ativar(self, data: TServicoPedidoSituacaoSchema): + + # Importação da classe desejada + ativar_service = self.dynamic_import.service( + "t_servico_pedido_ativar_service", + "TServicoPedidoAtivarService", + ) + + # Instância da classe service + self.ativar_service = ativar_service() + + # Execução do salvamento + return { + "message": "Registro de T_SERVICO_ITEMPEDIDO ativado com sucesso.", + "data": self.ativar_service.execute(data), + } + # ---------------------------------------------------- # Atualiza um registro existente de T_SERVICO_PEDIDO # ---------------------------------------------------- diff --git a/packages/v1/servicos/balcao/endpoints/t_servico_pedido_endpoint.py b/packages/v1/servicos/balcao/endpoints/t_servico_pedido_endpoint.py index d721260..a7a7f6a 100644 --- a/packages/v1/servicos/balcao/endpoints/t_servico_pedido_endpoint.py +++ b/packages/v1/servicos/balcao/endpoints/t_servico_pedido_endpoint.py @@ -7,6 +7,7 @@ from packages.v1.servicos.balcao.controllers.t_servico_pedido_controller import ) from packages.v1.servicos.balcao.schemas.t_servico_pedido_schema import ( TServicoPedidoSaveSchema, + TServicoPedidoSituacaoSchema, TServicoPedidoUpdateSchema, TServicoPedidoIdSchema, ) @@ -121,6 +122,54 @@ async def update( return response +@router.put( + "/{servico_pedido_id}/cancelar", + status_code=status.HTTP_200_OK, + summary="Cancela um T_SERVICO_PEDIDO", + response_description="Cancelamento realizado com sucesso", +) +async def cancelar( + servico_pedido_id: int, + current_user: dict = Depends(dependency=get_current_user), +): + """ + Cria um novo registro na tabela T_SERVICO_PEDIDO. + """ + current_user = dict_to_namespace(current_user) + + response = t_servico_pedido_controller.cancelar( + TServicoPedidoSituacaoSchema( + servico_pedido_id=servico_pedido_id, + usuario_id=current_user.data.usuario_id, + ) + ) + return response + + +@router.put( + "/{servico_pedido_id}/ativar", + status_code=status.HTTP_200_OK, + summary="Ativa um T_SERVICO_PEDIDO", + response_description="Ativação realizado com sucesso", +) +async def ativar( + servico_pedido_id: int, + current_user: dict = Depends(dependency=get_current_user), +): + """ + Cria um novo registro na tabela T_SERVICO_PEDIDO. + """ + current_user = dict_to_namespace(current_user) + + response = t_servico_pedido_controller.ativar( + TServicoPedidoSituacaoSchema( + servico_pedido_id=servico_pedido_id, + usuario_id=current_user.data.usuario_id, + ) + ) + return response + + # ---------------------------------------------------- # Exclui um registro de T_SERVICO_PEDIDO # ---------------------------------------------------- diff --git a/packages/v1/servicos/balcao/repositories/t_servico_pedido/t_servico_pedido_save_situacao_repository.py b/packages/v1/servicos/balcao/repositories/t_servico_pedido/t_servico_pedido_save_situacao_repository.py new file mode 100644 index 0000000..2baeff5 --- /dev/null +++ b/packages/v1/servicos/balcao/repositories/t_servico_pedido/t_servico_pedido_save_situacao_repository.py @@ -0,0 +1,57 @@ +from fastapi import HTTPException, status +from abstracts.repository import BaseRepository +from packages.v1.servicos.balcao.schemas.t_servico_pedido_schema import ( + TServicoPedidoSituacaoSchema, +) + + +class TServicoPedidoSaveSituacaoRepository(BaseRepository): + """ + Repositório responsável pela operação de salvamento de um novo registro + na tabela T_SERVICO_ITEMPEDIDO. + """ + + def execute(self, data: TServicoPedidoSituacaoSchema): + """ + Executa a operação de salvamento no banco de dados. + + Args: + t_servico_itempedido_save_schema (TServicoItemPedidoSchema): 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 dinâmico + # ---------------------------------------------------- + sql = """ UPDATE T_SERVICO_PEDIDO TSP + SET TSP.SITUACAO = :situacao + WHERE + TSP.SERVICO_PEDIDO_ID = :servico_pedido_id + RETURNING *""" + + # ---------------------------------------------------- + # Preenchimento dos parâmetros + # ---------------------------------------------------- + params = data.model_dump( + exclude_unset=True, + ) + + # ---------------------------------------------------- + # Execução do SQL e retorno do registro + # ---------------------------------------------------- + return self.run_and_return(sql, params) + + except Exception as e: + # ---------------------------------------------------- + # Tratamento de erros e lançamento de exceção HTTP + # ---------------------------------------------------- + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail=f"Erro ao salvar registro em T_SERVICO_ITEMPEDIDO: {e}", + ) diff --git a/packages/v1/servicos/balcao/schemas/t_servico_itempedido_schema.py b/packages/v1/servicos/balcao/schemas/t_servico_itempedido_schema.py index 6fe7293..5445dea 100644 --- a/packages/v1/servicos/balcao/schemas/t_servico_itempedido_schema.py +++ b/packages/v1/servicos/balcao/schemas/t_servico_itempedido_schema.py @@ -100,12 +100,6 @@ class TServicoItemPedidoSituacaoSchema(BaseModel): from_attributes = True -class TServicoItemPedidoSaveSchema(TServicoItemPedidoSchema): - - class Config: - from_attributes = True - - class TServicoItemPedidoSaveSituacaoSchema(BaseModel): servico_itempedido_id: int = None @@ -115,6 +109,12 @@ class TServicoItemPedidoSaveSituacaoSchema(BaseModel): from_attributes = True +class TServicoItemPedidoSaveSchema(TServicoItemPedidoSchema): + + class Config: + from_attributes = True + + class TServicoItemPedidoUpdateSchema(TServicoItemPedidoSchema): class Config: diff --git a/packages/v1/servicos/balcao/schemas/t_servico_pedido_schema.py b/packages/v1/servicos/balcao/schemas/t_servico_pedido_schema.py index 419d97e..c02b340 100644 --- a/packages/v1/servicos/balcao/schemas/t_servico_pedido_schema.py +++ b/packages/v1/servicos/balcao/schemas/t_servico_pedido_schema.py @@ -1,5 +1,5 @@ from pydantic import BaseModel -from typing import Annotated, Optional, List +from typing import Annotated, Optional from decimal import Decimal from datetime import datetime @@ -7,9 +7,6 @@ from pydantic.config import ConfigDict from pydantic.functional_validators import BeforeValidator from packages.v1.parametros.schemas.g_config_schema import GConfigNomeSchema -from packages.v1.servicos.balcao.schemas.t_servico_itempedido_schema import ( - TServicoItemPedidoSchema, -) # ---------- Utilidades ---------- @@ -30,11 +27,8 @@ Money = Annotated[Optional[Decimal], BeforeValidator(_to_decimal)] Fk = ZeroNoneInt # só para semântica -# ---------------------------------------------------- -# Schema base - representa a tabela T_SERVICO_PEDIDO -# ---------------------------------------------------- class TServicoPedidoSchema(BaseModel): - servico_pedido_id: Decimal + servico_pedido_id: Optional[Decimal] = None valor_pedido: Optional[Decimal] = None valor_pago: Optional[Decimal] = None usuario_id: Optional[Decimal] = None @@ -49,68 +43,39 @@ class TServicoPedidoSchema(BaseModel): chave_importacao: Optional[Decimal] = None cpfcnpj_apresentante: Optional[str] = None - class Config: - from_attributes = True + model_config = ConfigDict(from_attributes=True) -# ---------------------------------------------------- -# Schema para localizar um registro pelo ID (GET /{id}) -# ---------------------------------------------------- class TServicoPedidoIdSchema(BaseModel): servico_pedido_id: Decimal - class Config: - from_attributes = True + model_config = ConfigDict(from_attributes=True) -# ---------------------------------------------------- -# Schema para criação (POST) -# - normalmente sem o ID (gerado pelo banco) -# ---------------------------------------------------- -class TServicoPedidoSaveSchema(BaseModel): - servico_pedido_id: Optional[Decimal] = None - valor_pedido: Optional[Decimal] = None - valor_pago: Optional[Decimal] = None - usuario_id: Optional[Decimal] = None - data_pedido: Optional[datetime] = None - mensalista_livrocaixa_id: Fk = None - observacao: Optional[str] = None - escrevente_id: Optional[Decimal] = None - situacao: Optional[str] = None - estornado: Optional[str] = None - apresentante: Optional[str] = None - nfse_id: Fk = None - chave_importacao: Optional[Decimal] = None - cpfcnpj_apresentante: Optional[str] = None - itens: Optional[List[TServicoItemPedidoSchema]] = None +class TServicoPedidoSaveSchema(TServicoPedidoSchema): - class Config: - from_attributes = True + model_config = ConfigDict(from_attributes=True) -# ---------------------------------------------------- -# Schema para atualização (PUT) -# - inclui o ID + campos opcionais para alterar -# ---------------------------------------------------- -class TServicoPedidoUpdateSchema(BaseModel): - servico_pedido_id: Optional[Decimal] = None - valor_pedido: Optional[Decimal] = None - valor_pago: Optional[Decimal] = None - usuario_id: Optional[Decimal] = None - data_pedido: Optional[datetime] = None - mensalista_livrocaixa_id: Fk = None - observacao: Optional[str] = None - escrevente_id: Optional[Decimal] = None - situacao: Optional[str] = None - estornado: Optional[str] = None - apresentante: Optional[str] = None - nfse_id: Fk = None - chave_importacao: Optional[Decimal] = None - cpfcnpj_apresentante: Optional[str] = None - itens: Optional[List[TServicoItemPedidoSchema]] = None +class TServicoPedidoSituacaoSchema(BaseModel): - class Config: - from_attributes = True + servico_pedido_id: int = None + usuario_id: Optional[int] = None + + model_config = ConfigDict(from_attributes=True) + + +class TServicoPedidoSaveSituacaoSchema(BaseModel): + + servico_pedido_id: int = None + situacao: str = None + + model_config = ConfigDict(from_attributes=True) + + +class TServicoPedidoUpdateSchema(TServicoPedidoSchema): + + model_config = ConfigDict(from_attributes=True) class TServicoPedidoLoadParams(GConfigNomeSchema): diff --git a/packages/v1/servicos/balcao/services/t_servico_pedido/go/t_servico_pedido_ativar_service.py b/packages/v1/servicos/balcao/services/t_servico_pedido/go/t_servico_pedido_ativar_service.py new file mode 100644 index 0000000..1b76d7b --- /dev/null +++ b/packages/v1/servicos/balcao/services/t_servico_pedido/go/t_servico_pedido_ativar_service.py @@ -0,0 +1,47 @@ +from packages.v1.administrativo.schemas.c_caixa_item_schema import CaixaItemSchema +from packages.v1.administrativo.services.c_caixa_item.go.c_caixa_item_save_service import ( + SaveService, +) +from packages.v1.servicos.balcao.actions.t_servico_pedido.t_servico_pedido_save_situacao_action import ( + TServicoPedidoSaveSituacaoAction, +) +from packages.v1.servicos.balcao.schemas.t_servico_pedido_schema import ( + TServicoPedidoSaveSituacaoSchema, + TServicoPedidoSituacaoSchema, +) + + +class TServicoPedidoAtivarService: + + def execute(self, data: TServicoPedidoSituacaoSchema): + + # Instancia corretamente a Action (classe) + save_situacao_action = TServicoPedidoSaveSituacaoAction() + + # Executa o fluxo da action com o schema recebido + response = save_situacao_action.execute( + data=TServicoPedidoSaveSituacaoSchema( + servico_pedido_id=data.servico_pedido_id, situacao="F" + ) + ) + + if response: + + # Controle de pedidos + c_caixa_item_save_service = SaveService() + + # Salva o serviço no caixa + c_caixa_item_save_service.execute( + CaixaItemSchema( + apresentante=response.apresentante, + usuario_servico_id=data.usuario_id, + chave_servico=response.servico_pedido_id, + descricao="Ativação do Pedido", + situacao=3, + tipo_transacao="C", + valor_servico=response.valor_pedido, + valor_pago=response.valor_pago, + ) + ) + + return response diff --git a/packages/v1/servicos/balcao/services/t_servico_pedido/go/t_servico_pedido_cancelar_service.py b/packages/v1/servicos/balcao/services/t_servico_pedido/go/t_servico_pedido_cancelar_service.py new file mode 100644 index 0000000..2279c05 --- /dev/null +++ b/packages/v1/servicos/balcao/services/t_servico_pedido/go/t_servico_pedido_cancelar_service.py @@ -0,0 +1,53 @@ +from packages.v1.administrativo.schemas.c_caixa_item_schema import CaixaItemSchema +from packages.v1.administrativo.schemas.t_servico_tipo_schema import ( + TServicoTipoIdSchema, +) +from packages.v1.administrativo.services.c_caixa_item.go.c_caixa_item_save_service import ( + SaveService, +) +from packages.v1.administrativo.services.t_servico_tipo.go.t_servico_tipo_show_service import ( + ShowService, +) +from packages.v1.servicos.balcao.actions.t_servico_pedido.t_servico_pedido_save_situacao_action import ( + TServicoPedidoSaveSituacaoAction, +) +from packages.v1.servicos.balcao.schemas.t_servico_pedido_schema import ( + TServicoPedidoSaveSituacaoSchema, + TServicoPedidoSituacaoSchema, +) + + +class TServicoPedidoCancelarService: + + def execute(self, data: TServicoPedidoSituacaoSchema): + + # Instancia corretamente a Action (classe) + save_situacao_action = TServicoPedidoSaveSituacaoAction() + + # Executa o fluxo da action com o schema recebido + response = save_situacao_action.execute( + data=TServicoPedidoSaveSituacaoSchema( + servico_pedido_id=data.servico_pedido_id, situacao="C" + ) + ) + + if response: + + # Controle de pedidos + c_caixa_item_save_service = SaveService() + + # Salva o serviço no caixa + c_caixa_item_save_service.execute( + CaixaItemSchema( + apresentante=response.apresentante, + usuario_servico_id=data.usuario_id, + chave_servico=response.servico_pedido_id, + descricao="Cancelamento Pedido", + situacao=3, + tipo_transacao="D", + valor_servico=response.valor_pedido, + valor_pago=response.valor_pago, + ) + ) + + return response