Aplica promoções ao carrinho do PDV
POST/sku/promotion/order/validate
Recebe a lista de itens em montagem no PDV e aplica todas as promoções vigentes retornando o carrinho com os preços recalculados (PriceSelling, PriceSellingTotal, ValueDiscount, ValueDiscountTotal, OriginalPriceSelling, PromotionDiscountPercent) e a lista de promoções usadas (IDStockKeepingUnitPromotion/StockKeepingUnitPromotionName) por item.
Regras de elegibilidade (por promoção × item)
Uma promoção é aplicada quando passa em todos os testes:
- Vigência — data/hora atual ∈
[DateFrom, DateTo]. - Restrição de marca — quando
BrandsIncluded=1, a marca do SKU está na lista; quandoBrandsIncluded=0, não está. - Restrição de categoria — mesma lógica de
CategoriesIncluded. - Restrição de produto — mesma lógica de
ProductsIncluded(comparaIDProductda variação). - Restrição de SKU — mesma lógica de
SkusIncluded. - Tipo de pedido — quando
StockKeepingUnitPromotionTypeOrdersnão vazio,IDOrderTypeprecisa estar na lista. - Política comercial — quando
StockKeepingUnitPromotionSalesPoliciesnão vazio,IDCompanySalesPolicydo item precisa estar na lista. - Acúmulo com preço manual — quando
CumulativeManualPrice=0ePriceListTotal ≠ PriceSellingTotal(preço foi alterado manualmente), descarta. - Cliente cadastrado — quando
OnlyRegisteredConsumer=1,IDConsumerprecisa estar informado. - Faixa de valor do pedido (Regular) —
totalvalue ∈ [MinOrderValue, MaxOrderValue].
Cálculo do preço
- Regular: aplica
PercentualDiscountValue(multiplicaPriceSellingTotal × (1 - %)) ouNominalDiscountValue × Quantity(com piso em 0). - Compre e Ganhe: se
Quantity ≥ MinimumQuantityBuyTogether, cada item emSkusBuyTogetheré adicionado/atualizado no carrinho comPriceSellingTotal=0(brinde). - Desconto Progressivo (ExactlyQuantity=0): percorre as faixas (ordenadas desc por
Quantity) e aplica a primeira em queprogressive.Quantity ≤ Quantityou≤ GroupedQuantity(comAllowDifferentItemQuantitySum=1). - Desconto Progressivo (ExactlyQuantity=1): lógica greedy — para cada faixa (desc por
Quantity), encaixa múltiplos exatos (floor(remaining / Quantity)), gera um objeto de carrinho por faixa aplicada, e o resíduo vira um objeto sem desconto. - Compre Junto: se
Quantity ≥ MinimumQuantityBuyTogetherda lista principal e existe item da lista complementar no carrinho, aplicaPercentualDiscountValueno principal ePercentualDiscountValueBuyTogetherno complementar.
Desempate entre promoções
Quando o mesmo item bate em várias promoções:
- Ordena por maior desconto (
PreValueDiscountTotal). - Mantém a primeira; mantém também subsequentes desde que mesmo tipo + Cumulative=1 (acumula promoções do mesmo tipo cumulativas) ou tipo diferente (deixa o resto da lógica decidir).
StoreFrontCashierOrderTemp
O endpoint também persiste o estado do carrinho em StoreFrontCashierOrderTemp (vinculado ao caixa aberto via IDStoreFrontCashier/IDBankAccount). Se você passar IDStoreFrontCashierOrderTemp, atualiza esse registro; senão insere um novo e devolve o IDStoreFrontCashierOrderTemp gerado no corpo da resposta. Isso é o que permite o PDV retomar o pedido em outro terminal.
Request
Responses
- 200
- 400
- 500
Carrinho com os preços e promoções recalculados.
Erros (prefixo [BadRequest]):
Pedido não tem itens(lista vazia)Item não encontrado(SKU informado não existe ou não é da empresa)
Erro interno (prefixo Error:).