Exemplo n.º 1
0
        public void HandleDelete_CanDeleteEmployeeTest()
        {
            var ask = Substitute.For <IInteractiveQuestion>();

            ask.Question(string.Empty).ReturnsForAnyArgs(true);

            using (var uow = UnitOfWorkFactory.CreateWithoutRoot("Тест на обработку удаления сотрудника")) {
                BuisnessLogicGlobalEventHandler.Init(ask, UnitOfWorkFactory);

                var nomenclatureType = new ItemsType();
                nomenclatureType.Name = "Тестовый тип номенклатуры";
                uow.Save(nomenclatureType);

                var nomenclature = new Nomenclature();
                nomenclature.Type = nomenclatureType;
                uow.Save(nomenclature);

                var protectionTools = new ProtectionTools();
                protectionTools.Name = "СИЗ для тестирования";
                protectionTools.AddNomeclature(nomenclature);
                uow.Save(protectionTools);

                var norm     = new Norm();
                var normItem = norm.AddItem(protectionTools);
                normItem.Amount      = 1;
                normItem.NormPeriod  = NormPeriodType.Month;
                normItem.PeriodCount = 2;
                uow.Save(norm);

                var employee = new EmployeeCard();
                uow.Save(employee);

                var warehouseOperation = new WarehouseOperation();
                var expenseOp          = new EmployeeIssueOperation();
                expenseOp.OperationTime      = warehouseOperation.OperationTime = new DateTime(2019, 1, 1);
                expenseOp.ExpiryByNorm       = new DateTime(2019, 4, 1);
                expenseOp.ProtectionTools    = protectionTools;
                expenseOp.Employee           = employee;
                expenseOp.Nomenclature       = warehouseOperation.Nomenclature = nomenclature;
                expenseOp.NormItem           = normItem;
                warehouseOperation.Amount    = expenseOp.Issued = 1;
                expenseOp.WarehouseOperation = warehouseOperation;
                uow.Save(nomenclature);
                uow.Save(normItem);
                uow.Save(warehouseOperation);
                uow.Save(expenseOp);
                uow.Commit();

                //FIXME Временно чтобы переделака не вызвала конфликт мержа в 2.4
                Configure.ConfigureDeletion();
                var deletion = new DeleteCore(DeleteConfig.Main, uow);
                deletion.PrepareDeletion(typeof(EmployeeCard), employee.Id, CancellationToken.None);
                deletion.RunDeletion(CancellationToken.None);
            }
        }
        protected IQueryOver <WarehouseOperation> ItemsQuery(IUnitOfWork uow)
        {
            StockBalanceJournalNode resultAlias = null;

            WarehouseOperation warehouseExpenseOperationAlias = null;
            WarehouseOperation warehouseIncomeOperationAlias  = null;
            WarehouseOperation warehouseOperationAlias        = null;

            Nomenclature     nomenclatureAlias = null;
            ItemsType        itemTypesAlias    = null;
            MeasurementUnits unitsAlias        = null;
            Size             sizeAlias         = null;
            Size             heightAlias       = null;

            // null == null => null              null <=> null => true
            var expenseQuery = QueryOver.Of(() => warehouseExpenseOperationAlias)
                               .Where(() => warehouseExpenseOperationAlias.Nomenclature.Id == nomenclatureAlias.Id &&
                                      (warehouseExpenseOperationAlias.WearSize.Id == sizeAlias.Id ||
                                       warehouseOperationAlias.WearSize == null && sizeAlias == null) &&
                                      (warehouseExpenseOperationAlias.Height.Id == heightAlias.Id ||
                                       warehouseOperationAlias.Height == null && heightAlias == null) &&
                                      warehouseExpenseOperationAlias.WearPercent == warehouseOperationAlias.WearPercent)
                               .Where(e => e.OperationTime < Filter.Date.AddDays(1));

            if (Filter.Warehouse == null)
            {
                expenseQuery.Where(x => x.ExpenseWarehouse != null);
            }
            else
            {
                expenseQuery.Where(x => x.ExpenseWarehouse == Filter.Warehouse);
            }

            expenseQuery.Select(Projections
                                .Sum(Projections
                                     .Property(() => warehouseExpenseOperationAlias.Amount)));

            var incomeSubQuery = QueryOver.Of(() => warehouseIncomeOperationAlias)
                                 .Where(() => warehouseIncomeOperationAlias.Nomenclature.Id == nomenclatureAlias.Id &&
                                        (warehouseIncomeOperationAlias.WearSize.Id == sizeAlias.Id ||
                                         warehouseOperationAlias.WearSize == null && sizeAlias == null) &&
                                        (warehouseIncomeOperationAlias.Height.Id == heightAlias.Id ||
                                         warehouseOperationAlias.Height == null && heightAlias == null) &&
                                        warehouseIncomeOperationAlias.WearPercent == warehouseOperationAlias.WearPercent)
                                 .Where(e => e.OperationTime < Filter.Date.AddDays(1));

            if (Filter.Warehouse == null)
            {
                incomeSubQuery.Where(x => x.ReceiptWarehouse != null);
            }
            else
            {
                incomeSubQuery.Where(x => x.ReceiptWarehouse == Filter.Warehouse);
            }

            incomeSubQuery.Select(Projections
                                  .Sum(Projections
                                       .Property(() => warehouseIncomeOperationAlias.Amount)));

            var projection = Projections.SqlFunction(
                new SQLFunctionTemplate(NHibernateUtil.Int32, "( IFNULL(?1, 0) - IFNULL(?2, 0) )"),
                NHibernateUtil.Int32,
                Projections.SubQuery(incomeSubQuery),
                Projections.SubQuery(expenseQuery)
                );

            var queryStock = uow.Session.QueryOver(() => warehouseOperationAlias);

            queryStock.Where(Filter.ShowNegativeBalance
                                ? Restrictions.Not(Restrictions.Eq(projection, 0))
                                : Restrictions.Gt(projection, 0));

            if (Filter.ItemTypeCategory != null)
            {
                queryStock.Where(() => itemTypesAlias.Category == Filter.ItemTypeCategory);
            }

            //Если у нас выключена способность показывать общие по всем складам остатки.
            //Но не указан склад мы должны показывать пустую таблицу.
            //Это заведомо ложное условие.
            if (ShowSummary == false && Filter.Warehouse == null)
            {
                queryStock.Where(x => x.Id == -1);
            }

            if (Filter.ProtectionTools != null)
            {
                queryStock.Where(x
                                 => x.Nomenclature.IsIn(Filter.ProtectionTools.MatchedNomenclatures.ToArray()));
            }

            return(queryStock
                   .JoinAlias(() => warehouseOperationAlias.Nomenclature, () => nomenclatureAlias)
                   .JoinAlias(() => nomenclatureAlias.Type, () => itemTypesAlias)
                   .JoinAlias(() => itemTypesAlias.Units, () => unitsAlias)
                   .JoinAlias(() => warehouseOperationAlias.WearSize, () => sizeAlias, JoinType.LeftOuterJoin)
                   .JoinAlias(() => warehouseOperationAlias.Height, () => heightAlias, JoinType.LeftOuterJoin)
                   .Where(GetSearchCriterion(
                              () => nomenclatureAlias.Number,
                              () => nomenclatureAlias.Name,
                              () => sizeAlias.Name,
                              () => heightAlias.Name))

                   .SelectList(list => list
                               .SelectGroup(() => nomenclatureAlias.Id).WithAlias(() => resultAlias.Id)
                               .Select(() => nomenclatureAlias.Name).WithAlias(() => resultAlias.NomenclatureName)
                               .Select(() => nomenclatureAlias.Number).WithAlias(() => resultAlias.NomenclatureNumber)
                               .Select(() => unitsAlias.Name).WithAlias(() => resultAlias.UnitsName)
                               .SelectGroup(() => sizeAlias.Name).WithAlias(() => resultAlias.SizeName)
                               .SelectGroup(() => heightAlias.Name).WithAlias(() => resultAlias.HeightName)
                               .SelectGroup(() => sizeAlias.Id).WithAlias(() => resultAlias.SizeId)
                               .SelectGroup(() => heightAlias.Id).WithAlias(() => resultAlias.HeightId)
                               .SelectGroup(() => warehouseOperationAlias.WearPercent).WithAlias(() => resultAlias.WearPercent)
                               .Select(projection).WithAlias(() => resultAlias.Amount)
                               )
                   .OrderBy(() => nomenclatureAlias.Name).Asc
                   .ThenBy(Projections.SqlFunction(
                               new SQLFunctionTemplate(
                                   NHibernateUtil.String,
                                   "CAST(SUBSTRING_INDEX(?1, '-', 1) AS DECIMAL(5,1))"),
                               NHibernateUtil.String,
                               Projections.Property(() => sizeAlias.Name))).Asc
                   .ThenBy(Projections.SqlFunction(
                               new SQLFunctionTemplate(
                                   NHibernateUtil.String,
                                   "CAST(SUBSTRING_INDEX(?1, '-', 1) AS DECIMAL(5,1))"),
                               NHibernateUtil.String,
                               Projections.Property(() => heightAlias.Name))).Asc
                   .TransformUsing(Transformers.AliasToBean <StockBalanceJournalNode>()));
        }
