ModelInventory module

Fulfillment

A model in the Inventory module, with 46 members for templates, 43 API properties and 60 members for admin templates.

Inventory\Models\Frontend\Fulfillment Inventory\Models\Api\Fulfillment Inventory\Models\Backend\Fulfillment Also in Inventory: Batch FulfillmentItem FulfillmentLog Stock Transaction Warehouse
View
What Smarty and Twig templates receive. Properties in REST API responses and job payloads. What admin screen templates receive when you override them.

Templates view

Properties 44

Take no arguments.

# getStatusLabels()
array
Gets all available statuses with their labels, in the wording of the fulfillment's type. A pickup keeps the ready and delivered statuses but reads "Ready for collection" and "Collected"; a fulfillment with nothing to ship reads "Delivered digitally". The label of the current status is always getStatusDisplay().
# getStatusDisplay()
string
Gets the status display label, in the wording of the fulfillment's type. A pickup keeps the ready and delivered statuses but reads "Ready for collection" and "Collected"; a delivered fulfillment with nothing to ship reads "Delivered digitally".
# isNothingToShip()
bool
Whether the selected rate's method has nothing to ship: digital products, gift cards and services Such a fulfillment is completed when its order is paid, goes straight from pending to delivered, holds no stock of its own, and gets no shipments or packing slip.
# isCompletedAutomatically()
bool
Whether the fulfillment was delivered by the system rather than by a person: a nothing-to-ship fulfillment completed as its order was paid
# isPending()
bool
Is the fulfillment still pending — nothing picked, packed, shipped or cancelled yet
# isReady()
bool
Is the fulfillment picked and packed, waiting for the carrier or, for a pickup, for the customer
# isInTransit()
bool
Is the fulfillment with the carrier
# isDelivered()
bool
Has the customer received the goods: delivered to them, or collected by them for a pickup
# isCancelled()
bool
Is the fulfillment cancelled
# getResolvedType()
string
How the goods reach the customer: the stored type, or for a row written before the column existed, inferred from its shape A delivery address means delivery, otherwise pickup.
# isDelivery()
bool
Are the goods delivered to the customer's address
# isPickup()
bool
Does the customer collect the goods from the fulfillment's warehouse
# isSkippingShipping()
bool
Whether the fulfillment goes straight to delivered: its method has nothing to ship and it has not left the warehouse One already in transit - shipped before its method was switched to nothing to ship - finishes its type's lifecycle, stock movements included.
# getAllowedActions()
array
The lifecycle actions the fulfillment allows now, for templates and API consumers Response models only expose getters, so this is how a card decides which buttons to show; each value names the can*() check it stands for.
# isStockTracked()
bool
Whether the fulfillment's stock is tracked in the inventory ledger: at least one line holds a reservation row Only then does a lifecycle transition move stock. A fulfillment built while inventory tracking was off holds none, whatever the setting says now.
# getItemCount()
int
The number of units in the fulfillment, across all its lines
# getTypeDisplay()
string
How the goods reach the customer, as a label: "Delivery", "Pickup", or "Digital" when there is nothing to ship
# getCustomerName()
string
The customer the order is for, by name: the person, or the billing name for a guest
# getTrackingSummary()
string
The latest shipment's tracking code, followed by how many more shipments there are: "AB123 +2 more"
# getCurrency()
Currency
Gets the currency of the fulfillment, taken from the order it belongs to
# getItemTotalAsMoney()
Money
Gets the item total as a Money object. Represents the sum of all items' Amount values. The items are this fulfillment's lines, so this is the value of the goods in it, before discount and tax.
# getShippingTotalAsMoney()
Money
Gets the shipping total as a Money object. Represents the net shipping total. Tax on shipping is tracked in Tax Total. It is the selected shipping rate, which excludes tax, and zero until a rate is selected. A discount the order carries on shipping is not part of this fulfillment, see getDiscountTotalAsMoney().
# getDiscountTotalAsMoney()
Money
Gets the discount total as a Money object. Represents the sum of discount values across all line items. An order-level discount reaches this only in as far as it was pushed down onto the order's items — a discount the order carries on shipping or as a standalone adjustment is not represented here.
# getTaxTotalAsMoney()
Money
Gets the tax total as a Money object. Represents the sum of tax values across all line items, including shipping. The lines' Tax values plus the tax on the selected shipping rate, mirroring how the order's Tax Total is composed.
# getTotalAsMoney()
Money
Gets the grand total as a Money object. Represents the final value calculated as Item Total + Shipping Total - Discount Total + Tax Total. This is what the fulfillment is worth — the figure a packing slip, a customs declaration or a parcel's declared value is drawn from — and it is derived on every call rather than stored, because the order and its invoices remain the financial record. The fulfillments of an order are not guaranteed to sum to that order: an order-level discount or surcharge that was never pushed down onto its items has no line to belong to, and an item not yet allocated to any fulfillment is in none of them.
# getId()
?int
# getSite()
?Site
# getStatus()
?string
# getType()
?string
# getCreated()
?DateTime
Date the record was created.
# getModified()
?DateTime
Last modification date for the record.
# getDeliveryAddress()
?Address
# getWarehouse()
?Warehouse
# getOrder()
?BaseOrder
# getSelectedShippingRate()
?Rate
# getTransactions()
?Collection<Transaction>
# getShipments()
?Collection<Shipment>
# getShippingRates()
?Collection<Rate>
# getFulfillmentItems()
?Collection<FulfillmentItem>
# getExternalId()
?string
# isNewRecord() Not in API & Jobs
bool
Check if the record is a new record
# isHierarchicalModel() Not in API & Jobs
bool
Check whether a model is a hierarchical model, i.e. can have children
# isVersionedModel() Not in API & Jobs
bool
Check whether a model is versioned

