/** * */ package com.salesmanager.shop.store.controller.shoppingCart.facade; import com.salesmanager.core.business.exception.ServiceException; import com.salesmanager.core.business.services.catalog.product.PricingService; import com.salesmanager.core.business.services.catalog.product.ProductService; import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService; import com.salesmanager.core.business.services.shoppingcart.ShoppingCartCalculationService; import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService; import com.salesmanager.core.business.utils.ProductPriceUtils; import com.salesmanager.core.model.catalog.product.Product; import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute; import com.salesmanager.core.model.catalog.product.price.FinalPrice; import com.salesmanager.core.model.customer.Customer; import com.salesmanager.core.model.merchant.MerchantStore; import com.salesmanager.core.model.reference.language.Language; import com.salesmanager.core.model.shoppingcart.ShoppingCart; import com.salesmanager.shop.constants.Constants; import com.salesmanager.shop.model.order.CartModificationException; import com.salesmanager.shop.model.shoppingcart.ShoppingCartAttribute; import com.salesmanager.shop.model.shoppingcart.ShoppingCartData; import com.salesmanager.shop.model.shoppingcart.ShoppingCartItem; import com.salesmanager.shop.populator.shoppingCart.ShoppingCartDataPopulator; import com.salesmanager.shop.utils.ImageFilePath; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.inject.Inject; import javax.persistence.NoResultException; import java.util.*; /** * @author Umesh Awasthi * @version 1.2 * @since 1.2 */ @Service( value = "shoppingCartFacade" ) public class ShoppingCartFacadeImpl implements ShoppingCartFacade { private static final Logger LOG = LoggerFactory.getLogger(ShoppingCartFacadeImpl.class); @Inject private ShoppingCartService shoppingCartService; @Inject ShoppingCartCalculationService shoppingCartCalculationService; @Inject private ProductPriceUtils productPriceUtils; @Inject private ProductService productService; @Inject private PricingService pricingService; @Inject private ProductAttributeService productAttributeService; @Inject @Qualifier("img") private ImageFilePath imageUtils; public void deleteShoppingCart(final Long id, final MerchantStore store) throws Exception { ShoppingCart cart = shoppingCartService.getById(id, store); if(cart!=null) { shoppingCartService.deleteCart(cart); } } @Override public void deleteShoppingCart(final String code, final MerchantStore store) throws Exception { ShoppingCart cart = shoppingCartService.getByCode(code, store); if(cart!=null) { shoppingCartService.deleteCart(cart); } } @Override public ShoppingCartData addItemsToShoppingCart( final ShoppingCartData shoppingCartData, final ShoppingCartItem item, final MerchantStore store, final Language language,final Customer customer ) throws Exception { ShoppingCart cartModel = null; if ( !StringUtils.isBlank( item.getCode() ) ) { // get it from the db cartModel = getShoppingCartModel( item.getCode(), store ); if ( cartModel == null ) { cartModel = createCartModel( shoppingCartData.getCode(), store,customer ); } } if ( cartModel == null ) { final String shoppingCartCode = StringUtils.isNotBlank( shoppingCartData.getCode() ) ? shoppingCartData.getCode() : null; cartModel = createCartModel( shoppingCartCode, store,customer ); } com.salesmanager.core.model.shoppingcart.ShoppingCartItem shoppingCartItem = createCartItem( cartModel, item, store ); boolean duplicateFound = false; if(CollectionUtils.isEmpty(item.getShoppingCartAttributes())) {//increment quantity //get duplicate item from the cart Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> cartModelItems = cartModel.getLineItems(); for(com.salesmanager.core.model.shoppingcart.ShoppingCartItem cartItem : cartModelItems) { if(cartItem.getProduct().getId().longValue()==shoppingCartItem.getProduct().getId().longValue()) { if(CollectionUtils.isEmpty(cartItem.getAttributes())) { if(!duplicateFound) { if(!shoppingCartItem.isProductVirtual()) { cartItem.setQuantity(cartItem.getQuantity() + shoppingCartItem.getQuantity()); } duplicateFound = true; break; } } } } } if(!duplicateFound) { cartModel.getLineItems().add( shoppingCartItem ); } /** Update cart in database with line items **/ shoppingCartService.saveOrUpdate( cartModel ); //refresh cart cartModel = shoppingCartService.getById(cartModel.getId(), store); shoppingCartCalculationService.calculate( cartModel, store, language ); ShoppingCartDataPopulator shoppingCartDataPopulator = new ShoppingCartDataPopulator(); shoppingCartDataPopulator.setShoppingCartCalculationService( shoppingCartCalculationService ); shoppingCartDataPopulator.setPricingService( pricingService ); shoppingCartDataPopulator.setimageUtils(imageUtils); return shoppingCartDataPopulator.populate( cartModel, store, language ); } private com.salesmanager.core.model.shoppingcart.ShoppingCartItem createCartItem( final ShoppingCart cartModel, final ShoppingCartItem shoppingCartItem, final MerchantStore store ) throws Exception { Product product = productService.getById( shoppingCartItem.getProductId() ); if ( product == null ) { throw new Exception( "Item with id " + shoppingCartItem.getProductId() + " does not exist" ); } if ( product.getMerchantStore().getId().intValue() != store.getId().intValue() ) { throw new Exception( "Item with id " + shoppingCartItem.getProductId() + " does not belong to merchant " + store.getId() ); } com.salesmanager.core.model.shoppingcart.ShoppingCartItem item = shoppingCartService.populateShoppingCartItem( product ); item.setQuantity( shoppingCartItem.getQuantity() ); item.setShoppingCart( cartModel ); // attributes List<ShoppingCartAttribute> cartAttributes = shoppingCartItem.getShoppingCartAttributes(); if ( !CollectionUtils.isEmpty( cartAttributes ) ) { for ( ShoppingCartAttribute attribute : cartAttributes ) { ProductAttribute productAttribute = productAttributeService.getById( attribute.getAttributeId() ); if ( productAttribute != null && productAttribute.getProduct().getId().longValue() == product.getId().longValue() ) { com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem attributeItem = new com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem( item, productAttribute ); item.addAttributes( attributeItem ); } } } return item; } @Override public ShoppingCart createCartModel( final String shoppingCartCode, final MerchantStore store,final Customer customer ) throws Exception { final Long CustomerId = customer != null ? customer.getId() : null; ShoppingCart cartModel = new ShoppingCart(); if ( StringUtils.isNotBlank( shoppingCartCode ) ) { cartModel.setShoppingCartCode( shoppingCartCode ); } else { cartModel.setShoppingCartCode( UUID.randomUUID().toString().replaceAll( "-", "" ) ); } cartModel.setMerchantStore( store ); if ( CustomerId != null ) { cartModel.setCustomerId( CustomerId ); } shoppingCartService.create( cartModel ); return cartModel; } private com.salesmanager.core.model.shoppingcart.ShoppingCartItem getEntryToUpdate( final long entryId, final ShoppingCart cartModel ) { if ( CollectionUtils.isNotEmpty( cartModel.getLineItems() ) ) { for ( com.salesmanager.core.model.shoppingcart.ShoppingCartItem shoppingCartItem : cartModel.getLineItems() ) { if ( shoppingCartItem.getId().longValue() == entryId ) { LOG.info( "Found line item for given entry id: " + entryId ); return shoppingCartItem; } } } LOG.info( "Unable to find any entry for given Id: " + entryId ); return null; } private Object getKeyValue( final String key ) { ServletRequestAttributes reqAttr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); return reqAttr.getRequest().getAttribute( key ); } @Override public ShoppingCartData getShoppingCartData( final Customer customer, final MerchantStore store, final String shoppingCartId ) throws Exception { ShoppingCart cart = null; try { if ( customer != null ) { LOG.info( "Reteriving customer shopping cart..." ); cart = shoppingCartService.getShoppingCart( customer ); } else { if ( StringUtils.isNotBlank( shoppingCartId ) && cart == null ) { cart = shoppingCartService.getByCode( shoppingCartId, store ); } } } catch ( ServiceException ex ) { LOG.error( "Error while retriving cart from customer", ex ); } catch( NoResultException nre) { //nothing } if ( cart == null ) { return null; } LOG.info( "Cart model found." ); ShoppingCartDataPopulator shoppingCartDataPopulator = new ShoppingCartDataPopulator(); shoppingCartDataPopulator.setShoppingCartCalculationService( shoppingCartCalculationService ); shoppingCartDataPopulator.setPricingService( pricingService ); shoppingCartDataPopulator.setimageUtils(imageUtils); Language language = (Language) getKeyValue( Constants.LANGUAGE ); MerchantStore merchantStore = (MerchantStore) getKeyValue( Constants.MERCHANT_STORE ); ShoppingCartData shoppingCartData = shoppingCartDataPopulator.populate( cart, merchantStore, language ); /* List<ShoppingCartItem> unavailables = new ArrayList<ShoppingCartItem>(); List<ShoppingCartItem> availables = new ArrayList<ShoppingCartItem>(); //Take out items no more available List<ShoppingCartItem> items = shoppingCartData.getShoppingCartItems(); for(ShoppingCartItem item : items) { String code = item.getProductCode(); Product p =productService.getByCode(code, language); if(!p.isAvailable()) { unavailables.add(item); } else { availables.add(item); } } shoppingCartData.setShoppingCartItems(availables); shoppingCartData.setUnavailables(unavailables);*/ return shoppingCartData; } @Override public ShoppingCartData getShoppingCartData( final ShoppingCart shoppingCartModel ) throws Exception { ShoppingCartDataPopulator shoppingCartDataPopulator = new ShoppingCartDataPopulator(); shoppingCartDataPopulator.setShoppingCartCalculationService( shoppingCartCalculationService ); shoppingCartDataPopulator.setPricingService( pricingService ); shoppingCartDataPopulator.setimageUtils(imageUtils); Language language = (Language) getKeyValue( Constants.LANGUAGE ); MerchantStore merchantStore = (MerchantStore) getKeyValue( Constants.MERCHANT_STORE ); return shoppingCartDataPopulator.populate( shoppingCartModel, merchantStore, language ); } @Override public ShoppingCartData removeCartItem( final Long itemID, final String cartId ,final MerchantStore store,final Language language ) throws Exception { if ( StringUtils.isNotBlank( cartId ) ) { ShoppingCart cartModel = getCartModel( cartId,store ); if ( cartModel != null ) { if ( CollectionUtils.isNotEmpty( cartModel.getLineItems() ) ) { Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> shoppingCartItemSet = new HashSet<com.salesmanager.core.model.shoppingcart.ShoppingCartItem>(); for ( com.salesmanager.core.model.shoppingcart.ShoppingCartItem shoppingCartItem : cartModel.getLineItems() ) { //if ( shoppingCartItem.getId().longValue() != itemID.longValue() ) if ( shoppingCartItem.getId().longValue() == itemID.longValue() ) { //shoppingCartItemSet.add( shoppingCartItem ); shoppingCartService.deleteShoppingCartItem(itemID); } } //cartModel.setLineItems( shoppingCartItemSet ); //shoppingCartService.saveOrUpdate( cartModel ); cartModel = getCartModel( cartId,store ); ShoppingCartDataPopulator shoppingCartDataPopulator = new ShoppingCartDataPopulator(); shoppingCartDataPopulator.setShoppingCartCalculationService( shoppingCartCalculationService ); shoppingCartDataPopulator.setPricingService( pricingService ); shoppingCartDataPopulator.setimageUtils(imageUtils); return shoppingCartDataPopulator.populate( cartModel, store, language ); } } } return null; } @Override public ShoppingCartData updateCartItem( final Long itemID, final String cartId, final long newQuantity,final MerchantStore store, final Language language ) throws Exception { if ( newQuantity < 1 ) { throw new CartModificationException( "Quantity must not be less than one" ); } if ( StringUtils.isNotBlank( cartId ) ) { ShoppingCart cartModel = getCartModel( cartId,store ); if ( cartModel != null ) { com.salesmanager.core.model.shoppingcart.ShoppingCartItem entryToUpdate = getEntryToUpdate( itemID.longValue(), cartModel ); if ( entryToUpdate == null ) { throw new CartModificationException( "Unknown entry number." ); } entryToUpdate.getProduct(); LOG.info( "Updating cart entry quantity to" + newQuantity ); entryToUpdate.setQuantity( (int) newQuantity ); List<ProductAttribute> productAttributes = new ArrayList<ProductAttribute>(); productAttributes.addAll( entryToUpdate.getProduct().getAttributes() ); final FinalPrice finalPrice = productPriceUtils.getFinalProductPrice( entryToUpdate.getProduct(), productAttributes ); entryToUpdate.setItemPrice( finalPrice.getFinalPrice() ); shoppingCartService.saveOrUpdate( cartModel ); LOG.info( "Cart entry updated with desired quantity" ); ShoppingCartDataPopulator shoppingCartDataPopulator = new ShoppingCartDataPopulator(); shoppingCartDataPopulator.setShoppingCartCalculationService( shoppingCartCalculationService ); shoppingCartDataPopulator.setPricingService( pricingService ); shoppingCartDataPopulator.setimageUtils(imageUtils); return shoppingCartDataPopulator.populate( cartModel, store, language ); } } return null; } @Override public ShoppingCartData updateCartItems( final List<ShoppingCartItem> shoppingCartItems, final MerchantStore store, final Language language ) throws Exception { Validate.notEmpty(shoppingCartItems,"shoppingCartItems null or empty"); ShoppingCart cartModel = null; Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> cartItems = new HashSet<com.salesmanager.core.model.shoppingcart.ShoppingCartItem>(); for(ShoppingCartItem item : shoppingCartItems) { if(item.getQuantity()<1) { throw new CartModificationException( "Quantity must not be less than one" ); } if(cartModel==null) { cartModel = getCartModel( item.getCode(), store ); } com.salesmanager.core.model.shoppingcart.ShoppingCartItem entryToUpdate = getEntryToUpdate( item.getId(), cartModel ); if ( entryToUpdate == null ) { throw new CartModificationException( "Unknown entry number." ); } entryToUpdate.getProduct(); LOG.info( "Updating cart entry quantity to" + item.getQuantity() ); entryToUpdate.setQuantity( (int) item.getQuantity() ); List<ProductAttribute> productAttributes = new ArrayList<ProductAttribute>(); productAttributes.addAll( entryToUpdate.getProduct().getAttributes() ); final FinalPrice finalPrice = productPriceUtils.getFinalProductPrice( entryToUpdate.getProduct(), productAttributes ); entryToUpdate.setItemPrice( finalPrice.getFinalPrice() ); cartItems.add(entryToUpdate); } cartModel.setLineItems(cartItems); shoppingCartService.saveOrUpdate( cartModel ); LOG.info( "Cart entry updated with desired quantity" ); ShoppingCartDataPopulator shoppingCartDataPopulator = new ShoppingCartDataPopulator(); shoppingCartDataPopulator.setShoppingCartCalculationService( shoppingCartCalculationService ); shoppingCartDataPopulator.setPricingService( pricingService ); shoppingCartDataPopulator.setimageUtils(imageUtils); return shoppingCartDataPopulator.populate( cartModel, store, language ); } private ShoppingCart getCartModel( final String cartId,final MerchantStore store ) { if ( StringUtils.isNotBlank( cartId ) ) { try { return shoppingCartService.getByCode( cartId, store ); } catch ( ServiceException e ) { LOG.error( "unable to find any cart asscoiated with this Id: " + cartId ); LOG.error( "error while fetching cart model...", e ); return null; } catch( NoResultException nre) { //nothing } } return null; } @Override public ShoppingCartData getShoppingCartData(String code, MerchantStore store) { try { ShoppingCart cartModel = shoppingCartService.getByCode( code, store ); if(cartModel!=null) { ShoppingCartData cart = getShoppingCartData(cartModel); return cart; } } catch( NoResultException nre) { //nothing } catch(Exception e) { LOG.error("Cannot retrieve cart code " + code,e); } return null; } @Override public ShoppingCart getShoppingCartModel(String shoppingCartCode, MerchantStore store) throws Exception { return shoppingCartService.getByCode( shoppingCartCode, store ); } @Override public ShoppingCart getShoppingCartModel(Customer customer, MerchantStore store) throws Exception { return shoppingCartService.getByCustomer(customer); } @Override public void saveOrUpdateShoppingCart(ShoppingCart cart) throws Exception { shoppingCartService.saveOrUpdate(cart); } }