public List <PriceComponent> CalculatePrice(TicketParametersDTO parametrs) { var components = new List <PriceComponent>(); var run = _runRepository.GetRunDetails(parametrs.PlaceInRun.RunId); var train = _trainRepository.GetTrainDetails(run.TrainId); var place = train.Carriages .Select(car => car.Places.SingleOrDefault(pl => pl.Number == parametrs.PlaceInRun.Number && car.Number == parametrs.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 Ticket CreateTicket(int reservationId, string fName, string lName, string code) { var res = _resRepo.Get(reservationId); if (res.TicketId != null) { throw new InvalidOperationException("ticket has been already issued to this reservation, unable to create another one"); } var placeInRun = _runRepository.GetPlaceInRun(res.PlaceInRunId); var newTicket = new Ticket() { ReservationId = res.Id, CreatedDate = DateTime.Now, FirstName = fName, LastName = lName, Status = TicketStatusEnum.Active, PriceComponents = new List <PriceComponent>() }; var parametrs = new TicketParametersDTO(); parametrs.PlaceInRun = placeInRun; parametrs.Code = code; parametrs.Ticket = newTicket; newTicket.PriceComponents = _priceStr.CalculatePrice(parametrs); _tickRepo.Create(newTicket); return(newTicket); }
public List <PriceComponent> CalculatePrice(TicketParametersDTO parameters) { var PriceComponents = new List <PriceComponent>(); foreach (IPriceCalculationStrategy strategy in _strategys) { PriceComponents.AddRange(strategy.CalculatePrice(parameters)); } return(PriceComponents); }
public List <PriceComponent> CalculatePrice(TicketParametersDTO parametrs) { var components = new List <PriceComponent>(); var defaultPrice = _priceCalculationStrategy.CalculatePrice(parametrs); PriceComponent mainPrice = defaultPrice.Find(p => p.Name == "Main price"); if (parametrs.Code != null) { components.Add(new PriceComponent { Name = "Code markup price", Ticket = parametrs.Ticket, TicketId = parametrs.Ticket.Id, Value = _bookingAgencies.GetMarkup(parametrs.Code) }); } return(components); }
public ActionResult ReservePlace(int placeId) { var place = _runRepo.GetPlaceInRun(placeId); var reservation = _resServ.Reserve(place); var parametrs = new TicketParametersDTO(); parametrs.PlaceInRun = place; var model = new ReservationViewModel() { Reservation = reservation, PlaceInRun = place, PriceComponents = _priceCalc.CalculatePrice(parametrs), Date = place.Run.Date, Train = _trainRepo.GetTrainDetails(place.Run.TrainId), }; return(View(model)); }