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));
Beispiel #4
0
 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));
Beispiel #8
0
 private static Currencies?GetCurrency(RoomContractSet roomContractSet)
 {
     return(roomContractSet.Rate.Currency == Currencies.NotSpecified
         ? null
         : roomContractSet.Rate.Currency);
 }
Beispiel #9
0
 public static RoomContractSet ApplySearchSettings(this RoomContractSet rs, bool isSupplierVisible, bool isDirectContractsVisible)
 => new(rs.Id,