public void Test5()
        {
            using (var session = _sessionFactory.OpenSession())
                using (var transaction = session.BeginTransaction())
                {
                    var fakeSession = new SessionDecorator(session)
                    {
                        DoNotDispose = true
                    };
                    var mockSessionFactory = new Mock <ISessionFactory>();
                    mockSessionFactory.Setup(i => i.OpenSession()).Returns(fakeSession);

                    #region populate test data

                    var tstMandant = session.Query <WmsMandant>().Single(i => i.PartnerCode == "TST");

                    // создаем менеджер маршрутов
                    var mgrRoute = new YMgRoute
                    {
                        Partner            = tstMandant,
                        MgRouteCreateRoute = false,
                        MgRouteName        = "Mgr for autotests",
                        MgRouteNumber      = "AutoTestRouteNumber"
                    };
                    session.Save(mgrRoute);

                    // создаем маршрут
                    var route = new YRoute()
                    {
                        Partner     = tstMandant,
                        MgRoute     = mgrRoute,
                        RouteDate   = DateTime.Now,
                        RouteNumber = mgrRoute.MgRouteNumber
                    };
                    session.Save(route);

                    // создаем маршрут
                    var routeChange = new YRoute()
                    {
                        Partner     = tstMandant,
                        MgRoute     = mgrRoute,
                        RouteDate   = route.RouteDate.AddDays(1),
                        RouteNumber = "TestRoute"
                    };
                    session.Save(routeChange);

                    // создаем накладную с плановой датой отгрузки
                    var owb = new WmsOWB
                    {
                        Partner        = tstMandant,
                        OWBName        = "Owb for testing routes",
                        OWBProductNeed = "NOACTIVATE",
                        OWBType        = "OWBTYPENORMAL",
                        OWBRoutePlan   = route.RouteID,
                        OWBOutDatePlan = route.RouteDate,
                        Status         = session.Query <WmsOWBStatus>().Single(i => i.StatusCode == "OWB_NONE")
                    };
                    session.Save(owb);

                    session.Flush();

                    #endregion

                    try
                    {
                        // запускаем
                        var api = new WmsAPI(mockSessionFactory.Object, _container.Resolve <IWmsXmlConverter>(), _container.Resolve <IWorkflowLoader>());
                        api.ChangeOwbRoute(owb.OWBID, routeChange.RouteID, route.RouteDate, false, true);
                    }
                    catch (OracleException ex)
                    {
                        if (!string.IsNullOrEmpty(ex.Message))
                        {
                            var errorText = ex.Message.Split(new[] { "\n" }, StringSplitOptions.None);
                            errorText[0].ShouldBeEquivalentTo(string.Format("ORA-20801: В накладной с ID = {0} уже проставлен маршрут и он отличается от переданного/расчитанного({1})", owb.OWBID, routeChange.RouteID));
                        }
                        else
                        {
                            throw (ex);
                        }
                    }
                    transaction.Rollback();
                }
        }
        public static void PopulateTestData(ISession session, out WmsOWB owb, out DateTime expectedDate, out YMgRoute mgrRoute)
        {
            var tstMandant = session.Query <WmsMandant>().Single(i => i.PartnerCode == "TST");

            // создаем накладную с плановой датой отгрузки
            owb = new WmsOWB
            {
                Partner        = tstMandant,
                OWBName        = "Owb for testing routes",
                OWBProductNeed = "NOACTIVATE",
                OWBType        = "OWBTYPENORMAL",
                Status         = session.Query <WmsOWBStatus>().Single(i => i.StatusCode == "OWB_CREATED")
            };
            session.Save(owb);

            // проверяем если ли записи календаря на даты расчета (+2 дня)
            var exprectedTime    = TimeSpan.FromHours(15);
            int timeToPrepare    = 2880; //min
            int tmpTimeToPrepare = timeToPrepare;
            var dateIdx          = 0;

            while (tmpTimeToPrepare > 0)
            {
                var tmpDate = GetOrAddCalendarDate(owb.DateIns.Value.Date.AddDays(dateIdx), session);
                // для первой даты вычитаем кол-во минут оставшегося раб.дня
                if (dateIdx == 0)
                {
                    if (owb.DateIns.Value < tmpDate.CalendarTimeTill)
                    {
                        tmpTimeToPrepare -= (int)(tmpDate.CalendarTimeTill - owb.DateIns.Value).TotalMinutes;
                    }
                }
                else
                {
                    tmpTimeToPrepare -= (int)(tmpDate.CalendarTimeTill - tmpDate.CalendarTimeFrom).TotalMinutes;
                }
                dateIdx++;
            }

            expectedDate = owb.DateIns.Value.AddDays(--dateIdx);

            //TODO: Разаобраться зачем нужен код внизу
            //if (expectedDate > expectedDate.Date.Add(exprectedTime))
            //{
            //    var tmpDate = GetOrAddCalendarDate(expectedDate.Date.AddDays(dateIdx), session);
            //    expectedDate = expectedDate.AddDays(1);
            //}
            //else
            //    expectedDate = expectedDate.Date.Add(exprectedTime);

            // создаем выбор даты
            // пока работаем с имеющимся, когда появится возможность работать с CPV - перейти на создание здесь
            var routeDateSelect = new YMgRouteDateSelect
            {
                Partner = tstMandant,
                MgRouteDateSelectDateSource = MgRouteDateSelectDateSources.OwbDateIns,
                Priority = 1
            };

            session.Save(routeDateSelect);

            // добавляем CPV
            var cpvRouteDSL1 = new YMgRouteDateSelectCPV()
            {
                CustomParam       = session.Get <WmsCustomParam>("RouteDSL1"),
                MGROUTEDATESELECT = routeDateSelect
            };

            session.Save(cpvRouteDSL1);

            var cpvRouteDSUseWeekendL2 = new YMgRouteDateSelectCPV
            {
                CustomParam       = session.Get <WmsCustomParam>("RouteDSUseWeekendL2"),
                MGROUTEDATESELECT = routeDateSelect,
                Parent            = cpvRouteDSL1,
                CPVValue          = "0"
            };

            session.Save(cpvRouteDSUseWeekendL2);

            var cpvRouteDSTimeConstL2 = new YMgRouteDateSelectCPV
            {
                CustomParam       = session.Get <WmsCustomParam>("RouteDSTimeConstL2"),
                MGROUTEDATESELECT = routeDateSelect,
                Parent            = cpvRouteDSL1,
                CPVValue          = expectedDate.ToString("yyyyMMdd HH:mm:ss")
            };

            session.Save(cpvRouteDSTimeConstL2);

            var cpvRouteDSIncrementL2 = new YMgRouteDateSelectCPV
            {
                CustomParam       = session.Get <WmsCustomParam>("RouteDSIncrementL2"),
                MGROUTEDATESELECT = routeDateSelect,
                Parent            = cpvRouteDSL1,
                CPVValue          = timeToPrepare.ToString()
            };

            session.Save(cpvRouteDSIncrementL2);

            var cpvRouteDSDateSourceL2 = new YMgRouteDateSelectCPV
            {
                CustomParam       = session.Get <WmsCustomParam>("RouteDSDateSourceL2"),
                MGROUTEDATESELECT = routeDateSelect,
                Parent            = cpvRouteDSL1,
                CPVValue          = "DATEINS"
            };

            session.Save(cpvRouteDSDateSourceL2);

            // создаем менеджер маршрутов
            mgrRoute = new YMgRoute
            {
                Partner            = tstMandant,
                MgRouteCreateRoute = false,
                MgRouteName        = "Mgr for autotests",
                MgRouteNumber      = "AutoTestRouteNumber"
            };
            session.Save(mgrRoute);

            // создаем выбор менеджера маршрутов
            var routeSelect = new YMgRouteSelect
            {
                Partner  = tstMandant,
                MgRoute  = mgrRoute,
                Priority = 1
            };

            session.Save(routeSelect);


            // создаем маршрут (создание из API проверить не получится, т.к. там, для блокировки параллельного создания, используются атомарные транзакции
            var route = new YRoute()
            {
                Partner     = tstMandant,
                MgRoute     = mgrRoute,
                RouteDate   = expectedDate,
                RouteNumber = mgrRoute.MgRouteNumber // mgrRoute.MgRouteNumber
            };

            session.Save(route);

            session.Flush();

            // перечитываем DateSelect
            session.Refresh(routeDateSelect);
        }