MD-21 · 휴무일 일괄 세팅

휴무일 일괄 세팅 (다중 공급사 · 통합 캘린더)

동일 휴무 패턴 공급사를 다중 선택해 한 번에 등록하고, 전체 공급사 휴무를 통합 캘린더로 한눈에 보는 화면. 개별 150+ 공급사 세팅의 시간·실수를 줄인다.

🟡 준비 필요 다중 일괄 등록 발주휴무/배송 2속성 통합 캘린더 뷰

핵심 결정

핵심 갭
개별 세팅은 이미 있음 → 다중 공급사 일괄 등록 + 통합 캘린더 뷰만 신설
휴무 2속성
발주휴무(발주 마감/제외) · 배송 가능·불가독립 저장 (예: 7/18 발주휴무+배송가능)
고정 vs 게릴라 분리
주 고정휴무=seller_order_close(요일 반복) / 월별 게릴라성=seller_order_close_custom(단일일자)
재사용/신규
기존 4개 테이블 READ/WRITE + 신규는 seller_holiday_bulk_log 1개·게릴라 테이블 컬럼 추가
결정 대기
공휴일 출처 — 수동 입력 vs 공공API 자동 동기화 (MANUAL/HOLIDAY 플래그로 스키마는 선반영)
01

정책 / 정의

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

용어 정의
용어정의
공급사식자재 매입처(seller). 유통사·파트너가 아닌 '공급사'로 통일. 현재 약 150+ 곳.
발주휴무해당일 신규 발주를 마감·제외하는 속성. seller_order_close(요일 반복)·seller_order_close_custom(단일일자)의 close_hour로 관리.
배송 가능·불가발주와 독립된 속성. 발주는 쉬어도(발주휴무) 이미 접수된 물량의 배송은 진행될 수 있어 별도 delivery_yn으로 관리.
주 고정휴무매주 반복되는 정기 휴무(예: 매주 일요일). seller_order_close(seller_id, day_week)에 저장.
월별 게릴라성 휴무특정 날짜 1회성 휴무(예: 창고 이전 7/18, 공휴일). seller_order_close_custom(seller_id, event_date)에 저장.
통합 캘린더 뷰전체 공급사의 주 고정+게릴라성 휴무를 날짜 축으로 합쳐 한눈에 보는 read-only 조회 화면(신규).
일괄 그룹(bulk_group_id)한 번의 '일괄 등록'으로 여러 공급사×날짜에 쓰인 엔트리를 묶는 UUID. 되돌리기·감사 단위.
정책 (규칙)
#규칙비고
1다중 공급사 일괄 등록동일 휴무 패턴(같은 날짜·발주휴무·배송여부)을 공급사 다중 선택으로 한 번에 저장. 선택 공급사 수만큼 seller_order_close(_custom) upsert.
2발주휴무·배송은 독립 2속성두 값을 각각 토글. 예: 7/18 발주휴무=ON, 배송=가능 처럼 조합 가능. 기존 발주분 배송은 발주휴무와 무관.
3주 고정 vs 게릴라 저장 분리주 고정=seller_order_close(요일 반복, PK seller_id+day_week) / 게릴라=seller_order_close_custom(단일 event_date). 등록 UI에서 유형 먼저 선택.
4지난 날짜 세팅 차단게릴라성 등록 시 event_date < 오늘(Asia/Seoul)이면 저장 불가(가정: 발주 마감 계산 정합성 보호). 조회는 과거도 허용.
5발주 마감·배송예정일 계산 연동휴무일은 발주 대상에서 제외. 발주마감(seller_weekly_deadline)·배송요일(seller_weekly_delivery) 계산 배치가 이 휴무 테이블을 함께 참조(가정: 배치 수정 필요).
6공휴일 출처 [결정 대기]holiday_source=MANUAL(운영자 수동) 우선 구현, HOLIDAY(공공데이터 공휴일 자동 동기화)는 플래그만 선반영 후 미팅 결정. 자동은 후속 스프린트.
7일괄 등록 되돌리기bulk_group_id 단위로 status=REVERTED 처리 시 해당 묶음이 만든 엔트리 일괄 삭제. 개별 수정으로 뒤섞인 건은 되돌리기 대상에서 제외.
8충돌 시 upsert 정책같은 seller_id+event_date(또는 day_week) 기존 값이 있으면 덮어쓰기 확인 모달 노출 후 upsert. 감사 로그에 이전 값은 남기지 않음(가정).
9권한휴무 일괄 등록·되돌리기는 운영 관리자 권한만. created_by/reverted_by에 관리자 계정 기록(가정).
02

ERD

데이터 구조 · 관계 · DDL

