Esempio n. 1
0
        public void UpdateOperations_EmployeeIssueOperation_CanChangeWearPercentTest()
        {
            var uow = Substitute.For <IUnitOfWork>();

            var nomeclature = Substitute.For <Nomenclature>();

            var employee = Substitute.For <EmployeeCard>();

            var issueOperation = new EmployeeIssueOperation {
                OperationTime = new DateTime(2019, 1, 1),
                StartOfUse    = new DateTime(2019, 1, 1),
                Issued        = 10,
                Nomenclature  = nomeclature,
                WearPercent   = 0,
                ExpiryByNorm  = new DateTime(2019, 1, 15),
                Employee      = employee
            };

            var writeoff = new Writeoff {
                Date = new DateTime(2019, 1, 15)
            };

            writeoff.AddItem(issueOperation, 2);

            Assert.That(writeoff.Items[0].WearPercent, Is.EqualTo(1));
            //Меняем значение процента износа
            writeoff.Items[0].WearPercent = 2;

            //Выполняем
            writeoff.UpdateOperations(uow);

            Assert.That(writeoff.Items[0].WearPercent, Is.EqualTo(2));
        }
Esempio n. 2
0
        public void UpdateOperations_DontMoveDateIfWriteofAtIssueDate()
        {
            var uow      = Substitute.For <IUnitOfWork>();
            var employee = Substitute.For <EmployeeCard>();
            var norm     = Substitute.For <NormItem>();

            norm.Amount.Returns(1);
            var nomeclature = Substitute.For <Nomenclature>();

            var operationIssue = Substitute.For <EmployeeIssueOperation>();

            operationIssue.Id.Returns(1);
            operationIssue.OperationTime.Returns(new DateTime(2019, 1, 15));
            operationIssue.Issued.Returns(2);
            var operationWriteoff = Substitute.For <EmployeeIssueOperation>();

            operationWriteoff.Id.Returns(2);
            operationWriteoff.IssuedOperation.Returns(operationIssue);
            operationWriteoff.OperationTime.Returns(new DateTime(2019, 1, 15));
            operationWriteoff.Returned.Returns(2);

            var operation = new EmployeeIssueOperation();

            operation.OperationTime = new DateTime(2019, 1, 15);
            operation.NormItem      = norm;

            IssueGraph.MakeIssueGraphTestGap = (e, t) => new IssueGraph(new List <EmployeeIssueOperation>()
            {
                operation, operationIssue, operationWriteoff
            });

            var expenseItem = new ExpenseItem();

            expenseItem.Nomenclature           = nomeclature;
            expenseItem.EmployeeIssueOperation = operation;
            expenseItem.Amount = 1;
            var expense = new Expense();

            expense.Employee  = employee;
            expense.Date      = new DateTime(2019, 1, 15);
            expense.Operation = ExpenseOperations.Employee;
            expense.Items.Add(expenseItem);
            expenseItem.ExpenseDoc = expense;

            var ask            = Substitute.For <IInteractiveQuestion>();
            var baseParameters = Substitute.For <BaseParameters>();

            baseParameters.ColDayAheadOfShedule.Returns(0);

            //Выполняем
            expense.UpdateOperations(uow, baseParameters, ask);

            //В данном сценарии мы не должны ничего спрашивать у пользователя. Предпологается что мы могли попросить передвинуть дату начала, на тот же день, так как списание было в этот день. реальный случай.
            ask.DidNotReceiveWithAnyArgs().Question(string.Empty);

            Assert.That(expense.Items[0].EmployeeIssueOperation.OperationTime,
                        Is.EqualTo(new DateTime(2019, 1, 15))
                        );
        }
        public void RecalculateDatesOfIssueOperation_DontMoveStartOfUseTest()
        {
            var employee = Substitute.For <EmployeeCard>();

            var protectionTools = Substitute.For <ProtectionTools>();

            var norm = new NormItem()
            {
                Amount          = 1,
                NormPeriod      = NormPeriodType.Month,
                PeriodCount     = 24,
                ProtectionTools = protectionTools
            };

            var nomenclature = Substitute.For <Nomenclature>();

            nomenclature.TypeName.Returns("fake");

            var operation1 = Substitute.For <EmployeeIssueOperation>();

            operation1.ProtectionTools.Returns(protectionTools);
            operation1.OperationTime.Returns(new DateTime(2019, 4, 30));
            operation1.StartOfUse.Returns(new DateTime(2019, 4, 30));
            operation1.AutoWriteoffDate.Returns(new DateTime(2021, 4, 30));
            operation1.ExpiryByNorm.Returns(new DateTime(2021, 4, 30));
            operation1.Issued.Returns(1);

            var issue = new EmployeeIssueOperation
            {
                ProtectionTools  = protectionTools,
                Employee         = employee,
                Nomenclature     = nomenclature,
                NormItem         = norm,
                OperationTime    = new DateTime(2021, 4, 20),
                StartOfUse       = new DateTime(2021, 4, 20),
                AutoWriteoffDate = new DateTime(2023, 4, 20),
                ExpiryByNorm     = new DateTime(2023, 4, 20),
                Issued           = 1
            };

            var operations = new List <EmployeeIssueOperation>()
            {
                operation1, issue
            };
            var graph = new IssueGraph(operations);

            var ask = Substitute.For <IInteractiveQuestion>();

            ask.Question(Arg.Any <string>()).ReturnsForAnyArgs(false);

            var baseParameters = Substitute.For <BaseParameters>();

            baseParameters.ColDayAheadOfShedule.Returns(15);

            issue.RecalculateDatesOfIssueOperation(graph, baseParameters, ask);

            Assert.That(issue.StartOfUse, Is.EqualTo(new DateTime(2021, 4, 20)));
            Assert.That(issue.ExpiryByNorm, Is.EqualTo(new DateTime(2023, 4, 20)));
        }
