Skip to content

Option API

Toss POS에서 카탈로그와 함께 사용할 수 있는 옵션 관리 API입니다. 토핑 선택, 사이즈 선택, 샷 추가 등의 옵션을 관리할 수 있습니다.

Types

PluginCatalogItemOption

카탈로그 아이템의 옵션 정보를 나타내는 객체입니다.

ts
{
    id: number;           // 옵션 ID
    title: string;        // 옵션명
    titleI18n?: PluginLanguagePack;  // 옵션명 다국어
    isRequired: boolean;  // 필수 옵션 여부
    minChoices: number;   // 최소 선택 수량
    maxChoices: number;   // 최대 선택 수량
    choices: PluginCatalogItemOptionChoice[];  // 옵션 선택지 목록
    defaultChoices: number[];  // 기본 선택된 옵션 ID 목록
}
필드타입필수설명예시
idnumber필수옵션 ID1
titlestring필수옵션명'커피온도'
titleI18nPluginLanguagePack선택옵션명 다국어
isRequiredboolean필수필수 옵션 여부true
minChoicesnumber필수최소 선택 수량1
maxChoicesnumber필수최대 선택 수량 (-1: 무제한)1
choicesPluginCatalogItemOptionChoice[]필수옵션 선택지 목록[hot, ice]
defaultChoicesnumber[]필수기본 선택된 옵션 ID 목록[1]

PluginCatalogItemOptionChoice

옵션의 선택지 정보를 나타내는 객체입니다. 포스에 등록되어있는 옵션의 선택지입니다

ts
{
    id: number;           // 선택지 ID
    title: string;        // 선택지명
    titleI18n?: PluginLanguagePack;  // 선택지명 다국어
    priceValue: number;   // 추가 가격
    imageUrl: string | null;  // 아이콘 URL
    state: 'ON_SALE' | 'SOLD_OUT';  // 판매 상태
    quantityInputEnabled: boolean
}
필드타입필수설명예시
idnumber필수선택지 ID1
titlestring필수선택지명'hot'
titleI18nPluginLanguagePack선택선택지명 다국어
priceValuenumber필수추가 가격0
imageUrlstring | null필수아이콘 URL'https://toss.imimages/option.png'
state'ON_SALE' | 'SOLD_OUT'필수판매 상태'ON_SALE'
quantityInputEnabledboolean필수옵션이 수량선택 가능한지 여부false

PluginOrderItemOptionChoice

옵션의 선택지 정보를 나타내는 객체입니다. 손님이 선택하는 옵션의 정보입니다

ts
{
    id: number;           // 선택지 ID
    title: string;        // 선택지명
    titleI18n?: PluginLanguagePack;  // 선택지명 다국어
    priceValue: number;   // 추가 가격
    imageUrl: string | null;  // 아이콘 URL
    state: 'ON_SALE' | 'SOLD_OUT';  // 판매 상태
    quantity: number;  // 수량
}
필드타입필수설명예시
idnumber필수선택지 ID1
titlestring필수선택지명'hot'
titleI18nPluginLanguagePack선택선택지명 다국어
priceValuenumber필수추가 가격0
imageUrlstring | null필수아이콘 URL'https://toss.imimages/option.png'
state'ON_SALE' | 'SOLD_OUT'필수판매 상태'ON_SALE'
quantitynumber필수판매 수량1

Methods

getOption

모든 옵션 목록을 조회합니다.

ts
import { pos } from '@tossplace/pos-plugin-sdk';

/**
 * 옵션 조회
 * @returns 옵션
 */
const option = await posPluginSdk.option.getOption(optionId);

getOptions

모든 옵션 목록을 조회합니다.

ts
import { pos } from '@tossplace/pos-plugin-sdk';

/**
 * 옵션 목록 조회
 * @returns 옵션 목록
 */
const options = await posPluginSdk.option.getOptions();

on

이벤트 구독을 위한 메서드입니다.

