public static RoomContractSet AlignPrices(RoomContractSet roomContractSet) { var totalFinalPrice = MoneyRounder.Ceil(roomContractSet.Rate.FinalPrice); var roomFinalPrices = roomContractSet.Rooms .Select(r => MoneyRounder.Ceil(r.Rate.FinalPrice)) .ToList(); var(alignedFinalPrice, alignedRoomFinalPrices) = PriceAligner.AlignAggregateValues(totalFinalPrice, roomFinalPrices); var totalGrossPrice = MoneyRounder.Ceil(roomContractSet.Rate.Gross); var roomGrossPrices = roomContractSet.Rooms .Select(r => MoneyRounder.Ceil(r.Rate.Gross)) .ToList(); var(alignedGrossPrice, alignedRoomGrossRates) = PriceAligner.AlignAggregateValues(totalGrossPrice, roomGrossPrices); var roomContracts = new List <RoomContract>(roomContractSet.Rooms.Count); for (var i = 0; i < roomContractSet.Rooms.Count; i++) { var room = roomContractSet.Rooms[i]; var totalPriceNet = alignedRoomFinalPrices[i]; var totalPriceGross = alignedRoomGrossRates[i]; var totalRate = new Rate(totalPriceNet, totalPriceGross); roomContracts.Add(BuildRoomContracts(room, room.DailyRoomRates, totalRate)); } var roomContractSetRate = new Rate(alignedFinalPrice, alignedGrossPrice); return(BuildRoomContractSet(roomContractSet, roomContractSetRate, roomContracts)); }
private static bool IsAllowed(RoomContractSet roomSet, DateTime checkInDate, AccommodationBookingSettings settings, IDateTimeProvider dateTimeProvider, HashSet <AprMode> aprModesToDisallow, HashSet <PassedDeadlineOffersMode> deadlineModesToDisallow) { if (roomSet.IsAdvancePurchaseRate && aprModesToDisallow.Contains(settings.AprMode)) { return(false); } if (deadlineModesToDisallow.Contains(settings.PassedDeadlineOffersMode)) { var tomorrow = dateTimeProvider.UtcTomorrow(); if (checkInDate <= tomorrow) { return(false); } var deadlineDate = roomSet.Deadline.Date; if (deadlineDate.HasValue && deadlineDate.Value.Date <= tomorrow) { return(false); } } return(true); }
private static async Task <RoomContractSet> ProcessRoomContractSetPrice(RoomContractSet sourceRoomContractSet, PriceProcessFunction priceProcessFunction) { var roomContracts = new List <RoomContract>(sourceRoomContractSet.RoomContracts.Count); foreach (var room in sourceRoomContractSet.RoomContracts) { var dailyRates = new List <DailyRate>(room.DailyRoomRates.Count); foreach (var dailyRate in room.DailyRoomRates) { var roomGross = await priceProcessFunction(dailyRate.Gross); var roomFinalPrice = await priceProcessFunction(dailyRate.FinalPrice); dailyRates.Add(BuildDailyPrice(dailyRate, roomFinalPrice, roomGross)); } var totalPriceNet = await priceProcessFunction(room.Rate.FinalPrice); var totalPriceGross = await priceProcessFunction(room.Rate.FinalPrice); var totalRate = new Rate(totalPriceNet, totalPriceGross); roomContracts.Add(BuildRoomContracts(room, dailyRates, totalRate)); } var roomContractSetGross = await priceProcessFunction(sourceRoomContractSet.Rate.Gross); var roomContractSetNetTotal = await priceProcessFunction(sourceRoomContractSet.Rate.FinalPrice); var roomContractSetRate = new Rate(roomContractSetNetTotal, roomContractSetGross, sourceRoomContractSet.Rate.Discounts, sourceRoomContractSet.Rate.Type, sourceRoomContractSet.Rate.Description); return(BuildRoomContractSet(sourceRoomContractSet, roomContractSetRate, roomContracts));
public RoomContractSetAvailability(string availabilityId, string accommodationId, DateTime checkInDate, DateTime checkOutDate, int numberOfNights, RoomContractSet roomContractSet, CreditCardRequirement?creditCardRequirement = null) { AvailabilityId = availabilityId; AccommodationId = accommodationId; CheckInDate = checkInDate; CheckOutDate = checkOutDate; NumberOfNights = numberOfNights; RoomContractSet = roomContractSet; CreditCardRequirement = creditCardRequirement; }
public static bool IsEvaluationAllowed(RoomContractSet roomSet, DateTime checkInDate, AccommodationBookingSettings settings, IDateTimeProvider dateTimeProvider) { return(IsAllowed(roomSet, checkInDate, settings, dateTimeProvider, new HashSet <AprMode> { AprMode.Hide, AprMode.DisplayOnly }, new HashSet <PassedDeadlineOffersMode> { PassedDeadlineOffersMode.Hide, PassedDeadlineOffersMode.DisplayOnly })); }
public static async Task <RoomContractSet> ProcessPrices(RoomContractSet sourceRoomContractSet, PriceProcessFunction priceProcessFunction) { var roomContracts = new List <RoomContract>(sourceRoomContractSet.Rooms.Count); var sourceTotalPrice = sourceRoomContractSet.Rate.FinalPrice; if (sourceTotalPrice.Amount == 0) { throw new NotSupportedException("Room contract set price cannot be 0"); } var processedTotalPrice = await priceProcessFunction(sourceRoomContractSet.Rate.FinalPrice); var roomContractSetGross = ChangeProportionally(sourceRoomContractSet.Rate.Gross); var roomContractSetRate = new Rate(finalPrice: processedTotalPrice, gross: roomContractSetGross, discounts: sourceRoomContractSet.Rate.Discounts, type: sourceRoomContractSet.Rate.Type, description: sourceRoomContractSet.Rate.Description); foreach (var room in sourceRoomContractSet.Rooms) { var dailyRates = new List <DailyRate>(room.DailyRoomRates.Count); foreach (var dailyRate in room.DailyRoomRates) { var roomGross = MoneyRounder.Ceil(ChangeProportionally(dailyRate.Gross)); var roomFinalPrice = MoneyRounder.Ceil(ChangeProportionally(dailyRate.FinalPrice)); dailyRates.Add(BuildDailyPrice(dailyRate, roomFinalPrice, roomGross)); } var totalPriceNet = ChangeProportionally(room.Rate.FinalPrice); var totalPriceGross = ChangeProportionally(room.Rate.Gross); var totalRate = new Rate(totalPriceNet, totalPriceGross); roomContracts.Add(BuildRoomContracts(room, dailyRates, totalRate)); } return(BuildRoomContractSet(sourceRoomContractSet, roomContractSetRate, roomContracts)); MoneyAmount ChangeProportionally(MoneyAmount price) { var ratio = (price / sourceTotalPrice).Amount; return(new MoneyAmount(processedTotalPrice.Amount * ratio, processedTotalPrice.Currency)); } }
public static RoomContractSet Process(RoomContractSet roomContractSet, DateTime checkInDate, CancellationPolicyProcessSettings cancellationPolicyProcessSettings) { var roomContractSetDeadline = DeadlinePolicyProcessor.Process(roomContractSet.Deadline, checkInDate, cancellationPolicyProcessSettings); var shiftedRoomContracts = new List <RoomContract>(); foreach (var roomContract in roomContractSet.Rooms) { var roomContractDeadline = DeadlinePolicyProcessor.Process(roomContract.Deadline, checkInDate, cancellationPolicyProcessSettings); shiftedRoomContracts.Add(SetDeadline(roomContract, roomContractDeadline)); } return(new RoomContractSet(id: roomContractSet.Id, isDirectContract: roomContractSet.IsDirectContract, isAdvancePurchaseRate: roomContractSet.IsAdvancePurchaseRate, isPackageRate: roomContractSet.IsPackageRate, rate: roomContractSet.Rate, deadline: roomContractSetDeadline, rooms: shiftedRoomContracts, supplier: roomContractSet.Supplier, tags: roomContractSet.Tags));
private static Currencies?GetCurrency(RoomContractSet roomContractSet) { return(roomContractSet.Rate.Currency == Currencies.NotSpecified ? null : roomContractSet.Rate.Currency); }
public static RoomContractSet ApplySearchSettings(this RoomContractSet rs, bool isSupplierVisible, bool isDirectContractsVisible) => new(rs.Id,