Inventory gets multi-source funding, eligibility rules, and a deliberate override workflow
The inventory module just got the three pieces that turn "track what's on the shelf" into "report on every dollar of grant compliance, end to end." All three are off by default — flip on fund tracking in Settings → Inventory when you're ready to use them, and your existing inventory keeps working exactly as before until you do.
Declare funding sources for your inventory. A new Funding Sources page lets you record where your inventory dollars come from — grant-backed (linked to any grant you've already created in Grants) or fund-backed (linked to any donor fund). The platform always keeps an auto-created Unrestricted source as the fallback, so you can never accidentally delete the safety net.
Split a receipt across multiple sources. When fund tracking is on, every line on the Receive inventory form gets an Allocations sub-form. Say a 100-case beans receipt came from 60 CDBG dollars and 40 in-kind: declare it that way at receipt time, and from that moment on every can of beans that leaves the shelf reports back to the right source.
Plan purchases ahead with purchase orders. A new Purchase Orders page lets you draft and track POs with line-level fund allocations. When the goods arrive, you can pre-populate a receipt from the PO and edit before finalizing — the receipt is the truth, the PO is intent.
Configure eligibility rules per funding source. On any operator-created source's detail page, an Eligibility rules editor lets you constrain who that source can serve — by income bracket, recipient kind (client / household / partner agency / anonymous), service category, ZIP prefix, or age range. Constraints AND-compose; an empty rule set is unrestricted (everyone is eligible). At distribute time, eligibility rules filter which sources can fund a recipient — so a grant only ever pays for the recipients it's allowed to pay for.
Decide what happens when eligibility fails. Same detail page, a When rules fail selector lets you pick the per-source behavior when eligibility excludes a source from a distribution:
- Hard block — the distribution fails. Strictest compliance posture.
- Soft warning (default) — the operator sees a confronted alert at distribute time with the exact rules that excluded the source and the recipient's context. To proceed, the operator supplies a written override reason that gets logged to the audit trail. The override decision is deliberate, not a click-through.
- Auto fallback — the unrestricted source pays automatically, no operator prompt. Useful for "fall back to general dollars" policies where eligibility is a preference, not a hard rule.
The override audit trail. Every overridden distribution writes an override eligibility activity event recording which source was overridden, which rules failed, the operator's reason, and the recipient context — visible in Settings → Activity. Auditors get the exact "who decided to override this rule, when, why" trail they ask for.
What stays the same. If you don't turn on fund tracking, none of this appears in your inventory UI. Receive and distribute work exactly as they did before — every receipt lands on the unrestricted source, every distribution consumes from there, no allocations field, no eligibility rules, no override prompt. The feature is additive at every layer; the off state is the prior state.

