# Consumo de Pedidos - Queues

Quando criado no marketplace, o pedido tem suas informações encaminhadas para a API, cabendo a plataforma/ERP o consumo de seus dados. O mesmo ocorre para atualizações do pedido: A informação será disponibilizada na API para consumo da plataforma/ERP.

Tanto criação quanto atualização serão notificadas pelo marketplace e deverão ser consumidas no recurso `/queues/orders`.

## GET - Baixando pedidos (fila de integração)

Quando um pedido é gerado ou tem o status atualizado pelo o marketplace ele (pedido) é colocado em uma fila de integração e fica disponível para a baixa, que deve ser realizada através de um GET no endpoint visto a seguir:

```
https://api.skyhub.com.br/queues/orders
```

#### **Request headers:**

| Key                  | Value                                       |
| -------------------- | ------------------------------------------- |
| X-User-Email         | email\_de\_usuario                          |
| X-Api-Key            | token\_de\_integracao de sua conta SkyHub   |
| X-Accountmanager-Key | token\_account único de cada Plataforma/ERP |
| Accept               | application/json                            |
| Content-Type         | application/json                            |

#### **Example request:**

```
curl --location --request GET 'https://api.skyhub.com.br/queues/orders' \
--header 'X-User-Email: email_de_usuario' \
--header 'X-Api-Key: token_de_integracao de sua conta SkyHub' \
--header 'X-Accountmanager-Key: token_account único de cada Plataforma/ERP' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json'
```

#### Response esperado:

Dois possíveis retornos são esperados para o GET: &#x20;

{% hint style="success" %} <mark style="color:green;">**204**</mark> \[Success] - No content: Retorno esperado caso não hajam pedidos novos/atualizados para consumo;
{% endhint %}

{% hint style="success" %} <mark style="color:green;">**200**</mark> \[Success] - OK: Caso existam pedidos novos/atualizados, será visualizado status 200 e o response body trará as informações da entrega, conforme exemplo:
{% endhint %}

```
{
    "channel": "AMERICANAS",
    "calculation_type": "b2wentregacorreios",
    "shipping_carrier": "Courier",
    "invoices": [],
    "tags": [],
    "expedition_limit_date": null,
    "code": "Lojas Americanas-1000000000005",
    "approved_date": "",
    "delivered_date": null,
    "shipping_cost": 0.0,
    "shipped_date": "",
    "items": [
        {
            "special_price": 39.9,
            "shipping_cost": null,
            "remote_store_id": null,
            "qty": 1,
            "product_id": "2023001",
            "original_price": 39.9,
            "name": "Camiseta Branca Tam. Único",
            "listing_type_id": null,
            "id": "2023001",
            "gift_wrap": null,
            "detail": null,
            "delivery_line_id": null
        }
    ],
    "imported_at": "2023-03-27T16:48:07-03:00",
    "import_info": {
        "ss_name": "Lojas Americanas",
        "remote_id": null,
        "remote_code": "1000000000005",
        "pack_id": null,
        "cart_id": null
    },
    "target_order": null,
    "shipping_method": "Courier",
    "shipping_address": {
        "street": "Avenida Paulista",
        "secondary_phone": "99 999999999",
        "region": "SP",
        "reference": null,
        "postcode": "90000000",
        "phone": "99 999999999",
        "number": "1000",
        "neighborhood": "Bela Vista",
        "full_name": "João dos Santos",
        "detail": "Ao lado da cafeteria",
        "country": "BR",
        "complement": null,
        "city": "São Paulo"
    },
    "sync_sale_system": null,
    "discount": 0.0,
    "first_exported_at": null,
    "billing_address": {
        "street": "Avenida Paulista",
        "secondary_phone": "99 999999999",
        "region": "SP",
        "reference": null,
        "postcode": "90000000",
        "phone": "99 999999999",
        "number": "1234",
        "neighborhood": "Bela Vista",
        "full_name": "João dos Santos",
        "detail": "Próximo ao museu",
        "country": "BR",
        "complement": null,
        "city": "São Paulo"
    },
    "interest": 0.0,
    "available_to_sync": true,
    "payments": [
        {
            "value": 39.9,
            "type": null,
            "transaction_date": null,
            "status": null,
            "sefaz": {
                "type_integration": null,
                "payment_indicator": null,
                "name_payment": null,
                "name_card_issuer": null,
                "id_payment": null,
                "id_card_issuer": null
            },
            "parcels": 1,
            "method": "CREDIT_CARD",
            "description": "SkyHub",
            "card_issuer": null,
            "autorization_id": null
        }
    ],
    "placed_at": "2023-03-27T16:48:07-03:00",
    "delivery_contract_type": "",
    "shipping_estimate_id": "",
    "linked_order": null,
    "estimated_delivery_shift": null,
    "shipping_method_id": null,
    "estimated_delivery": "2023-03-30T00:00:00-03:00",
    "id": "6000f0f0d0ee0000000f0e00",
    "shipments": [],
    "total_ordered": 39.9,
    "updated_at": "2023-03-27T16:48:07-03:00",
    "status": {
        "type": "NEW",
        "label": "Pagamento Pendente (new) (SkyHub)",
        "code": "book_product"
    },
    "customer": {
        "vat_number": "23455567899",
        "phones": [
            "99 999999999"
        ],
        "name": "João dos Santos",
        "gender": "male",
        "email": "comprador@exemplo.com.br",
        "date_of_birth": "1989-01-01"
    },
    "delivery_token": {
        "takeout": null,
        "failure": null,
        "customer": null
    },
    "sync_status": "NOT_SYNCED",
    "exported_at": null
}
```

