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(
(String)args.get('fromIso'),
(String)args.get('toIso'),
(Date)args.get('date'));
}
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
}
} // CurrencyConvertWe 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);