Pular para o conteúdo principal

Doce Mineiro — Regras de Precificação (por Faixa de Peso/Volume)

Ticket: [<Nome do ticket>](<Link do ticket>) Última atualização: 30 de dezembro de 2025

Visão Geral​

A empresa Doce Mineiro possui uma regra específica de precificação baseada em:

  1. Tabela de preço do produto (varejo/caminhão/carreta);
  2. Faixas de quantidade negociada (QTDNEG), configuradas em PriceDetails.VOLUME_VENDAS por empresa (CODEMP);
  3. Coluna (COLUNA) indicada na faixa encontrada para decidir qual preço aplicar.

Essa regra determina o preço unitário que será utilizado no pedido quando a empresa/cliente estiverem operando sob essa lógica.


Onde a Regra Está Implementada​

Arquivo principal​

ArquivoLocalizaçãoResponsabilidade
tableprice.products.controller.tssrc/screens/order-create/controllers/products/Seleção e aplicação do preço Doce Mineiro por faixa (QTDNEG)

Funções relacionadas​

FunçãoResponsabilidade
getPriceByWeightDoceMineiroDetermina o preço com base em QTDNEG e VOLUME_VENDAS (faixas)
getPriceDoceMineiroWrapper que monta os preços (varejo/truck/carreta) e aplica fallback

Trechos/chaves importantes no código:

  • priceDetails.find(e => e.CODEMP === CODEMP)
  • VOLUME_VENDAS.find(i => QTDNEG >= i.VLFXINI && QTDNEG <= i.VLFXFIN)
  • Seleção pelo campo COLUNA

Entradas e Estruturas de Dados​

Entradas principais​

CampoTipoOrigemDescrição
CODEMPnumberCabeçalho do pedidoEmpresa selecionada
QTDNEGnumberItem do pedidoQuantidade negociada (faixa)
tablePrice.preconumberTabela de preçoPreço varejo (padrão)
tablePrice.precoTrucknumberTabela de preçoPreço “caminhão” (normalmente atacado intermediário)
tablePrice.precoCarretanumberTabela de preçoPreço “carreta” (normalmente maior volume)
priceDetailsPriceDetails[]API/dados do produtoMetadados de precificação por empresa

PriceDetails (relevante para Doce Mineiro)​

A regra utiliza especificamente, por empresa (CODEMP), uma lista de faixas em VOLUME_VENDAS.

Campos esperados (conforme uso no algoritmo):

CampoTipoDescrição
CODEMPstring/numberIdentificador da empresa na qual as faixas são válidas
VOLUME_VENDASarrayLista de faixas de volume/quantidade para seleção de coluna de preço

Item de VOLUME_VENDAS​

Campos esperados (conforme uso no algoritmo):

CampoTipoDescrição
VLFXINInumberInício da faixa (inclusive)
VLFXFINnumberFim da faixa (inclusive)
COLUNAnumberDefine qual preço aplicar (2 = truck, 3 = carreta)

Algoritmo de Cálculo​

Regras​

  1. Localiza o PriceDetails correspondente ao CODEMP.
  2. Dentro dele, localiza a faixa em VOLUME_VENDAS tal que:
    • QTDNEG >= VLFXINI e QTDNEG <= VLFXFIN
  3. Define o preço base como varejo (priceVarejo).
  4. Se encontrou faixa:
    • Se COLUNA === 2 e priceTruck existe, usa priceTruck.
    • Se COLUNA === 3 e priceCarreta existe, usa priceCarreta.
  5. Retorna o preço.

Fluxograma de Decisão​


Implementação Técnica​

getPriceByWeightDoceMineiro​

Responsável por aplicar a lógica da faixa e coluna.

Comportamento importante:

  • Não altera valores fora de faixa: se não encontrar faixa, permanece no varejo;
  • Há checagem de existência de preço: só troca para truck/carreta se o valor estiver disponível.

getPriceDoceMineiro​

É a função chamada para obter o preço final Doce Mineiro.

Regras:

  • Monta os parâmetros de preços a partir do tablePrice:
    • priceVarejo: tablePrice.preco
    • priceTruck: tablePrice.precoTruck
    • priceCarreta: tablePrice.precoCarreta ?? 0
  • Aplica fallback:
    • return price || tablePrice.preco

Observação: como getPriceByWeightDoceMineiro já inicia com price = priceVarejo, o fallback tende a ser mais um “cinto de segurança” para garantir um valor.


Regras e Cenários de Exemplo​

Exemplo 1 — Compra pequena (varejo)​

Entradas:

  • QTDNEG = 5
  • Não existe faixa correspondente, ou COLUNA não é 2/3

Resultado:

  • Preço aplicado: tablePrice.preco (varejo)

Exemplo 2 — Faixa com COLUNA = 2 (caminhão)​

Entradas:

  • QTDNEG = 120
  • Faixa encontrada: VLFXINI = 100, VLFXFIN = 199, COLUNA = 2
  • tablePrice.precoTruck = 9.50

Resultado:

  • Preço aplicado: 9.50

Exemplo 3 — Faixa com COLUNA = 3 (carreta)​

Entradas:

  • QTDNEG = 400
  • Faixa encontrada: VLFXINI = 300, VLFXFIN = 999, COLUNA = 3
  • tablePrice.precoCarreta = 8.90

Resultado:

  • Preço aplicado: 8.90

Pontos de Atenção (Edge Cases)​

  1. priceDetails sem CODEMP correspondente

    • Sem match por empresa, não há faixa; preço fica como varejo.
  2. VOLUME_VENDAS vazio ou ausente

    • Sem faixas; preço fica como varejo.
  3. Faixa encontrada, mas preço da coluna não existe

    • Ex.: COLUNA = 2, mas precoTruck é 0/falsy.
    • Resultado: permanece no varejo.
  4. Limites inclusivos

    • A faixa considera inclusive VLFXINI e VLFXFIN.
  5. Tipos (string vs number)

    • O código compara CODEMP por toString() para evitar divergência de tipos.

Integração com o Fluxo de Pedido​

Em geral, o preço calculado por esta regra será utilizado para preencher campos do item (dependendo de onde for aplicado no fluxo):

  • VLRUNIT
  • VLRUNITBASE
  • PRECOBASE
  • VLRUNIDPAD

A decisão de “quando” chamar getPriceDoceMineiro ocorre no fluxo de montagem/atualização de produtos do pedido (controllers de produtos e/ou etapas de seleção de tabela/preço).