# 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 %}
