public StockBalanceJournalViewModel(
            IUnitOfWorkFactory unitOfWorkFactory,
            IInteractiveService interactiveService,
            INavigationManager navigation,
            ILifetimeScope autofacScope,
            FeaturesService featuresService) : base(unitOfWorkFactory, interactiveService, navigation)
        {
            AutofacScope  = autofacScope;
            JournalFilter = Filter = AutofacScope.Resolve <StockBalanceFilterViewModel>(
                new TypedParameter(typeof(JournalViewModelBase), this));

            var dataLoader = new ThreadDataLoader <StockBalanceJournalNode>(unitOfWorkFactory);

            dataLoader.AddQuery(ItemsQuery);
            DataLoader = dataLoader;

            CreateNodeActions();

            UpdateOnChanges(typeof(WarehouseOperation), typeof(Nomenclature));
            TabName = "Остатки по складу " +
                      (featuresService.Available(WorkwearFeature.Warehouses) ? Filter.Warehouse?.Name : "");

            Filter.PropertyChanged                     += (sender, e) =>
                                                TabName = "Остатки по складу " +
                                                          (featuresService.Available(WorkwearFeature.Warehouses) ? Filter.Warehouse?.Name : "");
        }
        public MessagesJournalViewModel(IUnitOfWorkFactory unitOfWorkFactory, IInteractiveService interactiveService, INavigationManager navigation, ProstorSmsService prostorSmsService, WorkOrder workOrder = null) : base(unitOfWorkFactory, interactiveService, navigation)
        {
            this.prostorSmsService = prostorSmsService ?? throw new ArgumentNullException(nameof(prostorSmsService));

            if (workOrder != null && workOrder.Id > 0)
            {
                onlyOrderId = workOrder.Id;
                TabName     = $"Cообщения по заказу №{workOrder.Id} на {workOrder.Date:D} в {workOrder.Hour} часов";
            }
            else
            {
                TabName = "Отправленные сообщения";
            }


            var dataLoader = new ThreadDataLoader <MessagesJournalNode>(unitOfWorkFactory);

            dataLoader.AddQuery(ItemsQuery);
            DataLoader = dataLoader;

            //Обход проблемы с тем что SelectionMode одновременно управляет и выбором в журнале, и самим режмиом журнала.
            //То есть создает действие выбора. Удалить после того как появится рефакторинг действий журнала.
            SelectionMode = JournalSelectionMode.Multiple;
            NodeActionsList.Clear();
            CreateActions();

            UpdateOnChanges(typeof(SentMessage));
        }
        protected EntityJournalViewModelBase(
            IUnitOfWorkFactory unitOfWorkFactory,
            IInteractiveService interactiveService,
            INavigationManager navigationManager,
            IDeleteEntityService deleteEntityService           = null,
            ICurrentPermissionService currentPermissionService = null
            ) : base(unitOfWorkFactory, interactiveService, navigationManager)
        {
            CurrentPermissionService = currentPermissionService;
            DeleteEntityService      = deleteEntityService;

            var dataLoader = new ThreadDataLoader <TNode>(unitOfWorkFactory);

            dataLoader.CurrentPermissionService = currentPermissionService;
            dataLoader.AddQuery <TEntity>(ItemsQuery);
            DataLoader = dataLoader;

            if (currentPermissionService != null && !currentPermissionService.ValidateEntityPermission(typeof(TEntity)).CanRead)
            {
                throw new AbortCreatingPageException($"У вас нет прав для просмотра документов типа: {typeof(TEntity).GetSubjectName()}", "Невозможно открыть журнал");
            }

            CreateNodeActions();

            var names = typeof(TEntity).GetSubjectNames();

            if (!String.IsNullOrEmpty(names?.NominativePlural))
            {
                TabName = names.NominativePlural.StringToTitleCase();
            }

            UpdateOnChanges(typeof(TEntity));
        }
