Exemple #1
0
 public ManualEmployeeIssueOperationViewModel(
     IEntityUoWBuilder uowBuilder,
     IUnitOfWorkFactory unitOfWorkFactory,
     INavigationManager navigation,
     EmployeeCardItem employeeCardItem = null,
     IValidator validator = null) : base(uowBuilder, unitOfWorkFactory, navigation, validator)
 {
     if (UoW.IsNew)
     {
         if (employeeCardItem == null)
         {
             throw new ArgumentNullException(nameof(employeeCardItem));
         }
         Entity.Employee        = employeeCardItem.EmployeeCard;
         Entity.Issued          = employeeCardItem.ActiveNormItem?.Amount ?? 1;
         Entity.OverrideBefore  = true;
         Entity.NormItem        = employeeCardItem.ActiveNormItem;
         Entity.ProtectionTools = employeeCardItem.ProtectionTools;
         Entity.Returned        = 0;
         Entity.WearPercent     = 0m;
         Entity.UseAutoWriteoff = true;
         Entity.OperationTime   = employeeCardItem.NextIssue ?? DateTime.Today;
     }
     if (!Entity.OverrideBefore)
     {
         throw new NotSupportedException("Этот диалог предназначен только для ручных операций");
     }
     //Исправляем ситуацию когда у операции пропала ссылка на норму, это может произойти в случает обновления нормы.
     if (Entity.NormItem == null && employeeCardItem != null)
     {
         Entity.NormItem = employeeCardItem.ActiveNormItem;
     }
     IssueDate = Entity.OperationTime;
 }
        public static IList <EmployeeCard> GetEmployeesDependenceOnNormItem(IUnitOfWork uow, NormItem item)
        {
            EmployeeCardItem employeeItemAlias = null;

            return(uow.Session.QueryOver <EmployeeCard>()
                   .JoinQueryOver(e => e.WorkwearItems, () => employeeItemAlias)
                   .Where(() => employeeItemAlias.ActiveNormItem == item)
                   .List());
        }
        public void MatcheStockPosition_RangeGrowthInEmployeeSize()
        {
            var employee = new EmployeeCard {
                Sex = Sex.M
            };
            var sizeType = new SizeType {
                CategorySizeType = CategorySizeType.Size
            };
            var heightType = new SizeType {
                CategorySizeType = CategorySizeType.Height
            };
            var size52 = new Size {
                Name = "52", SizeType = sizeType, UseInEmployee = true
            };
            var height170And176 = new Size
            {
                Name = "170-176", SizeType = heightType, UseInEmployee = true
            };
            var height170 = new Size {
                Name          = "170",
                SizeType      = heightType,
                UseInEmployee = true,
                SuitableSizes = new List <Size> {
                    height170And176
                }
            };

            employee.Sizes.Add(new EmployeeSize {
                Size = height170And176, SizeType = heightType
            });
            employee.Sizes.Add(new EmployeeSize {
                Size = size52, SizeType = sizeType
            });

            var itemType = Substitute.For <ItemsType>();

            itemType.Category.Returns(ItemTypeCategory.wear);
            var nomenclature = Substitute.For <Nomenclature>();

            nomenclature.Id.Returns(25);
            nomenclature.Type.Returns(itemType);
            nomenclature.MatchingEmployeeSex(Sex.M).Returns(true);
            var protectionTools = Substitute.For <ProtectionTools>();

            protectionTools.MatchedNomenclatures.Returns(new[] { nomenclature });
            var normItem = Substitute.For <NormItem>();

            normItem.ProtectionTools.Returns(protectionTools);

            var employeeItem = new EmployeeCardItem(employee, normItem);

            var stockPosition = new StockPosition(nomenclature, 0, size52, height170);
            var result        = employeeItem.MatcheStockPosition(stockPosition);

            Assert.That(result, Is.True);
        }
