/* * Licensed to csti consulting * You may obtain a copy of the License at * * http://www.csticonsulting.com * Copyright (c) 2006-Aug 24, 2010 Consultation CS-TI inc. * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.salesmanager.core.service.shipping; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.StringTokenizer; import org.apache.commons.collections.BidiMap; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.salesmanager.core.constants.ShippingConstants; import com.salesmanager.core.entity.customer.Customer; import com.salesmanager.core.entity.merchant.MerchantConfiguration; import com.salesmanager.core.entity.merchant.MerchantStore; import com.salesmanager.core.entity.orders.OrderProduct; import com.salesmanager.core.entity.orders.OrderProductAttribute; import com.salesmanager.core.entity.reference.CoreModuleService; import com.salesmanager.core.entity.reference.Country; import com.salesmanager.core.entity.shipping.PackageDetail; import com.salesmanager.core.entity.shipping.ShippingInformation; import com.salesmanager.core.entity.shipping.ShippingMethod; import com.salesmanager.core.entity.shipping.ShippingOption; import com.salesmanager.core.entity.shipping.ShippingPriceRegion; import com.salesmanager.core.module.model.application.CalculatePackingModule; import com.salesmanager.core.module.model.integration.ShippingQuotesModule; import com.salesmanager.core.service.ServiceFactory; import com.salesmanager.core.service.cache.RefCache; import com.salesmanager.core.service.common.impl.ServicesUtil; import com.salesmanager.core.service.merchant.ConfigurationRequest; import com.salesmanager.core.service.merchant.ConfigurationResponse; import com.salesmanager.core.service.merchant.MerchantException; import com.salesmanager.core.service.merchant.MerchantService; import com.salesmanager.core.service.merchant.impl.dao.IMerchantConfigurationDao; import com.salesmanager.core.service.shipping.impl.AddressValidationContextVO; import com.salesmanager.core.util.CountryUtil; import com.salesmanager.core.util.CurrencyUtil; import com.salesmanager.core.util.LabelUtil; import com.salesmanager.core.util.LocaleUtil; import com.salesmanager.core.util.LogMerchantUtil; import com.salesmanager.core.util.ShippingUtil; import com.salesmanager.core.util.SpringUtil; import com.salesmanager.core.util.StringUtil; @Service public class ShippingService { private static Logger log = Logger.getLogger(ShippingService.class); @Autowired private IMerchantConfigurationDao merchantConfigurationDao; @Transactional public boolean isShippingInternational(int merchantId) throws Exception { MerchantConfiguration config = merchantConfigurationDao.findByKey( ShippingConstants.MODULE_SHIPPING_ZONES_SHIPPING, merchantId); if (config == null) { return true; } String shippingType = config.getConfigurationValue(); if (ShippingConstants.INTERNATIONAL_SHIPPING.equals(shippingType)) { return true; } else { return false; } } /** * Calculates shipping cost based on shipping modules configured Will return * ShippingOptions */ @Transactional public ShippingInformation getShippingQuote( Collection<OrderProduct> orderProducts, Customer customer, int merchantId, Locale locale, String currency) throws Exception { LabelUtil label = LabelUtil.getInstance(); label.setLocale(locale); ShippingInformation shippingInfo = new ShippingInformation(); String shippingType = ShippingConstants.DOMESTIC_SHIPPING; Collection<ShippingMethod> shippingMethods = null; double shippingWeight = 0; int quoteMethodCount = 0; MerchantService mservice = (MerchantService) ServiceFactory .getService(ServiceFactory.MerchantService); MerchantStore store = mservice.getMerchantStore(merchantId); Map allCountries = RefCache.getCountriesMap(); // origin country Country c = (Country) allCountries.get(store.getCountry()); if (c == null) { LogMerchantUtil .log( merchantId, "Cannot identify country id " + store.getCountry() + " please make sure it is configured in Store menu option."); log.error("Cannot identify origin countryId " + store.getCountry()); String message = label.getText(locale, "error.cart.origincountry"); shippingInfo.setMessage(message); return shippingInfo; } int customerCountryId = customer.getCustomerCountryId(); // destination Country customerCountry = (Country) allCountries.get(customerCountryId); if (customerCountry == null) { log.error("Cannot identify destination countryId " + customerCountryId); String message = label.getText(locale, "error.cart.destinationcountry"); shippingInfo.setMessage(message); return shippingInfo; } if (store.getCountry() != customer.getCustomerCountryId()) { shippingType = ShippingConstants.INTERNATIONAL_SHIPPING; } // get shipping informations ConfigurationRequest request = new ConfigurationRequest(merchantId, true, "SHP_"); ConfigurationResponse response = mservice.getConfiguration(request); // are there any module configured MerchantConfiguration rtconf = response .getMerchantConfiguration(ShippingConstants.MODULE_SHIPPING_RT_MODULE_INDIC_NAME); MerchantConfiguration custconf = response .getMerchantConfiguration(ShippingConstants.MODULE_SHIPPING_INDIC_COUNTRIES_COSTS); if ((rtconf == null && custconf == null) || (rtconf != null && !StringUtils.isBlank(rtconf.getConfigurationValue()) && rtconf .getConfigurationValue().equals("false")) && (custconf != null && !StringUtils.isBlank(custconf .getConfigurationValue()) && custconf != null && custconf .getConfigurationValue().equals("false"))) {// no module // configured LogMerchantUtil .log(merchantId, "No shipping module configured yet"); String message = label.getText(locale, "error.cart.noshippingconfigured"); shippingInfo.setMessage(message); return shippingInfo; } // get shipping type // national or international MerchantConfiguration shippingTypeConf = response .getMerchantConfiguration(ShippingConstants.MODULE_SHIPPING_ZONES_SHIPPING); if (shippingType != null && StringUtils .isBlank(shippingTypeConf.getConfigurationValue())) { String sType = shippingTypeConf.getConfigurationValue(); if (sType.equals(ShippingConstants.DOMESTIC_SHIPPING) && store.getCountry() != customer.getCustomerCountryId()) { // set shipping message String message = label.getText(locale, "error.cart.noshippinginternational"); shippingInfo.setMessage(message); return shippingInfo; } } // is the shipping country from the exclusion list MerchantConfiguration excluconf = response .getMerchantConfiguration(ShippingConstants.MODULE_SHIPPING_ZONES_SKIPPED); if (excluconf != null && !StringUtils.isBlank(excluconf.getConfigurationValue())) { Map excludeMap = StringUtil.parseTokenLine(excluconf .getConfigurationValue(), ";"); if (excludeMap.containsKey(customerCountry.getCountryIsoCode2())) { String message = label.getText(locale, "error.cart.noshippinginternational"); shippingInfo.setMessage(message); return shippingInfo; } } // Calculate orderTotal for items to be shipped BigDecimal orderTotal = new BigDecimal("0"); Iterator orderProductsIterator = orderProducts.iterator(); while (orderProductsIterator.hasNext()) { OrderProduct op = (OrderProduct) orderProductsIterator.next(); if (op.isShipping()) { BigDecimal finalPrice = op.getFinalPrice(); BigDecimal priceTax = op.getProductTax(); orderTotal = orderTotal.add(finalPrice).add(priceTax); } } // invoke packing module for getting details on the packages Collection<PackageDetail> packages = null; MerchantConfiguration conf = response .getMerchantConfiguration(ShippingConstants.PACKING_CONFIGURATION_KEY); if (conf != null) { String packingModule = conf.getConfigurationValue(); if (!StringUtils.isBlank(packingModule)) { CalculatePackingModule module = (CalculatePackingModule) SpringUtil .getBean(packingModule); try { packages = module.calculatePacking(orderProducts, conf, merchantId); } catch (Exception e) { // use standard packing if (!packingModule .equals(ShippingConstants.DEFAULT_PACKING_MODULE)) { module = (CalculatePackingModule) SpringUtil .getBean(ShippingConstants.DEFAULT_PACKING_MODULE); packages = module.calculatePacking(orderProducts, conf, merchantId); } } } } if (packages == null) {// calculate packages per item packages = new ArrayList(); orderProductsIterator = orderProducts.iterator(); while (orderProductsIterator.hasNext()) { OrderProduct op = (OrderProduct) orderProductsIterator.next(); if (!op.isShipping()) { continue; } BigDecimal weight = op.getProductWeight(); Set attributes = op.getOrderattributes(); if (attributes != null && attributes.size() > 0) { Iterator attributesIterator = attributes.iterator(); OrderProductAttribute opa = (OrderProductAttribute) attributesIterator .next(); weight = weight.add(opa.getProductAttributeWeight()); } if (op.getProductQuantity() == 1) { PackageDetail detail = new PackageDetail(); detail.setCurrency(currency); detail.setShippingHeight(op.getProductHeight() .doubleValue()); detail.setShippingLength(op.getProductLength() .doubleValue()); detail.setShippingWeight(weight.doubleValue()); detail.setShippingWidth(op.getProductWidth().doubleValue()); detail.setShippingQuantity(op.getProductQuantity()); detail.setProductName(op.getProductName()); packages.add(detail); } else if (op.getProductQuantity() > 1) { for (int i = 0; i < op.getProductQuantity(); i++) { PackageDetail inner = new PackageDetail(); inner.setCurrency(currency); inner.setShippingHeight(op.getProductHeight() .doubleValue()); inner.setShippingLength(op.getProductLength() .doubleValue()); inner.setShippingWeight(weight.doubleValue()); inner.setShippingWidth(op.getProductWidth() .doubleValue()); inner.setShippingQuantity(op.getProductQuantity()); inner.setProductName(op.getProductName()); packages.add(inner); } } } } if (packages != null) { Iterator packIter = packages.iterator(); while (packIter.hasNext()) { PackageDetail detail = (PackageDetail) packIter.next(); detail.setProductName("N/A"); shippingWeight = shippingWeight + detail.getShippingWeight(); } } // tax MerchantConfiguration taxconf = response .getMerchantConfiguration(ShippingConstants.MODULE_SHIPPING_TAX_CLASS); if (taxconf != null && !StringUtils.isBlank(taxconf.getConfigurationValue())) { long taxClassId = Long.parseLong(taxconf.getConfigurationValue()); shippingInfo.setTaxClass(taxClassId); } // handling fee BigDecimal handling = new BigDecimal("0"); MerchantConfiguration handlingconf = response .getMerchantConfiguration(ShippingConstants.MODULE_SHIPPING_HANDLING_FEES); if (handlingconf != null && !StringUtils.isBlank(handlingconf.getConfigurationValue())) { String shandling = handlingconf.getConfigurationValue(); try { handling = new BigDecimal(shandling); if (handling.doubleValue() > 0) { shippingInfo.setHandlingCost(handling); shippingInfo.setHandlingCostText(CurrencyUtil .displayFormatedAmountWithCurrency(handling, currency)); } } catch (Exception e) { log.error("Cannot parse handling fee to BigDecimal " + shandling); } } // invoke configured modules List configList = response.getMerchantConfigurationList(); Iterator configListIterator = configList.iterator(); while (configListIterator.hasNext()) { MerchantConfiguration gatewayconf = (MerchantConfiguration) configListIterator .next(); if (gatewayconf.getConfigurationKey().equals( ShippingConstants.MODULE_SHIPPING_RT_MODULE_INDIC_NAME)) { if (gatewayconf != null && !StringUtils.isBlank(gatewayconf .getConfigurationValue()) && gatewayconf.getConfigurationValue().equals("true")) { String module = gatewayconf.getConfigurationValue1(); if (StringUtils.isBlank(module)) { log .warn("RT Shipping module is not configured appropriatly, the column module should contain module name, see configuration id " + gatewayconf.getConfigurationId()); } else { ShippingQuotesModule shippingModule = (ShippingQuotesModule) SpringUtil .getBean(module); if (shippingModule == null) { log.error("Shipping module " + module + " is not defined in sm-modules.xml"); } else { // check if module can be applied to store CoreModuleService cms = getRealTimeQuoteShippingService( CountryUtil.getCountryIsoCodeById(store .getCountry()), module); if (cms != null) {// this shipping method cannot be // used Collection rtOptions = shippingModule .getShippingQuote(response, orderTotal, packages, customer, store, locale); if (rtOptions != null) { // check for quote comparaison MerchantConfiguration rtdetails = response .getMerchantConfiguration(ShippingConstants.MODULE_SHIPPING_DISPLAY_REALTIME_QUOTES); int quoteDisplayType = ShippingConstants.ALL_QUOTES_DISPLAYED; if (rtdetails != null) { if (!StringUtils.isBlank(rtdetails .getConfigurationValue2())) {// display // or // not // quotes try { quoteDisplayType = Integer .parseInt(rtdetails .getConfigurationValue2()); } catch (Exception e) { log .error("Display quote types is not an integer value [" + rtdetails .getConfigurationValue2() + "]"); } } } if (quoteDisplayType == ShippingConstants.LESS_EXPENSIVE_QUOTE_DISPLAYED || quoteDisplayType == ShippingConstants.MAX_EXPENSIVE_QUOTE_DISPLAYED) { Iterator rtOptionsIterator = rtOptions .iterator(); ShippingOption currentOption = null; while (rtOptionsIterator.hasNext()) { ShippingOption option = (ShippingOption) rtOptionsIterator .next(); if (currentOption == null) { currentOption = option; } if (quoteDisplayType == ShippingConstants.LESS_EXPENSIVE_QUOTE_DISPLAYED) { if (option.getOptionPrice() .longValue() < currentOption .getOptionPrice() .longValue()) { currentOption = option; } } else if (quoteDisplayType == ShippingConstants.MAX_EXPENSIVE_QUOTE_DISPLAYED) { if (option.getOptionPrice() .longValue() > currentOption .getOptionPrice() .longValue()) { currentOption = option; } } } rtOptions = new ArrayList(); rtOptions.add(currentOption); } ShippingMethod method = new ShippingMethod(); method.setShippingModule(module); method .setShippingMethodName(shippingModule .getShippingMethodDescription(locale)); quoteMethodCount++; if (shippingMethods == null) { shippingMethods = new ArrayList(); } method.setOptions(rtOptions); method.setImage(cms .getCoreModuleServiceLogoPath()); method.setPriority(0); shippingMethods.add(method); } } } } } } } // invoke custom module MerchantConfiguration customconf = response .getMerchantConfiguration(ShippingConstants.MODULE_SHIPPING_INDIC_COUNTRIES_COSTS); if (customconf != null && !StringUtils.isBlank(customconf.getConfigurationValue()) && customconf.getConfigurationValue().equals("true")) { // parse first column Map cs = StringUtil.parseTokenLine(customconf .getConfigurationValue1(), "|"); Map countries = new HashMap(); if(cs!=null && cs.size()>0) { for(Object o: cs.keySet()) { String k = (String)o; if(!k.contains(";")) { countries.put(k,(Integer)cs.get(k)); continue; } StringTokenizer st = new StringTokenizer(k,";"); while(st.hasMoreTokens()) { String t = st.nextToken(); countries.put(t, (Integer)cs.get(k)); } } } if (countries.containsKey(customerCountry.getCountryIsoCode2())) { // get estimate String shippingEstimateLine = null; String shippingCostLine = customconf.getConfigurationValue1(); MerchantConfiguration estimateCountryConf = response .getMerchantConfiguration(ShippingConstants.MODULE_SHIPPING_ESTIMATE_BYCOUNTRY); if (estimateCountryConf!=null && !StringUtils.isBlank(estimateCountryConf .getConfigurationValue1())) { shippingEstimateLine = estimateCountryConf .getConfigurationValue1(); } // contains index - ShippingPriceRegion Map priceTimeMap = ShippingUtil.buildShippingPriceRegionMap("", shippingCostLine, shippingEstimateLine); // determine index int index = -1; if (!StringUtils.isBlank(shippingCostLine)) { StringTokenizer cvtk = new StringTokenizer( shippingCostLine, "|"); int count = 1; while (cvtk.hasMoreTokens()) { if (index != -1) { break; } String countryline = cvtk.nextToken();// maxpound:price,maxpound:price...| if (!countryline.equals("*")) { StringTokenizer countrystk = new StringTokenizer( countryline, ";"); String country = null; while (countrystk.hasMoreTokens()) { country = countrystk.nextToken(); if (customerCountry.getCountryIsoCode2() != null && country.equals(customerCountry .getCountryIsoCode2())) { index = count; break; } } } count++; } } int iposition = (Integer) countries.get(customerCountry .getCountryIsoCode2());// index // need to get the prices / pounds Map data = StringUtil.parseTokenLine(customconf .getConfigurationValue2(), "|"); Map swapedData = ((BidiMap) data).inverseBidiMap(); String countryData = (String) swapedData.get(iposition); // this line is in the form [MAX_POUND:PRICE;MAX_POUND2:PRICE] // get boundaries ShippingMethod method = new ShippingMethod(); method.setShippingModule("custom"); String description = label.getText(locale, "message.cart.sellershippingcost") + " " + customerCountry.getCountryName() + " " + customer.getCustomerPostalCode(); method.setPriority(1); if (shippingMethods == null || shippingMethods.size() == 0) { method.setPriority(0); } method.setShippingMethodName(description); StringTokenizer st = new StringTokenizer(countryData, ";"); int lowBoundary = 0; while (st.hasMoreTokens()) { String token = st.nextToken();// should have MAX_POUND:PRICE try { int position = token.indexOf(":"); if (position > -1) { String spound = token.substring(0, token .indexOf(":")); if (spound != null) { int highBoundary = Integer.parseInt(spound); if (lowBoundary <= shippingWeight && highBoundary >= shippingWeight) { String sprice = token.substring( position + 1, token.length()); ShippingOption option = new ShippingOption(); option.setCurrency(store.getCurrency()); option.setOptionCode("custom"); option.setOptionId("custom-" + lowBoundary); option .setOptionPrice(new BigDecimal( sprice)); option.setDescription(description); method.addOption(option); if (shippingMethods == null) { shippingMethods = new ArrayList(); } shippingMethods.add(method); // get the estimate if (priceTimeMap != null && priceTimeMap.size() > 0) { ShippingPriceRegion spr = (ShippingPriceRegion) priceTimeMap .get(index); if (spr != null && spr.getMinDays() != -1 && spr.getMaxDays() != -1) { String returnText = ""; if (locale == null) { locale = LocaleUtil .getDefaultLocale(); } try { if (spr.getMinDays() == spr .getMaxDays()) { List parameters = new ArrayList(); parameters .add(customerCountry .getCountryIsoCode2()); parameters.add(spr .getMaxDays()); returnText = label .getText( locale, "message.delivery.estimate.precise", parameters); } else { List parameters = new ArrayList(); parameters .add(customerCountry .getCountryIsoCode2()); parameters.add(spr .getMinDays()); parameters.add(spr .getMaxDays()); returnText = label .getText( locale, "message.delivery.estimate.range", parameters); } option .setEstimatedNumberOfDays(returnText); } catch (Exception e) { log .error("Error assigning parameters for shipping"); } } } quoteMethodCount++; break; } lowBoundary = highBoundary; } } } catch (Exception e) { log.error("Price Pound parsing error " + e); } } } } if (quoteMethodCount == 0) { String message = LabelUtil.getInstance().getText(locale, "error.cart.noshippingconfigured"); shippingInfo.setMessage(message); return shippingInfo; } if (quoteMethodCount > 0) { // is it free ? MerchantConfiguration freeconf = response .getMerchantConfiguration(ShippingConstants.MODULE_SHIPPING_FREE_IND_DEST_AMNT); if (freeconf != null && !StringUtils.isBlank(freeconf.getConfigurationValue()) && freeconf.getConfigurationValue().equals("true")) { // get national or international String freeShippingType = freeconf.getConfigurationValue1(); if (!StringUtils.isBlank(freeShippingType)) { // if shipping is domestic and free ship is domestic, then // ok // if shipping is domestic and free ship is intl, then ok // if shipping is intl and free ship is intl, then ok if (shippingType .equals(ShippingConstants.DOMESTIC_SHIPPING) || freeShippingType.equals(shippingType)) { // get amount if (!StringUtils.isBlank(freeconf .getConfigurationValue2())) { BigDecimal freeAmount = new BigDecimal(freeconf .getConfigurationValue2()).setScale(2); if (orderTotal.floatValue() - freeAmount.floatValue() > 0) { // remove live quotes shippingInfo.setShippingMethods(null); String message = LabelUtil.getInstance() .getText(locale, "message.cart.freeshipping") + " " + CurrencyUtil .displayFormatedAmountWithCurrency( freeAmount, currency); shippingInfo.setMessage(message); BigDecimal freeShippingCost = new BigDecimal( "0"); List optList = new ArrayList(); ShippingMethod method = new ShippingMethod(); method.setShippingMethodName(LabelUtil .getInstance().getText(locale, "label.cart.freeshipping")); method.setShippingModule("free"); method.setPriority(0); ShippingOption option = new ShippingOption(); option.setOptionId("free"); option.setCurrency(currency); option.setOptionCode("free"); option.setModule("free"); option.setOptionPrice(new BigDecimal("0")); option.setDescription(LabelUtil.getInstance() .getText(locale, "label.cart.freeshipping") + " " + customerCountry.getCountryName() + " " + customer.getCustomerPostalCode()); optList.add(option); method.setOptions(optList); shippingMethods = new ArrayList(); shippingMethods.add(method); shippingInfo.setShippingCost(freeShippingCost); shippingInfo.setShippingCostText(CurrencyUtil .displayFormatedAmountWithCurrency( freeShippingCost, currency)); shippingInfo.setFreeShipping(true); // no handling fee shippingInfo .setHandlingCost(new BigDecimal("0")); } } } } } } if (shippingMethods != null) { shippingInfo.setShippingMethods(shippingMethods); } return shippingInfo; } @Transactional public void setShippingTaxClass(long taxClassId, int merchantId) throws Exception { ConfigurationRequest request = new ConfigurationRequest(merchantId, false, "SHP_TAX_CLASS"); MerchantService mservice = (MerchantService) ServiceFactory .getService(ServiceFactory.MerchantService); ConfigurationResponse configuration = mservice .getConfiguration(request); if (configuration != null) { MerchantConfiguration config = configuration .getMerchantConfiguration("SHP_TAX_CLASS"); if (config != null) { config.setConfigurationValue("SHP_TAX_CLASS"); merchantConfigurationDao.saveOrUpdate(config); } } } /** * Retreives a list of shipping module name configured through central admin * tool * * @param merchantId * @return * @throws Exception */ public Collection<String> getShippingModulesNamesConfigured(int merchantId) throws Exception { ConfigurationRequest request = new ConfigurationRequest(merchantId, true, "SHP_"); MerchantService mservice = (MerchantService) ServiceFactory .getService(ServiceFactory.MerchantService); ConfigurationResponse response = mservice.getConfiguration(request); List modules = new ArrayList(); if (response != null) { List config = response.getMerchantConfigurationList(); if (config != null) { // Iterator it = config.iterator(); Iterator it = config.iterator(); while (it.hasNext()) { MerchantConfiguration c = (MerchantConfiguration) it.next(); String key = c.getConfigurationKey(); // custom configured if (key .equals(ShippingConstants.MODULE_SHIPPING_INDIC_COUNTRIES_COSTS)) {// Custom // costs if (!StringUtils.isBlank(c.getConfigurationValue()) && c.getConfigurationValue().equals("true")) { modules.add("custom"); } } // real time if (key .equals(ShippingConstants.MODULE_SHIPPING_RT_MODULE_INDIC_NAME)) { if (!StringUtils.isBlank(c.getConfigurationValue()) && c.getConfigurationValue().equals("true")) { modules.add(c.getConfigurationValue1()); } } } } } return modules; } /** * Get a List of CentralIntegrationService containing RT Shipping Quote * integration systems given the country code * * @return * @throws ShippingException */ public List<CoreModuleService> getRealTimeQuoteShippingServices( String countryIsoCode) throws ShippingException { return ServicesUtil.getShippingRealTimeQuotesMethods(countryIsoCode); } /** * Get a CoreModuleService entity for a given countryCode * * @param countryIsoCode * @param moduleName * @return * @throws Exception */ public CoreModuleService getRealTimeQuoteShippingService( String countryIsoCode, String moduleName) throws Exception { return ServicesUtil.getModule(countryIsoCode, moduleName); } /** * Will update current user shipping zones and costs define in Merchant * Configuration for beinng domestic. This method will remove all configured * costs and zones that are not domestic from an existing configuration */ @Transactional public void updateShippingZonesAndCostsForDomestic(int merchantId, int countryId) throws MerchantException { // Get countries and costs MerchantConfiguration countriescosts = merchantConfigurationDao .findByKey( ShippingConstants.MODULE_SHIPPING_INDIC_COUNTRIES_COSTS, merchantId); // Get the current user country (national) Map countries = RefCache.getCountriesMap(); Country currentcountry = (Country) countries.get(countryId); java.util.Date dt = new java.util.Date(); if (countriescosts != null) {// countries and cost are defined String value1 = countriescosts.getConfigurationValue1(); String value2 = countriescosts.getConfigurationValue2(); StringTokenizer st = new StringTokenizer(value1, "|"); int pos = 0; boolean foundcountry = false; // Take care of changing the country while (st.hasMoreTokens() && !foundcountry) { String token = st.nextToken(); StringTokenizer subst = new StringTokenizer(token, ";"); if (subst.hasMoreTokens()) { while (subst.hasMoreTokens() && !foundcountry) { String subtoken = subst.nextToken(); if (subtoken .equals(currentcountry.getCountryIsoCode2())) { foundcountry = true; break; } } } else { if (subst.equals(currentcountry.getCountryIsoCode2())) { foundcountry = true; break; } } if (!foundcountry) pos++; } // Take care of changing the price if (value2 != null) { if (foundcountry) { // - overwrite domestic price in MODULE_SHIPPING_ZONES_COST int cpos = 0; StringTokenizer cvtk = new StringTokenizer(value2, "|"); String costtokenvalue = null; while (cvtk.hasMoreTokens()) { costtokenvalue = cvtk.nextToken(); if (cpos == pos) { break; } cpos++; } // overwrite everything with if (costtokenvalue != null) { countriescosts .setConfigurationValue1(new StringBuffer() .append( currentcountry .getCountryIsoCode2()) .append("|*|*|*|*").toString()); countriescosts.setConfigurationValue2(costtokenvalue); countriescosts.setLastModified(new java.util.Date( new Date().getTime())); merchantConfigurationDao.saveOrUpdate(countriescosts); } } else {// no country found countriescosts.setConfigurationValue1(new StringBuffer() .append(currentcountry.getCountryIsoCode2()) .append("|*|*|*|*").toString()); countriescosts.setLastModified(new java.util.Date( new Date().getTime())); countriescosts .setConfigurationValue2("5:0;10:0;99:0|*|*|*|*"); merchantConfigurationDao.saveOrUpdate(countriescosts); } } else {// No price yet defined countriescosts.setConfigurationValue1(new StringBuffer() .append(currentcountry.getCountryIsoCode2()).append( "|*|*|*|*").toString()); countriescosts.setConfigurationValue2("5:0;10:0;99:0|*|*|*|*"); countriescosts.setLastModified(new java.util.Date(new Date() .getTime())); countriescosts.setConfigurationModule(""); countriescosts.setMerchantId(merchantId); countriescosts .setConfigurationKey(ShippingConstants.MODULE_SHIPPING_INDIC_COUNTRIES_COSTS); merchantConfigurationDao.saveOrUpdate(countriescosts); } } else {// First time you come in merchantConfigurationDao.deleteLike("SHP_ZONES_", merchantId); MerchantConfiguration zones = new MerchantConfiguration(); zones.setConfigurationValue1(new StringBuffer().append( currentcountry.getCountryIsoCode2()).append("|*|*|*|*") .toString()); zones.setConfigurationValue2("5:0;10:0;99:0|*|*|*|*"); zones.setMerchantId(merchantId); zones .setConfigurationKey(ShippingConstants.MODULE_SHIPPING_INDIC_COUNTRIES_COSTS); zones.setConfigurationModule(""); zones.setDateAdded(new java.util.Date(dt.getTime())); zones.setLastModified(new java.util.Date(dt.getTime())); merchantConfigurationDao.persist(zones); } // Add or update MerchantConfiguration for shipping domestic MerchantConfiguration conf = merchantConfigurationDao.findByKey( ShippingConstants.MODULE_SHIPPING_ZONES_SHIPPING, merchantId); if (conf != null && !conf.getConfigurationValue().equals( ShippingConstants.DOMESTIC_SHIPPING)) {// already // configured conf.setConfigurationValue(ShippingConstants.DOMESTIC_SHIPPING); conf.setLastModified(new java.util.Date(dt.getTime())); } else { conf = new MerchantConfiguration(); conf.setConfigurationModule(""); conf .setConfigurationKey(ShippingConstants.MODULE_SHIPPING_ZONES_SHIPPING); conf.setConfigurationValue(ShippingConstants.DOMESTIC_SHIPPING); conf.setDateAdded(new java.util.Date(dt.getTime())); conf.setMerchantId(merchantId); conf.setLastModified(new java.util.Date(dt.getTime())); } merchantConfigurationDao.saveOrUpdate(conf); } }