protected Long createCredit(
      final Long userId, final Long offerId, final Long merchantId, final Long locationId) {
    Kikbak kikbak = roKikbakDao.findByOfferId(offerId);
    Offer offer = roOfferDao.findById(offerId);
    Credit credit = new Credit();
    credit.setBeginDate(offer.getBeginDate());
    credit.setEndDate(offer.getEndDate());
    credit.setLocationId(locationId);
    credit.setMerchantId(offer.getMerchantId());
    credit.setOfferId(offerId);
    credit.setUserId(userId);
    credit.setValue(kikbak.getValue());
    credit.setRewardType(kikbak.getRewardType());
    credit.setKikbakId(kikbak.getId());
    credit.setRedeemCount(1);
    credit.setCreatedDate(new Date());

    Transaction txn = new Transaction();
    txn.setAmount(credit.getValue());
    txn.setAuthorizationCode("created");
    txn.setLocationId(locationId);
    txn.setMerchantId(merchantId);
    txn.setOfferId(offerId);
    txn.setTransactionType((short) TransactionType.Credit.ordinal());
    txn.setVerificationCode("created");
    txn.setUserId(userId);
    txn.setDate(new Date());

    rwCreditDao.makePersistent(credit);
    rwTransactionDao.makePersistent(txn);

    return credit.getId();
  }
  protected Long updateCreditAvailable(
      Credit credit, final Long offerId, final Long merchantId, final Long locationId) {
    Offer offer = roOfferDao.findById(offerId);
    if (credit.getRedeemCount() + 1 > offer.getRedeemLimit()) {
      // exceed limit, no transaction and credit update
      return null;
    }

    Kikbak kikbak = roKikbakDao.findByOfferId(offerId);
    credit.setValue(kikbak.getValue() + credit.getValue());
    credit.setRedeemCount(credit.getRedeemCount() + 1);

    Transaction txn = new Transaction();
    txn.setAmount(kikbak.getValue());
    txn.setAuthorizationCode("newshare");
    txn.setLocationId(locationId);
    txn.setMerchantId(merchantId);
    txn.setOfferId(offerId);
    txn.setTransactionType((short) TransactionType.Credit.ordinal());
    txn.setVerificationCode("newshare");
    txn.setUserId(credit.getUserId());
    txn.setDate(new Date());

    rwCreditDao.makePersistent(credit);
    rwTransactionDao.makePersistent(txn);

    return credit.getId();
  }