예제 #4
0
        public FuelDocumentsJournalViewModel(
            IUnitOfWorkFactory unitOfWorkFactory,
            ICommonServices commonServices,
            IEmployeeService employeeService,
            ISubdivisionRepository subdivisionRepository,
            IFuelRepository fuelRepository,
            ICounterpartyJournalFactory counterpartyJournalFactory,
            INomenclatureSelectorFactory nomenclatureSelectorFactory,
            IEmployeeJournalFactory employeeJournalFactory,
            ISubdivisionJournalFactory subdivisionJournalFactory,
            ICarJournalFactory carJournalFactory,
            IReportViewOpener reportViewOpener,
            IFileChooserProvider fileChooserProvider,
            ExpenseCategoryJournalFilterViewModel expenseCategoryJournalFilterViewModel
            ) :
            base(unitOfWorkFactory, commonServices)
        {
            this.commonServices                        = commonServices ?? throw new ArgumentNullException(nameof(commonServices));
            this.employeeService                       = employeeService ?? throw new ArgumentNullException(nameof(employeeService));
            this.subdivisionRepository                 = subdivisionRepository ?? throw new ArgumentNullException(nameof(subdivisionRepository));
            this.fuelRepository                        = fuelRepository ?? throw new ArgumentNullException(nameof(fuelRepository));
            this.counterpartyJournalFactory            = counterpartyJournalFactory ?? throw new ArgumentNullException(nameof(counterpartyJournalFactory));
            this.nomenclatureSelectorFactory           = nomenclatureSelectorFactory ?? throw new ArgumentNullException(nameof(nomenclatureSelectorFactory));
            this.employeeJournalFactory                = employeeJournalFactory ?? throw new ArgumentNullException(nameof(employeeJournalFactory));
            _subdivisionJournalFactory                 = subdivisionJournalFactory ?? throw new ArgumentNullException(nameof(subdivisionJournalFactory));
            this.carJournalFactory                     = carJournalFactory ?? throw new ArgumentNullException(nameof(carJournalFactory));
            this.reportViewOpener                      = reportViewOpener ?? throw new ArgumentNullException(nameof(reportViewOpener));
            this.fileChooserProvider                   = fileChooserProvider ?? throw new ArgumentNullException(nameof(fileChooserProvider));
            this.expenseCategoryJournalFilterViewModel = expenseCategoryJournalFilterViewModel ?? throw new ArgumentNullException(nameof(expenseCategoryJournalFilterViewModel));


            TabName = "Журнал учета топлива";

            var loader = new ThreadDataLoader <FuelDocumentJournalNode>(unitOfWorkFactory);

            loader.MergeInOrderBy(x => x.CreationDate, true);
            DataLoader = loader;

            RegisterIncomeInvoice();
            RegisterTransferDocument();
            RegisterWriteoffDocument();

            FinishJournalConfiguration();

            UpdateOnChanges(
                typeof(FuelIncomeInvoice),
                typeof(FuelIncomeInvoiceItem),
                typeof(FuelTransferDocument),
                typeof(FuelWriteoffDocument),
                typeof(FuelWriteoffDocumentItem)
                );
        }
