Pular para o conteúdo principal

Catálogo de Produtos — Visão Geral

Última atualização: 15 de julho de 2026

O que é este fluxo

O catálogo é a tela onde o vendedor consulta produtos, preço, estoque e promoções. É importante deixar claro desde já um ponto que muda a forma de ler o resto desta documentação: o catálogo é uma tela de consulta, não um ponto de entrada para o carrinho. Não existe, em nenhum lugar do código desta feature, uma ação de "adicionar ao carrinho" ou de navegação para o rascunho de venda a partir de um produto do catálogo. Quem monta o carrinho de uma venda usa a lista de produtos própria da tela de nova venda, documentada em Carrinho e Itens. O catálogo existe ao lado disso, para consulta e para gerar um catálogo digital em PDF.

Esta seção documenta o fluxo em seis partes:

DocConteúdo
Visão Geral (este documento)Arquitetura, flag de habilitação, gate de filtro vazio
Busca, Filtros e Tipos de ProdutoFTS5, tipos de produto, condição de promoção, fallback de similaridade
Cliente e Persistência de FiltroHandoff vindo da carteira, persistência do filtro, cálculo de preço
Modos de Visualização e Detalhes do ProdutoOs cinco modos de exibição, badges, modal de detalhes
Análise de ProdutoBusca e ordenação sobre uma lista ainda mockada
Catálogo DigitalWizard de seleção, geração de PDF e compartilhamento

Arquitetura em camadas

Assim como nos outros fluxos, app/(tabs)/catalogo.tsx é só a camada de roteamento, e toda a lógica mora em features/catalog. A tela em si é sempre envolvida por CatalogGroupsProvider, que resolve os grupos de produtos usados nos carrosséis de categoria (destaques, mais vendidos e afins) de forma independente do useCatalogController.

A feature inteira é gated por flag

Igual à carteira de clientes, a rota redireciona para a home se o catálogo estiver desabilitado:

// app/(tabs)/catalogo.tsx
export default function CatalogoScreen() {
const settings = useSettings();

if (settings.get("cfg-ativarcatalogodeprodutos") !== "S") {
return <Redirect href="/(tabs)/home" />;
}

return <CatalogScreen />;
}

Duas outras flags controlam pedaços específicos dentro do catálogo já habilitado: cfg-ativaranalisedeprodutos decide se a opção "Análise de Produto" aparece no menu de mais opções, e cfg-ativarcodigodebarras decide se a opção de leitura por código de barras aparece.

O catálogo não mostra nada sem cliente ou tabela de preço

Antes de qualquer busca acontecer, a tela verifica se já existe um cliente selecionado ou uma tabela de preço (codTab) no filtro. Sem nenhum dos dois, a tela mostra um estado vazio em vez de tentar listar produtos:

// catalog.controller.ts
const isFilterEmpty = !filter?.client && !filter?.codTab;
// catalog.tsx
{controller.isFilterEmpty ? (
<CatalogEmptyState />
) : (
<CatalogProductsList controller={controller} />
)}

Isso existe porque preço e disponibilidade de produto dependem diretamente de quem é o cliente e em qual tabela de preço ele está enquadrado, então listar produtos sem esse contexto não faria sentido para o vendedor. A forma mais comum de sair desse estado vazio é chegar ao catálogo a partir de um cliente já selecionado na carteira, documentado em Cliente e Persistência de Filtro.

Arquivos-chave

ArquivoResponsabilidade
app/(tabs)/catalogo.tsxRota da tab, redireciona para home se a flag estiver desligada
features/catalog/catalog.tsxScreen: cabeçalho, lista, modais e bottom sheets
features/catalog/catalog.controller.tsHub de estado: filtro, paginação, modos de visualização, ações de navegação
features/catalog/catalog-groups.provider.tsxCarrega os grupos/carrosséis de categoria (destaques, mais vendidos, etc.)
services/product/product.service.tsOrquestra busca, cálculo de preço e fallback de similaridade
repositories/product/product.repository.tsQueries SQLite, FTS5 de busca e de similaridade
storage/catalog-preferences.storage.tsPersistência do filtro do catálogo e de preferências de exibição
app/catalog/*Rotas de pilha para análise de produto e catálogo digital