private void AddGroup(SalesUnitOrderGroup unitsGroup)
        {
            //фиксируем заказ
            unitsGroup.Order = Item;
            //фиксируем дату действия и заказ
            unitsGroup.SignalToStartProductionDone = DateTime.Today;
            //ставим предполагаемую дату производства
            unitsGroup.EndProductionPlanDate = unitsGroup.Units.First().EndProductionDateExpected;
            unitsGroup.Units.ForEach(x => x.EndProductionPlanDate = x.EndProductionDateExpected);
            //заполняем позиции заказа
            int orderPosition = 1;

            unitsGroup.Units.ForEach(x => x.OrderPosition = orderPosition++.ToString());
            //переносим группу в план производства
            GroupsInOrder.Add(unitsGroup);
            GroupsPotential.Remove(unitsGroup);
            SaveOrderCommand.RaiseCanExecuteChanged();
        }
        private void RemoveGroupCommand_Execute()
        {
            var salesUnitOrder = GroupsInOrder.SelectedUnit ?? (ISalesUnitOrder)GroupsInOrder.SelectedGroup;

            salesUnitOrder.Order = null;
            salesUnitOrder.SignalToStartProductionDone = null;
            salesUnitOrder.EndProductionPlanDate       = null;

            if (GroupsInOrder.IsGroupSelected)
            {
                var salesUnitOrderGroup = GroupsInOrder.SelectedGroup;
                GroupsPotential.Add(salesUnitOrderGroup);
                GroupsInOrder.Remove(salesUnitOrderGroup);
            }

            if (GroupsInOrder.IsUnitSelected)
            {
                var unit = GroupsInOrder.SelectedUnit;
                GroupsPotential.Add(new SalesUnitOrderGroup(new List <SalesUnitOrderItem> {
                    unit
                }));
                RemoveUnitFromGroup(GroupsInOrder, unit);
            }
        }
        protected override void AfterLoading()
        {
            //оставляем юниты без заказов либо с редактируемым заказом
            //исключаем юниты без сигнала к производству
            var salesUnits = ((ISalesUnitRepository)UnitOfWork.Repository <SalesUnit>()).GetAllForOrderView().ToList();

            //юниты из заказа
            var salesUnitsInOrder = ((ISalesUnitRepository)UnitOfWork.Repository <SalesUnit>()).GetByOrder(Item.Id).ToList();

            salesUnits.AddRange(salesUnitsInOrder);

            List <PriceCalculation>   calculations        = UnitOfWork.Repository <PriceCalculation>().GetAll();
            List <SalesUnitOrderItem> salesUnitOrderItems = salesUnits
                                                            .Select(salesUnit => new SalesUnitOrderItem(salesUnit, salesUnit.ActualPriceCalculationItem(calculations)))
                                                            .ToList();

            _unitsWrappers = new ValidatableChangeTrackingCollection <SalesUnitOrderItem>(salesUnitOrderItems);

            //юниты в заказе
            var unitsInOrder  = _unitsWrappers.Where(item => item.Order != null).ToList();
            var groupsInOrder = unitsInOrder.GroupBy(item => new
            {
                FacilityId      = item.Model.Facility.Id,
                ProductId       = item.Model.Product.Id,
                OrderId         = item.Order?.Id,
                ProjectId       = item.Model.Project.Id,
                SpecificationId = item.Model.Specification?.Id,
                item.Model.EndProductionPlanDate,
                item.Model.Cost
            }).OrderBy(x => x.Key.EndProductionPlanDate);

            GroupsInOrder.AddRange(groupsInOrder.Select(x => new SalesUnitOrderGroup(x)));

            //юниты для размещения в производстве
            var unitsToProduct  = _unitsWrappers.Where(item => !item.Model.IsLoosen).Except(unitsInOrder).ToList();
            var groupsToProduct = unitsToProduct.GroupBy(item => new
            {
                FacilityId      = item.Model.Facility.Id,
                ProductId       = item.Model.Product.Id,
                OrderId         = item.Order?.Id,
                ProjectId       = item.Model.Project.Id,
                SpecificationId = item.Model.Specification?.Id,
                item.Model.EndProductionDateCalculated,
                item.Model.Cost
            }).OrderBy(x => x.Key.EndProductionDateCalculated);

            GroupsPotential.AddRange(groupsToProduct.Select(x => new SalesUnitOrderGroup(x)));

            //подписка на смену выбранной потенциальной группы в производстве
            GroupsPotential.SelectedGroupChanged += group =>
            {
                (AddGroupCommand).RaiseCanExecuteChanged();
                (ShowProductStructureCommand).RaiseCanExecuteChanged();
            };

            //подписка на смену выбранной группы в производстве
            GroupsInOrder.SelectedGroupChanged += group =>
            {
                (RemoveGroupCommand).RaiseCanExecuteChanged();
            };

            //подписка на изменение свойств заказа и юнитов
            Item.PropertyChanged += OnPropertyChanged;
            _unitsWrappers?.ForEach(x => x.PropertyChanged += OnPropertyChanged);

            base.AfterLoading();
        }