Exemple #1
0
        private void LeerEntidades()
        {
            ComitesNormalizacionCRM = new Dictionary <string, ComiteNormalizacion>();
            Industrias = new Dictionary <string, Guid>();
            Sectores   = new Dictionary <string, Guid>();
            Comun.LogText("Leyendo entidades de CRM...");

            var q = new QueryExpression("aen_industriaaenor");

            q.ColumnSet = new ColumnSet("aen_codigo");
            q.Criteria.Conditions.Add(new ConditionExpression("aen_codigo", ConditionOperator.NotNull));
            var ents = Crm.IOS.RetrieveMultiple(q);

            foreach (var e in ents.Entities)
            {
                Industrias.Add((string)e["aen_codigo"], e.Id);
            }

            q           = new QueryExpression("aen_sectoraenor");
            q.ColumnSet = new ColumnSet("aen_codigo");
            q.Criteria.Conditions.Add(new ConditionExpression("aen_codigo", ConditionOperator.NotNull));
            ents = Crm.IOS.RetrieveMultiple(q);
            foreach (var e in ents.Entities)
            {
                Sectores.Add((string)e["aen_codigo"], e.Id);
            }

            q           = new QueryExpression("aen_comitenormalizacion");
            q.ColumnSet = new ColumnSet("aen_comitenormalizacionid", "aen_name",
                                        "aen_namees", "aen_nameen", "aen_sectoraenorid", "aen_industriaaenorid",
                                        "statecode");
            q.Criteria.Conditions.AddRange(
                new ConditionExpression("aen_name", ConditionOperator.NotNull));
            q.PageInfo = new PagingInfo()
            {
                Count = 5000, PageNumber = 1
            };
            while (true)
            {
                var entidades = Crm.IOS.RetrieveMultiple(q);
                foreach (var e in entidades.Entities)
                {
                    ComitesNormalizacionCRM.Add((string)e["aen_name"], ComiteNormalizacionFromCRM(e));
                }
                if (entidades.MoreRecords)
                {
                    q.PageInfo.PageNumber++;
                    q.PageInfo.PagingCookie = entidades.PagingCookie;
                }
                else
                {
                    break;
                }
            }
            Comun.LogText("Cacheados comités normalización: " + ComitesNormalizacionCRM.Count);
        }
