feat(): Ajustes nos detalhes do pedido de Balcão

This commit is contained in:
Keven 2025-12-16 15:06:47 -03:00
parent 25d904b0bb
commit 9b784f8d1a
10 changed files with 79 additions and 89 deletions

View file

@ -1,76 +1,36 @@
from dotenv import dotenv_values, load_dotenv
import os
import json
from types import SimpleNamespace
from typing import Any, Dict
class EnvConfigLoader:
"""
Carrega variáveis de ambiente com um prefixo comum
e permite acessá-las diretamente via ponto, sem agrupar subníveis.
Classe para carregar todas as variáveis de ambiente (.env)
e permitir acesso via atributo (settings.VAR).
"""
def __init__(self, prefix: str):
self.prefix = prefix.upper().strip("_")
self._data = self._load()
# transforma o dicionário em objeto (sem agrupar)
self._object = SimpleNamespace(**self._data)
def __init__(self, env_file: str = ".env"):
# -------------------------------
# Conversão de valores automáticos
# -------------------------------
def _convert_value(self, value: str) -> Any:
value = value.strip()
# Garante que o .env será carregado no ambiente do sistema
load_dotenv(env_file)
# Boolean
if value.lower() in ["true", "false"]:
return value.lower() == "true"
# Lê todas as variáveis (do arquivo + sistema)
self._values = {
**dotenv_values(env_file), # Conteúdo do .env
**os.environ, # Variáveis já existentes no ambiente
}
# Integer
if value.isdigit():
return int(value)
def __getattr__(self, name: str):
"""Permite acessar como settings.VAR"""
# Normaliza o nome para maiúsculo
key = name.upper()
if key in self._values:
return self._values[key]
raise AttributeError(f"A variável '{name}' não existe no .env")
# Float
try:
return float(value)
except ValueError:
pass
def __repr__(self):
"""Exibe todas as variáveis carregadas"""
return f"<Settings {self._values}>"
# JSON (dicts, arrays)
try:
return json.loads(value)
except Exception:
pass
return value
# -------------------------------
# Carrega variáveis do ambiente
# -------------------------------
def _load(self) -> Dict[str, Any]:
prefix_match = f"{self.prefix}_"
data = {}
for key, value in os.environ.items():
if key.startswith(prefix_match):
subkey = key[len(prefix_match) :].lower() # tudo em minúsculo
data[subkey] = self._convert_value(value)
return data
# -------------------------------
# Permite acesso direto via ponto
# -------------------------------
def __getattr__(self, name: str) -> Any:
if hasattr(self._object, name):
return getattr(self._object, name)
raise AttributeError(f"'{self.prefix}' não contém '{name}'")
# -------------------------------
# Acesso via dicionário
# -------------------------------
def __getitem__(self, key: str) -> Any:
return getattr(self._object, key.lower(), None)
def __repr__(self) -> str:
return json.dumps(self._data, indent=2, ensure_ascii=False)
def all(self) -> dict:
"""Retorna todas as variáveis como dicionário"""
return dict(self._values)

View file

@ -11,27 +11,27 @@ class Firebird:
def get_engine(cls) -> Engine:
# Instancia o loader com o prefixo correto
env_database = EnvConfigLoader(prefix="ORIUS_API_FDB")
env_database = EnvConfigLoader(".env")
# Cria a engine apenas uma vez
if cls._engine is None:
# DSN para o SQLAlchemy usando firebird-driver
dsn = (
f"firebird+firebird://{env_database.user}:"
f"{env_database.password}@"
f"{env_database.host}:"
f"{env_database.port}/"
f"{env_database.name}"
f"firebird+firebird://{env_database.ORIUS_API_FDB_USER}:"
f"{env_database.ORIUS_API_FDB_PASSWORD}@"
f"{env_database.ORIUS_API_FDB_HOST}:"
f"{env_database.ORIUS_API_FDB_PORT}/"
f"{env_database.ORIUS_API_FDB_NAME}"
)
# Criação da engine SQLAlchemy
cls._engine = create_engine(
dsn,
connect_args={"charset": env_database.charset},
pool_pre_ping=bool(env_database.pool_pre_ping),
pool_size=env_database.pool_size,
max_overflow=env_database.pool_max_overflow,
connect_args={"charset": env_database.ORIUS_API_FDB_CHARSET},
pool_pre_ping=bool(env_database.ORIUS_API_FDB_POOL_PRE_PING),
pool_size=int(env_database.ORIUS_API_FDB_POOL_SIZE),
max_overflow=int(env_database.ORIUS_API_FDB_POOL_MAX_OVERFLOW),
)
return cls._engine

View file

