package com.salesmanager.core.business.modules.integration.shipping.impl; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Locale; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.salesmanager.core.model.common.Delivery; import com.salesmanager.core.model.merchant.MerchantStore; import com.salesmanager.core.model.shipping.PackageDetails; import com.salesmanager.core.model.shipping.ShippingConfiguration; import com.salesmanager.core.model.shipping.ShippingOption; import com.salesmanager.core.model.shipping.ShippingOrigin; import com.salesmanager.core.model.shipping.ShippingQuote; import com.salesmanager.core.model.system.CustomIntegrationConfiguration; import com.salesmanager.core.model.system.IntegrationConfiguration; import com.salesmanager.core.model.system.IntegrationModule; import com.salesmanager.core.modules.constants.Constants; import com.salesmanager.core.modules.integration.IntegrationException; import com.salesmanager.core.modules.integration.shipping.model.ShippingQuoteModule; /** * Requires to set pre-processor distance calculator * pre-processor calculates the distance (in kilometers [can be changed to miles]) based on delivery address * when that module is invoked during process it will calculate the price * DISTANCE * PRICE/KM * @author carlsamson * */ public class PriceByDistanceShippingQuoteRules implements ShippingQuoteModule { private static final Logger LOGGER = LoggerFactory.getLogger(PriceByDistanceShippingQuoteRules.class); public final static String MODULE_CODE = "priceByDistance"; @Override public void validateModuleConfiguration( IntegrationConfiguration integrationConfiguration, MerchantStore store) throws IntegrationException { // Not used } @Override public CustomIntegrationConfiguration getCustomModuleConfiguration( MerchantStore store) throws IntegrationException { // Not used return null; } @Override public List<ShippingOption> getShippingQuotes(ShippingQuote quote, List<PackageDetails> packages, BigDecimal orderTotal, Delivery delivery, ShippingOrigin origin, MerchantStore store, IntegrationConfiguration configuration, IntegrationModule module, ShippingConfiguration shippingConfiguration, Locale locale) throws IntegrationException { Validate.notNull(delivery, "Delivery cannot be null"); Validate.notNull(delivery.getCountry(), "Delivery.country cannot be null"); Validate.notNull(packages, "packages cannot be null"); Validate.notEmpty(packages, "packages cannot be empty"); //requires the postal code if(StringUtils.isBlank(delivery.getPostalCode())) { return null; } Double distance = null; if(quote!=null) { //look if distance has been calculated if(quote.getQuoteInformations()!=null) { if(quote.getQuoteInformations().containsKey(Constants.DISTANCE_KEY)) { distance = (Double)quote.getQuoteInformations().get(Constants.DISTANCE_KEY); } } } if(distance==null) { return null; } //maximum distance TODO configure from admin if(distance > 150D) { return null; } List<ShippingOption> options = quote.getShippingOptions(); if(options == null) { options = new ArrayList<ShippingOption>(); quote.setShippingOptions(options); } BigDecimal price = null; BigDecimal total = null; if(distance<=20) { price = new BigDecimal(69);//TODO from the admin total = new BigDecimal(distance).multiply(price); } else { price = new BigDecimal(3);//TODO from the admin total = new BigDecimal(distance).multiply(price); } ShippingOption shippingOption = new ShippingOption(); shippingOption.setOptionPrice(total); shippingOption.setShippingModuleCode(MODULE_CODE); shippingOption.setOptionCode(MODULE_CODE); shippingOption.setOptionId(MODULE_CODE); options.add(shippingOption); return options; } }