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).