public void Reload()
        {
            var unitOfWork = _container.Resolve <IModelsStore>().UnitOfWork;

            Blocks = unitOfWork.Repository <ProductBlock>().GetAll();

            SalesUnitsCalculationsDictionary.Clear();

            //завершенные расчеты ПЗ, упорядоченные по дате завершения
            var priceCalculationsFinished = unitOfWork.Repository <PriceCalculation>()
                                            .Find(priceCalculation => priceCalculation.TaskCloseMoment.HasValue)
                                            .OrderBy(priceCalculation => priceCalculation.TaskCloseMoment)
                                            .ToList();

            //завершенные айтемы расчетов ПЗ
            var priceCalculationItemsFinished = priceCalculationsFinished
                                                .SelectMany(priceCalculation => priceCalculation.PriceCalculationItems)
                                                .Distinct()
                                                .ToList();

            //формирование словарей прайсов по калькуляции
            var salesUnits = priceCalculationsFinished
                             .SelectMany(priceCalculation => priceCalculation.PriceCalculationItems)
                             .SelectMany(priceCalculationItem => priceCalculationItem.SalesUnits)
                             .Distinct();

            foreach (var salesUnit in salesUnits)
            {
                var priceItems = priceCalculationItemsFinished
                                 .Where(calculationItem => calculationItem.SalesUnits.ContainsById(salesUnit))
                                 .Select(item => new PriceItem(priceCalculationsFinished.Single(calculation => calculation.PriceCalculationItems.Contains(item)), item));
                SalesUnitsCalculationsDictionary.Add(salesUnit.Id, new PriceItems(priceItems));
            }

            LaborHoursList = unitOfWork.Repository <LaborHours>().GetAll();
            LaborHourCosts = unitOfWork.Repository <LaborHourCost>().GetAll();
        }
        public PriceService(IUnityContainer container)
        {
            _container = container;

            //синхронизация завершения расчетов
            container.Resolve <IEventAggregator>().GetEvent <AfterFinishPriceCalculationEvent>().Subscribe(
                calculation =>
            {
                //добавляем только данные из завершенных расчетов
                if (!calculation.TaskCloseMoment.HasValue)
                {
                    return;
                }

                foreach (var priceCalculationItem in calculation.PriceCalculationItems)
                {
                    foreach (var salesUnit in priceCalculationItem.SalesUnits)
                    {
                        var priceItem = new PriceItem(calculation, priceCalculationItem);

                        if (SalesUnitsCalculationsDictionary.ContainsKey(salesUnit.Id))
                        {
                            SalesUnitsCalculationsDictionary[salesUnit.Id].Add(priceItem);
                        }
                        else
                        {
                            SalesUnitsCalculationsDictionary.Add(salesUnit.Id, new PriceItems(new[] { priceItem }));
                        }
                    }
                }
            });

            //синхронизация остановки расчетов
            container.Resolve <IEventAggregator>().GetEvent <AfterStopPriceCalculationEvent>().Subscribe(
                calculation =>
            {
                if (calculation.TaskCloseMoment.HasValue)
                {
                    return;
                }

                foreach (var priceCalculationItem in calculation.PriceCalculationItems)
                {
                    foreach (var salesUnit in priceCalculationItem.SalesUnits)
                    {
                        if (SalesUnitsCalculationsDictionary.ContainsKey(salesUnit.Id))
                        {
                            var priceItems = SalesUnitsCalculationsDictionary[salesUnit.Id];

                            if (priceItems.Remove(priceCalculationItem) && priceItems.IsEmpty)
                            {
                                SalesUnitsCalculationsDictionary.Remove(salesUnit.Id);
                            }
                        }
                    }
                }
            });

            _container.Resolve <IModelsStore>().IsRefreshed += Reload;

            Reload();
        }
 public double?GetPriceByCalculations(IUnit unit)
 {
     return(SalesUnitsCalculationsDictionary.ContainsKey(unit.Id)
         ? SalesUnitsCalculationsDictionary[unit.Id].Price
         : null);
 }