Esempio n. 4
0
        public int AmountAtEndOfDay(DateTime date, EmployeeIssueOperation excludeOperation = null)
        {
            var interval = IntervalOfDate(date);

            if (interval == null)
            {
                return(0);
            }
            return(interval.ActiveItems.Sum(x => x.AmountAtEndOfDay(date, excludeOperation)));
        }
        public void RecalculateDatesOfIssueOperation_LifeTimeAppendOnVacationTest()
        {
            var vacationType = Substitute.For <VacationType>();

            vacationType.ExcludeFromWearing.Returns(true);

            var employee = Substitute.For <EmployeeCard>();
            var vacation = Substitute.For <EmployeeVacation>();

            vacation.VacationType.Returns(vacationType);
            vacation.Employee.Returns(employee);
            vacation.BeginDate.Returns(new DateTime(2019, 2, 1));
            vacation.EndDate.Returns(new DateTime(2019, 2, 10));
            employee.Vacations.Returns(new List <EmployeeVacation> {
                vacation
            });

            var protectionTools = Substitute.For <ProtectionTools>();

            var norm = new NormItem();

            norm.Amount      = 2;
            norm.PeriodCount = 3;
            norm.NormPeriod  = NormPeriodType.Month;

            var nomenclature = Substitute.For <Nomenclature>();

            nomenclature.TypeName.Returns("fake");

            var operations = new List <EmployeeIssueOperation>()
            {
            };

            var graph = new IssueGraph(operations);
            var issue = new EmployeeIssueOperation();

            issue.Employee        = employee;
            issue.Nomenclature    = nomenclature;
            issue.ProtectionTools = protectionTools;
            issue.NormItem        = norm;
            issue.OperationTime   = new DateTime(2019, 1, 10);
            issue.Issued          = 2;

            var ask = Substitute.For <IInteractiveQuestion>();

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

            var baseParameters = Substitute.For <BaseParameters>();

            baseParameters.ColDayAheadOfShedule.Returns(0);

            issue.RecalculateDatesOfIssueOperation(graph, baseParameters, ask);

            Assert.That(issue.ExpiryByNorm, Is.EqualTo(new DateTime(2019, 4, 20)));
        }
        public void RecalculateDatesOfIssueOperation_MoveFirstLessNormTest()
        {
            var employee = Substitute.For <EmployeeCard>();

            var protectionTools = Substitute.For <ProtectionTools>();

            var operation1 = Substitute.For <EmployeeIssueOperation>();

            operation1.ProtectionTools.Returns(protectionTools);
            operation1.OperationTime.Returns(new DateTime(2018, 1, 1));
            operation1.AutoWriteoffDate.Returns(new DateTime(2018, 2, 1));
            operation1.Issued.Returns(2);

            var norm = Substitute.For <NormItem>();

            norm.Amount.Returns(2);
            norm.PeriodInMonths.Returns(1);
            norm.CalculateExpireDate(new DateTime(2018, 2, 1)).Returns(new DateTime(2018, 3, 1));

            var nomenclature = Substitute.For <Nomenclature>();

            nomenclature.TypeName.Returns("fake");

            var operation2 = Substitute.For <EmployeeIssueOperation>();

            operation2.ProtectionTools.Returns(protectionTools);
            operation2.OperationTime.Returns(new DateTime(2018, 2, 1));

            var operations = new List <EmployeeIssueOperation>()
            {
                operation1, operation2
            };

            var graph = new IssueGraph(operations);
            var issue = new EmployeeIssueOperation();

            issue.ProtectionTools = protectionTools;
            issue.Employee        = employee;
            issue.Nomenclature    = nomenclature;
            issue.NormItem        = norm;
            issue.OperationTime   = new DateTime(2018, 1, 15);
            issue.Issued          = 2;

            var ask = Substitute.For <IInteractiveQuestion>();

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

            var baseParameters = Substitute.For <BaseParameters>();

            baseParameters.ColDayAheadOfShedule.Returns(0);

            issue.RecalculateDatesOfIssueOperation(graph, baseParameters, ask);

            Assert.That(issue.ExpiryByNorm, Is.EqualTo(new DateTime(2018, 3, 1)));
        }
