From 43daf7ad6dc2c3b069b798fb3410c46c5d0882e8 Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 22 Jul 2026 18:40:06 +0000 Subject: [PATCH] fix(api): promocao/regra de desconto e teto da alcada, nao folga somada Com alcada base 5% e regra de 15%, o limite do item era 5+15=20% e um desconto de 18% passava na transmissao. Agora vale o MAIOR entre alcada do grupo, promocao e regra vigente: regra de 15% bloqueia acima de 15%. Co-Authored-By: Claude Fable 5 --- apps/api/src/app/orders/orders.service.ts | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/apps/api/src/app/orders/orders.service.ts b/apps/api/src/app/orders/orders.service.ts index 3933459..0958a48 100644 --- a/apps/api/src/app/orders/orders.service.ts +++ b/apps/api/src/app/orders/orders.service.ts @@ -496,12 +496,12 @@ export class OrdersService { // Alçada por ITEM (complementa o gate global do transmit): o desconto EFETIVO // de cada item — preço cobrado vs preço de tabela, combinado com o desconto - // global — deve caber no limite do grupo do produto (alcada_desconto por - // codGrupo; 0 = default), somado à maior folga entre promoção ativa - // (produto/grupo) e regra de desconto vigente (grupo/subgrupo/rep). Cobre o - // desconto lançado no item E desconto disfarçado de preço unitário reduzido. - // Preço de tabela: pauta do pedido > promocional > preço base; produto sem - // referência valida só pelo campo de desconto. + // global — deve caber no maior valor entre a alçada do grupo do produto + // (alcada_desconto por codGrupo; 0 = default), a promoção ativa + // (produto/grupo) e a regra de desconto vigente (grupo/subgrupo/rep) — teto, + // não soma. Cobre o desconto lançado no item E desconto disfarçado de preço + // unitário reduzido. Preço de tabela: pauta do pedido > promocional > preço + // base; produto sem referência valida só pelo campo de desconto. private async assertAlcadaItens( pedido: { codVendedor: number; @@ -601,9 +601,12 @@ export class OrdersService { ) .reduce((max, r) => Math.max(max, Number(r.descPct)), 0); - const limiteItem = - (codGrupo != null ? (limitMap.get(codGrupo) ?? limiteDefault) : limiteDefault) + - Math.max(promoPct, regraPct); + // Promoção/regra definem TETO próprio, não somam à alçada: com alçada 5% + // e regra de 15%, o máximo do item é 15% (não 20%). Vale o maior entre a + // alçada do grupo e a melhor condição vigente que alcança o produto. + const alcadaBase = + codGrupo != null ? (limitMap.get(codGrupo) ?? limiteDefault) : limiteDefault; + const limiteItem = Math.max(alcadaBase, promoPct, regraPct); // Preço de tabela: pauta do pedido > promocional (se menor) > preço base const precoPauta = prod?.preco_pauta != null ? Number(prod.preco_pauta) : 0;