package com.salesmanager.core.business.modules.order.total;
import java.math.BigDecimal;
import org.apache.commons.lang.Validate;
import org.drools.KnowledgeBase;
import org.drools.runtime.StatelessKnowledgeSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.salesmanager.core.business.constants.Constants;
import com.salesmanager.core.business.services.catalog.product.PricingService;
import com.salesmanager.core.model.catalog.product.Product;
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.order.OrderSummary;
import com.salesmanager.core.model.order.OrderTotal;
import com.salesmanager.core.model.order.OrderTotalType;
import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
import com.salesmanager.core.modules.order.total.OrderTotalPostProcessorModule;
/**
* Add variation to the OrderTotal
* This has to be defined in shopizer-core-ordertotal-processors
* @author carlsamson
*
*/
public class ManufacturerShippingCodeOrderTotalModuleImpl implements OrderTotalPostProcessorModule {
private static final Logger LOGGER = LoggerFactory.getLogger(ManufacturerShippingCodeOrderTotalModuleImpl.class);
private String name;
private String code;
private StatelessKnowledgeSession orderTotalMethodDecision;//injected from xml file
private KnowledgeBase kbase;//injected from xml file
PricingService pricingService;
public PricingService getPricingService() {
return pricingService;
}
public void setPricingService(PricingService pricingService) {
this.pricingService = pricingService;
}
@Override
public OrderTotal caculateProductPiceVariation(final OrderSummary summary, ShoppingCartItem shoppingCartItem, Product product, Customer customer, MerchantStore store)
throws Exception {
Validate.notNull(product,"product must not be null");
Validate.notNull(product.getManufacturer(),"product manufacturer must not be null");
//requires shipping summary, otherwise return null
if(summary.getShippingSummary()==null) {
return null;
}
OrderTotalInputParameters inputParameters = new OrderTotalInputParameters();
inputParameters.setItemManufacturerCode(product.getManufacturer().getCode());
inputParameters.setShippingMethod(summary.getShippingSummary().getShippingOptionCode());
LOGGER.debug("Setting input parameters " + inputParameters.toString());
orderTotalMethodDecision.execute(inputParameters);
LOGGER.debug("Applied discount " + inputParameters.getDiscount());
OrderTotal orderTotal = null;
if(inputParameters.getDiscount() != null) {
orderTotal = new OrderTotal();
orderTotal.setOrderTotalCode(Constants.OT_DISCOUNT_TITLE);
orderTotal.setOrderTotalType(OrderTotalType.SUBTOTAL);
orderTotal.setTitle(Constants.OT_SUBTOTAL_MODULE_CODE);
//calculate discount that will be added as a negative value
FinalPrice productPrice = pricingService.calculateProductPrice(product);
Double discount = inputParameters.getDiscount();
BigDecimal reduction = productPrice.getFinalPrice().multiply(new BigDecimal(discount));
reduction = reduction.multiply(new BigDecimal(shoppingCartItem.getQuantity()));
orderTotal.setValue(reduction);
}
return orderTotal;
}
public KnowledgeBase getKbase() {
return kbase;
}
public void setKbase(KnowledgeBase kbase) {
this.kbase = kbase;
}
public StatelessKnowledgeSession getOrderTotalMethodDecision() {
return orderTotalMethodDecision;
}
public void setOrderTotalMethodDecision(StatelessKnowledgeSession orderTotalMethodDecision) {
this.orderTotalMethodDecision = orderTotalMethodDecision;
}
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public String getCode() {
return code;
}
@Override
public void setCode(String code) {
this.code = code;
}
}