@Override
 public void allowPayout(
     Context respCtx,
     Game game,
     PayoutLevelAllowRequest[] levelAllowRequests,
     BigDecimal actualPayout)
     throws ApplicationException {
   // verify whether the game has been allocated
   MerchantCommission comm =
       this.getMerchantCommissionDao()
           .getByMerchantAndGame(respCtx.getTransaction().getMerchantId(), game.getId());
   if (comm == null || !comm.isAllowPayout()) {
     throw new SystemException(
         SystemException.CODE_OPERATOR_PAYOUT_NOPRIVILEDGE,
         "operator(id="
             + respCtx.getOperatorId()
             + ") has no priviledge to payout ticket of game '"
             + game.getId()
             + "', allocate the game to its merchant(id="
             + respCtx.getTransaction().getMerchantId()
             + ") first.");
   }
   GameType gameType = GameType.fromType(game.getType());
   // only need to check the prize group constraints of operator
   PrizeGroup prizeGroup = respCtx.getOperator().getPrizeGroup();
   if (!prizeGroup.isPayoutAllowed()) {
     throw new ApplicationException(
         SystemException.CODE_MERCHANT_UNALLOWED_PAY,
         "Operator(" + respCtx.getOperator() + ") doesn't allow payout.");
   }
   // ** both conditions must be satisfied
   // by payout limit
   if (new BigDecimal("0").compareTo(actualPayout) != 0) {
     this.verifyPayoutByLimit(respCtx, actualPayout, respCtx.getOperator());
   }
   // for odds and fix-prize game, no need to check prize level.
   if (!gameType.isFixedPrize()) {
     // by prize level
     if (levelAllowRequests != null) {
       for (PayoutLevelAllowRequest levelAllowRequest : levelAllowRequests) {
         this.verifyPayoutByLevel(
             respCtx,
             respCtx.getOperator(),
             levelAllowRequest.getRequestedPrizeLevels(),
             levelAllowRequest.getGameType(),
             levelAllowRequest.getPrizeGroupType());
       }
     }
   }
 }
 @Override
 public List<GameType> supportedGameType(long merchantId) throws ApplicationException {
   List<MerchantCommission> mcList = this.getMerchantCommissionDao().getByMerchant(merchantId);
   List<GameType> gameTypes = new LinkedList<GameType>();
   for (MerchantCommission mc : mcList) {
     Game game = mc.getGame();
     // remove duplicated item.
     if (game != null) {
       GameType gameType = GameType.fromType(game.getType());
       if (!gameTypes.contains(gameType)) {
         gameTypes.add(gameType);
       }
     }
   }
   return gameTypes;
 }