public void CreateTransactionModelForInvoiceRequestReturnsTransactionModelCorrectly()
            {
                #region Arrange

                // Arrange
                IBookingDao bookingDaoMock = MockRepository.GenerateMock<IBookingDao>();
                IBusinessDao businessDaoMock = MockRepository.GenerateMock<IBusinessDao>();
                IOrderDao orderDaoMock = MockRepository.GenerateMock<IOrderDao>();
                IOrderReferenceDao orderReferenceMock = MockRepository.GenerateMock<IOrderReferenceDao>();
                IChannelDao channelDaoMock = MockRepository.GenerateMock<IChannelDao>();
                ICountryDao countryDaoMock = MockRepository.GenerateMock<ICountryDao>();
                IBookingEventDao bookingEventDaoMock = MockRepository.GenerateMock<IBookingEventDao>();
                IBookingEventDataDao bookingEventDataDaoMock = MockRepository.GenerateMock<IBookingEventDataDao>();
                IBookingItemDao bookingItemDaoMock = MockRepository.GenerateMock<IBookingItemDao>();
                IPaymentEventDao paymentEventDaoMock = MockRepository.GenerateMock<IPaymentEventDao>();
                IPaymentDao paymentDaoMock = MockRepository.GenerateMock<IPaymentDao>();
                ISettlementHelper settlementHelperMock = MockRepository.GenerateMock<ISettlementHelper>();

                bool forceProcess = true;

                Booking bookingMock = new Booking
                                          {
                                              Id = GOOD_BOOKING_ID,
                                              OrderId = GOOD_ORDER_ID,
                                              BusinessId = GOOD_BUSINESS_ID,
                                              BookingReferenceNumber = GOOD_BOOKING_REF
                                          };

                Model.Business.Business businessMock = new Model.Business.Business
                                                           {
                                                               Id = GOOD_BUSINESS_ID
                                                           };

                Order orderMock = new Order
                                      {
                                          Id = GOOD_ORDER_ID,
                                          Bookings = new List<Model.Booking.Booking> {bookingMock},
                                          ChannelId = GOOD_CHANNEL_ID
                                      };

                Channel channelMock = new Channel
                                          {
                                              Id = GOOD_CHANNEL_ID,
                                              DistributorId = GOOD_CHANNEL_BUSINESS_ID
                                          };

                Model.Business.Business channelBusinessMock = new Model.Business.Business
                                                                  {
                                                                      Id = GOOD_CHANNEL_BUSINESS_ID
                                                                  };

                Country countryMock = new Country
                                          {
                                              Id = GOOD_COUNTRY_ID,
                                              IsoChar2Code = UK_COUNTRY_CODE
                                          };

                BookingEvent bookingEventMock = new BookingEvent
                                                    {
                                                        Id = GOOD_EVENT_ID,
                                                        BookingId = GOOD_BOOKING_ID
                                                    };
                List<BookingEventData> bookingEventDataMock = new List<BookingEventData>();
                var bookingPaymentMock = new Model.Booking.Payment
                                                 {
                                                     Id = GOOD_PAYMENT_ID
                                                 };

                var paymentListMock = new List<Model.Booking.Payment> { bookingPaymentMock };

                List<BookingItem> bookingItemMock = new List<BookingItem>();
                List<PaymentEvent> paymentEventListMock = new List<PaymentEvent>();
                List<SettlementPaymentDto> settlementPaymentDtosMock = new List<SettlementPaymentDto>();

                bookingDaoMock.Expect(bd => bd.GetByKey(Arg<int>.Is.Equal(GOOD_BOOKING_ID), Arg<string>.Is.Anything)).Return(bookingMock).Repeat.Never();
                businessDaoMock.Expect(bu => bu.GetByKey(Arg<long>.Is.Equal(bookingMock.BusinessId), Arg<string>.Is.Equal(string.Empty))).Return(businessMock).Repeat.Once();
                orderDaoMock.Expect(od => od.GetOrderWithBookingsByKey(Arg<int>.Is.Equal(GOOD_ORDER_ID), Arg<string>.Is.Anything, Arg<string>.Is.Anything, Arg<string>.Is.Anything, Arg<GetOrderWithBookingsByEnum>.Is.Equal(GetOrderWithBookingsByEnum.Id))).Return(orderMock).Repeat.Once();
                orderReferenceMock.Expect(
                    or =>
                    or.GetByOrderIdAndReferenceType(Arg<int>.Is.Equal(GOOD_ORDER_ID),
                                                    Arg<ReferenceTypeEnum>.Is.Equal(ReferenceTypeEnum.EcommerceReservation)))
                                  .Return(null)
                                  .Repeat.Once();
                channelDaoMock.Expect(cd => cd.GetById(Arg<int>.Is.Equal(orderMock.ChannelId.Value)))
                    .Return(channelMock)
                    .Repeat.Once();

                businessDaoMock.Expect(bu => bu.GetByKey(Arg<long>.Is.Equal(channelMock.DistributorId.Value), Arg<string>.Is.Equal(string.Empty)))
                    .Return(channelBusinessMock)
                    .Repeat.Once();
                countryDaoMock.Expect(cod => cod.GetByBusiness(Arg<long>.Is.Equal(bookingMock.BusinessId)))
                    .Return(countryMock)
                    .Repeat.Once();

                bookingEventDaoMock.Expect(bed => bed.GetByKey(GOOD_EVENT_ID)).Return(bookingEventMock).Repeat.Once();
                bookingEventDataDaoMock.Expect(bedd => bedd.GetAllByEventId(Arg<int>.Is.Equal(bookingEventMock.Id)))
                    .Return(bookingEventDataMock)
                    .Repeat.Once();

                paymentDaoMock.Expect(pd => pd.GetPaymentsByOrder(Arg<int>.Is.Equal(GOOD_ORDER_ID)))
                    .Return(paymentListMock)
                    .Repeat.Once();


                // settlement manager mocks of inner methods
                SettlementManager settlementManagerMock = MockRepository.GeneratePartialMock<SettlementManager>();

                settlementManagerMock.Expect(
                    sm =>
                    sm.GetPaymentByTypeAndSource(Arg<IEnumerable<Model.Booking.Payment>>.List.ContainsAll(paymentListMock),
                                                 Arg<PaymentTypeEnum>.Is.Equal(PaymentTypeEnum.Payment),
                                                 Arg<PaymentSourceEnum>.Is.Equal(PaymentSourceEnum.Online)))
                    .Return(bookingPaymentMock).Repeat.Once();

                bookingItemDaoMock.Expect(bid => bid.GetByBooking(Arg<int>.Is.Equal(GOOD_BOOKING_ID)))
                    .Return(bookingItemMock)
                    .Repeat.Once();

                paymentEventDaoMock.Expect(ped => ped.GetByPaymentId(Arg<int>.Is.Equal(bookingPaymentMock.Id)))
                    .Return(paymentEventListMock)
                    .Repeat.Once();

                settlementManagerMock.Expect(
                    smm =>
                    smm.GetSettlementPayment(
                        Arg<PaymentRequest>.Matches(
                            pr => pr.BookingReferenceCode == bookingMock.BookingReferenceNumber &&
                                  pr.IsoCountryCode == countryMock.IsoChar2Code)))
                    .Return(settlementPaymentDtosMock)
                    .Repeat.Once();

                settlementManagerMock.Expect(
                    sem =>
                    sem.SetLineItemsOnTransactionModel(Arg<TransactionModel>.Is.Anything,
                                                       Arg<List<SettlementPaymentDto>>.Is.Anything,
                                                       Arg<Order>.Matches(
                                                           o =>
                                                           o.Id == orderMock.Id && o.ChannelId == orderMock.ChannelId &&
                                                           o.Bookings != null &&
                                                           o.Bookings.Count == orderMock.Bookings.Count),
                                                       Arg<List<Model.Booking.Payment>>.List.ContainsAll(paymentListMock),
                                                       Arg<List<PaymentEvent>>.Is.Anything)).Repeat.Once();
                settlementManagerMock.Expect(
                    sem =>
                    sem.SetGuestInfoOnTransactionModel(Arg<TransactionModel>.Is.Anything,
                                                       Arg<Order>.Matches(
                                                           b =>
                                                           b.Id == orderMock.Id &&
                                                           b.OrderReference == orderMock.OrderReference))).Repeat.Once();
                settlementManagerMock.Expect(
                    sem => sem.SetBookingInfoOnTransactionModel(Arg<TransactionModel>.Is.Anything,
                                                                Arg<Booking>.Matches(b =>
                                                                                     b.Id == bookingMock.Id &&
                                                                                     b.OrderId == bookingMock.OrderId &&
                                                                                     b.BusinessId ==
                                                                                     bookingMock.BusinessId &&
                                                                                     b.BookingReferenceNumber ==
                                                                                     bookingMock.BookingReferenceNumber),
                                                                Arg<Order>.Matches(
                                                                    o =>
                                                                    o.Id == orderMock.Id &&
                                                                    o.ChannelId == orderMock.ChannelId &&
                                                                    o.Bookings != null &&
                                                                    o.Bookings.Count == orderMock.Bookings.Count),
                                                                Arg<BookingEvent>.Matches(
                                                                    be =>
                                                                    be.Id == bookingEventMock.Id &&
                                                                    be.BookingId == bookingEventMock.BookingId),
                                                                Arg<List<BookingEventData>>.Is.Anything,
                                                                Arg<Model.Business.Business>.Matches(
                                                                    bu => bu.Id == businessMock.Id),
                                                                Arg<List<SettlementPaymentDto>>.Is.Anything, 
                                                                Arg<string>.Is.Anything)).Repeat.Once();

                settlementManagerMock.Expect(
                    sem => sem.SetFinancialInfoOnTransactionModel(Arg<TransactionModel>.Is.Anything,
                                                                  Arg<Booking>.Matches(b =>
                                                                                       b.Id == bookingMock.Id &&
                                                                                       b.OrderId == bookingMock.OrderId &&
                                                                                       b.BusinessId ==
                                                                                       bookingMock.BusinessId &&
                                                                                       b.BookingReferenceNumber ==
                                                                                       bookingMock
                                                                                           .BookingReferenceNumber),
                                                                  Arg<Model.Business.Business>.Matches(
                                                                      bu => bu.Id == businessMock.Id),
                                                                  Arg<Order>.Matches(
                                                                      o =>
                                                                      o.Id == orderMock.Id &&
                                                                      o.ChannelId == orderMock.ChannelId &&
                                                                      o.Bookings != null &&
                                                                      o.Bookings.Count == orderMock.Bookings.Count),
                                                                  Arg<List<BookingItem>>.Is.Anything,
                                                                  Arg<decimal>.Is.Anything)).Repeat.Once();

                settlementManagerMock.Expect(
                    sem =>
                    sem.SetPaymentInfoOnTransactionModel(Arg<TransactionModel>.Is.Anything,
                                                         Arg<Model.Booking.Payment>.Matches(p => p.Id == bookingPaymentMock.Id),
                                                         Arg<List<SettlementPaymentDto>>.Is.Anything,
                                                         Arg<Order>.Matches(
                                                                      o =>
                                                                      o.Id == orderMock.Id &&
                                                                      o.ChannelId == orderMock.ChannelId &&
                                                                      o.Bookings != null &&
                                                                      o.Bookings.Count == orderMock.Bookings.Count),
                                                         Arg<bool>.Is.Equal(forceProcess))).Repeat.Once();

                settlementManagerMock.Expect(
                    sem =>
                    sem.SetProviderDistributorInformationOnTransactionModel(Arg<TransactionModel>.Is.Anything,
                                                                            Arg<Model.Business.Business>.Matches(
                                                                                bu => bu.Id == businessMock.Id),
                                                                            Arg<Model.Business.Business>.Matches(
                                                                                chbu => chbu.Id == channelBusinessMock.Id), 
                                                                            Arg<Channel>.Is.Anything)).Repeat.Once();

                settlementManagerMock.Expect(
                    sem =>
                    sem.SetReservedProductOnTransactionModel(Arg<TransactionModel>.Is.Anything,
                                                             Arg<Booking>.Matches(b =>
                                                                                  b.Id == bookingMock.Id &&
                                                                                  b.OrderId == bookingMock.OrderId &&
                                                                                  b.BusinessId ==
                                                                                  bookingMock.BusinessId &&
                                                                                  b.BookingReferenceNumber ==
                                                                                  bookingMock
                                                                                      .BookingReferenceNumber),
                                                             Arg<Order>.Matches(
                                                                 o =>
                                                                 o.Id == orderMock.Id &&
                                                                 o.ChannelId == orderMock.ChannelId &&
                                                                 o.Bookings != null &&
                                                                 o.Bookings.Count == orderMock.Bookings.Count), 
                                                                 Arg<string>.Is.Anything)).Repeat.Once();

                settlementHelperMock.Expect(
                    helper =>
                    helper.SetMerchantInfoOnTransactionModel(Arg<TransactionModel>.Is.Anything,
                                                             Arg<Model.Booking.Booking>.Is.Anything,
                                                             Arg<Model.Business.Business>.Is.Anything,
                                                             Arg<Model.Business.Business>.Is.Anything,
                                                             Arg<List<SettlementPaymentDto>>.Is.Anything));

                settlementManagerMock.BookingDao = bookingDaoMock;
                settlementManagerMock.BookingEventDao = bookingEventDaoMock;
                settlementManagerMock.BookingEventDataDao = bookingEventDataDaoMock;
                settlementManagerMock.BookingItemDao = bookingItemDaoMock;
                settlementManagerMock.BusinessDao = businessDaoMock;
                settlementManagerMock.ChannelDao = channelDaoMock;
                settlementManagerMock.CountryDao = countryDaoMock;
                settlementManagerMock.OrderDao = orderDaoMock;
                settlementManagerMock.OrderReferenceDao = orderReferenceMock;
                settlementManagerMock.PaymentEventDao = paymentEventDaoMock;
                settlementManagerMock.PaymentDao = paymentDaoMock;
                settlementManagerMock.SettlementHelper = settlementHelperMock;

                #endregion

                // Act
                TransactionModel result = settlementManagerMock.CreateTransactionModelForInvoiceRequest(
                    GOOD_BOOKING_ID, GOOD_ORDER_ID, GOOD_EVENT_ID, forceProcess);

                // Assert
                settlementManagerMock.VerifyAllExpectations();
                bookingDaoMock.VerifyAllExpectations();
                bookingEventDaoMock.VerifyAllExpectations();
                bookingEventDataDaoMock.VerifyAllExpectations();
                bookingItemDaoMock.VerifyAllExpectations();
                businessDaoMock.VerifyAllExpectations();
                channelDaoMock.VerifyAllExpectations();
                countryDaoMock.VerifyAllExpectations();
                orderDaoMock.VerifyAllExpectations();
                orderReferenceMock.VerifyAllExpectations();
                paymentEventDaoMock.VerifyAllExpectations();
                paymentDaoMock.VerifyAllExpectations();
                settlementHelperMock.VerifyAllExpectations();
            }
            public void SetPaymentInfoOnTransactionModelWithPaymentIsSuccessful()
            {
                // ARRANGE
                const string SETTLEMENT_ACTION_CODE_PAYMENT = "PAYMENT";
                TransactionModel mockModel = new TransactionModel();
                var bookingPaymentMock = new Model.Booking.Payment();
                Model.Order.Order orderMock = new Order()
                    {
                        IntegrationType = IntegrationTypeEnum.WhiteLabel
                    };

                List<SettlementPaymentDto> settlementPaymentsMock = new List<SettlementPaymentDto>()
                    {
                        new SettlementPaymentDto
                        {
                            ActionCode = SETTLEMENT_ACTION_CODE_PAYMENT
                        }
                    };

                bool forceProcess = false;
                const string last4Digits = "0123";
                bookingPaymentMock.CardLast4Digits = last4Digits;

                SettlementManager settlementManager = new SettlementManager();

                // Act
                settlementManager.SetPaymentInfoOnTransactionModel(mockModel, bookingPaymentMock, settlementPaymentsMock, orderMock,
                                                                   forceProcess);

                // Assert
                Assert.AreEqual(last4Digits, mockModel.MaskedCardNumber, "Should have been set if settlement payment is present");
            }
            public void SetPaymentInfoOnTransactionModelWithNoPaymentNotMyWebDoesNotThrowException()
            {
                // ARRANGE
                TransactionModel mockModel = new TransactionModel();
                var bookingPaymentMock = new Model.Booking.Payment();
                List<SettlementPaymentDto> settlementPaymentsMock = new List<SettlementPaymentDto>();
                Model.Order.Order orderMock = new Order()
                {
                    IntegrationType = IntegrationTypeEnum.RequestResponse
                };
                bookingPaymentMock.CardLast4Digits = "0123";

                bool forceProcess = false;

                SettlementManager settlementManager = new SettlementManager();

                // Act
                settlementManager.SetPaymentInfoOnTransactionModel(mockModel, bookingPaymentMock, settlementPaymentsMock, orderMock,
                                                                   forceProcess);

                // Assert
                Assert.IsNull(mockModel.MaskedCardNumber, "Should not have been set if settlement payment not present and not myweb or toprooms");                
            }
            public void SetPaymentInfoOnTransactionModelWithNoPaymentAndForceProccessIsSuccessful()
            {
                // ARRANGE
                TransactionModel mockModel = new TransactionModel();
                var bookingPaymentMock = new Model.Booking.Payment();
                List<SettlementPaymentDto> settlementPaymentsMock = new List<SettlementPaymentDto>();
                Model.Order.Order orderMock = new Order();
                bool forceProcess = true;
                bookingPaymentMock.CardLast4Digits = "0123";

                SettlementManager settlementManager = new SettlementManager();

                // Act
                settlementManager.SetPaymentInfoOnTransactionModel(mockModel, bookingPaymentMock, settlementPaymentsMock, orderMock,
                                                                   forceProcess);

                // Assert
                Assert.IsNull(mockModel.MaskedCardNumber, "Should not have been set if settlement payment not present");
            }
            public void SetPaymentInfoOnTransactionModelWithNoPaymentThrowsException()
            {
                // ARRANGE
                TransactionModel mockModel = new TransactionModel();
                var bookingPaymentMock = new Model.Booking.Payment();
                List<SettlementPaymentDto> settlementPaymentsMock = new List<SettlementPaymentDto>();
                Model.Order.Order orderMock = new Order()
                    {
                        IntegrationType = IntegrationTypeEnum.Myweb
                    };
                bool forceProcess = false;

                SettlementManager settlementManager = new SettlementManager();

                // Act
                settlementManager.SetPaymentInfoOnTransactionModel(mockModel, bookingPaymentMock, settlementPaymentsMock, orderMock,
                                                                   forceProcess);

                // Assert
                // done in expected exception
            }