Cotações: ofertas e conversão
Registra ofertas de fornecedores, converte a vencedora em pedido de compra, cancela ou apaga a cotação.
Registrar ofertas
Grava uma ou mais ofertas numa cotação aberta. Enviar de novo a oferta do mesmo fornecedor para o mesmo item atualiza o preço em vez de duplicar. Tudo ou nada: se uma oferta for inválida, nenhuma é gravada.
/api/v1/vendor/erp/cotacoes/{id}/offersSellerRegistra ofertas de fornecedores
Parâmetros de caminho
iduuidobrigatórioCorpo da requisição
offersarrayobrigatórioOfertas. Ao menos uma.
quote_item_iduuidobrigatórioitems[].id).supplier_iduuidobrigatóriounit_cost_centsintegerobrigatóriolead_time_daysintegernotesstringExemplo de requisição: Registrar ofertas
curl -X POST "$BASE_URL/api/v1/vendor/erp/cotacoes/3f6c1c1e-8d0b-4a55-9a52-1d6f6a4a7b10/offers" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"offers": [
{
"quote_item_id": "9a1b2c3d-4e5f-4a6b-8c7d-0e1f2a3b4c5d",
"supplier_id": "e3d204f2-582c-4b7e-bac0-f46214d52c12",
"unit_cost_cents": 4500,
"lead_time_days": 7,
"notes": "Frete incluso"
}
]
}'Resposta: Registrar ofertas
{
"id": "c41a9e07-6f2b-4d83-b0a5-2e7d9f1c3a68",
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"code": "COT-000001",
"status": "open",
"deadline_at": "2026-10-20T00:00:00Z",
"notes": "Cotação de outubro",
"created_at": "2026-10-11T14:30:00Z",
"updated_at": "2026-10-11T14:30:00Z",
"item_count": 1,
"items": [
{
"id": "9a1b2c3d-4e5f-4a6b-8c7d-0e1f2a3b4c5d",
"quote_id": "c41a9e07-6f2b-4d83-b0a5-2e7d9f1c3a68",
"product_id": "94e6917e-8733-4ddc-b446-ed85977117e8",
"product_name": "Camiseta Básica Preta M",
"quantity": 100,
"offers": [
{
"id": "e2b4c6d8-1a3c-4e5f-9b7d-0a2c4e6f8b10",
"quote_item_id": "9a1b2c3d-4e5f-4a6b-8c7d-0e1f2a3b4c5d",
"supplier_id": "e3d204f2-582c-4b7e-bac0-f46214d52c12",
"supplier_name": "Distribuidora Aurora Ltda",
"unit_cost_cents": 4500,
"lead_time_days": 7,
"notes": "Frete incluso",
"created_at": "2026-10-11T14:30:00Z"
}
]
}
]
}Campos da resposta
iduuidvendor_iduuidcodestringCOT-000001, sequencial por seller.statusstringopenclosedcancelleddeadline_atdatetimenull se não definido.notesstringcreated_atdatetimeupdated_atdatetimeitem_countintegeritemsarrayItens e ofertas. Vazio na listagem.
iduuidquote_iduuidproduct_iduuidproduct_namestringquantityintegeroffersarrayOfertas dos fornecedores, da mais barata para a mais cara.
iduuidquote_item_iduuidsupplier_iduuidsupplier_namestringunit_cost_centsintegerlead_time_daysintegernull se não informado.notesstringcreated_atdatetimeErros: Registrar ofertas
| Status | Quando | Corpo |
|---|---|---|
| 400 | Corpo não é um JSON válido. | {"error":"invalid request body","detail":"invalid character 'b' looking for beginning of object key string"} |
| 400 | offers vazio. | {"error":"vendorerp: at least one offer required"} |
| 400 | A cotação não está open. | {"error":"vendorerp: quote is not open"} |
| 400 | Oferta sem item ou fornecedor. | {"error":"vendorerp: quote_item_id and supplier_id required"} |
| 400 | Preço negativo. | {"error":"vendorerp: unit cost cannot be negative"} |
| 404 | A cotação, o item ou o fornecedor não existe. | {"error":"quote item not found"} |
| 401 | Cabeçalho Authorization ausente, token inválido, expirado ou revogado. | {"error":"missing authorization header"} |
| 403 | O token não é de um usuário seller (por exemplo, é de administrador). | {"error":"insufficient permissions"} |
| 403 | O usuário não está vinculado a um seller, ou o cadastro do seller ainda está em análise (vendor_pending_review). | {"error":"no vendor account associated with this user"} |
Converter em pedido
Escolhe um fornecedor vencedor e gera um pedido de compra em draft com os preços das ofertas dele. Só entram os itens para os quais esse fornecedor deu oferta; os demais ficam de fora sem aviso. A cotação passa a closed.
/api/v1/vendor/erp/cotacoes/{id}/convertSellerConverte a cotação em pedido de compra
Parâmetros de caminho
iduuidobrigatórioCorpo da requisição
supplier_iduuidobrigatórioExemplo de requisição: Converter em pedido
curl -X POST "$BASE_URL/api/v1/vendor/erp/cotacoes/3f6c1c1e-8d0b-4a55-9a52-1d6f6a4a7b10/convert" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"supplier_id": "e3d204f2-582c-4b7e-bac0-f46214d52c12"
}'Resposta: Converter em pedido
{
"purchase_order_id": "047a8f24-473b-4638-bc0e-2c159c1fcca2",
"total_cents": 450000,
"item_count": 1
}Campos da resposta
purchase_order_iduuidtotal_centsintegeritem_countintegerErros: Converter em pedido
| Status | Quando | Corpo |
|---|---|---|
| 400 | Corpo não é um JSON válido. | {"error":"invalid request body","detail":"invalid character 'b' looking for beginning of object key string"} |
| 400 | supplier_id em branco. | {"error":"vendorerp: supplier_id required"} |
| 400 | A cotação não está open. | {"error":"vendorerp: quote is not open"} |
| 400 | O fornecedor não ofereceu em nenhum item. | {"error":"vendorerp: supplier has no offers on this quote"} |
| 404 | A cotação não existe ou é de outro seller. | {"error":"quote not found"} |
| 404 | O fornecedor não existe ou é de outro seller. | {"error":"supplier not found"} |
| 401 | Cabeçalho Authorization ausente, token inválido, expirado ou revogado. | {"error":"missing authorization header"} |
| 403 | O token não é de um usuário seller (por exemplo, é de administrador). | {"error":"insufficient permissions"} |
| 403 | O usuário não está vinculado a um seller, ou o cadastro do seller ainda está em análise (vendor_pending_review). | {"error":"no vendor account associated with this user"} |
Cancelar cotação
/api/v1/vendor/erp/cotacoes/{id}/cancelSellerCancela uma cotação aberta
Parâmetros de caminho
iduuidobrigatórioExemplo de requisição: Cancelar cotação
curl -X POST "$BASE_URL/api/v1/vendor/erp/cotacoes/3f6c1c1e-8d0b-4a55-9a52-1d6f6a4a7b10/cancel" \
-H "Authorization: Bearer $TOKEN"Resposta: Cancelar cotação
{
"id": "c41a9e07-6f2b-4d83-b0a5-2e7d9f1c3a68",
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"code": "COT-000001",
"status": "cancelled",
"deadline_at": "2026-10-20T00:00:00Z",
"notes": "Cotação de outubro",
"created_at": "2026-10-11T14:30:00Z",
"updated_at": "2026-10-11T14:30:00Z",
"item_count": 1,
"items": [
{
"id": "9a1b2c3d-4e5f-4a6b-8c7d-0e1f2a3b4c5d",
"quote_id": "c41a9e07-6f2b-4d83-b0a5-2e7d9f1c3a68",
"product_id": "94e6917e-8733-4ddc-b446-ed85977117e8",
"product_name": "Camiseta Básica Preta M",
"quantity": 100,
"offers": [
{
"id": "e2b4c6d8-1a3c-4e5f-9b7d-0a2c4e6f8b10",
"quote_item_id": "9a1b2c3d-4e5f-4a6b-8c7d-0e1f2a3b4c5d",
"supplier_id": "e3d204f2-582c-4b7e-bac0-f46214d52c12",
"supplier_name": "Distribuidora Aurora Ltda",
"unit_cost_cents": 4500,
"lead_time_days": 7,
"notes": "Frete incluso",
"created_at": "2026-10-11T14:30:00Z"
}
]
}
]
}Campos da resposta
iduuidvendor_iduuidcodestringCOT-000001, sequencial por seller.statusstringopenclosedcancelleddeadline_atdatetimenull se não definido.notesstringcreated_atdatetimeupdated_atdatetimeitem_countintegeritemsarrayItens e ofertas. Vazio na listagem.
iduuidquote_iduuidproduct_iduuidproduct_namestringquantityintegeroffersarrayOfertas dos fornecedores, da mais barata para a mais cara.
iduuidquote_item_iduuidsupplier_iduuidsupplier_namestringunit_cost_centsintegerlead_time_daysintegernull se não informado.notesstringcreated_atdatetimeErros: Cancelar cotação
| Status | Quando | Corpo |
|---|---|---|
| 400 | A cotação não está open. | {"error":"cannot cancel quote in status \"closed\""} |
| 404 | A cotação não existe ou é de outro seller. | {"error":"quote not found"} |
| 401 | Cabeçalho Authorization ausente, token inválido, expirado ou revogado. | {"error":"missing authorization header"} |
| 403 | O token não é de um usuário seller (por exemplo, é de administrador). | {"error":"insufficient permissions"} |
| 403 | O usuário não está vinculado a um seller, ou o cadastro do seller ainda está em análise (vendor_pending_review). | {"error":"no vendor account associated with this user"} |
Apagar cotação
Exclusão lógica em qualquer estado. O pedido de compra já gerado a partir dela não é afetado.
/api/v1/vendor/erp/cotacoes/{id}SellerApaga uma cotação
Parâmetros de caminho
iduuidobrigatórioExemplo de requisição: Apagar cotação
curl -X DELETE "$BASE_URL/api/v1/vendor/erp/cotacoes/3f6c1c1e-8d0b-4a55-9a52-1d6f6a4a7b10" \
-H "Authorization: Bearer $TOKEN"Resposta: Apagar cotação
{
"message": "quote deleted"
}Campos da resposta
messagestringquote deleted.Erros: Apagar cotação
| Status | Quando | Corpo |
|---|---|---|
| 404 | A cotação não existe ou é de outro seller. | {"error":"quote not found"} |
| 401 | Cabeçalho Authorization ausente, token inválido, expirado ou revogado. | {"error":"missing authorization header"} |
| 403 | O token não é de um usuário seller (por exemplo, é de administrador). | {"error":"insufficient permissions"} |
| 403 | O usuário não está vinculado a um seller, ou o cadastro do seller ainda está em análise (vendor_pending_review). | {"error":"no vendor account associated with this user"} |