Skip to main content

개요

ARI Inclusion은 요금제에 포함되는 부가 서비스나 옵션을 관리합니다. 조식, 픽업 서비스, 얼리 체크인, 레이트 체크아웃 등 다양한 서비스을 정의하고, 요금제에 연결하여 사용할 수 있습니다. 주요 개념:
  • 기본 서비스: 시스템이 제공하는 공통 서비스 (얼리 체크인, 레이트 체크아웃, 추가 인원)
  • 커스텀 서비스: 숙박 시설이 직접 생성하는 서비스 (조식, 픽업 서비스 등)
  • 요금 설정: 서비스별 추가 요금 설정
  • 수량 관리: 요금제에 서비스 연결 시 수량 지정
  • 변경 이력: 모든 수정 사항이 히스토리로 저장됨

기본 서비스 코드

시스템이 제공하는 기본 서비스:
코드이름설명
EARLY_CHECK_IN얼리 체크인정규 체크인 시간보다 일찍 입실
LATE_CHECK_OUT레이트 체크아웃정규 체크아웃 시간보다 늦게 퇴실
EXTRA_OCCUPANCY추가 인원기준 인원 초과 시 추가 인원

Queries

getAriInclusionList

특정 숙박 시설의 서비스 목록을 조회합니다.

GraphQL Signature

query GetAriInclusionList($accommodationId: ID!) {
  getAriInclusionList(accommodationId: $accommodationId) {
    id
    code
    name
    charge
    currency
    isImmutable
    isFavorite
  }
}

파라미터

accommodationId
ID!
required
조회할 숙박 시설 ID

응답

id
Int!
서비스 ID
code
String!
서비스 코드
name
String!
서비스 이름
charge
Decimal!
추가 요금
currency
String!
통화 코드 (예: KRW, USD)
isImmutable
Boolean!
수정 불가 여부 (기본 서비스은 true)
isFavorite
Boolean!
즐겨찾기 여부

예제

query {
  getAriInclusionList(accommodationId: "01H8X9Y2Z3A4B5C6D7E8F9G0H1") {
    id
    code
    name
    charge
    currency
    isImmutable
    isFavorite
  }
}

getDefaultAriInclusionList

시스템이 제공하는 기본 서비스 목록을 조회합니다.

GraphQL Signature

query GetDefaultAriInclusionList {
  getDefaultAriInclusionList {
    id
    code
    name
    charge
    currency
    isImmutable
    isFavorite
  }
}

응답

기본 서비스 목록을 반환합니다. accommodationId가 null인 항목들입니다.
code
DefaultAriInclusionCode!
기본 서비스 코드:
  • EARLY_CHECK_IN: 얼리 체크인
  • LATE_CHECK_OUT: 레이트 체크아웃
  • EXTRA_OCCUPANCY: 추가 인원

예제

query {
  getDefaultAriInclusionList {
    id
    code
    name
    charge
    currency
    isImmutable
  }
}

Mutations

createAriInclusion

새로운 서비스을 생성합니다.

GraphQL Signature

mutation CreateAriInclusion($accommodationId: ID!, $input: CreateAriInclusionInput!) {
  createAriInclusion(accommodationId: $accommodationId, input: $input) {
    id
    code
    name
    charge
    currency
    isImmutable
    isFavorite
  }
}

파라미터

accommodationId
ID!
required
숙박 시설 ID
input
CreateAriInclusionInput!
required
서비스 생성 정보
input.code
String!
required
서비스 코드 (숙박 시설 내에서 고유해야 함)
input.name
String!
required
서비스 이름
input.charge
Decimal!
required
추가 요금
input.currency
String
통화 코드 (기본값: KRW)
input.isImmutable
Boolean
수정 불가 여부 (기본값: false)
input.isFavorite
Boolean
즐겨찾기 여부 (기본값: false)

응답

생성된 AriInclusion 객체를 반환합니다.

예제

mutation {
  createAriInclusion(
    accommodationId: "01H8X9Y2Z3A4B5C6D7E8F9G0H1"
    input: {
      code: "BREAKFAST"
      name: "조식"
      charge: "15000"
      currency: "KRW"
      isImmutable: false
      isFavorite: true
    }
  ) {
    id
    code
    name
    charge
    currency
    isImmutable
    isFavorite
  }
}

