This article shows you how an order can be fulfilled without using the Operations App.
After an order was created and routed to a facility, jobs are created. Using Most customers pick them using our mobile or web client, but let's imagine there are reasons not to use it. For example you use our app in your stores and a chaotic storage system in your warehouse. In the stores you'd like to pick using our picking app, in the warehouse you want to keep the old WMS picking solution. This is supported by our API, let's have a look how you can do that.
Picking
As you might know, orders are never picked, what is picked is called PickJob. After an order was routed, a routing plan is created which creates PickJobs in 1-n facilities. For each created PickJob, a PICK_JOB_CREATED event occurs, which you could subscribe to. The pick job contains information on the orders to pick and the locations where to pick them from:
After receiving the event containing that PickJob you can pick the goods. When sending the result of that picking it is crucial to tell the platform which items were collected, this information is stored in the partialStockLocations. If you are unsure which location to take from the list, we recommend using the first item in the list where the quantity is higher than 0, in the example above it is the first item in the list. After you picked with your solution and want report the result to the platform, you can use the PATCH PickJob endpoint.
PATCH pick job for giving information on picked items
Assuming you have either picked everything or order split after short pick is enabled, a PackJob will be created and a PICK_JOB_PICKING_FINISHED event is thrown as well as a PACK_JOB_CREATED event. If an order is rerouted after a short-pick, you will receive a PICK_JOB_REROUTED event.
Packing
When the PackJob was created, the PACK_JOB_CREATED event will occur. Subscribing to that, packing with a solution which is not provided by fulfillmenttools, won't be an issue. Using the PATCH PackJob Endpoint, you can report the packed items to the platform:
Assuming you have configured the carrier DHL and use the same parcel classification every time, you don't need to specify it when trying to get a label. In our platform, a label is something that belongs to a parcel and a parcel belongs to a shipment. Each shipment can have multiple parcels, but each parcel has its own and unique label.
That said, you need to add a parcel to a shipment. In each response of the API calls mentioned above, you get an object containing a processId:
Here you can find the shipmentRefs, which you need for adding parcels to that shipment. An alternative approach would be to use the GET Shipments endpoint with pickJobRef as a query parameter.
Assuming you have configured the carrier as mentioned above, you can just call the create parcel endpoint without any payload. However, this might depend on the used carrier and the product you want.
curl-sSL-XPOST'https://your.api.fulfillmenttools.com/api/shipments/<ShipmentId>/parcels' \--header'Authorization: Bearer <TOKEN>'201Created{"loadUnitRefs": [],"version":1,"id":"713b9cd8-6d47-45ff-a12a-ef3acb270180","status":"OPEN","shipmentRef":"3e62db41-af9e-4ce1-8c44-1ef340457057","processRef":"3af2e1a7-d104-4ef9-a43b-13890ae318cf","carrierRef":"488bd1a6-6c76-4407-8dab-ece716dac14d","recipient":{"firstName":"Luke","lastName":"Skywalker","street":"Planetenstraße","houseNumber":"13","postalCode":"40223","city":"Düsseldorf","country":"DE" },"sender":{"street":"Carlsplatz","houseNumber":"3","postalCode":"40213","city":"Düsseldorf","country":"DE","companyName":"ptdus","resolvedCoordinates":{"lon":6.77285093516085,"lat":51.2263665950437 },"emailAddresses":null,"additionalAddressInfo":null,"phoneNumbers":null,"resolvedTimeZone":{"offsetInSeconds":3600,"timeZoneId":"Europe/Berlin","timeZoneName":"W. Europe Standard Time" } },"dimensions":{"weight":2000 },"created":"2023-04-14T15:03:07.982Z","lastModified":"2023-04-14T15:03:07.982Z"}
The response contains the Id of the newly created parcel which you can later update, e.g. with tracking information you got from the carrier using the PATCH parcel by ID endpoint:
More information about that can also be found on the page.
HandoverJob
After you successfully followed the steps above, it might be useful in some cases (for example when using a custom carrier) to mark the HandoverJob as handed over manually. To do this, you will use the PATCH HandoverJob endpoint and a request looking like this: