Skip to content

🕒 Histórico de Grupo de Pedido

📋 Visão Geral

O módulo de Histórico de Grupo de Pedido registra todas as alterações realizadas em um grupo de pedido ao longo do seu ciclo de vida — desde a criação da remessa até mudanças de status, atualizações de frete, emissão de nota fiscal, troca de armazém, movimentações financeiras e edições manuais de dados cadastrais.

Cada registro captura quem realizou a ação, quando ocorreu e qual foi o estado anterior (before) e o estado posterior (after) da alteração. Isso torna o histórico uma ferramenta essencial para auditoria, diagnóstico e rastreabilidade operacional.

🔄 Entidades Envolvidas

O histórico (OrderHistory) é uma tabela unificada que consolida dois conjuntos de eventos: os eventos de remessa (criação, status, frete, nota fiscal, armazém, alterações financeiras) e os eventos de grupo (atualização de cliente e endereço). A listagem retorna ambos, identificados pelo campo origin.

Cada registro armazena snapshots completos de before e after — a estrutura desses objetos varia conforme a action, podendo conter dados de status, rastreamento, nota fiscal, armazém, movimentações financeiras ou dados cadastrais do cliente e endereço.

Quando userId, userName e userEmail são null, a ação foi realizada pelo próprio sistema — sem intervenção manual, como na criação automática da remessa no checkout.

📌 Notas e Considerações

  • A listagem suporta filtros por origin, action, userName, userEmail e createdAt, além de ordenação por id e createdAt e paginação.
  • O campo newOrderStatusId é preenchido apenas para action: change-status; é null nos demais registros.
  • Os campos orderId e orderGroupId identificam a qual remessa ou grupo o evento pertence — ambos podem coexistir no mesmo registro.

🕒 Histórico de Grupo de Pedido

GET /orders/groups/{orderGroupId}/history

Lista o histórico de alterações de um grupo de pedido

📋 Descrição

Endpoint responsável por listar o histórico completo de alterações de um grupo de pedido, retornando cada evento registrado em ordem cronológica com os dados de quem realizou a ação, qual foi a mudança e quando ocorreu.

Cada registro contém os campos before e after com o snapshot do estado antes e depois da alteração — permitindo reconstruir com precisão toda a linha do tempo do pedido. A estrutura desses campos varia conforme o tipo de ação (action), podendo conter dados de status, rastreamento, nota fiscal, armazém, movimentações financeiras ou dados cadastrais do cliente e endereço.

Ações realizadas pelo próprio sistema (sem intervenção manual) terão userId, userName e userEmail com valor null — como a criação automática da remessa no checkout.

Suporta filtros, ordenação e paginação para facilitar a navegação em pedidos com muitos registros.

🔐 Permissão

  • UserAuth — autenticação do usuário administrativo
  • ORDER_READ — escopo de permissão para leitura de pedidos e histórico de alterações

📝 Parâmetros

🏷️ Headers Obrigatórios

HeaderValorDescrição
AuthorizationBearer {token}Token de autenticação do usuário

🔗 Parâmetros de URL

ParâmetroTipoObrigatórioDescrição
orderGroupIdinteger✅ SimID do grupo de pedido

📦 Parâmetros do Corpo (opcional)

1{
2 "order": [
3 { "field": "id", "order": "asc" }
4 ],
5 "condition": {
6 "type": "AND",
7 "conditions": [
8 { "field": "userName", "operator": "=", "value": "João" }
9 ]
10 },
11 "pagination": {
12 "limit": 10,
13 "offset": 0
14 }
15}

Campos de Condição Disponíveis

Cada item do array conditions aceita os campos field, operator e value.

fieldDescrição
originOrigem da alteração — ex: status, shipping, customer
actionAção registrada — ex: change-status, update-customer
userNameNome do usuário que realizou a ação
userEmailE-mail do usuário que realizou a ação
createdAtData e hora do registro

Campos de Ordenação Disponíveis

CampoDescrição
idID do registro de histórico
createdAtData de criação

💡 Exemplo de Requisição

1curl --request GET \
2 --url '{{MAIN_URL}}/orders/groups/3710/history' \
3 --header 'Authorization: Bearer SEU_TOKEN_AQUI' \
4 --header 'Content-Type: application/json' \
5 --data '{
6 "order": [{ "field": "id", "order": "asc" }],
7 "condition": {
8 "type": "AND",
9 "conditions": [
10 { "field": "userName", "operator": "=", "value": "João" }
11 ]
12 },
13 "pagination": { "limit": 10, "offset": 0 }
14 }'

