feat(selfop): simplify turnover diagnostics and add zero stock filter

This commit is contained in:
2026-10-15 10:29:43 +08:00
parent 08fac66fe1
commit 11e348a29f
6 changed files with 122 additions and 22 deletions
@@ -3,6 +3,13 @@ import { inventoryView, turnoverRoute, validateTurnover, yesterdayBeijing } from
import type { TurnoverQuery } from './turnoverTypes'
const valid: TurnoverQuery = { sourceAccount: 'primary', warehouseCode: 'W', groupBy: 'SKU', endDate: '2026-10-12', baseWindowDays: 30, focus: 'ALL', sortBy: 'PHYSICAL_DESC', current: 1, size: 20, includeOverview: true }
describe('inventory view and turnover query contract', () => {
it('parses only explicit booleans for the zero-inventory filter', () => {
expect(turnoverRoute({ hideZeroInventory: 'false' })).toMatchObject({ hideZeroInventory: false })
expect(turnoverRoute({ hideZeroInventory: 'true' })).toMatchObject({ hideZeroInventory: true })
for (const value of ['0', '1', 'yes', ['false']]) expect(() => turnoverRoute({ hideZeroInventory: value })).toThrow()
expect(() => inventoryView({ view: 'DETAIL', hideZeroInventory: 'true' })).toThrow()
})
it('defaults to turnover but preserves strict dashboard and legacy detail links', () => {
expect(inventoryView({ warehouseCode: 'W', sku: 'X' })).toBe('TURNOVER')
for (const q of [{ from: 'overview' }, { drilldownFrom: 'DASHBOARD' }, { salesWindowDays: '10' }, { attention: 'FROZEN_STOCK' }, { view: 'DETAIL' }]) expect(inventoryView(q)).toBe('DETAIL')