Exemplo n.º 3
0
        public IQueryOver <SubdivisionIssueOperation> ItemsQuery(IUnitOfWork unitOfWork)
        {
            SubdivisionBalanceJournalNode resultAlias         = null;
            SubdivisionIssueOperation     issueOperationAlias = null;
            Nomenclature              nomenclatureAlias       = null;
            ItemsType                 itemTypesAlias          = null;
            MeasurementUnits          unitsAlias = null;
            SubdivisionIssueOperation removeIssueOperationAlias = null;
            WarehouseOperation        warehouseOperationAlias   = null;
            Subdivision               subdivisionAlias          = null;

            var expense = unitOfWork.Session.QueryOver(() => issueOperationAlias);

            if (Filter.Subdivision != null)
            {
                expense.Where(e => e.Subdivision == Filter.Subdivision);
            }

            var subQueryRemove = QueryOver.Of(() => removeIssueOperationAlias)
                                 .Where(() => removeIssueOperationAlias.IssuedOperation == issueOperationAlias)
                                 .Select(Projections.Sum <SubdivisionIssueOperation>(o => o.Returned));

            var balance = Projections.SqlFunction(
                new SQLFunctionTemplate(NHibernateUtil.Int32, "( IFNULL(?1, 0) - IFNULL(?2, 0) )"),
                NHibernateUtil.Int32,
                Projections.Property(() => issueOperationAlias.Issued),
                Projections.SubQuery(subQueryRemove));

            if (Filter.Subdivision != null)
            {
                expense
                .JoinAlias(() => issueOperationAlias.Nomenclature, () => nomenclatureAlias)
                .JoinAlias(() => nomenclatureAlias.Type, () => itemTypesAlias)
                .JoinAlias(() => itemTypesAlias.Units, () => unitsAlias)
                .JoinAlias(() => issueOperationAlias.WarehouseOperation, () => warehouseOperationAlias)
                .JoinAlias(() => issueOperationAlias.Subdivision, () => subdivisionAlias)
                .Where(e => e.AutoWriteoffDate == null || e.AutoWriteoffDate > Filter.Date)
                .Where(Restrictions.Not(Restrictions.Eq(balance, 0)))
                .SelectList(list => list
                            .SelectGroup(() => issueOperationAlias.Id).WithAlias(() => resultAlias.Id)
                            .Select(() => nomenclatureAlias.Name).WithAlias(() => resultAlias.NomenclatureName)
                            .Select(() => unitsAlias.Name).WithAlias(() => resultAlias.UnitsName)
                            .Select(() => issueOperationAlias.WearPercent).WithAlias(() => resultAlias.WearPercent)
                            .Select(() => issueOperationAlias.OperationTime).WithAlias(() => resultAlias.IssuedDate)
                            .Select(() => issueOperationAlias.ExpiryOn).WithAlias(() => resultAlias.ExpiryDate)
                            .Select(() => subdivisionAlias.Name).WithAlias(() => resultAlias.SubdivisionName)
                            .Select(balance).WithAlias(() => resultAlias.Balance));
            }
            else
            {
                expense
                .JoinAlias(() => issueOperationAlias.Nomenclature, () => nomenclatureAlias)
                .JoinAlias(() => nomenclatureAlias.Type, () => itemTypesAlias)
                .JoinAlias(() => itemTypesAlias.Units, () => unitsAlias)
                .JoinAlias(() => issueOperationAlias.WarehouseOperation, () => warehouseOperationAlias)
                .JoinAlias(() => issueOperationAlias.Subdivision, () => subdivisionAlias)
                .Where(e => e.AutoWriteoffDate == null || e.AutoWriteoffDate > Filter.Date)
                .Where(Restrictions.Not(Restrictions.Eq(balance, 0)))
                .SelectList(list => list
                            .Select(() => issueOperationAlias.Id).WithAlias(() => resultAlias.Id)
                            .Select(() => nomenclatureAlias.Name).WithAlias(() => resultAlias.NomenclatureName)
                            .Select(() => unitsAlias.Name).WithAlias(() => resultAlias.UnitsName)
                            .Select(() => issueOperationAlias.WearPercent).WithAlias(() => resultAlias.WearPercent)
                            .Select(() => issueOperationAlias.OperationTime).WithAlias(() => resultAlias.IssuedDate)
                            .Select(() => issueOperationAlias.ExpiryOn).WithAlias(() => resultAlias.ExpiryDate)
                            .Select(() => subdivisionAlias.Name).WithAlias(() => resultAlias.SubdivisionName)
                            .Select(balance).WithAlias(() => resultAlias.Balance));
                expense = expense.OrderBy(() => subdivisionAlias.Name).Asc;
            }
            return(expense.TransformUsing(Transformers.AliasToBean <SubdivisionBalanceJournalNode>()));
        }
        protected IQueryOver <WarehouseOperation> ItemsQuery(IUnitOfWork uow)
        {
            StockMovmentsJournalNode resultAlias = null;

            WarehouseOperation warehouseOperationAlias = null;

            ExpenseItem            expenseItemAlias            = null;
            IncomeItem             incomeItemAlias             = null;
            TransferItem           transferItemAlias           = null;
            CollectiveExpenseItem  collectiveExpenseItemAlias  = null;
            WriteoffItem           writeOffItemAlias           = null;
            EmployeeCard           employeeCardAlias           = null;
            EmployeeIssueOperation employeeIssueOperationAlias = null;
            CompletionResultItem   completionResultItemAlias   = null;
            CompletionSourceItem   completionSourceItemAlias   = null;

            Nomenclature     nomenclatureAlias = null;
            ItemsType        itemTypesAlias    = null;
            MeasurementUnits unitsAlias        = null;
            Size             sizeAlias         = null;
            Size             heightAlias       = null;

            var queryStock = uow.Session.QueryOver(() => warehouseOperationAlias)
                             .JoinAlias(() => warehouseOperationAlias.WearSize, () => sizeAlias, JoinType.LeftOuterJoin)
                             .JoinAlias(() => warehouseOperationAlias.Height, () => heightAlias, JoinType.LeftOuterJoin);

            if (Filter.Warehouse != null)
            {
                queryStock.Where(x => x.ReceiptWarehouse == Filter.Warehouse || x.ExpenseWarehouse == Filter.Warehouse);
            }

            if (Filter.StartDate.HasValue)
            {
                queryStock.Where(x => x.OperationTime >= Filter.StartDate.Value);
            }

            if (Filter.EndDate.HasValue)
            {
                queryStock.Where(x => x.OperationTime < Filter.EndDate.Value.AddDays(1));
            }

            if (Filter.StockPosition != null)
            {
                queryStock.Where(x => x.Nomenclature == Filter.StockPosition.Nomenclature);
                queryStock.Where(x => x.WearSize == Filter.StockPosition.WearSize);
                queryStock.Where(x => x.Height == Filter.StockPosition.Height);
                queryStock.Where(x => x.WearPercent == Filter.StockPosition.WearPercent);
            }

            if (Filter.Nomenclature != null)
            {
                queryStock.Where(x => x.Nomenclature == Filter.Nomenclature);
            }

            if (Filter.Size != null)
            {
                queryStock.Where(x => x.WearSize.Id == Filter.Size.Id);
            }

            if (Filter.Height != null)
            {
                queryStock.Where(x => x.Height.Id == Filter.Height.Id);
            }

            IProjection receiptProjection, expenseProjection;

            if (Filter.Warehouse != null)
            {
                receiptProjection = Projections.Conditional(
                    Restrictions.Eq(Projections
                                    .Property <WarehouseOperation>(x => x.ReceiptWarehouse.Id), Filter.Warehouse.Id),
                    Projections.Constant(true),
                    Projections.Constant(false)
                    );
                expenseProjection = Projections.Conditional(
                    Restrictions.Eq(Projections
                                    .Property <WarehouseOperation>(x => x.ExpenseWarehouse.Id), Filter.Warehouse.Id),
                    Projections.Constant(true),
                    Projections.Constant(false)
                    );

                switch (Filter.Direction)
                {
                case DirectionOfOperation.expense:
                    queryStock.Where(x => x.ExpenseWarehouse.Id == Filter.Warehouse.Id);
                    break;

                case DirectionOfOperation.receipt:
                    queryStock.Where(x => x.ReceiptWarehouse.Id == Filter.Warehouse.Id);
                    break;
                }
            }
            else
            {
                receiptProjection = Projections.Conditional(
                    Restrictions.IsNotNull(Projections
                                           .Property <WarehouseOperation>(x => x.ReceiptWarehouse.Id)),
                    Projections.Constant(true),
                    Projections.Constant(false)
                    );
                expenseProjection = Projections.Conditional(
                    Restrictions.IsNotNull(Projections
                                           .Property <WarehouseOperation>(x => x.ExpenseWarehouse.Id)),
                    Projections.Constant(true),
                    Projections.Constant(false)
                    );

                switch (Filter.Direction)
                {
                case DirectionOfOperation.expense:
                    queryStock.Where(x => x.ReceiptWarehouse == null);
                    break;

                case DirectionOfOperation.receipt:
                    queryStock.Where(x => x.ExpenseWarehouse == null);
                    break;
                }
            }

            queryStock
            .JoinAlias(() => warehouseOperationAlias.Nomenclature, () => nomenclatureAlias)
            .JoinAlias(() => nomenclatureAlias.Type, () => itemTypesAlias)
            .JoinAlias(() => itemTypesAlias.Units, () => unitsAlias)
            .JoinEntityAlias(() => expenseItemAlias, () => expenseItemAlias.WarehouseOperation.Id == warehouseOperationAlias.Id, JoinType.LeftOuterJoin)
            .JoinEntityAlias(() => collectiveExpenseItemAlias, () => collectiveExpenseItemAlias.WarehouseOperation.Id == warehouseOperationAlias.Id, JoinType.LeftOuterJoin)
            .JoinEntityAlias(() => incomeItemAlias, () => incomeItemAlias.WarehouseOperation.Id == warehouseOperationAlias.Id, JoinType.LeftOuterJoin)
            .JoinEntityAlias(() => transferItemAlias, () => transferItemAlias.WarehouseOperation.Id == warehouseOperationAlias.Id, JoinType.LeftOuterJoin)
            .JoinEntityAlias(() => writeOffItemAlias, () => writeOffItemAlias.WarehouseOperation.Id == warehouseOperationAlias.Id, JoinType.LeftOuterJoin)
            .JoinEntityAlias(() => employeeIssueOperationAlias, () => employeeIssueOperationAlias.WarehouseOperation.Id == warehouseOperationAlias.Id, JoinType.LeftOuterJoin)
            .JoinEntityAlias(() => employeeCardAlias, () => employeeIssueOperationAlias.Employee.Id == employeeCardAlias.Id, JoinType.LeftOuterJoin)
            .JoinEntityAlias(() => completionResultItemAlias, () => completionResultItemAlias.WarehouseOperation.Id == warehouseOperationAlias.Id, JoinType.LeftOuterJoin)
            .JoinEntityAlias(() => completionSourceItemAlias, () => completionSourceItemAlias.WarehouseOperation.Id == warehouseOperationAlias.Id, JoinType.LeftOuterJoin)
            .Where(GetSearchCriterion(
                       () => employeeCardAlias.FirstName,
                       () => employeeCardAlias.LastName,
                       () => employeeCardAlias.Patronymic
                       ));

            if (Filter.CollapseOperationItems)
            {
                queryStock.SelectList(list => list
                                      .SelectGroup(() => warehouseOperationAlias.Nomenclature.Id)
                                      .Select(() => warehouseOperationAlias.OperationTime).WithAlias(() => resultAlias.OperationTime)
                                      .Select(() => unitsAlias.Name).WithAlias(() => resultAlias.UnitsName)
                                      .Select(receiptProjection).WithAlias(() => resultAlias.Receipt)
                                      .Select(expenseProjection).WithAlias(() => resultAlias.Expense)
                                      .SelectSum(() => warehouseOperationAlias.Amount).WithAlias(() => resultAlias.Amount)
                                      .Select(() => nomenclatureAlias.Name).WithAlias(() => resultAlias.NomenclatureName)
                                      .Select(() => employeeCardAlias.FirstName).WithAlias(() => resultAlias.EmployeeName)
                                      .Select(() => employeeCardAlias.LastName).WithAlias(() => resultAlias.EmployeeSurname)
                                      .Select(() => employeeCardAlias.Patronymic).WithAlias(() => resultAlias.EmployeePatronymic)

                                      //Ссылки
                                      .SelectGroup(() => expenseItemAlias.ExpenseDoc.Id).WithAlias(() => resultAlias.ExpenceId)
                                      .SelectGroup(() => collectiveExpenseItemAlias.Document.Id).WithAlias(() => resultAlias.CollectiveExpenseId)
                                      .SelectCount(() => employeeCardAlias.Id).WithAlias(() => resultAlias.NumberOfCollapsedRows)
                                      .SelectGroup(() => incomeItemAlias.Document.Id).WithAlias(() => resultAlias.IncomeId)
                                      .SelectGroup(() => transferItemAlias.Document.Id).WithAlias(() => resultAlias.TransferItemId)
                                      .SelectGroup(() => writeOffItemAlias.Document.Id).WithAlias(() => resultAlias.WriteoffId)
                                      .SelectGroup(() => completionResultItemAlias.Completion.Id).WithAlias(() => resultAlias.CompletionFromResultId)
                                      .SelectGroup(() => completionSourceItemAlias.Completion.Id).WithAlias(() => resultAlias.CompletionFromSourceId)

                                      .SelectGroup(() => sizeAlias.Name).WithAlias(() => resultAlias.WearSizeName)
                                      .SelectGroup(() => heightAlias.Name).WithAlias(() => resultAlias.HeightName)
                                      .SelectGroup(() => warehouseOperationAlias.WearPercent).WithAlias(() => resultAlias.WearPercent)
                                      );
            }
            else
            {
                queryStock.SelectList(list => list
                                      .Select(() => warehouseOperationAlias.Id).WithAlias(() => resultAlias.Id)
                                      .Select(() => warehouseOperationAlias.OperationTime).WithAlias(() => resultAlias.OperationTime)
                                      .Select(() => unitsAlias.Name).WithAlias(() => resultAlias.UnitsName)
                                      .Select(receiptProjection).WithAlias(() => resultAlias.Receipt)
                                      .Select(expenseProjection).WithAlias(() => resultAlias.Expense)
                                      .Select(() => warehouseOperationAlias.Amount).WithAlias(() => resultAlias.Amount)
                                      .Select(() => nomenclatureAlias.Name).WithAlias(() => resultAlias.NomenclatureName)
                                      .Select(() => sizeAlias.Name).WithAlias(() => resultAlias.WearSizeName)
                                      .Select(() => heightAlias.Name).WithAlias(() => resultAlias.HeightName)
                                      .Select(() => warehouseOperationAlias.WearPercent).WithAlias(() => resultAlias.WearPercent)
                                      //Ссылки
                                      .Select(() => expenseItemAlias.Id).WithAlias(() => resultAlias.ExpenceItemId)
                                      .Select(() => expenseItemAlias.ExpenseDoc.Id).WithAlias(() => resultAlias.ExpenceId)
                                      .Select(() => collectiveExpenseItemAlias.Id).WithAlias(() => resultAlias.CollectiveExpenseItemId)
                                      .Select(() => collectiveExpenseItemAlias.Document.Id).WithAlias(() => resultAlias.CollectiveExpenseId)
                                      .Select(() => incomeItemAlias.Id).WithAlias(() => resultAlias.IncomeItemId)
                                      .Select(() => incomeItemAlias.Document.Id).WithAlias(() => resultAlias.IncomeId)
                                      .Select(() => transferItemAlias.Id).WithAlias(() => resultAlias.TransferId)
                                      .Select(() => transferItemAlias.Document.Id).WithAlias(() => resultAlias.TransferItemId)
                                      .Select(() => writeOffItemAlias.Id).WithAlias(() => resultAlias.WriteoffItemId)
                                      .Select(() => writeOffItemAlias.Document.Id).WithAlias(() => resultAlias.WriteoffId)
                                      .Select(() => employeeCardAlias.FirstName).WithAlias(() => resultAlias.EmployeeName)
                                      .Select(() => employeeCardAlias.LastName).WithAlias(() => resultAlias.EmployeeSurname)
                                      .Select(() => employeeCardAlias.Patronymic).WithAlias(() => resultAlias.EmployeePatronymic)
                                      .Select(() => completionResultItemAlias.Id).WithAlias(() => resultAlias.CompletionResultItemId)
                                      .Select(() => completionSourceItemAlias.Id).WithAlias(() => resultAlias.CompletionSourceItemId)
                                      .Select(() => completionSourceItemAlias.Completion.Id).WithAlias(() => resultAlias.CompletionFromSourceId)
                                      .Select(() => completionResultItemAlias.Completion.Id).WithAlias(() => resultAlias.CompletionFromResultId)
                                      );
            }

            return(queryStock
                   .OrderBy(x => x.OperationTime).Desc
                   .ThenBy(x => x.Id).Asc
                   .TransformUsing(Transformers.AliasToBean <StockMovmentsJournalNode>()));
        }
