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();
            }
Пример #2
0
            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.");

                }

            }
Пример #3
0
            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.");
                }
            }
Пример #4
0
        /// <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);
        }
Пример #5
0
 /// <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);
 }
Пример #6
0
        /// <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
                                         }
                                     };
        }
Пример #7
0
        /// <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;

        }
Пример #8
0
        /// <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;
        }
Пример #9
0
            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();
            }
Пример #10
0
            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.");
                }
            }