🔀 Canais de Venda e Precificação

Venda direta, Representante, Portal, Marketplace, Locação, Balcão — cada canal cobra diferente pelo mesmo item. Em vez de seis catálogos ou seis planilhas de preço, existe um catálogo e um motor de preço que decide na hora, conforme o canal de quem está vendendo.

O problema que ele resolve

Sem isso, "preço" vira uma coisa que cada canal guarda do seu jeito: o representante negocia por fora, o portal de autoatendimento tem uma tabela fixa, a locação cobra por dia/semana/mês, e ninguém sabe qual dessas quatro versões é a verdadeira quando o cliente liga reclamando de uma cobrança.

Aqui existe uma fonte de verdade para "o que existe" (o Catálogo) e uma fonte de verdade para "quanto custa, pra quem, em qual canal" (a Política Comercial). O vendedor nunca digita preço de cabeça — ele monta a proposta, e o sistema resolve.

Como funciona, em uma frase

O Catálogo guarda o que existe e o preço-base. A Política Comercial guarda quanto custa naquele canal, pra aquele cliente ou representante. Quem decide o preço final, na hora, é sempre a mesma função — resolverPreco().
CatalogoItem preço-base recorrência setup / usuários Canal da venda Direto · Representante · Locação… resolverPreco() 1. Política Comercial do canal 2. promoção do item 3. preço de tabela (última opção) preço final PropostaItem precoUnit (o que o cliente paga) precoTabela (congelado) custoUnitSnap (oculto do vendedor)
O item do catálogo e o canal escolhido entram no resolverPreco(), que casa a Política Comercial certa; o preço final sai congelado na linha da proposta — mudanças futuras no catálogo não reescrevem propostas já montadas.

Os canais hoje

CanalOnde já é usadoO que muda
DiretoProposta comercial (CRM), sem representantePreço padrão do canal — o mais "de tabela"
RepresentantePortal do Representante e, agora, Propostas com representante vinculadoMargem/comissão própria da rede
PortalReservado pra autoatendimento/checkout futuroPreço fixo, sem negociação manual
MarketplaceReservado pra canal de terceirosPreço já líquido da comissão do marketplace
LocaçãoContratos de Locação de AtivosTarifa por dia/semana/mês em vez de preço fechado
BalcãoReservado pra venda presencial/PDVPreço à vista, sem prazo

Uma PoliticaComercial sem canal definido vale pra qualquer um — é o "coringa". Uma com canal definido só entra na conta daquele canal específico.

De onde vêm os itens de um orçamento

1
Tudo começa no Catálogo
Módulos, kits, serviços avulsos — o vendedor escolhe de uma lista que já existe, nunca digita um item do zero.
2
A Proposta puxa por referência
PropostaItem.catalogoItemId aponta pro item do catálogo. A descrição e a recorrência vêm de lá — o vendedor só ajusta quantidade.
3
Item livre é a exceção
Dá pra digitar uma linha sem vínculo com o catálogo (um ajuste pontual), mas aí não tem preço resolvido automaticamente — o vendedor informa na mão.

De onde vêm os valores da proposta

1
resolverPreco() decide o preço unitário
Na hora em que o item entra na proposta — não antes, não depois — casando canal + cliente (e representante, se houver) com a Política Comercial certa.
2
O preço é congelado ali mesmo
precoTabela e custoUnitSnap ficam gravados no instante da montagem. Se o catálogo mudar de preço depois, a proposta já enviada ao cliente não muda sozinha — ela é fotografia, não espelho.
3
Desconto acima do teto vira aprovação
O vendedor não vê custo nem margem — só o limite que pode dar. Passar do limite abre o fluxo de solicitar-desconto pro gestor decidir.
🆕 Corrigido agora: até esta correção, toda proposta resolvia preço como se fosse sempre venda Direta — mesmo vinda de um Representante com política própria. A Proposta ganhou um campo de Representante; quando preenchido, o preço passa a resolver pelo canal Representante de verdade, não mais um canal fixo no código.

Resumo em uma imagem

Catálogo (o quê) + Canal (por onde) → resolverPreco() escolhe a Política Comercial certa → preço final entra congelado na Proposta (ou no Contrato, no caso de Locação).