# Picking

A pick job is the main entity in the picking process. It contains all the necessary information to carry out a picking task. A pick job is created automatically after the routing, but can also be created via API. One of the cases when a pick job is created automatically is the outcome of an [order routing](https://docs.fulfillmenttools.com/documentation/by-pillar/advanced-order-routing) decision. In that case, an order was created, assigned to a facility, and a pick job was created. Furthermore, a pick job can be created due to a reroute, which also involves order routing.

If a picking task can't be fully picked because some of the required items are unavailable, it's referred to as a [short-pick](https://docs.fulfillmenttools.com/documentation/getting-started/facilities/managed-facilities#short-pick).

## Picking methods

The following picking methods are available:

* Single order picking
* [Multi-order picking](#multi-order-picking)
* [Batch picking](#batch-picking)
* [Zone picking](#zone-picking)

### Configuration of picking methods

#### Tenant-wide default picking method

The `defaultPickingMethod` of the tenant can be set to one of the following values: `SINGLE_ORDER`, `MULTI_ORDER`, or `BATCH` (see [configurations of picking methods](#picking-configuration) for details). This configuration is considered a fallback configuration: It will only be used for new pick jobs if there is no facility configuration for picking methods in the target facility and no pick job-specific configuration.

#### Facility-wide picking methods

If the picking method should be different for each facility, it can be configured when creating or updating a [facility](https://docs.fulfillmenttools.com/documentation/getting-started/facilities). The `pickingMethods` in the facility can be set to none, some, or all of the following values: `SINGLE_ORDER`, `MULTI_ORDER`, or `BATCH`. This configuration overwrites a potentially present tenant-wide configuration.

#### Configuration of picking method in the pick job

The picking method can also be defined for an individual pick job. It's defined in the pick job itself (field `preferredPickingMethods)`. The value is the outcome of the configurations on tenant and/or facility level and may be overwritten during creation of the pick job. Providing `pickingMethods` in the creation of a pick job overwrites any given facility-specific or tenant-wide configuration.

#### Configure picking methods via tags

It's also possible to add picking methods according to tags in the pick job. This can be done via [tag configuration pick job REST API](https://fulfillmenttools.github.io/fulfillmenttools-api-reference-ui/#put-/api/configurations/tags/pickjob). The corresponding tags must exist in order to apply the `preferredPickingMethods` in the configuration.

### Batch picking

Batch picking is one of the available multi-order pick methods of fulfillmenttools. In batch picking, a pick run is used to execute multiple pick jobs in one run. When two pick jobs of a batch pick run contain the same item, the two items are merged to one pick line item for the picker.

#### **Example**

Pick job A contains the item "apple" with a quantity of 3. Pick job B contains the item "apple" with a quantity of 5. A batch pick run of these two pick jobs would combine both pick jobs and result in three pick line items in the pick run.

<figure><img src="https://content.gitbook.com/content/Lrrr5jgTsDuR38gNJIrm/blobs/eOxIGBmzmlJ6eLjVPPDu/batch%20pick%20example" alt=""><figcaption><p>Example of how a batch pick run combines the articles of a single order</p></figcaption></figure>

After the picking process is finished, the picked items are separated by order and can be shipped or handed over to the customer.

### Multi-order picking

Multi-order picking is another available method at fulfillmenttools to pick multiple orders in one run. The multi-order fulfillment process involves consolidating multiple customer picking tasks into one pick run for efficient picking. Workers collect items for all tasks simultaneously and transfer them to a packing station, where packers organize, pack, label, and prepare the tasks for shipment.

See the [multi-order picking article](https://docs.fulfillmenttools.com/documentation/by-pillar/store-operations/picking/multi-order-picking) for more details.

### Zone picking

Zone picking can be useful if certain workers in the facility are only to pick tasks in their assigned zones. Each user can carry at least one zone. After a zone is created, it can be assigned to any available user. For a user to be able to pick products from a specific zone, those products need to be linked to that zone. This linkage is achieved by using storage locations that have an associated zone. Consequently, products located in these storage locations will be automatically assigned to the respective zone.

Upon the zone's creation and its assignment to both a user and storage locations, it becomes feasible to generate picking tasks that can be executed by users assigned to that particular zone.

The picking task gets automatically assigned to a zone immediately after a product is allocated to a storage location within that zone.

## Substitute items

Substitute items are items that can be picked if the originally ordered items are not available. A list of potential substitute items can be defined for each product on network level via [tenant article substitutes REST API](https://fulfillmenttools.github.io/fulfillmenttools-api-reference-ui/#put-/api/substitutes/-tenantArticleId-). If an item could not be picked successfully, and the [substitution configuration in the REST API](https://fulfillmenttools.github.io/fulfillmenttools-api-reference-ui/#put-/api/configurations/substitution) is active, users have the option to choose one (or more) substitute item(s).

{% hint style="info" %}
The configuration for (dis)allowing picking of substitute items can be made in the [network settings](https://docs.fulfillmenttools.com/documentation/backoffice/network-view/settings#substitution-items) in Backoffice.
{% endhint %}

Substitute items are connected via **matching tenant article ID** with the originally requested item. They can be **prioritized** so that a more suitable candidate is offered to the user before less suitable ones are shown. If a corresponding listing exists for a substitute item, the **stock** of that listing **is adjusted** as soon as the task reaches the end of picking.

Substitute items do not necessarily require an existing listing. As a result, unlisted products can also be picked as substitute items.

{% hint style="warning" %}
Picking substitute items is currently only available within the Operations Android App for single order picking.
{% endhint %}

## Measurement units in picking

### Creating and using measurement units in picking

With every order, it is possible to provide information about items that must be weighed or measured during the picking process (for example, fruits, liquids, or fabric). It is possible to configure individual measurement units for each tenant, such as grams, kilograms, liters, milliliters, etc. via [measurement units REST API](https://fulfillmenttools.github.io/fulfillmenttools-api-reference-ui/#post-/api/measurementunits).

The configured measurement units can be used to mark items of an order as `must be measured`. There is no check of completion for measuring items, which means that no [short-pick](https://docs.fulfillmenttools.com/documentation/getting-started/facilities/managed-facilities#short-pick) will be triggered when the picked measurement is lower than the ordered measurement.

Optionally, it is possible to specify tolerance limits that must not be exceeded or undershot when picking these items. If a soft tolerance is defined, the picker just sees a hint when entering more or less than configured. If a hard tolerance limit is configured, it is not possible to enter more or less (except of 0) than configured.

### **Secondary measurement units**

In addition to a quantity of a line item, an order can also contain a second quantity and unit of this item, which leads the picker to enter a second quantity. This only works if one of the two units was created as measurement units.

{% hint style="info" %}
If you're interested in using this feature, contact our Support team.
{% endhint %}

## Short-pick

A short-pick describes a case when an order could not be completely picked. This can happen when some ordered items are too low in stock or out of stock. Several configurations can be made for the case when a short-pick happens:

* [Adapt stock after short-pick](https://docs.fulfillmenttools.com/documentation/global-inventory-hub/configurations#short-pick-configuration)
* [Reroute after short-pick](https://docs.fulfillmenttools.com/documentation/advanced-order-routing/reroute#rerouting-routingincaseofshortpick)
* [Order split after short-pick](https://docs.fulfillmenttools.com/documentation/advanced-order-routing/order-split#order-split-after-short-pick)
* [Confirm short-pick](https://docs.fulfillmenttools.com/documentation/by-pillar/store-operations/broken-reference) in the Operations app

### Short-pick reasons

Short-pick reasons provide clarity on why specific picking tasks could not be fulfilled entirely. They can be added to the line items of each picking task.

Before using short-pick reasons during the picking process, they must be configured via [picking configuration REST API](https://fulfillmenttools.github.io/fulfillmenttools-api-reference-ui/#patch-/api/configurations/picking). The reasons are constructed using a multi-language JSON format and are translated accordingly. Short-pick reasons will be translated into the required language. The language is determined either by the requested locale or the user's default locale. If neither is specified, the translation will default to the first available localized reason, or if unavailable, it will default to the localization for `en_US`.

If a picking task is restarted or reset, the short-pick reasons on the pick line items will be deleted.

Whether entering a reason for a short-pick is optional or mandatory is controlled via remote configuration. If the `SHORTPICK_REASON_MANDATORY` remote configuration is set to `true` for the respective client, a single-order pick can only be completed if a short-pick reason has been selected for each short-picked item.

{% hint style="info" %}
For details on remote configuration keys, see the [remote configuration documentation](https://docs.fulfillmenttools.com/documentation/by-pillar/store-operations/remote-configuration).
{% endhint %}

## Available pick jobs statuses

The available status values of a pick job are:

* `OPEN`: The pick job is open and can be picked.
* `IN_PROGRESS`: The pick job is currently being picked.
* `PAUSED`: The pick job is paused and can be continued later
* `WAITING_FOR_INPUT`: The pick job is waiting for input from the workflow. This can be the case if the pick job is first supplied from a different facility.
* `PICKED`: The pick job was picked but is not closed yet.
* `CLOSED`: The pick job is done and closed.
* `REJECTED`: The pick job was rejected and will not be picked.
* `RESTOWED`: The pick job was restowed.
* `REROUTED`: The pick job was rerouted to a different facility.
* `ABORTED`: The pick job was aborted.
* `EXPIRED`: The pick job expired over the expiry time of the connected order.
* `OBSOLETE`: The pick job is obsolete via the workflow. E.g., because the order was canceled.
* `CANCELED`: The pick job was canceled.

### Pick job sub-status

The sub-status provides additional information about the current status of a pick job or why it was set.

A sub-status is only set for certain pick job statuses.

* `REROUTED` or `RESTOWED`:
  * `ORDER_MODIFIED`: The system reroutes the order because the order was modified.
  * `PROCESS_REROUTE`: The system reroutes the order because a reroute process is running.
  * `MANUAL_REROUTE`: The system reroutes the order because of a manual reroute.
  * `SHORT_PICK_REROUTE`: The system reroutes the order because the pick job was short-picked.
  * `TIME_TRIGGERED`: The system reroutes the order because a time-based rule is reached.
  * `STOCK_ZEROED`: The system reroutes the order because the stock level was set to zero.
  * `PICK_JOB_ABORTED`: The system reroutes the order because a previous pick job was aborted.
  * `RECALCULATION`: The system reroutes the order because the fulfillment process was recalculated.
* `ABORTED`:
  * `ZERO_PICKED`: The pick job was aborted because nothing was picked.
* `PICKED` or `CLOSED`:
  * `SHORT_PICKED`: The pick job couldn't be completely picked.
* `WAITING_FOR_INPUT`:
  * `WAITING_FOR_RELEASE_TIME`: The pick job is waiting for its release time to be picked.

## Manipulating pick jobs

### Resetting pick jobs

Resetting a pick job restores its initial state. This is useful when a pick job must be re-evaluated or processed again from the beginning. When a pick job is reset, all progress on the pick job is removed, including any picked items and short-pick reasons. The status of the pick job is set to `OPEN`, allowing it to be picked again from the start.

A pick job can be reset if the following conditions are met:

* The capability `picking_pickjob_reset` is enabled.
* The field `resetBlocked` is either set to `false` or not set.
* The pick job is in one of the following statuses: `IN_PROGRESS`, `OPEN`, or `WAITING_FOR_INPUT`.

When a pick job is reset, the following fields are affected:

* `status`: Set to `OPEN` if there is at least one pick line item, otherwise set to `WAITING_FOR_INPUT`
* `statusReason`: Set to `undefined`
* `pickRunRef`: Set to `undefined`
* `pickLineItems`:
  * `status`: Set to `OPEN`
  * `picked`: Set to `0`
  * `secondaryPicked`: Set to `0`
  * `substituteLineItems`: Set to `[]`
  * `scannedCodes`: Set to `[]`
  * `shortPickReason`: Removed
  * `stockEmptied`: Removed

## Picking configuration

The picking configuration is a tenant-wide configuration entity that controls the behavior of the picking process. It allows users to give more details on the process of picking orders and define rules for scanning and other actions. The picking configuration is stored as a single document per tenant and is accessible via the [picking configuration REST API](https://fulfillmenttools.github.io/fulfillmenttools-api-reference-ui/#patch-/api/configurations/picking).

The picking configuration consists of sub-configurations that can be set to certain values.

### Short-pick configuration&#x20;

The short-pick configuration (`pickingShortPickConfiguration`) controls the behavior when a short-pick occurs.

* `confirmationOnShortPick`: If set to `true`, the picker must confirm a stock correction before a short-pick can be submitted. Default: `false`.
* `shortPickReasons`: An optional list of reasons the picker can select when short-picking an item. Each reason has:
  * `reasonLocalized`: A multi-language object containing the reason text per locale.
  * `active`: Whether this reason is currently selectable.
  * `reason`: The translated reason text resolved according to the requested locale.

Short-pick reasons are translated based on the requested locale or the user's default locale. If neither is specified, the first available localized reason is used, falling back to `en_US`.

{% hint style="info" %}
See the [Short-pick](#short-pick) section for more context on when and why short-picks occur.
{% endhint %}

### Scanning configuration

The scanning configuration (`scanningConfiguration`) controls canning rules, scanning types, and roles that are allowed to overwrite the scanning rules during picking.

* `scanningType`: Defines the scanning enforcement mode. Possible values:
  * `SCAN_NOT_REQUIRED`: Scanning is optional. Default.
  * `MUST_SCAN_FIRST`: The picker must scan the article before confirming the first item.
  * `MUST_SCAN_EACH`: The picker must scan the article before confirming each individual item.
* `scanningRule`: Defines the order and type of items to scan. Contains a list of `values`, each with:
  * `scanningRuleType`: `ARTICLE` (pick line item) or `LOCATION` (storage location of the pick line item).
  * `priority`: A number indicating the preferred order; lower values are more preferable. Default scanning rule scans by `ARTICLE` with priority `0` (highest priority).
* `rolesWithOverwritingScanningPermission`: An optional list of user roles that are allowed to bypass the scanning requirement. Roles can be:`ADMINISTRATOR`, `SUPERVISOR`, `FULFILLER`, or a custom role name.

### Scan code validation configuration&#x20;

The picking scan code validation configuration (`scanCodeValidationConfiguration`) controls whether the pick of an item is possible only by scanning a barcode (valid barcodes must be supplied in the field `scannableCodes` in the `pickLineItem` of a pick job) or whether it should be allowed to also scan other barcodes that are not known.

* `pickingScanCodeValidationType`: Possible values:
  * `CODE_MUST_BE_KNOWN`: Only known scan codes are accepted. Default.
  * `NO_VALIDATION`: Any scan code is accepted without validation.

{% hint style="warning" %}
Setting this config to `CODE_MUST_BE_KNOWN` and having a pick line item without any code inside its `scannableCodes` array will result in not being able to increase the count of the item via barcode.
{% endhint %}

### Load unit assignment configuration

The load unit assignment configuration (`loadUnitAssignmentConfiguration`) controls when load units are assigned during pick jobs and pick runs.

* `pickJob`: The assignment point for single-order pick jobs. Possible values:
  * `INACTIVE`: Load unit assignment is disabled. Default.
  * `AT_START`: Load units must be assigned at the start of picking.
  * `AT_END`: Load units must be assigned at the end of picking.
  * `DURING_PICKING`: Load units can be assigned at any point during picking.
* `pickRun`: The assignment point for multi-order pick runs. Uses the same possible values as `pickJob`. Default: `INACTIVE`.

### Picking methods configuration

The picking methods configuration (`pickingMethodsConfiguration`) sets the tenant-wide default picking method. This serves as a fallback if no facility-specific picking method is configured.

* `defaultPickingMethod`: Possible values:
  * `SINGLE_ORDER`: Each pick job is processed individually. Default.
  * `MULTI_ORDER`: Multiple pick jobs are processed together in one pick run.
  * `BATCH`: Multiple pick jobs are batched together, with matching items across jobs merged into a single pick line.
  * `BATCH_PICKING`: Deprecated alias for `BATCH`.

{% hint style="info" %}
See the [Configuration of picking methods section](#configuration-of-picking-methods) for details on how facility-level and pick job-level configurations interact with this tenant-wide default.
{% endhint %}

### Other configurations

<table><thead><tr><th width="287.68359375">Sub-configuration</th><th>Description</th><th>Field</th><th>Type<select><option value="JvGruW4yuu6C" label="Number" color="blue"></option><option value="lUAroYAXCC8n" label="Enum" color="blue"></option><option value="wUOt19nDncZm" label="Boolean" color="blue"></option></select></th><th>Rules</th><th>Default</th></tr></thead><tbody><tr><td><code>takeOverPickJobConfiguration</code></td><td>Controls whether a picker can take over a pick job that is already assigned to another picker.</td><td><code>active</code></td><td><span data-option="wUOt19nDncZm">Boolean</span></td><td>Must be set as either <code>true</code> or <code>false</code></td><td><code>false</code></td></tr><tr><td><code>takeOverPickRunConfiguration</code></td><td>Controls whether a picker can take over a pick run that is already assigned to another picker.</td><td><code>active</code></td><td><span data-option="wUOt19nDncZm">Boolean</span></td><td>Must be set as either <code>true</code> or <code>false</code></td><td><code>false</code></td></tr><tr><td><code>scheduledPickJobReleaseConfiguration</code></td><td>Controls when a scheduled pick job becomes available for picking.</td><td><code>openPickJobLeadTimeInMinutes</code></td><td><span data-option="JvGruW4yuu6C">Number</span></td><td>Calculated as: <code>pickingTimes.latest - openPickJobLeadTimeInMinutes = release time</code>.</td><td>N/A</td></tr><tr><td><code>multiOrderPickingConfiguration</code></td><td>Controls limits for multi-order pick runs.</td><td><code>maxAmountOfPickJobsForMultiOrderPick</code></td><td><span data-option="JvGruW4yuu6C">Number</span></td><td>Must be between <code>1</code> and <code>100</code> </td><td><code>10</code></td></tr><tr><td><code>batchPickingConfiguration</code></td><td>Controls limits for batch pick runs.</td><td><code>maxAmountOfPickJobsForBatchPick</code></td><td><span data-option="JvGruW4yuu6C">Number</span></td><td>Must be between <code>1</code> and <code>100</code> </td><td><code>10</code></td></tr><tr><td><code>storageLocationAssignmentConfiguration</code></td><td>Controls whether storage locations are required for pick line items.</td><td><code>storageLocationRequired</code></td><td><span data-option="lUAroYAXCC8n">Enum</span></td><td><p>Possible values:</p><ul><li><code>NONE</code>: No storage location is required.</li><li><code>SOME</code>: At least one pick line item must have a storage location assigned.</li><li><code>ALL</code>: Every pick line item must have a storage location assigned.</li></ul></td><td><code>None</code></td></tr><tr><td><code>restartPickJobConfiguration</code></td><td>Controls whether a picker can restart a pick job from the Operations app.</td><td><code>active</code></td><td><span data-option="wUOt19nDncZm">Boolean</span></td><td>Must be set as either <code>true</code> or <code>false</code></td><td><code>true</code></td></tr><tr><td><code>stockUpdateConfiguration</code></td><td>Controls whether stock is checked for updates during the picking process.</td><td><code>active</code></td><td><span data-option="wUOt19nDncZm">Boolean</span></td><td>Must be set as either <code>true</code> or <code>false</code></td><td><code>false</code></td></tr><tr><td><code>backofficePickingConfiguration</code></td><td>Controls whether the tenant can use the Backoffice application for picking.</td><td><code>active</code></td><td><span data-option="wUOt19nDncZm">Boolean</span></td><td>Must be set as either <code>true</code> or <code>false</code></td><td><code>false</code></td></tr></tbody></table>