✅ Resposta de Sucesso

HTTP Status: 200 OK

1{
2 "status": true,
3 "data": {
4 "registers": [
5 {
6 "id": 7,
7 "userId": null,
8 "userName": null,
9 "userEmail": null,
10 "origin": "order",
11 "action": "create-order",
12 "createdAt": "2025-09-11 20:35:18",
13 "before": [],
14 "after": {
15 "id": 3710,
16 "orderGroupId": 3710,
17 "productStorageId": 1,
18 "orderStatusId": 1
19 },
20 "orderGroupId": 3710,
21 "orderId": 3710,
22 "newOrderStatusId": null
23 },
24 {
25 "id": 27,
26 "userId": 6,
27 "userName": "João",
28 "userEmail": "joao@email.com.br",
29 "origin": "status",
30 "action": "change-status",
31 "createdAt": "2025-10-28 18:11:35",
32 "before": {
33 "orderStatusId": 1
34 },
35 "after": {
36 "orderStatusId": 6,
37 "retroactiveDate": null
38 },
39 "orderGroupId": 3710,
40 "orderId": 3710,
41 "newOrderStatusId": 6
42 }
43 ],
44 "pagination": {
45 "limit": 10,
46 "offset": 0,
47 "pages": 1,
48 "registers": 7
49 }
50 }
51}

Campos da Resposta

CampoTipoNullableDescrição
idintegerNãoID do registro de histórico
userIdintegerSimID do usuário responsável — null para ações do sistema
userNamestringSimNome do usuário que realizou a ação — null para ações do sistema
userEmailstringSimE-mail do usuário responsável — null para ações do sistema
originstringNãoOrigem da alteração — identifica o contexto da mudança
actionstringNãoAção realizada — detalha o que foi feito
createdAtstringNãoData e hora do registro
beforeobject/arraySimEstado anterior à alteração — estrutura varia por action
afterobject/arraySimEstado posterior à alteração — estrutura varia por action
orderGroupIdintegerSimID do grupo de pedido vinculado ao registro
orderIdintegerSimID da remessa vinculada ao registro
newOrderStatusIdintegerSimNovo status aplicado — preenchido apenas para action: change-status

Referência de origin e action

Valores de origin

ValorDescrição
orderCriação do pedido
statusAlteração de status
shippingAtualização de frete ou rastreamento
invoiceAtualização de nota fiscal
storageTroca de armazém
alterationAdição ou remoção de desconto/acréscimo
customerAtualização dos dados cadastrais do cliente do grupo
addressAtualização dos endereços do grupo

Valores de action

ValororiginDescrição
create-orderorderRemessa criada
change-statusstatusStatus alterado
update-trackingshippingCódigo de rastreamento atualizado
update-delivery-forecastshippingPrevisão de entrega atualizada
update-invoiceinvoiceNota fiscal atualizada
change-storagestorageArmazém trocado
create-discountalterationDesconto adicionado
create-additionalterationAcréscimo adicionado
remove-discountalterationDesconto removido
remove-additionalterationAcréscimo removido
update-customercustomerDados cadastrais do cliente atualizados
update-addressaddressEndereços do grupo atualizados

Estrutura de before e after por ação

Os campos before e after carregam o snapshot do dado antes e depois da alteração. A estrutura varia conforme a action:

create-order

1"before": [],
2"after": { "id": 101, "orderGroupId": 55, "productStorageId": 1, "orderStatusId": 1 }

> userId, userName e userEmail serão null — a criação é feita pelo sistema no checkout.

change-status

1"before": { "orderStatusId": 1 },
2"after": { "orderStatusId": 2, "retroactiveDate": null }

> retroactiveDate: data retroativa aplicada à mudança de status, quando informada. newOrderStatusId também é preenchido no registro raiz.

update-tracking / update-delivery-forecast

1"before": { "orderId": 101, "trackingCode": null },
2"after": { "orderId": 101, "trackingCode": "BR123456789BR" }

update-invoice

1"before": [],
2"after": { "orderId": 101, "number": "000123", "key": "35260412...", "serie": "1", "url": "https://..." }

change-storage

1"before": { "id": 101, "productStorageId": 1 },
2"after": { "id": 101, "productStorageId": 2 }

create-discount / create-addition

1"before": null,
2"after": { "id": 10, "orderId": 101, "type": "discount", "entityId": "coupon-123", "value": 15.00 }

remove-discount / remove-addition

