예제 #1
0
        private void CloseAuctions()
        {
            logger.InfoFormat("CloseAuctions: {0}", JsonConvert.SerializeObject(new
            {
            }));
            try
            {
                using (AuctionDB db = new AuctionDB())
                {
                    var now = DateTime.UtcNow;

                    var auctions = db.Auctions.Where(a => a.ClosingTime <= now && a.Status != AuctionStatus.COMPLETED).Include(a => a.Bids.Select(b => b.User)).ToList();
                    foreach (var auction in auctions)
                    {
                        logger.InfoFormat("CloseAuctions: Auction {0} is closed", JsonConvert.SerializeObject(new
                        {
                            auction.Id,
                            auction.Name,
                            auction.CurrentPrice,
                            auction.Currency,
                        }));

                        auction.Status          = AuctionStatus.COMPLETED;
                        db.Entry(auction).State = EntityState.Modified;

                        // za svakog korisnika vraca najveci bid
                        var results = auction.Bids.GroupBy(b => b.User).Select(g => new
                        {
                            tokens = g.Max(b => b.NumberOfTokens),
                            user   = g.Key
                        });

                        // vratiti tokene svima koji nisu pobedili
                        foreach (var result in results)
                        {
                            // nije pobednik
                            if (auction.User != result.user)
                            {
                                logger.InfoFormat("CloseAuctions: user is getting tokens back {0}", JsonConvert.SerializeObject(new
                                {
                                    result.tokens,
                                    result.user.UserName
                                }));

                                result.user.NumberOfTokens += result.tokens;
                                db.Entry(result.user).State = EntityState.Modified;
                            }
                        }
                    }
                    db.SaveChanges();
                }
            }
            catch (Exception e)
            {
                logger.Error("CloseAuctions", e);
            }
        }
예제 #2
0
        public bool OpenAuction(string id)
        {
            logger.InfoFormat("OpenAuction: {0}", JsonConvert.SerializeObject(new
            {
                id
            }));
            try
            {
                if (String.IsNullOrEmpty(id))
                {
                    logger.ErrorFormat("OpenAuction: {0} id is null", JsonConvert.SerializeObject(new
                    {
                        id
                    }));
                    return(false);
                }
                var guidId = new Guid(id);
                using (AuctionDB db = new AuctionDB())
                {
                    var auction = db.Auctions.Where(a => a.Id.Equals(guidId)).SingleOrDefault();
                    if (auction == null)
                    {
                        logger.ErrorFormat("OpenAuction: Auction {0} doesn't exist", JsonConvert.SerializeObject(new
                        {
                            auction
                        }));
                        return(false);
                    }
                    auction.OpeningTime = DateTime.UtcNow;
                    auction.ClosingTime = DateTime.UtcNow.Add(TimeSpan.FromSeconds(auction.Duration));
                    auction.Status      = AuctionStatus.OPENED;

                    db.Entry(auction).State = EntityState.Modified;
                    db.SaveChanges();

                    logger.InfoFormat("OpenAuction: Auction is {0} open", JsonConvert.SerializeObject(new
                    {
                        auction.Id,
                        auction.Name,
                        auction.OpeningTime,
                        auction.Duration,
                        auction.ClosingTime,
                        auction.CurrentPrice,
                        auction.Currency
                    }));

                    return(true);
                }
            }
            catch (Exception e)
            {
                logger.Error("OpenAuction", e);
            }
            // something went wrong
            return(false);
        }
