MD-06 · 업종별 가격

업종별 판매가 관리 (가격수정 · 업종별 탭)

지금은 고객(업장)별 가격만 있어 업종·세부업종별 판매가를 못 정한다(예: 카페 6,900 / 서양식 7,500). 기존 member_discounts(discount_type=biz_type_product)를 재사용해 업종별 판매가를 추가하고, 값이 겹치면 최저가를 적용한다.

🔴 결정 대기 선행: 가격표 추가(선행A) member_discounts 재사용 우선순위=최저가
✏️ 기존 화면 수정 · 탭 추가
무엇 — 지금은 고객(업장)별 가격만 있어 업종·세부업종별 판매가를 못 정한다(예: 카페 6,900 / 서양식 7,500). 기존 member_discounts(discount_type=biz_type_product)를 재사용해 업종별 판매가를 추가하고, 값이 겹치면 최저가를 적용한다.📍 위치: 상품관리 › 가격 관리 › 가격수정

핵심 결정

우선순위
최저가 — 업장가·업종가·세부업종가가 겹치면 계산 결과가 가장 싼 가격 적용
재사용
member_discounts (discount_type=biz_type_product) — 신규 테이블 0
지원 범위
업종 + 세부업종까지 (biz_type.parent_id 계층 재사용)
업종 없는 업장
매칭 실패 시 기본가 적용(폴백)
선행/2차
선행A 가격표 추가 필요 · 2차 '조건별 판매(옵션)'로 통합해 복제코드 근본해결
01

화면 — 먼저 보기

이 티켓이 실제로 어떤 화면이 되는지 먼저 봅니다

DB(member_discounts.biz_type_id·sub_biz_type_id)와 코드값(biz_type_product)은 이미 존재. 화면(가격수정)에 '업종별' 탭만 없다 — 선행A(가격표 추가) 착수 후 진행.
현행 화면 · 실제 캡처
현행 「가격수정」 모달 — 여기에 업종별 탭 추가
현행 「가격수정」 모달 — 여기에 업종별 탭 추가
변경안 · 제안 화면
🔍 통합검색관리자 ▾
📊 대시보드
📦 상품관리
🧾 주문관리
🏬 재고관리
🎯 프로모션
💳 정산
⚙️ 설정
상품관리 › 가격 관리 › 가격수정탭 추가
업종 전체 ▾상태 ▾🔍 히어로코드·상품명 검색업종가 추가엑셀 일괄 등록
업종 🆕세부업종 🆕업종 판매가 🆕할인율(자동) 🆕적용기간 🆕상태
카페브런치카페6,900원8.0%2026-08-01 ~활성
서양식(전체)7,500원0.0%2026-08-01 ~활성
한식(전체)2,000원12.5%2026-07-01 ~ 2026-07-31종료
총 128건 · 20/page123

▲ 가격수정 모달 › 업종별 탭 — 바뀌는 컬럼은 🆕 로 표시(예시 데이터)

1
가격 관리 진입 — 상품관리 › 가격 관리에서 히어로코드/상품명으로 상품을 찾고, 행의 '가격수정'을 연다. 목록에 '업종가 N건' 배지로 등록 여부가 보인다.
2
업종별 탭 선택 — 가격수정 모달에서 기존 '고객별' 탭 옆 신설 '업종별' 탭으로 이동. 현재 걸린 업종가 목록(업종·세부업종·판매가·기간)이 뜬다.
3
업종가 추가 — 업종(예: 카페)·세부업종(선택)·판매가(예: 6,900)·적용기간 입력. 저장 시 기본가 대비 discount_rate로 역산되어 biz_type_product 행으로 기록.
4
중복·충돌 검증 — 동일 업종×세부업종에 활성 행이 있으면 저장 차단(기존 종료 후 재등록 유도). 세부업종가와 업종 전체가 공존은 허용(세부 우선).
5
주문 시 적용 — 식당이 담으면 그 업장의 업종/세부업종에 맞는 가격을 매칭. 업장가·업종가·구간 등 후보가 겹치면 최저가로 결정. 업종 없으면 기본가.
6
이력 확인 — 변경 내역은 member_discounts_his에 적재되어 누가·언제·어떤 율로 바꿨는지 추적. 2차에서 조건별 판매(옵션)로 통합 예정.
02

