Skip to content

납기 한도: 20영업일 + 공휴일을 뺀다 - #383

Closed
Jay722J wants to merge 1 commit into
mainfrom
feat/holiday-calendar
Closed

납기 한도: 20영업일 + 공휴일을 뺀다#383
Jay722J wants to merge 1 commit into
mainfrom
feat/holiday-calendar

Conversation

@Jay722J

@Jay722J Jay722J commented Sep 10, 2026

Copy link
Copy Markdown
Collaborator

Closes #382

한도 15 → 20 영업일

기산점은 바뀌지 않는다. 예전부터 assigned_at(제작 배정을 누른 순간)부터 셌고 지금도 그렇다 — 수락하면서 새로 창이 열리는 것이 아니라, 수락이 늦으면 남는 제작 기간이 그만큼 줄어든다.

지시대로 기존 건을 갈랐다.

상태 한도
이미 납기를 찍음(수락 완료) 15일 그대로 — 발주서에 「15일 이내」가 문서로 찍혀 나갔다
아직 수락 안 된 배정 20일 — 연휴에 막혀 날짜를 못 고르던 건들이 이 대상

그래서 한도를 주문에 얼려 둔다(order.due_limit_days). 상수 하나로 두면 다음에 또 바꿀 때 이미 나간 서류가 함께 바뀐다. migration 이 기존 행을 위 규칙대로 채운다.

한도가 이미 지난 배정은 전과 같이 수락이 막히고 「관리자에게 재배정 요청」이 뜬다. 다만 20일 + 연휴 제외로 창이 넓어져 상당수가 저절로 다시 열린다 — 의도한 결과다.

공휴일

holiday 표를 새로 만들고 영업일 계산에 주입한다(setHolidays). 코드에 박으면 임시공휴일 하나에 배포를 해야 한다. 서버는 DB 에서, 화면은 GET /api/v1/holidays 에서 같은 목록을 받아 같은 함수에 물린다 — 어긋나면 「화면에서는 고를 수 있는데 저장이 거부되는」 사고가 다시 난다.

⚠️ 무료 API 는 그대로 못 쓴다. nager.at 과 holidays.hyunbin.page 를 대조해 보니 둘 다 제헌절(7/17)을 공휴일로 넣고 있었다 — 2008년에 빠진 날이다. 그래서 불러온 값을 믿지 않고, 확인한 2026년 값(21일)을 migration 으로 넣었다. 자동 조회는 관리자 화면에서 초안으로만 쓸 계획이다(다음 PR).

받아오지 못해도 멈추지 않는다. 달력이 비면 주말만 빼는 예전 계산이 되어 한도가 짧게 나온다 — 넘기면 안 되는 쪽이라 안전한 방향이다.

달력 화면

연휴는 가라앉히지 않고 이름을 적는다. 추석이라 못 고르는 것과 한도를 넘어 못 고르는 것은 다른 이야기다.

브라우저에서 잡은 것 하나 — 달력이 늦게 도착하면 격자를 다시 세야 한다. 처음엔 한 번 그리고 말아서 10/14 까지여야 할 달력이 10/10 에서 끊겼다. 지금은 9/10 배정 건에서 20칸이 정확히 나온다.

검증

shared 8개 · 실제 API 6개. 되돌려 각각 걸리는 것을 확인했다.

되돌린 것 걸린 검사
공휴일을 계산에서 뺌(주말만) 연휴만큼 한도가 밀린다
납기일 공휴일 판정 삭제 연휴 당일은 납기로 저장되지 않는다
주문에 얼린 한도 무시 15일 발주서는 15일 그대로
서버가 달력을 안 읽음 연휴 당일은 납기로 저장되지 않는다

백엔드 683 · shared 314 통과 · 프론트 클린 빌드 · db:drift 일치(테이블 40 · 컬럼 317).

스키마

추가만 했다 — holiday 표 신규, order.due_limit_days 컬럼 추가. 기존 표·컬럼은 건드리지 않았다. 공휴일 초기값은 전체 seed 가 아니라 migration 안의 격리된 ON CONFLICT DO NOTHING 으로 넣는다.

주말만 빼고 세다 보니 연휴가 낀 달에 고를 수 있는 날짜가 실제보다 적었다.
추석(9/24~26)을 앞두고 납기를 찍지 못하는 일이 생겼다(제보).

**한도 15 → 20 영업일.** 기산점은 예전과 같은 **배정일**이다(수락일이 아니다) —
수락이 늦으면 남는 제작 기간이 그만큼 줄어든다.

  · 이미 납기를 찍은 건(수락 완료) → 15일 그대로. 발주서에 「15일 이내」가
    문서로 찍혀 나갔으므로 소급해 고치지 않는다.
  · 아직 수락 안 된 배정 → 20일 창을 연다. 연휴에 막혀 있던 건들이 이 대상이다.

그래서 한도를 **주문에 얼려 둔다**(`order.due_limit_days`). 상수 하나로 두면
다음에 또 바꿀 때 이미 나간 서류가 같이 바뀐다.

## 공휴일

`holiday` 표를 새로 만들고 영업일 계산에 **주입**한다. 코드에 박으면 임시공휴일
하나에 배포를 해야 한다. 서버는 DB 에서, 화면은 `GET /holidays` 에서 같은 목록을
받아 같은 함수(shared/schedule)에 물린다 — 어긋나면 「고를 수 있는데 저장이
거부되는」 예전 사고가 다시 난다.

⚠️ 무료 공개 API 두 곳(nager.at · holidays.hyunbin.page)을 대조해 보니 **둘 다**
   제헌절(7/17)을 공휴일로 넣고 있었다. 2008년에 빠진 날이다. 그래서 불러온 값을
   그대로 쓰지 않고, 확인한 2026년 값을 migration 으로 넣었다. 자동 조회는
   관리자 화면에서 **초안**으로만 쓸 것이다(다음 PR).

받아오지 못해도 멈추지 않는다 — 달력이 비면 주말만 빼는 예전 계산이 되고,
한도가 짧게 나온다. 한도는 넘기면 안 되는 쪽이라 안전한 방향이다.

## 달력 화면

연휴는 회색으로 가라앉히지 않고 **이름을 적는다.** 「왜 이 날은 못 고르지」가
남으면 전화가 온다 — 추석이라 못 고르는 것과 한도를 넘어 못 고르는 것은 다른
이야기다.

달력이 늦게 도착하면 격자를 **다시 센다.** 처음엔 한 번 그리고 말아서, 10/14
까지여야 할 달력이 10/10 에서 끊겨 있었다(브라우저에서 잡았다).

검사: shared 8개 · 실제 API 6개. 넷을 되돌려 각각 걸리는 것을 확인했다.
db:drift 일치(테이블 40 · 컬럼 317).
@Jay722J

Jay722J commented Sep 10, 2026

Copy link
Copy Markdown
Collaborator Author

한 번에 배포하기로 해 #384 로 합쳤습니다. 커밋은 그대로 남아 있습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

납기 한도에 공휴일이 빠지지 않는다 — 추석 앞두고 날짜를 못 찍는다

1 participant