Finds stock with cover above a threshold or a long idle time, gives each position to its planner with the options, and posts the decision in the ERP.
Today the excess list is a quarterly extract that a planner sorts in a spreadsheet, and the decisions live in the email thread where finance asked about the reserve. By the time the warehouse scraps a batch, the list is 3 months old.
The app reads every stock position with its value, its last movement and the forecast and open sales orders it serves, and computes months of cover. A position above the cover threshold, or idle for more than 180 days, opens a case for the material planner of the plant with the same material's cover at every other plant beside it. The planner proposes a disposition: sell at a discount, transfer to a plant that needs it, rework, return to the supplier, scrap, or keep with a reason. Sales, quality and the controller confirm their part, the warehouse posts the movement from a handheld, and finance sees the reserve move with each decision.
| Lane | Does |
|---|---|
| Material planner | reviews the position and proposes the disposition |
| Sales | finds a customer for a discounted sale or confirms a transfer to a sister plant |
| Quality | confirms rework is feasible or marks the batch for scrap |
| Controller | approves scrap above the limit and confirms the reserve |
| Warehouse | posts the transfer or the scrap from a handheld |
Every screen renders for desktop and mobile; portal screens are the same screens delivered to an outside login.
| Screen | What is on it |
|---|---|
| S01 Excess positions | grid of positions with on-hand, value, months of cover, days since last movement, batch expiry; filter by plant, material type and planner; open button |
| S02 Position detail | stock by storage location and batch, 12-month forecast and open sales orders, receipts and issues over 24 months as a chart, cover at other plants; propose button |
| S03 Disposition | options: sell at a discount, transfer to a plant, rework, return to supplier, scrap, keep with reason; quantity, target plant or customer, discount; note; submit |
| S04 Finance review | proposed dispositions with value and reserve effect; approve or return; reserve total by plant against the excess value |
| S05 Warehouse execution | mobile screen: batch scan, quantity confirmed, transfer or scrap posting button, material document shown |
| S06 Board | excess value by plant and material group, reserve, dispositions by type, value released this quarter |
The first object is the main one; each system page shows the real table or resource behind every handler.
| Object | Why the app reads it | See it on |
|---|---|---|
| Stock position | on-hand, blocked and batch quantities, value and last movement per plant and storage location | S/4HANA · Oracle Fusion · Snowflake · Databricks |
| Material master | type, plant status and lead time | S/4HANA · Oracle Fusion · Snowflake · Databricks |
| Forecast | the next 12 months of demand for the cover calculation | S/4HANA · Oracle Fusion · Snowflake · Databricks |
| Sales order line | open sales orders as firm demand | S/4HANA · Oracle Fusion · Snowflake · Databricks |
| Batch | expiry and status of the batches held | S/4HANA · Oracle Fusion · Snowflake · Databricks |
| Journal line | the reserve posted so far for the material group | S/4HANA · Oracle Fusion · Snowflake · Databricks |
| Object | What changes |
|---|---|
| Stock position | transfer to another plant or scrap posted as a goods movement; quantity moved to blocked stock while a decision is open |
| Material master | plant status set to phase-out so planning stops creating new orders |
| Journal line | the agreed reserve change posted as a journal at month end |
Start: A stock position worth more than 5,000 whose on-hand quantity covers more than 12 months of forecast and open orders, or whose last movement is older than 180 days.
# start criterion, in canonical fields; each system page shows it in that system's fields
{stock.value} > 5000 and ({stock.on_hand} > 12 months of {forecast.qty} + {so.qty} or {stock.last_movement} < today - 180)| Step | Moves when |
|---|---|
| Position selected | case opened for the plant's material planner; cover at other plants and batch expiry shown |
| Disposition proposed | planner chooses an option with a quantity; a sale goes to sales, a rework to quality, a scrap to the controller |
| Function confirmed | sales names a customer or a receiving plant; quality confirms rework or marks the batch for scrap |
| Finance approved | scrap above 10,000, or any change to the reserve, approved by the controller |
| Posted | transfer, scrap or status change posted in the ERP; reserve updated; case closed with the material document |
| Component | Trigger → action → outcome |
|---|---|
| dd_disposition | on change → show the fields the option needs (target plant, customer, discount, rework order) → keep the quantity within on-hand |
| btn_propose | on click → route the case to sales, quality or the controller by option and value → start the 5-day clock |
| btn_post | on tap → call the ERP goods movement interface with the transfer or scrap movement for the scanned batch → store the material document number, close the case |
| btn_phase_out | on click → set the plant material status to phase-out through the material interface → stop new planned orders, refresh S01 |
| Step | Time limit and escalation |
|---|---|
| Planner proposal | 5 working days, then the supply chain lead is reminded |
| Finance approval | 3 working days, then the plant controller's lead is copied |
| Execution | 10 working days, then the warehouse lead is reminded and the case is flagged on S06 |
Names, places and figures are illustrative; the pattern is the catalogue's.
On the first Monday of the quarter the app listed 412 positions at the Lyon plant worth 3.8 million, 60 of them idle for a year. Thomas, the planner for pumps, proposed a transfer of 1,200 seals to the Poznań plant at 09:40 because that plant's cover was 3 weeks; the Poznań planner accepted by 11:00 and the warehouse posted the transfer at 15:20 from a handheld. Sales found a customer for 2 of his other positions by Wednesday, and the controller approved a scrap of 14,000 on Thursday with the reserve updated the same minute. The board showed the plant lead 620,000 released in the quarter and the reserve falling with it.
The objects with their real names, the criteria in that system's fields, the write interface and what to set up first.
Stock position read from MARD · MCHB · MATDOC_EXTRACT; also on SAP ECC.
Open the S/4HANA page →Stock position read from Inventory REST: inventoryOnhandBalances · inventoryItemLots; also on Oracle E-Business Suite.
Open the Oracle Fusion page →Stock position read from CONFORMED.STOCK_POSITION · HISTORY.STOCK_DAILY; lakehouse.
Open the Snowflake page →Stock position read from silver.stock_position · gold.stock_daily; lakehouse.
Open the Databricks page →Other systems connect through the same handlers; see how SmartApps connect.
About 30 minutes to a first running screen on your live rows, and 6 working days to the production-grade version described here, most of it spent agreeing screens and criteria with the process owner.
Any of SAP S/4HANA, Oracle Fusion Cloud, Snowflake, Databricks, with the objects read in place; the pages above show the objects and the write path for each. Two systems at once is one handler per object per system.
Every role in this app is inside the company; an outside role can be added as a lane with a portal screen.
Every step, value, decision, notification and write-back acknowledgement of every instance, with the version of the app, append-only.
Bring the process and the systems it touches. In the first session we register the data handlers, draw the levels or the lanes and run the first screen on your live rows.