Take the community feedback survey now.

Son Do
Dec 31, 2016
  1232
(0 votes)

EPiServer Commerce: updating currency exchange rates automatically

Simple exchange rates updater automatically.


Why we need update exchange rates automatically

Currency exchange rates are changed everyday or hourly. This is quite important, our commerce site also need to update them to correct product price, shipping cost, ... more often.

How can we do

- Currency exchange rates source: in this sample, I used source from http://fixer.io/ - it's free and simple. You can chose whatever source if you feel trust.

- We have EPiServer schedule job - this is called and run in the background at preset time intervals (for more information, you can go here). So we could write a schedule job to update our task.

Step by step

Step 1: In your project site, create a class, name it as ExchangeRatesUpdateJob.cs.

This class will inherit from ScheduleJobBase.


[ScheduledPlugIn(
    DisplayName = "Exchange Rates update job",
    Description = "This job update exchange rates.")]
public class ExchangeRatesUpdateJob : ScheduledJobBase
{
    public override string Execute()
    {
        return "Exchange Rate update Job was finished.";
    }
}

This class is same as document I mentioned above.

Step 2: using CurrencyManager to update Exchange rates.


[ScheduledPlugIn(
    DisplayName = "Exchange Rates update job",
    Description = "This job update exchange rates.")]
public class ExchangeRatesUpdateJob : ScheduledJobBase
{
    [NonSerialized]
    private static readonly ILogger _log = LogManager.GetLogger(typeof(ExchangeRatesUpdateJob));
        
    public override string Execute()
    {
        string message = string.Empty;
        int records = UpdateExchangeRate(out message);
        return $"{records.ToString()} currencies were updated. {message}. Exchange Rate update Job was finished.";
    }
        
    private static int UpdateExchangeRate(out string message)
    {
        message = string.Empty;
        _log.Information("Starting to update exchange rate job.");
        var processedCurrency = 0;
        var dto = CurrencyManager.GetCurrencyDto();
            
        var currencyCodeIdMapping = dto.Currency.ToDictionary(c => c.CurrencyCode, c => c.CurrencyId);

        try
        {
            foreach (var code in currencyCodeIdMapping.Keys)
            {
                int fromCurrencyId;
                currencyCodeIdMapping.TryGetValue(code, out fromCurrencyId);

                try
                {
                    var uri = $"http://api.fixer.io/latest?base={code}";
                    using (var client = new WebClient())
                    {
                        var json = client.DownloadString(uri);
                        dynamic d = JObject.Parse(json);

                        DateTime exchangeDate = d.date; 

                        foreach (var rate in d.rates)
                        {
                            string toCurrencyCode = rate.Name;
                            int toCurrencyId;
                            if (currencyCodeIdMapping.TryGetValue(toCurrencyCode, out toCurrencyId))
                            {

                                var currencyRate = dto.CurrencyRate.NewCurrencyRateRow();
                                currencyRate.FromCurrencyId = fromCurrencyId;
                                currencyRate.ToCurrencyId = toCurrencyId;

                                currencyRate.EndOfDayRate = currencyRate.AverageRate = rate.Value;
                                currencyRate.CurrencyRateDate = exchangeDate;
                                currencyRate.ModifiedDate = DateTime.Now;
                                dto.CurrencyRate.AddCurrencyRateRow(currencyRate);
                                currencyRate.AcceptChanges();
                            }
                        }

                        dto.CurrencyRate.AcceptChanges();
                    }
                }
                catch (Exception ex)
                {
                    message += "Cannot update currency {code}. ";
                    _log.Error("Cannot update currency {code}.", ex);
                    continue;
                }

                dto.AcceptChanges();
                processedCurrency++;
                _log.Information($"{code} rates were updated");
            }
        }
        catch (Exception ex)
        {
            _log.Error("The job could not be completed. ", ex);
        }
        return processedCurrency;
    }
}

Step 3: rebuild solution, reset your site to add our new Schedule job to system.

Navigate to CMS/Admin menu, we will see our schedule job in left panel.

Exchange rates schedule job

Click on Start Manually to get first exchange rates.

Step 4: Set Active = true, in this sample, we will set schedule run everyday in 12.00 am.

Setting Exchange rates schedule job

So our job was FINISHED and this job will update exchange rates everyday to our site :)

You could download this file from my github.

Hope this post help your works.

/Son Do

Dec 31, 2016

Comments

Please login to comment.
Latest blogs
A day in the life of an Optimizely OMVP - Opticon London 2025

This installment of a day in the life of an Optimizely OMVP gives an in-depth coverage of my trip down to London to attend Opticon London 2025 held...

Graham Carr | Oct 2, 2025

Optimizely Web Experimentation Using Real-Time Segments: A Step-by-Step Guide

  Introduction Personalization has become de facto standard for any digital channel to improve the user's engagement KPI’s.  Personalization uses...

Ratish | Oct 1, 2025 |

Trigger DXP Warmup Locally to Catch Bugs & Performance Issues Early

Here’s our documentation on warmup in DXP : 🔗 https://docs.developers.optimizely.com/digital-experience-platform/docs/warming-up-sites What I didn...

dada | Sep 29, 2025

Creating Opal Tools for Stott Robots Handler

This summer, the Netcel Development team and I took part in Optimizely’s Opal Hackathon. The challenge from Optimizely was to extend Opal’s abiliti...

Mark Stott | Sep 28, 2025

Integrating Commerce Search v3 (Vertex AI) with Optimizely Configured Commerce

Introduction This blog provides a technical guide for integrating Commerce Search v3, which leverages Google Cloud's Vertex AI Search, into an...

Vaibhav | Sep 27, 2025

A day in the life of an Optimizely MVP - Opti Graph Extensions add-on v1.0.0 released

I am pleased to announce that the official v1.0.0 of the Opti Graph Extensions add-on has now been released and is generally available. Refer to my...

Graham Carr | Sep 25, 2025