Pular para o conteúdo principal

Movimentações

Homologação da rota /movimentacoes (lista, filtros, resumo do dia, diálogo Nova Movimentação) e /movimentacoes/:id (detalhe). Cenários incluem comportamento esperado e pendências atuais da implementação.


Lista (/movimentacoes)

  • Cabeçalho — Título “Movimentações” e descrição de entradas/saídas.
  • Permissão — Acesso com StockView (ou equivalente na rota).
  • Resumo do dia — Três cartões: Entradas Hoje (byType.entry), Saídas Hoje (byType.exit), Total Hoje (total) via /api/stock-movements/day-summary; “—” se sem dados ou em erro silencioso a tratar.
  • Busca — Termo enviado à API (searchTerm), página reinicia para 1; placeholder “ID, endereço ou observações…”.
  • Filtro por tipo — Todos ou um valor de STOCK_MOVEMENT_TYPE_LABELS (Entrada, Saída, Transferência, Ajuste, Devolução, Consumo, Produção).
  • Filtro por status — Todos ou Pendente, Concluído, Cancelado, Em progresso.
  • Limpar filtros — Repõe busca, tipo, status e página.
  • Combinação de filtros — Resultado coerente com query QueryDescriptor na API.
  • Carregamento — Skeletons em cartões durante isLoading.
  • Erro — Mensagem “Não foi possível carregar as movimentações…”.
  • Cartão por movimentação — ID, tipo (badge entrada/saída com ícone), status, data (pt-BR), endereço se existir, observações resumidas, botão Detalhes → /movimentacoes/{id}.
  • Tipos como entrada — Entrada, Devolução e Produção usam estilo de “entrada” (seta para cima) na lista.
  • Lista vazia — “Nenhuma movimentação encontrada com os filtros aplicados.”
  • Paginação — Visível com total > 0, PAGE_SIZE 10, navegação correta.
  • Abrir / fechar — Trigger “Nova Movimentação”; Cancelar fecha; submit trata gravação.
  • Tipo Entrada vs Saída — Alterna entre campo Fornecedor (entrada) e Destino (saída).
  • Campos — Responsável, itens (produto, quantidade, unidade; preço unitário só em entrada), observações.
  • Vários itens — Adicionar/remover linhas; não remover última linha (botão desabilitado).
  • Validação — Campos obrigatórios, números válidos, produtos existentes (select/autocomplete por ID).
    Hoje: validação Zod/yup mínima ou inexistente no formulário. (pendência de implementação)
  • Gravar na APIPOST /api/stock-movements (ou fluxo oficial) com payload mapeado; toast sucesso/erro; invalidação de stock-movements e resumo do dia.
    Hoje: onSubmit apenas fecha o diálogo e faz form.reset()não chama API. (pendência crítica de implementação)
  • Alinhamento tipo UI vs API — Valores “entrada”/“saida” do formulário mapeados para StockMovementType corretos (e subtipos se necessário).
  • Estado de envio — Botão desabilitado e texto “A guardar…” durante mutação.

Detalhe (/movimentacoes/:id)

  • ID inválido — Mensagem e voltar para lista.
  • Loading — Skeleton após botão Voltar.
  • Erro — “Não foi possível carregar a movimentação.”
  • Cabeçalho — ID, tipo, status, data/hora criada, endereço, observações.
  • Tabela de itens — Produto (nome + código), lote, quantidade formatada (2–4 decimais).
  • Item sem lote — “—” ou #lotId conforme dados.
  • Sem itens — “Nenhum item nesta movimentação.”
  • Voltar — Link para /movimentacoes.

Integrações futuras (opcional)

  • Ações no detalhe — Cancelar movimentação pendente, concluir, imprimir comprovativo. (pendência se desejado)
  • Ligação com execução — Atalho para /execucao-movimentacoes quando aplicável ao processo.
  • Debounce na busca — Reduzir pedidos se o termo for digitado rapidamente. (melhoria)

Regressão

  • IDs e datas — Parsing de id da URL e createdAt em pt-BR.
  • Textos longosline-clamp e truncate em endereço/observações na lista.

O item de gravação real da “Nova Movimentação” deve ser tratado como bloqueante antes de dar a funcionalidade como concluída em produção.