seller READ
idPK varchar(100)
seller_namevarchar(20)
seller_typevarchar(20)
공급사 마스터(151행). 일괄 등록 대상 다중 선택 소스.
seller_order_close WRITE
seller_idPK,FK varchar(100)
day_weekPK integer
close_hourtime
use_flagboolean
주 고정휴무(요일 반복) 발주마감. 기존 500행 재사용, 일괄 등록이 upsert.
seller_order_close_custom WRITE
seller_idPK,FK varchar(100)
event_datePK date
close_hourtime
delivery_ynboolean
holiday_sourcevarchar(10)
bulk_group_idFK varchar(36)
월별 게릴라성 단일 휴무일. 기존 23행 + 배송여부·감사·묶음 컬럼 신규 추가.
seller_holiday_bulk_log 신규
idPK bigserial
bulk_group_idvarchar(36)
holiday_kindvarchar(10)
target_countinteger
seller_idstext
statusvarchar(10)
created_byvarchar(20)
일괄 세팅 이력(감사·되돌리기 단위). 한 묶음=여러 공급사×날짜.
seller.id 1 : N seller_order_close.seller_id (주 고정휴무 요일)
seller.id 1 : N seller_order_close_custom.seller_id (게릴라성 단일 휴무일)
seller_holiday_bulk_log.bulk_group_id 1 : N seller_order_close(_custom).bulk_group_id (일괄 묶음 → 되돌리기 단위)
통합 캘린더 뷰 = seller_order_close ∪ seller_order_close_custom 을 seller 기준 UNION 조회(신규 저장 없음)
-- =========================================================
-- MD-21 휴무일 일괄 세팅
-- 기존 테이블 재사용(주 고정=seller_order_close / 게릴라성=seller_order_close_custom),
-- 신규는 (1) 게릴라성 테이블에 배송여부·감사 컬럼 추가 (2) 일괄 등록 이력 테이블만.
-- =========================================================

-- 1) 게릴라성 단일 휴무일에 '배송 가능/불가' 2속성 + 감사 컬럼 추가
--    기존: seller_id, event_date, close_hour (감사 컬럼 없음)
ALTER TABLE seller_order_close_custom
  ADD COLUMN IF NOT EXISTS delivery_yn boolean NOT NULL DEFAULT true,  -- 해당일 배송 가능 여부(true=배송가능, false=배송불가). 발주휴무여도 기존 발주분 배송은 별개
  ADD COLUMN IF NOT EXISTS holiday_source varchar(10) NOT NULL DEFAULT 'MANUAL', -- 출처: MANUAL(수동) / HOLIDAY(공휴일 자동) [결정 대기]
  ADD COLUMN IF NOT EXISTS bulk_group_id varchar(36),                  -- 일괄 등록 묶음 식별자(되돌리기 단위). 개별 등록이면 NULL
  ADD COLUMN IF NOT EXISTS memo varchar(200),                          -- 휴무 사유 메모(예: 창고 이전, 광복절)
  ADD COLUMN IF NOT EXISTS created_by varchar(20) NOT NULL DEFAULT 'auto',
  ADD COLUMN IF NOT EXISTS created_at timestamp NOT NULL DEFAULT (CURRENT_TIMESTAMP AT TIME ZONE 'Asia/Seoul');

-- 2) 일괄 세팅 이력(감사·되돌리기) — 신규
CREATE TABLE IF NOT EXISTS seller_holiday_bulk_log (
  id            bigserial     PRIMARY KEY,
  bulk_group_id varchar(36)   NOT NULL,          -- 한 번의 '일괄 등록' 트랜잭션 식별자(UUID)
  holiday_kind  varchar(10)   NOT NULL,          -- WEEKLY(주 고정휴무) / CUSTOM(월별 게릴라성)
  event_date    date,                            -- CUSTOM일 때 대상일. WEEKLY면 NULL
  day_week      integer,                         -- WEEKLY일 때 요일(0=일 ~ 6=토, 가정). CUSTOM이면 NULL
  order_close_yn boolean      NOT NULL,          -- 발주휴무 여부(true=발주 마감/제외)
  delivery_yn   boolean       NOT NULL,          -- 배송 가능 여부(true=배송가능)
  holiday_source varchar(10)  NOT NULL DEFAULT 'MANUAL', -- MANUAL / HOLIDAY(공휴일 자동)
  target_count  integer       NOT NULL,          -- 이 묶음에 적용된 공급사 수
  seller_ids    text          NOT NULL,          -- 적용 공급사 id 목록(csv 스냅샷, 되돌리기·감사용)
  memo          varchar(200),
  status        varchar(10)   NOT NULL DEFAULT 'APPLIED', -- APPLIED / REVERTED(되돌림)
  created_by    varchar(20)   NOT NULL,
  created_at    timestamp     NOT NULL DEFAULT (CURRENT_TIMESTAMP AT TIME ZONE 'Asia/Seoul'),
  reverted_by   varchar(20),
  reverted_at   timestamp
);
COMMENT ON TABLE seller_holiday_bulk_log IS 'MD-21 휴무일 다중 공급사 일괄 세팅 이력(감사·되돌리기 단위)';
CREATE INDEX IF NOT EXISTS idx_holiday_bulk_group ON seller_holiday_bulk_log (bulk_group_id);
CREATE INDEX IF NOT EXISTS idx_holiday_bulk_date  ON seller_holiday_bulk_log (event_date);