Exemple #4
0
        public void OpenLastIssue(EmployeeCardItem row)
        {
            var referencedoc = employeeIssueRepository.GetReferencedDocuments(row.LastIssueOperation.Id);

            if (!referencedoc.Any() || referencedoc.First().DocumentType == null)
            {
                interactive.ShowMessage(ImportanceLevel.Error, "Не найдена ссылка на документ выдачи");
                return;
            }
            stockDocumentsModel.EditDocumentDialog(employeeViewModel, referencedoc.First());
        }
        public void CalculateRequiredIssue_ReciveBeforeExpiredCase()
        {
            var baseParameters = Substitute.For <BaseParameters>();

            baseParameters.ColDayAheadOfShedule.Returns(30);

            var norm = new NormItem {
                Amount = 1
            };
            var item = new EmployeeCardItem {
                ActiveNormItem = norm,
                Amount         = 1,
                LastIssue      = DateTime.Today.AddMonths(-5),
                NextIssue      = DateTime.Today.AddDays(-10)
            };

            Assert.That(item.CalculateRequiredIssue(baseParameters), Is.EqualTo(1));
        }
        public void CalculateRequiredIssue_NextIssueIsNullCase()
        {
            var baseParameters = Substitute.For <BaseParameters>();

            baseParameters.ColDayAheadOfShedule.Returns(0);

            var norm = new NormItem {
                Amount = 2
            };
            var item = new EmployeeCardItem {
                ActiveNormItem = norm,
                Amount         = 2,
                LastIssue      = DateTime.Today.AddDays(-30),
                NextIssue      = null
            };

            Assert.That(item.CalculateRequiredIssue(baseParameters), Is.EqualTo(0));
        }
        public void MatcheStockPosition_WithoutGrowthCase()
        {
            var heightType = new SizeType {
                CategorySizeType = CategorySizeType.Height
            };
            var sizeType = new SizeType {
                CategorySizeType = CategorySizeType.Size
            };
            var size = new Size {
                Name = "52", SizeType = sizeType
            };
            var itemType     = Substitute.For <ItemsType>();
            var nomenclature = Substitute.For <Nomenclature>();

            nomenclature.Type.Returns(itemType);
            nomenclature.MatchingEmployeeSex(Sex.M).Returns(true);
            var protectionTools = Substitute.For <ProtectionTools>();

            protectionTools.MatchedNomenclatures.Returns(new[] { nomenclature });
            var employee = Substitute.For <EmployeeCard>();

            employee.Sex.Returns(Sex.M);
            var sizes = new List <EmployeeSize>();

            employee.Sizes.Returns(sizes);
            employee.Sizes.Add(new EmployeeSize {
                Size = new Size {
                    Name = "182"
                }, SizeType = heightType, Employee = employee
            });
            employee.Sizes.Add(new EmployeeSize {
                Size = size, SizeType = sizeType, Employee = employee
            });
            var normItem = Substitute.For <NormItem>();

            normItem.ProtectionTools.Returns(protectionTools);

            var employeeCardItem = new EmployeeCardItem(employee, normItem);

            var stockPosition = new StockPosition(nomenclature, 0, size, null);

            Assert.That(employeeCardItem.MatcheStockPosition(stockPosition));
        }
        public void CalculateRequiredIssue_RecivedPartCase()
        {
            var baseParameters = Substitute.For <BaseParameters>();

            baseParameters.ColDayAheadOfShedule.Returns(0);

            var norm = new NormItem {
                Amount = 4
            };
            //FIXME Возможно некоректная ситуация, надо подумать как в этом месте будет более правильно поставить дату следующей выдачи
            var item = new EmployeeCardItem {
                ActiveNormItem = norm,
                Amount         = 1,
                LastIssue      = DateTime.Today.AddDays(-30),
                NextIssue      = DateTime.Today.AddDays(30)
            };

            Assert.That(item.CalculateRequiredIssue(baseParameters), Is.EqualTo(3));
        }
        public bool MatcheStockPosition_ClothesSex(Sex employeeSex, ClothesSex?clothesSex)
        {
            var employee = new EmployeeCard();

            employee.Sex = employeeSex;

            var itemType     = Substitute.For <ItemsType>();
            var nomenclature = new Nomenclature {
                Id   = 25,
                Type = itemType,
                Sex  = clothesSex
            };
            var protectionTools = Substitute.For <ProtectionTools>();

            protectionTools.MatchedNomenclatures.Returns(new[] { nomenclature });
            var normItem = Substitute.For <NormItem>();

            normItem.ProtectionTools.Returns(protectionTools);
            var employeeItem = new EmployeeCardItem(employee, normItem);

            return(employeeItem.MatcheStockPosition(new StockPosition(nomenclature, 0, null, null)));
        }
        public void MatcheStockPosition_SizeTest()
        {
            var employee = new EmployeeCard();

            employee.Sex = Sex.M;
            var sizeType = new SizeType {
                CategorySizeType = CategorySizeType.Size
            };
            var size = new Size {
                Name = "52", SizeType = sizeType
            };

            employee.Sizes.Add(new EmployeeSize {
                Size = size, SizeType = sizeType, Employee = employee
            });

            var itemType = Substitute.For <ItemsType>();

            itemType.SizeType.Returns(sizeType);
            var nomenclature = Substitute.For <Nomenclature>();

            nomenclature.Id.Returns(25);
            nomenclature.Type.Returns(itemType);
            nomenclature.MatchingEmployeeSex(Sex.M).Returns(true);
            var protectionTools = Substitute.For <ProtectionTools>();

            protectionTools.MatchedNomenclatures.Returns(new[] { nomenclature });
            var normItem = Substitute.For <NormItem>();

            normItem.ProtectionTools.Returns(protectionTools);

            var employeeItem = new EmployeeCardItem(employee, normItem);

            var stockPosition = new StockPosition(nomenclature, 0, size, null);
            var result        = employeeItem.MatcheStockPosition(stockPosition);

            Assert.That(result, Is.True);
        }