예제 #3
0
        public bool SetDefaultValues(EditDefaultValuesViewModel model)
        {
            logger.InfoFormat("SetDefaultValues: {0}", JsonConvert.SerializeObject(new
            {
                model
            }));

            if (model == null)
            {
                logger.ErrorFormat("GetEditDefaultValues: {0} model is null", JsonConvert.SerializeObject(new
                {
                }));
                return(false);
            }
            try
            {
                using (AuctionDB db = new AuctionDB())
                {
                    DefaultValues defaultValues = db.DefaultValues.SingleOrDefault();
                    if (defaultValues == null)
                    {
                        logger.InfoFormat("SetDefaultValues: {0} defaultValues is null", JsonConvert.SerializeObject(new
                        {
                        }));
                        defaultValues = new DefaultValues();
                        db.Entry(defaultValues).State = EntityState.Added;
                    }
                    else
                    {
                        db.Entry(defaultValues).State = EntityState.Modified;
                    }
                    defaultValues.AuctionDuration         = model.AuctionDuration;
                    defaultValues.Currency                = model.Currency;
                    defaultValues.NumberOfAuctionsPerPage = model.NumberOfAuctionsPerPage;
                    defaultValues.SilverTokenNumber       = model.SilverTokenNumber;
                    defaultValues.GoldTokenNumber         = model.GoldTokenNumber;
                    defaultValues.PlatinuTokenNumber      = model.PlatinuTokenNumber;
                    defaultValues.TokenValue              = model.TokenValue;

                    db.SaveChanges();

                    logger.InfoFormat("SetDefaultValues: {0} new defaultValues", JsonConvert.SerializeObject(new
                    {
                    }));

                    return(true);
                }
            }
            catch (Exception e)
            {
                logger.Error("SetDefaultValues", e);
            }

            //something went wrong
            return(false);
        }
예제 #4
0
        public Guid?CreateOrder(OrderPackage package, string orderUserId)
        {
            logger.InfoFormat("CreateOrder: {0} ", JsonConvert.SerializeObject(new
            {
                package,
                orderUserId
            }));
            try
            {
                using (AuctionDB db = new AuctionDB())
                {
                    var defaultValues = db.DefaultValues.SingleOrDefault();
                    var orderUser     = db.Users.Where(u => u.Id.Equals(orderUserId)).SingleOrDefault();
                    if (orderUser == null || defaultValues == null)
                    {
                        logger.ErrorFormat("CreateOrder: Something is null {0} ", JsonConvert.SerializeObject(new
                        {
                            orderUser,
                            defaultValues
                        }));
                        return(null);
                    }
                    Order order = new Order
                    {
                        Currency       = defaultValues.Currency,
                        Id             = Guid.NewGuid(),
                        User           = orderUser,
                        NumberOfTokens = (package == OrderPackage.SILVER ? defaultValues.SilverTokenNumber
                            : package == OrderPackage.GOLD ? defaultValues.GoldTokenNumber
                            : defaultValues.PlatinuTokenNumber),
                        Status = OrderStatus.CANCELED
                    };
                    order.Price = order.NumberOfTokens * defaultValues.TokenValue;

                    db.Orders.Add(order);
                    db.SaveChanges();

                    logger.InfoFormat("CreateOrder: new order {0} ", JsonConvert.SerializeObject(new
                    {
                        order.Id,
                        order.Currency,
                        order.NumberOfTokens,
                        order.Status,
                        order.Price,
                    }));

                    return(order.Id);
                }
            }
            catch (Exception e)
            {
                logger.Error("CreateOrder", e);
            }
            return(null);
        }
예제 #5
0
        public bool SetOrderStatus(string orderID, OrderStatus status)
        {
            logger.InfoFormat("SetOrderStatus: {0} ", JsonConvert.SerializeObject(new
            {
                orderID,
                status
            }));

            try
            {
                using (AuctionDB db = new AuctionDB())
                {
                    var order = db.Orders.Include(a => a.User).Where(o => o.Id.ToString() == orderID).SingleOrDefault();
                    if (order == null)
                    {
                        logger.ErrorFormat("SetOrderStatus: order {0} is null ", JsonConvert.SerializeObject(new
                        {
                            order
                        }));
                        return(false);
                    }
                    order.Status = status;

                    if (status == OrderStatus.COMPLETED)
                    {
                        // add tokens to the user
                        order.User.NumberOfTokens += order.NumberOfTokens;
                        db.Entry(order.User).State = EntityState.Modified;
                    }

                    db.Entry(order).State = EntityState.Modified;

                    db.SaveChanges();

                    logger.InfoFormat("SetOrderStatus: updated order {0} ", JsonConvert.SerializeObject(new
                    {
                        order.Id,
                        order.NumberOfTokens,
                        order.Status,
                        order.User.UserName
                    }));

                    return(true);
                }
            }
            catch (Exception e)
            {
                logger.Error("SetOrderStatus", e);
            }
            return(false);
        }
