핵심 결정
메뉴 형태
상품에 부여하지 않는 별도 신규 메뉴 · 상품별 산출 · 컬럼=총재고/월판매/회전일수/상태/재고금액
회전일수 산식
(전월말일재고+금월말일재고)/금월판매량×30 · Buggy 확정(÷2 평균재고 없음) · 수량 기반
상태 정책
0~30일 양호 / 31~70일 경계 / 71일~ 폐기 · 판매0이면 폐기
재고금액
금월말재고 × 넷공급가 단가(MD-01에서 쌓인 원가) = 수량×원가 · ÷2 없음
신규상품 유예
첫달 부진 오분류 방지 위해 GRACE 처리(회전/폐기 판정 제외)
산출 시점·의존성
월말 확정치로만 산출 · MD-01(재고관리) 다음 버전(재고금액이 MD-01 단가 필요)
stock_turnover_monthly 신규
idPK BIGSERIAL
ymCHAR(6)
hero_codeFK VARCHAR
center_codeVARCHAR
prev_month_end_qtyINT
curr_month_end_qtyINT
month_sales_qtyINT
turnover_daysNUMERIC(10,1)
statusVARCHAR
unit_net_costINT
stock_valueBIGINT
is_new_productBOOLEAN
computed_atTIMESTAMP
월·상품·센터별 재고회전 산출 스냅샷(월말 확정치). 재산출 시 upsert.
stock_balance READ
hero_codePK VARCHAR
center_codePK VARCHAR
total_qtyINT
MD-01 집계(= SUM stock_entry.change_qty). 월말 재고 수량 산출 근거.
stock_entry READ
hero_codeFK VARCHAR
center_codeFK VARCHAR
change_qtyINT
net_supply_priceINT
created_atTIMESTAMP
MD-01 수불 로그(입고/조정/출고). 월판매량 집계 + 넷공급가 단가 참조.
product READ
hero_codePK VARCHAR
product_nameVARCHAR
created_atTIMESTAMP
상품 기준. 그룹상품명 표기 + 등록일로 신규상품(유예) 판정.
stock_turnover_monthly.hero_code → product.hero_code (상품 기준)
월말재고 = stock_balance.total_qty (hero_code, center_code, 월말 확정 시점)
금월판매량 = SUM(-stock_entry.change_qty) 출고분, 해당월 created_at 귀속, GROUP BY hero_code, center_code
unit_net_cost = stock_entry.net_supply_price (MD-01 월말 시점 원가 단가)
-- ============================================================
-- MD-04 재고회전 산출 (신규 별도 메뉴)
-- 월말 확정치 기반 상품별 회전일수·상태·재고금액 스냅샷
-- 회전일수는 수량 기반 / 재고금액은 MD-01 넷공급가 단가 참조
-- ============================================================
CREATE TABLE stock_turnover_monthly (
id BIGSERIAL PRIMARY KEY,
ym CHAR(6) NOT NULL, -- 산출 기준월 'YYYYMM' (월말 확정치)
hero_code VARCHAR NOT NULL
REFERENCES product(hero_code), -- 히어로코드(상품 단위 산출)
center_code VARCHAR, -- 센터(예: 성동광진) · NULL=전체합산
prev_month_end_qty INT NOT NULL DEFAULT 0, -- 전월 말일 재고 수량
curr_month_end_qty INT NOT NULL DEFAULT 0, -- 금월 말일 재고 수량
month_sales_qty INT NOT NULL DEFAULT 0, -- 금월 판매량(수량)
-- 회전일수 = (prev_month_end_qty + curr_month_end_qty) / month_sales_qty * 30
-- ※ Buggy 확정: ÷2(평균재고) 없음 · 판매0이면 NULL(→ 상태 DISPOSE 폐기)
turnover_days NUMERIC(10,1),
-- 상태: GOOD 0~30일 양호 / WARN 31~70일 경계 / DISPOSE 71일~ 또는 판매0 폐기 / GRACE 신규상품 유예
status VARCHAR NOT NULL
CHECK (status IN ('GOOD','WARN','DISPOSE','GRACE')),
unit_net_cost INT, -- 재고금액 단가 = MD-01에 쌓인 넷공급가(월말 시점 원가)
stock_value BIGINT, -- 재고금액 = curr_month_end_qty * unit_net_cost
is_new_product BOOLEAN NOT NULL DEFAULT FALSE, -- 신규상품 유예 대상 여부(첫달 부진 오분류 방지)
computed_at TIMESTAMP NOT NULL DEFAULT now(), -- 산출 실행 일시
UNIQUE (ym, hero_code, center_code) -- 월·상품·센터 1건(재산출 시 upsert)
);
CREATE INDEX ON stock_turnover_monthly (ym, status);
CREATE INDEX ON stock_turnover_monthly (hero_code, ym);
03스토리보드 — 조회 흐름
재고회전 메뉴 진입 → 상품별 산출 목록
11. 재고회전 메뉴 진입(신규 별도 메뉴) — 상품 화면에 부여하지 않고 어드민 좌측 메뉴에 신규 항목 '재고회전' 진입. 상품별 산출 목록이 기본 화면.
22. 기준월 선택 — 상단에서 산출 기준월(YYYYMM) 선택. 월말 확정치로만 산출하므로 마감된 월만 조회 가능. 미마감 당월은 비활성.
33. 상품별 목록 조회 — 히어로코드·그룹상품명·센터·총재고(금월말)·월판매량·회전일수·상태·재고금액단가(넷공급가)·재고금액 컬럼 노출. 상품 단위 1행.
44. 상태 필터 — 양호/경계/폐기/유예 상태로 필터. 폐기(71일~ 또는 판매0)·경계 상품을 우선 확인. 유예(신규)는 별도 구분 표기.
55. 행 상세 — 산식 근거 확인 — 행 펼침에서 전월말재고·금월말재고·금월판매량과 회전일수 산식 (전월말+금월말)/판매량×30, 재고금액 산식 금월말재고×넷공급가 노출.
04화면 설계
실제 어드민에 어떤 컬럼·화면으로 노출되나
재고회전 조회 목록(신규 메뉴)
회전일수=(전월말400+금월말468)/판매434×30=60.0(경계 31~70). 재고금액=금월말468×넷공급가1,500=702,000. 단가는 MD-01 넷공급가에서 따라옴. 상품 단위 1행.
상태 판정 규칙(범례 · 목록 상단 노출)
월말 확정치 기준. 회전일수는 수량 기반, 재고금액만 넷공급가 원가 사용.
행 상세 — 회전일수·재고금액 산식 근거
Buggy 확정 산식(÷2 평균재고 미적용). 넷공급가 단가는 MD-01 재고관리에서 쌓인 원가를 그대로 참조.