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.).
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 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.
|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.
|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.
|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.
|3||com.storedobject.ui.inventory.ReceiveMaterial|Main Store||A01 A02 A05|
|10||com.storedobject.ui.inventory.TransferMaterial|Main Store||A04 A06|
- GRN entries for the main store. You could also use the more generic
com.storedobject.ui.inventory.ReceiveMateriallogic to handle different type of receipts such as GRNs, receipt of materials returned from other locations etc. See 2.
- This is the same as 1.
- 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.
- Receive materials returned from other locations.
- Receive materials transferred from other locations.
- Process material requests sent by other locations.
- Request for materials from a store.
- Return material to a store.
- Receive materials sent from a store (against requests).
- Transfer materials to other stores and locations.
- Return items received for repair to stores.
- 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:
In fact, just the generic logic
com.storedobject.ui.inventory.ReceiveMaterial allows all types of receipts.
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
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:
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):
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
|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
|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
|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
|com.storedobject.ui.inventory.ProcessMaterialRequest|Store_Name||Process material/tool request for a specific store.|
Return Materials / Tools
|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
|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.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.|