Editando seu pedido

A mutation de edição de pedidos tem 4 parâmetros principais:

NomeTipoDescrição
orderIdIntO número do Pedido
packages[EditOrderPackages]!Uma lista com as edições a serem feitas
shouldExecuteBooleanUm booleano indicando se a edição deve realmente acontecer, caso seja false, será feita apenas uma estimativa
shouldAddReturnBooleanIndica se um ponto de retorno deve ser adicionado

Resolvendo a lista de EditOrderPackages

Cada EditOrderPackages se refere a alguma edição que acontecerá em um dado pacote. Ele é formado de dois parâmetros:

NomeTipoDescrição
pkIntNúmero da entrega
payloadEditOrderPackagePayloadPayload que será aplicado à entrega

Formando o payload de edição

O payload é o objeto que informa as edições que devem acontecer no pacote:

NomeTipoDescrição
complementStringNovo complemento de uma entrega
cancellationBooleanIndica se a entrega deve ser cancelada

e.g.:

# cancelará o package 5120
{
  pk: 5120,
  payload: {
    cancellation: true
  }
}

# mudará o complemento do package 1043
{
  pk: 1043,
  payload: {
    complement: "apto 75"
  }
}

Realizando estimativas

O argumento shouldExecute informa se a mudança descrita na mutation deve ser executada (shouldExecute: true) ou se é apenas uma estimativa (shouldExecute: false).

Ao executar estimativas, é importante notar dois campos principais:

  • diff: mostra a diferença pós edição, tais como preço e campos originais e novos dentro dos packages
  • packagesDraft: mostra uma lista dos packages pós edição, com seus respectivos estados (através do campo draftStatus)

e.g.
Criamos um pedido com dois packages, iremos editar o complemento do primeiro e cancelar o segundo.

mutation {
  retailEditOrder (input: {
    shouldExecute: false
    orderId: 57038
    packages: [
      {
        pk: 176969
        payload: {
          complement: "3 pav",
        }
      }
      {
        pk: 176970,
        payload: {
            cancellation: true            
        }
      } 
    ]
  }) {
    errors { # caso ocorra algum erro
      field
      message
      title
    }
    packagesDraft {
      pk
      draftStatus # estado pós edição e.g. "removed", "added", "edited"
    }
    diff { # diff entre o pedido pré e pós edição
      pricing {
        oldValue # preço pré edição
        newValue # preço pós edição
      }
      packages {
        pk
        editType # qual foi o tipo de edição realizada e.g. "complement"
        label # label do tipo da edição e.g. "Complemento"
        oldValue # valor pré edição 
        newValue # valor pós edição 
      }
    }
  }
}
{
  "data": {
    "retailEditOrder": {
      "errors": [],
      "packagesDraft": [
        {
          "pk": 176969,
          "draftStatus": "edited"
        },
        {
          "pk": 176970,
          "draftStatus": "removed"
        }
      ],
      "diff": {
        "pricing": {
          "oldValue": "23.80",
          "newValue": "11.90"
        },
        "packages": [
          {
            "pk": 176969,
            "editType": "complement",
            "label": "Complemento",
            "oldValue": [
              null
            ],
            "newValue": [
              "3 pav"
            ]
          }
        ]
      }
    }
  }
}

Cancelamentos e pontos de retornos

Ao cancelar um package de uma rota já em andamento, é importante saber se este deverá ser descartado, uma vez que, se não, um ponto de retorno deve ser adicionado ao pedido na mesma requisição de cancelamento.

e.g.
O mesmo pedido do último exemplo, mas agora adicionaremos um ponto de retorno, além das edições

mutation {
  retailEditOrder (input: {
    shouldExecute: false
    shouldAddReturn: true
    orderId: 57038
    packages: [
      {
        pk: 176969
        payload: {
          complement: "3 pav",
        }
      }
      {
        pk: 176970,
        payload: {
            cancellation: true            
        }
      } 
    ]
  }) {
    errors {
      field
      message
      title
    }
    packagesDraft {
      pk
      draftStatus
    }
    diff {
      pricing {
        oldValue
        newValue
      }
      packages {
        pk
        editType
        label
        oldValue
        newValue
      }
    }
  }
}
{
  "data": {
    "retailEditOrder": {
      "errors": [],
      "packagesDraft": [
        {
          "pk": 176969,
          "draftStatus": "edited"
        },
        {
          "pk": 176970,
          "draftStatus": "removed"
        },
        {
          "pk": null,
          "draftStatus": "added" # um novo ponto foi adicionado no final do pedido, esse é o ponto de retorno
        }
      ],
      "diff": {
        "pricing": {
          "oldValue": "23.80",
          "newValue": "19.80"
        },
        "packages": [
          {
            "pk": 176969,
            "editType": "complement",
            "label": "Complemento",
            "oldValue": [
              null
            ],
            "newValue": [
              "never be the same"
            ]
          }
        ]
      }
    }
  }
}

Como posso saber quais packages podem ser cancelados?

Um pacote pode ser cancelado até o entregador realizar o check-in no local de entrega. Esta é a regra, mas também há um nó que indica se o package pode ser cancelado, ele se chama isRemovable e fica dentro do PackageNode

e.g.

# requisição
{
  packageOrder(packageId: 176969) {
    packages {
      pk
      isRemovable
    }
  } 
}

# resposta
{
  "data": {
    "packageOrder": {
      "packages": [
        {
          "pk": 176969,
          "isRemovable": true
        },
        {
          "pk": 176970,
          "isRemovable": true
        }
      ]
    }
  }
}
# requisição
{
  order(id: 57038) {
    packages {
      pk
      isRemovable
    }
  }
}

# resposta
{
  "data": {
    "order": {
      "packages": [
        {
          "pk": 176969,
          "isRemovable": true
        },
        {
          "pk": 176970,
          "isRemovable": true
        }
      ]
    }
  }
}