Esempio n. 7
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);
            }
        }
        public void CalculatePercentWear_Writeoff_WearPercentTest_50Percent()
        {
            var issue = new EmployeeIssueOperation();

            issue.StartOfUse   = new DateTime(2018, 1, 31);
            issue.ExpiryByNorm = new DateTime(2018, 2, 10);

            var atDate = new DateTime(2018, 2, 5);
            var result = issue.CalculatePercentWear(atDate);

            Assert.That(result, Is.EqualTo(0.5m));
        }
Esempio n. 9
0
        public int UsedAmountAtEndOfDay(DateTime date, EmployeeIssueOperation excludeOperation = null)
        {
            var interval = IntervalOfDate(date);

            if (interval == null)
            {
                return(0);
            }
            return(interval.ActiveItems
                   .Where(x => x.IssueOperation.StartOfUse == null || x.IssueOperation.StartOfUse.Value.Date <= date.Date)
                   .Sum(x => x.AmountAtEndOfDay(date, excludeOperation)));
        }
        public void CalculatePercentWear_Writeoff_WearPercentTest_StartPercentPlus10()
        {
            var issue = new EmployeeIssueOperation();

            issue.WearPercent  = 0.45m;
            issue.StartOfUse   = new DateTime(2018, 1, 1);
            issue.ExpiryByNorm = new DateTime(2018, 1, 11);

            var atDate = new DateTime(2018, 1, 2);
            var result = issue.CalculatePercentWear(atDate);

            Assert.That(result, Is.EqualTo(0.55m));
        }
Esempio n. 11
0
        public void UpdateOperations_DontMoveDateIfAtLastDateAmountEnough()
        {
            var uow      = Substitute.For <IUnitOfWork>();
            var employee = Substitute.For <EmployeeCard>();
            var norm     = Substitute.For <NormItem>();

            norm.Amount.Returns(1);
            var nomeclature = Substitute.For <Nomenclature>();
            var operationBeforeAndEnough = Substitute.For <EmployeeIssueOperation>();

            operationBeforeAndEnough.OperationTime.Returns(new DateTime(2018, 10, 15));
            operationBeforeAndEnough.Issued.Returns(2);

            var operation = new EmployeeIssueOperation();

            operation.OperationTime = new DateTime(2019, 1, 15);
            operation.NormItem      = norm;

            IssueGraph.MakeIssueGraphTestGap = (e, t) => new IssueGraph(new List <EmployeeIssueOperation>()
            {
                operation, operationBeforeAndEnough
            });

            var expenseItem = new ExpenseItem();

            expenseItem.Nomenclature           = nomeclature;
            expenseItem.EmployeeIssueOperation = operation;
            expenseItem.Amount = 1;
            var expense = new Expense();

            expense.Employee  = employee;
            expense.Date      = new DateTime(2019, 1, 15);
            expense.Operation = ExpenseOperations.Employee;
            expense.Items.Add(expenseItem);
            expenseItem.ExpenseDoc = expense;

            var ask            = Substitute.For <IInteractiveQuestion>();
            var baseParameters = Substitute.For <BaseParameters>();

            baseParameters.ColDayAheadOfShedule.Returns(0);

            //Выполняем
            expense.UpdateOperations(uow, baseParameters, ask);

            //В данном сценарии мы не должны ничего спрашивать у пользователя. Предпологается что мы могли попросить передвинуть дату начала, не учитывая что на конец интервала количество все равно достаточное.
            ask.DidNotReceiveWithAnyArgs().Question(string.Empty);

            Assert.That(expense.Items[0].EmployeeIssueOperation.OperationTime,
                        Is.EqualTo(new DateTime(2019, 1, 15))
                        );
        }
