using System.Collections.Generic;
public class CommissionSystem
public enum CommissionType {
public decimal BaseCommissionModifier { get; set; } = 1m;
public decimal GaurunteedMinimumCommission { get; set; } = 0m;
public decimal AdditionalStaticCommission { get; set; } = 0m;
public double AdditionalStaticCommissionItemThreshold { get; set; } = 0.0;
public decimal CalculateCommission(decimal commissionableAmount, double averageItemsSold, CommissionType commissionType)
var commissionRate = commissionType switch {
CommissionType.Dynamic => averageItemsSold > 4.9
CommissionType.Static => 0.1m/3m,
var baseCommission = commissionableAmount * commissionRate;
var staticCommission = averageItemsSold >= AdditionalStaticCommissionItemThreshold
? AdditionalStaticCommission
var commission = (baseCommission * BaseCommissionModifier) + staticCommission;
return Math.Max(commission, GaurunteedMinimumCommission);
public SalesSite GetSalesSite(int siteId)
return _siteRepo[siteId];
private static Dictionary<int, SalesSite> _siteRepo = new() {
{ 3, new SalesSite { GaurunteedMinimumCommission = 200m } },
{ 4, new SalesSite { AdditionalStaticCommission = 40m } },
{ 5, new SalesSite { AdditionalStaticCommission = 40m, AdditionalStaticCommissionItemThreshold = 5} },
public static void Main()
var ammounts = new[] { 0m, 100m, 500m, 1000m, 5000m, 10000m, 100000m };
var solds = new double[] { 0, 1, 2, 3, 4, 5, 10 };
var sites = new[] { 1, 3, 4, 5 };
var types = new[] { CommissionSystem.CommissionType.Dynamic, CommissionSystem.CommissionType.Static };
var system = new CommissionSystem();
Console.WriteLine("┌──────────────┬────────┬──────┬──────┬──────┐");
Console.WriteLine("│ Result │ Amount │ Sold │ Site │ Type │");
Console.WriteLine("├──────────────┼────────┼──────┼──────┼──────┤");
foreach(var a in ammounts)
var site = system.GetSalesSite(s);
var result = site.CalculateCommission(a,u,t);
Console.WriteLine("│ $ {0,10:0.000} │ {1,6} │ {2,2} │ {3,2} │ {4,2} │", result, a, u, s, (int)t);
Console.WriteLine("└──────────────┴────────┴──────┴──────┴──────┘");