Exemple #11
0
        public void SetIssueDateManual(EmployeeCardItem row)
        {
            var operations = employeeIssueRepository.GetOperationsForEmployee(UoW, Entity, row.ProtectionTools).OrderByDescending(x => x.OperationTime).ToList();
            IPage <ManualEmployeeIssueOperationViewModel> page;

            if (!operations.Any() || operations.First().ExpiryByNorm < DateTime.Today)
            {
                page = navigation.OpenViewModel <ManualEmployeeIssueOperationViewModel, IEntityUoWBuilder, EmployeeCardItem>(employeeViewModel, EntityUoWBuilder.ForCreate(), row, OpenPageOptions.AsSlave);
            }
            else if (operations.First().OverrideBefore)
            {
                page = navigation.OpenViewModel <ManualEmployeeIssueOperationViewModel, IEntityUoWBuilder, EmployeeCardItem>(employeeViewModel, EntityUoWBuilder.ForOpen(operations.First().Id), row, OpenPageOptions.AsSlave);
            }
            else if (interactive.Question($"Для «{row.ProtectionTools.Name}» уже выполнялись полноценные выдачи, внесение ручных изменений может привести к нежелательным результатам. Продолжить?"))
            {
                page = navigation.OpenViewModel <ManualEmployeeIssueOperationViewModel, IEntityUoWBuilder, EmployeeCardItem>(employeeViewModel, EntityUoWBuilder.ForCreate(), row, OpenPageOptions.AsSlave);
            }
            else
            {
                return;
            }
            page.PageClosed += SetIssueDateManual_PageClosed;
        }