Exemplo n.º 5
0
        public void CreateAndResaveDocWithWriteoff()
        {
            NewSessionWithSameDB();

            var navigation      = Substitute.For <INavigationManager>();
            var validator       = new ValidatorForTests();
            var userService     = Substitute.For <IUserService>();
            var userRepository  = Substitute.For <UserRepository>();
            var interactive     = Substitute.For <IInteractiveService>();
            var commonMessages  = Substitute.For <CommonMessages>(interactive);
            var featuresService = Substitute.For <FeaturesService>();
            var baseParameters  = Substitute.For <BaseParameters>();
            var sizeService     = Substitute.For <SizeService>();
            var deleteService   = Substitute.For <IDeleteEntityService>();

            var stockRepository = new StockRepository();

            var builder = new ContainerBuilder();

            builder.RegisterType <ExpenseDocItemsEmployeeViewModel>().AsSelf();
            builder.Register(x => featuresService).As <FeaturesService>();
            builder.Register(x => navigation).As <INavigationManager>();
            builder.Register(x => sizeService).As <SizeService>();
            builder.Register(x => deleteService).As <IDeleteEntityService>();
            builder.Register(x => baseParameters).As <BaseParameters>();
            builder.Register(x => Substitute.For <IUserService>()).As <IUserService>();
            var container = builder.Build();

            using (var uow = UnitOfWorkFactory.CreateWithoutRoot())
            {
                var warehouse = new Warehouse();
                uow.Save(warehouse);

                var user = new UserBase();
                uow.Save(user);
                userService.GetCurrentUser(Arg.Any <IUnitOfWork>()).Returns(user);

                var itemType = new ItemsType {
                    Name = "Тип"
                };
                uow.Save(itemType);

                var nomenclature = new Nomenclature {
                    Type = itemType
                };
                uow.Save(nomenclature);

                var protectionTools = new ProtectionTools {
                    Name = "Тестовый СИЗ",
                    Type = itemType
                };
                protectionTools.AddNomeclature(nomenclature);
                uow.Save(protectionTools);

                var norm     = new Norm();
                var normItem = norm.AddItem(protectionTools);
                normItem.Amount      = 1;
                normItem.NormPeriod  = NormPeriodType.Month;
                normItem.PeriodCount = 1;
                uow.Save(norm);

                var employee = new EmployeeCard();
                employee.AddUsedNorm(norm);
                uow.Save(employee);

                var warehouseOperation = new WarehouseOperation {
                    Amount           = 10,
                    ReceiptWarehouse = warehouse,
                    Nomenclature     = nomenclature,
                };
                uow.Save(warehouseOperation);

                uow.Commit();

                //Создаем предыдущую выдачу которая должна быть списана.
                using (var vmCreateLastIssue = new ExpenseEmployeeViewModel(
                           EntityUoWBuilder.ForCreate(),
                           UnitOfWorkFactory,
                           navigation,
                           container.BeginLifetimeScope(),
                           validator,
                           userService,
                           userRepository,
                           interactive,
                           stockRepository,
                           commonMessages,
                           featuresService,
                           baseParameters))
                {
                    vmCreateLastIssue.Entity.Date      = new DateTime(2022, 04, 1);
                    vmCreateLastIssue.Entity.Warehouse = vmCreateLastIssue.UoW.GetById <Warehouse>(warehouse.Id);
                    vmCreateLastIssue.Entity.Employee  = vmCreateLastIssue.UoW.GetById <EmployeeCard>(employee.Id);

                    Assert.That(vmCreateLastIssue.Entity.Items.Count, Is.EqualTo(1));
                    var itemLast = vmCreateLastIssue.Entity.Items.First();
                    itemLast.Amount = 1;
                    Assert.That(itemLast.IsEnableWriteOff, Is.False);

                    Assert.That(vmCreateLastIssue.Save(), Is.True);
                }

                //Создаем выдачу в место выданного ранее.
                int expenseIdForResave;
                using (var vmCreate = new ExpenseEmployeeViewModel(EntityUoWBuilder.ForCreate(), UnitOfWorkFactory, navigation, container.BeginLifetimeScope(), validator, userService, userRepository, interactive, stockRepository, commonMessages, featuresService, baseParameters, employee))
                {
                    vmCreate.Entity.Date      = new DateTime(2022, 04, 12);
                    vmCreate.Entity.Warehouse = vmCreate.UoW.GetById <Warehouse>(warehouse.Id);

                    Assert.That(vmCreate.Entity.Items.Count, Is.EqualTo(1));
                    var item = vmCreate.Entity.Items.First();
                    item.Amount = 1;
                    Assert.That(item.IsEnableWriteOff, Is.True);
                    //Главное в этом тесте, устанавливаем галочку что выдача идет вместе со списанием.
                    item.IsWriteOff = true;

                    Assert.That(vmCreate.Save(), Is.True);
                    expenseIdForResave = vmCreate.Entity.Id;
                }

                //Пересохраняем для проверки что это работает
                using (var vmResave = new ExpenseEmployeeViewModel(EntityUoWBuilder.ForOpen(expenseIdForResave), UnitOfWorkFactory, navigation, container.BeginLifetimeScope(), validator, userService, userRepository, interactive, stockRepository, commonMessages, featuresService, baseParameters))
                {
                    Assert.That(vmResave.Save(), Is.True);
                }
            }
        }
