Cotações
Acompanha os pedidos de cotação de clientes B2B e recusa os que não devem seguir.
Em vendas B2B (empresa para empresa), o comprador muitas vezes não paga o preço de tabela: ele pede uma cotação (RFQ, "request for quotation") a um seller com os produtos e as quantidades que quer. O seller responde com os preços que oferece e uma validade. O comprador aceita, e a cotação vira carrinho. O administrador acompanha tudo isso e pode recusar uma cotação.
Saídas alternativas: rejected (recusada) e expired (a validade passou). Em negociação em rodadas, o estado negotiating fica entre pending e accepted.
Listar cotações
Lista os pedidos de cotação de todos os sellers, do mais recente ao mais antigo. Cada linha traz o cliente, o seller, o estado e o total, mas não os itens (use Consultar uma cotação).
/api/v1/admin/quotesAdminLista as cotações B2B
Autenticação: Authorization: Bearer <token> de um administrador com manage_b2b ou manage_orders. Requer o módulo b2b-pricing ativo.
Parâmetros de consulta
statusstringpendingquotednegotiatingacceptedconvertedrejectedexpiredpending, quoted, negotiating, accepted, converted, rejected, expired) ou a letra (P, Q, N, A, C, R, E).vendor_iduuiduser_iduuidpageintegerpadrão: 1per_pageintegerpadrão: 20Exemplo de requisição
curl "$BASE_URL/api/v1/admin/quotes?status=quoted" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"quotes": [
{
"id": 69,
"user_id": "220b672c-90fe-4841-ae86-bd4f1ace982e",
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"status": "quoted",
"notes": "Preciso de 5 unidades para o escritório novo",
"vendor_notes": "Prazo de entrega de 7 dias",
"total_cents": 20000,
"valid_until": "2026-11-10T07:04:19Z",
"created_at": "2026-10-01T07:01:32Z",
"updated_at": "2026-10-02T09:00:00Z",
"user_email": "ana.souza@example.com",
"user_name": "Ana Souza",
"vendor_name": "Loja Seller Teste",
"item_count": 1
}
],
"total": 1,
"page": 1,
"per_page": 20,
"total_pages": 1
}Campos da resposta
quotesarrayquotes[].idintegerquotes[].user_iduuidquotes[].vendor_iduuidquotes[].statusstringpendingquotednegotiatingacceptedconvertedrejectedexpiredpending (pedida), quoted (o seller respondeu com preços), negotiating, accepted, converted (virou carrinho), rejected, expired.quotes[].notesstringquotes[].vendor_notesstringquotes[].total_centsintegerquotes[].valid_untilstringquotes[].created_atstringquotes[].updated_atstringquotes[].user_emailstringquotes[].user_namestringquotes[].vendor_namestringquotes[].item_countintegertotalintegerpageintegerper_pageintegertotal_pagesintegerErros
| Status | Quando | Corpo |
|---|---|---|
| 401 | Sem token ou token inválido | {"error":"missing authorization header"} |
| 403 | Sem o privilégio exigido, ou módulo desligado | {"error":"module_disabled","module":"b2b-pricing"} / {"error":"insufficient privileges","required":"manage_b2b"} |
| 500 | vendor_id/user_id que não é UUID ou falha na consulta | {"error":"failed to list quotes","detail":"..."} |
Consultar uma cotação
Devolve a cotação com os itens, os preços pedidos e os preços oferecidos.
/api/v1/admin/quotes/{id}AdminConsulta uma cotação com os itens
Autenticação: Authorization: Bearer <token> de um administrador com manage_b2b ou manage_orders. Requer o módulo b2b-pricing ativo.
Parâmetros de caminho
idintegerobrigatórioExemplo de requisição
curl "$BASE_URL/api/v1/admin/quotes/69" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"id": 69,
"user_id": "220b672c-90fe-4841-ae86-bd4f1ace982e",
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"status": "quoted",
"notes": "Preciso de 5 unidades para o escritório novo",
"vendor_notes": "Prazo de entrega de 7 dias",
"total_cents": 20000,
"valid_until": "2026-11-10T07:04:19Z",
"created_at": "2026-10-01T07:01:32Z",
"updated_at": "2026-10-02T09:00:00Z",
"user_email": "ana.souza@example.com",
"user_name": "Ana Souza",
"vendor_name": "Loja Seller Teste",
"item_count": 1,
"items": [
{
"id": 98,
"quote_id": 69,
"product_id": "c7bc3778-2c79-4561-b9d7-979768f364c8",
"quantity": 5,
"offered_price_cents": 4000,
"notes": "",
"product_name": "Notebook Plus Rosa",
"product_sku": "SD-000507",
"product_price": 6990
}
]
}Campos da resposta
idintegeruser_iduuidvendor_iduuidstatusstringpendingquotednegotiatingacceptedconvertedrejectedexpiredpending (pedida), quoted (o seller respondeu com preços), negotiating, accepted, converted (virou carrinho), rejected, expired.notesstringvendor_notesstringtotal_centsintegervalid_untilstringcreated_atstringupdated_atstringuser_emailstringuser_namestringvendor_namestringitemsarrayitems[].idintegeritems[].quote_idintegeritems[].product_iduuiditems[].quantityintegeritems[].requested_price_centsintegeritems[].offered_price_centsintegeritems[].notesstringitems[].product_namestringitems[].product_skustringitems[].product_priceintegerErros
| Status | Quando | Corpo |
|---|---|---|
| 401 | Sem token ou token inválido | {"error":"missing authorization header"} |
| 403 | Sem o privilégio exigido, ou módulo desligado | {"error":"module_disabled","module":"b2b-pricing"} / {"error":"insufficient privileges","required":"manage_b2b"} |
| 400 | id que não é número | {"error":"invalid quote id"} |
| 404 | Cotação inexistente | {"error":"quote not found"} |
Recusar uma cotação
Muda a cotação para rejected. É a única alteração de estado que o administrador pode fazer aqui: responder com preços é do seller, e aceitar é do cliente. Só cotações pending ou quoted podem ser recusadas.
/api/v1/admin/quotes/{id}AdminRecusa uma cotação (única mudança permitida ao administrador)
Autenticação: Authorization: Bearer <token> de um administrador com manage_b2b ou manage_orders. Requer o módulo b2b-pricing ativo.
Parâmetros de caminho
idintegerobrigatórioCorpo da requisição
statusstringobrigatóriorejectedrejected.Exemplo de requisição
curl -X PUT "$BASE_URL/api/v1/admin/quotes/69" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"status": "rejected"
}'Resposta
{
"id": 69,
"user_id": "220b672c-90fe-4841-ae86-bd4f1ace982e",
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"status": "rejected",
"notes": "Preciso de 5 unidades para o escritório novo",
"vendor_notes": "Prazo de entrega de 7 dias",
"total_cents": 20000,
"valid_until": "2026-11-10T07:04:19Z",
"created_at": "2026-10-01T07:01:32Z",
"updated_at": "2026-10-02T09:00:00Z",
"user_email": "ana.souza@example.com",
"user_name": "Ana Souza",
"vendor_name": "Loja Seller Teste",
"item_count": 1,
"items": [
{
"id": 98,
"quote_id": 69,
"product_id": "c7bc3778-2c79-4561-b9d7-979768f364c8",
"quantity": 5,
"offered_price_cents": 4000,
"notes": "",
"product_name": "Notebook Plus Rosa",
"product_sku": "SD-000507",
"product_price": 6990
}
]
}Campos da resposta
idintegeruser_iduuidvendor_iduuidstatusstringpendingquotednegotiatingacceptedconvertedrejectedexpiredpending (pedida), quoted (o seller respondeu com preços), negotiating, accepted, converted (virou carrinho), rejected, expired.notesstringvendor_notesstringtotal_centsintegervalid_untilstringcreated_atstringupdated_atstringuser_emailstringuser_namestringvendor_namestringitemsarrayitems[].idintegeritems[].quote_idintegeritems[].product_iduuiditems[].quantityintegeritems[].requested_price_centsintegeritems[].offered_price_centsintegeritems[].notesstringitems[].product_namestringitems[].product_skustringitems[].product_priceintegerErros
| Status | Quando | Corpo |
|---|---|---|
| 401 | Sem token ou token inválido | {"error":"missing authorization header"} |
| 403 | Sem o privilégio exigido, ou módulo desligado | {"error":"module_disabled","module":"b2b-pricing"} / {"error":"insufficient privileges","required":"manage_b2b"} |
| 400 | id que não é número, corpo inválido ou status diferente de rejected | {"error":"only 'rejected' status is supported via admin update"} |
| 500 | Cotação inexistente ou já em outro estado que não permite recusar | {"error":"failed to reject quote","detail":"quote not found or not in rejectable status"} |