// Add New Seller Market Entry to Auction public void AddSellerMarketEntry(MarketEntryFormViewModel viewModel, string userId) { var marketEntry = MarketEntry.CreateSellerEntry(userId, EntryType.Supply, Id, viewModel.FinalProductId, viewModel.EntryQuantity, viewModel.EntryPrice, viewModel.DeliveryDate); MarketEntries.Add(marketEntry); }
// Add New Buyer Market Entry to Auction public void AddBuyerMarketEntry(MarketEntryFormViewModel viewModel, string userId) { var marketEntry = MarketEntry.CreateBuyerEntry(userId, EntryType.Demand, Id, viewModel.ProductId, viewModel.ProductQualityId, viewModel.EntryQuantity, viewModel.EntryPrice, viewModel.DeliveryDate, viewModel.DeliveryLocation); MarketEntries.Add(marketEntry); }
public override IEnumerable <Core.IEntity> Children() { return(MarketEntries.Cast <Core.IEntity>()); }
// Algorithm matching Orders private void SetTradeMatches() { var sellerEntries = MarketEntries .Where(m => m.EntryType == EntryType.Supply) .OrderBy(e => e.EntryDate) .ThenBy(e => e.EntryPrice); var buyerEntries = MarketEntries .Where(m => m.EntryType == EntryType.Demand) .OrderBy(e => e.EntryDate) .ThenBy(e => e.EntryPrice); sellerEntries.ToList().ForEach(se => se.SetMatchQuantity(se.EntryQuantity)); buyerEntries.ToList().ForEach(be => be.SetMatchQuantity(be.EntryQuantity)); foreach (var sellerEntry in sellerEntries) { foreach (var buyerEntry in buyerEntries) { if (sellerEntry.FinalProduct.ProductId == buyerEntry.FinalProduct.ProductId && sellerEntry.FinalProduct.QualityId == buyerEntry.FinalProduct.QualityId && sellerEntry.DeliveryDate == buyerEntry.DeliveryDate && sellerEntry.EntryPrice <= buyerEntry.EntryPrice) // price logic Todo { if (sellerEntry.MatchQuantity < buyerEntry.MatchQuantity) { var tradeMatch = new TradeMatch(Id, sellerEntry.Id, buyerEntry.Id, sellerEntry.MatchQuantity, buyerEntry.EntryPrice); TradeMatches.Add(tradeMatch); //Create the notification var notification = Notification.TradeMatchCompleted(tradeMatch); sellerEntry.User.Notify(notification); buyerEntry.User.Notify(notification); buyerEntry.SetMatchQuantity(buyerEntry.MatchQuantity - tradeMatch.QuantityExecuted); sellerEntry.SetMatchQuantity(sellerEntry.MatchQuantity - tradeMatch.QuantityExecuted); } else { var tradeMatch = new TradeMatch(Id, sellerEntry.Id, buyerEntry.Id, buyerEntry.MatchQuantity, buyerEntry.EntryPrice); TradeMatches.Add(tradeMatch); //Create the notification var notification = Notification.TradeMatchCompleted(tradeMatch); sellerEntry.User.Notify(notification); buyerEntry.User.Notify(notification); buyerEntry.SetMatchQuantity(buyerEntry.MatchQuantity - tradeMatch.QuantityExecuted); sellerEntry.SetMatchQuantity(sellerEntry.MatchQuantity - tradeMatch.QuantityExecuted); } } } } }