Exemplo n.º 6
0
        public void HandleDeleteEmployeeVacation_RecalculateDatesAndNextIssueTest()
        {
            var ask = Substitute.For <IInteractiveQuestion>();

            ask.Question(string.Empty).ReturnsForAnyArgs(true);

            using (var uow = UnitOfWorkFactory.CreateWithoutRoot("Тест на обработку события удаления")) {
                BuisnessLogicGlobalEventHandler.Init(ask, UnitOfWorkFactory);

                var nomenclatureType = new ItemsType();
                nomenclatureType.Name = "Тестовый тип номенклатуры";
                uow.Save(nomenclatureType);

                var nomenclature = new Nomenclature();
                nomenclature.Type = nomenclatureType;
                uow.Save(nomenclature);

                var protectionTools = new ProtectionTools();
                protectionTools.Name = "СИЗ для тестирования";
                protectionTools.AddNomeclature(nomenclature);
                uow.Save(protectionTools);

                var norm     = new Norm();
                var normItem = norm.AddItem(protectionTools);
                normItem.Amount      = 1;
                normItem.NormPeriod  = NormPeriodType.Month;
                normItem.PeriodCount = 2;
                uow.Save(norm);

                var employee = new EmployeeCard();

                var vacationType = new VacationType();
                vacationType.Name = "Тестовый отпуск";
                vacationType.ExcludeFromWearing = true;

                var vacation = new EmployeeVacation();
                vacation.BeginDate    = new DateTime(2019, 2, 1);
                vacation.EndDate      = new DateTime(2019, 3, 1);
                vacation.VacationType = vacationType;
                employee.AddVacation(vacation);
                uow.Save(vacationType);
                uow.Save(vacation);
                uow.Save(employee);

                var warehouseOperation = new WarehouseOperation();
                warehouseOperation.Nomenclature = nomenclature;
                uow.Save(warehouseOperation);

                var expenseOp = new EmployeeIssueOperation();
                expenseOp.OperationTime      = new DateTime(2019, 1, 1);
                expenseOp.ExpiryByNorm       = new DateTime(2019, 4, 1);
                expenseOp.Employee           = employee;
                expenseOp.Nomenclature       = nomenclature;
                expenseOp.ProtectionTools    = protectionTools;
                expenseOp.NormItem           = normItem;
                expenseOp.Issued             = 1;
                expenseOp.WarehouseOperation = warehouseOperation;
                uow.Save(expenseOp);
                uow.Commit();

                //Выполняем удаление
                employee.Vacations.Remove(vacation);
                uow.Delete(vacation);
                uow.Commit();

                //проверяем данные
                using (var uow2 = UnitOfWorkFactory.CreateWithoutRoot("Тест на обработку события удаления uow2")) {
                    var resultOp = uow2.GetById <EmployeeIssueOperation>(expenseOp.Id);
                    Assert.That(resultOp.ExpiryByNorm, Is.EqualTo(new DateTime(2019, 3, 1)));
                }
            }
        }
