Flow
Inputs on each side of the half-case line and what the planner does
1Empty shelf, one sale, very large case
Suggests zero, keeps the running-out flag, and holds the row. The floor is zero and the need is far below a case.
2Empty shelf, a handful of sales
Used to reorder by itself. Now the row is held for a person.
3Group with no stock and no sales
Gets the no-stock, no-sales label and does not start an order.
4Rebuild with a reviewed list
Anything not on the list is skipped with a reason before checks and cart writes.
5Reviewed list comes out empty
Onboarding stops instead of ordering everything.
The ordering system used to suggest a full case of a product that had sold one unit, just because the shelf was empty. It did what my rules told it to.
I caught it by comparing my planner's numbers with an outside reorder report and looking hard at the rows where mine asked for more. The extra came from one rule: if a store has none of something, order at least a full case. That rule looked at the empty shelf. It never looked at whether anyone was buying.
How the order number gets built
The planner looks at recent sales to guess demand, sets a target, and takes away what's on the shelf. That gives the need. A case rule then turns the need into something the supplier will sell. If the need is too small for a supplier that only sells full cases, the row is held so a person can decide.
The old floor ran first, in two spots. One bumped empty items that were about to run out up to a full case. The other did it for any empty item at all.
Why the small-order check never fired
The case rule is built to catch small orders. But the floor had already turned the order into a full case, and a full case is never too small. So the check passed every time. My second safety rule was checking the work of the first, and the first had already filled in the answer.
The new rule for the floor
Now one small function decides the floor, and both spots use it. A full case only goes in when the shelf is empty, the item is flagged as running out, and demand reaches about half a case. That line comes from the supplier's own setting, and it's kept in a safe range. If demand is below it, the floor is zero and the case rule gets the real number.
The test for the one-sale case now suggests zero and holds the row. Two old floor tests had to change because they expected the old floor.
Same mistake, two more spots
Groups of similar products could skip the "no stock, no sales" check and still trigger an order. That's gone. Rebuilds can also take a reviewed list of what's allowed and skip everything else. Onboarding now stops if that list comes out empty, instead of ordering everything.
The half-case line comes from a supplier setting, not from anything I measured. A held row isn't a dead end, either. A buyer can still put a number on it. I haven't counted how often one does.