Exemple #12
0
        public void RecalculateLastIssue(EmployeeCardItem row)
        {
            var operation = row.LastIssueOperation;

            //Если строку нормы по которой выдавали удалили, пытаемся пере-подвязать к имеющийся совпадающей по СИЗ
            if (!row.EmployeeCard.WorkwearItems.Any(x => x.ActiveNormItem.IsSame(operation.NormItem)))
            {
                if (row.EmployeeCard.WorkwearItems.Any(x => x.ProtectionTools.Id == operation.ProtectionTools.Id))
                {
                    var norm = row.EmployeeCard.WorkwearItems
                               .Where(x => x.ProtectionTools.Id == operation.ProtectionTools.Id)
                               .Select(x => x.ActiveNormItem)
                               .FirstOrDefault();
                    if (norm != null)
                    {
                        operation.NormItem = norm;
                    }
                }
            }
            var graph = IssueGraph.MakeIssueGraph(UoW, row.EmployeeCard, operation.ProtectionTools);

            operation.RecalculateDatesOfIssueOperation(graph, BaseParameters, interactive);
            row.UpdateNextIssue(UoW);
        }
Exemple #13
0
 public void OpenProtectionTools(EmployeeCardItem row)
 {
     navigation.OpenViewModel <ProtectionToolsViewModel, IEntityUoWBuilder>(employeeViewModel, EntityUoWBuilder.ForOpen(row.ProtectionTools.Id));
 }
