/* * 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.util; import java.math.BigDecimal; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.apache.commons.configuration.Configuration; import org.apache.log4j.Logger; import com.opensymphony.xwork2.validator.ValidationException; import com.salesmanager.core.constants.Constants; import com.salesmanager.core.entity.merchant.MerchantStore; import com.salesmanager.core.entity.reference.Currency; import com.salesmanager.core.module.impl.application.currencies.GenericCurrencyModule; import com.salesmanager.core.module.model.application.CurrencyModule; import com.salesmanager.core.service.cache.RefCache; public class CurrencyUtil { private final static char EURO = '\u20AC'; private final static char POUND = '\u00A3'; private final static char DOLLAR = '\u0024'; private static Logger log = Logger.getLogger(CurrencyUtil.class); private static Map currencyMap = new HashMap(); static { try { Map currencies = RefCache.getCurrenciesListWithCodes(); if (currencies != null) { Iterator i = currencies.keySet().iterator(); while (i.hasNext()) { String code = (String) i.next(); try { CurrencyModule module = (CurrencyModule) SpringUtil .getBean(code); Currency cur = (Currency) currencies.get(code); if (module != null) { module.setCurrency(cur); currencyMap.put(code, module); } else { log .warn("Currency " + code + " is not supported by a Spring module, using GenericCurrency"); GenericCurrencyModule currency = new GenericCurrencyModule(); currency.setCurrency(cur); currencyMap.put(code, currency); } } catch (Exception e) { log .warn("Currency " + code + " is not supported by a Spring module, using GenericCurrency"); Currency cur = (Currency) currencies.get(code); GenericCurrencyModule currency = new GenericCurrencyModule(); currency.setCurrency(cur); currencyMap.put(code, currency); } } } } catch (Exception e) { log.error(e); } } public static BigDecimal validateMeasure(String measure, String currencycode) throws ValidationException { try { if (currencycode == null) { currencycode = getDefaultCurrency(); } log.debug("Trying to validate " + measure + " for currency " + currencycode); CurrencyModule module = (CurrencyModule) currencyMap .get(currencycode); if (module == null) { throw new ValidationException( "There is no CurrencyModule defined for currency " + currencycode + " in module/impl/application/currencies"); } BigDecimal returnMeasure = module.getAmount(measure); returnMeasure.setScale(1, BigDecimal.ROUND_HALF_UP); return returnMeasure; } catch (Exception e) { if (e instanceof ValidationException) throw (ValidationException) e; throw new ValidationException(e.getMessage()); } } public static BigDecimal validateCurrency(String amount, String currencycode) throws ValidationException { try { if (currencycode == null) { currencycode = getDefaultCurrency(); } log.debug("Trying to validate " + amount + " for currency " + currencycode); CurrencyModule module = (CurrencyModule) currencyMap .get(currencycode); if (module == null) { throw new ValidationException( "There is no CurrencyModule defined for currency " + currencycode + " in module/impl/application/currencies"); } return module.getAmount(amount); } catch (Exception e) { if (e instanceof ValidationException) throw (ValidationException) e; throw new ValidationException(e.getMessage()); } } /** * Get the measure according to the appropriate measure base. If the measure * configured in store is LB and it needs KG then the appropriate * calculation is done * * @param weight * @param store * @param base * @return */ public static double getWeight(double weight, MerchantStore store, String base) { double weightConstant = 2.2; if (base.equals(Constants.LB_WEIGHT_UNIT)) { if (store.getWeightunitcode().equals(Constants.LB_WEIGHT_UNIT)) { return new BigDecimal(String.valueOf(weight)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); } else {// pound = kilogram double answer = weight * weightConstant; BigDecimal w = new BigDecimal(answer); return w.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); } } else {// need KG if (store.getWeightunitcode().equals(Constants.KG_WEIGHT_UNIT)) { return new BigDecimal(String.valueOf(weight)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); } else { double answer = weight / weightConstant; BigDecimal w = new BigDecimal(answer); return w.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); } } } /** * Converts a BigDecimal amount from a given currency to another currency * * @param amount * @param originCurrency * @param toCurrency * @return */ public static BigDecimal convertToCurrency(BigDecimal amount, String originCurrency, String toCurrency) { try { // get originCurrency Map currencies = RefCache.getCurrenciesListWithCodes(); double returnAmount = amount.doubleValue(); com.salesmanager.core.entity.reference.Currency origin = (com.salesmanager.core.entity.reference.Currency) currencies .get(originCurrency); com.salesmanager.core.entity.reference.Currency convert = (com.salesmanager.core.entity.reference.Currency) currencies .get(toCurrency); if (origin == null) { log.error("Origin currency " + originCurrency + " not found"); return amount; } if (convert == null) { log.error("Convert currency " + toCurrency + " not found"); return amount; } returnAmount = returnAmount / origin.getValue().doubleValue(); returnAmount = returnAmount * convert.getValue().doubleValue(); return new BigDecimal(returnAmount) .setScale(2, BigDecimal.ROUND_UP); } catch (Exception e) { log.equals(e); return amount; } } /** * Get the measure according to the appropriate measure base. If the measure * configured in store is IN and it needs CM or vise versa then the * appropriate calculation is done * * @param weight * @param store * @param base * @return */ public static double getMeasure(double measure, MerchantStore store, String base) { if (base.equals(Constants.INCH_SIZE_UNIT)) { if (store.getSeizeunitcode().equals(Constants.INCH_SIZE_UNIT)) { return new BigDecimal(String.valueOf(measure)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); } else {// centimeter (inch to centimeter) double measureConstant = 2.54; double answer = measure * measureConstant; BigDecimal w = new BigDecimal(answer); return w.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); } } else {// need CM if (store.getSeizeunitcode().equals(Constants.CM_SIZE_UNIT)) { return new BigDecimal(String.valueOf(measure)).setScale(2) .doubleValue(); } else {// in (centimeter to inch) double measureConstant = 0.39; double answer = measure * measureConstant; BigDecimal w = new BigDecimal(answer); return w.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); } } } /** * For displaying weight, length, height and width * * @param measure * @param currncycode * @return */ public static String displayMeasure(BigDecimal measure, String currencycode) { try { if (measure == null) { return ""; } if (currencycode == null) { currencycode = getDefaultCurrency(); } CurrencyModule module = (CurrencyModule) currencyMap .get(currencycode); if (module == null) { log.error("There is no CurrencyModule defined for currency " + currencycode + " in module/impl/application/currencies"); return measure.toString(); } return module.getMeasure(measure, currencycode); } catch (Exception e) { log.error("Cannot format measure " + measure.toString() + " for currency " + currencycode); return measure.toString(); } } private static String displayFormatedAmount(BigDecimal amount, String currencycode) { try { if (amount == null) { return ""; } if (currencycode == null) { currencycode = getDefaultCurrency(); } CurrencyModule module = (CurrencyModule) currencyMap .get(currencycode); if (module == null) { log.error("There is no CurrencyModule defined for currency " + currencycode + " in module/impl/application/currencies"); return amount.toString(); } return module.getFormatedAmount(amount); } catch (Exception e) { log.error("Cannot format amount " + amount.toString() + " for currency " + currencycode); return amount.toString(); } } public static String displayFormatedAmountWithCurrency(BigDecimal amount, String currencycode) { try { if (currencycode == null) { currencycode = getDefaultCurrency(); } CurrencyModule module = (CurrencyModule) currencyMap .get(currencycode); if (module == null) { log.error("There is no CurrencyModule defined for currency " + currencycode + " in module/impl/application/currencies"); return amount.toString(); } return module.getFormatedAmountWithCurrency(amount); } catch (Exception e) { log.error("Cannot format amount " + amount.toString() + " for currency " + currencycode); return amount.toString(); } } public static String displayFormatedCssAmountWithCurrency( BigDecimal amount, String currencycode) { try { if (currencycode == null) { currencycode = getDefaultCurrency(); } CurrencyModule module = (CurrencyModule) currencyMap .get(currencycode); if (module == null) { log.error("There is no CurrencyModule defined for currency " + currencycode + " in module/impl/application/currencies"); return amount.toString(); } return module .getFormatedAmountWithCurrency(amount, "product-value"); } catch (Exception e) { log.error("Cannot format amount " + amount.toString() + " for currency " + currencycode); return amount.toString(); } } public static String displayFormatedAmountNoCurrency(BigDecimal amount, String currencycode) { if (currencycode == null) { currencycode = getDefaultCurrency(); } return displayFormatedAmount(amount, currencycode); } public static String getAmount(BigDecimal amount, String currencycode) { if (currencycode == null) { currencycode = getDefaultCurrency(); } return displayFormatedAmount(amount, currencycode); } public static BigDecimal getAmount(String amount, String currencyCode) throws ValidationException { CurrencyModule module = (CurrencyModule) currencyMap.get(currencyCode); if (module == null) { throw new ValidationException( "There is no CurrencyModule defined for currency " + currencyCode + " in module/impl/application/currencies"); } try { return module.getAmount(amount); } catch (Exception e) { log.error("Cannot format amount " + amount + " for currency " + currencyCode); return null; } } public static String displayEditablePriceWithCurrency(String textname, int textsize, boolean displaycurrency, BigDecimal amount, String currencycode, String appender) { if (currencycode == null) { currencycode = getDefaultCurrency(); } StringBuffer formatedfieldbuffer = new StringBuffer(); CurrencyModule module = (CurrencyModule) currencyMap.get(currencycode); if (module == null) { log.error("There is no CurrencyModule defined for currency " + currencycode + " in module/impl/application/currencies"); return amount.toString(); } String returnamount = ""; try { returnamount = module.getFormatedAmount(amount); } catch (Exception e) { log.error("Cannot format amount " + amount.toString() + " for currency " + currencycode); returnamount = amount.toString(); } String display = module.getCurrencySymbol(); return new StringBuffer().append(display).append(" ").append( "<input type=\"text\" name=\"").append(textname).append("\"") .append(" id=\"").append(textname).append("\"").append( " value=\"").append(returnamount).append("\"").append( " size=\"").append(textsize).append("\"").append( appender != null ? " " + appender : "").append(">") .toString(); } public static String getDefaultCurrency() { Configuration conf = PropertiesUtil.getConfiguration(); String def = conf.getString("core.system.defaultcurrency"); if (def == null) { def = Constants.CURRENCY_CODE_USD; } return def; } }