/// <summary>
        /// Actualiza un Formato de notificacion en la BD del catalogo
        /// </summary>
        /// <param name="pNemail">entidad Formato NotificacionEmail</param>
        public bool Actualizar(NotificacionEmail pNemail)
        {
            bool CambioExitoso = false;

               using (SqlCommand command = new SqlCommand("uspSmehl_ActualizaFormatoNotificacion"
                                  , RegresaConnexionstring()))
               {
               command.CommandType = CommandType.StoredProcedure;
               command.Parameters.AddWithValue("@IdFormato", pNemail.IdFormato);
               command.Parameters.AddWithValue("@NombreFormato", pNemail.NombreNotificacion);
               command.Parameters.AddWithValue("@Cuerpo", pNemail.CuerpoMensaje);
               command.Parameters.AddWithValue("@De", pNemail.CuentaOrigen);
               command.Parameters.AddWithValue("@Para", pNemail.CuentaDestino);
               command.Parameters.AddWithValue("@Asunto", pNemail.AsuntoMensaje);

               SqlParameter ret = new SqlParameter("@Return_Value", SqlDbType.Int);
               ret.Direction = ParameterDirection.ReturnValue;
               command.Parameters.Add(ret);

               command.Connection.Open();
               command.ExecuteNonQuery();

               CambioExitoso = Convert.ToBoolean(ret.Value);

               }

               return CambioExitoso;
        }
        /// <summary>
        /// Actualiza un Formato de notificacion en la BD del catalogo
        /// </summary>
        /// <param name="pNemail">entidad de NotificacionEmail</param>
        public int Agregar(NotificacionEmail pNemail)
        {
            int id = 0;
               using (SqlCommand command = new SqlCommand("uspSmehl_CrearFormatoNotificacion"
                                            , RegresaConnexionstring()))
               {
               command.CommandType = CommandType.StoredProcedure;
               command.Parameters.AddWithValue("@NombreFormato",pNemail.NombreNotificacion);
               command.Parameters.AddWithValue("@Cuerpo", pNemail.CuerpoMensaje);
               command.Parameters.AddWithValue("@De", pNemail.CuentaOrigen);
               command.Parameters.AddWithValue("@Para", pNemail.CuentaDestino);
               command.Parameters.AddWithValue("@Asunto", pNemail.AsuntoMensaje);

               SqlParameter ret = new SqlParameter("@Return_Value", SqlDbType.Int);
               ret.Direction = ParameterDirection.ReturnValue;
               command.Parameters.Add(ret);

               command.Connection.Open();
               command.ExecuteNonQuery();

               id = Convert.ToInt32(ret.Value);
               }

               return id;
        }
        /// <summary>
        /// actualiza un Nuevo Formato de notificacion
        /// </summary>
        /// <param name="pNemail"></param>
        /// <returns></returns>
        public bool Actualizar(NotificacionEmail pNemail)
        {
            bool ID = false;

               try
               {
               NotificacionEmailDA NDA = new NotificacionEmailDA(ConGenral);
               ID = NDA.Actualizar(pNemail);
               }
               catch (Exception ex)
               {

               ExceptionNotificacionEmail NotificacionException = new ExceptionNotificacionEmail("El Metodo Actualizar(NotificacionEmail pNemail) ) fallo" + " || " + ex);
               NotificacionEmail notificacion = new NotificacionEmail("Error en SMEHL", NotificacionException);
               notificacion.TipoNotificacion = EnumTipoNotificacion.Error;
               NotificacionEmailService NS = new NotificacionEmailService(ConGenral);
               NS.EnviarNotificacion(notificacion);
               }

               return ID;
        }
        /// <summary>
        /// Trae el Regristo de la BD de un Formato de Notificacion
        /// </summary>
        /// <param name="pIdFormato">id Formato de Notificacion</param>
        public NotificacionEmail TraerDatosNotificacion(int pIdFormato)
        {
            using (SqlCommand cm = new SqlCommand("uspSeleccionarFormatoCorreo", RegresaConnexionstring()))
                   {

                       cm.CommandType = CommandType.StoredProcedure;

                       cm.Parameters.Add("@idFormato", SqlDbType.Int).Value = pIdFormato;

                       cm.Connection.Open();
                       SqlDataReader rd = cm.ExecuteReader();

                       while (rd.Read())
                       {
                           NotificacionEmail Nemail = new NotificacionEmail(pIdFormato, rd["De"].ToString(), rd["Para"].ToString(), rd["Asunto"].ToString(), rd["Cuerpo"].ToString(), rd["NombreFormato"].ToString());
                           this.MyNotificacionEmail = Nemail;
                       }

                   }

            return this.MyNotificacionEmail;
        }
        /// <summary>
        /// agrega un nuevo formato de notificacion
        /// </summary>
        /// <param name="pNemail"></param>
        /// <returns></returns>
        public int Agregar(NotificacionEmail pNemail)
        {
            int ID=0;

               try
               {
               NotificacionEmailDA NDA = new NotificacionEmailDA(ConGenral);
               ID = NDA.Agregar(pNemail);
               }
               catch (Exception ex)
               {
               ID = -1;
               ExceptionNotificacionEmail NotificacionException = new ExceptionNotificacionEmail("El Metodo Agregar(NotificacionEmail pNemail) ) fallo" + " || " + ex);
               NotificacionEmail notificacion = new NotificacionEmail("Error en SMEHL", NotificacionException);
               notificacion.TipoNotificacion = EnumTipoNotificacion.Error;
               NotificacionEmailService NS = new NotificacionEmailService(ConGenral);
               NS.EnviarNotificacion(notificacion);
               }

               return ID;
        }
        /// <summary>
        /// Trae datos de Servidor SMPT
        /// </summary>
        /// <returns></returns>
        protected SMTPClienteDatos TraerServidorSMPT()
        {
            SMTPClienteDatos smtpRegreso = new SMTPClienteDatos();
               try
               {
               //NotificacionEmailDA NDA = new NotificacionEmailDA(TipoApp);
               //smtpRegreso = NDA.TraerServidorSMPT();

               //ParametrosDA parametros = new ParametrosDA(TipoApp);
               //List<ParametrosDelSistemaDetalle> listaParametros = parametros.SeleccionarGrupoDeParametros(eGruposDeParametros.FormatosDeNotificaciones, eSubGruposDeParametros.SMTP);

               //smtpRegreso.Nombre = (from c in listaParametros
               //                      where c.Clave.Equals("IP")
               //                      select c.Valor).FirstOrDefault().ToString();

               //smtpRegreso.Puerto = Convert.ToInt32((from c in listaParametros
               //                                      where c.Clave.Equals("Puerto")
               //                                      select c.Valor).FirstOrDefault());

               smtpRegreso.Nombre = "relaysmtp.ndc.nna";
               smtpRegreso.Puerto = Convert.ToInt32("25");

               }
               catch (Exception ex)
               {
               ExceptionNotificacionEmail NotificacionException = new ExceptionNotificacionEmail("El Metodo TraerServidorSMPT fallo" + " || " + ex);
               NotificacionEmail notificacion = new NotificacionEmail("Error en SMEHL", NotificacionException);
               NotificacionEmailService NS = new NotificacionEmailService(ConGenral);
               NS.EnviarNotificacion(notificacion);

               throw NotificacionException;
               }

               return smtpRegreso;
        }
        /// <summary>
        /// Metodo utilizado para mandar un error a el departamento de sistemas
        /// </summary>
        /// <param name="ex"></param>
        /// <param name="pIdParametroSistemaDetalle"></param>
        /// <returns></returns>
        protected NotificacionEmail TraerDatosNotificacionError(NotificacionEmail pNotiex, int pIdParametroSistemaDetalle)
        {
            NotificacionEmail NE = new NotificacionEmail();
               try
               {
               switch (Tipo)
               {
                   case 0:
                       NotificacionEmailDA NDA = new NotificacionEmailDA(ConGenral);
                       this.MyNotificacionEmail = NDA.TraerDatosNotificacion(pIdParametroSistemaDetalle);
                       this.MyNotificacionEmail.AsuntoMensaje = "Error de Sistema : " +pNotiex.AsuntoMensaje;
                       break;
                   case 1:

                       this.MyNotificacionEmail = new NotificacionEmail(1, "*****@*****.**", "*****@*****.**", "Error de Sistema : " + pNotiex.AsuntoMensaje
                           ,"<table>  <tbody>  <tr>  <td>Este es un Mensaje Generado Automaticamente <b>DLOG</b></td></tr>  <tr>  <td><br />  </td></tr>  <tr>  <td>Tienes un Nuevo Caso Con las Siguientes Caracteristicas:</td></tr>  <tr>  <td><br />  </td></tr>  <tr>  <td><br />  </td></tr>  <tr>  <td>  <table>  <tbody>  <tr>  <td><b>Mensaje de Excepcion:</b></td>  <td>{0}</td></tr>  <tr>  <td><b>Fuente de Excepcion:</b></td>  <td>{1}</td></tr>  <tr>  <td><b>Excepción Interna:</b></td>  <td>{2}</td></tr>  <tr>  <td><b>Ocurrió: </b></td>  <td>{3}</td></tr>  <tr>  <td><b>Procedimiento que la genero: </b></td>  <td>{4}</td></tr>  <tr>  <td><b>Fecha en que ocurrió:</b></td>  <td>{5}</td></tr>  <tr>  <td><b>Hora en que ocurrió:</b></td>  <td>{6}</td></tr>  <tr>  <td><b>Maquina:</b></td>  <td>{7}</td></tr>  <tr>  <td><b>IP:</b></td>  <td>{8}</td></tr></tbody></table></td></tr>  <tr>  <td><br />  </td></tr>  <tr>  <td><br />  </td></tr>  <tr>  <td>  <p>******************************FIN DE MENSAJE***************************</p></td></tr>  <tr>  <td><br />  </td></tr>  <tr>  <td><br />  </td></tr>  <tr>  <td><br />  </td></tr>  <tr>  <td><b>Favor de No Responder a este Correo</b></td></tr></tbody></table>"
                           ,"Error Sistema");
                       this.MyNotificacionEmail.CopiaPara = new List<string>();
                       this.MyNotificacionEmail.CopiaPara.Add("*****@*****.**");
                       this.MyNotificacionEmail.CopiaPara.Add("*****@*****.**");
                     break;
                   default:
                       break;
               }

               }
               catch (Exception e)
               {
               throw new ExceptionNotificacionEmail("No Fue posible Traer Los datos para Notificacion de Error" +" || " + e);
               }

              ///Lleno el formato del correo con las variables ya establecidas en el formato de la BD.
               if (pNotiex.Exception != null)
               {
               try
               {
                     string NombreDeMaquina = System.Net.Dns.GetHostName();
                     System.Net.IPAddress[] Ip = System.Net.Dns.GetHostAddresses(NombreDeMaquina);

                   this.MyNotificacionEmail.CuerpoMensaje = string.Format(this.MyNotificacionEmail.CuerpoMensaje
                       , string.IsNullOrEmpty(pNotiex.Exception.Message.ToString()) ? "" : pNotiex.Exception.Message.ToString()
                  , pNotiex.Exception.Source == null ? "" : pNotiex.Exception.Source.ToString()
                  , pNotiex.Exception.InnerException == null ? "" : pNotiex.Exception.InnerException.ToString()
                  , pNotiex.Exception.StackTrace == null ? "" : pNotiex.Exception.StackTrace.ToString()
                  , pNotiex.Exception.TargetSite == null ? "" : pNotiex.Exception.TargetSite.ToString()
                  , System.DateTime.Now.ToShortDateString()
                  , System.DateTime.Now.ToShortTimeString()
                  , NombreDeMaquina,Ip[0].ToString());
               }
               catch (Exception e)
               {
                   throw;
               }
               }
               else
               {
               throw new ExceptionParametroNulo("el Parametro no puede ser nulo ," + "Exception ex");
               }

               return this.MyNotificacionEmail;
        }
        /// <summary>
        /// metodo utilizado para traer un formato de notificacion deseado.
        /// </summary>
        /// <param name="pIdParametroSistemaDetalle"></param>
        /// <returns></returns>
        public NotificacionEmail TraerDatosNotificacion(int pIdParametroSistemaDetalle)
        {
            try
               {
               NotificacionEmailDA NDA = new NotificacionEmailDA(ConGenral);
               this.MyNotificacionEmail = NDA.TraerDatosNotificacion(pIdParametroSistemaDetalle);

               }
               catch (Exception e)
               {
               ExceptionNotificacionEmail NotificacionException = new ExceptionNotificacionEmail("El Metodo TraerDatosNotificacion fallo" + " || " + e);
               NotificacionEmail notificacion = new NotificacionEmail("Error en SMEHL", NotificacionException);
               notificacion.TipoNotificacion = EnumTipoNotificacion.Error;
               NotificacionEmailService NS = new NotificacionEmailService(ConGenral);
               NS.EnviarNotificacion(notificacion);

               throw NotificacionException;
               }

               return this.MyNotificacionEmail;
        }
        /// <summary>
        /// Regreasa todos los formatos de notificacion.
        /// </summary>
        /// <returns></returns>
        public List<NotificacionEmail> Seleccionar()
        {
            List<NotificacionEmail> MyNotificacion = new List<NotificacionEmail>();
               try
               {
               NotificacionEmailDA NDA = new NotificacionEmailDA(ConGenral);
               MyNotificacion = NDA.Seleccionar();
               }
               catch (Exception ex)
               {
               ExceptionNotificacionEmail NotificacionException = new ExceptionNotificacionEmail("El Metodo Seleccionar() ) fallo" + " || " + ex);
               NotificacionEmail notificacion = new NotificacionEmail("Error en SMEHL", NotificacionException);
               notificacion.TipoNotificacion = EnumTipoNotificacion.Error;
               NotificacionEmailService NS = new NotificacionEmailService(ConGenral);
               NS.EnviarNotificacion(notificacion);
               }

               return MyNotificacion;
        }
        /// <summary>
        /// Envia Notificacion.
        /// </summary>
        /// <param name="pNemail"></param>
        /// <returns></returns>
        public bool EnviarNotificacion(NotificacionEmail pNemail)
        {
            MailMessage MyMail = new MailMessage();
               switch (pNemail.TipoNotificacion)
               {
               case EnumTipoNotificacion.Mensajes:

               #region Notificacion Mensaje

                   #region From
                   if (string.IsNullOrEmpty(pNemail.CuentaOrigen))
                       throw new ExceptionNotificacionEmail("No se ingreso Cuenta de origen");
                   else
                   {

                       MyMail.From = new MailAddress(pNemail.CuentaOrigen.ToString(), pNemail.CuentaOrigen.ToString());
                   }

                   #endregion

                   #region To

                   if (string.IsNullOrEmpty(pNemail.CuentaDestino))
                       throw new ExceptionNotificacionEmail("No se ingreso Cuenta de Destino");
                   else
                   {
                       MyMail.To.Add(new MailAddress(pNemail.CuentaDestino.ToString()));
                   }

                   #endregion

                   #region BCC

                   //MyMail.Bcc.Add(new MailAddress(pNemail.CopiaPara.ToString()));
                   #endregion

                   #region CC

                   if (pNemail.CopiaPara.Count() >= 1 && pNemail.CopiaPara != null)
                   {
                       foreach (string inAdress in pNemail.CopiaPara)
                       {
                           MyMail.CC.Add(new MailAddress(inAdress));
                       }
                   }

                   #endregion

                   #region Subject
                   if (string.IsNullOrEmpty(pNemail.AsuntoMensaje))
                       throw new ExceptionNotificacionEmail("No se ingreso El Asunto del Mensaje");
                   else
                   {
                       MyMail.Subject = pNemail.AsuntoMensaje.ToString();
                   }
                   #endregion

                   #region Attachments
                   if(pNemail.Adjuntos!=null && pNemail.Adjuntos.Count > 0)
                   {
                       foreach (var iFile in pNemail.Adjuntos)
                       {
                           MyMail.Attachments.Add(iFile);
                       }
                   }

                   if (pNemail.Attachments != null && pNemail.Attachments.Count > 0)
                   { SetAttachments(pNemail.Attachments); }

                   #endregion

                   #region Body
                   if (string.IsNullOrEmpty(pNemail.CuerpoMensaje))
                       throw new ExceptionNotificacionEmail("No se ingreso el Cuerpo del Mensaje");
                   else
                   {
                       MyMail.Body = pNemail.CuerpoMensaje;
                   }
                   #endregion

                   #region Deployment
                   // Especifica el formato del cuerpo del mensaje
                   MyMail.IsBodyHtml = true;
                   // establece la prioridad del mensaje
                   MyMail.Priority = pNemail.Prioridad;
                   #endregion

                   SMTPClienteDatos smtpServer = TraerServidorSMPT();
                   if (string.IsNullOrEmpty(smtpServer.Nombre))
                       throw new ExceptionNotificacionEmail("No existe registro del Nombre de servidor SMPT");

                   if (string.IsNullOrEmpty(smtpServer.Puerto.ToString()))
                       throw new ExceptionNotificacionEmail("No existe registro del Puerto de servidor SMPT");

                   if (!(string.IsNullOrEmpty(smtpServer.Nombre) || string.IsNullOrEmpty(smtpServer.Puerto.ToString())))
                   {

                       SmtpClient clienteSmtp = new SmtpClient(smtpServer.Nombre, smtpServer.Puerto);
                       try
                       {

                           clienteSmtp.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);
                           string userState = "envio de notificacion ||" + MyMail.Subject;
                           clienteSmtp.SendAsync(MyMail, userState);
                           enviado = true;
                       }
                       catch (Exception e)
                       {
                           enviado = false;

                           ExceptionNotificacionEmail NotificacionException = new ExceptionNotificacionEmail("El Metodo EnviarNotificacion fallo" + " || ", e);
                           NotificacionEmail notificacion = new NotificacionEmail("Error en DLOG", NotificacionException);
                           notificacion.TipoNotificacion = EnumTipoNotificacion.Error;
                           NotificacionEmailService NS = new NotificacionEmailService(ConGenral);
                           NS.EnviarNotificacion(notificacion);

                           throw NotificacionException;
                       }

                   }

                   #endregion
                   break;
               #region Error
               case EnumTipoNotificacion.Error:

                   NotificacionEmail NotificacionError = TraerDatosNotificacionError(pNemail, 1);

                   #region From
                   if (string.IsNullOrEmpty(NotificacionError.CuentaOrigen.ToString()))
                       throw new ExceptionNotificacionEmail("No se ingreso Cuenta de origen");
                   else
                   {
                       MyMail.From = new MailAddress(NotificacionError.CuentaOrigen.ToString(), NotificacionError.CuentaOrigen.ToString());
                   }

                   #endregion

                   #region To
                   if (string.IsNullOrEmpty(NotificacionError.CuentaDestino.ToString()))
                       throw new ExceptionNotificacionEmail("No se ingreso Cuenta Destino");
                   else
                   {
                     string [] lCorreos=  NotificacionError.CuentaDestino.ToString().Split(';');

                     foreach (var icorreo in lCorreos)
                     {
                         MyMail.To.Add(new MailAddress(icorreo));
                     }

                   }

                   #endregion

                   #region BCC

                   #endregion

                   #region CC

                   if (NotificacionError.CopiaPara.Count() >= 1 && NotificacionError.CopiaPara != null)
                   {
                       foreach (string inAdress in NotificacionError.CopiaPara)
                       {
                           MyMail.CC.Add(new MailAddress(inAdress));
                       }
                   }

                   #endregion

                   #region Subject
                   if (string.IsNullOrEmpty(NotificacionError.AsuntoMensaje.ToString()))
                       throw new ExceptionNotificacionEmail("No se ingreso Asunto del Mensaje");
                   else
                   {
                       MyMail.Subject = NotificacionError.AsuntoMensaje.ToString();
                   }
                   #endregion

                   #region Attachments
                   if (NotificacionError.Attachments != null && NotificacionError.Attachments.Count > 0)
                   { SetAttachments(NotificacionError.Attachments); }

                   #endregion

                   #region Body
                   if (string.IsNullOrEmpty(NotificacionError.CuerpoMensaje.ToString()))
                       throw new ExceptionNotificacionEmail("No se ingreso El Cuerpo del Mensaje");
                   else
                   {
                       MyMail.Body = NotificacionError.CuerpoMensaje;
                   }
                   #endregion

                   #region Deployment
                   // Especifica el formato del cuerpo del mensaje
                   MyMail.IsBodyHtml = true;
                   // establece la prioridad del mensaje
                   MyMail.Priority = pNemail.Prioridad;
                   #endregion

                   SMTPClienteDatos smtpServer2 = TraerServidorSMPT();
                   if (string.IsNullOrEmpty(smtpServer2.Nombre))
                       throw new ExceptionNotificacionEmail("No existe registro del Nombre de servidor SMPT");

                   if (string.IsNullOrEmpty(smtpServer2.Puerto.ToString()))
                       throw new ExceptionNotificacionEmail("No existe registro del Puerto de servidor SMPT");

                   if (!(string.IsNullOrEmpty(smtpServer2.Nombre) || string.IsNullOrEmpty(smtpServer2.Puerto.ToString())))
                   {

                       try
                       {
                           SmtpClient clienteSmtp = new SmtpClient(smtpServer2.Nombre, smtpServer2.Puerto);
                           //envia el correo
                           clienteSmtp.Send(MyMail);
                           enviado = true;

                       }
                       catch (Exception e)
                       {
                           enviado = false;

                           ExceptionNotificacionEmail NotificacionException = new ExceptionNotificacionEmail("El Metodo EnviarNotificacion fallo" + " || ", e);
                           throw NotificacionException;
                       }

                   }

                   break;
               #endregion
               default:
                   break;
               }

               return enviado;
        }
        /// <summary>
        /// Elimina un Formato de notificacion
        /// </summary>
        /// <param name="pIdObjeto"></param>
        /// <returns></returns>
        public bool Eliminar(int pIdObjeto)
        {
            bool ID = false;
               try
               {
               NotificacionEmailDA NDA = new NotificacionEmailDA(ConGenral);
               ID = NDA.Eliminar(pIdObjeto);
               }
               catch (Exception ex)
               {
               ExceptionNotificacionEmail NotificacionException = new ExceptionNotificacionEmail("El Metodo Eliminar(int pIdObjeto) fallo" + " || " + ex);
               NotificacionEmail notificacion = new NotificacionEmail("Error en SMEHL", NotificacionException);
               notificacion.TipoNotificacion = EnumTipoNotificacion.Error;
               NotificacionEmailService NS = new NotificacionEmailService(ConGenral);
               NS.EnviarNotificacion(notificacion);
               }

               return ID;
        }