Пример #1
0
        public List <PriceComponent> CalculatePrice(PlaceInRun placeInRun)
        {
            var components = new List <PriceComponent>();

            var run    = _runRepository.GetRunDetails(placeInRun.RunId);
            var train  = _trainRepository.GetTrainDetails(run.TrainId);
            var agency = _agenciesRepository.GetAgencyDetails(train.AgencyId);
            var place  =
                train.Carriages
                .Select(car => car.Places.SingleOrDefault(pl =>
                                                          pl.Number == placeInRun.Number &&
                                                          car.Number == placeInRun.CarriageNumber))
                .SingleOrDefault(x => x != null);

            var placeComponent = new PriceComponent()
            {
                Name = "Main price: " + Convert.ToString(place.Carriage.DefaultPrice) + "$ AgencyTax: " + Convert.ToString(((agency.AgencyPay) - 1) * 100) + "%" + " Full Price:"
            };

            placeComponent.Value = place.Carriage.DefaultPrice * agency.AgencyPay;
            components.Add(placeComponent);
            var AgencyInfo = new PriceComponent()
            {
                Name  = "Agency Tax provided by " + agency.Name,
                Value = place.Carriage.DefaultPrice * ((agency.AgencyPay) - 1)
            };

            components.Add(AgencyInfo);

            return(components);
        }
Пример #2
0
        public Run CreateRun(int trainId, DateTime date)
        {
            if (GetAvailableDatesForNewRun(trainId, date, date.AddDays(1)).Count < 1)
            {
                throw new InvalidOperationException(String.Format("Train {0} is occupied at {1}. Run can not be created", trainId, date));
            }

            var train = _trainRepo.GetTrainDetails(trainId);

            var run = new Run()
            {
                TrainId = train.Id, Date = date, Places = new List <PlaceInRun>()
            };


            foreach (var carriage in train.Carriages)
            {
                foreach (var place in carriage.Places)
                {
                    var newPlaceInRun = new PlaceInRun()
                    {
                        Number         = place.Number,
                        CarriageNumber = carriage.Number,
                        Run            = run
                    };
                    run.Places.Add(newPlaceInRun);
                }
                ;
            }
            ;

            _runRepo.CreateRun(run);

            return(run);
        }
Пример #3
0
        public List <PriceComponent> CalculatePrice(PlaceInRun placeInRun /*,ServicesContext requestedServices*/)
        {
            var components = new List <PriceComponent>();

            //if (requestedServices.Tee)
            //{
            // тут какая то логика. много.
            // обращения к сервисам

            var beveragesPriceComponent = new PriceComponent()
            {
                Name  = "Beverages",
                Value = 3
            };

            components.Add(beveragesPriceComponent);
            //}

            var domesticsPriceComponent = new PriceComponent()
            {
                Name  = "Domestics",
                Value = 2
            };

            components.Add(domesticsPriceComponent);

            return(components);
        }
        public List <PriceComponent> CalculatePrice(PlaceInRun placeInRun)
        {
            var components = new List <PriceComponent>();
            var runDate    = placeInRun.Run.Date;

            foreach (Holiday holiday in _holidayRepository.GetHolidaysList())
            {
                if (runDate.Day == holiday.Date.Day && runDate.Month == holiday.Date.Month && runDate.Year == holiday.Date.Year)
                {
                    var HolidayComponent = new PriceComponent()
                    {
                        Name  = $"Holiday service tax for {holiday.Name}",
                        Value = 10000m
                    };
                    components.Add(HolidayComponent);
                    return(components);
                }
            }
            if (runDate.DayOfWeek == DayOfWeek.Saturday || runDate.DayOfWeek == DayOfWeek.Sunday)
            {
                var WeekendComponent = new PriceComponent()
                {
                    Name  = "Weekend service tax",
                    Value = 5000m
                };
                components.Add(WeekendComponent);
            }
            else
            {
                components = null;
            }
            return(components);
        }
        public List <PriceComponent> CalculatePrice(PlaceInRun placeInRun)
        {
            var components = new List <PriceComponent>();

            var run   = _runRepository.GetRunDetails(placeInRun.RunId);
            var train = _trainRepository.GetTrainDetails(run.TrainId);
            var place =
                train.Carriages
                .Select(car => car.Places.SingleOrDefault(pl =>
                                                          pl.Number == placeInRun.Number &&
                                                          car.Number == placeInRun.CarriageNumber))
                .SingleOrDefault(x => x != null);

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

            placeComponent.Value = place.Carriage.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);
        }
        public List <PriceComponent> CalculatePrice(PlaceInRun placeInRun)
        {
            var components = new List <PriceComponent>();

            components.AddRange(_strat1.CalculatePrice(placeInRun));
            components.AddRange(_strat2.CalculatePrice(placeInRun));

            return(components);
        }