Exemple #14
0
 public void OpenTimeLine(EmployeeCardItem item)
 {
     navigation.OpenViewModel <EmployeeIssueGraphViewModel, EmployeeCard, ProtectionTools>(employeeViewModel, Entity, item.ProtectionTools);
 }
        protected override IQueryOver <EmployeeCard> ItemsQuery(IUnitOfWork uow)
        {
            EmployeeNotificationJournalNode resultAlias = null;

            Post             postAlias        = null;
            Subdivision      subdivisionAlias = null;
            EmployeeCard     employeeAlias    = null;
            EmployeeCardItem itemAlias        = null;
            ProtectionTools  toolsAlias       = null;
            ItemsType        typesAlias       = null;

            var employees = uow.Session.QueryOver(() => employeeAlias);

            DateTime startTime;

            if (Filter.ShowOverdue)
            {
                startTime = DateTime.MinValue;
            }
            else
            {
                startTime = Filter.StartDateIssue;
            }

            if (Filter.ShowOnlyWork)
            {
                employees.Where(() => employeeAlias.DismissDate == null);
            }
            if (Filter.ShowOnlyLk)
            {
                employees.Where(() => employeeAlias.LkRegistered);
            }
            if (Filter.Subdivision != null)
            {
                employees.Where(() => employeeAlias.Subdivision.Id == Filter.Subdivision.Id);
            }

            employees
            .JoinAlias(() => employeeAlias.WorkwearItems, () => itemAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin);
            if (Filter.ContainsPeriod)
            {
                employees = employees.Where(() => itemAlias.NextIssue >= startTime && itemAlias.NextIssue <= Filter.EndDateIssue);
            }

            if (Filter.ContainsDateBirthPeriod)
            {
                if (Filter.StartDateBirth.Month <= Filter.EndDateBirth.Month)
                {
                    var projection = Projections.SqlFunction(
                        new SQLFunctionTemplate(NHibernateUtil.DateTime,
                                                "(DATE_FORMAT(?1,'%m%d%h%i') between DATE_FORMAT(?2,'%m%d%h%i') and DATE_FORMAT(?3,'%m%d%h%i'))"),
                        NHibernateUtil.DateTime,
                        Projections.Property(() => employeeAlias.BirthDate),
                        Projections.Constant(Filter.StartDateBirth),
                        Projections.Constant(Filter.EndDateBirth)
                        );
                    employees.Where(x => x.BirthDate != null).And(Restrictions.Eq(projection, true));
                }
                else
                {
                    //когда в период попадает переход между годами
                    var projection = Projections.SqlFunction(
                        new SQLFunctionTemplate(NHibernateUtil.DateTime,
                                                "(DATE_FORMAT(?1,'%m%d%h%i') between DATE_FORMAT(?2,'%m%d%h%i') and DATE_FORMAT(?4,'%m%d%h%i') " +
                                                "OR DATE_FORMAT(?1,'%m%d%h%i') between DATE_FORMAT(?5,'%m%d%h%i') and DATE_FORMAT(?3,'%m%d%h%i'))"),
                        NHibernateUtil.DateTime,
                        Projections.Property(() => employeeAlias.BirthDate),
                        Projections.Constant(Filter.StartDateBirth),
                        Projections.Constant(Filter.EndDateBirth),
                        Projections.Constant(new DateTime(1, 12, 31)),
                        Projections.Constant(new DateTime(1, 1, 1))
                        );
                    employees.Where(x => x.BirthDate != null).And(Restrictions.Eq(projection, true));
                }
            }

            switch (Filter.IsueType)
            {
            case (AskIssueType.Personal):
                employees
                .JoinAlias(() => itemAlias.ProtectionTools, () => toolsAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                .JoinAlias(() => toolsAlias.Type, () => typesAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                .Where(() => typesAlias.IssueType == IssueType.Personal);
                break;

            case (AskIssueType.Сollective):
                employees
                .JoinAlias(() => itemAlias.ProtectionTools, () => toolsAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                .JoinAlias(() => toolsAlias.Type, () => typesAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                .Where(() => typesAlias.IssueType == IssueType.Collective);
                break;
            }

            employees
            .Where(GetSearchCriterion(
                       () => employeeAlias.Id,
                       () => employeeAlias.CardNumber,
                       () => employeeAlias.PersonnelNumber,
                       () => employeeAlias.LastName,
                       () => employeeAlias.FirstName,
                       () => employeeAlias.Patronymic,
                       () => employeeAlias.PhoneNumber,
                       () => postAlias.Name,
                       () => subdivisionAlias.Name
                       ))
            .JoinAlias(() => employeeAlias.Post, () => postAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
            .JoinAlias(() => employeeAlias.Subdivision, () => subdivisionAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
            .SelectList(list => list
                        .SelectGroup(x => x.Id).WithAlias(() => resultAlias.Id)
                        .Select(x => x.CardNumber).WithAlias(() => resultAlias.CardNumber)
                        .Select(x => x.PersonnelNumber).WithAlias(() => resultAlias.PersonnelNumber)
                        .Select(x => x.FirstName).WithAlias(() => resultAlias.FirstName)
                        .Select(x => x.LastName).WithAlias(() => resultAlias.LastName)
                        .Select(x => x.Patronymic).WithAlias(() => resultAlias.Patronymic)
                        .Select(x => x.DismissDate).WithAlias(() => resultAlias.DismissDate)
                        .Select(x => x.PhoneNumber).WithAlias(() => resultAlias.Phone)
                        .Select(x => x.LkRegistered).WithAlias(() => resultAlias.LkRegistered)
                        .SelectCount(() => itemAlias.Id).WithAlias(() => resultAlias.IssueCount)
                        .Select(() => postAlias.Name).WithAlias(() => resultAlias.Post)
                        .Select(() => subdivisionAlias.Name).WithAlias(() => resultAlias.Subdivision)
                        .Select(x => x.BirthDate).WithAlias(() => resultAlias.BirthDate)
                        );
            if (Filter.ContainsDateBirthPeriod)
            {
                if (Filter.StartDateBirth.Month <= Filter.EndDateBirth.Month)
                {
                    employees = employees
                                .OrderBy(() => employeeAlias.BirthDate.Value.Month).Asc;
                }
                else
                {
                    employees = employees
                                .OrderBy(() => employeeAlias.BirthDate.Value.Month).Desc;
                }
                employees = employees
                            .ThenBy(() => employeeAlias.BirthDate.Value.Day).Asc
                            .ThenBy(() => employeeAlias.LastName).Asc
                            .ThenBy(() => employeeAlias.FirstName).Asc
                            .ThenBy(() => employeeAlias.Patronymic).Asc;
            }
            else
            {
                employees = employees.OrderBy(() => employeeAlias.LastName).Asc
                            .ThenBy(() => employeeAlias.FirstName).Asc
                            .ThenBy(() => employeeAlias.Patronymic).Asc;
            }

            return(employees.TransformUsing(Transformers.AliasToBean <EmployeeNotificationJournalNode>()));
        }