/// <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>
        /// 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 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;
        }