예제 #6
0
        //------------------------------ EVENTHANDLERS --------------------------------------------------------

        /**
         * This method assigns the best BuyingOffer
         * of a salesSupply to a new value object,
         * overwriting the existing value.
         */
        private void CreateButton_Click(object sender, RoutedEventArgs e)
        {
            string priceStr = TxtBoxPriceOffer.Text;
            double oldOffer = _salesSupply.HighestPrice;

            if (priceStr == null || priceStr == "" || priceStr == "Angiv pris")
            {
                ErrorLabel.Content    = "Indtast venligst et beløb.";
                ErrorLabel.Visibility = Visibility.Visible;
            }
            else
            {
                try
                {
                    double price = Convert.ToDouble(priceStr);

                    if (price > oldOffer && !priceStr.Contains("-"))
                    {
                        BuyingOffer offer = new BuyingOffer(price, _salesSupply, _buyerInfo);
                        _context.AddBuyingOfferToSalesSupply(_salesSupply, offer);
                        _context.SaveChanges();

                        _main.ListBox.ItemsSource = null;
                        _main.ListBox.ItemsSource = _context.GetSalesSupplies();
                        _main.Show();
                        this.Hide();
                    }
                    else if (priceStr.Contains("-"))
                    {
                        ErrorLabel.Content    = "Indtast venligst et positivt tal.";
                        ErrorLabel.Visibility = Visibility.Visible;
                    }
                    else
                    {
                        ErrorLabel.Content    = "Indtast venligst et beløb som overgår det forrige bud.";
                        ErrorLabel.Visibility = Visibility.Visible;
                    }
                }
                catch (Exception)
                {
                    ErrorLabel.Content    = "Indtast venligst et tal.";
                    ErrorLabel.Visibility = Visibility.Visible;
                }
            }
        }
예제 #7
0
        public MainWindow(string name, string number, string email)
        {
            InitializeComponent();
            _name       = name;
            _number     = number;
            _email      = email;
            _context    = new AuctionDB();
            DataContext = _context;

            ContactInfo dbBuyerInfo = _context.GetContactInfoByStrings(_name, _number, _email);

            if (dbBuyerInfo == null)
            {
                _buyerInfo = new ContactInfo(_name, _number, _email);
                _context.ContactInfoes.Add(_buyerInfo);
                _context.SaveChanges();
            }
            else
            {
                _buyerInfo = dbBuyerInfo;
            }

            ListBox.ItemsSource = _context.GetSalesSupplies();
        }
