9001. The Built in Inventory Management System - syampillai/SOTraining Wiki


The SO Platform has a quite sophisticated built-in Inventory Management System and can be used directly without implementing any extended core classes. (Please follow the section Inventory Design Guidelines to understand how you can customize the Inventory Management System). Additionally, all features described here also work with the extended classes!

We use the terms item, inventory item and materials on this page and all of them means stock items in the inventory system. However, basically, 2 fundamentally different categories of items are recognized by the built-in Inventory Management System viz. serialized items, non-serialized items. (Also, there are other categorizations such as expendable, consumable etc.).

Serialized Items

In addition to a part number that every item will have, serialized items have unique serial numbers. With its serial number, we can always track it wherever it moves. For example, every laptop computer in the inventory can be tracked individually because it has a unique serial number. So, the measurement unit type of serialized items is always Count.

Non-serialized Items

Non-serialized items do not have unique serial numbers. However, they can still have batch numbers or lot numbers.

Movement of Materials

Materials move from one location to another (A location could be a bin or SKU in the store or some other location. Please see Inventory Design Guidelines to understand the concept of locations).

To understand the movement of materials, consider an organization with 2 stores, 1 maintenance unit and 1 repair unit. Let us name these as follows.

Name Description
Main Store The main store where items are purchased
Sub-store The second store at a different geographic location
Maintenance Unit A location where maintenance takes place
Repair Unit A place where faulty items are repaired

Let us define 3 user groups (UG) in the system. For convenience, we will refer to them as G1, G2, G3 and G4.

User Group Description
G1 Users located at the Main Store
G2 Users located at the Sub-store
G3 Users located at the Maintenance Unit
G4 Users located at the Repair Location

The following table shows various activities that can happen in this organization.

Activity Happens at UG
A01: Process GRN (for accepting materials purchased) Main Store G1
A02: Accept materials returned by other locations (such as Maintenance Unit, Repair Unit etc.) Main Store G1
A03: Process material requests sent by other locations (such as Maintenance Unit) Main Store G1
A04: Sent items for repair (to Repair Unit) Main Unit G1
A05: Receive items transferred from other stores (such as Sub-store) Main Store G1
A06: Transfer items to other stores (e.g. Sub-store). G1
A07-A12: Activities similar to the above one (A01-A06) can happen at the Sub-store also. Sub-store G2
A13: Requests for materials from Main Store or Sub-store to carry out some maintenance activity. Maintenance Unit G3
A14: Receive materials issued by Main Store or Sub-store (against the requests sent in A13) Maintenance Unit G3
A15: Return materials to stores (Typically balance of materials after carrying out maintenance work) Maintenance Unit G3
A16: Receive items sent by stores for repair Repair Unit G4
A17: Return items back to stores (maybe, after repairing) Repair Unit G4

The above list is not exhaustive because there can be activities like Sub-store requesting for items from Main Store etc. Also, the stores other than the main store may not be allowed to do any purchase directly as a policy of the organization. So, some activities may be dedicated to the policy.

The following table shows examples of UI logic that can be used to create appropriate menu options for handling the above-mentioned activities. You may notice that there are more than one ways of carrying out the same activity. Options must be assigned to the respective user group given in the last column of the activity table.

No Class Name Activity
1 com.storedobject.ui.inventory.GRN||Main Store A01
2 com.storedobject.ui.inventory.ReceiveMaterial|Main Store|0 A01
3 com.storedobject.ui.inventory.ReceiveMaterial|Main Store A01 A02 A05
4 com.storedobject.ui.inventory.ReceiveMaterial|Main Store|1 A02
5 com.storedobject.ui.inventory.ReceiveMaterial|Main Store|2 A05
6 com.storedobject.ui.inventory.ProcessMaterialRequest|Main Store A03
7 com.storedobject.ui.inventory.RequestMaterial|Maintenance Unit A13
8 com.storedobject.ui.inventory.ReturnMaterial|Maintenance Unit A15
9 com.storedobject.ui.inventory.ReceiveMaterial|Maintenance Unit|0 A14
10 com.storedobject.ui.inventory.TransferMaterial|Main Store A04 A06
11 com.storedobject.ui.inventory.ReturnMaterial|Repair Unit A17
12 com.storedobject.ui.inventory.ReceiveMaterial|Repair Unit|1 A16
  1. GRN entries for the main store. You could also use the more generic com.storedobject.ui.inventory.ReceiveMaterial logic to handle different type of receipts such as GRNs, receipt of materials returned from other locations etc. See 2.
  2. This is the same as 1.
  3. All types of receipts are handled. In 2, only one type of receipt is handled because type '0' stands for GRN. Different receipt type codes are given in the table below.
  4. Receive materials returned from other locations.
  5. Receive materials transferred from other locations.
  6. Process material requests sent by other locations.
  7. Request for materials from a store.
  8. Return material to a store.
  9. Receive materials sent from a store (against requests).
  10. Transfer materials to other stores and locations.
  11. Return items received for repair to stores.
  12. Receive items sent by stores for repair.

