Currency exchange

Currency exchange typically takes place in the context of a transaction, e.g. a Purchase or a Refund. For this there are 3 different amounts/currencies to consider:

  • transaction amount (e.g. a Purchase for 10 USD)
  • merchant amount (e.g. shop settlement currency EUR)
  • consumer amount (e.g. wallet-account-currency SEK)

The following diagram illustrates the currencies, and what money is actually transferred / exchanged if required. The transaction-amount only determines the applicable consumer-amount and merchant-amount. Only if consumer-amount and merchant-amount have different currencies, the amount must be exchanged when transferred.

Please note that

  • the current implementation assumes identical exchange-rates are used for determining consumer and merchant amounts when the currencies are equal
  • currency-exchange takes place in the subsidiary of the consumer - the merchant-subsidiary always gets the emoney in the shop-settlement-currency
  • currency-exchange is done when the emoney is transferred (e.g. when the Purchase changes status to Completed because the consumer provided sufficient usable emoney) - using the determined amounts when the purchase was Created/Confirmed. Any difference between that and the current exchange-rates is booked to system-accounts for 'currency-exchange-difference'
  • when a Purchase is cancelled, the currency-exchange is cancelled as well. Any difference between the original amounts and the current exchange-rate is booked to system-accounts for 'currency-exchange-difference'. This may be prevented by using a hedging-service that guarantees the exchange-rate upon cancellation.

A typical currency-exchange may be the following scenario:

  • Purchase of 10 USD is created / confirmed
    • MerchantAmount is determined at 8 EUR
    • ConsumerAmount is determined at 100 SEK
  • After 10 days, a payment for 100 SEK is created in the consumer-wallet (e.g. by bank-transfer), and the Purchase is set to Completed
    • The system books 100 SEK from the consumer to the currency-exchange-SEK account
    • The system sells 100 SEK to EUR
    • The exchangeService reports that 7.50 EUR was bought with 100 SEK
    • The system books the missing 0.50 EUR from the currency-exchange-difference-expense account to the currency-exchange-EUR account
    • The system books 8 EUR from the currency-exchange-EUR account to the shop

The same scenario in an inter-subsidiary purchase (where consumer and merchant belong to different subsidiaries):

When a Purchase is cancelled, the currency-exchange is cancelled as well.

  • The system cancels the transfer of 8 EUR from the currency-exchange-EUR account to the shop
  • The system buys 100 SEK for EUR (cancels the exchange)
  • The exchangeService reports that 8.50 EUR was required to buy 100 SEK
  • The system books the missing 0.50 EUR from the currency-exchange-difference-expense account to the currency-exchange-EUR account (no cancellation!)
  • The system cancels the transfer of 100 SEK from the consumer to the currency-exchange-SEK account

The same scenario in an inter-subsidiary purchase (where consumer and merchant belong to different subsidiaries):

Refunds are calculated using the currency-exchange-rate valid at the time of refund-creation, which may be different from when the purchase was created! Thus the consumer may see different results when a purchase is cancelled, or when a purchase is refunded.

Please note that once a successful refund exists for a purchase, a purchase-cancellation is mapped to a 'refund non-refunded-amount'.