Methods 2

Take arguments. The API serialises only getters that need none.

# getLogForStatus(string $status)
?FulfillmentLog
The latest status log entry that moved the fulfillment into the given status
# getStatusReachedAt(string $status)
?DateTime
When the fulfillment reached the given status: its creation for pending, otherwise the status log

API & Jobs view

API & JobsEach property is a key in REST API responses and job payloads. Its name is the template getter without get, is or has. Methods that need arguments are not available here.

Properties 43

Read-only values on the record.

# statusLabels
array
Gets all available statuses with their labels, in the wording of the fulfillment's type. A pickup keeps the ready and delivered statuses but reads "Ready for collection" and "Collected"; a fulfillment with nothing to ship reads "Delivered digitally". The label of the current status is always getStatusDisplay().
# statusDisplay
string
Gets the status display label, in the wording of the fulfillment's type. A pickup keeps the ready and delivered statuses but reads "Ready for collection" and "Collected"; a delivered fulfillment with nothing to ship reads "Delivered digitally".
# nothingToShip
bool
Whether the selected rate's method has nothing to ship: digital products, gift cards and services Such a fulfillment is completed when its order is paid, goes straight from pending to delivered, holds no stock of its own, and gets no shipments or packing slip.
# completedAutomatically
bool
Whether the fulfillment was delivered by the system rather than by a person: a nothing-to-ship fulfillment completed as its order was paid
# pending
bool
Is the fulfillment still pending — nothing picked, packed, shipped or cancelled yet
# ready
bool
Is the fulfillment picked and packed, waiting for the carrier or, for a pickup, for the customer
# inTransit
bool
Is the fulfillment with the carrier
# delivered
bool
Has the customer received the goods: delivered to them, or collected by them for a pickup
# cancelled
bool
Is the fulfillment cancelled
# resolvedType
string
How the goods reach the customer: the stored type, or for a row written before the column existed, inferred from its shape A delivery address means delivery, otherwise pickup.
# delivery
bool
Are the goods delivered to the customer's address
# pickup
bool
Does the customer collect the goods from the fulfillment's warehouse
# skippingShipping
bool
Whether the fulfillment goes straight to delivered: its method has nothing to ship and it has not left the warehouse One already in transit - shipped before its method was switched to nothing to ship - finishes its type's lifecycle, stock movements included.
# allowedActions
array
The lifecycle actions the fulfillment allows now, for templates and API consumers Response models only expose getters, so this is how a card decides which buttons to show; each value names the can*() check it stands for.
# stockTracked
bool
Whether the fulfillment's stock is tracked in the inventory ledger: at least one line holds a reservation row Only then does a lifecycle transition move stock. A fulfillment built while inventory tracking was off holds none, whatever the setting says now.
# itemCount
int
The number of units in the fulfillment, across all its lines
# typeDisplay
string
How the goods reach the customer, as a label: "Delivery", "Pickup", or "Digital" when there is nothing to ship
# customerName
string
The customer the order is for, by name: the person, or the billing name for a guest
# trackingSummary
string
The latest shipment's tracking code, followed by how many more shipments there are: "AB123 +2 more"
# currency
Currency
Gets the currency of the fulfillment, taken from the order it belongs to
# itemTotalAsMoney
Money
Gets the item total as a Money object. Represents the sum of all items' Amount values. The items are this fulfillment's lines, so this is the value of the goods in it, before discount and tax.
# shippingTotalAsMoney
Money
Gets the shipping total as a Money object. Represents the net shipping total. Tax on shipping is tracked in Tax Total. It is the selected shipping rate, which excludes tax, and zero until a rate is selected. A discount the order carries on shipping is not part of this fulfillment, see getDiscountTotalAsMoney().
# discountTotalAsMoney
Money
Gets the discount total as a Money object. Represents the sum of discount values across all line items. An order-level discount reaches this only in as far as it was pushed down onto the order's items — a discount the order carries on shipping or as a standalone adjustment is not represented here.
# taxTotalAsMoney
Money
Gets the tax total as a Money object. Represents the sum of tax values across all line items, including shipping. The lines' Tax values plus the tax on the selected shipping rate, mirroring how the order's Tax Total is composed.
# totalAsMoney
Money
Gets the grand total as a Money object. Represents the final value calculated as Item Total + Shipping Total - Discount Total + Tax Total. This is what the fulfillment is worth — the figure a packing slip, a customs declaration or a parcel's declared value is drawn from — and it is derived on every call rather than stored, because the order and its invoices remain the financial record. The fulfillments of an order are not guaranteed to sum to that order: an order-level discount or surcharge that was never pushed down onto its items has no line to belong to, and an item not yet allocated to any fulfillment is in none of them.
# editUrl Not in Templates
?string
Get the url for editing the record.
# id
?int
# site
?Site
# status
?string
# type
?string
# created
?DateTime
Date the record was created.
# modified
?DateTime
Last modification date for the record.
# deliveryAddress
?Address
# warehouse
?Warehouse
# order
?BaseOrder
# selectedShippingRate
?Rate
# transactions
?Collection<Transaction>
# shipments
?Collection<Shipment>
# shippingRates
?Collection<Rate>
# fulfillmentItems
?Collection<FulfillmentItem>
# externalId
?string

