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:
- Tabela de preço do produto (varejo/caminhão/carreta);
- Faixas de quantidade negociada (QTDNEG), configuradas em
PriceDetails.VOLUME_VENDASpor empresa (CODEMP); - 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
| Arquivo | Localização | Responsabilidade |
|---|---|---|
tableprice.products.controller.ts | src/screens/order-create/controllers/products/ | Seleção e aplicação do preço Doce Mineiro por faixa (QTDNEG) |
Funções relacionadas
| Função | Responsabilidade |
|---|---|
getPriceByWeightDoceMineiro | Determina o preço com base em QTDNEG e VOLUME_VENDAS (faixas) |
getPriceDoceMineiro | Wrapper 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
| Campo | Tipo | Origem | Descrição |
|---|---|---|---|
CODEMP | number | Cabeçalho do pedido | Empresa selecionada |
QTDNEG | number | Item do pedido | Quantidade negociada (faixa) |
tablePrice.preco | number | Tabela de preço | Preço varejo (padrão) |
tablePrice.precoTruck | number | Tabela de preço | Preço “caminhão” (normalmente atacado intermediário) |
tablePrice.precoCarreta | number | Tabela de preço | Preço “carreta” (normalmente maior volume) |
priceDetails | PriceDetails[] | API/dados do produto | Metadados 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):
| Campo | Tipo | Descrição |
|---|---|---|
CODEMP | string/number | Identificador da empresa na qual as faixas são válidas |
VOLUME_VENDAS | array | Lista de faixas de volume/quantidade para seleção de coluna de preço |
Item de VOLUME_VENDAS
Campos esperados (conforme uso no algoritmo):
| Campo | Tipo | Descrição |
|---|---|---|
VLFXINI | number | Início da faixa (inclusive) |
VLFXFIN | number | Fim da faixa (inclusive) |
COLUNA | number | Define qual preço aplicar (2 = truck, 3 = carreta) |
Algoritmo de Cálculo
Regras
- Localiza o
PriceDetailscorrespondente aoCODEMP. - Dentro dele, localiza a faixa em
VOLUME_VENDAStal que:QTDNEG >= VLFXINIeQTDNEG <= VLFXFIN
- Define o preço base como varejo (
priceVarejo). - Se encontrou faixa:
- Se
COLUNA === 2epriceTruckexiste, usapriceTruck. - Se
COLUNA === 3epriceCarretaexiste, usapriceCarreta.
- Se
- 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.precopriceTruck: tablePrice.precoTruckpriceCarreta: 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
COLUNAnã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)
-
priceDetailssemCODEMPcorrespondente- Sem match por empresa, não há faixa; preço fica como varejo.
-
VOLUME_VENDASvazio ou ausente- Sem faixas; preço fica como varejo.
-
Faixa encontrada, mas preço da coluna não existe
- Ex.:
COLUNA = 2, masprecoTrucké0/falsy. - Resultado: permanece no varejo.
- Ex.:
-
Limites inclusivos
- A faixa considera inclusive
VLFXINIeVLFXFIN.
- A faixa considera inclusive
-
Tipos (string vs number)
- O código compara
CODEMPportoString()para evitar divergência de tipos.
- O código compara
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):
VLRUNITVLRUNITBASEPRECOBASEVLRUNIDPAD
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).