Simulador, reajuste e prévia de preço
Simula e aplica um reajuste em massa nos preços fixos de uma tabela e confere o preço que um cliente real receberia.
Três ferramentas ajudam a mexer em preço sem susto. O simulador mostra o efeito de um reajuste (com margem) sem gravar nada. O reajuste aplica o mesmo cálculo. A prévia de preço responde a pergunta que importa de verdade: "para este cliente, neste produto e nesta quantidade, qual preço a loja vai mostrar?". Todas exigem o módulo b2b-pricing e o privilégio manage_b2b ou manage_promotions.
Os dois reajustes mexem apenas nos itens de preço fixo (price_cents). Itens de desconto (discount_bps) acompanham o preço base sozinhos e ficam de fora.
Simular um reajuste
Calcula o novo preço de cada item de preço fixo e a margem resultante, sem gravar. O custo vem do cadastro do produto.
/api/v1/admin/b2b/price-lists/{id}/simulateAdminSimula um reajuste em massa
Parâmetros de caminho
iduuidobrigatórioCorpo da requisição
delta_bpsintegerobrigatório600 aumenta 6%, -250 reduz 2,5%. O preço nunca fica abaixo de zero.except_category_idsarrayround_to_centsinteger100 arredonda para o real, 50 para R$ 0,50. Valores de 0 e 1 não arredondam.Exemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/b2b/price-lists/3f0c1a52-8d7e-4c1b-9a64-2b5e7d9c1a10/simulate" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{ "delta_bps": 600, "round_to_cents": 10 }'Resposta
{
"items": [
{
"product_id": "5b6f1948-356b-4739-adfc-af8045b7b769",
"sku": "SD-004487",
"old_price_cents": 26250,
"new_price_cents": 27830,
"cost_cents": 19000,
"margin_bps": 3172
}
],
"items_without_cost": 0
}Campos da resposta
itemsarrayproduct_iduuidskustringold_price_centsintegernew_price_centsintegercost_centsintegermargin_bpsinteger(novo - custo) / novo. Ausente sem custo. 3172 é 31,72%.items_without_costintegerErros
| Status | Quando | Corpo |
|---|---|---|
| 400 | JSON inválido | {"error":"invalid request body","detail":"..."} |
| 500 | Id que não é UUID ou falha de consulta | {"error":"failed to simulate","detail":"..."} |
Aplicar o reajuste
Faz o mesmo cálculo da simulação e grava os novos preços, numa transação. Publica o evento price_list.adjusted. Vale na hora para tabelas ativas.
/api/v1/admin/b2b/price-lists/{id}/adjustAdminAplica um reajuste em massa
Parâmetros de caminho
iduuidobrigatórioCorpo da requisição
delta_bpsintegerobrigatório600 = +6%).except_category_idsarrayround_to_centsintegerExemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/b2b/price-lists/3f0c1a52-8d7e-4c1b-9a64-2b5e7d9c1a10/adjust" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{ "delta_bps": 600, "round_to_cents": 10 }'Resposta
{ "items_changed": 1 }Campos da resposta
items_changedintegerErros
| Status | Quando | Corpo |
|---|---|---|
| 400 | JSON inválido | {"error":"invalid request body","detail":"..."} |
| 500 | Id que não é UUID ou falha de gravação (nada é aplicado) | {"error":"failed to adjust price list","detail":"..."} |
Prévia de preço para um cliente
Pergunta à plataforma qual preço um produto teria para um cliente numa quantidade. Usa exatamente o mesmo cálculo da vitrine, do carrinho e do checkout (tabelas, degraus, regras B2B e cotações), então o número nunca diverge do que o comprador vê. O id da tabela no caminho serve para dizer se esta tabela foi a vencedora.
/api/v1/admin/b2b/price-lists/{id}/preview-priceAdminPrévia do preço de um produto para um cliente
Parâmetros de caminho
iduuidobrigatórioCorpo da requisição
product_iduuidobrigatóriocustomer_iduuidquantityintegerpadrão: 1Exemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/b2b/price-lists/3f0c1a52-8d7e-4c1b-9a64-2b5e7d9c1a10/preview-price" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"product_id": "5b6f1948-356b-4739-adfc-af8045b7b769",
"customer_id": "220b672c-90fe-4841-ae86-bd4f1ace982e",
"quantity": 10
}'Resposta
{
"list_match": true,
"result": {
"product_id": "5b6f1948-356b-4739-adfc-af8045b7b769",
"quantity": 10,
"base_price": 28990,
"unit_price": 26250,
"total": 262500,
"price_list_id": "3f0c1a52-8d7e-4c1b-9a64-2b5e7d9c1a10",
"source": "price_list",
"min_order_qty": 1
}
}Campos da resposta
list_matchbooleantrue quando o preço vencedor veio desta tabela. false quando outra regra ou outra tabela de prioridade maior ganhou, ou quando nenhuma tabela se aplica.result.base_priceintegerresult.unit_priceintegerresult.totalintegerunit_price vezes quantity, em centavos.result.sourcestringbasetierb2b_rulequoterep_discountprice_listresult.price_list_iduuidsource é price_list.result.discount_bpsintegerresult.rule_idintegerresult.min_order_qtyintegerErros
| Status | Quando | Corpo |
|---|---|---|
| 400 | JSON inválido | {"error":"invalid request body","detail":"..."} |
| 400 | Sem product_id | {"error":"product_id is required"} |
| 404 | Tabela inexistente | {"error":"price list not found"} |
| 404 | Produto inexistente | {"error":"product not found"} |
| 422 | Falha ao calcular | {"error":"failed to compute price","detail":"..."} |