# Módulo de Limites de Estoque (Thresholds)

Este documento descreve funcionalidades, endpoints e decisões de implementação do módulo de thresholds de estoque.

## Funcionalidades

- Definir níveis mínimos e máximos por produto (`min_stock`, `max_stock`).
- Configurar alertas automáticos por produto (`alert_enabled`, `notify_email`).
- Integração com inventário existente utilizando `products.estoque` como fonte oficial de níveis.
- Relatórios de produtos abaixo do mínimo e acima do máximo.
- Exportação CSV dos níveis de estoque com thresholds.

## Endpoints

- `GET /api/estoque/thresholds` — lista thresholds com dados do produto (código, nome, estoque atual).
- `GET /api/estoque/thresholds/{product_id}` — obtém threshold de um produto.
- `POST /api/estoque/thresholds` — define/atualiza threshold `{ product_id, min_stock, max_stock, alert_enabled?, notify_email? }`.
- `DELETE /api/estoque/thresholds/{product_id}` — remove threshold do produto.
- `GET /api/estoque/niveis` — níveis atuais por produto (fonte: `products.estoque`, com fallback para `inventory_movements`).
- `GET /api/estoque/niveis/export.csv` — exporta níveis com thresholds em CSV.
- `GET /api/estoque/alertas` — retorna alertas atuais (`below_min`/`above_max`) com configuração de alertas.
- `GET /api/estoque/thresholds/report` — relatório consolidado `{ below_min: [...], above_max: [...] }`.
- `POST /api/estoque/alertas/dispatch` — envia e-mails de alertas para `notify_email` ou admin padrão.

## Decisões de Implementação

- Fonte de níveis de estoque: `products.estoque` é considerada a verdade. Se indisponível, há fallback para somatório de `inventory_movements` usando o campo `tipo` (`entrada`/`saída`).
- Alertas: respeitam `alert_enabled` por produto; envio utiliza `Mailer::send` e configurações SMTP do sistema.
- E-mail padrão: quando `notify_email` não está definido, é utilizado `DEFAULT_ADMIN_EMAIL`.
- Migração: adicionadas colunas `alert_enabled TINYINT(1)` e `notify_email VARCHAR(200)` na tabela `product_stock_thresholds`.

## UI

- View `/estoque/thresholds` refatorada para formulário (sem `prompt()`), exibindo colunas: ID, código, nome, estoque, mínimo, máximo, alerta e e-mail.
- Busca por ID/código/nome; ações de editar/remover; botão para ver alertas e exportar CSV.

## Integrações

- Inventário: leitura de `products` e `inventory_movements`.
- Notificações/E-mail: `Mailer` e configuração de admin (`DEFAULT_ADMIN_EMAIL`).

## Testes

- `tests/InventoryThresholdsTest.php` cobre:
  - Definição de thresholds com alertas habilitados.
  - Listagem com enriquecimento de dados do produto.
  - Geração de alertas (`below_min`/`above_max`).
  - Relatório dos produtos críticos.