Pular para o conteúdo principal

Estoque

Homologação da rota /estoque: resumo global, abas Lotes de Estoque e Saldos por Produto, busca e filtros. Inclui cenários desejados mesmo que ainda não estejam implementados — para guiar pendências.


Cabeçalho e permissões

  • Título e subtítulo — “Estoque” e texto de controlo de saldos/lotes.
  • Permissão — Acesso apenas com StockView (ou política equivalente na rota).
  • Exportar — Gera e transfere ficheiro (CSV/Excel/PDF) com lotes e/ou saldos conforme aba e filtros ativos.
    Hoje: botão sem ação ligada. (pendência de implementação)

Resumo (quatro cartões)

  • Total Produtos — Valor de /api/stock/summary (productsTotal) coerente com o negócio.
  • Quantidade TotaltotalQuantity formatada em pt-BR; “—” se nulo.
  • Total LoteslotsTotal do resumo.
  • Baixo Estoque — Contagem de produtos abaixo do mínimo em âmbito global (ou regra documentada).
    Hoje: conta apenas linhas da página atual de saldos (balancesData.items). Homologar se aceitável ou corrigir para total real. (pendência / revisão)
  • Loading — Skeletons nos cartões enquanto summaryLoading.

Abas Lotes / Saldos

  • Alternância — “Lotes de Estoque” e “Saldos por Produto” mostram conteúdo correto sem perder filtros de texto partilhados.
  • Busca partilhada — Campo “Buscar por produto ou lote…” repõe página de lotes e de saldos a 1 e envia SearchTerm às duas APIs.
  • Filtro por status — Opções: todos, disponível, reservado, vencendo, quarentena, adequado, baixo — aplicam-se ao conjunto exibido conforme regra (ver nota abaixo).
  • Filtro por produto — Lista derivada dos nomes de produto nos lotes da página atual; filtra a tabela de lotes por productName.
    Limitação: produtos só aparecem se estiverem na página corrente de lotes. (pendência / melhoria — catálogo completo)
  • Filtros no servidor vs cliente — Idealmente filtros de status/produto refletem dados paginados do servidor;
    hoje os filtros de status (e produto nos lotes) aplicam-se só aos itens já carregados na página — pode haver lotes noutras páginas que cumprem o filtro mas não aparecem. (pendência de implementação — filtros na API ou agregação)

Aba Lotes de Estoque

  • Carregamento / erro — Spinner; mensagem “Erro ao carregar lotes.” em falha.
  • Colunas — Produto, Lote, Quantidade (pt-BR), datas produção/validade, status (badge com cores por expirationStatus), localização, ações.
  • Localização — Mostra armazém/local real do lote.
    Hoje: sempre “—”. (pendência de implementação)
  • Ver detalhe (ícone olho) — Navega para detalhe do lote, produto ou movimento associado.
    Hoje: botão sem Link/onClick. (pendência de implementação)
  • Vazio — “Nenhum lote encontrado.” quando aplicável.
  • Paginação — Controlo alinhado a lotesTotal e PAGE_SIZE (10).

Aba Saldos por Produto

  • Carregamento / erro — Spinner; “Erro ao carregar saldos.”
  • Colunas — Produto, quantidade total, mínimo, status (adequado/baixo via deriveBalanceStatus), ações.
  • Ver detalhe — Liga a ficha de produto, lista de lotes desse produto ou drill-down de stock.
    Hoje: botão sem ação. (pendência de implementação)
  • Filtro “baixo/adequado” — Para saldos, status deriva de balance vs minStock; combina com filtro global de status.
  • Vazio — “Nenhum saldo encontrado.”
  • Paginação — Alinhada a saldosTotal e PAGE_SIZE (10).

APIs e consistência

  • /api/stock/summary — Campos preenchidos e alinhados aos cartões.
  • /api/stock/lots — Paginação e pesquisa corretas.
  • /api/stock/product-balances — Paginação e pesquisa corretas.
  • Sincronização — Após movimentações externas, atualizar dados (refetch, invalidação ou polling se existir).

Regressão

  • Valores grandestoLocaleString sem quebrar layout.
  • Datas — Fuso e formato pt-BR.
  • Dark mode — Classes de cor dos badges de status legíveis em tema claro/escuro.

Registe aqui decisões quando “Baixo estoque” ou filtros forem corrigidos para âmbito global.