@ -350,14 +350,14 @@ api_router.include_router(
# Inclui as rotas de g_emolumento periodo
api_router.include_router(
t_servico_pedido_endpoint.router,
prefix="/servicos/balcao/t_servico_pedido",
prefix="/servicos/pedidos/t_servico_pedido",
tags=["Pedido"],
)
# Inclui as rotas de g_emolumento periodo
api_router.include_router(
t_servico_itempedido_endpoint.router,
prefix="/servicos/balcao/t_servico_itempedido",
prefix="/servicos/pedidos/t_servico_itempedido",
tags=["Itens do Pedido"],
)
@ -365,7 +365,7 @@ api_router.include_router(
# Inclui as rotas de g_emolumento periodo
api_router.include_router(
t_pessoa_cartao_endpoint.router,
prefix="/servicos/balcao/t_pessoa_cartao",
prefix="/servicos/pedidos/t_pessoa_cartao",
tags=["Pessoa Cartao"],
)

View file

@ -1,9 +1,9 @@
from packages.v1.servicos.balcao.controllers.t_servico_itempedido_controller import (
TServicoItemPedidoSaveSituacaoSchema,
)
from packages.v1.servicos.balcao.repositories.t_servico_itempedido.t_servico_itempedido_save_situacao_repository import (
TServicoItemPedidoSaveSituacaoRepository,
)
from packages.v1.servicos.balcao.schemas.t_servico_itempedido_schema import (
TServicoItemPedidoSaveSituacaoSchema,
)
class TServicoItemPedidoSaveSituacaoAction:

View file

@ -6,6 +6,9 @@ from packages.v1.servicos.balcao.schemas.t_servico_itempedido_schema import (
TServicoItemPedidoUpdateSchema,
TServicoItemPedidoIdSchema,
)
from packages.v1.servicos.balcao.services.t_servico_itempedido.go.t_servico_itempedido_cancelar_service import (
TServicoItemPedidoCancelarService,
)
class TServicoItemPedidoController:
@ -83,8 +86,7 @@ class TServicoItemPedidoController:
# Importação da classe desejada
cancelar_service = self.dynamic_import.service(
"t_servico_itempedido_cancelar_service",
"TServicoItemPedidoCancelarService",
"t_servico_itempedido_cancelar_service", "TServicoItemPedidoCancelarService"
)
# Instância da classe service

View file

@ -115,6 +115,28 @@ class TServicoItemPedidoSaveSchema(TServicoItemPedidoSchema):
from_attributes = True
class TServicoItemPedidoSaveSchema_(TServicoItemPedidoSchema):
emolumento_id: Optional[Decimal] = None
emolumento_item_id: Optional[Decimal] = None
servico_tipo_id: Optional[Decimal] = None
tipo_item: Optional[str] = None
descricao: Optional[str] = None
tabela: Optional[str] = None
situacao: Optional[str] = None
qtd: Optional[int] = None
valor: Optional[Decimal] = None
emolumento: Optional[Decimal] = None
fundesp: Optional[Decimal] = None
taxa_judiciaria: Optional[Decimal] = None
valor_iss: Optional[Decimal] = None
pessoa_id: Optional[Decimal] = None
index: Optional[int] = None
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
from typing import Annotated, List, Optional
from decimal import Decimal
from datetime import datetime
@ -7,6 +7,9 @@ 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 (
TServicoItemPedidoSaveSchema,
)
# ---------- Utilidades ----------
@ -42,6 +45,7 @@ class TServicoPedidoSchema(BaseModel):
nfse_id: Optional[Decimal] = None
chave_importacao: Optional[Decimal] = None
cpfcnpj_apresentante: Optional[str] = None
itens: Optional[List[TServicoItemPedidoSaveSchema]] = None
model_config = ConfigDict(from_attributes=True)

View file

@ -9,12 +9,14 @@ from packages.v1.servicos.balcao.actions.t_servico_itempedido.t_servico_itempedi
TServicoItemPedidoSaveSituacaoAction,
)
from packages.v1.servicos.balcao.controllers.t_servico_itempedido_controller import (
TServicoItemPedidoSaveSituacaoSchema,
TServicoItemPedidoSituacaoSchema,
)
from packages.v1.administrativo.services.c_caixa_item.go.c_caixa_item_save_service import (
SaveService,
)
from packages.v1.servicos.balcao.schemas.t_servico_itempedido_schema import (
TServicoItemPedidoSaveSituacaoSchema,
)
from packages.v1.servicos.balcao.schemas.t_servico_pedido_schema import (
TServicoPedidoIdSchema,
)

View file

@ -2,19 +2,19 @@ from packages.v1.administrativo.schemas.c_caixa_item_schema import CaixaItemSche
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_itempedido.t_servico_itempedido_save_situacao_action import (
TServicoItemPedidoSaveSituacaoAction,
)
from packages.v1.servicos.balcao.controllers.t_servico_itempedido_controller import (
from packages.v1.servicos.balcao.schemas.t_servico_itempedido_schema import (
TServicoItemPedidoSaveSituacaoSchema,
TServicoItemPedidoSituacaoSchema,
)
from packages.v1.administrativo.services.c_caixa_item.go.c_caixa_item_save_service import (
SaveService,
)
from packages.v1.servicos.balcao.schemas.t_servico_pedido_schema import (
TServicoPedidoIdSchema,
)

View file

@ -85,7 +85,7 @@ class TServicoPedidoSaveService:
for item in t_servico_pedido_save_schema.itens:
# Define o id do item do serviço
item.servico_pedido_id = response_pedido.servico_pedido_id
item.servico_pedido_id = response_pedido["servico_pedido_id"]
# Define o id do item do usuario
item.usuario_id = response_pedido.usuario_id