[SalesForce] How to use Advanced Currency Management (ACM) in Custom Objects

I've been searching for the last two weeks about how to implement Multi-Currency correctly in our organization. I'm pretty sure I'm not the only one who noticed that if you want to use the Advanced Currency Management (ACM) to track the exchange rate history and display valid currencies, you have to deal with some major limitations. Here's just a quick list for anyone passing by (and also so any user can refer to them in answers):

(1) Dated exchange rates are used for opportunities, opportunity products, opportunity product schedules, campaign opportunity fields, and reports related to these objects and fields. Dated exchange rates are not used in forecasting, currency fields in other objects, or currency fields in other types of reports.

Considering this, if you plan to track Invoices or anything else containing money/currencies in Salesforce, you are out of luck. Also (from my understanding), if you want to report on multiple objects (let's say Account > OPP), I don't think it will behave correctly, they system will instead use the static rate (or partially use dated rate and static depending on if the field is located in the opportunity object or account).

(2) Organizations with advanced currency management support roll-up summary fields between two advanced currency management objects. For example, roll-up summary fields are supported from an opportunity line object to its opportunity object, because both are advanced currency management enabled. However, if you enable advanced currency management, you can’t create roll-up summary fields that calculate currency on the opportunity object rolling up to the account object, and you can’t filter on the opportunity currency field on the account object. A*ll existing currency-related roll-up summary fields on the opportunity object are disabled* and their values are no longer calculated. If your organization enables advanced currency management, you should delete any currency roll-up summary fields using opportunities and accounts or opportunities and custom objects.

If you want to make any roll-up from the Account object to see the sum of every opportunities (or from any other object/custom object), you are out of luck too. The only alternative I see is probably to use a trigger to automatically update a currency field in your Account object on save of your Opportunity (similar to this article written in 2009).

(3) Cross-object formulas always use the static conversion rate for currency conversion.

Any formula referring a field in the Opportunity will not use the historic exchange rate, but the static one. This basically mean (if I'm right) that it will display inaccurate information outside any other object than the one listed in (1).

(4) If advanced currency management is enabled, you can't bind Visualforce pages that use <apex:inputField> or <apex:outputField> components to currency fields that support advanced currency management.

If you plan to bind your currency fields in a Visualforce page from an Opportunity, Opportunity Product…, you are out of luck, it will not work anymore. You will have to find workaround to allow user input, process the value and map it to the right field.


Ideas related to this issue:


Based on my previous analysis, it is seriously difficult to support dated currency if you plan to use custom objects or add additional currency-related logic outside of the Opportunity. Unless we use the corporate one everywhere else, I don't see any other solution than to add triggers to every single objects where you plan to use multi-currency to emulate the work that ACM should do by default. Otherwise, relying on external application to support currency calculation might be the other solution, but you have to integrate with this external system.

For any user who had to deal with this, how did you approach this situation with your organization to use dated rates in other objects and reports?

Best Answer

Short answer: you can't do this without a major investment.

Longer answer: my job is developing FinancialForce's PSA application, which requires supporting dated exchange rates and other ACM features on custom objects. Salesforce has confirmed to us more than once that there is no native way to do this, so we've implemented our own currency conversion from the ground up to support our needs. We do support reading the dated exchange rates from ACM's tables, but we still have to do all our own math on the conversions in apex logic. At the very least this means that you can tap into the same currency data for your calculations, even if the implementation of the logic must be done independently.

The net effect is that if you want ACM functionality outside of the officially supported objects you're going to have to build you own currency conversion system, and your own apex-managed rollups rather than using the native functionality, for this to work. If you do go this route you'll probably want to turn off parenthesized currency conversions as they'd use the non-dated rates and effectively lie to users of your custom currency system.

This is obviously a non-trivial solution to the problem, but it's the only one that's currently possible today.

Related Topic