# Indirect Goods Upgrade — Phase 10 Completion

## Reporting authority

The v2 reporting path is enabled through `config/indirect_goods.php`. Direct-goods rows remain sourced from the existing direct tables. Indirect values use these authorities:

| Reported value | Authoritative source |
|---|---|
| Requested quantity | `indirect_goods_request_items.quantity_requested` |
| Issued quantity and method | `indirect_goods_fulfillments` |
| Warehouse balance/value | `indirect_goods_inventory` |
| Project balance/value | `indirect_goods_project_inventory` |
| FOC balance | `indirect_goods_foc_inventory` |
| Returned quantity/condition | `indirect_goods_return_items` and `indirect_goods_returns` |
| Consumed quantity | `indirect_goods_consumption` and linked fulfillment allocations |
| Movement history | `indirect_goods_stock_movements` |

## Report coverage

| Surface | Phase 10 result |
|---|---|
| Material Issued / issue details / print | Combined direct and indirect rows with source types and references |
| Transactions / Material Issue history | Combined fulfillment rows; goods-type badge; filters and exports receive the same collection |
| Outgoing / Material Requests | Combined request totals using fulfillment sums; indirect FOC and supplier direct-delivery methods shown |
| Incoming | Direct receipts plus indirect incoming receipt lines |
| Returns | Direct site returns plus completed/inspected indirect FOC returns; condition and FOC quantity retained |
| Inventory and Materials | Combined catalog, warehouse quantity, value, division and stock status |
| Stock on Project | Direct and indirect project balances and values |
| Division Deliveries | Direct delivery ledger plus indirect warehouse/project/consumption summaries |
| Low stock | Combined inventory status and dashboard count; detailed indirect low-stock page remains available |
| FOC / damaged / expired | Direct FOC remains in the existing FOC report; indirect conditions and FOC balances remain in the indirect return and FOC reports, avoiding insertion into direct `damaged_items` |
| Stock movements | Direct and indirect retain separate detailed ledgers because their identifiers and movement semantics differ |
| Dashboard | Total item, low-stock and pending-transaction counts include indirect goods and returns |

## Filtering and navigation

- Transactions, outgoing requests and returns retain project, division, search and date filters for indirect rows.
- Goods-type badges make direct and indirect rows explicit.
- Detail actions route to the matching direct or indirect document.
- Combined report exports operate on the same post-filter collection as the screen.

## Reconciliation and verification

- PHP syntax checks passed for report and dashboard controllers.
- All Blade templates compile.
- Indirect domain invariant tests pass: 7 tests, 7 assertions.
- Material Issue report smoke test: 921 rows total, including 615 indirect fulfillment rows.
- Combined issued quantity: 47,253.30; indirect authoritative quantity remains 23,831.02.
- Outgoing report released quantity equals Material Issue report issued quantity: 47,253.30.
- Returns report smoke test: 14 rows and 536.00 quantity; there are currently no completed indirect FOC return rows in production data.
- Existing fulfillment reconciliation remains at zero request-line mismatches.

## Operational note

Detailed indirect FOC, movement and condition reports intentionally remain separate screens. Combining their rows with direct-goods tables would hide ledger semantics and risk treating indirect IDs as direct item IDs. Summary surfaces are combined; audit ledgers remain source-specific.

