public static async ValueTask <AccommodationAvailability> ProcessPrices(this AccommodationAvailability source,
                                                                                PriceProcessFunction processFunction)
        {
            var roomContractSets = await ProcessRoomContractSetsPrices(source.RoomContractSets, processFunction);

            return(new AccommodationAvailability(source.AvailabilityId,
                                                 source.CheckInDate,
                                                 source.CheckOutDate,
                                                 source.NumberOfNights,
                                                 source.Accommodation,
                                                 roomContractSets));
        }
        private static async ValueTask <RoomContractSetAvailability> ProcessPrices(RoomContractSetAvailability value,
                                                                                   PriceProcessFunction processFunction)
        {
            var roomContractSet = await RoomContractSetPriceProcessor.ProcessPrices(value.RoomContractSet, processFunction);

            return(new RoomContractSetAvailability(availabilityId: value.AvailabilityId,
                                                   checkInDate: value.CheckInDate,
                                                   checkOutDate: value.CheckOutDate,
                                                   numberOfNights: value.NumberOfNights,
                                                   roomContractSet: roomContractSet,
                                                   accommodation: value.Accommodation,
                                                   availablePaymentMethods: value.AvailablePaymentMethods,
                                                   countryHtId: value.CountryHtId,
                                                   localityHtId: value.LocalityHtId,
                                                   evaluationToken: value.EvaluationToken));
        }
        public static async ValueTask <RoomContractSetAvailability?> ProcessPrices(
            this RoomContractSetAvailability?source,
            PriceProcessFunction processFunction)
        {
            if (source == null)
            {
                return(null);
            }

            var value           = source.Value;
            var roomContractSet = await ProcessRoomContractSetPrice(value.RoomContractSet, processFunction);

            return(new RoomContractSetAvailability(value.AvailabilityId,
                                                   value.CheckInDate,
                                                   value.CheckOutDate,
                                                   value.NumberOfNights,
                                                   value.Accommodation,
                                                   roomContractSet));
        }
        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 async Task <List <RoomContractSet> > ProcessPrices(List <RoomContractSet> sourceRoomContractSets, PriceProcessFunction priceProcessFunction)
        {
            var roomContractSets = new List <RoomContractSet>(sourceRoomContractSets.Count);

            foreach (var roomContractSet in sourceRoomContractSets)
            {
                var roomContractSetWithMarkup = await ProcessPrices(roomContractSet, priceProcessFunction);

                roomContractSets.Add(roomContractSetWithMarkup);
            }

            return(roomContractSets);
        }
        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));
Exemplo n.º 7
0
        public static async ValueTask <TestStructureUnderMarkup> Apply(TestStructureUnderMarkup initial, PriceProcessFunction processFunction)
        {
            var resultPrice = await processFunction(initial.Price);

            return(new TestStructureUnderMarkup
            {
                Price = resultPrice
            });
        }