Пример #7
0
        public List <PriceComponent> CalculatePrice(PlaceInRun placeInRun)
        {
            var components  = new List <PriceComponent>();
            var holidayList = _holidayRepository.GetAllHolidays();
            var run         = _runRepository.GetRunDetails(placeInRun.RunId);
            var train       = _trainRepository.GetTrainDetails(run.TrainId);
            var place       =
                train.Carriages
                .Select(car => car.Places.SingleOrDefault(pl =>
                                                          pl.Number == placeInRun.Number &&
                                                          car.Number == placeInRun.CarriageNumber))
                .SingleOrDefault(x => x != null);

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

            placeComponent.Value = place.Carriage.DefaultPrice * place.PriceMultiplier;
            components.Add(placeComponent);
            if (run.Date.DayOfWeek == (DayOfWeek)0 || run.Date.DayOfWeek == (DayOfWeek)6)
            {
                var cashDeskComponent = new PriceComponent()
                {
                    Name  = "Holiday tax",
                    Value = placeComponent.Value * 1.25m
                };
                components.Add(cashDeskComponent);
            }
            for (int i = 1; i < holidayList.Count; i++)
            {
                if (run.Date.Day == holidayList[i].Day && run.Date.Month == holidayList[i].Month)
                {
                    var cashDeskComponent = new PriceComponent()
                    {
                        Name  = "Holiday tax",
                        Value = placeComponent.Value * 1.25m
                    };
                    components.Add(cashDeskComponent);
                    break;
                }
            }
            if (placeComponent.Value > 30)
            {
                var cashDeskComponent = new PriceComponent()
                {
                    Name  = "Cash desk service tax",
                    Value = placeComponent.Value * 0.2m
                };
                components.Add(cashDeskComponent);
            }

            return(components);
        }
Пример #8
0
        public List <PriceComponent> CalculatePrice(PlaceInRun placeInRun)
        {
            var components = new List <PriceComponent>();

            foreach (var strategy in _strategyList)
            {
                components.AddRange(strategy.CalculatePrice(placeInRun));
            }

            return(components);
        }
Пример #9
0
        public List <PriceComponent> CalculatePrice(PlaceInRun placeInRun)
        {
            var components = new List <PriceComponent>();

            var teaComponent = new PriceComponent()
            {
                Name  = "Price for " + _name,
                Value = _price
            };

            components.Add(teaComponent);

            return(components);
        }
        public List <PriceComponent> CalculatePrice(PlaceInRun placeInRun)
        {
            var run   = _runRepository.GetRunDetails(placeInRun.RunId);
            var train = _trainRepository.GetTrainDetails(run.TrainId);

            var components = new DefaultPriceCalculationStrategy(_runRepository, _trainRepository).
                             CalculatePrice(placeInRun);

            if (_trainRepository.GetTrainDetails(placeInRun.Run.TrainId).Booking != null)
            {
                components.AddRange(new BookingPriceCalculationStrategy(_runRepository, _trainRepository).
                                    CalculatePrice(placeInRun));
            }

            return(components);
        }
