A v1.4 unificou o que antes era duas telas separadas (Catálogo + Estoque). Agora a tela Produtos cria o cadastro mestre e já vincula à(s) loja(s) com preço e estoque numa só operação. /erp/catalogo redireciona pra /erp/produtos (compatibilidade com bookmarks antigos).
Por que mudou: muito lojista cadastrava só o Catálogo e o produto não aparecia no PDV — o segundo passo (vincular à loja) era pegadinha. Pra quem trabalha sem controle de estoque (configurável por loja em Configurações → Lojas), o efeito era ainda pior.
Cadastrar um produto
Selecione a loja no topo. Produtos → Novo produto:
A aba Produto cobre o caso comum:
- Nome (obrigatório).
- SKU (opcional, único por empresa).
- Preço de venda (obrigatório).
- Estoque inicial e alerta de estoque mínimo — só aparecem se a loja tem controle de estoque ativo.
- Descrição (até 2000 caracteres).
- Foto (PNG/JPG/WEBP/SVG, até 512 KB) — usada no feed do Google Shopping e no catálogo do WhatsApp.
A aba Outras lojas (só aparece em tenants multi-loja) deixa marcar onde mais o produto deve estar disponível e definir preço/estoque de cada uma. Tudo em uma transação — se qualquer loja falhar, nenhuma é criada.
A aba Avançado concentra o que é raro mas importante:
- Comissão do vendedor (%) — override que sobrescreve o padrão do vendedor.
- Dados fiscais (NCM 8 dígitos, CEST 7 dígitos, Origem 0–8, CFOP 4 dígitos) — necessários pra emitir NFC-e.
- Catálogo online: marca, GTIN/EAN (8/12/13/14 dígitos), MPN, categoria livre e categoria Google Product — saem nos feeds do Google Shopping e Meta Advantage+ quando preenchidos.
Editar um produto
Produtos → ícone de lápis. O dialog tem 2 abas:
- Produto — preço e estoque desta loja, mais nome/SKU/descrição/foto e (se atacado habilitado) faixas de preço.
- Avançado — campos fiscais e de catálogo online; mudanças aqui valem pra todas as lojas (são do produto mestre).
Cada mudança de preço gera um registro no histórico de preços (auditável em Relatórios → Histórico de preços).
Pra movimentar estoque sem editar preço (ex.: chegou uma caixa de fornecedor), use Movimentações → Entrada — gera StockMovement rastreável com fornecedor associado.
Loja sem controle de estoque
Em Configurações → Lojas → editar, o toggle “Controle de estoque” desliga o estoque pra aquela loja. Efeito:
- Tela Produtos esconde colunas e KPIs de estoque.
- PDV deixa vender mesmo com saldo zerado, não decrementa.
- Form de cadastro/edição esconde os campos de estoque.
Útil pra serviço, food, qualquer modelo onde “saldo” não faz sentido.
Faixas de preço de atacado
Se a loja tem atacado habilitado (toggle em Configurações → Lojas), o dialog de edição mostra a seção Faixas de preço:
10+→ R$ 8,0050+→ R$ 6,00100+→ R$ 5,00
O PDV aplica automaticamente a maior faixa que couber na quantidade. Veja também Tabelas de preço e atacado B2B.
Soft delete
Produtos no catálogo não são apagados — são marcados como is_active: false. Vendas antigas continuam intactas, relatórios não quebram. Pra reativar, basta editar.
Importação em massa
Produtos → Importar CSV. Baixa o template, preenche e faz upload. Colunas:
| Coluna | Obrigatório | Notas |
|---|---|---|
nome | sim | até 200 caracteres |
sku | recomendado | único por empresa; usado pra evitar duplicata em re-import |
descricao, ncm, cest, origem, cfop_venda | não | dados fiscais opcionais |
preco | não | aceita 19,90, 19.90, 1.299,50. Quando preenchido, vincula o produto à loja ativa com esse preço |
estoque | não | inteiro >= 0; ignorado se a loja não controla estoque |
Se a loja ativa estiver selecionada (header X-Store-Id enviado pela UI), as linhas que trouxerem preco viram StoreProduct automaticamente. Sem preco, só o catálogo é populado — o vínculo à loja você faz depois pela tela.
A resposta volta com imported, updated, store_products_created, store_products_updated e os erros por linha (validação Zod). Tudo em uma transação — se houver erro, nada entra.
Mesmo esquema vale pra Clientes e Fornecedores.