fix(cycle): 사이클 종료를 strict less than 으로 — 마감 시각 정각부터는 다음 사이클

이전: O.regdate <= sale_end_date (마감 시각 정각도 이번 사이클로 포함)
변경: O.regdate < sale_end_date (마감 시각 직전까지 = 17:59:59 까지)

예) 월요일 18:00 마감:
  · 17:59:59 발주 → 이번 사이클 (이번주 월요일 마감) 합산
  · 18:00:00 발주 → 다음 사이클 (다음주 월요일 마감 또는 화요일 마감)

자정 정각(00:00) 입력은 '그날 종일 마감' 으로 해석해 다음날 00:00 직전까지 포함.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
chpark
2026-06-01 00:27:00 +09:00
parent 4f2543686a
commit 2afb5fecdd
2 changed files with 11 additions and 9 deletions
+3 -3
View File
@@ -194,11 +194,11 @@ export async function POST(req: NextRequest) {
date_trunc('day', I.sale_end_date) - INTERVAL '7 days')
END
)
AND O.regdate <= (
AND O.regdate < (
CASE
WHEN I.sale_end_date = date_trunc('day', I.sale_end_date)
THEN I.sale_end_date + INTERVAL '1 day' - INTERVAL '1 second'
ELSE I.sale_end_date
THEN I.sale_end_date + INTERVAL '1 day' -- 자정 입력 = 그날 종일 마감
ELSE I.sale_end_date -- 시간 명시 = 그 시각 직전까지
END
)
), 0) AS "RESERVED_QTY",
+8 -6
View File
@@ -1,10 +1,12 @@
// 마감 사이클 기반 한정 수량(limit_qty) 누적 합산 계산.
//
// 사이클 정의 (sale_end_date 요일 기준, PG DOW: 0=일, 1=월, 2=화):
// · 월요일 마감(1): 저번주 금/토/일 + 이번주 월요일 마감 시각까지 (= 마감일 -3일 00:00 ~ 마감)
// · 화요일 마감(2): 저번주 금/토/일 + 이번주 월/화요일 마감 시각까지 (= 마감일 -4일 00:00 ~ 마감)
// · 그 외 요일: sale_start_date ~ sale_end_date (fallback)
// · 월요일 마감(1): 저번주 금/토/일 + 이번주 월요일 마감 시각 직전까지 (= 마감일 -3일 00:00 ~ 마감 시각 직전)
// · 화요일 마감(2): 저번주 금/토/일 + 이번주 월/화요일 마감 시각 직전까지 (= 마감일 -4일 00:00 ~ 마감 시각 직전)
// · 그 외 요일: sale_start_date ~ sale_end_date 직전 (fallback)
//
// 종료 시점은 **반열림(strict less than)** — "월요일 18:00 마감" 이면 17:59:59 까지 포함, 18:00:00 정각부터는 다음 사이클.
// 자정 정각(00:00) 으로 입력된 마감은 "그날 종일 마감" 으로 해석해 다음날 00:00 직전까지 포함한다.
// 마감 시각은 sale_end_date 의 시각 부분 그대로 사용 (관리자가 품목 마스터에서 분 단위로 지정).
// limit_qty 가 null 또는 0 이면 한정 의미 없음 — 호출자가 검증 자체를 skip 해야 한다.
//
@@ -36,11 +38,11 @@ export async function getReservedQty(itemObjid: string, client?: PoolClient): Pr
date_trunc('day', I.sale_end_date) - INTERVAL '7 days')
END
)
AND O.regdate <= (
AND O.regdate < (
CASE
WHEN I.sale_end_date = date_trunc('day', I.sale_end_date)
THEN I.sale_end_date + INTERVAL '1 day' - INTERVAL '1 second'
ELSE I.sale_end_date
THEN I.sale_end_date + INTERVAL '1 day' -- 자정 입력 = 그날 종일 마감 → 다음날 00:00 직전까지
ELSE I.sale_end_date -- 시간 명시 = 그 시각 직전까지 (마감 시각 정각은 마감)
END
)`,
[itemObjid]