// 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);
        }
Exemplo n.º 3
0
 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);
                        }
                    }
                }
            }
        }