static EdoContracts.Accommodations.Booking GetStubDetails(Data.Bookings.Booking booking) => new EdoContracts.Accommodations.Booking(booking.ReferenceCode, // Will be set in the refresh step BookingStatusCodes.WaitingForResponse, booking.AccommodationId, booking.SupplierReferenceCode, booking.CheckInDate.DateTime, booking.CheckOutDate.DateTime, new List <SlimRoomOccupation>(0), booking.UpdateMode);
public static Booking FromEdoModels(this Data.Bookings.Booking booking) { return(new Booking(clientReferenceCode: booking.ClientReferenceCode, referenceCode: booking.ReferenceCode, created: booking.Created.DateTime, checkInDate: booking.CheckInDate.DateTime, checkOutDate: booking.CheckOutDate.DateTime, totalPrice: booking.TotalPrice.ToMoneyAmount(booking.Currency), status: booking.Status, rooms: booking.Rooms.FromEdoModel(), accommodationId: booking.HtId, cancellationPolicies: booking.CancellationPolicies .Select(p => new CancellationPolicy(p.FromDate, p.Percentage)) .ToList(), cancelled: booking.Cancelled?.DateTime, isPackage: booking.IsPackage)); }
public static DateTime GetPayDueDate(this Data.Bookings.Booking booking) => (booking.DeadlineDate == null || booking.DeadlineDate?.DateTime == DateTime.MinValue ? booking.CheckInDate.DateTime : booking.DeadlineDate.Value.DateTime);
public static MoneyAmount GetTotalPrice(this Data.Bookings.Booking booking) => new(booking.TotalPrice, booking.Currency);
public async Task <Result <Booking> > Execute(Data.Bookings.Booking booking, AgentContext agent, string languageCode) { Baggage.AddBookingReferenceCode(booking.ReferenceCode); var requestInfoResult = await _requestStorage.Get(booking.ReferenceCode); if (requestInfoResult.IsFailure) { return(Result.Failure <Booking>(requestInfoResult.Error)); } var(bookingRequest, availabilityInfo) = requestInfoResult.Value; var creditCardResult = await GetCreditCard(booking, availabilityInfo); if (creditCardResult.IsFailure) { return(Result.Failure <Booking>(creditCardResult.Error)); } var bookingRequestResult = await SendSupplierRequest(bookingRequest, availabilityInfo.AvailabilityId, booking, creditCardResult.Value, languageCode); if (bookingRequestResult.IsSuccess) { _bookingAnalyticsService.LogBookingOccured(bookingRequest, booking, agent); } await ProcessRequestResult(bookingRequestResult); return(bookingRequestResult); async Task <Result <Booking> > SendSupplierRequest(AccommodationBookingRequest bookingRequest, string availabilityId, Data.Bookings.Booking booking, CreditCardInfo creditCard, string languageCode) { var features = new List <Feature>(); var roomDetails = bookingRequest.RoomDetails .Select(d => new SlimRoomOccupation(d.Type, d.Passengers, string.Empty, d.IsExtraBedNeeded)) .ToList(); var creditCardInfo = creditCard is not null ? new CreditCard(creditCard.Number, creditCard.ExpiryDate, creditCard.HolderName, creditCard.SecurityCode, CardVendor.AmericanExpress) : (CreditCard?)null; var innerRequest = new BookingRequest(availabilityId: availabilityId, roomContractSetId: bookingRequest.RoomContractSetId, referenceCode: booking.ReferenceCode, rooms: roomDetails, features: features, creditCard: creditCardInfo, rejectIfUnavailable: bookingRequest.RejectIfUnavailable); try { var(isSuccess, _, bookingResult, error) = await TimeObserver.Execute(observedFunc : () => _supplierConnectorManager .Get((Suppliers)booking.Supplier) .Book(innerRequest, languageCode), notifyFunc : Notify, notifyAfter : TimeSpan.FromSeconds(BookExecutionTimeLimitInSeconds)); if (isSuccess) { return(bookingResult); } var message = error.Detail; // If result is failed this does not mean that booking failed. All known cases are listed below _logger.LogBookingFinalizationFailure(booking.ReferenceCode, message); if (!error.Extensions.TryGetBookingFailureCode(out var failureCode)) { // We do not know whether booking was registered on supplier return(GetStubDetails(booking)); } return(failureCode switch { // We are sure that booking was not done BookingFailureCodes.ConnectorValidationFailed => Result.Failure <Booking>(message), BookingFailureCodes.ValuationResultNotFound => Result.Failure <Booking>(message), BookingFailureCodes.PreBookingFailed => Result.Failure <Booking>(message), BookingFailureCodes.SupplierValidationFailed => Result.Failure <Booking>(message), BookingFailureCodes.SupplierRejected => Result.Failure <Booking>(message), // We do not know whether booking was registered on supplier _ => GetStubDetails(booking) }); Task Notify() { _logger.LogBookingExceededTimeLimit(innerRequest.ReferenceCode); return(Task.CompletedTask); } } catch (Exception ex) { _logger.LogBookingFinalizationException(ex); return(GetStubDetails(booking)); }