Glowb Dev Docs
SaaS API캠페인 일정

캠페인 일정 조회 API

GET /ai/campaign-schedules/{campaignNo} — 캠페인 전체 단계 일정 + 해피패스 5단계 요약

캠페인 일정 조회 API

캠페인 ID로 해당 캠페인의 전체 단계 일정과 광고주/어드민 화면용 해피패스 5단계 요약(happyPath)을 한 번에 조회합니다.

응답은 항상 12/10단계 전체 일정과 happyPath를 함께 포함합니다. 별도 쿼리 파라미터 없이 한 번 호출로 두 데이터를 모두 받을 수 있습니다.

HTTP 요청

GET /ai/campaign-schedules/{campaignNo}
Authorization: Bearer {access_token}

Path Parameters

파라미터타입필수설명
campaignNoint캠페인 번호

응답

성공 응답 (200 OK) — 배송형/2회검수 (지연 발생 예시)

{
  "status": 200,
  "code": null,
  "message": "캠페인 일정 조회가 성공하였습니다.",
  "data": {
    "schedules": [
      {
        "scheduleId": 1,
        "phase": "RECRUITMENT",
        "phaseDescription": "모집",
        "startDate": "2026-04-20T00:00:00",
        "endDate": "2026-04-24T00:00:00",
        "originalEndDate": "2026-04-24T00:00:00",
        "completedDate": "2026-04-24T18:00:00",
        "isCompleted": true,
        "isDelayed": false,
        "memo": null,
        "delayReasons": [],
        "createdAt": "2026-04-20T00:00:00",
        "updatedAt": "2026-04-24T18:00:00"
      },
      {
        "scheduleId": 2,
        "phase": "EXCLUSION_SELECTION",
        "phaseDescription": "협업 제안",
        "startDate": "2026-04-28T10:00:00",
        "endDate": "2026-04-28T10:00:00",
        "originalEndDate": "2026-04-26T00:00:00",
        "completedDate": null,
        "isCompleted": false,
        "isDelayed": true,
        "memo": null,
        "delayReasons": [
          {
            "type": "SELECTION_DELAY",
            "days": 2,
            "text": "리스트 선정 지연(2026-04-28 선정완료)",
            "occurredAt": "2026-04-28T10:00:00"
          }
        ],
        "createdAt": "2026-04-20T00:00:00",
        "updatedAt": "2026-04-28T10:00:00"
      }
    ],
    "isDoubleReview": true,
    "totalPhases": 12,
    "guidelineCompletedAt": "2026-04-15T10:00:00",
    "expectedCompletedAt": "2026-05-13T23:59:59",
    "recruitmentDays": 4,
    "happyPath": {
      "isDoubleReview": true,
      "isDelivery": true,
      "guidanceText": "*기본 일정입니다. 검수 내용, 배송에 따라 일정 변경될 수 있어요.",
      "groups": [
        {
          "order": 1,
          "label": "모집",
          "originalDeadline": "2026-04-24",
          "currentDeadline": "2026-04-24",
          "delayDays": 0,
          "delays": []
        },
        {
          "order": 2,
          "label": "크리에이터 리스트 확인 후 선정",
          "originalDeadline": "2026-04-26",
          "currentDeadline": "2026-04-28",
          "delayDays": 2,
          "delays": [
            {
              "type": "SELECTION_DELAY",
              "days": 2,
              "text": "리스트 선정 지연(2026-04-28 선정완료)",
              "occurredAt": "2026-04-28T10:00:00"
            }
          ]
        }
      ]
    }
  }
}

비배송 캠페인은 happyPath.isDelivery=false 이고 groups 에서 ③ 매칭/배송 단계가 누락됩니다. 검수1회 캠페인은 happyPath.isDoubleReview=false 이고 ④ 스크립트 검수 단계가 누락됩니다.

Response 스키마 (ScheduleListResponse)