검증 규칙

  • 동일한 accommodationIdcode 조합이 이미 존재하면 ARI_INCLUSION.CODE_ALREADY_EXISTS 에러 발생
  • 생성 시 버전 1의 히스토리가 자동으로 생성됨

updateAriInclusion

기존 서비스을 수정합니다.

GraphQL Signature

mutation UpdateAriInclusion($id: Int!, $input: UpdateAriInclusionInput!) {
  updateAriInclusion(id: $id, input: $input) {
    id
    code
    name
    charge
    currency
    isImmutable
    isFavorite
  }
}

파라미터

id
Int!
required
수정할 서비스 ID
input
UpdateAriInclusionInput!
required
수정할 필드 (모든 필드 선택적)
input.code
String
서비스 코드
input.name
String
서비스 이름
input.charge
Decimal
추가 요금
input.currency
String
통화 코드
input.isImmutable
Boolean
수정 불가 여부
input.isFavorite
Boolean
즐겨찾기 여부

응답

수정된 AriInclusion 객체를 반환합니다.

예제

mutation {
  updateAriInclusion(
    id: 1
    input: {
      name: "프리미엄 조식"
      charge: "20000"
      isFavorite: true
    }
  ) {
    id
    name
    charge
    isFavorite
  }
}

검증 규칙

  • 서비스 코드 변경 시 중복 검증 실행
  • 수정 시 새로운 버전의 히스토리가 자동으로 생성됨
  • isImmutable: true인 서비스도 수정 가능 (플래그는 참고용)

deleteAriInclusion

서비스을 삭제합니다.

GraphQL Signature

mutation DeleteAriInclusion($id: Int!) {
  deleteAriInclusion(id: $id)
}

파라미터

id
Int!
required
삭제할 서비스 ID

응답

success
Boolean!
삭제 성공 여부

예제

mutation {
  deleteAriInclusion(id: 1)
}

제약 사항

요금제에서 사용 중인 서비스은 삭제할 수 없습니다. CANNOT_DELETE_USING_INCLUSION 에러가 발생합니다. 삭제하려면 먼저 모든 요금제에서 해당 서비스을 제거해야 합니다.

서비스 히스토리

모든 서비스 수정 사항은 히스토리로 저장됩니다.

AriInclusionHistory

id
ID!
히스토리 ID (ULID 형식)
name
String!
서비스 이름 (당시 값)
code
String!
서비스 코드 (당시 값)
charge
Decimal!
추가 요금 (당시 값)
currency
String!
통화 코드 (당시 값)

버전 관리

  • 생성 시: 버전 1의 히스토리 생성
  • 수정 시: 최신 버전 + 1의 히스토리 생성
  • 히스토리는 삭제되지 않으며 영구 보관됨

예시

# 서비스 생성
createAriInclusion(input: { name: "조식", charge: "15000" })
# → 히스토리 버전 1 생성

# 첫 번째 수정
updateAriInclusion(input: { charge: "18000" })
# → 히스토리 버전 2 생성

# 두 번째 수정
updateAriInclusion(input: { name: "프리미엄 조식", charge: "20000" })
# → 히스토리 버전 3 생성

요금제에 서비스 연결

서비스은 요금제 생성 또는 수정 시 연결됩니다.

생성 시 연결

mutation {
  createAriRatePlan(
    accommodationId: "01H8X9Y2Z3A4B5C6D7E8F9G0H1"
    input: {
      name: "조식 포함 요금제"
      # ... 기타 필드
      inclusions: [
        {
          id: 1  # 조식 서비스 ID
          quantity: 2  # 수량: 2인분
        },
        {
          id: 3  # 얼리 체크인 서비스 ID
          quantity: 1
        }
      ]
    }
  ) {
    id
    name
    inclusions {
      quantity
      inclusion {
        name
        charge
      }
    }
  }
}

수정 시 재설정

mutation {
  updateAriRatePlan(
    ratePlanId: 1
    input: {
      inclusions: [
        {
          id: 1  # 조식만 남김
          quantity: 3  # 수량 변경: 3인분
        }
      ]
    }
  ) {
    id
    inclusions {
      quantity
      inclusion {
        name
      }
    }
  }
}

