public IEnumerable <WinningBid> GenerateNextSequenceOfBidsAfter(Offer offer, WinningBid currentWinningBid) { var bids = new List <WinningBid>(); if (currentWinningBid.MaximumBid.IsGreaterThanOrEqualTo(offer.MaximumBid)) { var bidFromOffer = new WinningBid(offer.Bidder, offer.MaximumBid, offer.MaximumBid, offer.TimeOfOffer); bids.Add(bidFromOffer); bids.Add(CalculateNextBid(bidFromOffer, new Offer(currentWinningBid.Bidder, currentWinningBid.MaximumBid, currentWinningBid.TimeOfBid))); } else { if (currentWinningBid.HasNotReachedMaximumBid()) { var currentBiddersLastBid = new WinningBid(currentWinningBid.Bidder, currentWinningBid.MaximumBid, currentWinningBid.MaximumBid, currentWinningBid.TimeOfBid); bids.Add(currentBiddersLastBid); bids.Add(CalculateNextBid(currentBiddersLastBid, offer)); } else { bids.Add(new WinningBid(offer.Bidder, currentWinningBid.CurrentAuctionPrice.BidIncrement(), offer.MaximumBid, offer.TimeOfOffer)); } } return(bids); }
private void Place(WinningBid newBid) { if (!FirstOffer() && WinningBid.WasMadeBy(newBid.Bidder)) { DomainEvents.Raise(new OutBid(Id, WinningBid.Bidder)); } WinningBid = newBid; DomainEvents.Raise(new BidPlaced(Id, newBid.Bidder, newBid.CurrentAuctionPrice.Amount, newBid.TimeOfBid)); }
private WinningBid CalculateNextBid(WinningBid winningbid, Offer offer) { WinningBid bid; if (winningbid.CanBeExceededBy(offer.MaximumBid)) { bid = new WinningBid(offer.Bidder, offer.MaximumBid, winningbid.CurrentAuctionPrice.BidIncrement(), offer.TimeOfOffer); } else { bid = new WinningBid(offer.Bidder, offer.MaximumBid, offer.MaximumBid, offer.TimeOfOffer); } return(bid); }
public void PlaceBidFor(Offer offer, DateTime currentTime) { if (StillInProgress(currentTime)) { if (FirstOffer()) { PlaceABidForTheFirst(offer); } else if (BidderIsIncreasingMaximumBidToNew(offer)) { WinningBid = WinningBid.RaiseMaximumBidTo(offer.MaximumBid); } else if (WinningBid.CanBeExceededBy(offer.MaximumBid)) { var newBids = new AutomaticBidder().GenerateNextSequenceOfBidsAfter(offer, WinningBid); foreach (var bid in newBids) { Place(bid); } } } }
private bool BidderIsIncreasingMaximumBidToNew(Offer offer) { return(WinningBid.WasMadeBy(offer.Bidder) && offer.MaximumBid.IsGreaterThan(WinningBid.MaximumBid)); }