B2B, preços e pedidos programados
Como funcionam as tabelas de preço B2B, a quem elas se aplicam e como supervisionar os pedidos programados dos compradores.
No comércio entre empresas (B2B) o mesmo produto raramente custa o mesmo para todo mundo. Um distribuidor paga menos que um varejista, quem compra 100 unidades paga menos que quem compra 1, e um estado pode ter condição própria. Uma tabela de preço (price list) é a política que guarda essas regras: um nome, uma vigência, uma prioridade e uma lista de itens com preço fixo ou desconto, atribuída a empresas, grupos de usuários ou estados.
Estas são as rotas do administrador da loja. A vitrine, o carrinho e o checkout consultam as mesmas tabelas para calcular o preço que cada comprador enxerga. O segundo tema da seção são os pedidos programados (standing orders, também chamados de "grade de entrega"): o comprador agenda compras recorrentes e a plataforma gera um pedido real a cada data. Aqui o administrador apenas supervisiona.
Como funciona
O ciclo de uma tabela
status | Significado | Participa do preço? |
|---|---|---|
draft | Rascunho. Todas as tabelas nascem assim. | Não |
active | Em uso. Vale entre valid_from e valid_until (datas no fuso de São Paulo). | Sim, se atribuída |
archived | Aposentada. Sai do cálculo de preço na hora. | Não |
Uma tabela arquivada pode voltar a active. Só tabelas em draft ou archived podem ser excluídas (exclusão lógica).
Fluxo típico de integração
- Crie a tabela
POST /price-listscom nome, código único e prioridade. Ela nasce em rascunho. - Preencha os itens
PUT /price-lists/{id}/itemspara poucas linhas, ouPOST /importcom um CSV para milhares. - Atribua a quem vale
POST /price-lists/{id}/assignmentscom uma empresa, um grupo de usuários ou um estado. - Ative
POST /price-lists/{id}/activate. A partir daí vitrine, carrinho e checkout usam a tabela. - Confira o preço
POST /price-lists/{id}/preview-pricemostra o preço que um cliente real enxerga. A prévia só considera tabelas ativas e em vigor.
Conceitos importantes
Como o preço de um comprador é escolhido
O comprador entra em uma tabela quando existe uma atribuição que o alcança: a empresa (conta corporativa) dele, um grupo de usuários ao qual pertence ou o estado do endereço padrão. Entre as linhas das tabelas que alcançam o comprador, têm o produto e cujo min_qty cabe na quantidade comprada, vence a de tabela com maior priority; em empate de prioridade, vence o menor preço unitário. As tabelas têm precedência sobre as regras de preço B2B avulsas e sobre o preço base.
Item: preço fixo ou desconto
Cada item é um par produto e quantidade mínima (min_qty), e tem exatamente um de dois campos: price_cents (preço unitário fixo) ou discount_bps (desconto sobre o preço base do produto, de 1 a 10000). Enviar os dois, ou nenhum, é recusado. O reajuste em massa só altera itens de preço fixo, porque os de desconto acompanham o preço base sozinhos.
Atribuição
Uma atribuição liga a tabela a um alvo: corporate_account (id da conta corporativa), usergroup (id do grupo) ou state (UF com 2 letras, gravada em maiúsculas). Se você enviar o id de um usuário como corporate_account, a plataforma troca pelo id da conta corporativa dele quando existir.
Pedido programado
Um pedido programado tem frequência (weekly, biweekly ou monthly), próxima data, itens e, opcionalmente, fim ou número de ocorrências. Uma rotina diária (05:00, horário de São Paulo) gera um pedido real por data, com o preço vigente no dia (não o do dia em que a grade foi criada). Três falhas seguidas pausam a grade sozinha.
Endpoints
| Método e caminho | Para que serve | Auth | Página |
|---|---|---|---|
GET /api/v1/admin/b2b/price-lists | Lista as tabelas | admin | Tabelas de preço |
POST /api/v1/admin/b2b/price-lists | Cria uma tabela em rascunho | admin | Tabelas de preço |
GET /api/v1/admin/b2b/price-lists/{id} | Detalha uma tabela | admin | Tabelas de preço |
PUT /api/v1/admin/b2b/price-lists/{id} | Altera nome, vigência, prioridade | admin | Tabelas de preço |
DELETE /api/v1/admin/b2b/price-lists/{id} | Exclui (só rascunho ou arquivada) | admin | Tabelas de preço |
POST /api/v1/admin/b2b/price-lists/{id}/activate | Ativa | admin | Ativar, arquivar, duplicar |
POST /api/v1/admin/b2b/price-lists/{id}/archive | Arquiva | admin | Ativar, arquivar, duplicar |
POST /api/v1/admin/b2b/price-lists/{id}/duplicate | Clona como rascunho | admin | Ativar, arquivar, duplicar |
GET /api/v1/admin/b2b/price-lists/{id}/items | Lista os itens | admin | Itens |
PUT /api/v1/admin/b2b/price-lists/{id}/items | Cria ou atualiza itens em lote | admin | Itens |
GET /api/v1/admin/b2b/price-lists/{id}/export | Baixa os itens em CSV | admin | Itens |
POST /api/v1/admin/b2b/price-lists/{id}/import | Importa itens de um CSV | admin | Itens |
GET /api/v1/admin/b2b/price-lists/{id}/assignments | Lista as atribuições | admin | Atribuições |
POST /api/v1/admin/b2b/price-lists/{id}/assignments | Atribui a um alvo | admin | Atribuições |
DELETE /api/v1/admin/b2b/price-lists/{id}/assignments/{assignmentId} | Remove uma atribuição | admin | Atribuições |
POST /api/v1/admin/b2b/price-lists/{id}/simulate | Simula um reajuste em massa | admin | Simulador e reajuste |
POST /api/v1/admin/b2b/price-lists/{id}/adjust | Aplica o reajuste em massa | admin | Simulador e reajuste |
POST /api/v1/admin/b2b/price-lists/{id}/preview-price | Preço de um produto para um cliente | admin | Simulador e reajuste |
GET /api/v1/admin/b2b/standing-orders | Lista pedidos programados da loja | admin | Pedidos programados |
GET /api/v1/admin/b2b/standing-orders/forecast | Projeta a demanda futura | admin | Pedidos programados |
POST /api/v1/admin/b2b/standing-orders/{id}/pause | Pausa uma grade | admin | Pedidos programados |
POST /api/v1/admin/b2b/standing-orders/{id}/cancel | Cancela uma grade | admin | Pedidos programados |
Erros comuns
- Ativar uma tabela e esquecer a atribuição. Ela fica
activemas ninguém recebe o preço. Confiraassignment_countna listagem. - Enviar
price_centsediscount_bpsjuntos. O item é recusado: cada linha leva exatamente um dos dois. - Enviar preço em reais. A API usa centavos:
262.50está errado, o certo é26250. Só o CSV usa o formato brasileiro (262,50). - Reutilizar o
codede outra tabela. O código é único entre as tabelas não excluídas; a criação falha com400. - Tentar excluir uma tabela ativa. Arquive primeiro. A exclusão só vale para rascunho ou arquivada (
409). - Esperar que a duplicata copie atribuições. A cópia leva os itens, mas nasce como rascunho e sem atribuições.
- Passar um id mal formado. Um id que não é UUID devolve
500(não404); um UUID válido que não existe devolve404. O id0devolve400 invalid id parameter.