Automagically.
If you hold Assets or Liabilities (and sometimes Income) in
other currencies, you might need to report (or measure) the changes in value of
these amounts of value over time, due to currency fluctuations.
Take the case of a Global Company that purchases Inventory in
two locations and uses two Companies to model this. AmCo and the EuCo both purchase the equivalent
of $USD 10,000 of Products. For EuCo
this equates to € $8,969 (with rounding of 32 euro cents).
The (partial – Equity is left out since it has no value in
this example) Balance Sheet at 1/15 now looks like this (left $USD, right €) :

Now let’s pause the operations of the Company (we don’t pay
for this Inventory, we don’t sell any) and look at the impact of unrealized
gains (losses) on the value of that Inventory.
The example will be from the perspective of the $ USD – how will
the value of the $10.000.89 worth of Inventory change over time?
By the end of January, the exchange rate changed from 1.115
to 1.1096, meaning Inventory worth $10,000.89 *could* be worth $9,951.073 if
sold at full market value. This example
of a loss (on paper) is what people mean by an unrealized currency loss.
Let’s look at the partial Balance Sheet at 1/31:

Notice that NOTHING has changed value in the real world –
just “on paper”. The $10,000 in US Inventory
held by AmCo is still “worth” $USD 10,000 (if sold there at full price) and the
€ 8,969 in European Inventory help by EuCo is still “worth”
€ 8,969 (if sold there at full price).
Odoo automagically updated the Balance Sheet based on the
currency exchange rates that were automatically updated (or manually entered).
By the middle of February, the exchange rate changed from 1.1096
to 1.0831, meaning Inventory worth $10,000.89, later *potentially* worth
$9,951.73 *could* be now worth $9,714.28 if sold at market value. This example of a loss (on paper) is what
people mean by an unrealized currency loss.
Let’s look at the partial Balance Sheet now at 2/15:

You can see that Odoo “just works” by updating the Balance
Sheet over time. There are no Journal
Entries booked.
Think of what is happening as "revaluating on the fly" without you needing to manage it.
The impact of this change in your Balance Sheet does have
the potential to affect your Profit and Loss statement - some, but not all,
companies need to account for unrealized gains (losses).
Please also see:
https://www.odoo.com/forum/help-1/question/how-does-odoo-handle-realized-currency-gains-or-losses-167047
https://www.odoo.com/documentation/user/13.0/accounting/others/multicurrencies/how_it_works.html
I would like to bump this question as i have it too.
Hello ray .. thanks for your explanation . i am working on odoo 13 enterprise and i am using multi currency but when i change the exchange rate balance sheet did not update according to the new rate ..why ???
thanks..
The example I have given is when the balance sheet is made up of two different GL's from two different companies with two different currencies. There is no revaluation of a single GL in a single company with a single base currency. We capture realized gains or losses when payments are posted against receivables and payables, since everything is recorded in the base currency with the "as of that date" equivalent in the secondary currency, allowing us to know whether the difference between that same amount of base currency "as of another date" is a loss or a gain.
@Hyperview
We have Odoo 16 currently in a multi-company environment and we are starting to realise some issues with multi currency. Have you updated your code to address changes within Odoo versions and are you willing to share this? I have an internal dev team and we would love to have a look at the changes you have mentioned to help improve the issues we are seeing with multi currency and how realised and unrealised gains/losses are shown.
@AMV1
Happy to help. The code we made was to solve issues in Odoo 15. For several reasons:
the consolidation APP is useless
the answer Ray provided we were never able to replicate or setup.
the financial reporting, and report generator used a function to translate the balance sheet and income statement based on the latest currency rate! Which Does NOT with GAAP or IFRS
Our fix handled multiple aspects:
Fixed the missing dates in the exchange tables. Most of central banks will be missing Weekend, and with UTC cutoff it becomes an issue, especially if the Corn job is scheduled in your timezone, that conflicts with the timezone of the central bank you are using to populate the tables.
We added on the account a concept of (Historical, Acquisition, closing rate).
Historical, basically translate the transaction based on the transaction date.
Acquisition: Check the Asset and deferred revenue schedule Acquisition date and use that date to translate all the booked entries. To eliminate currency fluctuation in Revenue and Fixed assets based on exchange rate. Also known as GAP. The key here is enforce the discipline the every asset and deferred revenue has corresponding schedules and entries.
We also modified the Account_asset module to populate the relevant information to provide (deferred revenue, Prepaid expense and fixed assets reporting in Odoo 15).
Closing: Use the reporting date rate (this applies to monetary assets, revaluing your bank accounts based on the currency balance if it is different than company balance i.e USD account in Canadian entity)
We modified the Account groups to be multi-company. After months trying to convince Odoo team that is requirement. This drives streamline hierarchy in the chart of accounts and automated reporting.
Lastly we modified the reports in Odoo 15 to build the hierarchy we and unrealized gain/loss from translation and use account groups from the point above.
Odoo 16 changed the reporting structure and Subscription model. Odoo broke the historical audit trail for sales orders and removed the subscription object, as such we remained on Odoo 15 and currently assessing should we develop code and modules or move back to Netsuite. If we do end up investing to support Odoo16 and 18, I will share the code with you.
As we are exhausted from releases that breaks features, from complicated bank reconciliation. We have been advocates since 2017, and unfortunately ... I will leave it at that!
Hit me up later this week on linkedin and reference this discussion. Happy to help you solve this issue.