I'm trying to figure out a pattern to best accommodate this pretty ugly code:
var userDiscounts = _discountRepository.GetUserDiscountsForUsersWithDiscounts(new List<int> { buyerUserId, sellerUserId }).ToList();
// Buyer.
var buyerHasFreeCommission = false;
var buyerDiscounts = userDiscounts.Where(ud => ud.UserId == buyerUserId);
foreach(var userDiscount in buyerDiscounts)
{
switch (userDiscount.Discount.Type)
{
case DiscountTypes.SingleFreeCommisionPerUser:
buyerHasFreeCommission = true;
break;
}
}
var sellerHasFreeCommission = false;
var sellerDiscounts = userDiscounts.Where(ud => ud.UserId == sellerUserId);
foreach(var userDiscount in sellerDiscounts)
{
switch (userDiscount.Discount.Type)
{
case DiscountTypes.SingleFreeCommisionPerUser:
sellerHasFreeCommission = true;
break;
}
}
if (!sellerHasFreeCommission)
{
var sellerCommisionChargeTransaction = new Transaction
{
AccountId = sellerAccountId,
Type = TransactionTypes.Fee,
Amount = -2
};
var sellerTransferFeeTransaction = new Transaction
{
AccountId = 5020,
Type = TransactionTypes.Fee,
Amount = 2
};
_accountRepository.AddTransaction(sellerCommisionChargeTransaction);
_accountRepository.AddTransaction(sellerTransferFeeTransaction);
}
if (!buyerHasFreeCommission)
{
var buyerCommisionChargeTransaction = new Transaction
{
AccountId = buyerAccountId,
Type = TransactionTypes.Fee,
Amount = -2
};
var buyerTransferFeeTransaction = new Transaction
{
AccountId = 5020,
Type = TransactionTypes.Fee,
Amount = 2
};
_accountRepository.AddTransaction(buyerCommisionChargeTransaction);
_accountRepository.AddTransaction(buyerTransferFeeTransaction);
}
if (!buyerHasFreeCommission || !sellerHasFreeCommission)
_accountRepository.SaveChanges();
This won't be very maintainable when I need to add a new discount... I was thinking maybe somehow I could use the strategy pattern?