Esempio n. 12
0
        public void UpdateOperations_IgnoreSelfOperationsWhenChangeDateOfDocument()
        {
            var uow      = Substitute.For <IUnitOfWork>();
            var employee = Substitute.For <EmployeeCard>();
            var norm     = Substitute.For <NormItem>();

            norm.Amount.Returns(1);
            var incomeOperation = Substitute.For <EmployeeIssueOperation>();
            var nomeclature     = Substitute.For <Nomenclature>();

            var operation = new EmployeeIssueOperation();

            operation.OperationTime   = new DateTime(2019, 1, 15);
            operation.NormItem        = norm;
            operation.IssuedOperation = incomeOperation;

            IssueGraph.MakeIssueGraphTestGap = (e, t) => new IssueGraph(new List <EmployeeIssueOperation>()
            {
                operation
            });

            var expenseItem = new ExpenseItem();

            expenseItem.Nomenclature           = nomeclature;
            expenseItem.EmployeeIssueOperation = operation;
            expenseItem.Amount = 1;
            var expense = new Expense();

            expense.Employee  = employee;
            expense.Date      = new DateTime(2019, 1, 15);
            expense.Operation = ExpenseOperations.Employee;
            expense.Items.Add(expenseItem);
            expenseItem.ExpenseDoc = expense;

            var ask            = Substitute.For <IInteractiveQuestion>();
            var baseParameters = Substitute.For <BaseParameters>();

            baseParameters.ColDayAheadOfShedule.Returns(0);

            //Выполняем
            expense.UpdateOperations(uow, baseParameters, ask);

            //В данном сценарии мы не должны ничего спрашивать у пользователя. Предпологается что мы могли попросить передвинуть дату начала, если бы не проигнорировали свою же операцию.
            ask.DidNotReceiveWithAnyArgs().Question(string.Empty);

            Assert.That(expense.Items[0].EmployeeIssueOperation.OperationTime,
                        Is.EqualTo(new DateTime(2019, 1, 15))
                        );
        }
        public void RecalculateDatesOfIssueOperation_LifeTimeAppendProportionalTest()
        {
            var employee = Substitute.For <EmployeeCard>();

            var protectionTools = Substitute.For <ProtectionTools>();

            var operation1 = Substitute.For <EmployeeIssueOperation>();

            operation1.OperationTime.Returns(new DateTime(2018, 1, 1));
            operation1.AutoWriteoffDate.Returns(new DateTime(2018, 2, 1));
            operation1.Issued.Returns(2);

            var norm = new NormItem();

            norm.Amount      = 2;
            norm.PeriodCount = 1;
            norm.NormPeriod  = NormPeriodType.Month;

            var nomenclature = Substitute.For <Nomenclature>();

            nomenclature.TypeName.Returns("fake");

            var operations = new List <EmployeeIssueOperation>()
            {
                operation1
            };

            var graph = new IssueGraph(operations);
            var issue = new EmployeeIssueOperation();

            issue.Employee        = employee;
            issue.Nomenclature    = nomenclature;
            issue.ProtectionTools = protectionTools;
            issue.NormItem        = norm;
            issue.OperationTime   = new DateTime(2018, 3, 10);
            issue.Issued          = 3;

            var ask = Substitute.For <IInteractiveQuestion>();

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

            var baseParameters = Substitute.For <BaseParameters>();

            baseParameters.ColDayAheadOfShedule.Returns(0);

            issue.RecalculateDatesOfIssueOperation(graph, baseParameters, ask);

            Assert.That(issue.ExpiryByNorm, Is.EqualTo(new DateTime(2018, 4, 25)));
        }
Esempio n. 14
0
        public void MakeIssueGraph_UseManualOperationsTest()
        {
            using (var uow = UnitOfWorkFactory.CreateWithoutRoot()) {
                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 employee = new EmployeeCard();
                uow.Save(employee);

                //Операция без номеклатуры
                var manualOp = new EmployeeIssueOperation();
                manualOp.OperationTime    = new DateTime(2019, 1, 1, 14, 0, 0);
                manualOp.AutoWriteoffDate = new DateTime(2020, 1, 1);
                manualOp.Employee         = employee;
                manualOp.ProtectionTools  = protectionTools;
                manualOp.Issued           = 1;
                manualOp.OverrideBefore   = true;
                uow.Save(manualOp);

                var expenseOp = new EmployeeIssueOperation();
                expenseOp.OperationTime    = new DateTime(2020, 1, 1, 13, 0, 0);
                expenseOp.AutoWriteoffDate = new DateTime(2021, 1, 1);
                expenseOp.Employee         = employee;
                expenseOp.Nomenclature     = nomenclature;
                expenseOp.ProtectionTools  = protectionTools;
                expenseOp.Issued           = 1;
                uow.Save(expenseOp);

                uow.Commit();

                var graph = IssueGraph.MakeIssueGraph(uow, employee, protectionTools);
                Assert.That(graph.Intervals.Count, Is.EqualTo(3));
                var first = graph.OrderedIntervals.First();
                Assert.That(first.StartDate, Is.EqualTo(new DateTime(2019, 1, 1)));
            }
        }