Receipt Type Codes Type Code | Applicable to | Meaning
0 | Stores | GRN - Purchases
1 | Stores | Materials Returned from Other Locations
2 | Stores | Materials Transferred from Other Stores
3 | Stores | Materials Transferred from Other Stores (Against Requests)
4 | Stores | Returned from Repair/Maintenance Organizations
5 | Stores | Lease Returns
6 | Stores | GRN - From External Owners
7 | Stores | Return Tools
8 | Stores | GRN - Loan from Lender 0 | Locations Other Than Stores | Materials Issued from Stores
1 | Locations Other Than Stores | Materials Transferred from Other Locations

The logic used for Transfers and Returns supports an additional parameter to specify the other location. So, they can be used in the following way to create options with specific locations at both ends.

Send materials from Main Store to Repair Unit:
com.storedobject.ui.inventory.TransferMaterial|Main Store|Repair Unit

Return materials from Repair Unit to Main Store:
com.storedobject.ui.inventory.ReturnMaterial|Repair Unit|Main Store

More Types of Movements

There could be other types of movement of items such as (refer to the table above for codes):
(a) Sending items to a repair organization for repairing damaged items, receiving items back from them (Please note that a repair organization is an external organization unlike the Repair Unit we mentioned above that is an internal unit.)
(b) Renting out items to other organizations, the return of such items
(c) Taking items on a lease from an external organization, the return of such items

Most of the logic mentioned above can be used in these cases too.

For example: (Assuming that there is a Repair Organization called "Repair Org").

Send items for repair:
com.storedobject.ui.inventory.TransferMaterial|Main Store|Repair Org

Receive items returned from repair organizations:
com.storedobject.ui.inventory.ReceiveMaterial|Main Store|4

In fact, just the generic logic com.storedobject.ui.inventory.ReceiveMaterial allows all types of receipts.

Tool Handling

Tools are handled exactly like materials and the same logic classes can be used for tools too except in the case of com.storedobject.ui.inventory.RequestMaterial, you have to use com.storedobject.ui.inventory.RequestTool.

Please note that tools are issued to custodians who are responsible to return them. A custodian location should exist before issuing tools.

The logic class com.storedobject.ui.inventory.ReceiveMaterial can handle both Materials and Tools. Also, it can be configured to receive only Tools as follows:
com.storedobject.ui.inventory.ReceiveMaterial|Main Store|7

However, Data Classes for tool-type and tool should be defined in the platform using the following com.storedobject.core.GlobalProperty entries (values are examples values):

Name Value
TOOLS-TYPE-CLASS com.mycompany.neem.inventory.ToolType
TOOLS-CLASS com.mycompany.neem.inventory.Tool

Inventory Related Menu Items

The platform provides myriad possibilities of defining menu items to utilize the built-in capabilities of the inventory system. This section is trying to document a comprehensive set of samples. You can use them to create menu items with appropriate menu labels. (Some are repetition from the previous sections).

Please note: Wherever Class Name needs to be used, it should be a fully qualified class name.

Receive Materials / Tools

