/* * Copy Right 2016 to 2017 (PradeepIT Pvt Ltd) */ package de.hybris.merchandise.core.voucher.impl; import de.hybris.merchandise.core.voucher.MerchandiseVoucherService; import de.hybris.merchandise.core.voucher.VoucherCodeResult; import de.hybris.platform.commerceservices.order.CommerceCartService; import de.hybris.platform.commerceservices.service.data.CommerceCartParameter; import de.hybris.platform.core.model.order.CartModel; import de.hybris.platform.jalo.order.price.JaloPriceFactoryException; import de.hybris.platform.order.CartService; import de.hybris.platform.order.exceptions.CalculationException; import de.hybris.platform.util.DiscountValue; import de.hybris.platform.voucher.impl.DefaultVoucherService; import de.hybris.platform.voucher.model.VoucherModel; import java.util.Collection; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; /** * The Class MerchandiseVoucherServiceImpl. * * @author pc */ public class MerchandiseVoucherServiceImpl extends DefaultVoucherService implements MerchandiseVoucherService { /** The Constant LOG. */ private final static Logger LOG = Logger.getLogger(MerchandiseVoucherServiceImpl.class.getName()); /** The voucher service. */ @Autowired public DefaultVoucherService voucherService; /** The cart service. */ @Autowired public CartService cartService; /** The commerce cart service. */ @Autowired public CommerceCartService commerceCartService; /* * (non-Javadoc) * * @see de.hybris.merchandise.core.voucher.MerchandiseVoucherService#applyVoucher(java.lang.String) */ @Override public VoucherCodeResult applyVoucher(final String voucherCode) throws CalculationException { //Voucher already used return true final VoucherCodeResult voucherCodeResult = new VoucherCodeResult(false); final CartModel cartModel = cartService.getSessionCart(); //Voucher code is already applied to cart or consumed as a Global discount final VoucherCodeResult voucherCodeAppliedResult = preValidationVoucherCode(voucherCode, voucherCodeResult, cartModel); if (voucherCodeAppliedResult.isApplied()) { return voucherCodeAppliedResult; } if (!StringUtils.isEmpty(voucherCode)) { boolean isVoucherCodeApplied = false; try { isVoucherCodeApplied = voucherService.redeemVoucher(voucherCode, cartModel); if (isVoucherCodeApplied) { //After applying Voucher , recalculate the cart to reflect the total and sub-total and discount value final CommerceCartParameter parameter = new CommerceCartParameter(); parameter.setEnableHooks(true); parameter.setCart(cartModel); commerceCartService.recalculateCart(parameter); voucherCodeResult.setApplied(true); voucherCodeResult.setRejectMessage(null); } else { voucherCodeResult.setRejectMessage("basket.vouchercode.invalid"); return voucherCodeResult; } } catch (final JaloPriceFactoryException ex) { LOG.error("error redeeming voucher --" + voucherCode, ex); return new VoucherCodeResult(false); } } return voucherCodeResult; } /** * Pre validation voucher code. * * @param voucherCode * the voucher code * @param voucherCodeResult * the voucher code result * @param cartModel * the cart model * @return the voucher code result */ private VoucherCodeResult preValidationVoucherCode(final String voucherCode, final VoucherCodeResult voucherCodeResult, final CartModel cartModel) { final Collection appliedVoucherCodes = voucherService.getAppliedVoucherCodes(cartModel); if (StringUtils.isNotBlank(voucherCode) && CollectionUtils.isNotEmpty(appliedVoucherCodes) && appliedVoucherCodes.size() == 1 && appliedVoucherCodes.iterator().next().equals(voucherCode)) { // dont need to do nothing return new VoucherCodeResult(true); } final boolean isVoucherAppliedSuccessfully = isVoucherCodeGlobalDiscountCode(voucherCode, cartModel); if (isVoucherAppliedSuccessfully) { voucherCodeResult.setApplied(true); voucherCodeResult.setRejectMessage(null); } return voucherCodeResult; } /** * Checks if is voucher code global discount code. * * @param voucherCode * the voucher code * @param cartModel * the cart model * @return true, if is voucher code global discount code */ private boolean isVoucherCodeGlobalDiscountCode(final String voucherCode, final CartModel cartModel) { // In case this voucher code is generated for globally, we need to set the result as false final Collection discountCollection = cartModel.getGlobalDiscountValues(); boolean isVoucherAppliedSuccessfully = false; final VoucherModel voucher = voucherService.getVoucher(voucherCode); if (null != voucher) { for (final DiscountValue discountValue : discountCollection) { if (discountValue.getCode().equals(voucher.getCode()) && discountValue.getAppliedValue() == 0) { isVoucherAppliedSuccessfully = true; } } } return isVoucherAppliedSuccessfully; } /* * (non-Javadoc) * * @see de.hybris.merchandise.core.voucher.MerchandiseVoucherService#releaseVoucherCode(java.lang.String) */ @Override public boolean releaseVoucherCode(final String voucherCode) { final CartModel cartModel = cartService.getSessionCart(); final Collection appliedVoucherCodes = voucherService.getAppliedVoucherCodes(cartModel); try { if (CollectionUtils.isNotEmpty(appliedVoucherCodes) && appliedVoucherCodes.contains(voucherCode)) { voucherService.releaseVoucher(voucherCode, cartModel); } } catch (final JaloPriceFactoryException ex) { LOG.error("Error releasing voucher --" + voucherCode, ex); return false; } return true; } /* * (non-Javadoc) * * @see de.hybris.merchandise.core.voucher.MerchandiseVoucherService#getAppliedVoucherCodes() */ @Override public Collection getAppliedVoucherCodes() { final CartModel cartModel = cartService.getSessionCart(); return voucherService.getAppliedVoucherCodes(cartModel); } }