Esempio n. 15
0
        public virtual WriteoffItem AddItem(EmployeeIssueOperation operation, int count)
        {
            if (operation.Issued == 0)
            {
                throw new InvalidOperationException("Этот метод можно использовать только с операциями выдачи.");
            }

            if (Items.Any(p => DomainHelper.EqualDomainObjects(p.EmployeeWriteoffOperation?.IssuedOperation, operation)))
            {
                logger.Warn("Номенклатура из этой выдачи уже добавлена. Пропускаем...");
                return(null);
            }
            var item = new WriteoffItem(this, operation, count);

            ObservableItems.Add(item);
            return(item);
        }
Esempio n. 16
0
        /// <summary>
        /// Количество числящееся на конец дня, включает списания произведенные в этот день.
        /// </summary>
        /// <param name="excludeOperation">Исключить из расчета указанные операции</param>
        public int AmountAtEndOfDay(DateTime date, EmployeeIssueOperation excludeOperation = null)
        {
            if (IssueOperation == excludeOperation || (IssueOperation.Id > 0 && IssueOperation.Id == excludeOperation?.Id))
            {
                return(0);
            }

            if (IssueOperation.OperationTime.Date > date)
            {
                return(0);
            }

            if (IssueOperation.AutoWriteoffDate.HasValue && IssueOperation.AutoWriteoffDate.Value.Date <= date.Date)
            {
                return(0);
            }

            return(IssueOperation.Issued - WriteOffOperations.Where(x => !(x == excludeOperation || (x.Id > 0 && x.Id == excludeOperation?.Id)))
                   .Where(x => x.OperationTime.Date <= date.Date).Sum(x => x.Returned));
        }
Esempio n. 17
0
        public IList <EmployeeIssueOperation> GetLastIssueOperationsForEmployee(
            IEnumerable <EmployeeCard> employees,
            Action <IQueryOver <EmployeeIssueOperation,
                                EmployeeIssueOperation> > makeEager = null, IUnitOfWork uow = null)
        {
            EmployeeIssueOperation employeeIssueOperationAlias  = null;
            EmployeeIssueOperation employeeIssueOperation2Alias = null;
            var ids   = employees.Select(x => x.Id).Distinct().ToArray();
            var query = (uow ?? RepoUow).Session.QueryOver <EmployeeIssueOperation>(() => employeeIssueOperationAlias)
                        .Where(o => o.Employee.IsIn(ids))
                        .Where(() => employeeIssueOperationAlias.Issued > 0)
                        .JoinEntityAlias(() => employeeIssueOperation2Alias,
                                         () => employeeIssueOperationAlias.ProtectionTools.Id == employeeIssueOperation2Alias.ProtectionTools.Id &&
                                         employeeIssueOperationAlias.Employee.Id == employeeIssueOperation2Alias.Employee.Id &&
                                         employeeIssueOperation2Alias.Issued > 0 &&
                                         employeeIssueOperationAlias.OperationTime < employeeIssueOperation2Alias.OperationTime
                                         , JoinType.LeftOuterJoin)
                        .Where(() => employeeIssueOperation2Alias.Id == null);

            makeEager?.Invoke(query);

            return(query.List());
        }
        public static IList <EmployeeRecivedInfo> ItemsBalance(IUnitOfWork uow, EmployeeCard employee, DateTime onDate)
        {
            EmployeeRecivedInfo resultAlias = null;

            EmployeeIssueOperation employeeIssueOperationAlias         = null;
            EmployeeIssueOperation employeeIssueOperationReceivedAlias = null;

            IProjection projection = Projections.SqlFunction(
                new SQLFunctionTemplate(NHibernateUtil.Int32, "SUM(IFNULL(?1, 0) - IFNULL(?2, 0))"),
                NHibernateUtil.Int32,
                Projections.Property <EmployeeIssueOperation>(x => x.Issued),
                Projections.Property <EmployeeIssueOperation>(x => x.Returned)
                );

            IProjection projectionIssueDate = Projections.SqlFunction(
                new SQLFunctionTemplate(NHibernateUtil.Date, "MAX(CASE WHEN ?1 > 0 THEN ?2 END)"),
                NHibernateUtil.Date,
                Projections.Property <EmployeeIssueOperation>(x => x.Issued),
                Projections.Property <EmployeeIssueOperation>(x => x.OperationTime)
                );

            return(uow.Session.QueryOver <EmployeeIssueOperation>(() => employeeIssueOperationAlias)
                   .Left.JoinAlias(x => x.IssuedOperation, () => employeeIssueOperationReceivedAlias)
                   .Where(x => x.Employee == employee)
                   .Where(() => employeeIssueOperationAlias.AutoWriteoffDate == null || employeeIssueOperationAlias.AutoWriteoffDate > onDate)
                   .Where(() => employeeIssueOperationReceivedAlias.AutoWriteoffDate == null || employeeIssueOperationReceivedAlias.AutoWriteoffDate > onDate)
                   .SelectList(list => list
                               .SelectGroup(() => employeeIssueOperationAlias.ProtectionTools.Id).WithAlias(() => resultAlias.ProtectionToolsId)
                               .SelectGroup(() => employeeIssueOperationAlias.NormItem.Id).WithAlias(() => resultAlias.NormRowId)
                               .Select(projectionIssueDate).WithAlias(() => resultAlias.LastReceive)
                               .Select(projection).WithAlias(() => resultAlias.Amount)
                               .Select(() => employeeIssueOperationAlias.Nomenclature.Id).WithAlias(() => resultAlias.NomenclatureId)
                               )
                   .TransformUsing(Transformers.AliasToBean <EmployeeRecivedInfo>())
                   .List <EmployeeRecivedInfo>());
        }
