Glowb Dev Docs
SaaS APIProgress Table

POST /ai/progress-table/items/bulk/proposal-with-charge

예산 자동 충전 + 제안 일괄 처리

예산 자동 충전 + 제안 일괄 처리

캠페인 예산이 부족한 경우 글로벌 크레딧에서 자동으로 충전한 후, 선택된 인플루언서들의 상태를 PROPOSAL로 변경하고 예산을 LOCK합니다.

처리 흐름

  1. 선택된 Application들의 총 필요 금액 계산
  2. 캠페인 가용 예산 확인
  3. 예산 부족 시 글로벌 크레딧에서 캠페인 예산으로 자동 충전 (forceCharge=true인 경우)
  4. 각 Application에 대해 예산 LOCK + 상태 PROPOSAL로 변경
  5. 초기 결제금액의 80% 이상 사용 여부 확인 후 CREATOR_MATCHING 단계 전환
  6. 상세 트래킹 정보 반환

CREATOR_MATCHING 단계 전환 조건

  • 비즈니스/관리자 모두 초기 결제금액의 80% 이상 예산이 사용된 경우에만 CREATOR_MATCHING(협업 상세 협의)으로 전환
  • 80% 미달 시 stepAdvanced: false, budgetWarning: true로 응답하며 제안 발송 자체는 정상 처리
  • 관리자가 단계를 강제 전환하려면 PATCH /ai/admin/dashboard/{campaignNo}/substep 사용

HTTP 요청

POST /ai/progress-table/items/bulk/proposal-with-charge
Authorization: Bearer {access_token}
Content-Type: application/json

Request Body

{
  "collabId": 123,
  "itemIds": [1, 2, 3],
  "forceCharge": true
}

Request Body 스키마

필드명타입필수설명
collabIdlong캠페인 ID (collabNo)
itemIdsarray<long>CampaignApplication ID 목록
forceChargeboolean아니오예산 부족 시 자동 충전 여부 (기본: true)

응답

성공 응답 (200 OK)

{
  "status": 200,
  "code": null,
  "message": "3명의 크리에이터에게 제안을 보냈습니다.",
  "data": {
    "success": true,
    "message": "3명의 크리에이터에게 제안을 보냈습니다.",
    "totalRequested": 3,
    "totalProcessed": 3,
    "totalAmount": 1500000,
    "budgetBefore": 500000,
    "budgetAfter": 0,
    "chargedAmount": 1000000,
    "globalCreditBefore": 5000000,
    "globalCreditAfter": 4000000,
    "processedItems": [
      {
        "applicationId": 1,
        "influenceName": "인플루언서A",
        "amount": 500000,
        "success": true
      },
      {
        "applicationId": 2,
        "influenceName": "인플루언서B",
        "amount": 500000,
        "success": true
      },
      {
        "applicationId": 3,
        "influenceName": "인플루언서C",
        "amount": 500000,
        "success": true
      }
    ],
    "failedItems": null,
    "stepAdvanced": true,
    "budgetWarning": false,
    "budgetUsagePercentage": 85.0
  }
}

Response Body 스키마

필드명타입설명
successboolean처리 성공 여부
messagestring결과 메시지
errorCodestring실패 시 에러 코드
totalRequestedint요청된 총 인원수
totalProcessedint성공적으로 처리된 인원수
totalAmountint총 차감 금액
budgetBeforeint처리 전 캠페인 가용 예산
budgetAfterint처리 후 캠페인 가용 예산
chargedAmountint글로벌 크레딧에서 충전한 금액 (0이면 충전 없음)
globalCreditBeforeint처리 전 글로벌 크레딧
globalCreditAfterint처리 후 글로벌 크레딧
processedItemsarray성공한 항목별 처리 결과
failedItemsarray실패 항목 (부분 실패 시)
stepAdvancedbooleanCREATOR_MATCHING 단계로 전환됐는지 여부
budgetWarningboolean예산 80% 미달 경고 (true면 80% 미달)
budgetUsagePercentagedouble현재 예산 사용률 (%)

ProposalItemResult 스키마

필드명타입설명
applicationIdlongApplication ID
influenceNamestring인플루언서 이름
amountint차감 금액
successboolean처리 성공 여부
errorMessagestring실패 시 에러 메시지

에러 응답

상태 코드에러 코드설명
400LEGACY_CAMPAIGN레거시 캠페인은 이 기능을 사용할 수 없습니다
400NO_APPLICATIONS처리할 신청 항목이 없습니다
400NO_ELIGIBLE_ITEMS처리 가능한 항목이 없습니다
400BUDGET_001캠페인 예산이 부족합니다 (forceCharge=false일 때)
400BUDGET_002기업 크레딧이 부족합니다

자동 충전이 발생하는 경우

chargedAmount > 0이면 글로벌 크레딧에서 캠페인 예산으로 자동 이체가 발생한 것입니다. 이 경우 CreditTransaction 테이블에 CAMPAIGN_DEPOSIT 타입으로 기록됩니다.

예산 관리 정책

  • 크리에이터 제안 시 예산 LOCK은 CampaignBudget 테이블에서만 관리됩니다
  • CreditTransaction은 글로벌 크레딧 ↔ 캠페인 예산 간 이동 시에만 기록됩니다
  • 제안 취소(UNLOCK) 시에도 CreditTransaction은 기록되지 않습니다

API 테스트

On this page