Exemple #2
0
        public void Iniciar(Oracle oracleGlobal, Comun comunGlobal, Crm crmGlobal)
        {
            try
            {
                //Aquí no hay que hacer new, el lanzador orquestador lo pasará a las properties
                Comun = comunGlobal;
                Comun.LogText("----Iniciando sincronización comités normalizacion------");
                Crm = crmGlobal;
                ComitesDesactivar = new HashSet <string>();

                Oracle = oracleGlobal;
                Crm.InicializarPFE(oracleGlobal);

                LeerEntidades();
                LeerComitesOracle();
                if (!ComitesNormalizacionOracle.Any())
                {
                    Comun.LogText("No hay comités en origen, terminamos");
                    return;
                }


                foreach (var comiteOra in ComitesNormalizacionOracle)
                {
                    try
                    {
                        ClaveIntegracionActual = comiteOra.Key;
                        bool ok = ComitesNormalizacionCRM.TryGetValue(comiteOra.Key, out ComiteNormalizacion comiteCRM);
                        if (ok && ComitesIguales(comiteOra.Value, comiteCRM))
                        {
                            Crm.Iguales++;
                            continue;
                        }
                        var comite = GetEntity(comiteOra.Value);
                        if (ok)
                        {
                            comite["aen_comitenormalizacionid"] = comiteCRM.Aen_ComiteNormalizacionId;
                            Crm.AnadirElementoEmr(new UpdateRequest {
                                Target = comite
                            });
                        }
                        else
                        {
                            if (comiteOra.Value.StateCode == "Inactivo")
                            {
                                comite["statecode"]  = new OptionSetValue(0);
                                comite["statuscode"] = new OptionSetValue(1);
                                ComitesDesactivar.Add(comiteOra.Value.Aen_Name);
                            }
                            Crm.AnadirElementoEmr(new CreateRequest {
                                Target = comite
                            });
                        }
                    }
                    catch (Exception e)
                    {
                        Comun.EscribirExcepcion(e, "Error al procesar Comité: " + comiteOra.Key);
                    }
                }
                Crm.ProcesarUltimosEmr();

                SincronizarEmparentamiento();
                DesactivarRecienCreadosInactivas();
                Crm.MostrarEstadisticas("COMITES");
            }
            catch (Exception ex)
            {
                Comun.EscribirExcepcion(ex, "Error");
                if (ClaveIntegracionActual != "")
                {
                    Oracle.MandarErrorIntegracion(ClaveIntegracionActual, ex.Message,
                                                  Oracle.TipoEntidadDireccion, Oracle.TipoAccionValidacion, null);
                }
                if (Oracle != null && Oracle.OraConnParaLog.State == ConnectionState.Open)
                {
                    Oracle.OraConnParaLog.Dispose();
                }
            }
            finally
            {
                if (Oracle != null && Oracle.OraConnParaLog.State == ConnectionState.Open)
                {
                    Oracle.OraConnParaLog.Dispose();
                }
            }
        }
        public void Iniciar(Oracle ora, Comun com, Crm crm)
        {
            try
            {
                Stopwatch sW_TODO = new Stopwatch(), sW_SOLOCARGA = new Stopwatch();
                OracleGlobal = ora;
                ComunGlobal  = com;
                ComunGlobal.LogText("----Iniciando sincronización contactos------");
                CrmGlobal = crm;

                ContactosADesactivar = new List <string>();

                sW_TODO.Start();

                //1. Carga Maestros
                CargarMaestroCargos();
                //2.A Carga de Terceros para campo Parentcustomerid/aen_claveintegracionparent
                //2.B Carga de Contactos existentes
                CargarMaestroTercerosFromCRM();
                CargarMaestroContactos();


                //3. Lectura de Contactos de la tabla de Oracle (Query: oracleGlobal.QueryContactos)
                LeerContactosOracle();
                if (!ContactosOracle.Any())
                {
                    ComunGlobal.LogText("No hay contactos en origen, terminamos");
                    return;
                }


                //4. Inicializa PFECore
                CrmGlobal.InicializarPFE(OracleGlobal);


                //5. Procesamos Contactos de Oracle:
                //  -> Si existen, comprobamos campo a campo si hay que actualizar
                //  -> Sino existen, creamos el contacto nuevo.
                sW_SOLOCARGA.Start();
                #region Procesar CONTACTOS
                bool      ok;
                Contactos auxContCRM = new Contactos();
                Entity    contUpdate;

                foreach (var cont in ContactosOracle)
                {
                    ok = ContactosCRM.TryGetValue(cont.Key, out auxContCRM);

                    if (ok)
                    { //Existe, comprobamos actualizacion
                        try
                        {
                            contUpdate = new Entity("contact");

                            bool ret = cont.Value.ContactosIguales(auxContCRM, ref contUpdate);

                            if (ret)
                            {
                                EmparentaTercero(cont, ref contUpdate);
                                CrmGlobal.AnadirElementoEmr(new UpdateRequest {
                                    Target = contUpdate
                                });
                            }
                            else
                            {
                                CrmGlobal.Iguales++;
                            }
                        }
                        catch (Exception ex)
                        {
                            ComunGlobal.LogText("ERROR al ACTUALIZAR el Entity equivalente del Contacto " + cont.Value.Aen_ClaveIntegracion + " ::: " + ex.ToString());
                        }
                    }
                    else
                    { //No existe, creamos
                        try
                        {
                            //Guardamos los Terceros que a posteriori desactivaremos (en create no se puede mandar registro inactivo)
                            if (cont.Value.Statecode.Equals("Inactivo"))
                            {
                                ContactosADesactivar.Add(cont.Value.Aen_ClaveIntegracion);
                            }

                            Entity newContact = cont.Value.GetEntityFromContacto();

                            EmparentaTercero(cont, ref newContact);
                            CrmGlobal.AnadirElementoEmr(new CreateRequest {
                                Target = newContact
                            });
                        }
                        catch (Exception ex)
                        {
                            ComunGlobal.LogText("ERROR al CREAR el Entity equivalente del Contacto " + cont.Value.Aen_ClaveIntegracion + " ::: " + ex.ToString());
                        }
                    }
                }
                CrmGlobal.ProcesarUltimosEmr();

                #endregion Procesar CONTACTOS
                sW_SOLOCARGA.Stop();
                ComunGlobal.LogText(" -----> END; TIEMPO CARGA: " + sW_SOLOCARGA.Elapsed.ToString() + " <-----\n\n");


                //6. Desactivar contactos
                CargaDiccionarioContactosPostCarga();
                DesactivarContactos();

                sW_TODO.Stop();
                CrmGlobal.MostrarEstadisticas("CONTACTOS");
                ComunGlobal.LogText(" -----> END; TIEMPO TOTAL: " + sW_TODO.Elapsed.ToString() + " <-----\n\n");



                #region Limpieza diccionarios para liberar memoria
                ContactosOracle           = null; //.Clear();
                ContactosCRM              = null; //.Clear();
                MaestroCargos             = null; //.Clear();
                MaestroTerceros           = null; //.Clear();
                MaestroContactosPostCarga = null; //.Clear();
                #endregion Limpieza diccionarios para liberar memoria
            }
            catch (Exception ex)
            {
                ComunGlobal.LogText("ERROR en Lanzador de CONTACTOS ::: " + ex.ToString());
                if (OracleGlobal != null && OracleGlobal.OraConnParaLog.State == ConnectionState.Open)
                {
                    OracleGlobal.OraConnParaLog.Dispose();
                }
            }
        }
        private Direccion DireccionFromOracle(DataRow fila)
        {
            //si no se encuentra en crm o no viene tercero de oracle, o statecode, la dirección no es válida
            //si no se encuentra país, provincia, tipovia, lo mismo, si viene vacío de origen sí dejamos
            var ok        = false;
            var direccion = new Direccion();

            direccion.Aen_DireccionId      = Guid.Empty;
            direccion.Aen_ClaveIntegracion = (string)fila["aen_claveintegracion"];
            var terceroId = Guid.Empty;

            if (DBNull.Value != fila["aen_claveintegracionparent"])
            {
                ok = Terceros.TryGetValue((string)fila["aen_claveintegracionparent"], out terceroId);
                if (!ok)
                {
                    var texto = "Dirección de Oracle " + (string)fila["aen_claveintegracion"] +
                                " no válida por no encontrarse Tercero en CRM " + (string)fila["aen_claveintegracionparent"];
                    Comun.LogText(texto);
                    Oracle.MandarErrorIntegracion((string)fila["aen_claveintegracion"], texto,
                                                  Oracle.TipoEntidadDireccion, Oracle.TipoAccionValidacion, null);
                    return(null);
                }
            }

            direccion.Aen_TerceroId = terceroId;
            var contactoId = Guid.Empty;

            if (DBNull.Value != fila["aen_claveintegracioncontacto"])
            {
                ok = Contactos.TryGetValue((string)fila["aen_claveintegracioncontacto"], out contactoId);
            }
            direccion.Aen_Contacto = contactoId;
            direccion.StateCode    = (string)fila["statecode"];
            //if (direccion.StateCode != "Activo" && direccion.StateCode != "Inactivo")
            //{
            //    Comun.LogText("Dirección de Oracle " + (string)fila["aen_claveintegracion"] +
            //        " no válida por tener Statecode '" + direccion.StateCode + "'");
            //    return null;
            //}
            var paisId = Guid.Empty;

            direccion.Aen_Codigopais = string.Empty;

            if (DBNull.Value != fila["aen_paisid"])
            {
                direccion.Aen_Codigopais = (string)fila["aen_paisid"];
                ok = Paises.TryGetValue((string)fila["aen_paisid"], out paisId);
                if (!ok)
                {
                    var texto = "Dirección de Oracle " + (string)fila["aen_claveintegracion"] +
                                " no válida por tener país '" + (string)fila["aen_paisid"] + "' no encontrado en CRM";
                    Comun.LogText(texto);
                    Oracle.MandarErrorIntegracion((string)fila["aen_claveintegracion"], texto,
                                                  Oracle.TipoEntidadDireccion, Oracle.TipoAccionValidacion, null);
                    //return null;
                }
            }
            direccion.Aen_PaisId = paisId;
            var provinciaId = Guid.Empty;

            if (DBNull.Value != fila["aen_provinciaid"])
            {
                ok = Provincias.TryGetValue((string)fila["aen_provinciaid"], out provinciaId);
                if (!ok)
                {
                    var texto = "Dirección de Oracle " + (string)fila["aen_claveintegracion"] +
                                " no válida por tener provincia '" + (string)fila["aen_provinciaid"] + "' no encontrado en CRM";
                    Comun.LogText(texto);
                    Oracle.MandarErrorIntegracion((string)fila["aen_claveintegracion"], texto,
                                                  Oracle.TipoEntidadDireccion, Oracle.TipoAccionValidacion, null);
                    //return null;
                }
            }
            direccion.Aen_ProvinciaId = provinciaId;
            var tipoViaId = Guid.Empty;

            if (DBNull.Value != fila["aen_tipodeviaid"])
            {
                var tipoVia = ((string)fila["aen_tipodeviaid"]).Trim().ToUpper();
                ok = TipoDeVia.TryGetValue(tipoVia, out tipoViaId);
                if (!ok)
                {
                    var texto = "Dirección de Oracle " + (string)fila["aen_claveintegracion"] +
                                " no válida por tener tipo de vía '" + (string)fila["aen_tipodeviaid"] + "' no encontrado en CRM";
                    Comun.LogText(texto);
                    Oracle.MandarErrorIntegracion((string)fila["aen_claveintegracion"], texto,
                                                  Oracle.TipoEntidadDireccion, Oracle.TipoAccionValidacion, null);
                    //return null;
                }
            }
            direccion.Aen_TipoDeViaId            = tipoViaId;
            direccion.Aen_CodigoPostal           = DBNull.Value != fila["aen_codigopostal"] ? ((string)fila["aen_codigopostal"]).Trim() : "";
            direccion.Aen_Fax                    = DBNull.Value != fila["aen_fax"] ? ((string)fila["aen_fax"]).Trim() : "";
            direccion.Aen_Email                  = DBNull.Value != fila["aen_email"] ? ((string)fila["aen_email"]).Trim() : "";
            direccion.Aen_Name                   = DBNull.Value != fila["aen_name"] ? ((string)fila["aen_name"]).Trim() : "";
            direccion.Aen_Nombrecompleto         = DBNull.Value != fila["aen_name"] ? ((string)fila["aen_name"]).Trim() : "";
            direccion.Aen_NumeroDeVia            = DBNull.Value != fila["aen_numerodevia"] ? ((string)fila["aen_numerodevia"]).Trim() : "";
            direccion.Aen_NombreDeVia            = DBNull.Value != fila["aen_nombrevia"] ? ((string)fila["aen_nombrevia"]).Trim() : "";
            direccion.Aen_Observaciones          = DBNull.Value != fila["aen_observaciones"] ? ((string)fila["aen_observaciones"]).Trim() : "";
            direccion.Aen_Observacionesmigracion = DBNull.Value != fila["aen_observacionesmigracion"] ? ((string)fila["aen_observacionesmigracion"]).Trim() : "";
            direccion.Aen_RazonSocial            = DBNull.Value != fila["aen_razonsocial"] ? (int)(decimal)fila["aen_razonsocial"] == 1 : false;
            direccion.Aen_RestoDireccion         = DBNull.Value != fila["aen_restodireccion"] ? ((string)fila["aen_restodireccion"]).Trim() : "";
            direccion.Aen_Telefono1              = DBNull.Value != fila["aen_telefono1"] ? ((string)fila["aen_telefono1"]).Trim() : "";
            direccion.Aen_Telefono2              = DBNull.Value != fila["aen_telefono2"] ? ((string)fila["aen_telefono2"]).Trim() : "";
            //TODO Esperamos los tipos de dir en Oracle en el formato elem1;elem2;elemx, los ordenamos para facilitar comparación
            //Nos dice Marisa que en principio vendría en dos filas, pero que para la integración inicial no ocurrirá
            direccion.Aen_TipoDeDireccion        = DBNull.Value != fila["aen_tipodedireccion"] ? GetElemsListaCol((string)fila["aen_tipodedireccion"]) : "";
            direccion.Aen_Origen                 = DBNull.Value != fila["aen_origen"] ? (fila["aen_origen"]).ToString().Replace(".", "").Trim() : "";
            direccion.Aen_Descripcion            = DBNull.Value != fila["aen_descripcion"] ? (string)fila["aen_descripcion"] : "";
            direccion.Aen_Comunidadautonoma      = DBNull.Value != fila["aen_comunidadautonoma"] ? (string)fila["aen_comunidadautonoma"] : "";
            direccion.Aen_Localidad              = DBNull.Value != fila["aen_localidad"] ? (string)fila["aen_localidad"] : "";
            direccion.Aen_Identificadordireccion = DBNull.Value != fila["aen_identificadordirec"] ? (fila["aen_identificadordirec"]).ToString() : "";

            return(direccion);
        }
        public void Iniciar(Oracle oracleGlobal, Comun comunGlobal, Crm crmGlobal)
        {
            try
            {
                //Aquí no hay que hacer new, el lanzador orquestador lo pasará a las properties
                Comun = comunGlobal;
                Comun.LogText("----Iniciando sincronización direcciones------");
                Crm = crmGlobal;
                DireccionesDesactivar = new HashSet <string>();

                Oracle = oracleGlobal;
                Crm.InicializarPFE(oracleGlobal);

                Stopwatch sW_Dir = new Stopwatch(), sW_SoloCarga = new Stopwatch();
                sW_Dir.Start();

                //BorrarDirecciones();

                LeerEntidades();
                LeerDireccionesOracle();
                if (!DireccionesOracle.Any())
                {
                    Comun.LogText("No hay direcciones en origen, terminamos");
                    return;
                }


                sW_SoloCarga.Start();
                foreach (var dirOra in DireccionesOracle)
                {
                    try
                    {
                        ClaveIntegracionActual = dirOra.Key;
                        bool ok = DireccionesCRM.TryGetValue(dirOra.Key, out Direccion dirCRM);
                        if (ok && DireccionesIguales(dirOra.Value, dirCRM))
                        {
                            Crm.Iguales++;
                            continue;
                        }
                        var dir = GetEntity(dirOra.Value);
                        if (ok)
                        {
                            dir["aen_direccionid"] = dirCRM.Aen_DireccionId;
                            Crm.AnadirElementoEmr(new UpdateRequest {
                                Target = dir
                            });
                        }
                        else
                        {
                            if (dirOra.Value.StateCode == "Inactivo")
                            {
                                dir["statecode"]  = new OptionSetValue(0);
                                dir["statuscode"] = new OptionSetValue(1);
                                DireccionesDesactivar.Add(dirOra.Value.Aen_ClaveIntegracion);
                            }
                            Crm.AnadirElementoEmr(new CreateRequest {
                                Target = dir
                            });
                        }
                    }
                    catch (Exception e)
                    {
                        Comun.EscribirExcepcion(e, "Error al procesar Direccion: " + dirOra.Key);
                    }
                }
                Crm.ProcesarUltimosEmr();
                sW_SoloCarga.Stop();
                comunGlobal.LogText(" -----> END; TIEMPO SOLO CARGA: " + sW_SoloCarga.Elapsed.ToString() + " <-----\n\n");
                DesactivarRecienCreadasInactivas();
                sW_Dir.Stop();
                comunGlobal.LogText(" -----> END; TIEMPO TOTAL: " + sW_Dir.Elapsed.ToString() + " <-----\n\n");
                Crm.MostrarEstadisticas("DIRECCIONES");
            }
            catch (Exception ex)
            {
                //Aquí no podemos mandar clave al log de Oracle, puesto que no hay clave integración
                //Si hay error aquí es por motivo más genérico
                Comun.EscribirExcepcion(ex, "Error");
                if (ClaveIntegracionActual != "")
                {
                    Oracle.MandarErrorIntegracion(ClaveIntegracionActual, ex.Message,
                                                  Oracle.TipoEntidadDireccion, Oracle.TipoAccionValidacion, null);
                }
                if (Oracle != null && Oracle.OraConnParaLog.State == ConnectionState.Open)
                {
                    Oracle.OraConnParaLog.Dispose();
                }
            }
            finally
            {
                if (Oracle != null && Oracle.OraConnParaLog.State == ConnectionState.Open)
                {
                    Oracle.OraConnParaLog.Dispose();
                }
            }
        }
        public void LeerEntidades()
        {
            Terceros          = new Dictionary <string, Guid>();
            Contactos         = new Dictionary <string, Guid>();
            Paises            = new Dictionary <string, Guid>();
            Provincias        = new Dictionary <string, Guid>();
            ProvinciasNombres = new Dictionary <Guid, string>();
            TipoDeVia         = new Dictionary <string, Guid>();
            DireccionesCRM    = new Dictionary <string, Direccion>();
            Comun.LogText("Leyendo entidades de CRM...");

            //var q = new QueryExpression("aen_comunidadautonoma");
            //q.ColumnSet = new ColumnSet("aen_name");
            //q.Criteria.Conditions.Add(new ConditionExpression("aen_name", ConditionOperator.NotNull));
            //var ents = Crm.IOS.RetrieveMultiple(q);
            var q = new QueryExpression("aen_pais");

            q.ColumnSet = new ColumnSet("aen_codigopais");
            q.Criteria.Conditions.Add(new ConditionExpression("aen_codigopais", ConditionOperator.NotNull));
            var ents = Crm.IOS.RetrieveMultiple(q);

            foreach (var e in ents.Entities)
            {
                Paises.Add((string)e["aen_codigopais"], e.Id);
            }
            Comun.LogText("Cacheados países: " + Paises.Count);
            q           = new QueryExpression("aen_provincia");
            q.ColumnSet = new ColumnSet("aen_codigoprovincia", "aen_name");
            q.Criteria.Conditions.Add(new ConditionExpression("aen_codigoprovincia", ConditionOperator.NotNull));
            ents = Crm.IOS.RetrieveMultiple(q);
            //Parallel.ForEach(ents.Entities, e => Provincias.Add((string)e["aen_codigoprovincia"], e.Id));
            foreach (var e in ents.Entities)
            {
                Provincias.Add((string)e["aen_codigoprovincia"], e.Id);
                ProvinciasNombres.Add(e.Id, e.Contains("aen_name") ? (string)e["aen_name"] : null);
            }
            Comun.LogText("Cacheados provincias: " + Provincias.Count);

            //q = new QueryExpression("aen_localidad");
            //q.ColumnSet = new ColumnSet("aen_name");
            //q.Criteria.Conditions.Add(new ConditionExpression("aen_name", ConditionOperator.NotNull));
            //ents = Crm.IOS.RetrieveMultiple(q);
            q           = new QueryExpression("aen_tipodevia");
            q.ColumnSet = new ColumnSet("aen_tipodevia");
            q.Criteria.Conditions.Add(new ConditionExpression("aen_tipodevia", ConditionOperator.NotNull));
            ents = Crm.IOS.RetrieveMultiple(q);
            foreach (var e in ents.Entities)
            {
                TipoDeVia.Add(((string)e["aen_tipodevia"]).ToUpper(), e.Id);
            }
            Comun.LogText("Cacheados tipos de vía: " + TipoDeVia.Count);

            q           = new QueryExpression("account");
            q.ColumnSet = new ColumnSet(NombreCamposTercero.Aen_claveintegracionCRM);
            q.Criteria.Conditions.AddRange(
                new ConditionExpression(NombreCamposTercero.Aen_claveintegracionCRM, ConditionOperator.NotNull));
            q.PageInfo = new PagingInfo()
            {
                Count = 5000, PageNumber = 1
            };
            while (true)
            {
                var entidades = Crm.IOS.RetrieveMultiple(q);
                foreach (var t in entidades.Entities)
                {
                    Terceros.Add((string)t[NombreCamposTercero.Aen_claveintegracionCRM], t.Id);
                }
                if (entidades.MoreRecords)
                {
                    q.PageInfo.PageNumber++;
                    q.PageInfo.PagingCookie = entidades.PagingCookie;
                }
                else
                {
                    break;
                }
            }

            Comun.LogText("Cacheados terceros: " + Terceros.Count);
            q           = new QueryExpression("contact");
            q.ColumnSet = new ColumnSet("aen_claveintegracion");
            q.Criteria.Conditions.AddRange(
                //new ConditionExpression("statecode", ConditionOperator.Equal, 0),
                new ConditionExpression("aen_claveintegracion", ConditionOperator.NotNull));
            q.PageInfo = new PagingInfo()
            {
                Count = 5000, PageNumber = 1
            };
            while (true)
            {
                var entidades = Crm.IOS.RetrieveMultiple(q);
                foreach (var e in entidades.Entities)
                {
                    Contactos.Add((string)e["aen_claveintegracion"], e.Id);
                }
                if (entidades.MoreRecords)
                {
                    q.PageInfo.PageNumber++;
                    q.PageInfo.PagingCookie = entidades.PagingCookie;
                }
                else
                {
                    break;
                }
            }
            Comun.LogText("Cacheados contactos: " + Contactos.Count);

            q           = new QueryExpression("aen_direccion");
            q.ColumnSet = new ColumnSet("aen_direccionid", "aen_claveintegracion",
                                        "aen_terceroid", "aen_codigopostal", "aen_comunidadautonoma",
                                        "aen_contactoid", "aen_email", "aen_fax",
                                        "aen_localidad", "aen_name", "aen_nombrecompleto",
                                        "aen_numerodevia", "aen_observaciones", "aen_paisid",
                                        "aen_codigopais", "aen_provinciaid", "aen_razonsocial",
                                        "aen_restodireccion", "aen_telefono1", "aen_telefono2",
                                        "aen_tipodedireccion", "aen_tipodeviaid", "statecode",
                                        "aen_observacionesmigracion", "aen_origen", "aen_nombrevia", "aen_identificadordireccion"
                                        );
            q.Criteria.Conditions.AddRange(
                //new ConditionExpression("statecode", ConditionOperator.Equal, 0),
                new ConditionExpression("aen_claveintegracion", ConditionOperator.NotNull));
            q.PageInfo = new PagingInfo()
            {
                Count = 5000, PageNumber = 1
            };
            while (true)
            {
                var entidades = Crm.IOS.RetrieveMultiple(q);
                foreach (var e in entidades.Entities)
                {
                    DireccionesCRM.Add((string)e["aen_claveintegracion"], DireccionFromCRM(e));
                }
                if (entidades.MoreRecords)
                {
                    q.PageInfo.PageNumber++;
                    q.PageInfo.PagingCookie = entidades.PagingCookie;
                }
                else
                {
                    break;
                }
            }
            Comun.LogText("Cacheadas direcciones: " + DireccionesCRM.Count);
        }
        internal void Iniciar(Oracle oracleGlobal, Comun comunGlobal, Crm crmGlobal)
        {
            Stopwatch sW_TODO = new Stopwatch(), sW_cacheoDatos = new Stopwatch(), sW_createUpdate = new Stopwatch(), sW_leeOra = new Stopwatch(),
                      sW_cnae = new Stopwatch(), sW_emparentar = new Stopwatch(), sW_desactivar = new Stopwatch(), sW_terguid = new Stopwatch(),
                      sW_borrado = new Stopwatch();

            sW_TODO.Start();

            try
            {
                crmGlobal.InicializarPFE(oracleGlobal);
                //TODO 0. Obtener de CRM los campos parametrizados que van a intervenir en el proceso (entidad de configuracion)


                //1. Bajar los terceros de CRM a un dictionary<string, Tercero>: solo el id_oracle si no comparamos, o bien todos los campos a sincronizar si comparamos
                //diccionarios.getAllTercerosFromCRM();
                sW_cacheoDatos.Start();
                crmGlobal.CachearInfoCRM();
                crmGlobal.CargaDiccionarioGuidsTercero();
                sW_cacheoDatos.Stop();
                comunGlobal.LogText(" ----->TIEMPO CACHEO DATOS: " + sW_cacheoDatos.Elapsed.ToString() + " <-----\n\n");


                //2. Leer la tabla del Oracle
                sW_leeOra.Start();
                oracleGlobal.LeerTerceros();
                sW_leeOra.Stop();
                comunGlobal.LogText(" ----->TIEMPO LECTURA ORACLE: " + sW_leeOra.Elapsed.ToString() + " <-----\n\n");


                //3. Por cada elemento del diccionario de oracle, comprobar contra el diccionario crm. Sino se encuentra, se crea. Si se
                //   encuentra, se comprueba campo a campo para validar si se machaca o no
                //4. Hacer las creates/ updates con PFE Core
                sW_createUpdate.Start();
                crmGlobal.InicializarPFE(oracleGlobal);
                #region Tratamiento de TERCEROS
                bool    ok;
                Tercero auxTerCRM = new Tercero();
                Entity  tercUpdate;


                foreach (var terceroORACLE in oracleGlobal.Terceros)
                {
                    ok = crmGlobal.TercerosCRM.TryGetValue(terceroORACLE.Key, out auxTerCRM);

                    if (ok) // Existe. Comprobar campo a campo
                    {
                        try
                        {
                            tercUpdate = new Entity("account");
                            bool ret = comunGlobal.ActualizarTercero(crmGlobal.TercerosCRM, terceroORACLE.Value, auxTerCRM, ref tercUpdate);

                            if (ret)
                            {
                                crmGlobal.AnadirElementoEmr(new UpdateRequest {
                                    Target = tercUpdate
                                });
                            }
                            else
                            {
                                crmGlobal.Iguales++;
                            }
                        }
                        catch (Exception e)
                        {
                            comunGlobal.LogText("ERROR al ACTUALIZAR el Entity equivalente del Tercero " + terceroORACLE.Value.Aen_claveintegracion + " ::: " + e.ToString());
                        }
                    }
                    else // No existe, se crea.
                    {
                        try
                        {
                            //Guardamos los Terceros que a posteriori desactivaremos (en create no se puede mandar registro inactivo)
                            if (terceroORACLE.Value.Statecode.Equals("Inactivo"))
                            {
                                crmGlobal.TercerosADesactivar.Add(terceroORACLE.Value.Aen_claveintegracion);
                            }

                            Entity newTercero = terceroORACLE.Value.GetEntityFromTercero();
                            crmGlobal.AnadirElementoEmr(new CreateRequest {
                                Target = newTercero
                            });
                        }
                        catch (Exception e)
                        {
                            comunGlobal.LogText("ERROR al CREAR el Entity equivalente del Tercero " + terceroORACLE.Value.Aen_claveintegracion + " ::: " + e.ToString());
                        }
                    }
                }
                crmGlobal.ProcesarUltimosEmr();
                #endregion Tratamiento de TERCEROS
                sW_createUpdate.Stop();
                crmGlobal.MostrarEstadisticas("TERCEROS");
                comunGlobal.LogText(" ----->TIEMPO CREATE/UPDATE TERCEROS: " + sW_createUpdate.Elapsed.ToString() + " <-----\n\n");


                //5. Carga de diccionario de terceros <Clave integración , Guid registro>
                sW_terguid.Start();
                crmGlobal.CargaDiccionarioGuidsTercero();
                sW_terguid.Stop();
                comunGlobal.LogText(" -----> END; TIEMPO CARGA DICCIONARIO GUIDS TERCERO: " + sW_terguid.Elapsed.ToString() + " <-----\n\n");



                //6. Carga de CNAES (TABLA CARGADA ANTERIORMENTE? A QUE ENTIDAD VA? SE PUEDE HACER EN ANTERIOR UPDATE/CREATE?)
                sW_cnae.Start();
                oracleGlobal.LeerCNAES();
                crmGlobal.CargaCNAEs(oracleGlobal.ListaCNAEs);
                //crmGlobal.EliminaOldCNAEs();
                crmGlobal.MostrarEstadisticas("CNAES");
                sW_cnae.Stop();
                comunGlobal.LogText(" -----> END; TIEMPO ACTUALIZACION CNAES (CREAR Y ELIMINAR LOS QUE NO VIENEN): " + sW_cnae.Elapsed.ToString() + " <-----\n\n");


                //7. Emparentar terceros pendientes
                sW_emparentar.Start();
                crmGlobal.EmparentaTerceros();
                crmGlobal.MostrarEstadisticas("EMPARENTACION");
                sW_emparentar.Stop();
                comunGlobal.LogText(" -----> END; TIEMPO EMPARENTACION TERCEROS: " + sW_emparentar.Elapsed.ToString() + " <-----\n\n");


                //8. Desactivar terceros que vienen como Inactivos
                sW_desactivar.Start();
                crmGlobal.DesactivarTerceros();
                crmGlobal.MostrarEstadisticas("DESACTIVACION TERCEROS");
                sW_desactivar.Stop();
                comunGlobal.LogText(" -----> END; TIEMPO DESACTIVAR TERCEROS INACTIVOS: " + sW_desactivar.Elapsed.ToString() + " <-----\n\n");


                //Liberamos diccionarios
                crmGlobal.LiberaDiccionarios();
                oracleGlobal.Terceros.Clear();//.Clear();

                sW_TODO.Stop();
                comunGlobal.LogText(" -----> END; TIEMPO TOTAL: " + sW_TODO.Elapsed.ToString() + " <-----\n\n");


                //var currentProcess = System.Diagnostics.Process.GetCurrentProcess();
                //long totalBytesOfMemoryUsed = currentProcess.WorkingSet64 / 1048576;
                //comunGlobal.LogText("\n\n############################# TOP MEMORIA AL FINAL DE TERCEROS: " + totalBytesOfMemoryUsed.ToString() + " #############################\n\n");
            }
            catch (Exception e)
            {
                comunGlobal.LogText("ERROR en Lanzador de TERCEROS ::: " + e.ToString());
                if (oracleGlobal != null && oracleGlobal.OraConnParaLog.State == ConnectionState.Open)
                {
                    oracleGlobal.OraConnParaLog.Dispose();
                }
            }
        }