feat(malaysia): 재고조사 랙(rack) 박스 단위 입력

낱개/콤보 평면 수량 그리드를 창고 랙 그림(A/B 36칸) 입력으로 대체.
각 칸에 아이템·박스당 입수량·박스 수를 넣고 + 로 한 칸 여러 아이템 추가.
저장 시 SKU별 qty=SUM(입수량×박스수) 집계로 daily_stocktake_line 재생성.
이후 분해/확정 로직은 라인 기준 그대로 동작.

- DB: daily_stocktake_rack 테이블 + grant (멱등)
- store: rack_cell_codes/rack_layout/aggregate_rack 순수함수
- db: list_rack_entries/replace_rack(1 트랜잭션, draft만)
- router: rack 컨텍스트 + POST /stocktakes/{id}/rack/bulk
- UI: 랙 보드 템플릿 + malaysia_rack.js(행 추가/삭제·실시간 소계)
- 테스트 4건 추가(18 전부 통과)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-14 16:25:40 +09:00
parent 65997adfd3
commit 032fb78867
10 changed files with 456 additions and 47 deletions
+27 -1
View File
@@ -219,6 +219,32 @@ CREATE TRIGGER trg_stocktake_line_updated
BEFORE UPDATE ON daily_stocktake_line
FOR EACH ROW EXECUTE FUNCTION malaysia_set_updated_at();
-- ════════════════════════════════════════════════════════════
-- 6.5) 일일 재고조사 랙(rack) 입력
-- 창고 랙(A/B면, 행/열/분할 칸)별로 "어떤 SKU 가 한 박스당 몇 개씩
-- 몇 박스 있는지"를 기록한다. 칸 단위 입력 → 서버가 SKU 별
-- qty = SUM(units_per_box * box_count) 로 집계해 daily_stocktake_line 을
-- 재생성한다(랙이 라인의 단일 출처). 한 칸(파렛트)에 여러 SKU 가능.
-- cell_code 예: 'A3-1-1' (면 A, 행 3, 열 1, 분할 1).
-- sku_code: 낱개(MT-/MX-/MZ-) 또는 세트(MY-) 허용. MD- 금지.
-- ════════════════════════════════════════════════════════════
CREATE TABLE IF NOT EXISTS daily_stocktake_rack (
id BIGSERIAL PRIMARY KEY,
stocktake_id BIGINT NOT NULL REFERENCES daily_stocktake(id) ON DELETE CASCADE,
cell_code TEXT NOT NULL, -- 랙 위치(예: A3-1-1)
line_no INTEGER NOT NULL DEFAULT 0, -- 칸 안 입력 순서
sku_code TEXT NOT NULL CHECK (
sku_code LIKE 'MT-%'
OR sku_code LIKE 'MX-%'
OR sku_code LIKE 'MZ-%'
OR sku_code LIKE 'MY-%'),
units_per_box INTEGER NOT NULL CHECK (units_per_box > 0),
box_count INTEGER NOT NULL CHECK (box_count > 0),
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_stocktake_rack_st ON daily_stocktake_rack (stocktake_id);
CREATE INDEX IF NOT EXISTS idx_stocktake_rack_cell ON daily_stocktake_rack (stocktake_id, cell_code);
-- ════════════════════════════════════════════════════════════
-- 7) seed — 기본 창고 + 재고관리 대상 아이템
-- ════════════════════════════════════════════════════════════
@@ -254,7 +280,7 @@ ON CONFLICT (item_code) DO NOTHING;
GRANT USAGE ON SCHEMA public TO malaysia_app;
GRANT SELECT, INSERT, UPDATE, DELETE ON
warehouses, malaysia_items, set_bom, stock_movement,
daily_stocktake, daily_stocktake_line
daily_stocktake, daily_stocktake_line, daily_stocktake_rack
TO malaysia_app;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO malaysia_app;
ALTER DEFAULT PRIVILEGES IN SCHEMA public