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); }
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); }
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; }
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); }
public void OpenProtectionTools(EmployeeCardItem row) { navigation.OpenViewModel <ProtectionToolsViewModel, IEntityUoWBuilder>(employeeViewModel, EntityUoWBuilder.ForOpen(row.ProtectionTools.Id)); }
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>())); }