Esempio n. 19
0
        public IList <OperationToDocumentReference> GetReferencedDocuments(params int[] operationsIds)
        {
            OperationToDocumentReference docAlias = null;
            EmployeeIssueOperation       employeeIssueOperationAlias = null;
            ExpenseItem           expenseItemAlias           = null;
            IncomeItem            incomeItemAlias            = null;
            CollectiveExpenseItem collectiveExpenseItemAlias = null;
            WriteoffItem          writeoffItemAlias          = null;

            var result = RepoUow.Session.QueryOver <EmployeeIssueOperation>(() => employeeIssueOperationAlias)
                         .JoinEntityAlias(() => expenseItemAlias, () => expenseItemAlias.EmployeeIssueOperation.Id == employeeIssueOperationAlias.Id, JoinType.LeftOuterJoin)
                         .JoinEntityAlias(() => collectiveExpenseItemAlias, () => collectiveExpenseItemAlias.EmployeeIssueOperation.Id == employeeIssueOperationAlias.Id, JoinType.LeftOuterJoin)
                         .JoinEntityAlias(() => incomeItemAlias, () => incomeItemAlias.ReturnFromEmployeeOperation.Id == employeeIssueOperationAlias.Id, JoinType.LeftOuterJoin)
                         .JoinEntityAlias(() => writeoffItemAlias, () => writeoffItemAlias.EmployeeWriteoffOperation.Id == employeeIssueOperationAlias.Id, JoinType.LeftOuterJoin)
                         .Where(x => x.Id.IsIn(operationsIds))
                         .SelectList(list => list
                                     .Select(i => i.Id).WithAlias(() => docAlias.OperationId)
                                     .Select(() => expenseItemAlias.Id).WithAlias(() => docAlias.ExpenceItemId)
                                     .Select(() => expenseItemAlias.ExpenseDoc.Id).WithAlias(() => docAlias.ExpenceId)
                                     .Select(() => collectiveExpenseItemAlias.Id).WithAlias(() => docAlias.CollectiveExpenseItemId)
                                     .Select(() => collectiveExpenseItemAlias.Document.Id).WithAlias(() => docAlias.CollectiveExpenseId)
                                     .Select(() => incomeItemAlias.Id).WithAlias(() => docAlias.IncomeItemId)
                                     .Select(() => incomeItemAlias.Document.Id).WithAlias(() => docAlias.IncomeId)
                                     .Select(() => writeoffItemAlias.Id).WithAlias(() => docAlias.WriteoffItemId)
                                     .Select(() => writeoffItemAlias.Document.Id).WithAlias(() => docAlias.WriteoffId)
                                     )
                         .TransformUsing(Transformers.AliasToBean <OperationToDocumentReference>())
                         .List <OperationToDocumentReference>();

            foreach (var item in result)
            {
                item.OperationType = OperationType.EmployeeIssue;
            }

            return(result);
        }
        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));
            }
        }