필드명타입설명
schedulesCampaignScheduleResponseDto[]일정 목록
isDoubleReviewboolean2회검수 캠페인 여부 (true: 12단계, false: 10단계)
totalPhasesint총 단계 수 (10 또는 12)
happyPathCampaignScheduleHappyPathResponseDto광고주/어드민 화면용 해피패스 5단계 요약 (항상 포함)
guidelineCompletedAtdatetime[TASK-071] 가이드라인 완성일. 출처: MongoDB GuidelineDocument.completedAt → fallback Collab.recruitment_start_date (legacy). 가이드 미완성(DRAFT) 캠페인은 null. 운영자는 admin PUT 으로 정정 가능.
expectedCompletedAtdatetime[TASK-071 Jay 2026-05-26] 캠페인 예상 완료일 (백엔드 계산). 국내 캠페인만 산정 (해외 null). guidelineCompletedAt + (baseDays + (recruitmentDays - 4)) 영업일 — 영업일 = 월~금 (한국 공휴일 미고려). 가이드 미완성이면 null.
recruitmentDaysinteger[TASK-071 Phase 3] 모집 영업일 (1-10, 기본 4). T0 트리거가 가이드 완성 + N영업일로 모집 종료일 산정. 관리자 게시물 수정 페이지에서 직접 변경 가능.

guidelineCompletedAt 활용 (Lucy/Daniel 2026-05-21 합의)

  • "모집 시작일 == 가이드라인 최초 완성본 작성 시점"으로 통일. T0 트리거가 wasAlreadyCompleted == false일 때만 호출되므로 최초 시점만 잡힘.
  • 이후 가이드 수정/재완성은 무시 (운영/영업이 필요 시 직접 수정).
  • 광고주 화면의 캠페인 예상 완료일은 프론트가 계산: guidelineCompletedAt + 캠페인 유형별 일수.

캠페인 유형별 예상 완료일 산정식 (Jay 2026-05-26 정정, 백엔드 자동 계산하여 expectedCompletedAt 응답)

  • 국내(KR) 만 산정, 해외는 null (Jay 명세)
  • 영업일 기준 (BusinessDayCalculator.addBusinessDays, 월~금, 한국 공휴일 미고려)
  • 산정: guidelineCompletedAt + baseDays + (recruitmentDays - 4) 영업일
  • baseDaysrecruitmentDays=4 (기본 모집) 기준이며, 모집일수가 늘어난 만큼 추가 (Sam/Jay 합의)
유형baseDays (국내, recruitmentDays=4 기본)
배송형 + 2회검수28 영업일
비배송형 + 2회검수21 영업일
배송형 + 1회검수23 영업일
비배송형 + 1회검수14 영업일

예시 (국내 배송2회): recruitmentDays=4 → 28영업일, recruitmentDays=10 → 34영업일.

지연 발생해도 guidelineCompletedAt / expectedCompletedAt 모두 변동 없음 (최초 완성 시점 기준 고정). 운영자가 recruitmentDays 를 admin PUT 으로 변경하면 expectedCompletedAt 자동 갱신.

화면 표시 정책 (피그마 29926:33536) — 화면에 데이터값이 들어가는 곳은 두 군데:

  • 리스트 전달 (모집 완료) → 실제 날짜 (Collab.recruitmentEndDate)
  • 캠페인 예상 완료일 → 백엔드 응답 expectedCompletedAt 그대로 사용
  • 스크립트/영상/업로드 제출 등 → 고정 안내 텍스트 (프론트 하드코딩, 예: "스크립트 검수 후 4일 이내")

CampaignScheduleResponseDto

필드명타입설명
scheduleIdlong일정 ID
phasestring캠페인 단계 enum
phaseDescriptionstring단계 한글 설명
startDatedatetime단계 시작일
endDatedatetime단계 종료일 (트리거 발생 시 갱신)
originalEndDatedatetime원본 단계 종료일 (가이드 완성 시 1회 세팅, 불변)
completedDatedatetime실제 완료일 (미완료 시 null)
isCompletedboolean완료 여부
isDelayedboolean지연 여부
memostring메모
delayReasonsScheduleDelayInfo[]지연 사유 누적 (JSON 배열). 자기-책임 지연 일수가 필요하면 항목별 days 합산.
createdAtdatetime생성일
updatedAtdatetime수정일

ScheduleDelayInfo

필드명타입설명
typestringSELECTION_DELAY · DELIVERY_DELAY · SCRIPT_REVIEW_DELAY · SCRIPT_RESUBMISSION_DELAY · VIDEO_REVIEW_DELAY
daysint해당 사유로 추가된 지연 일수
textstring화면 노출용 동적 텍스트 (예: 리스트 선정 지연(2026-04-28 선정완료))
occurredAtdatetime지연 발생 시점