예제 #5
0
        public SubdivisionBalanceJournalViewModel(
            IUnitOfWorkFactory unitOfWorkFactory,
            IInteractiveService interactiveService,
            INavigationManager navigation,
            ILifetimeScope autofacScope,
            Subdivision subdivision = null) : base(unitOfWorkFactory, interactiveService, navigation)
        {
            var dataLoader = new ThreadDataLoader <EmployeeBalanceJournalNode>(unitOfWorkFactory);

            dataLoader.AddQuery(ItemsQuery);
            DataLoader    = dataLoader;
            AutofacScope  = autofacScope;
            JournalFilter = Filter = AutofacScope.Resolve <SubdivisionBalanceFilterViewModel>(
                new TypedParameter(typeof(JournalViewModelBase), this));
            Filter.Subdivision = subdivision;
            Title = subdivision != null
                        ? $"Числится за подразделением - {Filter.Subdivision.Name}"
                        : "Остатки по подразделениям";
        }
        public EmployeeBalanceJournalViewModel(
            IUnitOfWorkFactory unitOfWorkFactory,
            IInteractiveService interactiveService,
            INavigationManager navigation,
            ILifetimeScope autofacScope,
            EmployeeCard employeeCard = null) : base(unitOfWorkFactory, interactiveService, navigation)
        {
            var dataLoader = new ThreadDataLoader <EmployeeBalanceJournalNode>(unitOfWorkFactory);

            dataLoader.AddQuery(ItemsQuery);
            DataLoader    = dataLoader;
            AutofacScope  = autofacScope;
            JournalFilter = Filter = AutofacScope.Resolve <EmployeeBalanceFilterViewModel>(
                new TypedParameter(typeof(JournalViewModelBase), this));
            this.Filter.Employee = employeeCard;
            Title = employeeCard != null
                        ? $"Числится за сотрудником - {Filter.Employee.Title}"
                        : "Остатки по сотрудникам";
        }
        public NonSerialEquipmentsForRentJournalViewModel(
            EquipmentKind equipmentKind,
            IUnitOfWorkFactory unitOfWorkFactory,
            IInteractiveService interactiveService,
            INomenclatureRepository nomenclatureRepository,
            INavigationManager navigation) : base(unitOfWorkFactory, interactiveService, navigation)
        {
            _equipmentKind          = equipmentKind;
            _nomenclatureRepository = nomenclatureRepository ?? throw new ArgumentNullException(nameof(nomenclatureRepository));

            TabName = "Оборудование для аренды";

            var dataLoader = new ThreadDataLoader <NomenclatureForRentNode>(unitOfWorkFactory);

            dataLoader.AddQuery(ItemsQuery);
            DataLoader = dataLoader;

            SelectionMode = JournalSelectionMode.Single;
            CreateNodeActions();
        }
        public DriverTareMessagesJournalViewModel(
            IGtkTabsOpener gtkTabsOpener,
            IUnitOfWorkFactory unitOfWorkFactory,
            ICommonServices commonServices,
            INavigationManager navigation = null)
            : base(unitOfWorkFactory, commonServices.InteractiveService, navigation)
        {
            _gtkTabsOpener = gtkTabsOpener ?? throw new ArgumentNullException(nameof(gtkTabsOpener));

            Title = "Сообщения водителей по таре";

            var threadDataLoader = new ThreadDataLoader <DriverMessageJournalNode>(unitOfWorkFactory);

            threadDataLoader.DynamicLoadingEnabled = true;
            threadDataLoader.AddQuery(GetQuery);
            DataLoader = threadDataLoader;

            CreateNodeActions();

            StartAutoRefresh();
        }
        public StockMovmentsJournalViewModel(
            IUnitOfWorkFactory unitOfWorkFactory,
            IInteractiveService interactiveService,
            INavigationManager navigation,
            ILifetimeScope autofacScope,
            OpenStockDocumentsModel openDocuments) : base(unitOfWorkFactory, interactiveService, navigation)
        {
            AutofacScope       = autofacScope;
            this.openDocuments = openDocuments ?? throw new ArgumentNullException(nameof(openDocuments));
            JournalFilter      = Filter = AutofacScope.Resolve <StockMovementsFilterViewModel>
                                              (new TypedParameter(typeof(JournalViewModelBase), this));

            var dataLoader = new ThreadDataLoader <StockMovmentsJournalNode>(unitOfWorkFactory);

            dataLoader.AddQuery(ItemsQuery);
            DataLoader = dataLoader;

            CreateNodeActions();

            UpdateOnChanges(typeof(WarehouseOperation));
            TabName = "Складские движения";
        }
        public StockDocumentsJournalViewModel(
            IUnitOfWorkFactory unitOfWorkFactory,
            IInteractiveService interactiveService,
            INavigationManager navigation,
            OpenStockDocumentsModel openStockDocumentsModel,
            ILifetimeScope autofacScope,
            FeaturesService featuresService,
            ICurrentPermissionService currentPermissionService = null,
            IDeleteEntityService deleteEntityService           = null)
            : base(unitOfWorkFactory, interactiveService, navigation)
        {
            Title                        = "Журнал документов";
            AutofacScope                 = autofacScope;
            CurrentPermissionService     = currentPermissionService;
            DeleteEntityService          = deleteEntityService;
            this.openStockDocumentsModel = openStockDocumentsModel ?? throw new ArgumentNullException(nameof(openStockDocumentsModel));
            FeaturesService              = featuresService ?? throw new ArgumentNullException(nameof(featuresService));
            JournalFilter                = Filter = AutofacScope.Resolve <StockDocumentsFilterViewModel>(
                new TypedParameter(typeof(JournalViewModelBase), this));

            var dataLoader = new ThreadDataLoader <StockDocumentsJournalNode>(unitOfWorkFactory);

            dataLoader.AddQuery(QueryIncomeDoc);
            dataLoader.AddQuery(QueryExpenseDoc);
            dataLoader.AddQuery(QueryCollectiveExpenseDoc);
            dataLoader.AddQuery(QueryWriteoffDoc);
            dataLoader.AddQuery(QueryTransferDoc);
            dataLoader.AddQuery(QueryCompletionDoc);
            dataLoader.MergeInOrderBy(x => x.Date, true);
            dataLoader.MergeInOrderBy(x => x.CreationDate, true);
            DataLoader = dataLoader;

            CreateNodeActions();
            CreateDocumentsActions();

            UpdateOnChanges(typeof(Expense), typeof(CollectiveExpense),
                            typeof(Income), typeof(Writeoff), typeof(Transfer), typeof(Completion));
        }
