curl --request POST \
--url https://api.exowpee.com/v1/catalog/transfers/{transfer}/steps/{step}/complete \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"receipts": "<string>",
"dispatches": "<string>",
"completion_lines": [
{
"to_step_id": "<string>",
"lines": [
{
"stockable_id": "<string>",
"stockable_unit_id": "<string>",
"base_quantity": 2,
"remaining_quantity": "<string>",
"dispatches": [
{
"asset_id": "<string>",
"group_id": "<string>",
"quantity": 2
}
]
}
]
}
]
}
'import requests
url = "https://api.exowpee.com/v1/catalog/transfers/{transfer}/steps/{step}/complete"
payload = {
"receipts": "<string>",
"dispatches": "<string>",
"completion_lines": [
{
"to_step_id": "<string>",
"lines": [
{
"stockable_id": "<string>",
"stockable_unit_id": "<string>",
"base_quantity": 2,
"remaining_quantity": "<string>",
"dispatches": [
{
"asset_id": "<string>",
"group_id": "<string>",
"quantity": 2
}
]
}
]
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
receipts: '<string>',
dispatches: '<string>',
completion_lines: [
{
to_step_id: '<string>',
lines: [
{
stockable_id: '<string>',
stockable_unit_id: '<string>',
base_quantity: 2,
remaining_quantity: '<string>',
dispatches: [{asset_id: '<string>', group_id: '<string>', quantity: 2}]
}
]
}
]
})
};
fetch('https://api.exowpee.com/v1/catalog/transfers/{transfer}/steps/{step}/complete', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.exowpee.com/v1/catalog/transfers/{transfer}/steps/{step}/complete",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'receipts' => '<string>',
'dispatches' => '<string>',
'completion_lines' => [
[
'to_step_id' => '<string>',
'lines' => [
[
'stockable_id' => '<string>',
'stockable_unit_id' => '<string>',
'base_quantity' => 2,
'remaining_quantity' => '<string>',
'dispatches' => [
[
'asset_id' => '<string>',
'group_id' => '<string>',
'quantity' => 2
]
]
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.exowpee.com/v1/catalog/transfers/{transfer}/steps/{step}/complete"
payload := strings.NewReader("{\n \"receipts\": \"<string>\",\n \"dispatches\": \"<string>\",\n \"completion_lines\": [\n {\n \"to_step_id\": \"<string>\",\n \"lines\": [\n {\n \"stockable_id\": \"<string>\",\n \"stockable_unit_id\": \"<string>\",\n \"base_quantity\": 2,\n \"remaining_quantity\": \"<string>\",\n \"dispatches\": [\n {\n \"asset_id\": \"<string>\",\n \"group_id\": \"<string>\",\n \"quantity\": 2\n }\n ]\n }\n ]\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.exowpee.com/v1/catalog/transfers/{transfer}/steps/{step}/complete")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"receipts\": \"<string>\",\n \"dispatches\": \"<string>\",\n \"completion_lines\": [\n {\n \"to_step_id\": \"<string>\",\n \"lines\": [\n {\n \"stockable_id\": \"<string>\",\n \"stockable_unit_id\": \"<string>\",\n \"base_quantity\": 2,\n \"remaining_quantity\": \"<string>\",\n \"dispatches\": [\n {\n \"asset_id\": \"<string>\",\n \"group_id\": \"<string>\",\n \"quantity\": 2\n }\n ]\n }\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.exowpee.com/v1/catalog/transfers/{transfer}/steps/{step}/complete")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"receipts\": \"<string>\",\n \"dispatches\": \"<string>\",\n \"completion_lines\": [\n {\n \"to_step_id\": \"<string>\",\n \"lines\": [\n {\n \"stockable_id\": \"<string>\",\n \"stockable_unit_id\": \"<string>\",\n \"base_quantity\": 2,\n \"remaining_quantity\": \"<string>\",\n \"dispatches\": [\n {\n \"asset_id\": \"<string>\",\n \"group_id\": \"<string>\",\n \"quantity\": 2\n }\n ]\n }\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"transfer_id": "<string>",
"position": 123,
"location_group_id": "<string>",
"status": "<string>",
"operations_executed_at": "2023-11-07T05:31:56Z",
"approved_by_company_id": "<string>",
"approved_by_user_id": "<string>",
"approved_at": "2023-11-07T05:31:56Z",
"completed_by_company_id": "<string>",
"completed_by_user_id": "<string>",
"completed_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"location_group": {
"id": "<string>",
"name": "<string>"
},
"receipts": [
{
"id": "<string>",
"transfer_step_id": "<string>",
"transfer_line_id": "<string>",
"asset_id": "<string>",
"quantity": 123,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"asset_name": "<string>"
}
],
"dispatches": [
{
"id": "<string>",
"transfer_step_id": "<string>",
"transfer_segment_id": "<string>",
"transfer_line_id": "<string>",
"position": 123,
"asset_id": "<string>",
"group_id": "<string>",
"vendor_name": "<string>",
"quantity": 123,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"asset_name": "<string>"
}
]
}{
"message": "<string>",
"errors": {}
}Complete a transfer step
Marks the current step as done, executing the stock withdrawals still pending for it and optionally adding lines that forward goods to a later step.
curl --request POST \
--url https://api.exowpee.com/v1/catalog/transfers/{transfer}/steps/{step}/complete \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"receipts": "<string>",
"dispatches": "<string>",
"completion_lines": [
{
"to_step_id": "<string>",
"lines": [
{
"stockable_id": "<string>",
"stockable_unit_id": "<string>",
"base_quantity": 2,
"remaining_quantity": "<string>",
"dispatches": [
{
"asset_id": "<string>",
"group_id": "<string>",
"quantity": 2
}
]
}
]
}
]
}
'import requests
url = "https://api.exowpee.com/v1/catalog/transfers/{transfer}/steps/{step}/complete"
payload = {
"receipts": "<string>",
"dispatches": "<string>",
"completion_lines": [
{
"to_step_id": "<string>",
"lines": [
{
"stockable_id": "<string>",
"stockable_unit_id": "<string>",
"base_quantity": 2,
"remaining_quantity": "<string>",
"dispatches": [
{
"asset_id": "<string>",
"group_id": "<string>",
"quantity": 2
}
]
}
]
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
receipts: '<string>',
dispatches: '<string>',
completion_lines: [
{
to_step_id: '<string>',
lines: [
{
stockable_id: '<string>',
stockable_unit_id: '<string>',
base_quantity: 2,
remaining_quantity: '<string>',
dispatches: [{asset_id: '<string>', group_id: '<string>', quantity: 2}]
}
]
}
]
})
};
fetch('https://api.exowpee.com/v1/catalog/transfers/{transfer}/steps/{step}/complete', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.exowpee.com/v1/catalog/transfers/{transfer}/steps/{step}/complete",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'receipts' => '<string>',
'dispatches' => '<string>',
'completion_lines' => [
[
'to_step_id' => '<string>',
'lines' => [
[
'stockable_id' => '<string>',
'stockable_unit_id' => '<string>',
'base_quantity' => 2,
'remaining_quantity' => '<string>',
'dispatches' => [
[
'asset_id' => '<string>',
'group_id' => '<string>',
'quantity' => 2
]
]
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.exowpee.com/v1/catalog/transfers/{transfer}/steps/{step}/complete"
payload := strings.NewReader("{\n \"receipts\": \"<string>\",\n \"dispatches\": \"<string>\",\n \"completion_lines\": [\n {\n \"to_step_id\": \"<string>\",\n \"lines\": [\n {\n \"stockable_id\": \"<string>\",\n \"stockable_unit_id\": \"<string>\",\n \"base_quantity\": 2,\n \"remaining_quantity\": \"<string>\",\n \"dispatches\": [\n {\n \"asset_id\": \"<string>\",\n \"group_id\": \"<string>\",\n \"quantity\": 2\n }\n ]\n }\n ]\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.exowpee.com/v1/catalog/transfers/{transfer}/steps/{step}/complete")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"receipts\": \"<string>\",\n \"dispatches\": \"<string>\",\n \"completion_lines\": [\n {\n \"to_step_id\": \"<string>\",\n \"lines\": [\n {\n \"stockable_id\": \"<string>\",\n \"stockable_unit_id\": \"<string>\",\n \"base_quantity\": 2,\n \"remaining_quantity\": \"<string>\",\n \"dispatches\": [\n {\n \"asset_id\": \"<string>\",\n \"group_id\": \"<string>\",\n \"quantity\": 2\n }\n ]\n }\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.exowpee.com/v1/catalog/transfers/{transfer}/steps/{step}/complete")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"receipts\": \"<string>\",\n \"dispatches\": \"<string>\",\n \"completion_lines\": [\n {\n \"to_step_id\": \"<string>\",\n \"lines\": [\n {\n \"stockable_id\": \"<string>\",\n \"stockable_unit_id\": \"<string>\",\n \"base_quantity\": 2,\n \"remaining_quantity\": \"<string>\",\n \"dispatches\": [\n {\n \"asset_id\": \"<string>\",\n \"group_id\": \"<string>\",\n \"quantity\": 2\n }\n ]\n }\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"transfer_id": "<string>",
"position": 123,
"location_group_id": "<string>",
"status": "<string>",
"operations_executed_at": "2023-11-07T05:31:56Z",
"approved_by_company_id": "<string>",
"approved_by_user_id": "<string>",
"approved_at": "2023-11-07T05:31:56Z",
"completed_by_company_id": "<string>",
"completed_by_user_id": "<string>",
"completed_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"location_group": {
"id": "<string>",
"name": "<string>"
},
"receipts": [
{
"id": "<string>",
"transfer_step_id": "<string>",
"transfer_line_id": "<string>",
"asset_id": "<string>",
"quantity": 123,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"asset_name": "<string>"
}
],
"dispatches": [
{
"id": "<string>",
"transfer_step_id": "<string>",
"transfer_segment_id": "<string>",
"transfer_line_id": "<string>",
"position": 123,
"asset_id": "<string>",
"group_id": "<string>",
"vendor_name": "<string>",
"quantity": 123,
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"asset_name": "<string>"
}
]
}{
"message": "<string>",
"errors": {}
}transfers.complete, transfers.forward
Conditions
- The company does not need to own the transfer: once it is no longer a draft, a company that holds a location of one of its step groups can act.
- When completion_lines is sent, transfers.forward is also needed. The step must be accessible to the company.
- The transfer must be running and the step must be its current step.
- receipts and dispatches are not accepted here; use the approve call.
- Each completion line group must target a different, later step that is still upcoming; its lines need an existing tracked stock item of the organization, a unit of that item, a base quantity of at least 1 and at least one dispatch whose quantities cover the line.
- Pending stock withdrawals of the lines leaving the step are executed.
- With completion_lines, a completion segment is created (or reused) from this step to the target step with the new lines to forward goods.
- The step becomes done, with completer company, member and time. The next step is not approved automatically.
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Identifier of the transfer.
Identifier of the transfer step, which must belong to the transfer.
Body
Not accepted: receptions are planned when the step is approved.
Not accepted: dispatches are planned when the step is approved.
Optional groups of lines forwarding goods from this step to a later step. Needs the forward permission.
Show child attributes
Show child attributes
Response
TransferStepResource
Identifier of the step.
Identifier of the transfer.
Order of the step in the route, from 1.
Location group visited at this step.
upcoming (not reached), current (being operated), done or skipped.
When the planned stock movements of the step were executed, ISO 8601; null before.
Company that made the step current.
Member who made the step current.
When the step became current, ISO 8601.
Company that completed the step.
Member who completed the step.
When the step was completed, ISO 8601.
Date and time the record was created (ISO 8601, UTC).
Date and time the record was last changed (ISO 8601, UTC).
The group of the step (id and name), when loaded.
Show child attributes
Show child attributes
Planned or executed receptions of goods at the locations of the step.
Show child attributes
Show child attributes
Planned or executed withdrawals of goods from the locations of the step.
Show child attributes
Show child attributes