public List <PriceComponent> CalculatePrice(PlaceAtMatch placeInRun)
        {
            var components = new List <PriceComponent>();

            var match   = _matchRepository.Get(placeInRun.Match.Id);
            var stadium = _stadiumRepository.Get(match.StadiumId);
            var place   =
                stadium.Sectors
                .Select(s => s.Places.SingleOrDefault(pl =>
                                                      pl.Number == placeInRun.Number &&
                                                      s.Number == placeInRun.SectorNumber))
                .SingleOrDefault(x => x != null);

            var placeComponent = new PriceComponent()
            {
                Name = "Main price"
            };

            placeComponent.Value = place.Sector.DefaultPrice * place.PriceMultiplier;
            components.Add(placeComponent);


            if (placeComponent.Value > 30)
            {
                var cashDeskComponent = new PriceComponent()
                {
                    Name  = "Cash desk service tax",
                    Value = placeComponent.Value * 0.2m
                };
                components.Add(cashDeskComponent);
            }

            return(components);
        }
Esempio n. 2
0
        public Match CreateMatch(int stadiumId, DateTime dateTime, string header)
        {
            if (GetAvailableTimesForNewMatch(stadiumId, dateTime).Count < 1)
            {
                throw new InvalidOperationException(String.Format("Train {0} is occupied at {1}. Run can not be created", stadiumId, dateTime));
            }

            var stadium = _stadiumRepo.Get(stadiumId);

            var match = new Match()
            {
                StadiumId = stadium.Id, DateTime = dateTime, Header = header, PlaceAtMatches = new List <PlaceAtMatch>()
            };


            foreach (var sector in stadium.Sectors)
            {
                foreach (var place in sector.Places)
                {
                    var newPlaceAtMatch = new PlaceAtMatch()
                    {
                        Number       = place.Number,
                        SectorNumber = sector.Number,
                        Match        = match
                    };
                    match.PlaceAtMatches.Add(newPlaceAtMatch);
                }
                ;
            }
            ;

            _matchRepo.CreateMatch(match);

            return(match);
        }
        public Reservation Reserve(PlaceAtMatch place)
        {
            if (PlaceIsOccupied(place))
            {
                throw new InvalidOperationException(String.Format("place {0} can't be reserved becouse it is currently occupied", place.Id));
            }

            var createIt = new Reservation()
            {
                Start          = DateTime.Now,
                End            = DateTime.Now.AddMinutes(20),
                PlaceAtMatchId = place.Id,
            };

            _resRepo.CreateReservation(createIt);

            return(createIt);
        }
        public bool PlaceIsOccupied(PlaceAtMatch place)
        {
            var reservationsForCurrentPlace = _resRepo.GetAllReservations().Where(r => r.PlaceAtMatchId == place.Id);

            if (reservationsForCurrentPlace == null)
            {
                return(false);
            }

            var activeReservationFound = false;

            foreach (var res in reservationsForCurrentPlace)
            {
                if (IsActive(res))
                {
                    activeReservationFound = true;
                }
            }

            return(activeReservationFound);
        }