public void CancelValidBookingExpectSuccess() { // Arrange const int BOOKING_ID = 1; const long BUSINESS_ID = 11111111111; var requestcancelBooking = new RequestCancelBooking() { BookingId = BOOKING_ID, BusinessId = BUSINESS_ID }; var requestcancelBookingDto = new RequestCancelBookingDto() { BookingId = BOOKING_ID, BusinessId = BUSINESS_ID }; var existingBooking = new Booking{Id = BOOKING_ID,BusinessId = BUSINESS_ID,}; var bookingManager = MockRepository.GenerateMock<IBookingManager>(); bookingManager.Stub(b => b.GetByKey(BOOKING_ID)).Return(existingBooking); bookingManager.Expect(r => r.RequestCancelBooking(Arg<RequestCancelBooking>.Matches( rcbook => rcbook.CancellationRequestReason == requestcancelBooking.CancellationRequestReason && rcbook.CancellationRequestAction == requestcancelBooking.CancellationRequestAction && rcbook.BookingId == requestcancelBooking.BookingId && rcbook.BusinessId == requestcancelBooking.BusinessId && rcbook.BusinessContactedGuest == requestcancelBooking.BusinessContactedGuest && rcbook.Notes == requestcancelBooking.Notes), Arg<Booking>.Is.Equal(existingBooking))).Return(true); PropertyManagementSystemService.BookingManager = bookingManager; // Stub the BusinessCache to be used by our service method CacheHelper.StubBusinessCacheSingleBusiness(BUSINESS_ID); // invalidate the cache so we make sure our business is loaded into the cache Cache.Business.Invalidate(); // Act bool requestResult = PropertyManagementSystemService.RequestCancelBooking(requestcancelBookingDto); // Assert Assert.IsTrue(requestResult, "Booking is not cancelled successfully."); bookingManager.VerifyAllExpectations(); // Reassign the Dao on the cache to discard the stub assigned on the StubBusinessCacheSingleBusiness method CacheHelper.ReAssignBusinessDaoToBusinessCache(); }
public void RequestCancelExistentBooking_ExpectSuccess() { // Arrange const int BOOKING_ID = 1; using (new TestDataHelper(GetTestQuery(TestQueryLimited.PopulateBookingsAndCloseOutsTestData), GetTestQuery(TestQuery.CleanupUnitTestData))) { var requestCancelBooking = new RequestCancelBooking() { BookingId = BOOKING_ID, BusinessContactedGuest = true, CancellationRequestAction = CancellationRequestAction.ChargedFullBookingValue, Notes = "unit test notes" }; // Act var result = bookingDao.RequestCancelBooking(requestCancelBooking); // Assert Assert.IsTrue(result, "Request for booking cancellation has failed."); } }
public void RequestCancelNonExistentBooking_ExpectExceptionThrown() { // Arrange const int BOOKING_ID = -1; var requestCancelBooking = new RequestCancelBooking() { BookingId = BOOKING_ID }; try { // Act bookingDao.RequestCancelBooking(requestCancelBooking); // Assert Assert.Fail("An exception SRVEX30095 of type ExpectedResultException should have been thrown"); } catch (ExpectedResultException ex) { // Assert Assert.AreEqual("SRVEX30095", ex.Code, "Exception code returned is incorrect."); } }
/// <summary> /// Send a cancellation request email in regards to a cancel booking request /// </summary> /// <param name="requestCancelBooking">request information</param> /// <param name="booking">booking to request cancel for</param> /// <param name="order">order for booking</param> /// <returns>true if successful</returns> public bool SendCancellationRequestEmail(RequestCancelBooking requestCancelBooking, Model.Booking.Booking booking, Model.Order.Order order) { var business = businessDao.GetByKey(booking.BusinessId); var cultureInfo = PrepareCultureInfoUsage(order, business); var eviivoSupportEmail = GetEviivoEmailByType(InternalEmailAddressType.Support); var emailToSend = new EmailDto { Priority = new EmailPriorityDto { Priority = EmailPriorityEnumDto.Normal }, User = GetEmailUser(), SenderEmail = eviivoSupportEmail, ReplyToEmail = eviivoSupportEmail, Recipients = GetEviivoEmailsByType(GetInternalEmailAddressType(requestCancelBooking.CancellationRequestReason)), Subject = GetCancellationRequestEmailSubject(requestCancelBooking, booking), Bodies = GetCancellationRequestEmailBody(requestCancelBooking, order, booking, cultureInfo) }; // add business as cc emailToSend.Recipients.Add(GetBusinessEmailForBooking(business)); return SendEmailAction(emailToSend, CANCELLATION, booking.BookingReferenceNumber); }
/// <summary> /// Generate the email subject for the cancellation email /// </summary> /// <param name="requestCancelBooking">request info</param> /// <param name="booking">booking info</param> /// <returns>string that is the formatted subject for cancelling</returns> private string GetCancellationRequestEmailSubject(RequestCancelBooking requestCancelBooking, Model.Booking.Booking booking) { return string.Format("{0} - {1} - {2}", GetCancellationRequestReasonSubjectText(requestCancelBooking.CancellationRequestReason), booking.Guest.Surname, booking.BookingReferenceNumber); }
/// <summary> /// Generate the email body for the cancellation request email /// </summary> /// <param name="requestCancelBooking">request info</param> /// <param name="order">The order object</param> /// <param name="booking">The booking object</param> /// <param name="cultureInfo">The cultureFormat info used for formatting</param> /// <returns>The formatted email body collection</returns> private List<EmailBodyDto> GetCancellationRequestEmailBody( RequestCancelBooking requestCancelBooking, Model.Order.Order order, Model.Booking.Booking booking, IFormatProvider cultureInfo) { if (booking == null || order == null) { return null; } // label parameters inside the email template var parameters = new Dictionary<string, string> { //styling {STYLE_MAIN_BG_COLOR, EmailCancellationRequestMainBgColor}, //title {LABEL_TITLE, EmailTexts.EmailTitle_CancellationRequest}, {LABEL_OTA_TIC, EmailTexts.CancellationRequest_OTATIC}, {LABEL_PMS_CANCEL_REQUEST, EmailTexts.CancellationRequest_PMSRequest}, {LABEL_COPYRIGHT, EmailTexts.Copyright} }; var content = new StringBuilder(); //Guest details section content.Append(FormatHeadingRow(EmailTexts.GuestDetails, EmailCancellationRequestMainBgColor)); content.Append(FormatGuestDetails(booking.Guest)); //Reservation details section content.Append(FormatHeadingRow(EmailTexts.Reservation, EmailCancellationRequestMainBgColor)); content.AppendFormat(HtmlTemplates.HTML_Row_3Columns, EmailTexts.EviivoReference, booking.BookingReferenceNumber); content.AppendFormat(HtmlTemplates.HTML_Row_3Columns, EmailTexts.Channel, order.Channel != null ? order.Channel.Name : string.Empty); if (!string.IsNullOrWhiteSpace(order.ChannelReference)) { content.AppendFormat(HtmlTemplates.HTML_Row_3Columns, EmailTexts.ChannelReference, order.ChannelReference); } content.AppendFormat(HtmlTemplates.HTML_Row_3Columns, EmailTexts.ArrivalDate, booking.StartDate.ToString(SHORT_DATE_FORMAT)); content.AppendFormat(HtmlTemplates.HTML_Row_3Columns, EmailTexts.DepartureDate, booking.EndDate.ToString(SHORT_DATE_FORMAT)); content.AppendFormat(HtmlTemplates.HTML_Row_3Columns, EmailTexts.RoomType, booking.RoomTypeDescription); // order total var orderTotal = booking.Cost.HasValue ? booking.Cost.Value : 0; content.AppendFormat(HtmlTemplates.HTML_Row_3Columns, EmailTexts.OrderTotal, string.Format("{0} {1:N2}", order.CurrencySymbol, orderTotal)); //amount paid var amountPaid = booking.AmountPaid.HasValue ? booking.AmountPaid.Value : 0; content.AppendFormat(HtmlTemplates.HTML_Row_3Columns, EmailTexts.AmountPaid, string.Format("{0} {1:N2}", order.CurrencySymbol, amountPaid)); //cancellation request details section content.Append(FormatHeadingRow(EmailTexts.EmailTitle_CancellationRequest, EmailCancellationRequestMainBgColor)); content.AppendFormat(HtmlTemplates.HTML_Row_3Columns, EmailTexts.CancellationRequest_GuestContacted, requestCancelBooking.BusinessContactedGuest ? EmailTexts.Yes : EmailTexts.No); var cancelAction = GetCancelActionFromCode(requestCancelBooking.CancellationRequestAction.GetCode()); content.AppendFormat(HtmlTemplates.HTML_Row_3Columns, EmailTexts.CancellationRequest_ProposedCourseOfAction, cancelAction); if (!string.IsNullOrWhiteSpace(requestCancelBooking.Notes)) { content.AppendFormat(HtmlTemplates.HTML_Row_3Columns, EmailTexts.CancellationRequest_AdditionalInformation, requestCancelBooking.Notes); } content.AppendFormat(HtmlTemplates.HTML_Row_3Columns, EmailTexts.CancellationRequest_RaisedBy, booking.BusinessName); content.AppendFormat(HtmlTemplates.HTML_Row_3Columns, EmailTexts.CancellationRequest_eviivoId, booking.BusinessShortName); var requestingUser = Membership.GetUser(GetUserName()); content.AppendFormat(HtmlTemplates.HTML_Row_3Columns, EmailTexts.User, requestingUser != null && !string.IsNullOrWhiteSpace(requestingUser.Email) ? requestingUser.Email : string.Empty); content.AppendFormat(HtmlTemplates.HTML_Row_3Columns, EmailTexts.CancellationRequest_RequestRaisedAt, DateTime.UtcNow.ToString(SHORT_DATE_TIME_FORMAT)); parameters.Add(CANCELLATIONREQUEST_DETAILS, content.ToString()); return new List<EmailBodyDto> { new EmailBodyDto { Content = FormatTemplateLabels(HtmlTemplates.EmailTemplate_CancellationRequest, parameters), MimeType = EmailMimeTypeEnumDto.Html } }; }
/// <summary> /// Request to cancel a booking /// </summary> /// <param name="requestCancelBooking">RequestCancelBooking</param> /// <returns>True if request succeeds, false otherwise</returns> public bool RequestCancelBooking(RequestCancelBooking requestCancelBooking) { var parameters = new List<SqlParameter>(); parameters.Add(DbHelper.CreateParameter(BookingMapper.Parameters.BookingId, requestCancelBooking.BookingId)); parameters.Add(DbHelper.CreateParameter(BookingMapper.Parameters.BusinessHasContactedGuest, requestCancelBooking.BusinessContactedGuest)); parameters.Add(DbHelper.CreateParameter(BookingMapper.Parameters.CancellationRequestActionCode, requestCancelBooking.CancellationRequestAction.GetCode())); parameters.Add(DbHelper.CreateParameter(BookingMapper.Parameters.AdditionalInformation, requestCancelBooking.Notes)); parameters.Add(DbHelper.CreateParameter(BookingMapper.Parameters.CancellationReasonCode, requestCancelBooking.CancellationRequestReason.GetCode())); parameters.Add(DbHelper.CreateParameter(BookingMapper.Parameters.UserId, AuditFieldsHelper.GetUserId())); try { DbHelper.ExecuteNonQueryCommand("Booking.InsertCancellationRequest", CommandType.StoredProcedure, parameters); } catch (SqlException ex) { throw new ExpectedResultException(ErrorFactory.CreateAndLogError(Errors.SRVEX30095, "BookingDao.RequestCancel", additionalDescriptionParameters: (new object[] { "Booking", requestCancelBooking.BookingId }), arguments: new object[] { "Booking", requestCancelBooking.BookingId }, exception: ex)); } return true; }
/// <summary> /// Request to cancel a booking /// </summary> /// <param name="requestCancelBooking">RequestCancelBooking</param> /// <param name="booking">booking that was requested to be cancelled</param> /// <returns>True if request succeeds, false otherwise</returns> public bool RequestCancelBooking(RequestCancelBooking requestCancelBooking, Model.Booking.Booking booking) { var requestResult = bookingDao.RequestCancelBooking(requestCancelBooking); // need order for checking source var order = orderDao.GetByKey(booking.OrderId); // check if sending email is valid if (order.OrderSourceCode == SourceType.Online.GetCode() && order.IntegrationType.HasValue && (order.IntegrationType == IntegrationTypeEnum.Push || order.IntegrationType == IntegrationTypeEnum.RequestResponse || order.IntegrationType == IntegrationTypeEnum.TouristInformationCentre)) { // send email based on booking information here requestResult = requestResult && emailManager.SendCancellationRequestEmail(requestCancelBooking, booking, order); if (requestResult == false) { // log it at least ErrorFactory.CreateAndLogError(Errors.SRVEX30109, "BookingManager.RequestCancelBooking"); } } return requestResult; }
public void RequestCancelExistingBookingIsSuccessful() { // Arrange var bookingDao = new Mock<IBookingDao>(); var emailManagerMock = new Mock<IEmailManager>(); var orderDao = new Mock<IOrderDao>(); var bookingManager = new BookingManager { BookingDao = bookingDao.Object, EmailManager = emailManagerMock.Object, OrderDao = orderDao.Object }; var requestCancelBooking = new RequestCancelBooking { BookingId = 1, BusinessContactedGuest = true, CancellationRequestAction = CancellationRequestAction.ChargedFullBookingValue, CancellationRequestReason = CancellationReasonEnum.CardDeclined, Notes = "unit test notes" }; var order = new Order { Id = 1, OrderSourceCode = SourceType.Online.GetCode(), IntegrationType = IntegrationTypeEnum.Push }; orderDao.Setup(o => o.GetByKey(It.Is<int>(i => i == order.Id), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<GetOrderWithBookingsByEnum>())).Returns(order); bookingDao.Setup(c => c.RequestCancelBooking(requestCancelBooking)).Returns(true); emailManagerMock.Setup(e => e.SendCancellationRequestEmail(requestCancelBooking, It.IsAny<Booking>(), It.Is<Order>(o => o.Id == order.Id))).Returns(true); //Act bookingManager.RequestCancelBooking(requestCancelBooking, new Booking { Id = 1, OrderId = 1 }); // Assert bookingDao.VerifyAll(); emailManagerMock.VerifyAll(); orderDao.VerifyAll(); }
public void RequestCancelNonExistentBooking_ExpectExceptionThrown() { // Arrange var bookingManager = new BookingManager(); var requestCancelBooking = new RequestCancelBooking() {BookingId = -1}; try { // Act bookingManager.RequestCancelBooking(requestCancelBooking, new Booking()); // Assert Assert.Fail("An exception SRVEX30095 of type ValidationException should have been thrown"); } catch (ExpectedResultException ex) { // Assert Assert.AreEqual("SRVEX30095", ex.Code, "The exception code thrown is not the expected."); } }