protected void OnScvEventSectorization(Object sender, SectorizationReceivedArgs data)
        {
            /** Se ha recibido una sectorizacion correcta de una dependencia */
            EventThread.Enqueue("OnScvEventSectorization", () =>
            {
                var ctrldep = DepManagers.Where(d => d.Cfg.Id == data.ScvId).FirstOrDefault();
                if (ctrldep != null)
                {
                    if (data.Accepted)
                    {
                        // Actualizo la Sectorizacion en la Dependencia.
                        ctrldep.MapOfSectors = data.SectorMap;

                        // Mapeo la sectorizacion recibida.
                        var MapOfSectorsMapped = ctrldep.Map(data.SectorMap);

                        // Actualizo la Sectorizacion en el Manager.
                        MainManager.MergeSectorization(MapOfSectorsMapped);

                        // Historico.
                        History.Add(HistoryItems.DepSectorizationReceivedEvent, "", ctrldep.Cfg.Id, "", SectorizationHelper.MapToString(data.SectorMap));

                        // Propagar la Sectorizacion al SCV real si todas las dependencias han recibido sectorizacion.
                        var DepWithSectInfo = DepManagers.Where(d => d.MapOfSectors.Count > 0).ToList();
                        if (DepWithSectInfo.Count == DepManagers.Count)
                        {
                            (MainManager.Manager as PsiManager).SendSectorization(MainManager.MapOfSectors);
                            // Historico
                            History.Add(HistoryItems.ScvSectorizationSendedEvent, "", MainManager.Cfg.Id, "",
                                        SectorizationHelper.MapToString(MainManager.MapOfSectors), $"Recibida de SACTA ({data.ScvId})");
                            data.Acknowledge(true);
                        }
                        else
                        {
                            //Logger.Warn<SactaProxy>($"OnScvEventSectorization. IGNORED. No all Sectorization Info Present.");
                            History.Add(HistoryItems.DepSectorizationRejectedEvent, "", ctrldep.Cfg.Id,
                                        "", SectorizationHelper.MapToString(data.SectorMap), "No todas las dependencias tienen sectorizaciones válidas.");
                            data.Acknowledge(false);
                        }
                    }
                    else
                    {
                        // Evento de Sectorizacion Rechazada. Historico
                        History.Add(HistoryItems.DepSectorizationRejectedEvent, "", ctrldep.Cfg.Id,
                                    "", data.ReceivedMap, data.RejectCause);
                        data.Acknowledge(false);
                    }
                }
                else
                {
                    Logger.Fatal <SactaProxy>($"OnScvEventSectorization. {data.ScvId} Dependency is missing or duplicated");
                }
            });
        }
 protected void OnPsiEventSectorizationAsk(Object sender, SectorizationRequestArgs data)
 {
     EventThread.Enqueue("OnPsiEventActivity", () =>
     {
         //var DepWithSectInfo = DepManager.Where(d => d.Value.MapOfSectors.Count() > 0).ToList();
         var DepWithSectInfo = DepManagers.Where(d => d.MapOfSectors.Count > 0).ToList();
         if (DepWithSectInfo.Count == DepManagers.Count)
         {
             (MainManager.Manager as PsiManager).SendSectorization(MainManager.MapOfSectors);
             /** Historico */
             History.Add(HistoryItems.ScvSectorizationSendedEvent, "", MainManager.Cfg.Id, "",
                         SectorizationHelper.MapToString(MainManager.MapOfSectors), $"Peticion SCV");
         }
         else
         {
             Logger.Warn <SactaProxy>($"OnPsiEventSectorizationAsk. IGNORED. No all Sectorization Info Present.");
         }
     });
 }
        protected bool ConfigureService()
        {
            Logger.Info <SactaProxy>("Configurando Servicio");
            cfgManager.Get((cfg =>
            {
                // Se utiliza 'siempre' version 0 para CD30 y version 1 para ULISES.
                cfg.ProtocolVersion = Properties.Settings.Default.ScvType;
                History.Configure(cfg.General.HistoryMaxDays, cfg.General.HistoryMaxItems);
                Managers.Clear();
                cfg.Psi.Sectorization.Positions = "";
                cfg.Psi.Sectorization.Sectors = "";
                cfg.Psi.Sectorization.Virtuals = "";

                var manager = new PsiManager(cfg.ProtocolVersion, cfg.Psi, () => History);
                manager.EventActivity += OnPsiEventActivity;
                manager.EventSectRequest += OnPsiEventSectorizationAsk;
                Managers.Add(new DependencyControl(cfg.Psi.Id)
                {
                    IsMain = true,
                    Cfg = cfg.Psi,
                    Manager = manager
                });
                cfg.Dependencies.ForEach(dep =>
                {
                    var dependency = new ScvManager(cfg.ProtocolVersion, dep, () => History);
                    dependency.EventActivity += OnScvEventActivity;
                    dependency.EventSectorization += OnScvEventSectorization;

                    /** Construyendo la configuracion de Sectorizacion general */
                    var sectorsMap = dep.Sectorization.SectorsMap.Split(',')
                                     .Where(i => Configuration.MapOfSectorsEntryValid(i))
                                     .ToDictionary(k => int.Parse(k.Split(':')[0]), v => int.Parse(v.Split(':')[1]));
                    var positionsMap = dep.Sectorization.PositionsMap.Split(',')
                                       .Where(i => Configuration.MapOfSectorsEntryValid(i))
                                       .ToDictionary(k => int.Parse(k.Split(':')[0]), v => int.Parse(v.Split(':')[1]));
                    var virtuals = Configuration.ListString2String(
                        dep.Sectorization.VirtualsList()
                        .Select(v => sectorsMap.Keys.Contains(v) ? sectorsMap[v].ToString() : v.ToString())
                        .ToList());
                    var reals = String.Join(",", dep.Sectorization.SectorsList()
                                            .Select(r => sectorsMap.Keys.Contains(r) ? sectorsMap[r].ToString() : r.ToString())
                                            .ToList());
                    //.Aggregate((i, j) => i + "," + j.ToString());
                    var positions = String.Join(",", dep.Sectorization.PositionsList()
                                                .Select(p => positionsMap.Keys.Contains(p) ? positionsMap[p].ToString() : p.ToString())
                                                .ToList());
                    //.Aggregate((i, j) => i + "," + j.ToString());

                    cfg.Psi.Sectorization.Positions = Configuration.AgreggateString(cfg.Psi.Sectorization.Positions, positions);
                    cfg.Psi.Sectorization.Virtuals = Configuration.AgreggateString(cfg.Psi.Sectorization.Virtuals, virtuals);
                    cfg.Psi.Sectorization.Sectors = Configuration.AgreggateString(cfg.Psi.Sectorization.Sectors, reals);

                    Managers.Add(new DependencyControl(dep.Id)
                    {
                        IsMain = false,
                        Cfg = dep,
                        Manager = dependency,
                        SectorsMap = sectorsMap,
                        PositionsMap = positionsMap
                    });
                });
                /** Test de la configuracion que maneja la PSI, que debe coincidir con la configurada en BD */
                SectorizationHelper.CompareWithDb(cfg.Psi.Sectorization.Positions,
                                                  cfg.Psi.Sectorization.Sectors, cfg.Psi.Sectorization.Virtuals, (error) =>
                {
                    // Marcar el Warning...
                    PS.SignalWarning <SactaProxy>($"Incoherencia de Configuración con Base de Datos: {error}", History);
                });
                /** */
                var ids = cfg.Dependencies.Select(d => d.Id).ToList();
                ids.Add(cfg.Psi.Id);
                SectorizationPersistence.Sanitize(ids);
                Cfg = cfg;
                cfgManager.Write(Cfg);
                Logger.Info <SactaProxy>("Servicio Configurado...");
            }));
            return(true);
        }