- All ChangeInventoryPage sections (withdrawal/damage/waste/loss/transfer/
stock-count/project-transfer) become list-based like the withdrawal
section: pick a warehouse, see its stock rows, material name is only an
optional filter; manual material/brand/unit entry removed everywhere
except PURCHASE.
- RETURN redesigned: day-range presets (today/yesterday/7d/30d + Jalali
custom range) with server-side filters, immutable-ledger returnable
remainder per withdrawal (REF:[tx-id] note tag + FIFO attribution for
legacy returns, round4 float-safe), destination warehouse selector.
- PROJECT_TRANSFER: row-based list with one destination project per batch;
sequential submits keep failed rows inline with errors and drop
succeeded rows; history dashboard untouched.
- PURCHASE: unit locked to catalog (search-only Combobox), wizard-style
'+ register new material' option with yellow warning, optional Key-Value
specs editor (replaces mandatory text chips), continuous-entry UX
(warehouse/date kept, auto-focus, session log, duplicate warning).
- Mobile-first: responsive table/cards core (StockTable), numeric keyboards
(inputMode+pattern), sticky bottom submit bar with dynamic counter above
MobileTabBar incl. safe-area inset, horizontally scrollable touch chips.
- Backend fix (prereq of RETURN): GET /inventory/transactions date filters
crashed with 500 under asyncpg (string vs timestamptz); parse to aware
UTC datetimes (DB runs Etc/UTC).
- docs/inventory-ledger-gaps.md: ledger gap report (server-side return cap,
standalone TRANSFER_IN, transfer row fallback, audit coverage, legacy
REF backfill, UTC day semantics, pagination gaps).