Métricas do Painel (GET /stats)
Detalhamento do endpoint GET /stats/ do backend-store: o que cada métrica significa, como é calculada e — ponto que costuma gerar dúvida — por que nenhuma delas usa janela de tempo.
Visão geral
GET /stats/ alimenta o "Painel da Lojinha" (dashboard inicial) do frontend fuji-loja. Como qualquer rota do backend-store, exige autenticação via Keycloak JWT e é sempre filtrado por saas_id (multi-tenant) — nunca agrega dados entre tenants.
A rota (app/api/routes/stats.py) delega o cálculo ao StatsService.obter_dashboard (app/domain/services/stats_service.py), que busca as métricas em paralelo lógico nos repositórios de venda, estoque, produto, categoria e fornecedor, e devolve um StatsOut (app/api/schemas/stats.py).
|
O endpoint retorna |
Janela de tempo
Nenhuma métrica de /stats é filtrada por período. Todos os totais e somas são calculados sobre o histórico completo do tenant, desde o primeiro registro — não existe parâmetro de data na rota nem cláusula WHERE por intervalo nas queries dos repositórios.
-
receita_totaleticket_medio: soma/média acumulada de todas as vendas pagas desde sempre, não "vendas do mês" ou "dos últimos 30 dias". -
total_pedidosepedidos_pendentes: contam sobre o histórico completo de vendas do tenant. -
ultimos_pedidos: não usa janela de data — limita por quantidade (10 registros mais recentes pordata desc), então pode trazer um pedido de meses atrás se o tenant tiver poucas vendas.
|
Isso contrasta com |
Se no futuro for necessário um /stats por período (ex.: "receita do mês"), isso exige um novo parâmetro de data na rota e novas queries com filtro por Venda.data — não existe hoje.
Campos e como são calculados
| Campo | Cálculo | Fonte |
|---|---|---|
|
Conta produtos do tenant com |
|
|
Conta fornecedores do tenant com |
|
|
Conta categorias do tenant com |
|
|
Conta todas as vendas do tenant, em qualquer estado (inclusive |
|
|
Conta vendas cujo status ainda não chegou a um estado final — ou seja, está fora de |
|
|
Soma de |
|
|
|
|
|
Pares (Estoque, Produto) onde o produto tem |
|
|
10 vendas mais recentes do tenant por |
|
|
|
entrada, saída e movimentação: não fazem parte de /stats
/stats não calcula nem expõe totais de entrada, saída ou movimentação de estoque. Esses termos pertencem a um domínio separado — o de movimentação de estoque — servido por outros endpoints do backend-store:
| Endpoint | O que faz |
|---|---|
|
Registra uma entrada de estoque (compra de fornecedor ou outra origem) e incrementa o snapshot ( |
|
Registra uma baixa manual de estoque (perda ou inventário, com motivo obrigatório) e decrementa o snapshot. |
|
Lista o histórico de movimentações ( |
No frontend fuji-loja, esses três endpoints alimentam o módulo Inventory (projects/store/src/inventory/), uma tela separada do "Painel da Lojinha" que consome /stats.
Cada Movimentacao tem tipo (Entrada ou Saida) e origem (Compra, Venda, Perda ou Inventario). Não existe hoje um endpoint que some "total de entradas" ou "total de saídas" — a única agregação sobre o histórico de movimentações é interna, em EstoqueRepository.calcular_saldo (soma quantidades de entrada menos saída de todo o histórico, sem limite de 60 dias), usada pelo comando de ressincronismo (make task sync-estoque), não pela API.
|
Se o painel precisar futuramente exibir "entradas/saídas do período" como métrica, isso não existe em |
Referências
-
app/api/routes/stats.py,app/domain/services/stats_service.py,app/api/schemas/stats.py— implementação do endpoint. -
app/infrastructure/repositories/venda_repository.py,estoque_repository.py— queries por trás de cada métrica. -
app/domain/services/estoque_service.py— janela de 60 dias das movimentações (MOVIMENTACAO_HISTORICO_DIAS). -
Máquina de Estados da Venda — estados de venda usados em
pedidos_pendentesereceita_total.