Exemplo n.º 7
0
        public void HandleDeleteEmployeeVacation_RecalculateWithTwoIssuePerDayTest()
        {
            var ask = Substitute.For <IInteractiveQuestion>();

            ask.Question(string.Empty).ReturnsForAnyArgs(true);
            var baseParameters = Substitute.For <BaseParameters>();

            baseParameters.ColDayAheadOfShedule.Returns(0);

            using (var uow = UnitOfWorkFactory.CreateWithoutRoot("Тест на обработку события удаления")) {
                BuisnessLogicGlobalEventHandler.Init(ask, UnitOfWorkFactory);

                var nomenclatureType = new ItemsType();
                nomenclatureType.Name = "Тестовый тип номенклатуры";
                uow.Save(nomenclatureType);

                var nomenclature = new Nomenclature();
                nomenclature.Type = nomenclatureType;
                uow.Save(nomenclature);

                var protectionTools = new ProtectionTools();
                protectionTools.Name = "СИЗ для тестирования";
                protectionTools.AddNomeclature(nomenclature);
                uow.Save(protectionTools);

                var norm     = new Norm();
                var normItem = norm.AddItem(protectionTools);
                normItem.Amount      = 1;
                normItem.NormPeriod  = NormPeriodType.Year;
                normItem.PeriodCount = 1;
                uow.Save(norm);

                var employee = new EmployeeCard();
                employee.AddUsedNorm(norm);

                var vacationType = new VacationType();
                vacationType.Name = "Тестовый отпуск";
                vacationType.ExcludeFromWearing = true;

                var vacation = new EmployeeVacation();
                vacation.BeginDate    = new DateTime(2019, 2, 1);
                vacation.EndDate      = new DateTime(2019, 2, 10);
                vacation.VacationType = vacationType;
                employee.AddVacation(vacation);
                uow.Save(vacationType);
                uow.Save(vacation);
                uow.Save(employee);
                uow.Commit();

                var warehouseOperation = new WarehouseOperation();
                warehouseOperation.Nomenclature = nomenclature;
                uow.Save(warehouseOperation);

                var expenseOp = new EmployeeIssueOperation();
                expenseOp.OperationTime      = new DateTime(2019, 1, 1, 14, 0, 0);
                expenseOp.AutoWriteoffDate   = new DateTime(2020, 1, 1);
                expenseOp.Employee           = employee;
                expenseOp.Nomenclature       = nomenclature;
                expenseOp.ProtectionTools    = protectionTools;
                expenseOp.NormItem           = normItem;
                expenseOp.Issued             = 1;
                expenseOp.WarehouseOperation = warehouseOperation;
                var graph = IssueGraph.MakeIssueGraph(uow, employee, protectionTools);
                expenseOp.RecalculateDatesOfIssueOperation(graph, baseParameters, ask);
                uow.Save(expenseOp);

                var warehouseOperation2 = new WarehouseOperation();
                warehouseOperation2.Nomenclature = nomenclature;
                uow.Save(warehouseOperation2);

                var expenseOp2 = new EmployeeIssueOperation();
                expenseOp2.OperationTime      = new DateTime(2019, 1, 1, 13, 0, 0);
                expenseOp2.AutoWriteoffDate   = new DateTime(2020, 1, 1);
                expenseOp2.Employee           = employee;
                expenseOp2.Nomenclature       = nomenclature;
                expenseOp2.ProtectionTools    = protectionTools;
                expenseOp2.NormItem           = normItem;
                expenseOp2.Issued             = 1;
                expenseOp2.WarehouseOperation = warehouseOperation2;
                graph = IssueGraph.MakeIssueGraph(uow, employee, protectionTools);
                expenseOp2.RecalculateDatesOfIssueOperation(graph, baseParameters, ask);
                uow.Save(expenseOp2);
                uow.Commit();

                vacation.UpdateRelatedOperations(uow, new EmployeeIssueRepository(), baseParameters, ask);
                uow.Commit();

                Assert.That(employee.WorkwearItems[0].NextIssue, Is.EqualTo(new DateTime(2021, 1, 11)));

                //Выполняем удаление
                employee.Vacations.Remove(vacation);
                uow.Delete(vacation);
                uow.Commit();

                //проверяем данные
                using (var uow2 = UnitOfWorkFactory.CreateWithoutRoot("Тест на обработку события удаления uow2")) {
                    var resultEmployee = uow2.GetById <EmployeeCard>(employee.Id);
                    Assert.That(resultEmployee.WorkwearItems[0].NextIssue, Is.EqualTo(new DateTime(2021, 1, 1)));
                }
            }
        }
        public void FillWearRecivedInfo_NotMergeAnalogTest()
        {
            using (var uow = UnitOfWorkFactory.CreateWithoutRoot()) {
                var nomenclatureType = new ItemsType();
                nomenclatureType.Name     = "Тестовый тип номенклатуры";
                nomenclatureType.Category = ItemTypeCategory.wear;
                uow.Save(nomenclatureType);

                var nomenclature = new Nomenclature();
                nomenclature.Type = nomenclatureType;
                nomenclature.Sex  = ClothesSex.Men;
                uow.Save(nomenclature);

                var protectionToolsAnalog = new ProtectionTools();
                protectionToolsAnalog.Name = "Номенклатура нормы Аналог";
                protectionToolsAnalog.AddNomeclature(nomenclature);

                var protectionTools = new ProtectionTools();
                protectionTools.Name = "Номенклатура нормы";
                protectionTools.AddAnalog(protectionToolsAnalog);
                protectionTools.AddNomeclature(nomenclature);
                protectionToolsAnalog.AddAnalog(protectionTools);
                uow.Save(protectionToolsAnalog);
                uow.Save(protectionTools);

                var norm     = new Norm();
                var normItem = norm.AddItem(protectionTools);
                normItem.Amount      = 1;
                normItem.NormPeriod  = NormPeriodType.Year;
                normItem.PeriodCount = 1;
                var normItem2 = norm.AddItem(protectionToolsAnalog);
                normItem2.Amount      = 2;
                normItem2.NormPeriod  = NormPeriodType.Year;
                normItem2.PeriodCount = 1;
                uow.Save(norm);

                var employee = new EmployeeCard();
                employee.AddUsedNorm(norm);
                employee.Sex = Sex.M;
                Assert.That(employee.WorkwearItems.Count, Is.GreaterThan(0));
                uow.Save(employee);
                uow.Commit();

                var warehouseOperation = new WarehouseOperation {
                    Nomenclature  = nomenclature,
                    Amount        = 1,
                    OperationTime = new DateTime(2018, 1, 20),
                };
                uow.Save(warehouseOperation);

                var operation = new EmployeeIssueOperation {
                    Employee           = employee,
                    ExpiryByNorm       = new DateTime(2019, 1, 20),
                    Issued             = 1,
                    Nomenclature       = nomenclature,
                    NormItem           = normItem,
                    ProtectionTools    = protectionTools,
                    OperationTime      = new DateTime(2018, 1, 20),
                    WarehouseOperation = warehouseOperation,
                };
                uow.Save(operation);

                var warehouseOperation2 = new WarehouseOperation {
                    Nomenclature  = nomenclature,
                    Amount        = 2,
                    OperationTime = new DateTime(2018, 1, 20),
                };
                uow.Save(warehouseOperation2);

                var operation2 = new EmployeeIssueOperation {
                    Employee           = employee,
                    ExpiryByNorm       = new DateTime(2019, 1, 20),
                    Issued             = 2,
                    Nomenclature       = nomenclature,
                    NormItem           = normItem2,
                    ProtectionTools    = protectionToolsAnalog,
                    OperationTime      = new DateTime(2018, 1, 20),
                    WarehouseOperation = warehouseOperation,
                };
                uow.Save(operation2);

                uow.Commit();

                employee.FillWearRecivedInfo(new EmployeeIssueRepository(uow));
                var item1 = employee.WorkwearItems.FirstOrDefault(x => x.ActiveNormItem == normItem);
                Assert.That(item1.Amount, Is.EqualTo(1));
                var item2 = employee.WorkwearItems.FirstOrDefault(x => x.ActiveNormItem == normItem2);
                Assert.That(item2.Amount, Is.EqualTo(2));
            }
        }
        public void FillWearRecivedInfo_LastIssueDateExistAfterAutoWriteoffDateTest()
        {
            using (var uow = UnitOfWorkFactory.CreateWithoutRoot()) {
                var nomenclatureType = new ItemsType();
                nomenclatureType.Name     = "Тестовый тип номенклатуры";
                nomenclatureType.Category = ItemTypeCategory.wear;
                uow.Save(nomenclatureType);

                var nomenclature = new Nomenclature();
                nomenclature.Type = nomenclatureType;
                nomenclature.Sex  = ClothesSex.Men;
                uow.Save(nomenclature);

                var protectionTools = new ProtectionTools();
                protectionTools.Name = "Номенклатура нормы";
                protectionTools.AddNomeclature(nomenclature);
                uow.Save(protectionTools);

                var norm     = new Norm();
                var normItem = norm.AddItem(protectionTools);
                normItem.Amount      = 1;
                normItem.NormPeriod  = NormPeriodType.Year;
                normItem.PeriodCount = 1;
                uow.Save(norm);

                var employee = new EmployeeCard();
                employee.AddUsedNorm(norm);
                employee.Sex = Sex.M;
                Assert.That(employee.WorkwearItems.Count, Is.GreaterThan(0));
                uow.Save(employee);
                uow.Commit();

                var warehouseOperation = new WarehouseOperation {
                    Nomenclature  = nomenclature,
                    Amount        = 1,
                    OperationTime = new DateTime(2018, 1, 20),
                };
                uow.Save(warehouseOperation);

                var operationIssue = new EmployeeIssueOperation {
                    Employee           = employee,
                    ExpiryByNorm       = new DateTime(2019, 1, 20),
                    AutoWriteoffDate   = new DateTime(2019, 1, 20),
                    UseAutoWriteoff    = true,
                    Issued             = 1,
                    Nomenclature       = nomenclature,
                    NormItem           = normItem,
                    ProtectionTools    = protectionTools,
                    OperationTime      = new DateTime(2018, 1, 20),
                    StartOfUse         = new DateTime(2018, 1, 20),
                    WarehouseOperation = warehouseOperation,
                };
                uow.Save(operationIssue);

                uow.Commit();

                employee.FillWearRecivedInfo(new EmployeeIssueRepository(uow));
                var item = employee.WorkwearItems.First();
                Assert.That(item.Amount, Is.EqualTo(1));
                Assert.That(item.LastIssue, Is.EqualTo(new DateTime(2018, 1, 20)));
            }
        }
