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 javax.inject.Inject; import org.apache.commons.lang3.StringUtils; import com.fasterxml.jackson.databind.ObjectMapper; import com.salesmanager.core.business.exception.ServiceException; import com.salesmanager.core.business.services.system.MerchantConfigurationService; import com.salesmanager.core.business.utils.ProductPriceUtils; 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.ShippingBasisType; 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.model.system.MerchantConfiguration; import com.salesmanager.core.modules.integration.IntegrationException; import com.salesmanager.core.modules.integration.shipping.model.CustomShippingQuoteWeightItem; import com.salesmanager.core.modules.integration.shipping.model.CustomShippingQuotesConfiguration; import com.salesmanager.core.modules.integration.shipping.model.CustomShippingQuotesRegion; import com.salesmanager.core.modules.integration.shipping.model.ShippingQuoteModule; public class CustomWeightBasedShippingQuote implements ShippingQuoteModule { public final static String MODULE_CODE = "weightBased"; private final static String CUSTOM_WEIGHT = "CUSTOM_WEIGHT"; @Inject private MerchantConfigurationService merchantConfigurationService; @Inject private ProductPriceUtils productPriceUtils; @Override public void validateModuleConfiguration( IntegrationConfiguration integrationConfiguration, MerchantStore store) throws IntegrationException { //not used, it has its own controller with complex validators } @Override public CustomIntegrationConfiguration getCustomModuleConfiguration( MerchantStore store) throws IntegrationException { try { MerchantConfiguration configuration = merchantConfigurationService.getMerchantConfiguration(MODULE_CODE, store); if(configuration!=null) { String value = configuration.getValue(); ObjectMapper mapper = new ObjectMapper(); try { CustomShippingQuotesConfiguration config = mapper.readValue(value, CustomShippingQuotesConfiguration.class); return config; } catch(Exception e) { throw new ServiceException("Cannot parse json string " + value); } } else { CustomShippingQuotesConfiguration custom = new CustomShippingQuotesConfiguration(); custom.setModuleCode(MODULE_CODE); return custom; } } catch (Exception e) { throw new IntegrationException(e); } } @Override public List<ShippingOption> getShippingQuotes( ShippingQuote shippingQuote, List<PackageDetails> packages, BigDecimal orderTotal, Delivery delivery, ShippingOrigin origin, MerchantStore store, IntegrationConfiguration configuration, IntegrationModule module, ShippingConfiguration shippingConfiguration, Locale locale) throws IntegrationException { if(StringUtils.isBlank(delivery.getPostalCode())) { return null; } //get configuration CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)this.getCustomModuleConfiguration(store); List<CustomShippingQuotesRegion> regions = customConfiguration.getRegions(); ShippingBasisType shippingType = shippingConfiguration.getShippingBasisType(); ShippingOption shippingOption = null; try { for(CustomShippingQuotesRegion region : customConfiguration.getRegions()) { for(String countryCode : region.getCountries()) { if(countryCode.equals(delivery.getCountry().getIsoCode())) { //determine shipping weight double weight = 0; for(PackageDetails packageDetail : packages) { weight = weight + packageDetail.getShippingWeight(); } //see the price associated with the width List<CustomShippingQuoteWeightItem> quoteItems = region.getQuoteItems(); for(CustomShippingQuoteWeightItem quoteItem : quoteItems) { if(weight<= quoteItem.getMaximumWeight()) { shippingOption = new ShippingOption(); shippingOption.setOptionCode(new StringBuilder().append(CUSTOM_WEIGHT).toString()); shippingOption.setOptionId(new StringBuilder().append(CUSTOM_WEIGHT).append("_").append(region.getCustomRegionName()).toString()); shippingOption.setOptionPrice(quoteItem.getPrice()); shippingOption.setOptionPriceText(productPriceUtils.getStoreFormatedAmountWithCurrency(store, quoteItem.getPrice())); break; } } } } } if(shippingOption!=null) { List<ShippingOption> options = new ArrayList<ShippingOption>(); options.add(shippingOption); return options; } return null; } catch (Exception e) { throw new IntegrationException(e); } } }