/**
*
*/
package com.salesmanager.core.business.services.shoppingcart;
import javax.inject.Inject;
import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import com.salesmanager.core.business.exception.ServiceException;
import com.salesmanager.core.business.services.order.OrderService;
import com.salesmanager.core.business.services.order.OrderServiceImpl;
import com.salesmanager.core.model.customer.Customer;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.order.OrderTotalSummary;
import com.salesmanager.core.model.reference.language.Language;
import com.salesmanager.core.model.shoppingcart.ShoppingCart;
import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
/**
* <p>
* Implementation class responsible for calculating state of shopping cart. This
* class will take care of calculating price of each line items of shopping cart
* as well any discount including sub-total and total amount.
* </p>
*
* @author Umesh Awasthi
* @version 1.2
*/
@Service("shoppingCartCalculationService")
public class ShoppingCartCalculationServiceImpl implements ShoppingCartCalculationService {
protected final Logger LOG = LoggerFactory.getLogger(getClass());
@Inject
private ShoppingCartService shoppingCartService;
@Inject
private OrderService orderService;
/**
* <p>
* Method used to recalculate state of shopping cart every time any change
* has been made to underlying {@link ShoppingCart} object in DB.
* </p>
* Following operations will be performed by this method.
*
* <li>Calculate price for each {@link ShoppingCartItem} and update it.</li>
* <p>
* This method is backbone method for all price calculation related to
* shopping cart.
* </p>
*
* @see OrderServiceImpl
*
* @param cartModel
* @param customer
* @param store
* @param language
* @throws ServiceException
*/
@Override
public OrderTotalSummary calculate(final ShoppingCart cartModel, final Customer customer, final MerchantStore store,
final Language language) throws ServiceException {
Validate.notNull(cartModel, "cart cannot be null");
Validate.notNull(cartModel.getLineItems(), "Cart should have line items.");
Validate.notNull(store, "MerchantStore cannot be null");
Validate.notNull(customer, "Customer cannot be null");
OrderTotalSummary orderTotalSummary = orderService.calculateShoppingCartTotal(cartModel, customer, store,
language);
updateCartModel(cartModel);
return orderTotalSummary;
}
/**
* <p>
* Method used to recalculate state of shopping cart every time any change
* has been made to underlying {@link ShoppingCart} object in DB.
* </p>
* Following operations will be performed by this method.
*
* <li>Calculate price for each {@link ShoppingCartItem} and update it.</li>
* <p>
* This method is backbone method for all price calculation related to
* shopping cart.
* </p>
*
* @see OrderServiceImpl
*
* @param cartModel
* @param store
* @param language
* @throws ServiceException
*/
@Override
public OrderTotalSummary calculate(final ShoppingCart cartModel, final MerchantStore store, final Language language)
throws ServiceException {
Validate.notNull(cartModel, "cart cannot be null");
Validate.notNull(cartModel.getLineItems(), "Cart should have line items.");
Validate.notNull(store, "MerchantStore cannot be null");
OrderTotalSummary orderTotalSummary = orderService.calculateShoppingCartTotal(cartModel, store, language);
updateCartModel(cartModel);
return orderTotalSummary;
}
public ShoppingCartService getShoppingCartService() {
return shoppingCartService;
}
private void updateCartModel(final ShoppingCart cartModel) throws ServiceException {
shoppingCartService.saveOrUpdate(cartModel);
}
}