Esempio n. 1
0
 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);
Esempio n. 2
0
 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));
 }
Esempio n. 3
0
 public static DateTime GetPayDueDate(this Data.Bookings.Booking booking)
 => (booking.DeadlineDate == null || booking.DeadlineDate?.DateTime == DateTime.MinValue ? booking.CheckInDate.DateTime : booking.DeadlineDate.Value.DateTime);
Esempio n. 4
0
 public static MoneyAmount GetTotalPrice(this Data.Bookings.Booking booking)
 => new(booking.TotalPrice, booking.Currency);
Esempio n. 5
0
        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));
                }