Cálculo de Métricas de Estoque: turn_rate_12m e days_supply
📐 Fórmulas de Cálculo
1. Vendas Diárias Médias (avg_daily_sales)
avg_daily_sales = total_qty_12m / 365.0
Onde:
- total_qty_12m: Soma de qty dos últimos 12 meses de core.core_order_items
- 365.0: Número de dias em um ano
Significado: Quantas unidades são vendidas em média por dia.
2. Days Supply (days_supply)
days_supply = current_stock / avg_daily_sales
Ou simplificado:
days_supply = current_stock / (total_qty_12m / 365.0)
Onde:
- current_stock: Estoque atual de core.core_inventory.stock
- avg_daily_sales: Vendas diárias médias (calculado acima)
Significado: Quantos dias de estoque temos baseado na velocidade atual de vendas.
Exemplo:
- Estoque: 1.000 unidades
- Vendas 12m: 3.650 unidades (10 unidades/dia)
- Days Supply: 1.000 / 10 = 100 dias
3. Turn Rate 12m (turn_rate_12m)
turn_rate_12m = total_qty_12m / current_stock
Onde:
- total_qty_12m: Vendas dos últimos 12 meses
- current_stock: Estoque atual
Significado: Quantas vezes o estoque gira por ano.
Exemplo:
- Estoque: 1.000 unidades
- Vendas 12m: 3.650 unidades
- Turn Rate: 3.650 / 1.000 = 3.65 vezes/ano
🔍 Fonte dos Dados
total_qty_12m
Calculado a partir de:
SELECT SUM(oi.qty)
FROM core.core_order_items oi
INNER JOIN core.core_orders o ON oi.order_id = o.order_id
WHERE o.order_date >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH)
AND (o.status IS NULL OR o.status = '' OR o.status = 'BX' OR o.status LIKE 'BX%')
AND oi.sku = :sku_id
current_stock
Buscado de:
SELECT stock
FROM core.core_inventory
WHERE sku = :sku_id
📊 Classificação de stock_level
Baseado em days_supply (ajustado para importadores):
| Condição | stock_level |
Significado |
|---|---|---|
days_supply < 60 |
"low" |
Estoque baixo - menos de 60 dias |
60 <= days_supply < 120 |
"normal" |
Estoque normal - entre 60 e 119 dias |
days_supply >= 120 |
"high" |
Estoque alto - 120 dias ou mais |
⚠️ Casos Especiais
Quando days_supply é NULL:
- Produto não tem vendas nos últimos 12 meses
- Estoque é zero ou negativo
- Não é possível calcular dias de estoque
Quando turn_rate_12m é NULL:
- Estoque é zero ou negativo
- Não é possível calcular giro
Produtos sem vendas (Curva D e E):
days_supply: NULL (não há como calcular)turn_rate_12m: NULL (não há como calcular)stock_level: Classificado apenas por quantidade:- Estoque <= 0 ou <= 10 unidades →
"low" - Estoque > 10 unidades →
"high"(estoque parado)
📈 Exemplo Prático
Produto: SKU 12345
Dados:
- Estoque atual: 500 unidades
- Vendas últimos 12 meses: 1.825 unidades
Cálculos:
1. Vendas diárias médias:
avg_daily_sales = 1.825 / 365 = 5.0 unidades/dia
-
Days Supply:
days_supply = 500 / 5.0 = 100 dias -
Turn Rate 12m:
turn_rate_12m = 1.825 / 500 = 3.65 vezes/ano -
Stock Level:
days_supply = 100 dias 60 <= 100 < 120 → "normal"
Resultado:
- days_supply: 100.00 dias
- turn_rate_12m: 3.6500
- stock_level: "normal"
🔄 Onde é Calculado
Arquivo: csuite-pricing/sql/sp_sync_product_classification_from_inventory.sql
Linhas: 109-122
UPDATE tmp_sku_metrics
SET
avg_daily_sales = CASE WHEN total_qty_12m > 0 THEN total_qty_12m / 365.0 ELSE 0 END,
days_supply = CASE
WHEN total_qty_12m > 0 AND current_stock > 0 THEN
current_stock / (total_qty_12m / 365.0)
ELSE NULL
END,
turn_rate_12m = CASE
WHEN current_stock > 0 THEN
total_qty_12m / current_stock
ELSE NULL
END;
📝 Notas Importantes
- Período de análise: Últimos 12 meses (365 dias)
- Status de pedidos: Apenas pedidos com status
NULL,'','BX'ou'BX%' - Apenas SKUs numéricos: Filtro
REGEXP '^[0-9]+$' - Apenas produtos com receita:
HAVING total_revenue_12m > 0 - Thresholds para importadores: Ajustados para ciclos de importação mais longos