Fechar a venda
Cria o pedido de uma venda de balcão a partir dos itens lidos no terminal, baixa o estoque e devolve os dados para o recibo.
Quando o caixa conclui a venda, o terminal manda os itens, o cliente e a forma de pagamento para esta rota. A plataforma cria um pedido normal (ele aparece no painel e na lista de pedidos), baixa o estoque dos itens e devolve o número do pedido e o total para o terminal imprimir o recibo.
O preço de cada item é sempre o do catálogo: o price do corpo é ignorado. Frete e desconto são os únicos valores que o terminal controla (shipping_cost e discount, em string decimal).
/api/v1.0/pos_checkoutAdminVenddor 1.0: fechar uma venda de balcão (ids UUID)
Cria o pedido. Exige um usuário administrador. Nomes alternativos em Nomes alternativos do fechamento.
Corpo da requisição
scopestringobrigatórioplace_orderplace_order. Qualquer outro valor responde Unsupported scope. Use scope=place_order.order_agentstringobrigatórioproduct_infoarrayobrigatórioItens da venda. Pelo menos um item que não seja brinde.
product_idstringobrigatório/api/pos_checkout). Um id que não existe recusa a venda.qtyintegerpadrão: 1is_free_productbooleanpadrão: falsetrue, o item é descartado (brinde calculado pelo terminal não vira linha do pedido).selected_optionsobjectpricestringcustomer_infoobjectobrigatórioQuem compra.
emailstringobrigatórioRequired params missing.user_idstring/api). Se faltar, vale o user_id do nível acima.firstnamestringlastnamestringphonestringuser_idstringcustomer_info.user_id não vem.payment_infoobjectPagamento.
payment_typestringpadrão: cashpayment_code devolvido pelo login, por exemplo pix ou pagamento-na-entrega). Sem ele o pedido é gravado como cash.shipping_coststringpadrão: 0"12.50").discountstringpadrão: 0order_commentstringqtyintegercurrency_codestringsubtotalstringtotalstringshipping_idstringcouponsarray/api/pos_checkoutAdminFechar uma venda de balcão, forma sem versão (ids decimais)
Igual a POST /api/v1.0/pos_checkout. Os ids do corpo (product_id, user_id) podem ser decimais, e order_data.order_id volta decimal.
Corpo da requisição
scopestringobrigatórioplace_orderplace_order.order_agentstringobrigatórioproduct_infoarrayobrigatórioproduct_id, qty, is_free_product, selected_options.customer_infoobjectobrigatórioemail (obrigatório), user_id, firstname, lastname.payment_infoobjectpayment_type, o código da forma de pagamento.shipping_coststringpadrão: 0discountstringpadrão: 0order_commentstringExemplo de requisição
curl -X POST "$BASE_URL/api/v1.0/pos_checkout" \
-u "$ADMIN_EMAIL:$API_KEY" \
-H "Content-Type: application/json" \
-d '{
"scope": "place_order",
"order_agent": "caixa-01",
"user_id": "f12f30a9-cbec-40ba-98f1-b7fa8f2e8e10",
"product_info": [
{ "product_id": "d8a6c5e7-8e44-4055-a0e2-49014f5d17f6", "qty": 1 }
],
"customer_info": {
"user_id": "f12f30a9-cbec-40ba-98f1-b7fa8f2e8e10",
"email": "maria.souza@example.com",
"firstname": "Maria",
"lastname": "Souza"
},
"payment_info": { "payment_type": "pagamento-na-entrega" },
"shipping_cost": "0.00",
"discount": "0.00",
"order_comment": "Venda de balcão"
}'Resposta
{
"status": 200,
"data": {
"success": true,
"message": "",
"order_data": {
"order_id": "3f73310d-bfdd-4713-a664-305c08eda58b",
"status": "O",
"date": 1791749845,
"order_info": {
"order_id": "3f73310d-bfdd-4713-a664-305c08eda58b",
"status": "O",
"date": 1791749845,
"total": "1678.95",
"subtotal": "1678.95"
},
"error": []
}
}
}{
"status": 200,
"data": {
"success": false,
"message": "Order creation failed: shipping_service_unavailable: a shipping method is required for physical products",
"order_data": {
"order_id": 0,
"error": [
{ "priority": "error", "message": "shipping_service_unavailable: a shipping method is required for physical products" }
]
}
}
}Campos da resposta
data.successbooleantrue quando o pedido foi criado.data.messagestringdata.order_data.order_idstring/api). Na falha vale o número 0.data.order_data.statusstringdata.order_data.dateintegerdata.order_data.order_infoobjectorder_id, status, date, total e subtotal (strings decimais, em reais).data.order_data.errorarray{priority, message} com o motivo.Erros
Os erros de negócio voltam com HTTP 200 e data.success: false:
data.message | Quando |
|---|---|
Invalid JSON body | O corpo não é um JSON válido. |
Unsupported scope. Use scope=place_order | scope ausente ou diferente de place_order. |
Required params missing: order_agent, product_info, customer_info | Falta order_agent, product_info vazio ou customer_info.email vazio. |
No products in order | Todos os itens são brindes (is_free_product). |
Order creation failed: ... | A plataforma recusou o pedido, por exemplo por produto inexistente ou por exigir forma de envio. O texto depois dos dois-pontos é a mensagem interna e pode mudar. |
| Status | Quando | Corpo |
|---|---|---|
| 401 | Sem credenciais, chave inválida ou token expirado | {"message":"Invalid credentials","status":401} |
| 403 | Usuário que não é administrador | {"message":"Forbidden: admin scope required","status":403} |