Exemplo n.º 10
0
        public virtual IList <StockBalanceDTO> StockBalances(
            IUnitOfWork uow,
            Warehouse warehouse,
            IList <Nomenclature> nomenclatures,
            DateTime onTime,
            IEnumerable <WarehouseOperation> excludeOperations = null)
        {
            StockBalanceDTO    resultAlias = null;
            WarehouseOperation warehouseExpenseOperationAlias = null;
            WarehouseOperation warehouseIncomeOperationAlias  = null;
            WarehouseOperation warehouseOperationAlias        = null;
            Nomenclature       nomenclatureAlias = null;
            Size sizeAlias   = null;
            Size heightAlias = null;

            var excludeIds = excludeOperations?.Select(x => x.Id).ToList();

            // null == null => null              null <=> null => true
            var expenseQuery = QueryOver.Of(() => warehouseExpenseOperationAlias)
                               .Where(() => warehouseExpenseOperationAlias.Nomenclature.Id == nomenclatureAlias.Id &&
                                      (warehouseExpenseOperationAlias.WearSize.Id == sizeAlias.Id ||
                                       warehouseOperationAlias.WearSize == null && sizeAlias == null) &&
                                      (warehouseExpenseOperationAlias.Height.Id == heightAlias.Id ||
                                       warehouseOperationAlias.Height == null && heightAlias == null) &&
                                      warehouseExpenseOperationAlias.WearPercent == warehouseOperationAlias.WearPercent)
                               .Where(e => e.OperationTime <= onTime);

            if (warehouse == null)
            {
                expenseQuery.Where(x => x.ExpenseWarehouse != null);
            }
            else
            {
                expenseQuery.Where(x => x.ExpenseWarehouse == warehouse);
            }

            if (excludeIds != null && excludeIds.Count > 0)
            {
                expenseQuery.WhereNot(x => x.Id.IsIn(excludeIds));
            }

            expenseQuery.Select(Projections
                                .Sum(Projections
                                     .Property(() => warehouseExpenseOperationAlias.Amount)));

            var incomeSubQuery = QueryOver.Of(() => warehouseIncomeOperationAlias)
                                 .Where(() => warehouseIncomeOperationAlias.Nomenclature.Id == nomenclatureAlias.Id &&
                                        (warehouseIncomeOperationAlias.WearSize.Id == sizeAlias.Id ||
                                         warehouseOperationAlias.WearSize == null && sizeAlias == null) &&
                                        (warehouseIncomeOperationAlias.Height.Id == heightAlias.Id ||
                                         warehouseOperationAlias.Height == null && heightAlias == null) &&
                                        warehouseIncomeOperationAlias.WearPercent == warehouseOperationAlias.WearPercent)
                                 .Where(e => e.OperationTime < onTime);

            if (warehouse == null)
            {
                incomeSubQuery.Where(x => x.ReceiptWarehouse != null);
            }
            else
            {
                incomeSubQuery.Where(x => x.ReceiptWarehouse == warehouse);
            }

            if (excludeIds != null && excludeIds.Count > 0)
            {
                incomeSubQuery.WhereNot(x => x.Id.IsIn(excludeIds));
            }

            incomeSubQuery.Select(Projections
                                  .Sum(Projections
                                       .Property(() => warehouseIncomeOperationAlias.Amount)));

            var projection = Projections.SqlFunction(
                new SQLFunctionTemplate(NHibernateUtil.Int32, "( IFNULL(?1, 0) - IFNULL(?2, 0) )"),
                NHibernateUtil.Int32,
                Projections.SubQuery(incomeSubQuery),
                Projections.SubQuery(expenseQuery)
                );

            var queryStock = uow.Session.QueryOver(() => warehouseOperationAlias);

            queryStock.Where(Restrictions.Not(Restrictions.Eq(projection, 0)));
            queryStock.Where(() => warehouseOperationAlias.Nomenclature.IsIn(nomenclatures.ToArray()));

            var result = queryStock
                         .JoinAlias(() => warehouseOperationAlias.Nomenclature, () => nomenclatureAlias)
                         .JoinAlias(() => warehouseOperationAlias.WearSize, () => sizeAlias, JoinType.LeftOuterJoin)
                         .JoinAlias(() => warehouseOperationAlias.Height, () => heightAlias, JoinType.LeftOuterJoin)
                         .SelectList(list => list
                                     .SelectGroup(() => nomenclatureAlias.Id).WithAlias(() => resultAlias.NomenclatureId)
                                     .SelectGroup(() => warehouseOperationAlias.WearSize).WithAlias(() => resultAlias.WearSize)
                                     .SelectGroup(() => warehouseOperationAlias.Height).WithAlias(() => resultAlias.Height)
                                     .SelectGroup(() => warehouseOperationAlias.WearPercent).WithAlias(() => resultAlias.WearPercent)
                                     .Select(projection).WithAlias(() => resultAlias.Amount)
                                     )
                         .TransformUsing(Transformers.AliasToBean <StockBalanceDTO>())
                         .List <StockBalanceDTO>();

            //Проставляем номенклатуру.
            result.ToList().ForEach(item =>
                                    item.Nomenclature = nomenclatures.First(n => n.Id == item.NomenclatureId));
            return(result);
        }
        public IQueryOver <EmployeeIssueOperation> ItemsQuery(IUnitOfWork unitOfWork)
        {
            EmployeeBalanceJournalNode resultAlias           = null;
            EmployeeIssueOperation     expenseOperationAlias = null;
            Nomenclature           nomenclatureAlias         = null;
            ItemsType              itemTypesAlias            = null;
            MeasurementUnits       unitsAlias              = null;
            EmployeeIssueOperation removeOperationAlias    = null;
            WarehouseOperation     warehouseOperationAlias = null;
            Size         sizeAlias         = null;
            Size         heightAlias       = null;
            EmployeeCard employeeCardAlias = null;

            var query = unitOfWork.Session.QueryOver(() => expenseOperationAlias);

            if (Filter.Employee != null)
            {
                query.Where(e => e.Employee == Filter.Employee);
            }

            var subQueryRemove = QueryOver.Of(() => removeOperationAlias)
                                 .Where(() => removeOperationAlias.IssuedOperation.Id == expenseOperationAlias.Id)
                                 .Select(Projections.Sum <EmployeeIssueOperation>(o => o.Returned));

            var balance = Projections.SqlFunction(
                new SQLFunctionTemplate(NHibernateUtil.Int32, "( IFNULL(?1, 0) - IFNULL(?2, 0) )"),
                NHibernateUtil.Int32,
                Projections.Property(() => expenseOperationAlias.Issued),
                Projections.SubQuery(subQueryRemove)
                );

            if (Filter.Employee != null)
            {
                query
                .JoinAlias(() => expenseOperationAlias.Nomenclature, () => nomenclatureAlias)
                .JoinAlias(() => expenseOperationAlias.WearSize, () => sizeAlias, JoinType.LeftOuterJoin)
                .JoinAlias(() => expenseOperationAlias.Height, () => heightAlias, JoinType.LeftOuterJoin)
                .JoinAlias(() => nomenclatureAlias.Type, () => itemTypesAlias)
                .JoinAlias(() => itemTypesAlias.Units, () => unitsAlias)
                .JoinAlias(() => expenseOperationAlias.WarehouseOperation, () => warehouseOperationAlias,
                           JoinType.LeftOuterJoin)
                .JoinAlias(() => expenseOperationAlias.Employee, () => employeeCardAlias)
                .Where(e => e.AutoWriteoffDate == null || e.AutoWriteoffDate > Filter.Date)
                .Where(Restrictions.Not(Restrictions.Eq(balance, 0)))
                .SelectList(list => list
                            .SelectGroup(() => expenseOperationAlias.Id).WithAlias(() => resultAlias.Id)
                            .Select(() => nomenclatureAlias.Name).WithAlias(() => resultAlias.NomenclatureName)
                            .Select(() => unitsAlias.Name).WithAlias(() => resultAlias.UnitsName)
                            .Select(() => sizeAlias.Name).WithAlias(() => resultAlias.WearSize)
                            .Select(() => heightAlias.Name).WithAlias(() => resultAlias.Height)
                            .Select(() => warehouseOperationAlias.Cost).WithAlias(() => resultAlias.AvgCost)
                            .Select(() => expenseOperationAlias.WearPercent).WithAlias(() => resultAlias.WearPercent)
                            .Select(() => expenseOperationAlias.OperationTime).WithAlias(() => resultAlias.IssuedDate)
                            .Select(() => expenseOperationAlias.StartOfUse).WithAlias(() => resultAlias.StartUseDate)
                            .Select(() => expenseOperationAlias.ExpiryByNorm).WithAlias(() => resultAlias.ExpiryDate)
                            .Select(() => employeeCardAlias.FirstName).WithAlias(() => resultAlias.FirstName)
                            .Select(() => employeeCardAlias.LastName).WithAlias(() => resultAlias.LastName)
                            .Select(() => employeeCardAlias.Patronymic).WithAlias(() => resultAlias.Patronymic)
                            .Select(balance).WithAlias(() => resultAlias.Balance));
            }
            else
            {
                query
                .JoinAlias(() => expenseOperationAlias.Nomenclature, () => nomenclatureAlias)
                .JoinAlias(() => expenseOperationAlias.WearSize, () => sizeAlias, JoinType.LeftOuterJoin)
                .JoinAlias(() => expenseOperationAlias.Height, () => heightAlias, JoinType.LeftOuterJoin)
                .JoinAlias(() => nomenclatureAlias.Type, () => itemTypesAlias)
                .JoinAlias(() => itemTypesAlias.Units, () => unitsAlias)
                .JoinAlias(() => expenseOperationAlias.WarehouseOperation, () => warehouseOperationAlias,
                           JoinType.LeftOuterJoin)
                .JoinAlias(() => expenseOperationAlias.Employee, () => employeeCardAlias)
                .Where(e => e.AutoWriteoffDate == null || e.AutoWriteoffDate > Filter.Date)
                .Where(Restrictions.Not(Restrictions.Eq(balance, 0)))
                .SelectList(list => list
                            .Select(() => expenseOperationAlias.Id).WithAlias(() => resultAlias.Id)
                            .Select(() => nomenclatureAlias.Name).WithAlias(() => resultAlias.NomenclatureName)
                            .Select(() => unitsAlias.Name).WithAlias(() => resultAlias.UnitsName)
                            .Select(() => sizeAlias.Name).WithAlias(() => resultAlias.WearSize)
                            .Select(() => heightAlias.Name).WithAlias(() => resultAlias.Height)
                            .Select(() => warehouseOperationAlias.Cost).WithAlias(() => resultAlias.AvgCost)
                            .Select(() => expenseOperationAlias.WearPercent).WithAlias(() => resultAlias.WearPercent)
                            .Select(() => expenseOperationAlias.OperationTime).WithAlias(() => resultAlias.IssuedDate)
                            .Select(() => expenseOperationAlias.StartOfUse).WithAlias(() => resultAlias.StartUseDate)
                            .Select(() => expenseOperationAlias.ExpiryByNorm).WithAlias(() => resultAlias.ExpiryDate)
                            .Select(() => employeeCardAlias.FirstName).WithAlias(() => resultAlias.FirstName)
                            .Select(() => employeeCardAlias.LastName).WithAlias(() => resultAlias.LastName)
                            .Select(() => employeeCardAlias.Patronymic).WithAlias(() => resultAlias.Patronymic)
                            .Select(balance).WithAlias(() => resultAlias.Balance));
                query = query.OrderBy(() => employeeCardAlias.LastName).Asc
                        .ThenBy(() => employeeCardAlias.FirstName).Asc
                        .ThenBy(() => employeeCardAlias.Patronymic).Asc;
            }
            return(query.TransformUsing(Transformers.AliasToBean <EmployeeBalanceJournalNode>()));
        }