AriRatePlanInclusion 구조

id
Int!
연결 매핑 ID
ratePlanId
Int!
요금제 ID
inclusionId
Int!
서비스 ID
quantity
Int!
포함 수량
inclusion
AriInclusion!
서비스 정보

활용 사례

1. 조식 포함 요금제

# 1. 조식 서비스 생성
mutation {
  createAriInclusion(
    accommodationId: "01H8X9Y2Z3A4B5C6D7E8F9G0H1"
    input: {
      code: "BREAKFAST"
      name: "조식 뷔페"
      charge: "15000"
      currency: "KRW"
    }
  ) {
    id
  }
}

# 2. 조식 포함 요금제 생성
mutation {
  createAriRatePlan(
    accommodationId: "01H8X9Y2Z3A4B5C6D7E8F9G0H1"
    input: {
      name: "조식 포함 스탠다드 요금제"
      # ... 기타 필드
      inclusions: [
        {
          id: 1  # 위에서 생성한 조식 ID
          quantity: 2  # 기준 인원 2명분
        }
      ]
    }
  ) {
    id
    name
    inclusions {
      quantity
      inclusion {
        name
        charge
      }
    }
  }
}

2. 얼리 체크인 옵션

# 얼리 체크인 서비스 생성
mutation {
  createAriInclusion(
    accommodationId: "01H8X9Y2Z3A4B5C6D7E8F9G0H1"
    input: {
      code: "EARLY_CHECK_IN"
      name: "얼리 체크인 (12시)"
      charge: "20000"
      currency: "KRW"
      isImmutable: false
      isFavorite: true
    }
  ) {
    id
    name
    charge
  }
}

3. 여러 서비스 조합

mutation {
  createAriRatePlan(
    accommodationId: "01H8X9Y2Z3A4B5C6D7E8F9G0H1"
    input: {
      name: "프리미엄 패키지"
      # ... 기타 필드
      inclusions: [
        { id: 1, quantity: 2 },  # 조식 2인분
        { id: 2, quantity: 1 },  # 공항 픽업 1회
        { id: 3, quantity: 1 },  # 얼리 체크인 1회
        { id: 4, quantity: 1 }   # 레이트 체크아웃 1회
      ]
    }
  ) {
    id
    name
    inclusions {
      quantity
      inclusion {
        name
        charge
      }
    }
  }
}

4. 즐겨찾기 관리

자주 사용하는 서비스을 즐겨찾기로 설정:
mutation {
  updateAriInclusion(
    id: 1
    input: { isFavorite: true }
  ) {
    id
    name
    isFavorite
  }
}

사용 흐름

  1. 기본 서비스 확인: getDefaultAriInclusionList로 시스템 제공 서비스 확인
  2. 커스텀 서비스 생성: createAriInclusion으로 필요한 서비스 생성
  3. 요금제 연결: 요금제 생성/수정 시 inclusions 배열로 연결
  4. 요금 계산: 예약 시 서비스 수량에 따른 추가 요금 계산
  5. 관리: 필요 시 서비스 수정 또는 삭제 (미사용 항목만)

모범 사례

  1. 명확한 이름: 고객이 이해하기 쉬운 서비스 이름 사용
  2. 적절한 코드: 시스템 전체에서 일관성 있는 코드 체계 유지
  3. 통화 일치: 숙박 시설의 기본 통화와 일치시키기
  4. 즐겨찾기 활용: 자주 사용하는 서비스은 즐겨찾기로 관리
  5. 히스토리 보존: 요금 변경 시 히스토리가 자동 저장되므로 과거 예약 추적 가능
  6. 삭제 전 확인: 요금제에서 사용 중인지 확인 후 삭제

주의 사항

서비스의 요금을 변경하면 새로운 히스토리가 생성됩니다. 과거 예약은 예약 당시의 요금으로 기록되므로, 서비스 요금 변경이 과거 예약에 영향을 주지 않습니다.
기본 서비스(EARLY_CHECK_IN, LATE_CHECK_OUT, EXTRA_OCCUPANCY)은 accommodationId가 null이며, 시스템 전체에서 공유됩니다. 숙박 시설별로 별도의 서비스을 생성하려면 다른 코드를 사용하세요.

관련 API