해피패스 5단계 요약 (happyPath 필드)

위 응답의 happyPath 필드. 광고주/어드민 화면이 한 호출로 전체 일정 + 5단계 요약을 받습니다. 각 그룹은 원본 마감일(originalDeadline) 과 현재 마감일(currentDeadline) 을 함께 노출합니다.

delayDays캠페인 생성 기준 누적 합산입니다 (기획 결정). 그룹 N 의 delayDays = 그룹 1~N 의 자기-책임 지연 일수 합. 이전 단계가 지연되면 이후 단계에도 그대로 이월됩니다. 반면 delays 라인은 각 단계의 자기-책임 사유만 표기합니다.

happyPath 예시 — 배송형/2회검수 (그룹2: +2일, 그룹3: +4일, 그룹4: +5일, 그룹5: +2일 자기 지연 발생)

{
  "happyPath": {
    "isDoubleReview": true,
    "isDelivery": true,
    "guidanceText": "*기본 일정입니다. 검수 내용, 배송에 따라 일정 변경될 수 있어요.",
    "groups": [
      {
        "order": 1,
        "label": "모집",
        "originalDeadline": "2026-04-24",
        "currentDeadline": "2026-04-24",
        "delayDays": 0,
        "delays": []
      },
      {
        "order": 2,
        "label": "크리에이터 리스트 확인 후 선정",
        "originalDeadline": "2026-04-26",
        "currentDeadline": "2026-04-28",
        "delayDays": 2,
        "delays": [
          { "type": "SELECTION_DELAY", "days": 2, "text": "리스트 선정 지연(2026-04-28 선정완료)", "occurredAt": "2026-04-28T10:00:00" }
        ]
      },
      {
        "order": 3,
        "label": "매칭 인원에게 제품 배송 및 운송장번호 입력",
        "originalDeadline": "2026-04-27",
        "currentDeadline": "2026-05-01",
        "delayDays": 6,
        "delays": [
          { "type": "DELIVERY_DELAY", "days": 4, "text": "배송 지연", "occurredAt": "2026-05-01T15:00:00" }
        ]
      },
      {
        "order": 4,
        "label": "스크립트 검수 및 제작 허용",
        "originalDeadline": "2026-05-06",
        "currentDeadline": "2026-05-11",
        "delayDays": 11,
        "delays": [
          { "type": "SCRIPT_REVIEW_DELAY", "days": 2, "text": "검수 지연", "occurredAt": "2026-05-09T18:00:00" },
          { "type": "SCRIPT_RESUBMISSION_DELAY", "days": 3, "text": "스크립트 재제출로 인한 지연", "occurredAt": "2026-05-09T18:00:00" }
        ]
      },
      {
        "order": 5,
        "label": "제작물 검수 및 업로드 허용",
        "originalDeadline": "2026-05-12",
        "currentDeadline": "2026-05-14",
        "delayDays": 13,
        "delays": [
          { "type": "VIDEO_REVIEW_DELAY", "days": 2, "text": "검수 및 업로드 허용 지연", "occurredAt": "2026-05-14T11:00:00" }
        ]
      }
    ]
  }
}

Response 스키마 (HappyPathResponse)

필드명타입설명
isDoubleReviewboolean검수 2회 여부
isDeliveryboolean배송형 여부
guidanceTextstring화면 안내 문구
groupsHappyPathGroup[]3~5개 그룹 (비배송 시 그룹3 누락, 검수1회 시 그룹4 누락)

HappyPathGroup

필드명타입설명
orderint그룹 순번 (1~5)
labelstring그룹 라벨
originalDeadlinedate원본 마감일 (불변)
currentDeadlinedate현재 마감일 (재계산에 따라 갱신)
delayDaysint캠페인 생성 기준 누적 지연 일수 (이전 단계까지 누적합 + 자기 단계 지연)
delaysScheduleDelayInfo[]자기 단계 책임 사유만 (누적합은 delayDays 로 노출)

API 테스트


단계별 트리거 발화 흐름(T0~T4 + 재제출)은 트리거 기반 일정 재설계 페이지 참고. 크리에이터 개별 일정 조회는 크리에이터 개별 일정 API 페이지 참고.

On this page