예제 #11
0
        public void CorrectUnionTwoQueryCase()
        {
            InitialiseNHibernate(typeof(Document1).Assembly);
            NewSessionWithSameDB();

            using (var uow = UnitOfWorkFactory.CreateWithoutRoot()) {
                var listToSave = new List <IDomainObject> {
                    new Document1(new DateTime(2019, 1, 1)),
                    new Document1(new DateTime(2019, 1, 1)),
                    new Document1(new DateTime(2019, 1, 1)),
                    new Document1(new DateTime(2019, 1, 1)),
                    new Document2(new DateTime(2018, 1, 1)),
                    new Document2(new DateTime(2017, 1, 1)),
                    new Document1(new DateTime(2016, 1, 1)),
                    new Document2(new DateTime(2017, 5, 23)),
                };

                foreach (var doc in listToSave)
                {
                    uow.Save(doc);
                }
                uow.Commit();


                ManualResetEvent oSignalEvent          = new ManualResetEvent(false);
                Exception        treadException        = null;
                bool             itemsListUpdatedRised = false;

                //Настраиваем загрузчик
                var dataLoader = new ThreadDataLoader <DocumentJournalNode>(UnitOfWorkFactory);
                dataLoader.PageSize = 2;

                dataLoader.AddQuery(GetDocument1Query);

                dataLoader.AddQuery(GetDocument2Query);

                dataLoader.MergeInOrderBy((doc) => doc.Date, true);

                dataLoader.LoadError += (sender, e) => {
                    Console.WriteLine("LoadError");
                    treadException = e.Exception;
                    oSignalEvent.Set();
                };
                dataLoader.ItemsListUpdated += (sender, e) => {
                    Console.WriteLine("ItemsListUpdated");
                    itemsListUpdatedRised = true;
                };
                dataLoader.LoadingStateChanged += (sender, e) => {
                    Console.WriteLine($"LoadingStateChanged {e.LoadingState}");
                    if (e.LoadingState == LoadingState.Idle)
                    {
                        oSignalEvent.Set();
                    }
                };

                //Загружаем данные
                dataLoader.LoadData(false);
                Assert.That(dataLoader.LoadInProgress, Is.True);
                oSignalEvent.WaitOne();
                oSignalEvent.Reset();
                if (treadException != null)
                {
                    throw treadException;
                }
                Assert.That(itemsListUpdatedRised, Is.EqualTo(true));
                //Предпологаем что загрузили всего 2 строки, в журнале у нас размер страницы 2.
                var result = (IList <DocumentJournalNode>)dataLoader.Items;
                Assert.That(result.Count, Is.GreaterThanOrEqualTo(2));
                Assert.That(result[0].Date, Is.EqualTo(new DateTime(2019, 1, 1)));
                Assert.That(result[1].Date, Is.EqualTo(new DateTime(2019, 1, 1)));

                //Загружаем следующую партию.
                itemsListUpdatedRised = false;
                dataLoader.LoadData(true);
                oSignalEvent.WaitOne();
                oSignalEvent.Reset();
                //Предпологаем что загрузили еще минимум 2 строки.
                Assert.That(itemsListUpdatedRised, Is.EqualTo(true));
                result = (IList <DocumentJournalNode>)dataLoader.Items;
                Assert.That(result.Count, Is.GreaterThanOrEqualTo(4));
                Assert.That(result[0].Date, Is.EqualTo(new DateTime(2019, 1, 1)));
                Assert.That(result[1].Date, Is.EqualTo(new DateTime(2019, 1, 1)));
                Assert.That(result[2].Date, Is.EqualTo(new DateTime(2019, 1, 1)));
                Assert.That(result[3].Date, Is.EqualTo(new DateTime(2019, 1, 1)));

                //Загружаем следующую партию.
                itemsListUpdatedRised = false;
                dataLoader.LoadData(true);
                oSignalEvent.WaitOne();
                oSignalEvent.Reset();

                Assert.That(itemsListUpdatedRised, Is.EqualTo(true));
                result = (IList <DocumentJournalNode>)dataLoader.Items;
                Assert.That(result.Count, Is.GreaterThanOrEqualTo(6));
                Assert.That(result[0].Date, Is.EqualTo(new DateTime(2019, 1, 1)));
                Assert.That(result[1].Date, Is.EqualTo(new DateTime(2019, 1, 1)));
                Assert.That(result[2].Date, Is.EqualTo(new DateTime(2019, 1, 1)));
                Assert.That(result[3].Date, Is.EqualTo(new DateTime(2019, 1, 1)));
                Assert.That(result[4].Date, Is.EqualTo(new DateTime(2018, 1, 1)));
                Assert.That(result[5].Date, Is.EqualTo(new DateTime(2017, 5, 23)));
            }
        }
