/// <summary>
        /// обработать ответ от провайдера: раздать дилерам Execution reports по своим ордерам
        /// </summary>
        public void OnProviderReport(Dictionary <BrokerResponse, BrokerOrder> reports)
        {
            // сохранить отчеты об исполнении
            using (var ctx = DatabaseContext.Instance.Make())
            {
                try
                {
                    foreach (var report in reports.Keys)
                    {
                        var repoDbItem = LinqToEntity.UndecorateBrokerResponse(report);
                        Logger.DebugFormat("report [{0}, {1:f5}, {2:ddMMyyyy HH:mm}, {3}",
                                           repoDbItem.ID, repoDbItem.Price ?? 0,
                                           repoDbItem.ValueDate, repoDbItem.Status);
                        ctx.BROKER_RESPONSE.Add(repoDbItem);
                    }
                    ctx.SaveChanges();
                }
                catch (Exception ex)
                {
                    Logger.Error("Ошибка сохранения отчетов брокеров в БД", ex);
                }
            }

            // обработать сообщения
            foreach (var reqPair in reports)
            {
                var dealerCode = reqPair.Value.DealerCode;
                var dealer     = dealers.Values.FirstOrDefault(d => d.DealerCode == dealerCode);
                if (dealer == null)
                {
                    loggerNoFlood.LogMessageFormatCheckFlood(LogEntryType.Debug,
                                                             LogMagicNoDealer, 1000 * 60 * 5,
                                                             "OnProviderReport: дилер [{0}] не найден", dealerCode);
                    continue;
                }
                var dealerFix = dealer as IFixDealer;
                if (dealerFix == null)
                {
                    loggerNoFlood.LogMessageFormatCheckFlood(LogEntryType.Debug,
                                                             LogMagicNoDealer, 1000 * 60 * 5,
                                                             "OnProviderReport: сообщение для дилера \"{0}\" ({1}), " +
                                                             "не являющегося FIX-дилером",
                                                             dealerCode, dealer.GetType());
                    continue;
                }
                try
                {
                    if (reqPair.Value == null)
                    {
                        Logger.ErrorFormat("OnProviderReport - для ответа сервера Id={0} (цена {1:f4}) не найден запрос",
                                           reqPair.Key.Id, reqPair.Key.Price);
                    }
                    else
                    {
                        dealerFix.ProcessExecutionReport(reqPair.Key, reqPair.Value);
                    }
                }
                catch (Exception ex)
                {
                    loggerNoFlood.LogMessageFormatCheckFlood(LogEntryType.Debug,
                                                             LogMagicDealerExecutionError, 1000 * 60 * 5,
                                                             "OnProviderReport: ошибка обработки ответа брокера дилером [{0}]: {1}",
                                                             dealerCode, ex);
                }
            }
        }