정책 / 정의

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

용어 정의
용어정의
업종 / 세부업종식당의 영업 분류. 업종=대분류(카페·한식), 세부업종=하위(브런치카페 등). DB는 biz_type 한 테이블에서 parent_id로 계층 표현.
히어로코드상품 식별 표준키(hero_product_code). 업종가는 이 코드 단위로 건다.
업종 판매가특정 업종/세부업종 식당이 이 상품을 살 때 적용되는 판매가. 관리자는 금액을 입력, 시스템은 기본가 대비 discount_rate로 저장·역산.
member_discounts판매가 조정(할인) 테이블. member_id면 업장별, biz_type_id면 업종별. 이번 기능은 후자 경로만 화면에 노출.
biz_type_productdiscount_type 코드값 '업종별상품할인'. DB에 이미 존재 — 이번에 UI가 처음으로 사용.
기본가업종·업장 가격이 없을 때 적용되는 정가. 소스는 선행A(가격표 추가)가 제공. 넷 공급가(매입 순공급가)와는 별개.
최저가 우선한 상품에 여러 가격 후보가 매칭될 때, 최종 판매가가 가장 낮아지는 후보를 적용하는 규칙.
정책 (규칙)
#규칙비고
1가격수정 모달에 '고객별' 탭 옆 '업종별' 탭 신설기존 biz_type_id/sub_biz_type_id 재사용. 화면만 추가, 스키마 대변경 없음.
2업종가는 히어로코드 × (업종 | 업종+세부업종) 단위로 등록세부업종 미지정 = 그 업종 전체가. 세부업종 지정 = 해당 세부업종에만.
3주문 시 업장의 업종/세부업종에 맞는 업종가를 매칭해 적용member.biz_type_id·sub_biz_type_id로 조회. 세부업종가가 있으면 세부 우선 매칭.
4겹칠 때 최종 판매가 = 후보 중 최저가업장가·세부업종가·업종가·구간할인 등 매칭 후보를 모두 계산해 min. (미팅 확정: 우선순위=최저가)
5업종이 없는(미분류) 업장은 기본가로 폴백biz_type_id 매칭 실패 시. 기본가는 선행A 가격표 기준. 가정: 폴백 시 사용자 안내 없음.
6여러 업종에 해당하는 업장 처리member는 업종 1 + 세부업종 1 구조(단일)라 다중 업종 미발생 가정. 향후 다중 시에도 최저가 규칙으로 자연 수렴.
7동일 히어로코드×업종×세부업종의 활성 업종가는 1건만 허용부분 유니크 인덱스로 중복 차단(end_date IS NULL 기준). 변경은 기존 종료 후 신규 등록.
8관리자는 목표 판매가(금액)를 입력, 시스템이 discount_rate로 저장가정: entered_price 보조 컬럼에 입력 원본 보관, 기본가 대비 율 역산. 예: 카페 6,900 / 서양식 7,500.
92차 — 조건 5·6·7·8은 '조건별 판매(옵션)' 하나로 통합복제코드 남발의 근본 해결. 예산·전략팀 협의 사항으로 본 티켓 범위 밖(후속). 변경 이력은 member_discounts_his로 적재.
03

ERD

데이터 구조 · 관계 · DDL

