private async Task <Result <AccommodationBookingInfo> > ConvertToBookingInfo(Booking booking, string languageCode, AgentContext?agentContext = null) { var(_, isFailure, accommodation, error) = await _accommodationMapperClient.GetAccommodation(booking.HtId, languageCode); if (isFailure) { return(Result.Failure <AccommodationBookingInfo>(error.Detail)); } var settings = agentContext.HasValue ? await _accommodationBookingSettingsService.Get(agentContext.Value) : (AccommodationBookingSettings?)null; var bookingDetails = GetDetails(booking, accommodation.ToEdoContract()); var supplier = GetSupplier(booking, settings); var isDirectContract = GetDirectContractFlag(booking, settings); var agentInformation = await GetAgentInformation(booking.AgentId, booking.AgencyId); return(new AccommodationBookingInfo( bookingId: booking.Id, bookingDetails: bookingDetails, agencyId: booking.AgencyId, paymentStatus: booking.PaymentStatus, totalPrice: new MoneyAmount(booking.TotalPrice, booking.Currency), cancellationPenalty: BookingCancellationPenaltyCalculator.Calculate(booking, _dateTimeProvider.UtcNow()), supplier: supplier, agentInformation: agentInformation, paymentMethod: booking.PaymentType, tags: booking.Tags, isDirectContract: isDirectContract));
static AccommodationBookingDetails GetDetails(Booking booking, Accommodation accommodationDetails) { var passengerNumber = booking.Rooms.Sum(r => r.Passengers.Count); var numberOfNights = (booking.CheckOutDate - booking.CheckInDate).Days; return(new AccommodationBookingDetails( referenceCode: booking.ReferenceCode, clientReferenceCode: booking.ClientReferenceCode, agentReference: booking.SupplierReferenceCode, status: booking.Status, numberOfNights: numberOfNights, checkInDate: booking.CheckInDate.DateTime, checkOutDate: booking.CheckOutDate.DateTime, location: booking.Location, contactInfo: accommodationDetails.Contacts, accommodationId: booking.AccommodationId, accommodationName: booking.AccommodationName, accommodationInfo: booking.AccommodationInfo, deadlineDate: booking.DeadlineDate?.DateTime, roomDetails: booking.Rooms, numberOfPassengers: passengerNumber, cancellationPolicies: booking.CancellationPolicies, created: booking.Created.DateTime, propertyOwnerConfirmationCode: booking.PropertyOwnerConfirmationCode, isAdvancePurchaseRate: booking.IsAdvancePurchaseRate)); }
public async Task <Result <BookingVoucherData> > GenerateVoucher(Booking booking, string languageCode) { var(_, isAccommodationFailure, accommodationDetails, accommodationError) = await _accommodationMapperClient.GetAccommodation(booking.HtId, languageCode); if (isAccommodationFailure) { return(Result.Failure <BookingVoucherData>(accommodationError.Detail)); } var bannerMaybe = await _imageFileService.GetBanner(booking.AgencyId); var logoMaybe = await _imageFileService.GetLogo(booking.AgencyId); var agent = await _context.Agents.SingleOrDefaultAsync(a => a.Id == booking.AgentId); if (agent == default) { return(Result.Failure <BookingVoucherData>("Could not find agent")); } if (!AvailableForVoucherBookingStatuses.Contains(booking.Status)) { return(Result.Failure <BookingVoucherData>($"Voucher is not allowed for booking status '{EnumFormatters.FromDescription(booking.Status)}'")); } if (!AvailableForVoucherPaymentStatuses.Contains(booking.PaymentStatus)) { return(Result.Failure <BookingVoucherData>($"Voucher is not allowed for payment status '{EnumFormatters.FromDescription(booking.PaymentStatus)}'")); } return(new BookingVoucherData ( agentName: $"{agent.FirstName} {agent.LastName}", bookingId: booking.Id, accommodation: GetAccommodationInfo(accommodationDetails.ToEdoContract()), nightCount: (booking.CheckOutDate - booking.CheckInDate).Days, checkInDate: booking.CheckInDate.DateTime, checkOutDate: booking.CheckOutDate.DateTime, deadlineDate: booking.DeadlineDate?.DateTime, mainPassengerName: booking.MainPassengerName, referenceCode: booking.ReferenceCode, supplierReferenceCode: booking.SupplierReferenceCode, propertyOwnerConfirmationCode: booking.PropertyOwnerConfirmationCode, bannerUrl: bannerMaybe.HasValue ? bannerMaybe.Value.Url : null, logoUrl: logoMaybe.HasValue ? logoMaybe.Value.Url : null, roomDetails: booking.Rooms.Select(r => new BookingVoucherData.RoomInfo(r.ContractDescription, r.BoardBasis, r.MealPlan, r.DeadlineDate?.DateTime, r.ContractDescription, r.Passengers, r.Remarks, r.SupplierRoomReferenceCode)) .ToList() )); }
static Suppliers?GetSupplier(Booking booking, AccommodationBookingSettings?settings) => settings switch { null => (Suppliers)booking.Supplier,