Skip to main content

Transfer order picking list created

Fires when the picking list update for a transfer order (Generate picking list on the Ship tab of the Transfer orders page) creates a picking list, and lists every line to be picked. Depending on the transfer order picking route status parameter, the new picking list is either activated for picking or already completed; the payload's routeStatus says which. Downstream systems can use it to hand the pick to an external warehouse or automation system, notify the shipping warehouse, or start tracking the transfer before it ships.

Event classMGCLatticeTransferOrderPickingListCreatedBusinessEvent
Contract classMGCLatticeOrderPickingBusinessEventContract (shared with Picking list canceled)
CategoryInventory management
ModuleModuleAxapta::Inventory
Label IDsTransferOrderPickingBusinessEventName / TransferOrderPickingBusinessEventDescription
TriggerInventTransferUpdPick.run() -> after the picking list update creates a picking route (RecId guard)

Trigger / Hook​

  • Extension class: MGCLatticeInventTransferUpdPick_Class_Extension, decorated with [ExtensionOf(classStr(InventTransferUpdPick))].
  • CoC method signature: public void run() (no parameters). InventTransferUpdPick is the transfer order picking list update that the Generate picking list action runs for each transfer order.
  • Firing condition: after next run() completes, the extension reads the picking route the update created through the public parmWmsPickingRoute() accessor and sends the event only when that route has a RecId. The standard update inserts the route only when something was actually sent to picking, so an update that picks nothing sends no event, and an update that fails throws before the event is built. One event is sent per picking list created. The route is read again from the database before the event is built, so the payload carries its committed status.
  • Route status: the standard update leaves the new route in the status set by the Picking route status setting for transfer orders (Inventory and warehouse management parameters, Transfer orders group): Activated, or Complete when the setting is Completed. The event is sent in both cases, and routeStatus tells them apart: Activated means the lines still have to be picked; Complete means the update also completed the picking list.
  • Transaction: InventTransferUpdPick.run() runs its own ttsbegin/ttscommit, and the event is sent after it. When the update runs inside a larger transaction, the event is written to the business events commit log inside it and is delivered only if that transaction commits.
  • Enablement gate: guarded by BusinessEventsConfigurationReader::isBusinessEventEnabled(classStr(MGCLatticeTransferOrderPickingListCreatedBusinessEvent)).
public void run()
{
WMSPickingRoute pickingRoute;

next run();

pickingRoute = this.parmWmsPickingRoute();

if (pickingRoute.RecId
&& BusinessEventsConfigurationReader::isBusinessEventEnabled(classStr(MGCLatticeTransferOrderPickingListCreatedBusinessEvent)))
{
WMSPickingRoute persistedRoute = WMSPickingRoute::find(pickingRoute.PickingRouteID);

MGCLatticeTransferOrderPickingListCreatedBusinessEvent::newFromWMSPickingRoute(persistedRoute.RecId ? persistedRoute : pickingRoute).send();
}
}

Payload Contract​

One row per [DataMember], in declaration order. MGCLatticeOrderPickingBusinessEventContract is shared with Picking list canceled; this event carries every line of the new picking route. Header fields come from the picking route created by the update.

JSON fieldDisplay labelType / EDTSourceNotes
legalEntityLegal EntityDataAreaIdWMSPickingRoute.dataAreaIdCompany of the transfer order
pickingRouteIdPicking RouteWMSPickingRouteIDWMSPickingRoute.pickingRouteIDPicking list (route) number
orderNumberOrder NumberInventTransRefIdWMSPickingRoute.transRefIdThe transfer order number
transTypeTransaction Typeintenum2int(WMSPickingRoute.transType)InventTransType value; 21 (TransferOrderShip) for a transfer order picking list
transTypeNameTransaction Type Namestrenum2Symbol(enumNum(InventTransType), ...)TransferOrderShip
routeStatusPicking Route Statusintenum2int(WMSPickingRoute.ExpeditionStatus)Status of the new picking route as the WMSExpeditionStatus integer: 3 = Activated (still to be picked) or 10 = Complete (completed by the update)
routeStatusNamePicking Route Status Namestrenum2Symbol(enumNum(WMSExpeditionStatus), routeStatus)Symbol of routeStatus: "Activated" or "Complete"
deliveryModeIdDelivery ModeDlvModeIdWMSPickingRoute.DlvModeIdMode of delivery of the transfer order
deliveryTermsIdDelivery TermsDlvTermIdWMSPickingRoute.DlvTermIdDelivery terms of the transfer order
linesLinesList of MGCLatticeOrderPickingLineContractEvery WMSOrderTrans line whose routeId is the new picking routeJSON array, one element per picking line, with no status filter