Esempio n. 21
0
        public void UpdateRelatedOperations_ChangeVacationRecalculateOperations()
        {
            var uow = Substitute.For <IUnitOfWork>();

            var employee = new EmployeeCard();

            var vacationType = Substitute.For <VacationType>();

            vacationType.ExcludeFromWearing.Returns(true);

            var vacation = new EmployeeVacation();

            vacation.Employee     = employee;
            vacation.BeginDate    = new DateTime(2019, 3, 1);
            vacation.EndDate      = new DateTime(2019, 3, 10);
            vacation.VacationType = vacationType;

            employee.Vacations.Add(vacation);

            var norm = new NormItem();

            norm.Amount      = 1;
            norm.PeriodCount = 3;
            norm.NormPeriod  = NormPeriodType.Month;

            var nomenclatureType = Substitute.For <ItemsType>();
            var protectionTools  = Substitute.For <ProtectionTools>();

            var nomenclature = Substitute.For <Nomenclature>();

            nomenclature.TypeName.Returns("fake");
            nomenclature.Type.Returns(nomenclatureType);

            var issue = new EmployeeIssueOperation();

            issue.UseAutoWriteoff = true;
            issue.Employee        = employee;
            issue.Nomenclature    = nomenclature;
            issue.ProtectionTools = protectionTools;
            issue.NormItem        = norm;
            issue.OperationTime   = new DateTime(2019, 2, 10);
            issue.StartOfUse      = new DateTime(2019, 2, 10);
            issue.ExpiryByNorm    = new DateTime(2019, 5, 10);
            issue.Issued          = 1;

            var operations = new List <EmployeeIssueOperation>()
            {
                issue
            };

            IssueGraph.MakeIssueGraphTestGap = (e, t) => new IssueGraph(operations);

            var employeeIssueRepository = Substitute.For <EmployeeIssueRepository>(uow);

            employeeIssueRepository.GetOperationsTouchDates(Arg.Any <IUnitOfWork>(), Arg.Any <EmployeeCard[]>(), Arg.Any <DateTime>(), Arg.Any <DateTime>(), Arg.Any <Action <IQueryOver <EmployeeIssueOperation, EmployeeIssueOperation> > >())
            .Returns(operations);

            var ask = Substitute.For <IInteractiveQuestion>();

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

            var baseParameters = Substitute.For <BaseParameters>();

            baseParameters.ColDayAheadOfShedule.Returns(0);

            vacation.UpdateRelatedOperations(uow, employeeIssueRepository, baseParameters, ask);

            Assert.That(issue.ExpiryByNorm, Is.EqualTo(new DateTime(2019, 5, 20)));
            Assert.That(issue.AutoWriteoffDate, Is.EqualTo(new DateTime(2019, 5, 20)));
        }
Esempio n. 22
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 CalculatePercentWear_InfinityWhenDecimalConvert()
        {
            var result = EmployeeIssueOperation.CalculatePercentWear(new DateTime(2019, 8, 2), new DateTime(2019, 7, 17), new DateTime(2019, 7, 17), 0);

            Assert.That(result, Is.EqualTo(0));
        }
 public void CalculatePercentWear_NotOverflowExceptionForDecimalConvert()
 {
     var result = EmployeeIssueOperation.CalculatePercentWear(new DateTime(2019, 1, 1), new DateTime(2019, 1, 1), new DateTime(2019, 1, 1), 0);
 }
Esempio n. 25
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)));
                }
            }
        }
