[MVPTN-126] feat(Pedido): Cria endpoints e recursos para estornar e ativar um pedido

This commit is contained in:
Keven 2025-12-05 16:03:05 -03:00
parent 571e59bfb8
commit 2dc535c0f9
8 changed files with 322 additions and 65 deletions

View file

@ -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

View file

@ -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
# ----------------------------------------------------

View file

@ -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
# ----------------------------------------------------

View file

@ -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}",
)

View file

@ -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:

View file

@ -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):

View file

@ -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

View file

@ -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