Пример #11
0
        public Reservation Reserve(PlaceInRun 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),
                PlaceInRunId = place.Id,
            };

            _resRepo.Create(createIt);
            _resRepoLogger.Log("NewReservation created", 0);
            Debug.WriteLine("NewReservation created");
            return(createIt);
        }
        public List <PriceComponent> CalculatePrice(PlaceInRun placeInRun)
        {
            var train           = _trainRepository.GetTrainDetails(placeInRun.Run.TrainId);
            var priceComponents = new List <PriceComponent>();

            priceComponents.AddRange(_strategy.CalculatePrice(placeInRun));
            var sum = 0m;

            foreach (var p in priceComponents)
            {
                sum += p.Value;
            }
            var AgencyComponent = new PriceComponent {
                Name = "AgencyMargin", Value = train.CompanyMargin.Margin * sum
            };

            priceComponents.Add(AgencyComponent);
            return(priceComponents
                   );
        }
Пример #13
0
        public bool PlaceIsOccupied(PlaceInRun place)
        {
            var reservationsForCurrentPlace = _resRepo.GetAllForPlaceInRun(place.Id);

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

            var activeReservationFound = false;

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

            return(activeReservationFound);
        }
Пример #14
0
        public List <PriceComponent> CalculatePrice(PlaceInRun placeInRun)
        {
            List <PriceComponent> components = null;

            foreach (IPriceCalculationStrategy priceCalculationStrategy in _priceCalculationStrategies)
            {
                var price = priceCalculationStrategy.CalculatePrice(placeInRun);
                if (price != null)
                {
                    if (components == null)
                    {
                        components = price;
                    }
                    else
                    {
                        components.AddRange(price);
                    }
                }
            }
            return(components);
        }
        public List<PriceComponent> CalculatePrice(PlaceInRun placeInRun)
        {
            var components = new List<PriceComponent>();

            var run = _runRepository.GetRunDetails(placeInRun.RunId);
            var train = _trainRepository.GetTrainDetails(run.TrainId);
            var place =
                train.Carriages
                    .Select(car => car.Places.FirstOrDefault(pl =>
                        pl.Number == placeInRun.Number &&
                        car.Number == placeInRun.CarriageNumber))
                    .SingleOrDefault(x => x != null);

            var cashDeskComponent = new PriceComponent()
            {
                Name = "Booking service tax",
                Value = place.Carriage.DefaultPrice * place.PriceMultiplier * Convert.ToDecimal(train.Booking.OverPrice)
            };
            components.Add(cashDeskComponent);

            return components;
        }
Пример #16
0
        public List <PriceComponent> CalculatePrice(PlaceInRun placeInRun)
        {
            var priceComponents = new List <PriceComponent>();

            priceComponents.AddRange(_strategy.CalculatePrice(placeInRun));
            var teaComponent = new PriceComponent {
                Name = "Tea price", Value = PriceList.TEA * _teaCount
            };

            priceComponents.Add(teaComponent);
            var coffeeComponent = new PriceComponent {
                Name = "Coffee price", Value = PriceList.COFFEE * _coffeeCount
            };

            priceComponents.Add(coffeeComponent);
            var cookiesComponent = new PriceComponent {
                Name = "Cookies price", Value = PriceList.COOKIES * _cookiesCount
            };

            priceComponents.Add(cookiesComponent);
            return(priceComponents);
        }
        public List <PriceComponent> CalculatePrice(PlaceInRun placeInRun)
        {
            var components = new List <PriceComponent>();

            components.AddRange(_priceCalculationStrategy.CalculatePrice(placeInRun));

            if (IsHoliday(placeInRun.Run.Date))
            {
                var sum = 0m;

                foreach (var component in components)
                {
                    sum += component.Value;
                }

                components.Add(new PriceComponent {
                    Name = "Holidays fee", Value = sum * Constants.HolidayPriceMultiplier
                });
            }

            return(components);
        }