Esempio n. 26
0
        public void GetLastOperationsForEmployee_HappyPathTest()
        {
            using (var uow = UnitOfWorkFactory.CreateWithoutRoot()) {
                var nomenclatureType = new ItemsType {
                    Name = "Тестовый тип номенклатуры"
                };
                uow.Save(nomenclatureType);

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

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

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

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

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

                //Лишний
                var employee3 = new EmployeeCard();
                uow.Save(employee3);

                //Операция employee1 СИЗ 1
                var opE1P1 = new EmployeeIssueOperation {
                    OperationTime    = new DateTime(2018, 1, 1, 14, 0, 0),
                    AutoWriteoffDate = new DateTime(2020, 1, 1),
                    Employee         = employee,
                    Nomenclature     = nomenclature,
                    ProtectionTools  = protectionTools,
                    Issued           = 1
                };
                uow.Save(opE1P1);

                var op2E1P1 = new EmployeeIssueOperation {
                    OperationTime    = new DateTime(2019, 1, 1, 13, 0, 0),
                    AutoWriteoffDate = new DateTime(2021, 1, 1),
                    Employee         = employee,
                    Nomenclature     = nomenclature,
                    ProtectionTools  = protectionTools,
                    Issued           = 1
                };
                uow.Save(op2E1P1);

                var opE1P2 = new EmployeeIssueOperation {
                    OperationTime    = new DateTime(2021, 1, 1, 13, 0, 0),
                    AutoWriteoffDate = new DateTime(2021, 5, 1),
                    Employee         = employee,
                    Nomenclature     = nomenclature,
                    ProtectionTools  = protectionTools2,
                    Issued           = 1
                };
                uow.Save(opE1P2);

                var opE1P2Return = new EmployeeIssueOperation {
                    OperationTime    = new DateTime(2021, 2, 1, 13, 0, 0),
                    AutoWriteoffDate = new DateTime(2021, 5, 1),
                    Employee         = employee,
                    Nomenclature     = nomenclature,
                    ProtectionTools  = protectionTools2,
                    Issued           = 0,
                    Returned         = 1
                };
                uow.Save(opE1P2Return);

                var opE2P2 = new EmployeeIssueOperation {
                    OperationTime    = new DateTime(2021, 2, 1, 14, 0, 0),
                    AutoWriteoffDate = new DateTime(2021, 5, 1),
                    Employee         = employee2,
                    Nomenclature     = nomenclature,
                    ProtectionTools  = protectionTools2,
                    Issued           = 1
                };
                uow.Save(opE2P2);

                //Не хотим видеть в выборке от сотрудника 3
                var opE3P2 = new EmployeeIssueOperation {
                    OperationTime    = new DateTime(2021, 2, 1, 14, 0, 0),
                    AutoWriteoffDate = new DateTime(2021, 5, 1),
                    Employee         = employee3,
                    Nomenclature     = nomenclature,
                    ProtectionTools  = protectionTools2,
                    Issued           = 1
                };
                uow.Save(opE3P2);

                uow.Commit();

                var repository = new EmployeeIssueRepository(uow);
                var result     = repository.GetLastIssueOperationsForEmployee(new[] { employee, employee2 });

                Assert.That(result, Has.No.Member(opE1P1));
                Assert.That(result, Has.Member(op2E1P1));
                Assert.That(result, Has.Member(opE1P2));
                Assert.That(result, Has.No.Member(opE1P2Return));
                Assert.That(result, Has.Member(opE2P2));
                Assert.That(result, Has.No.Member(opE3P2));
            }
        }
Esempio n. 27
0
        public void GetOperationsTouchDates_OneDateRangeTest()
        {
            using (var uow = UnitOfWorkFactory.CreateWithoutRoot()) {
                var nomenclatureType = new ItemsType();
                nomenclatureType.Name = "Тестовый тип номенклатуры";
                uow.Save(nomenclatureType);

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

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

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

                var opBefore = new EmployeeIssueOperation {
                    OperationTime    = new DateTime(2018, 12, 31, 14, 0, 0),
                    AutoWriteoffDate = new DateTime(2020, 1, 1),
                    Employee         = employee,
                    Nomenclature     = nomenclature,
                    ProtectionTools  = protectionTools,
                    Issued           = 1
                };
                uow.Save(opBefore);

                var opInRange = new EmployeeIssueOperation {
                    OperationTime    = new DateTime(2019, 1, 1, 0, 0, 0),
                    AutoWriteoffDate = new DateTime(2021, 1, 1),
                    Employee         = employee,
                    Nomenclature     = nomenclature,
                    ProtectionTools  = protectionTools,
                    Issued           = 1
                };
                uow.Save(opInRange);

                var opInRange2 = new EmployeeIssueOperation {
                    OperationTime    = new DateTime(2019, 1, 1, 13, 0, 0),
                    AutoWriteoffDate = new DateTime(2021, 2, 1),
                    Employee         = employee,
                    Nomenclature     = nomenclature,
                    ProtectionTools  = protectionTools,
                    Issued           = 2
                };
                uow.Save(opInRange2);

                var opAfter = new EmployeeIssueOperation {
                    OperationTime    = new DateTime(2019, 1, 2, 13, 0, 0),
                    AutoWriteoffDate = new DateTime(2021, 5, 1),
                    Employee         = employee,
                    Nomenclature     = nomenclature,
                    ProtectionTools  = protectionTools,
                    Issued           = 1
                };
                uow.Save(opAfter);

                uow.Commit();

                var repository = new EmployeeIssueRepository(uow);
                var result     =
                    repository.GetOperationsByDates(
                        new[] { employee }, new DateTime(2019, 1, 1), new DateTime(2019, 1, 1));
                Assert.That(result.Any(x => x.OperationTime == new DateTime(2019, 1, 1, 0, 0, 0)), Is.True);
                Assert.That(result.Any(x => x.OperationTime == new DateTime(2019, 1, 1, 13, 0, 0)), Is.True);
                Assert.That(result.Count, Is.EqualTo(2));
            }
        }
Esempio n. 28
0
 public GraphItem(EmployeeIssueOperation issueOperation)
 {
     IssueOperation = issueOperation;
 }
        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>()));
        }
        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)));
            }
        }