package com.salesmanager.core.business.services.order.ordertotal;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import javax.inject.Inject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.salesmanager.core.business.services.catalog.product.ProductService;
import com.salesmanager.core.business.services.reference.language.LanguageService;
import com.salesmanager.core.model.catalog.product.Product;
import com.salesmanager.core.model.customer.Customer;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.order.OrderSummary;
import com.salesmanager.core.model.order.OrderTotal;
import com.salesmanager.core.model.order.OrderTotalVariation;
import com.salesmanager.core.model.order.RebatesOrderTotalVariation;
import com.salesmanager.core.model.reference.language.Language;
import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
import com.salesmanager.core.modules.order.total.OrderTotalPostProcessorModule;
@Service("OrderTotalService")
public class OrderTotalServiceImpl implements OrderTotalService {
@Autowired
@Resource(name="orderTotalsPostProcessors")
List<OrderTotalPostProcessorModule> orderTotalPostProcessors;
@Inject
private ProductService productService;
@Inject
private LanguageService languageService;
@Override
public OrderTotalVariation findOrderTotalVariation(OrderSummary summary, Customer customer, MerchantStore store, Language language)
throws Exception {
RebatesOrderTotalVariation variation = new RebatesOrderTotalVariation();
List<OrderTotal> totals = null;
if(orderTotalPostProcessors != null) {
for(OrderTotalPostProcessorModule module : orderTotalPostProcessors) {
//TODO check if the module is enabled from the Admin
List<ShoppingCartItem> items = summary.getProducts();
for(ShoppingCartItem item : items) {
Long productId = item.getProductId();
Product product = productService.getProductForLocale(productId, language, languageService.toLocale(language));
OrderTotal orderTotal = module.caculateProductPiceVariation(summary, item, product, customer, store);
if(orderTotal==null) {
continue;
}
if(totals==null) {
totals = new ArrayList<OrderTotal>();
variation.setVariations(totals);
}
//if product is null it will be catched when invoking the module
orderTotal.setText(product.getProductDescription().getName());
variation.getVariations().add(orderTotal);
}
}
}
return variation;
}
}