-- 통합 캘린더 뷰는 별도 저장 없이 seller_order_close(주 고정) ∪ seller_order_close_custom(게릴라성)을
-- seller 기준으로 UNION 조회하는 read-only 뷰/쿼리로 렌더(신규 테이블 불필요).
03

스토리보드 — 화면 & 흐름

동일 휴무 패턴 공급사를 다중 선택해 한 번에 등록하고, 전체 공급사 휴무를 통합 캘린더로 한눈에 보는 화면. 개별 150+ 공급사 세팅의 시간·실수를 줄인다.

공급사별 발주마감·배송요일·월간 휴무는 이미 partnerInfo/delivery에 개별 존재 — 이 화면은 다중 공급사 일괄 등록 + 통합 뷰만 신설. 미결: 공휴일 출처(자동/수동) 결정 필요.
공급사 관리 › 휴무일 관리신규 화면
구분 전체 ▾공급사 ▾🔍 공급사·날짜 검색+ 휴무 일괄 등록월간 캘린더 전환
날짜/반복요일구분발주배송적용 공급사 수 🆕공휴일 출처 🆕등록자
2026-07-18게릴라성발주휴무배송가능엘홀딩스 외 2수동김운영
2026-08-15게릴라성발주휴무배송불가전체 152자동(광복절)시스템
매주 일요일주 고정발주휴무배송불가동원홈푸드 외 40-관리자

▲ 통합 휴무 현황 — 화면 구성(실 데이터 예시)

1
통합 휴무 현황 진입 — 좌측 '공급사 관리 › 휴무일 관리' 클릭. 전체 공급사의 주 고정·게릴라성 휴무가 날짜 축으로 합쳐진 목록(기본)/월간 캘린더로 표시된다.
2
일괄 등록 시작 — '+ 휴무 일괄 등록' 클릭 → 모달. 먼저 유형(주 고정휴무 / 월별 게릴라성)을 선택한다.
3
패턴·공급사 다중 선택 — 게릴라성이면 날짜(예 7/18), 발주휴무 ON/OFF, 배송 가능·불가를 정하고, 적용 공급사를 다중 체크(엘홀딩스·삼성웰스토리·동원홈푸드…)한다.
4
검증·충돌 확인 — 지난 날짜면 저장 차단. 이미 값이 있는 공급사×날짜는 '덮어쓰기' 확인. 저장 시 bulk_group_id로 묶여 로그 1건 생성.
5
통합 뷰 반영 확인 — 저장 즉시 통합 캘린더/목록에 '적용 공급사 수'와 발주·배송 뱃지로 반영. 발주마감·배송예정일 계산 배치가 이 휴무를 제외 처리.
6
되돌리기 — 잘못 등록한 묶음은 이력에서 bulk_group_id 단위로 되돌리기 → 해당 엔트리 일괄 삭제, status=REVERTED 기록.
04

화면 상세 — 세부 표·규칙

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

휴무 일괄 등록 모달
필드입력 방식예시/옵션
유형라디오주 고정휴무 / 월별 게릴라성
날짜 or 요일데이트픽커/요일선택2026-07-18 (지난 날짜 차단)
발주휴무토글ON = 발주 마감·제외
배송토글가능 / 불가 (발주와 독립)
적용 공급사다중선택 체크박스엘홀딩스·삼성웰스토리·동원홈푸드 (전체선택 가능)
사유 메모텍스트창고 이전 / 광복절
한 모달에서 패턴 1개 + 공급사 N개 → N건 upsert & 로그 1건. 이미 존재하는 건은 덮어쓰기 확인 후 저장.
휴무 2속성 × 고정/게릴라 매핑 규칙표
유형저장 테이블발주(order_close)배송(delivery_yn)반복성
주 고정휴무seller_order_closeclose_hour로 요일 마감seller_weekly_delivery 참조매주 반복
월별 게릴라성seller_order_close_customclose_hour로 당일 마감delivery_yn 당일 지정단일 일자 1회
공휴일(자동)seller_order_close_customholiday_source=HOLIDAYdelivery_yn 정책값연 1회 [결정 대기]
발주휴무와 배송여부는 항상 독립 저장. 공휴일 자동 동기화는 미결 — 스키마(holiday_source)만 선반영.