1"before": { "id": 10, "orderId": 101, "type": "discount", "entityId": "coupon-123", "value": 15.00 },
2"after": null

update-customer

1"before": { "customerId": 3533, "customerNameCorporateName": "Nome Antigo", "customerEmail": "antigo@email.com", "customerPhone": "+5511888888888", "customerDocument": "000.000.000-00", "customerDocument2": "", "customerIsCorporate": false, "customerGender": "undefined", "customerBirthdate": "2000-01-01" },
2"after": { "customerId": 3533, "customerNameCorporateName": "Nome Novo", "customerEmail": "novo@email.com", "customerPhone": "+5511999999999", "customerDocument": "000.000.000-00", "customerDocument2": "", "customerIsCorporate": false, "customerGender": "male", "customerBirthdate": "1990-05-20" }

update-address

1"before": { "customerAddressType": "both", "addressZipCode": "01310100", "addressRecipient": "Nome Antigo", "addressStreet": "Rua Antiga", "addressNumber": "1", "addressDistrict": "Bairro", "addressCity": "São Paulo", "addressState": "São Paulo", "addressStateCode": "BR-SP", "addressCountryCode": "BRA", "addressComplement": "" },
2"after": { "customerAddressType": "both", "addressZipCode": "04922150", "addressRecipient": "Nome Novo", "addressStreet": "Rua Nova", "addressNumber": "42", "addressDistrict": "Centro", "addressCity": "São Paulo", "addressState": "São Paulo", "addressStateCode": "BR-SP", "addressCountryCode": "BRA", "addressComplement": "" }

⚠️ Possíveis Erros

> Os cenários abaixo representam os principais erros que podem ocorrer neste endpoint, servindo como referência para entendimento e tratamento das falhas.

Código do ErroHTTPDescrição
UAPPI_STORE_ORDER_GROUP_NOT_FOUND404Grupo de pedido não encontrado com o ID informado

🕒 Detalhe de Histórico de Grupo de Pedido

GET /orders/groups/{orderGroupId}/history/{historyId}

Retorna o detalhe completo de um registro de histórico de um grupo de pedido

📋 Descrição

Endpoint responsável por retornar o detalhe completo de um registro de histórico de um grupo de pedido, incluindo os snapshots de before e after com todos os dados da alteração — útil para diagnóstico aprofundado de um evento específico dentro da linha do tempo do pedido.

Ideal para auditoria pontual, quando já se conhece o ID do registro via listagem e é necessário inspecionar o contexto completo da mudança.

Quando userId, userName e userEmail são null, a ação foi realizada pelo próprio sistema — como na criação automática da remessa no checkout.

🔐 Permissão

  • UserAuth — autenticação do usuário administrativo
  • ORDER_READ — escopo de permissão para leitura de pedidos e histórico de alterações

📝 Parâmetros

🏷️ Headers Obrigatórios

HeaderValorDescrição
AuthorizationBearer {token}Token de autenticação do usuário

🔗 Parâmetros de URL

ParâmetroTipoObrigatórioDescrição
orderGroupIdinteger✅ SimID do grupo de pedido
historyIdinteger✅ SimID do registro de histórico

💡 Exemplo de Requisição

1curl --request GET \
2 --url '{{MAIN_URL}}/orders/groups/3710/history/7' \
3 --header 'Authorization: Bearer SEU_TOKEN_AQUI'

✅ Resposta de Sucesso

HTTP Status: 200 OK

1{
2 "status": true,
3 "data": {
4 "id": 7,
5 "userId": null,
6 "userName": null,
7 "userEmail": null,
8 "origin": "order",
9 "action": "create-order",
10 "createdAt": "2025-09-11 20:35:18",
11 "before": [],
12 "after": {
13 "id": 3710,
14 "orderGroupId": 3710,
15 "productStorageId": 1,
16 "orderStatusId": 1
17 },
18 "orderGroupId": 3710,
19 "orderId": 3710,
20 "newOrderStatusId": null
21 }
22}

⚠️ Possíveis Erros

> Os cenários abaixo representam os principais erros que podem ocorrer neste endpoint, servindo como referência para entendimento e tratamento das falhas.

Código do ErroHTTPDescrição
UAPPI_STORE_ORDER_GROUP_NOT_FOUND404Grupo de pedido não encontrado com o ID informado
UAPPI_STORE_ORDER_GROUP_HISTORY_NOT_FOUND404Registro de histórico não encontrado com o ID informado

Uappi é a melhor opção para o crescimento da sua loja!

;