member_discounts WRITE
idPK bigint
discount_typevarchar(30)
member_idFK varchar(20)
biz_type_idFK varchar(30)
sub_biz_type_idFK varchar(30)
hero_product_codeFK varchar(100)
discount_ratenumeric(10,3)
entered_priceinteger
start_datetimestamp
end_datedate
가격 조정 본체. 이번 기능은 discount_type='biz_type_product' 행을 화면에서 CRUD. 컬럼 이미 전부 존재, 인덱스·보조컬럼만 보강.
biz_type READ
idPK varchar(30)
type_namevarchar(100)
parent_idFK varchar(30)
업종/세부업종 마스터. parent_id 자기참조로 계층. 업종가 등록 시 드롭다운 소스.
member READ
idPK varchar(20)
biz_type_idFK varchar(30)
sub_biz_type_idFK varchar(30)
식당(업장). 주문 시 이 업장의 업종/세부업종으로 업종가 매칭.
member_discounts_his WRITE
idPK bigint
parametervarchar(10)
biz_type_idvarchar(30)
discount_ratenumeric(10,3)
insert_idvarchar(20)
가격 변경 이력. biz_type/sub_biz_type 컬럼 이미 존재 → 업종가 변경도 자동 적재.
member_discounts.biz_type_id → biz_type.id (업종, parent_id IS NULL)
member_discounts.sub_biz_type_id → biz_type.id (세부업종, parent_id = 업종)
member.biz_type_id / member.sub_biz_type_id → 주문 시 이 업장에 맞는 업종가 매칭
member_discounts.hero_product_code → seller_product(히어로코드)
member_discounts → member_discounts_his (변경 이력 적재)
-- [MD-06] 업종별 판매가
-- 핵심: 신규 테이블 없음. 기존 member_discounts를 그대로 재사용한다.
--   · 고객(업장)별  → discount_type='member_product',    member_id 채움
--   · 업종/세부업종별 → discount_type='biz_type_product', biz_type_id(+sub_biz_type_id) 채움 (member_id NULL)
-- 아래 ALTER는 '업종가' 운영을 위한 최소 보강(무결성 가드)만 추가한다.

-- 1) 활성 업종가 중복 방지: 같은 (히어로코드 × 업종 × 세부업종)에 종료일 없는 행이 2개 이상 못 생기게.
--    세부업종이 NULL이면 업종 전체가로 취급(부분 유니크).  ※ 가정: '활성=end_date IS NULL' 규칙
CREATE UNIQUE INDEX IF NOT EXISTS uq_member_discounts_biz_active
    ON public.member_discounts (biz_type_id, sub_biz_type_id, hero_product_code)
    WHERE discount_type = 'biz_type_product' AND end_date IS NULL;
COMMENT ON INDEX public.uq_member_discounts_biz_active
    IS '업종별 판매가: 동일 히어로코드×업종×세부업종의 활성 행 중복 차단';

-- 2) 관리자 입력 편의를 위한 '입력 판매가' 보조 컬럼(가정).
--    운영은 discount_rate로 계산하지만, 관리자는 목표 판매가(예: 카페 6,900)를 직접 입력한다.
--    입력값을 감사/역산 근거로 함께 보관. 실제 주문 계산은 discount_rate 기준 유지.
ALTER TABLE public.member_discounts
    ADD COLUMN IF NOT EXISTS entered_price integer;               -- 관리자가 입력한 업종 판매가(원). NULL=율 직접입력
COMMENT ON COLUMN public.member_discounts.entered_price
    IS '관리자 입력 업종/업장 판매가(원). 저장 시 기본가 기준 discount_rate로 역산·검증 (선행A 가격표의 기본가 사용)';

-- 참고(선행A): 기본가(정가) 소스는 「가격표 추가(선행A)」가 제공. 본 티켓은 그 위에 업종가 레이어만 얹는다.
-- 이력은 기존 member_discounts_his 트리거/배치 경로 그대로 사용(biz_type_id/sub_biz_type_id 컬럼 이미 존재).
04

화면 상세 — 세부 표·규칙

목록 외 품목표·모달·규칙 등 세부 화면

가격 관리 상품 목록 (진입 화면)
히어로코드상품명기본가고객가업종가상태관리
HERO-000812앵커 무염버터 454g8,200원3건4건판매중[가격수정]
HERO-001045대상 청정원 카놀라유 1.8L5,400원0건0건판매중[가격수정]
HERO-000377곰표 밀가루 중력 20kg21,000원12건2건품절[가격수정]
'업종가' 컬럼 신설 — 업종별 판매가 등록 건수. 0건이면 기본가만 적용됨을 즉시 판별.
겹칠 때 최저가 결정 규칙표
케이스매칭 후보(원)적용 결과근거
업장가 있음 + 업종가 있음업장 7,200 / 업종 6,9006,900원최저가 우선
세부업종가 + 업종 전체가세부 6,900 / 업종 7,1006,900원최저가(세부도 후보로 계산)
업종 미분류 업장(매칭 없음)8,200원기본가 폴백
미팅 확정 규칙: 우선순위는 '지정 우선순위'가 아니라 계산된 최저가. 향후 다중 업종이 생겨도 동일 규칙으로 수렴.