Admin view

AdminAvailable in cdna-admin templates. Copy an admin template into your site repository to change how this record is edited.

Properties 57

Take no arguments.

# getStatusLabels()
array
Gets all available statuses with their labels, in the wording of the fulfillment's type. A pickup keeps the ready and delivered statuses but reads "Ready for collection" and "Collected"; a fulfillment with nothing to ship reads "Delivered digitally". The label of the current status is always getStatusDisplay().
# getStatusDisplay()
string
Gets the status display label, in the wording of the fulfillment's type. A pickup keeps the ready and delivered statuses but reads "Ready for collection" and "Collected"; a delivered fulfillment with nothing to ship reads "Delivered digitally".
# isNothingToShip()
bool
Whether the selected rate's method has nothing to ship: digital products, gift cards and services Such a fulfillment is completed when its order is paid, goes straight from pending to delivered, holds no stock of its own, and gets no shipments or packing slip.
# isCompletedAutomatically()
bool
Whether the fulfillment was delivered by the system rather than by a person: a nothing-to-ship fulfillment completed as its order was paid
# isPending()
bool
Is the fulfillment still pending — nothing picked, packed, shipped or cancelled yet
# isReady()
bool
Is the fulfillment picked and packed, waiting for the carrier or, for a pickup, for the customer
# isInTransit()
bool
Is the fulfillment with the carrier
# isDelivered()
bool
Has the customer received the goods: delivered to them, or collected by them for a pickup
# isCancelled()
bool
Is the fulfillment cancelled
# getResolvedType()
string
How the goods reach the customer: the stored type, or for a row written before the column existed, inferred from its shape A delivery address means delivery, otherwise pickup.
# isDelivery()
bool
Are the goods delivered to the customer's address
# isPickup()
bool
Does the customer collect the goods from the fulfillment's warehouse
# isSkippingShipping()
bool
Whether the fulfillment goes straight to delivered: its method has nothing to ship and it has not left the warehouse One already in transit - shipped before its method was switched to nothing to ship - finishes its type's lifecycle, stock movements included.
# getAllowedActions()
array
The lifecycle actions the fulfillment allows now, for templates and API consumers Response models only expose getters, so this is how a card decides which buttons to show; each value names the can*() check it stands for.
# isStockTracked()
bool
Whether the fulfillment's stock is tracked in the inventory ledger: at least one line holds a reservation row Only then does a lifecycle transition move stock. A fulfillment built while inventory tracking was off holds none, whatever the setting says now.
# getItemCount()
int
The number of units in the fulfillment, across all its lines
# getTypeDisplay()
string
How the goods reach the customer, as a label: "Delivery", "Pickup", or "Digital" when there is nothing to ship
# getCustomerName()
string
The customer the order is for, by name: the person, or the billing name for a guest
# getTrackingSummary()
string
The latest shipment's tracking code, followed by how many more shipments there are: "AB123 +2 more"
# getCurrency()
Currency
Gets the currency of the fulfillment, taken from the order it belongs to
# getItemTotalAsMoney()
Money
Gets the item total as a Money object. Represents the sum of all items' Amount values. The items are this fulfillment's lines, so this is the value of the goods in it, before discount and tax.
# getShippingTotalAsMoney()
Money
Gets the shipping total as a Money object. Represents the net shipping total. Tax on shipping is tracked in Tax Total. It is the selected shipping rate, which excludes tax, and zero until a rate is selected. A discount the order carries on shipping is not part of this fulfillment, see getDiscountTotalAsMoney().
# getDiscountTotalAsMoney()
Money
Gets the discount total as a Money object. Represents the sum of discount values across all line items. An order-level discount reaches this only in as far as it was pushed down onto the order's items — a discount the order carries on shipping or as a standalone adjustment is not represented here.
# getTaxTotalAsMoney()
Money
Gets the tax total as a Money object. Represents the sum of tax values across all line items, including shipping. The lines' Tax values plus the tax on the selected shipping rate, mirroring how the order's Tax Total is composed.
# getTotalAsMoney()
Money
Gets the grand total as a Money object. Represents the final value calculated as Item Total + Shipping Total - Discount Total + Tax Total. This is what the fulfillment is worth — the figure a packing slip, a customs declaration or a parcel's declared value is drawn from — and it is derived on every call rather than stored, because the order and its invoices remain the financial record. The fulfillments of an order are not guaranteed to sum to that order: an order-level discount or surcharge that was never pushed down onto its items has no line to belong to, and an item not yet allocated to any fulfillment is in none of them.
# getEditUrl() Not in Templates
?string
Get the url for editing the record.
# getId()
?int
# getSite()
?Site
# getStatus()
?string
# getType()
?string
# getCreated()
?DateTime
Date the record was created.
# getModified()
?DateTime
Last modification date for the record.
# getDeliveryAddress()
?Address
# getWarehouse()
?Warehouse
# getOrder()
?BaseOrder
# getSelectedShippingRate()
?Rate
# getTransactions()
?Collection<Transaction>
# getShipments()
?Collection<Shipment>
# getShippingRates()
?Collection<Rate>
# getFulfillmentItems()
?Collection<FulfillmentItem>
# getExternalId()
?string
# isNewRecord() Not in API & Jobs
bool
Check if the record is a new record
# isHierarchicalModel() Not in API & Jobs
bool
Check whether a model is a hierarchical model, i.e. can have children
# isVersionedModel() Not in API & Jobs
bool
Check whether a model is versioned
# getTitle() Admin only
string
The card heading: "Delivery from Richmond", "Pickup at Newport", just the type when there is no warehouse (inventory not tracked), or "Digital delivery" when there is nothing to ship
# getWarehouseName() Admin only
string
The warehouse's name for the static fulfillments list, empty when there is none (inventory not tracked, or nothing to ship) Empty rather than null: the list's select filter offers every distinct value of the column, and would offer a null as a literal "null".
# getProgressSteps() Admin only
array
The progress bar: one step per status of the fulfillment's type, each with whether it is reached A cancelled fulfillment, or one with nothing to ship, has no progress bar. The time of a reached step comes from getStatusReachedAt(), called for the step's status, and not from this array: a response model converts a date it returns directly to the site's timezone, but not one inside an array.
# isOpenByDefault() Admin only
bool
Whether the card starts expanded: every fulfillment still being worked on; delivered and cancelled ones start collapsed to one line
# getLatestShipment() Admin only
?Shipment
The most recently added shipment, shown on the collapsed card
# getRecipientName() Admin only
string
Who the parcel is for, by name: the person or company a delivery's address names, or the customer who collects a pickup. The counter staff must be able to tell whose parcel it is. A guest's person record usually has no name, and its full name is then empty rather than null, so for a pickup the billing name and finally the email stand in. A delivery address may name no one, as the shipping step often receives the street address alone. The name then comes from the order's delivery address, as OrderConverter::fillFulfillmentRecipients() fills it in for orders placed since.
# getRecipientPhone() Admin only
?string
The recipient's phone: the delivery address's own, else the order's delivery address's, or the billing phone for a pickup
# getRecipientAddressLines() Admin only
array
The delivery address as printed lines, the recipient's company first; a pickup has none. The company comes from the same address as getRecipientName(), which may be the order's when the fulfillment's names no one.
# getDeliveryNumber() Admin only
int
Which delivery of the order this is, the 2 of "delivery 2 of 3", counting the order's fulfillments that are not cancelled and have something to ship, in creation order
# getDeliveryCount() Admin only
int
How many deliveries the order is split into, the 3 of "delivery 2 of 3": its fulfillments that are not cancelled and have something to ship
# getShippingMethodName() Admin only
?string
The selected rate as the packing slip prints it: "Standard · Australia Post", or the rate's name alone when it names no carrier

Methods 3

Take arguments. The API serialises only getters that need none.

# getLogForStatus(string $status)
?FulfillmentLog
The latest status log entry that moved the fulfillment into the given status
# getStatusReachedAt(string $status)
?DateTime
When the fulfillment reached the given status: its creation for pending, otherwise the status log
# getBarcode(string $symbology) Admin only
Barcode
The fulfillment's id as a barcode a warehouse scanner reads, for the packing slip. The framework's slip prints Code 39. A site's own slip template may ask for another symbology by name; \Inventory\Services\BarcodeService lists the ones it can encode.