Menu Logic Description
com.storedobject.ui.inventory.ReceiveMaterial Receive any type of materials/tools. Users will be prompted with a popup to select a store as well as a type of receipt.
com.storedobject.ui.inventory.ReceiveMaterial|Store_Name Receive any type of materials/tools to a specific store. Users will be prompted with a popup to select a type of receipt.
com.storedobject.ui.inventory.ReceiveMaterial|Store_Name|0 Receive GRN (Purchases) of materials to a specific store.
com.storedobject.ui.inventory.GRN||Store_Name Same as the above.
com.storedobject.ui.inventory.ReceiveMaterial|Store_Name|1 Receive materials returned from other locations to a specific store.
com.storedobject.ui.inventory.ReceiveMaterial|Store_Name|2 Receive materials transferred from other stores to a specific store.
com.storedobject.ui.inventory.ReceiveMaterial|Store_Name|3 Receive materials transferred from other stores (against requests) to a specific store.
com.storedobject.ui.inventory.ReceiveMaterial|Store_Name|4 Receive materials returned from repair/maintenance organization to a specific store.
com.storedobject.ui.inventory.ReceiveMaterial|Store_Name|5 Receive lease returns to a specific store.
com.storedobject.ui.inventory.ReceiveMaterial|Store_Name|6 Receive GRNs (from external owners) to a specific store.
com.storedobject.ui.inventory.ReceiveMaterial|Store_Name|7 Receive tools returned by someone to a specific store.
com.storedobject.ui.inventory.ReceiveMaterial|Store_Name|8 Receive loaned items from someone to a specific store.
com.storedobject.ui.inventory.ReceiveMaterial|Location_Name|0 Receive materials issued from other stores to a specific location. Locations are not really stores but units such as "Repair Unit" etc.
com.storedobject.ui.inventory.ReceiveMaterial|Location_Name|1 Receive materials transferred from other locations to a specific location. Locations are not really stores but units such as "Repair Unit" etc.

Request for Materials / Tools

Menu Logic Description
com.storedobject.ui.inventory.RequestMaterial|Location_Name Request for material for a specific location.
com.storedobject.ui.inventory.RequestMaterial|Location_Name|Class_Name Request for a specific class of materials for a given location.
com.storedobject.ui.inventory.RequestTool Request for tools. The user currently logged in should be a custodian.
com.storedobject.ui.inventory.RequestTool|Custodian_Name Request for tools for a specific custodian.

Transfer Materials / Tools

Menu Logic Description
com.storedobject.ui.inventory.TransferMaterial|Location_Name Transfer materials from a specific location to another.
com.storedobject.ui.inventory.TransferMaterial|Location_Name|Class_Name Transfer a specific class of materials from a specific location to another.
com.storedobject.ui.inventory.SendItemsForRepair|Location_Name Send items for repair from a specific location.
com.storedobject.ui.inventory.SendItemsForRepair|Location_Name|Class_Name Send specific class of items for repair from a given location.

Process Material / Tools Requests

Menu Logic Description
com.storedobject.ui.inventory.ProcessMaterialRequest|Store_Name Process material/tool request for a specific store.

Return Materials / Tools

Menu Logic Description
com.storedobject.ui.inventory.ReturnMaterial|Location_Name Return materials from a specific location.
com.storedobject.ui.inventory.ReturnMaterial|Location_Name|Class_Name Return specific class of materials/tools from a specific location.
com.storedobject.ui.inventory.ReturnTool Return tools. The user currently logged in should be a custodian.
com.storedobject.ui.inventory.ReturnTool|Custodian_Name Return tools from a specific custodian.

Reports / Information Screens

Menu Logic Description
com.storedobject.ui.inventory.LocateItem Locate items in the inventory.
com.storedobject.ui.inventory.LocateItem|Caption Locate items in the inventory. Caption is the caption to display.
com.storedobject.ui.inventory.LocateItem|Caption|Class_Name Locate specific class of items. For example, if you want tools to be located, you can specify the data class name of the tools type. You can specify the data class name of specific inventory item (instead of inventory item type) and in that case, it will allow you to search for specific Serial Numbers.
com.storedobject.ui.inventory.LocateItem||Class_Name Same as the above but with default caption.
com.storedobject.ui.inventory.LocateItem|INSPECT The keyword INSPECT can be appended to switch on inspection and binning option for the items located.
com.storedobject.ui.inventory.LocateItem|Caption|INSPECT Please read the description above.
com.storedobject.ui.inventory.LocateItem|Caption|Class_Name|INSPECT Please read the description above.
com.storedobject.ui.inventory.LocateItem||Class_Name|INSPECT Please read the description above.
com.storedobject.ui.inventory.StockReport Stock report.
com.storedobject.ui.inventory.StockMovementReport Stock movement report.
com.storedobject.ui.inventory.ItemMovementReport Print or view inventory item movements.
com.storedobject.ui.inventory.ItemMovementView View or print inventory item movements.
com.storedobject.ui.inventory.ItemMovementView|Class_Name View or print movements of specific class of items. For example, if you want to view movement of tools, you can specify the data class name of the tools.