예제 #12
0
        public void AcssesPermissionTestCase()
        {
            InitialiseNHibernate(typeof(Document1).Assembly);
            NewSessionWithSameDB();

            using (var uow = UnitOfWorkFactory.CreateWithoutRoot()) {
                var listToSave = new List <IDomainObject> {
                    new Document1(new DateTime(2019, 1, 1)),
                    new Document2(new DateTime(2017, 5, 23)),
                    new Document1(new DateTime(2019, 1, 1)),
                };

                foreach (var doc in listToSave)
                {
                    uow.Save(doc);
                }
                uow.Commit();

                ManualResetEvent oSignalEvent          = new ManualResetEvent(false);
                Exception        treadException        = null;
                bool             itemsListUpdatedRised = false;

                var deniedRead = Substitute.For <IPermissionResult>();
                deniedRead.CanRead.Returns(false);

                var allowedRead = Substitute.For <IPermissionResult>();
                allowedRead.CanRead.Returns(true);

                var permissionService = Substitute.For <ICurrentPermissionService>();
                permissionService.ValidateEntityPermission(typeof(Document1)).Returns(deniedRead);
                permissionService.ValidateEntityPermission(typeof(Document2)).Returns(allowedRead);

                //Настраиваем загрузчик
                var dataLoader = new ThreadDataLoader <DocumentJournalNode>(UnitOfWorkFactory);
                dataLoader.CurrentPermissionService = permissionService;

                dataLoader.AddQuery(GetDocument1Query);

                dataLoader.AddQuery(GetDocument2Query);

                dataLoader.MergeInOrderBy((doc) => doc.Date, true);

                dataLoader.LoadError += (sender, e) => {
                    treadException = e.Exception;
                    oSignalEvent.Set();
                };
                dataLoader.ItemsListUpdated += (sender, e) => {
                    itemsListUpdatedRised = true;
                };
                dataLoader.LoadingStateChanged += (sender, e) => {
                    if (e.LoadingState == LoadingState.Idle)
                    {
                        oSignalEvent.Set();
                    }
                };

                //Загружаем данные
                dataLoader.LoadData(false);
                Assert.That(dataLoader.LoadInProgress, Is.True);
                oSignalEvent.WaitOne();
                oSignalEvent.Reset();
                if (treadException != null)
                {
                    throw treadException;
                }

                Assert.That(itemsListUpdatedRised, Is.EqualTo(true));
                var result = (IList <DocumentJournalNode>)dataLoader.Items;
                Assert.That(result[0].Date, Is.EqualTo(new DateTime(2017, 5, 23)));
                Assert.That(result.Count, Is.EqualTo(1));
            }
        }