If you have a multi-currency organization, we use the dated conversion rates in Salesforce (or the corporate rate if not found).

In a dual currency scenario (e.g. Corporate Currency: USD, Customer Currency: EUR, Expense Currency: CAD), we calculate cross rates based on the Salesforce dated conversion rates.  This method is not accurate.

If you maintain your own conversion rates, we can integrate with your environment.

Create a class called " CurrencyRate" implementing Callable with a method called " getRate":

  public class CurrencyRate implements Callable {
     * Interface implementation
     * @return rate
    public Object call(String action, Map<String, Object> args) {
      if (action == 'getRate') {
        return getRate(
      return null;
    } // call

     * Return the rate
     * @param fromIso from
     * @param toIso to
     * @param dd date
     * @return rate or null if not found
    public Decimal getRate(String fromIso, String toIso, Date dd) {
      return null; // your implementation here
  } // CurrencyConvert

We call this class before we use the dated conversion rates and use the value you returned - unless you return zero.

The class will not be called if it is the same currency (fromIso == toIso).

You can test this class by calling the methods in the utility class UtilCurrency we are using for all conversions:

global static Decimal crossConvertFrom (String fromIso, String toIso, Date dd, Decimal amt).
// e.g.
System.assertEquals(123, accorto.UtilCurrency.crossConvertFrom('EUR', 'USD', System.today(), 100));

global static Decimal getCrossRate(String fromIso, String toIso, Date dd);
// e.g.
System.assertEquals(1.23, accorto.UtilCurrency.crossConvertRate('EUR', 'USD', System.today()));

// From currency to corporate currency
global static Decimal getRate (String iso, Date dd);
global static Decimal convertFrom (String iso, Date dd, Decimal amt);