public ActionResult Index(int id)
        {
            var run   = _runRepo.GetRunDetails(id);
            var train = _trainRepo.GetTrainDetails(run.TrainId);
            var model = new RunViewModel()
            {
                RunDate          = run.Date,
                Carriages        = train.Carriages.ToDictionary(x => x.Number),
                PlacesByCarriage = run.Places.GroupBy(x => x.CarriageNumber).ToDictionary(x => x.Key, x => x.ToList()),
                ReservedPlaces   = run.Places.Where(p => _resServ.PlaceIsOccupied(p)).Select(p => p.Id).ToList(),
                Train            = train,
            };

            return(View(model));
        }
        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);
        }
예제 #3
0
        public ActionResult Train(int id)
        {
            var startDate = DateTime.Now;
            var endDate   = startDate.AddMonths(1);
            var model     = new TrainDetailsViewModel()
            {
                ScheduleStart  = startDate,
                ScheduleEnd    = endDate,
                Runs           = _runRepo.GetRuns(startDate, endDate, id),
                Train          = _trainRepo.GetTrainDetails(id),
                Agency         = _agenciesRepo.GetAgencyDetails(_trainRepo.GetTrainDetails(id).AgencyId),
                AvailableDates = _schedule.GetAvailableDatesForNewRun(id, startDate, endDate)
            };

            return(View(model));
        }
예제 #4
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);
        }
        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);
        }
예제 #6
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);
        }
예제 #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);
        }
        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
                   );
        }
        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;
        }
예제 #10
0
        public List <PriceComponent> CalculatePrice(TicketPriceParametersDTO priceParametersDTO)
        {
            var components = new List <PriceComponent>();

            var run          = _runRepository.GetRunDetails(priceParametersDTO.PlaceInRun.RunId);
            var train        = _trainRepository.GetTrainDetails(run.TrainId);
            var carriagetype = train.Carriages.FirstOrDefault(x => x.Number == priceParametersDTO.PlaceInRun.CarriageNumber).Type;

            if (priceParametersDTO.Drink == true)
            {
                components.Add(new PriceComponent {
                    Name = "Drink price", Value = 5, Ticket = priceParametersDTO.Ticket, TicketId = priceParametersDTO.Ticket.Id
                });
            }
            if (priceParametersDTO.Bed == true && carriagetype != CarriageType.Sedentary)
            {
                components.Add(new PriceComponent {
                    Name = "Bed price", Value = 15, Ticket = priceParametersDTO.Ticket, TicketId = priceParametersDTO.Ticket.Id
                });
            }

            return(components);
        }