Skip to main content

Inventory

ION tracks parts by serial number or lot number. You can also leave a part untracked and record only its quantity. Part inventory holds information about a part and sets it up so you can track it in runs and aBOM construction. This page covers how to create part inventory objects, issue those parts to part kits to allocate inventory to runs, and move new or unused parts back into inventory.
Part inventoryDescription
idUnique identifier for a part inventory object.
serialNumberRequired if the part is serial tracked. Must be unique per part, so another inventory object with the same part relation cannot have a matching serial number. Can optionally be autogenerated.
lotNumberRequired if the part is lot tracked. Can optionally be autogenerated.
locationLocation where the inventory object is stored.
partPart that this inventory object is an instance of.
unitOfMeasureHow the quantity of this inventory object is measured.
quantityAmount of inventory present.
runsRuns related to this inventory object.
installedtrue if all quantity is attached to aBOM items, otherwise false.
kittedtrue if all quantity is kitted to runs, otherwise false.

Inventory tracking types

Tracking type
serialAny inventory with a serial number has the serial tracking type. It can also have a lot number in addition. Serialized inventory objects can only have a quantity of 0 or 1.
lotAny inventory object with a lot number and no serial number is lot tracked. Lot-tracked items must have a quantity greater than or equal to 0.
untrackedIf a part inventory has neither a serial nor a lot number, it is an untracked item. There are no quantity restrictions on an untracked part.

Query part inventories

The queries below list part inventories by a filter or get a specific inventory object: List part inventory with a filter:
query PartInventories($filters: PartInventoriesInputFilters, $sort: [PartInventorySortEnum]) {
    partInventories(sort: $sort, filters: $filters, first: 50) {
        edges {
            node {
                id cost quantity usageType
                part { partNumber }
                location { id }
            }
        }
    }
}
Set the filter variables:
{
    "filters": {
        "locationId": {
            "eq": 1
        }
    }
}
Get a single part inventory record by ID:
query PartInventory {
    partInventory(id: 1) {
        id cost quantity usageType
        part { partNumber }
        location { id }
    }
}

Create part inventories

Run the mutation below with the first inputs to create a part inventory object for the serial part with part id 1. Run the mutation again with the second inputs to create an inventory object for the lot-tracked part with part id 2. When you specify no quantity, the inventory object has a quantity of 0. You can also autogenerate the serial number and lot number using the last set of inputs. Create the inventory with this mutation:
mutation CreatePartInventory($input: CreatePartInventoryInput!) {
    createPartInventory(input: $input) {
        partInventory {
            id quantity cost usageType createdById
            trackingType locationId supplierId _etag
        }
    }
}
Serialized parts can be part of lots too. The input can include a lot number. Serial-tracked parts cannot have a quantity greater than 1. Set the variables for a serialized part:
{
    "input": {
        "serialNumber": "sn-1",
        "lotNumber": "123",
        "quantity": 1,
        "partId": 1,
        "supplierId": 1,
        "locationId": 5
    }
}
Set the variables for a lot-tracked part:
{
    "input": {
        "lotNumber": "lot-12",
        "partId": 2,
        "supplierId": 1,
        "locationId": 5
    }
}
Autogenerate a serial or lot number with these variables:
{
    "input": {
        "autogenerateSerialNumber": true,
        "autogenerateLotNumber": true,
        "lotNumber": "123",
        "quantity": 1,
        "partId": 1,
        "supplierId": 1,
        "locationId": 5
    }
}

Update inventory items

You can change almost all the fields on an inventory object except its relation to the part it is an instance of. All the quantity and tracking-type validations enforced on creation are also enforced on update. The mutation returns the updated part inventory object. Update the inventory with this mutation:
mutation UpdatePartInventory($input: UpdatePartInventoryInput!) {
    updatePartInventory(input: $input) {
        partInventory {
            id quantity cost locationId serialNumber lotNumber
        }
    }
}
Set the variables:
{
    "input": {
        "id": 1,
        "etag": "etag1",
        "lotNumber": "ion-21",
        "cost": 11.21,
        "locationId": 1
    }
}

Delete part inventories

Delete a part inventory object using the following mutation. It returns the id of the deleted part inventory object. Delete the inventory with this mutation:
mutation DeletePartInventory($id: ID!, $etag: String!) {
    deletePartInventory(id: $id, etag: $etag) {
        id
    }
}
Set the variables:
{
    "id": 1,
    "etag": "etag1"
}

Issue parts to runs

Diagram of parts moving from inventory to kits to aBOM installations and back to inventory in ION.

Part kits

Part kits let you allocate specific parts and quantities for a run. To create a part kit, you must already have a run. See the Runs example for how to create one. To remove parts from inventory and attach them to the run that consumes them, use a part kit object. The mutation below creates a part kit and attaches it to a run:
Part kitsDescription
idUnique identifier for a part kit object.
runRun that inventory objects are kitted to.
partInventoriesInventory objects with an additional field, issuedQuantity, which identifies the quantity of the inventory allocated to the run.
Create a kit with this mutation:
mutation CreatePartKit($input: CreatePartKitInput!) {
    createPartKit(input: $input) {
        partKit {
            id run { id title }
        }
    }
}
Set the variables:
{
    "input": {
        "runId": 1
    }
}

Issue inventory to kits

To move parts from inventory into the part kit, use the issueItemToKit mutation. Whether a part is serial-tracked, lot-tracked, or untracked, you reference its partInventoryId and, when the item is not serial-tracked, the quantity you want to issue to that kit: Issue an item to the kit with this mutation:
mutation IssueItemToKit($input: InventoryToKitInput!) {
    issueItemToKit(input: $input) {
        partInventory {
            id serialNumber partKits { id }
        }
    }
}
Set the variables:
{
    "input": {
        "partInventoryId": 1,
        "etag": "etag",
        "partKitItemId": 1
    }
}
Issuing serials, lots, or untracked parts works similarly and uses the same issueItemToKit mutation. When you issue parts to a kit, the kit shows the quantity of that required part fulfilled as issuedQuantity. The quantity is decremented from the original inventory object.

Move parts back to inventory

Once a serial-tracked part is built, move it back to inventory for use on a higher-level assembly. To do so, use the moveItemToInventory mutation: Move an item back to inventory with this mutation:
mutation MoveItemToInventory($input: InventoryToKitInput!) {
    moveItemToInventory(input: $input) {
        partInventory {
           id quantity partId serialNumber lotNumber 
           location { name } partKits { id }
        }
    }
}
Set the variables:
{
    "input": {
        "quantity": 2,
        "partKitItemId": 1, 
        "etag": "etag",
        "partInventoryId": 3
    }
}
Include the quantity in case a lot-tracked or untracked inventory item with a quantity greater than 1 needs to move back to inventory, but not the full amount originally issued. You must include the quantity you are moving back to inventory.

Query part kits

List part kits with a filter:
query PartKits($filters: PartKitsInputFilters) {
    partKits(filters: $filters) {
        edges{
            node {
                id
                run { id }
                partInventories { id issuedQuantity }
            }
        }
    }
}
Set the filter variables:
{
    "filters": {
        "runId": {
            "eq": 1
        }
    }
}