예제 #8
0
        public bool MakeBid(string auctionId, long?offerTokens, string userId)
        {
            logger.InfoFormat("MakeBid: {0} ", JsonConvert.SerializeObject(new
            {
                auctionId,
                offerTokens,
                userId
            }));

            if (auctionId == null || offerTokens == null)
            {
                logger.ErrorFormat("MakeBid: something is null {0} ", JsonConvert.SerializeObject(new
                {
                    auctionId,
                    offerTokens,
                }));
                return(false);
            }
            try
            {
                var guidId = new Guid(auctionId);
                using (AuctionDB db = new AuctionDB())
                {
                    CloseAuctions();
                    var auction = db.Auctions.Where(a => a.Id.Equals(guidId)).Include(a => a.Bids).SingleOrDefault();
                    var user    = db.Users.Where(u => u.Id.Equals(userId)).SingleOrDefault();
                    var dv      = db.DefaultValues.SingleOrDefault();
                    if (auction == null || user == null || dv == null || auction.Status != AuctionStatus.OPENED)
                    {
                        logger.ErrorFormat("MakeBid: something is null or auction is not open {0} ", JsonConvert.SerializeObject(new
                        {
                            auction,
                            user,
                            dv
                        }));
                        return(false);
                    }
                    var maxBid = auction.Bids.Max(b => (long?)b.NumberOfTokens);
                    if (maxBid == null)
                    {
                        maxBid = (long?)(Math.Ceiling(auction.CurrentPrice / dv.TokenValue));
                    }
                    else
                    {
                        // offer should be one token more than the current max bid
                        maxBid++;
                    }

                    // offer is too low
                    if (offerTokens < maxBid)
                    {
                        return(false);
                    }

                    // max offer of this user for this auction
                    var  userMaxBid  = auction.Bids.Where(b => b.User.Id.Equals(userId)).Max(b => (long?)b.NumberOfTokens);
                    long tokensToPay = 0;
                    if (userMaxBid == null)
                    {
                        // this is users first bid
                        tokensToPay = (long)offerTokens;
                    }
                    else
                    {
                        // this is not users first bid, should pay only the diffeerence
                        tokensToPay = (long)offerTokens - (long)userMaxBid;
                    }

                    if (user.NumberOfTokens < tokensToPay)
                    {
                        logger.ErrorFormat("MakeBid: user doesn't have enough tokens {0} ", JsonConvert.SerializeObject(new
                        {
                            tokensToPay,
                            user.UserName,
                        }));
                        // there is not enough tokens
                        return(false);
                    }

                    // update auction last bidder
                    auction.User         = user;
                    auction.CurrentPrice = (long)offerTokens * dv.TokenValue;
                    //db.Entry(auction).State = EntityState.Modified;

                    try
                    {
                        db.SaveChanges();
                    }
                    catch (System.Data.Entity.Infrastructure.DbUpdateException e)
                    {
                        // catch possible concurrency exception
                        logger.Error("Make Bid", e);
                        return(false);
                    }

                    // update user token
                    user.NumberOfTokens -= tokensToPay;
                    db.Entry(user).State = EntityState.Modified;

                    // create and add new bid
                    Bid bid = new Bid
                    {
                        Id             = Guid.NewGuid(),
                        Auction        = auction,
                        NumberOfTokens = (long)offerTokens,
                        PlacingTime    = DateTime.UtcNow,
                        User           = user
                    };
                    db.Bids.Add(bid);

                    db.SaveChanges();

                    logger.InfoFormat("MakeBid: new bid and updated auction {0} ", JsonConvert.SerializeObject(new
                    {
                        bid.Auction.Name,
                        bid.PlacingTime,
                        bid.NumberOfTokens,
                        bid.User.UserName,
                        auctionUser = auction.User.UserName,
                        auction.CurrentPrice
                    }));

                    return(true);
                }
            }
            catch (Exception e)
            {
                logger.Error("MakeBid", e);
            }
            return(false);
        }
예제 #9
0
        public bool CreateAuction(CreateAuctionViewModel model)
        {
            logger.InfoFormat("CreateAuction: {0}", JsonConvert.SerializeObject(new
            {
                model.Currency,
                model.Duration,
                model.Name,
                model.StartPrice
            }));

            try
            {
                // make image
                var image      = model.Image;
                var imageBytes = new byte[image.ContentLength];
                image.InputStream.Read(imageBytes, 0, imageBytes.Length);
                // check if file is an image
                Image.FromStream(new MemoryStream(imageBytes)).Dispose();


                using (AuctionDB db = new AuctionDB())
                {
                    //DefaultValues defaultValues = db.DefaultValues.SingleOrDefault();
                    //if (defaultValues == null)
                    //{
                    //    logger.ErrorFormat("GetAuctionById: Default valuse {0} is null", JsonConvert.SerializeObject(new
                    //    {
                    //        defaultValues
                    //    }));
                    //    return false;
                    //}

                    Auction auction = new Auction
                    {
                        Id           = Guid.NewGuid(),
                        Name         = model.Name,
                        Image        = imageBytes,
                        Duration     = model.Duration,
                        StartPrice   = model.StartPrice,
                        CurrentPrice = model.StartPrice,
                        CreatingTime = DateTime.UtcNow,
                        Status       = AuctionStatus.READY,
                        Currency     = model.Currency,
                    };
                    db.Auctions.Add(auction);
                    db.SaveChanges();

                    logger.InfoFormat("CreateAuction: new Auction {0}", JsonConvert.SerializeObject(new
                    {
                        auction.Id,
                        auction.Name,
                        auction.Duration,
                        auction.StartPrice,
                        auction.CreatingTime,
                        auction.Status,
                    }));

                    return(true);
                }
            }
            catch (Exception e)
            {
                logger.Error("CreateAuction", e);
            }
            // something went wrong
            return(false);
        }