MD-04 · 재고금액·회전일수

재고금액 · 회전일수 (신규 「재고회전」 메뉴)

MD-04 재고회전 산출 — 상품별 월말 회전일수·상태·재고금액 조회 (신규 별도 메뉴)

🟢 산식 확정 (Buggy) 신규 「재고회전」 메뉴 MD-01 선행 월말 스냅샷

핵심 결정

메뉴 형태
상품에 부여하지 않는 별도 신규 메뉴 · 상품별 산출 · 컬럼=총재고/월판매/회전일수/상태/재고금액
회전일수 산식
(전월말일재고+금월말일재고)/금월판매량×30 · Buggy 확정(÷2 평균재고 없음) · 수량 기반
상태 정책
0~30일 양호 / 31~70일 경계 / 71일~ 폐기 · 판매0이면 폐기
재고금액
금월말재고 × 넷공급가 단가(MD-01에서 쌓인 원가) = 수량×원가 · ÷2 없음
신규상품 유예
첫달 부진 오분류 방지 위해 GRACE 처리(회전/폐기 판정 제외)
산출 시점·의존성
월말 확정치로만 산출 · MD-01(재고관리) 다음 버전(재고금액이 MD-01 단가 필요)
01

정책 / 정의

용어를 못 박고, 규칙을 명확히

용어 정의
용어정의
회전일수(재고회전)재고가 한 번 소진되는 데 걸리는 일수. (전월말일재고+금월말일재고)/금월판매량×30. 수량 기반 산출. Buggy 확정으로 ÷2(평균재고) 미적용.
넷공급가(net)우리 매입 순공급가. MD-01 재고관리에서 입고 로트별로 쌓인 원가 단가. 재고금액 산출의 단가로 그대로 따라옴.
재고금액금월말일재고 수량 × 넷공급가 단가 = 수량×원가. 평균재고(÷2) 개념 미적용.
월말 확정치금월 말일 기준으로 마감된 재고·판매 수치. 재고회전은 이 확정치로만 산출하며 월중 실시간 산출 안 함.
신규상품 유예(GRACE)신규 등록 상품이 첫달 판매 부진으로 폐기 오분류되는 것을 막기 위한 예외 상태. 회전일수/폐기 판정에서 제외.
상태(양호/경계/폐기)회전일수 구간별 라벨. 0~30일 양호, 31~70일 경계, 71일~ 폐기. 금월판매량 0이면 회전 계산 불가로 폐기.
히어로코드상품 식별 코드. 재고회전은 히어로코드(상품) 단위로 산출한다.
정책 (규칙)
#규칙비고
1회전일수 = (전월말일재고 + 금월말일재고) / 금월판매량 × 30Buggy 확정 산식. ÷2(평균재고) 없음. 수량 기반. 예: 케찹15KG (400+468)/434×30=60일.
2상태 구간: 0~30일 양호(GOOD) / 31~70일 경계(WARN) / 71일~ 폐기(DISPOSE)회전일수를 구간 매핑. 예 60일 → 경계.
3금월판매량이 0이면 폐기(DISPOSE)분모 0으로 회전 계산 불가. 재고는 있는데 안 팔린 것으로 보고 폐기 처리.
4재고금액 = 금월말일재고 × 넷공급가 단가단가는 MD-01 재고관리에서 쌓인 넷공급가를 따라옴(수량×원가). ÷2 없음. 예: 468×1500=702,000.
5신규상품은 유예(GRACE) 처리첫달 부진 오분류 방지. 회전일수/폐기 판정에서 제외하고 유예로 표기.
6월말 확정치로만 산출월중 실시간 조회 아님. 금월 말일 마감 수치로 상품별 1건 upsert(ym+hero_code+center_code 유니크).
7MD-01 재고관리 다음 버전에서 제공재고금액이 MD-01의 넷공급가 단가에 의존하므로 MD-01 이후 버전에 배치.
02

ERD

데이터 구조 · 관계 · DDL

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

스토리보드 — 조회 흐름

재고회전 메뉴 진입 → 상품별 산출 목록

1
1. 재고회전 메뉴 진입(신규 별도 메뉴) — 상품 화면에 부여하지 않고 어드민 좌측 메뉴에 신규 항목 '재고회전' 진입. 상품별 산출 목록이 기본 화면.
2
2. 기준월 선택 — 상단에서 산출 기준월(YYYYMM) 선택. 월말 확정치로만 산출하므로 마감된 월만 조회 가능. 미마감 당월은 비활성.
3
3. 상품별 목록 조회 — 히어로코드·그룹상품명·센터·총재고(금월말)·월판매량·회전일수·상태·재고금액단가(넷공급가)·재고금액 컬럼 노출. 상품 단위 1행.
4
4. 상태 필터 — 양호/경계/폐기/유예 상태로 필터. 폐기(71일~ 또는 판매0)·경계 상품을 우선 확인. 유예(신규)는 별도 구분 표기.
5
5. 행 상세 — 산식 근거 확인 — 행 펼침에서 전월말재고·금월말재고·금월판매량과 회전일수 산식 (전월말+금월말)/판매량×30, 재고금액 산식 금월말재고×넷공급가 노출.
04

화면 설계

실제 어드민에 어떤 컬럼·화면으로 노출되나

재고회전 조회 목록(신규 메뉴)
히어로코드그룹상품명센터총재고(금월말)월판매량회전일수상태재고금액단가(넷공급가)재고금액
HERO-KETCHUP15케찹 15KG성동광진46843460.0경계1,500원702,000원
회전일수=(전월말400+금월말468)/판매434×30=60.0(경계 31~70). 재고금액=금월말468×넷공급가1,500=702,000. 단가는 MD-01 넷공급가에서 따라옴. 상품 단위 1행.
상태 판정 규칙(범례 · 목록 상단 노출)
상태조건비고
양호회전일수 0~30일-
경계회전일수 31~70일-
폐기회전일수 71일~ 또는 금월판매량 0판매0=회전 계산 불가
유예신규상품 첫달부진 오분류 방지·회전/폐기 판정 제외
월말 확정치 기준. 회전일수는 수량 기반, 재고금액만 넷공급가 원가 사용.
행 상세 — 회전일수·재고금액 산식 근거
항목산식
회전일수60.0일(전월말 400 + 금월말 468) / 금월판매 434 × 30
재고금액702,000원금월말재고 468 × 넷공급가 1,500 (÷2 없음)
Buggy 확정 산식(÷2 평균재고 미적용). 넷공급가 단가는 MD-01 재고관리에서 쌓인 원가를 그대로 참조.