I once wrote a utility method within a Util.cls
that would convert an amount in currency X to the org currency using the appropriate DatedCOnversionRate. This would be invoked by a trigger on the object in question containing the currency amount that needs the org currency value. The trigger would use this method and save the result in a separate custom field like Amount_USD__c
if USD was the org currency.
Adapt as needed for your use case
// Singleton, remember when first referenced, key = DatedConversionRate.id
private static Map<ID,DatedConversionRate> dcrIdToDcrMap;
// ----------------------------------------
// convertToOrgCurrency - convert value in some ISO currency to org currency as of given date
// ----------------------------------------
public static Decimal convertToOrgCurrency(String currencyIso, Decimal currencyVal, Date currencyDate) {
Decimal res;
if (currencyIso == null || currencyVal == null) {}
else {
if (dcrIdToDcrMap == null) // build the map only once for life of the transaoction
dcrIdToDcrMap = new Map<ID,DatedConversionRate> ([select id, isoCode, conversionrate, nextStartDate, startDate from DatedConversionRate]);
for (DatedConversionRate dcr: dcrIdToDcrMap.values()) {
if (dcr.isoCode != currencyIso) continue; // look for a match in table against input currency
if (currencyDate < dcr.startDate || currencyDate >= dcr.nextStartDate) continue; // not in the range of effective dates
System.debug(LoggingLevel.INFO,'Converting using dcr: ' + dcr);
res = currencyVal / dcr.conversionRate;
break;
}
}
System.debug(LoggingLevel.INFO,'convertToOrgCurrency res= ' + res);
return res;
}
// ----------------------------------------
// convertFromOrgCurrency - convert value in org currency to some iso currency as of given date
// ----------------------------------------
public static Decimal convertFromOrgCurrency(String currencyIso, Decimal currencyVal, Date currencyDate) {
Decimal res;
if (currencyIso == null || currencyVal == null) {}
else {
if (dcrIdToDcrMap == null) // build the map only once for life of the transaoction
dcrIdToDcrMap = new Map<ID,DatedConversionRate> ([select id, isoCode, conversionrate, nextStartDate, startDate from DatedConversionRate]);
for (DatedConversionRate dcr: dcrIdToDcrMap.values()) {
if (dcr.isoCode != currencyIso) continue; // look for a match in table against input currency
if (currencyDate < dcr.startDate || currencyDate >= dcr.nextStartDate) continue; // not in the range of effective dates
System.debug(LoggingLevel.INFO,'Converting using dcr: ' + dcr);
res = currencyVal * dcr.conversionRate;
break;
}
}
System.debug(LoggingLevel.INFO,'convertFromOrgCurrency res= ' + res);
return res;
}