sold-out

옵션이 품절되었을 때 발생하는 이벤트입니다.

ts
import { posPluginSdk } from '@tossplace/pos-plugin-sdk';

pos.option.on('sold-out', (option: PluginCatalogItemOption) => {
  console.log('품절된 옵션:', option.title);
});

on-sale

옵션의 상태가 판매중으로 변경되었을 때 발생하는 이벤트입니다.

ts
import { posPluginSdk } from '@tossplace/pos-plugin-sdk';

pos.option.on('on-sale', (option: PluginCatalogItemOption) => {
  console.log('판매중으로 변경된 옵션:', option.title);
});

update

옵션의 정보가 업데이트 되었을 때 발생하는 이벤트입니다.

ts
import { posPluginSdk } from '@tossplace/pos-plugin-sdk';

pos.option.on('update', (option: PluginCatalogItemOption) => {
  console.log('정보가 업데이트 된 옵션:', option.title);
});

add

옵션이 새로 추가되었을 때 발생하는 이벤트입니다.

ts
import { posPluginSdk } from '@tossplace/pos-plugin-sdk';

pos.option.on('add', (option: PluginCatalogItemOption) => {
  console.log('판매중으로 변경된 옵션:', option.title);
});

delete

옵션이 삭제되었을 때 발생하는 이벤트입니다.

ts
import { posPluginSdk } from '@tossplace/pos-plugin-sdk';

pos.option.on('delete', (option: PluginCatalogItemOption) => {
  console.log('판매중으로 변경된 옵션:', option.title);
});

사용 예시

옵션 관리 클래스

ts
import { posPluginSdk } from '@tossplace/pos-plugin-sdk';

class OptionManager {
  private options: PluginCatalogItemOption[] = [];

  /**
   * 옵션 목록 조회 및 초기화
   */
  async initialize() {
    try {
      this.options = await posPluginSdk.option.getOptions();
      this.setupEventListeners();
    } catch (error) {
      console.error('옵션 초기화 실패:', error);
    }
  }

  /**
   * 이벤트 리스너 설정
   */
  private setupEventListeners() {
    posPluginSdk.option.on('sold-out', this.handleSoldOut.bind(this));
    posPluginSdk.option.on('on-sale', this.handleOnSale.bind(this));
    posPluginSdk.option.on('update', this.handleUpdate.bind(this));
    posPluginSdk.option.on('add', this.handleAdd.bind(this));
    posPluginSdk.option.on('delete', this.handleDelete.bind(this));
  }

  /**
   * 품절 이벤트 처리
   */
  private handleSoldOut(option: PluginCatalogItemOption) {
    console.log('옵션 품절:', option.title);
  }

  /**
   * 판매중 이벤트 처리
   */
  private handleOnSale(option: PluginCatalogItemOption) {
    console.log('옵션 판매중:', option.title);
  }

  /**
   * 옵션 업데이트 이벤트 처리
   */
  private handleUpdate(option: PluginCatalogItemOption) {
    console.log('옵션 업데이트:', option.title);
  }

  /**
   * 옵션 추가 이벤트 처리
   */
  private handleAdd(option: PluginCatalogItemOption) {
    console.log('옵션 추가:', option.title);
  }

  /**
   * 옵션 삭제 이벤트 처리
   */
  private handleDelete(option: PluginCatalogItemOption) {
    console.log('옵션 삭제:', option.title);
  }

  /**
   * 필수 옵션 목록 조회
   */
  getRequiredOptions(): PluginCatalogItemOption[] {
    return this.options.filter((option) => option.isRequired);
  }

  /**
   * 옵션 ID로 조회
   */
  getOptionById(id: number): PluginCatalogItemOption | undefined {
    return this.options.find((option) => option.id === id);
  }
}

// 사용 예시
async function manageOptions() {
  const optionManager = new OptionManager();
  await optionManager.initialize();
}