using System.Collections.Generic;
public static void Main()
var exchangeRates = new Dictionary<string, CurrencyConversionRate>
{"SEK", new CurrencyConversionRate {ExchangeRateToUSD= 0.105960264900662, ExchangeRateFromUSD = 9.4375}}
var result = GetTenderODCutPercentage(1.20m, "USD", 47, 10.41m, exchangeRates);
Console.WriteLine("Discount would be: " + result);
public static float GetTenderODCutPercentage(decimal GrossPrice, string CurrencyCode, float DistributorDiscount, decimal newTenderPrice, Dictionary<string, CurrencyConversionRate> currencyConversionRateList)
var originalSRP = GrossPrice;
var originalCurrency = CurrencyCode;
var originalODCutPercentage = DistributorDiscount;
var originalSRPConvertedToSEK = ConvertToSEKFromCurrency(originalSRP, originalCurrency, currencyConversionRateList);
var ODCutMultiplier = (originalODCutPercentage / 100);
var publishersCutMultiplier = 1 - ODCutMultiplier;
var moneyOwedToPublisherInSEK = originalSRPConvertedToSEK * (decimal)publishersCutMultiplier;
var owedToPubOverSwedishPrice = moneyOwedToPublisherInSEK / newTenderPrice;
var newODCutPercentage = 100 - (100 * owedToPubOverSwedishPrice);
var isCorrectNewODCutPercentage = CheckNewODCutPercentage(newODCutPercentage, newTenderPrice, moneyOwedToPublisherInSEK);
if (isCorrectNewODCutPercentage == false)
throw new Exception("The calculations for the new OD Distributor Discount for Sweden Tender Price seems incorrect, " +
"you should double check the math");
return (float)newODCutPercentage;
public static bool CheckNewODCutPercentage(decimal newODCutPercentage, decimal newTenderPrice,
decimal moneyOwedToPublisherInSEK)
var newPublisherCutMultiplier = (100 - newODCutPercentage) / 100;
var checkMoneyOwedToPublishers = newTenderPrice * newPublisherCutMultiplier;
var roundedMoneyOwedToPublisherInSEK = Math.Round(moneyOwedToPublisherInSEK, 4);
var roundedCheckMoneyOwedToPub = Math.Round(checkMoneyOwedToPublishers, 4);
LOLRound(moneyOwedToPublisherInSEK, checkMoneyOwedToPublishers);
if (roundedMoneyOwedToPublisherInSEK == roundedCheckMoneyOwedToPub)
public static decimal ConvertToSEKFromCurrency(decimal priceToConvert, string currency, Dictionary<string, CurrencyConversionRate> currencyConversionRateDictionary)
var sekCurrencyConversionEntry = currencyConversionRateDictionary["SEK"];
else if (currency == "USD")
return (decimal)sekCurrencyConversionEntry.ExchangeRateFromUSD * priceToConvert;
var currencyToUSD = currencyConversionRateDictionary[currency];
var convertCurrencytoUSD = (decimal)currencyToUSD.ExchangeRateToUSD * priceToConvert;
return convertCurrencytoUSD * (decimal)sekCurrencyConversionEntry.ExchangeRateFromUSD;
public static void LOLRound(decimal moneyOwedToPublisherInSEK, decimal checkMoneyOwedToPublishers)
foreach(var roundPercision in (IEnumerable<int>)Enumerable.Range(1, 10))
var roundedMoneyOwedToPublisherInSEK = Math.Round(moneyOwedToPublisherInSEK, roundPercision);
var roundedCheckMoneyOwedToPub = Math.Round(checkMoneyOwedToPublishers, roundPercision);
Console.WriteLine("\n\nPerNum : " + roundPercision);
Console.WriteLine("Owed : " + roundedMoneyOwedToPublisherInSEK);
Console.WriteLine("Checked: " + roundedCheckMoneyOwedToPub);
public class CurrencyConversionRate
public double? ExchangeRateToUSD;
public double? ExchangeRateFromUSD;