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