public void ApplyVoucher(Voucher voucher) { if (_appliedVouchers.Any(v => v.Id == voucher.Id)) { return; } if (_appliedVouchers.Any(v => v is OfferVoucher)) { return; } var result = voucher.ApplyTo(this); _appliedVouchers.Add(voucher); _voucherResults.Add(result); if (!(result is VoucherIsValidResult validDiscount)) { return; } DiscountedTotal -= validDiscount.ApplicableDiscount; if (DiscountedTotal < 0) { DiscountedTotal = 0; } }