Each element of lines (MGCLatticeOrderPickingLineContract, built by newFromWMSOrderTrans() from a WMSOrderTrans picking line):

JSON fieldDisplay labelType / EDTSourceNotes
itemIdItem NumberItemIdWMSOrderTrans.itemId
quantityQuantityQtyWMSOrderTrans.qtyQuantity to pick on this line
inventTransIdInventory Transaction IDInventTransIdWMSOrderTrans.inventTransIdLot ID of the transfer order line (shipment side)
lineNumberLine NumberLineNumSalesLine.LineNum, otherwise InventTransferLine.LineNum, matched on InventTransIdThe transfer order line number for this event
inventDimIdInventory Dimension IDInventDimIdWMSOrderTrans.inventDim().InventDimId
siteIdSiteInventSiteIdWMSOrderTrans.inventDim().InventSiteId
warehouseIdWarehouseInventLocationIdWMSOrderTrans.inventDim().InventLocationIdThe shipping (from) warehouse
locationIdLocationWMSLocationIdWMSOrderTrans.inventDim().wMSLocationId

Every Lattice event also carries the Lattice ordering and correlation envelope, inherited from MGCLatticeBusinessEventContractBase: eventSequence (Int64 - increasing across the whole catalog and all companies, allocated when the event is raised inside the business transaction rather than when it commits; it orders the events of one business record, gaps are permanent and normal, and it must not be used to re-sequence the whole stream), correlationId (String, always Scope:Key - groups emissions that belong to one logical run; Event:<GUID> unique to this emission when the event belongs to no run) and schemaVersion (Int - the payload shape version; 1 for this contract). D365 F&O also adds its standard envelope fields to every business event payload: BusinessEventId, BusinessEventLegalEntity, ContextRecordSubject, ControlNumber, EventId, EventTime, EventTimeIso8601, InitiatingUserAADObjectId, MajorVersion, MinorVersion, and ParentContextRecordSubjects. Do not rely on the order of members in the delivered JSON.

Example Payload​

{
"BusinessEventId": "MGCLatticeTransferOrderPickingListCreatedBusinessEvent",
"ControlNumber": 5637146342,
"EventId": "E19C7B42-3D85-4F6A-A0B8-9D4C2E6F1A05",
"EventTime": "\/Date(1790263089000)\/",
"EventTimeIso8601": "2026-09-24T15:18:09.3494127Z",
"MajorVersion": 0,
"MinorVersion": 0,
"BusinessEventLegalEntity": "USMF",
"ContextRecordSubject": "",
"InitiatingUserAADObjectId": "{AA8D568E-9E19-FE2D-578B-33CC88B1A43E}",
"ParentContextRecordSubjects": [],
"eventSequence": 48476,
"correlationId": "Event:5fcd15e4-7d79-47dd-8c58-1e3a64df825f",
"schemaVersion": 1,
"legalEntity": "usmf",
"pickingRouteId": "000321",
"orderNumber": "TO000147",
"transType": 21,
"transTypeName": "TransferOrderShip",
"routeStatus": 3,
"routeStatusName": "Activated",
"deliveryModeId": "10",
"deliveryTermsId": "FOB",
"lines": [
{
"itemId": "A0001",
"quantity": 20.0,
"inventTransId": "012611",
"lineNumber": 1.0,
"inventDimId": "002184",
"siteId": "1",
"warehouseId": "13",
"locationId": "13-02-01"
}
]
}

Activation​

In the D365FO client, go to System administration > Setup > Business events > Business events catalog. Find this event by name ("Transfer order picking list created") or by filtering the Category column to Inventory management. Select it and use Activate to bind it to a configured endpoint (for example, an Azure Service Bus queue, Event Grid topic, or HTTPS webhook).

No other setup is needed.