MD-01 · 이번 라운드 뿌리

DC 재고·수불장 관리 (선입선출)

재고가 들어올 때 넷 공급가를 함께 기록하고, 팔릴 때 먼저 들어온 것부터 빠지게 — 신규 「재고관리」 메뉴 + 잔여재고 조정 모달.

🟢 최우선 신규 「재고관리」 메뉴 MFC 센터재고와 별개 이번 범위 = 이관 동작

핵심 결정

메뉴
신규 「재고관리」 메뉴 신설 · 현행 MFC 센터재고관리와 별개
단가
재고 단가 = 내 공급가(넷) · 재고 소진되면 다음 로트 단가로 자동 전환
선입선출
먼저 등록 / 유통기한 빠른 것 먼저 소진 → 다음 로트로 이관 · 이번엔 "이관 되는지"만
로그
조정 = ±수량 + 넷공급가 → 일시·작성자와 로그 · 모달↔메뉴 양방향
제외
취소·반품·분실·미입고 = 뒷단 정산 · 매출원가(COGS) 자동계산은 후속(발주 붙을 때)
01

정책 / 정의

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

용어 정의
용어정의
넷 공급가
(내 공급가)
우리가 매입한 순 공급가(부가세·물류수수료 제외) · 재고 원가 기준 · 표기 net 소문자
입고 건(로트)한 번 등록된 {히어로코드, 센터, 수량, 넷공급가, 소비기한?, 등록자, 일시} 묶음
잔여재고히어로코드 × 센터별 현재 남은 수량
수불 로그모든 변동(±수량·넷공급가·결과재고·작성자·일시·출처) 이력
정책 (규칙)
#규칙비고
1선입선출 — 기본=먼저 등록순 / 예외=소비기한 빠른 순 / 수동 우선순위(0·1·2…)이번
2단가 자동 전환 — 앞 로트 소진되면 다음 로트 넷공급가로 (판매가·공급가 반영)이번
3판매가 불변 — 원가 변동은 판매가 X, 공급가만 뒷단(정산)정산 영역
4취소·반품·분실·미입고 = 재고 미반영 → 뒷단 정산이지어드민 분실은 MD-14
5마이너스 금지 · 조정 취소(원복) 가능이번
6소비기한 = 선택값 (입력 시 노출 + 선입선출 우선순위)이번
7양방향 싱크 — 잔여재고 모달 ↔ 재고관리 메뉴 = 같은 로그이번
8🆕 백단 공급가 루틴 변경 — 정산 주기마다 공급단가 일괄 변경 요청별도 기능
범위이번 = 등록/조정(±수량+넷공급가) + 로그 + 선입선출 이관 동작 + 엑셀 업로드 + 소비기한 칸 · 후속 = 매출원가 자동계산·주문 시 자동 차감(발주 MD-02 연결 시)
02

ERD

수불 로그(append-only) 중심 원장 + 집계

stock_entry WRITE
idPK bigint
hero_codeFK
center_codeFK
change_qtyint ±
net_supply_priceint 원
expiry_datedate null
priorityint null
sourceenum
created_byvarchar
created_atdatetime
모든 변동을 append (입고 +, 출고 −, 조정 ±) — 로그이자 원장
stock_balance 집계
hero_codePK
center_codePK
total_qtyint
updated_atdatetime
= SUM(stock_entry.change_qty) · 뷰 또는 캐시
product / center READ
hero_code기존
group_name노출명
center_code기존
center_name
기존 마스터 참조만 (변경 없음)
stock_entry.hero_code → product.hero_code
stock_entry.center_code → center.center_code
stock_balance = SUM(stock_entry.change_qty) GROUP BY (hero_code, center_code)
선입선출 원가 = 입고분(+) 등록순/유통기한순 큐 → 출고분(−) 매칭 소진 → 남은 로트의 net_supply_price
-- 수불 로그 (append-only 원장)
CREATE TABLE stock_entry (
  id            BIGSERIAL PRIMARY KEY,
  hero_code     VARCHAR NOT NULL REFERENCES product(hero_code),
  center_code   VARCHAR NOT NULL REFERENCES center(center_code),
  change_qty    INT     NOT NULL,          -- + 입고 / − 출고
  net_supply_price INT,                     -- 넷 공급가(입고 시)
  expiry_date   DATE,                          -- 소비기한(선택)
  priority      INT,                           -- 소진 우선순위(선택)
  source        VARCHAR NOT NULL,          -- modal / menu / excel / order
  memo          TEXT,
  created_by    VARCHAR NOT NULL,
  created_at    TIMESTAMPTZ DEFAULT now()
);
CREATE INDEX ON stock_entry (hero_code, center_code, created_at);
03

스토리보드 — 실제 화면 · 변경 포인트

상품 관리 › 센터 재고 관리 (실제 어드민)에 MD-01 추가분을 표시

센터재고관리 목록 (실제 어드민)
1
+ 넷공급가 · 소비기한 · 현재원가 컬럼 🆕
2
② [조정] → 모달
센터 재고 관리 목록 — 총재고 옆에 넷공급가·소비기한·현재원가(선입선출) 컬럼 추가
센터 재고 조정 등록 모달 (실제 어드민)
3
+ 넷 공급가(원) · 소비기한 칸 🆕
「센터 재고 조정 등록」 모달 — 작업타입·수량 옆에 넷 공급가·소비기한 입력 칸 추가
1
목록: 총재고/가용/출고대기 옆에 넷공급가·소비기한·현재원가 컬럼 — 현재원가 = 선입선출 앞 로트 단가
2
[조정] 클릭 → 「센터 재고 조정 등록」 모달 (오른쪽 화면)
3
모달에 넷 공급가 · 소비기한 입력 칸 추가 → 저장 시 stock_entry 로그 1건 append
4
저장 후 선입선출로 소진·단가 이관 → 아래 04 동작 시뮬레이션에서 확인
04

화면 노출 — 선입선출·수불 내역

선입선출·현재원가가 실제 어드민에 어떻게 보이나

선입선출 결과는 두 곳에 노출 — ① 목록의 「현재원가」 컬럼(선입선출 앞 로트 단가) + ② 「수불 내역」 상세 (신규 화면)(로트별 잔여·단가).
① 센터 재고 목록 — 「현재원가」 컬럼 (신규)
히어로코드그룹상품명총재고가용출고대기넷공급가 🆕현재원가 🆕소비기한 🆕
HERO-008737케찹 15KG(볼팍) - 하인즈13513503,2003,000
현재원가 = 선입선출 앞 로트 단가(3,000원) · 앞 로트 소진되면 3,200원으로 이관
② 수불 내역 상세 (신규 화면) — 목록 [수불] → 드릴다운
케찹 15KG(볼팍) - 하인즈 · HERO-008737 · 성동광진
현재 재고 135현재원가 3,000원
등록일작업변경수량넷공급가잔여수량소비기한상태
07-20입고+353,00035🔵 소진중 (앞)
07-27입고+1003,200100⚪ 대기
선입선출 규칙출고 시 앞 로트(3,000원 35개)부터 소진 → 다 빠지면 다음 로트(3,200원)로 현재원가 이관 · 소비기한 빠른 로트 우선 · 취소·반품·분실은 뒷단 정산(여기 미반영)