As you all know, Maximo caters to a varied client base and they are are able to utilize its powerful Out of the Box functionality. Having said that, clients come from various industries and in some cases the functionality that they desire cannot be fulfilled by OOB functionality.
I would like to draw attention to one such case. This case will resonate well with our Transportation clients (Trains, Trams etc)...
Here is the business scenario:
The client operates freight trains that haul iron ore from the mine to different ports in the region. Maintenance of the locomotives and cars is very important as the trains run with heavy loads and are subject to a lot of wear and tear. The locomotives and cars and allt their sub components, such as bogies, axles and wheels are set up as rotating assets in Maximo. Bogies can be taken off the car, maintenance performed at the local workshop, or sent off for overhaul at a vendor, then recived back into the storeroom before being issued out to a new car.
There are different types of overhaul performed, I will give one example which causes problem with inventory values.
A bogie is removed from the car for maintenance, and placed in a repair location. The bogie consists of an asset hierarchy of drive packages, breaks, wheel axles and finally wheels.
A PO is created for maintenance from an external vendor. 3 PO Lines are entered, one for each drive package on the bogie, the line type is Service and the Charge to Store flag is checked ( as the assets are in a
The PO is approved, and some time later the service is received in Maximo. Once the PO is closed the Inventory cost field in the Asset application on each drive package asset is updated with the service cost.
If the drive packages were to be moved into the storeroom individually, the service cost from the Inventory cost fied on the asset, would be set as the last receipt cost for the drive package rotating item in the
Inventory application, and the average cost would be updated accordingly.
But in the client scenario, the drive packages are part of the bogie asset hierarchy, and it is the bogie asset which is moved into the storeroom. The bogie asset has a value of 0 in the Inventory cost field,
and so the last receipt cost for the bogie rotating item is 0. When looking at the rotating item for the drive packages, the last receipt cost is 0 here as well.
So it seems Maximo is not able to handle the situation where the cost from the PO is registered to an asset which is part of an asset hierarchy, and the parent asset is moved into the storeroom.
This is causing big problems for the client as the service costs involved are very high, and this is not at all reflected in the average cost for the rotating items in Inventory.
The correct way for Maximo to handle this scenario would be to roll up the inventory cost of the subassembly assets to the parent asset of the hierarchy and set this value as the last receipt cost for the rotating
item of the parent asset when it is moved into the storeroom.
Prerequisite - In Organisation, Inventory options make sure Issue cost is set to AVERAGE, and issue cost for rotating items is set to Inventory cost.
1. Set up an asset hierarchy, with a parent asset and two children. The assets must be rotating, the parent and children having two different item numbers.
2. Move the asset structure from an operating to a repair location.
3. Create a PO, with two PO Lines, one for each child asset. Add a line cost, set the line type to SERVICE and make sure the Charge to store flag is checked.
4. Receive the services.
5. Close the PO
6. Note that the Inventory cost field in the Asset application for each child asset is updated with the service cost from the PO Line.
7. Move the parent asset from the repair location to a storeroom.
- Use Move Asset option in the Asset application not with Issues and transfer application.
8. Note that the child assets also have been moved into the storeroom.
The last receipt cost for both parent and child items is 0.
For the sake of testing, you can repeat the process but this time create the PO Line for the parent asset, this time you will see that the Last
receipt cost for the parent asset item is equivalent to the Service cost when you get to step 8.
Receiving and moving assets is a complicated process. Inventory.lastcost and averagecost is calculated inside the receiving object. As per the current Maximo design, this is working as designed.
However, the client has the option to customize. The solution can be provide the user with a button to click before performing the asset move. The button will then perform the cost rollup of inventory cost from all child assets to the parent asset.
In order to aid the technical fraternity, Here is a sample that could be used for the button :
/**This is the method to be called by your button. The object is Asset - or your extended Asset object
* @throws MXException
* @throws RemoteException
public void rollUpChildrenInvCost() throws MXException, RemoteException
//NOT SURE - *** need to call save()?
getThisMboSet().save();//please test this.
/**This method recursively getting child assets and returns total invcost from child assets
* @param totalCost
* @throws MXException
* @throws RemoteException
public double rollUpInvCostUpFronmAllChildren(double totalCost) throws MXException, RemoteException
MboSetRemote assetChildren = getChildren();
int i = 0;
Asset asset = null;
while ((asset = (Asset)assetChildren.getMbo(i)) != null)
Hope you find this useful in assessing your client requirement surrounding Inventory Cost rollup and the potential customization code.