개요 및 상태 판정
기업 주도(BUSINESS_DIRECT) 캠페인 플로우의 5단계와, 프런트가 현재 단계를 판정하는 방법.
기업 주도 캠페인 플로우
광고주가 직접 만든 캠페인은 기존과 다른 순서로 진행됩니다. 기업이 가이드라인 초안까지 작성한 뒤 결제를 요청하고, 관리자가 내용을 검토·수정한 다음 모집을 시작합니다.
새로운 진행 단계(SubStep)는 추가되지 않았습니다. 기존 campaignSubStep 값은 그대로이고,
프런트는 flowType · guidelineStatus · paymentStatus 3개 값의 조합으로 현재 단계를 판정합니다.
대상 캠페인
flowType 이 BUSINESS_DIRECT 인 캠페인만 이 플로우를 탑니다.
판정 기준은 생성 주체입니다. 카테고리는 판정에 쓰이지 않습니다.
| 생성 경로 | flowType |
|---|---|
광고주 셀프 생성 (POST /ai/business/campaigns/draft) | BUSINESS_DIRECT — 카테고리 무관, 전 카테고리 |
관리자 대시보드 생성 (POST /ai/admin/dashboard) | STANDARD |
관리자 캠페인 생성 (AdminCampaignService) | STANDARD |
관리자 게시물 등록 (insertAdminCollab) | STANDARD |
| 조건 | 값 |
|---|---|
| 판정 시점 | 캠페인 생성 시 1회만 |
기존 캠페인 (flow_type NULL) | STANDARD (기존 플로우) |
판정 기준이 카테고리에서 생성 주체로 바뀌었습니다. 이전에는 FASHION·TRAVEL·BEAUTY·COOKING
4개 카테고리면 관리자 생성분까지 기업 주도 플로우를 탔습니다. 그 결과 관리자가 만든 뷰티 캠페인의
모집을 결제 승인 전에는 시작할 수 없었습니다.
지금은 광고주가 직접 만든 캠페인만 기업 주도 플로우이고, 그 경우 카테고리는 전혀 보지 않습니다.
관리자 생성분은 카테고리와 무관하게 항상 STANDARD 입니다.
생성 이후 카테고리를 변경해도 플로우는 바뀌지 않습니다. 애초에 카테고리로 판정하지 않고,
진행 중인 캠페인이 도중에 다른 규칙으로 갈아타지도 않습니다. 생성 시점 카테고리는 initialCategory 에
스냅샷으로 남습니다. 화면 분기는 반드시 flowType 으로 하고, category 로 판단하지 마세요.
광고주 셀프 생성은 카테고리가 필수가 되었습니다. 미지정 시 400 입니다 —
캠페인 초안 생성 참고.
가이드 컨셉 초안 자동 생성
guideline_step_modifi 플래그가 ON 이면, 광고주가 캠페인을 생성하는 순간 서버가 트렌드 컨셉
초안을 미리 뽑아둡니다. 광고주가 가이드라인 화면에 들어오면 컨셉 3개가 이미 준비되어 있습니다.
| 플래그 | 정책 | 캠페인 생성 직후 |
|---|---|---|
ON | 신규 | 컨셉 초안 자동 생성 |
OFF | 이전 | 아무것도 생성하지 않음 — 광고주가 화면에서 직접 요청 |
프런트가 해야 할 일 — 가이드라인 컨셉 화면 진입 시 컨셉 생성 API 를 무조건 부르면 미리 만들어둔 초안을 덮어쓰고 다시 생성합니다. 먼저 세션을 조회하세요.
const session = await get(`/ai/guideline/v4/${collabNo}/session`);
if (session.concepts?.length) {
// 이미 컨셉이 있다 — 그대로 그린다
render(session.concepts);
} else {
// 컨셉이 없다 (플래그 OFF 이거나 자동 생성이 실패한 경우)
await post(`/ai/guideline/v5/${collabNo}/concepts`, { ... });
}판정은 concepts 유무 하나로 합니다. 서버가 미리 만든 것과 광고주가 직접 눌러 만든 것은
결과가 동일해서 구분할 이유가 없고, 별도 상태값도 두지 않았습니다(status 는 두 경우 모두
CONCEPTS_GENERATED). 자동 생성이 실패하면 세션 자체가 없으므로 그 경우를 항상 처리해야 합니다.
자동 생성은 캠페인 생성 응답과 별개로 비동기 실행됩니다. 생성 API 응답이 왔다고 컨셉이 준비된 것은 아닙니다. 파이썬 호출 + 이미지 분석이라 수십 초가 걸립니다.
collab.guidelineStatus 는 자동 생성으로 바뀌지 않습니다. 그 값의 DRAFT 는 종전대로
"광고주가 초안을 저장했다"는 뜻이므로, 아래 상태 판정표는 영향을 받지 않습니다.
진행 5단계
1. 게시물 등록 (기업) 캠페인 생성
2. 가이드 초안 (기업) 가이드라인 초안 저장
3. 결제요청 (기업) 결제 요청 버튼 ← 신규 API
3'. 결제확인 (관리자) 입금 확인 처리
4. 수정·검토 (관리자) 수수료 / 모집 영업일수 확정, 가이드 보완
5. 모집시작 (관리자) 가이드라인 완성본 저장 = 모집 시작5단계는 두 경로가 있고 처리 결과는 동일합니다.
- 관리자가 가이드라인 완성본을 저장하면 그대로 모집 시작 트리거가 됩니다 (기존 동작).
- 내용을 바꾸지 않고 모집만 시작하려면 완성 처리 + 모집 시작 API 를 씁니다.
둘 다 campaignSubStep → CREATOR_RECRUIT 로 바꾸고 모집 일정을 확정합니다.
상태 판정표
프런트는 아래 조합으로 현재 단계를 판정합니다.
| 단계 | 화면 표기(예시) | campaignSubStep | guidelineStatus | paymentStatus | 주체 |
|---|---|---|---|---|---|
| 1 | 게시물 등록 완료 | CAMPAIGN_REVIEW | null | UNPAID | 기업 |
| 2 | 가이드 초안 작성됨 | CAMPAIGN_GUIDELINE | DRAFT | UNPAID | 기업 |
| 3 | 결제 요청됨 | CAMPAIGN_GUIDELINE | DRAFT | PAYMENT_PENDING | 기업 |
| 3' | 결제 완료 | CAMPAIGN_GUIDELINE | DRAFT | PAID | 관리자 |
| 4 | 관리자 검토 중 | CAMPAIGN_GUIDELINE | DRAFT | PAID | 관리자 |
| 5 | 모집 중 | CREATOR_RECRUIT | COMPLETED | PAID | 관리자 |
3' 와 4 는 서버 상태가 동일합니다. 결제 완료와 관리자 검토는 백엔드에서 구분되지 않으므로, 화면에서도 하나로 묶어 "결제 완료 · 관리자 검토 중"으로 표기하는 것을 권장합니다.
guidelineStatus 는 REQUESTED 값도 가질 수 있습니다(빈 템플릿 요청 상태). 판정 시 DRAFT 와 동일하게
"아직 완성 전"으로 취급하세요.
프런트 분기 예시
type Step = 'POST_CREATED' | 'GUIDELINE_DRAFT' | 'PAYMENT_REQUESTED' | 'ADMIN_REVIEW' | 'RECRUITING';
function resolveStep(c: CampaignDetail): Step | null {
// 기존 플로우 캠페인은 이 판정을 쓰지 않는다
if (c.flowType !== 'BUSINESS_DIRECT') return null;
if (c.campaignSubStep === 'CREATOR_RECRUIT') return 'RECRUITING';
if (c.paymentStatus === 'PAID') return 'ADMIN_REVIEW';
if (c.paymentStatus === 'PAYMENT_PENDING') return 'PAYMENT_REQUESTED';
if (c.guidelineStatus === 'DRAFT' || c.guidelineStatus === 'REQUESTED') return 'GUIDELINE_DRAFT';
return 'POST_CREATED';
}결제요청 버튼 노출 조건
const canRequestPayment =
c.flowType === 'BUSINESS_DIRECT' &&
c.guidelineStatus != null && // 초안 이상 작성됨
c.paymentStatus !== 'PAID'; // 아직 결제 전
// paymentStatus === 'PAYMENT_PENDING' 이면 "결제 재요청"으로 문구만 변경 (호출 가능)가이드라인 "완성" 버튼 노출 조건
// guideline_step_modifi ON 이면 기업 계정도 완성본을 저장할 수 있다.
// OFF 면 BUSINESS_DIRECT 에서 기업 계정은 차단된다 (서버가 403 BD_004 로 거부).
const canCompleteGuideline =
c.flowType !== 'BUSINESS_DIRECT' || isAdmin || guidelineStepModifiEnabled;응답 필드 추가
아래 필드가 기존 응답에 추가되었습니다. 기존 필드는 변경되지 않았습니다.
| 필드 | 타입 | 추가된 응답 | 설명 |
|---|---|---|---|
flowType | "STANDARD" | "BUSINESS_DIRECT" | null | 진행표 조회, 관리자 캠페인 상세 | null 이면 기존 플로우 |
guidelineStatus | "REQUESTED" | "DRAFT" | "COMPLETED" | null | 진행표 조회 | 관리자 상세에는 이미 존재하던 필드 |
initialCategory | string | null | 관리자 캠페인 상세 | 생성 시점 카테고리 스냅샷 |
paymentStatus 는 기존에 진행표 응답에 이미 있던 필드입니다.
flowType 이 null 인 응답은 기존에 만들어진 캠페인입니다. 이 필드가 추가되기 전 데이터에는
값이 없으므로, 프런트는 null 을 반드시 STANDARD 로 취급해야 합니다.
기존 캠페인 영향
기존 플로우 캠페인(flowType 이 null 또는 STANDARD)의 동작은 전혀 바뀌지 않았습니다.
- 진행 단계(
campaignSubStep) 값은 하나도 추가·변경되지 않음 - 기업이 가이드라인 완성본을 저장하면 종전대로 즉시 모집 시작
- 결제 상태 판정 로직 변경 없음 (결제 검증 행은
BUSINESS_DIRECT캠페인에만 새로 생성됨) - 환불 가능 여부, 가이드라인 수정 허용, 신청자 노출 등 기존 판정 로직 변경 없음