{% hint style="danger" %}
Através da `queues` <mark style="color:red;">**não**</mark>**&#x20;é possível consumir um pedido especificamente**. A fila deverá ser consumida **por completo** com as informações disponibilizadas pelo marketplace.

Suponha-se que existam 20 pedidos gerados/atualizados pelo marketplace; as notificações cairão na fila aleatoriamente, porém visando aquelas mais recentes, sendo de responsabilidade da plataforma/ERP o consumo de todas as informações disponibilizadas.

Mantendo a fila de integração "limpa", isto é, consumindo sempre todos os pedidos, garante-se que todos os novos gerados e todas as alterações de status estarão atualizados na plataforma/ERP.
{% endhint %}

{% hint style="warning" %}
**O consumo do pedido sempre trará o campo calculation\_type, responsável por identificar o método de cálculo de frete.**

Sempre que o **calculation\_type** for preenchido com o valor `b2wentregadirect`, espera-se para o payload o *array* **pick\_ups** contendo informações da warehouse (CD) e SKU de venda.&#x20;

Por padrão, o *array* **pick\_ups** é incluso apenas para pedidos `b2wentregadirect`, desta forma, para pedidos cujo **calculation\_type** for `b2wentregacorreios` não haverá a inclusão do referido *array* (**pick\_ups**).&#x20;
{% endhint %}

### Dicas sobre a fila de integração de pedidos

#### -> Verificar o campo status\[code]

Ao recuperar um pedido da fila, a integração deve verificar o campo status\[code] para saber qual foi o tipo de evento: pedido **novo** ou uma **atualização** (aprovação ou cancelamento).

#### -> O GET na */queues/orders* sempre irá retornar o status atual do pedido

O pedido entra na fila sempre que receber alguma atualização proveniente do marketplace e para a plataforma/ERP será disponibilizada a informação da última alteração sofrida.

Imagine o seguinte cenário:

1. O pedido é gerado no marketplace (status **NEW**) e entra na fila (`/`*`queues/orders`*);<br>
2. A plataforma/ERP <mark style="color:red;">**não**</mark> consome o recurso `/`*`queues/orders`*;<br>
3. O pedido tem o pagamento confirmado no marketplace (status **APPROVED**) e esta atualização entra novamente na fila `/`*`queues/orders`*;<br>
4. Nesse momento a integração faz uma chamada `GET` `/`*`queues/orders`*. O *JSON* do pedido retornado conterá o status <mark style="color:green;">**APPROVED**</mark> (status atual do pedido) ao invés do status <mark style="color:red;">**NEW**</mark> (status que o pedido tinha quando entrou na fila pela primeira vez);<br>
5. Como o pedido entrou duas vezes na fila e não havia sido consumido, ao ser repetida a chamada `GET` `/`*`queues/orders`* (sem que haja uma nova atualização do marketplace), a integração receberá o mesmo *JSON* novamente.

#### -> Estoque Disponível x Estoque Empenhado

É obrigatório consumir todos os pedidos da fila de integração (*/queues*) com status **NEW** para que os produtos sejam empenhados em seus estoques.

Esta obrigatoriedade se dá para que sejam evitadas divergências entre o **estoque disponível** e o **estoque empenhado**.&#x20;

O que pode acontecer caso não consuma todos os status do pedido? Ao não consumir o status de NEW não haverá empenho de estoque na plataforma, assim a API receberá a informação de que há estoque disponível para venda, consequentemente, poderão haver vendas sem estoque.

{% hint style="info" %}
**Vale lembrar:**

* As plataformas que não se adequarem a essa regra de negócios podem arcar com prejuízo do *seller*;
* Para a API deve ser enviado apenas o estoque disponível para venda.
  {% endhint %}

## **DELETE - Confirmando o consumo do pedido**

Após o GET na */queues/orders* o pedido apresentado sairá da fila de integração e ficará aguardando por 5 minutos para que a plataforma/ERP confirme o seu processamento. Esta confirmação é realizada utilizando os [headers](#request-headers) padrões na API e aplicando um DELETE no endpoint:

```
https://api.skyhub.com.br/queues/orders/{code}
```

{% hint style="info" %}
O {**code**} a ser utilizado é o **código de identificação do pedido**, visualizado após o GET.

No [exemplo](#example-request) disponibilizado acima, temos o "code": "Lojas Americanas-1000000000005".
{% endhint %}

{% hint style="warning" %}
Se em até <mark style="color:red;">**5 minutos**</mark> a API não receber a confirmação de que a integração conseguiu processar o pedido com sucesso, o mesmo voltará para a fila, ou seja, após o GET na */queues/orders* a plataforma/ERP tem até 5 minutos para realizar a confirmação do consumo da informação.

Caso o sistema tente confirmar o consumo (DELETE) após os 5 minutos sem que haja um novo GET na */queues/orders* será retornado status <mark style="color:red;">**404**</mark>.&#x20;
{% endhint %}

#### Example request:

<pre><code><strong>curl --location --request DELETE 'https://api.skyhub.com.br/queues/orders/Lojas Americanas-1000000000005' \
</strong>--header 'X-User-Email: email_de_usuario' \
--header 'X-Api-Key: token_de_integracao de sua conta SkyHub' \
--header 'X-Accountmanager-Key: token_account único de cada Plataforma/ERP' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json'
</code></pre>

#### Response esperado:

{% hint style="success" %} <mark style="color:green;">**204**</mark> \[Success] - No content
{% endhint %}

{% hint style="info" %}
Importante que como boa prática aconselhamos que seja realizado o **DELETE** logo na sequência do **GET**, para evitar possíveis furos no consumo de pedidos.
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://desenvolvedores.skyhub.com.br/pedidos/consumo-de-pedidos-queues.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
