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
QueryDescriptorna 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_SIZE10, navegação correta.
Nova movimentação (diálogo)
- 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 API —
POST /api/stock-movements(ou fluxo oficial) com payload mapeado; toast sucesso/erro; invalidação destock-movementse resumo do dia.
Hoje:onSubmitapenas fecha o diálogo e fazform.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
StockMovementTypecorretos (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
#lotIdconforme 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-movimentacoesquando aplicável ao processo. - Debounce na busca — Reduzir pedidos se o termo for digitado rapidamente. (melhoria)
Regressão
- IDs e datas — Parsing de
idda URL ecreatedAtem pt-BR. - Textos longos —
line-clampetruncateem 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.