//Genera informe de excel y lo envia por correo
        public string GenerateInformeClient(int id_infoCreado, string correo, List <Procesos> procesos)
        {
            for (int x = 1; x <= NumberOfRetries; ++x)
            {
                try
                {
                    DataGenerarInforme dataInform = _generateInformes.Find(x => x.Email == correo).ToList()[id_infoCreado];

                    string patyhexcel = AppDomain.CurrentDomain.BaseDirectory + "Informe" + dataInform.Id + ".xlsx";

                    SLDocument document   = new SLDocument();
                    DataTable  _datatable = new DataTable();

                    EncabezadoCampos(_datatable, dataInform);
                    AgregarListaProcesos(OrdenarListaDeProcesos(procesos, dataInform), _datatable, procesos, dataInform);

                    document.ImportDataTable(1, 1, _datatable, true);

                    //Le da estilos al excel
                    createStyleExcel(document);
                    //guardar el excel
                    document.SaveAs(patyhexcel);


                    //enviar y actualizar en la base de datos para poder descargar el excel
                    return(enviarActualizarExcel(dataInform));
                }
                catch (Exception e) when(x <= NumberOfRetries)
                {
                    Thread.Sleep(DelayOnRetry);
                }
            }

            return("No se pudo en ningun intento. Intentelo más tarde: ");
        }
        //enviar y actualizar en la basede datos para poder descargar el excel
        public string enviarActualizarExcel(DataGenerarInforme dataInform)
        {
            for (int y = 1; y <= NumberOfRetries; ++y)
            {
                try
                {
                    //cambia la informacion de la base de datos para porder descargar el archivo
                    UpdateDataInformGenerate(dataInform);
                    string     filename   = AppDomain.CurrentDomain.BaseDirectory + "Informe" + dataInform.Id + ".xlsx";
                    Attachment data_atach = new Attachment(filename, MediaTypeNames.Application.Octet);

                    if (EnviarCorreos(data_atach, dataInform))
                    {
                        return("Se enviaron y se creo el excel requerido.");
                    }
                    else
                    {
                        return("Error insperado en el envio del correo, se estara comunicando, igual puede obtener el informe descargandolo en la pagina.");
                    }
                }
                catch (Exception e)
                {
                    Thread.Sleep(DelayOnRetry);
                }
            }
            return("No se pudo en ningun intento. Intentelo más tarde");
        }
        //Envia el path del archivo de excel que le pertenerce al informe a buscar
        public string fileDataInmformeExcel(int id, string correo)
        {
            List <DataGenerarInforme> datalist = _generateInformes.Find(x => x.Email == correo).ToList();
            DataGenerarInforme        data     = datalist[id];
            string filename = AppDomain.CurrentDomain.BaseDirectory + "Informe" + data.Id + ".xlsx";

            return(filename);
        }
 //crea el cuerpo del email a enviar
 public string createBody(DataGenerarInforme dataInform)
 {
     return("<h4>Nuevo Informe generado correctamente</h4> " +
            "<p>Adjunto encontrarás el informe generado correctamente en nuestro sistema con los siguientes criterios:</p>" +
            "<ol> <li>Filtrado por:" + dataInform.FiltrarPor + "</li>" +
            "<li>Ordenado por: " + dataInform.OrdenadoPor + "</li> </ol> " +
            "<p> Te recordamos que puedes configurar el informe para que se adapte a tus necesidades," +
            " por ejemplo modificar el orden de los procesos o de las columnas dentro del informe</p>" +
            "<p>Para configurar el informe accede a tu Panel de Informes en este enlace: https://www.monolegal.co/MisInformes </p>");
 }
 //Eliminar la configuracion de un informe creado con anterioridad y devolver la lista de configuracion
 //de informes creados
 public string DeleteInformConfig(int id_client, string email)
 {
     try {
         DataGenerarInforme dataInform = _generateInformes.Find(x => x.Email == email).ToList()[id_client];
         _generateInformes.DeleteOne(x => x.Id == dataInform.Id);
         //obtenermos y devolvemos los datos actualizados
         return("Se elimino correctamente");
     }
     catch (Exception e) {
         return(e.Message.ToString());
     }
 }
        //Cambia la a true el valor del excel generado para que se pueda descargar
        private void UpdateDataInformGenerate(DataGenerarInforme data)
        {
            var filter = Builders <DataGenerarInforme> .Filter.Eq("Id", data.Id);

            var update = Builders <DataGenerarInforme> .Update.Set("InformeGenerado", true);

            var options = new FindOneAndUpdateOptions <DataGenerarInforme> {
                IsUpsert = true, ReturnDocument = ReturnDocument.After
            };

            _generateInformes.FindOneAndUpdate(
                filter, update, options);
            //Se hizo el update
        }
        //actualizar un informe que exta en la base de datos
        public string UpdateDataNewInforme(int id, DataGenerarInforme newData)
        {
            try {
                List <DataGenerarInforme> datalist   = _generateInformes.Find(x => x.Email == newData.Email).ToList();
                DataGenerarInforme        dataUpdate = datalist[id];
                newData.Id = dataUpdate.Id;
                var filter = Builders <DataGenerarInforme> .Filter.Eq("Id", dataUpdate.Id);

                _generateInformes.ReplaceOne(filter, newData);
                return("Update Fine");
            }
            catch (Exception e) {
                return(e.Message.ToString());
            }
        }
        //Agrega encabezados al excel
        private bool EncabezadoCampos(DataTable tabla, DataGenerarInforme info)
        {
            if (info.CamposRequeridos.Length > 0)
            {
                foreach (string campo in info.CamposRequeridos)
                {
                    tabla.Columns.Add(campo);
                }
            }
            else
            {
                tabla.Columns.Add("No se seleccionaron campos");
            }

            return(true);
        }
        //Envia el informe generado por correo
        public bool EnviarCorreos(Attachment data, DataGenerarInforme dataInform)
        {
            SmtpClient smtpClient = new SmtpClient("smtp.gmail.com", 587);

            smtpClient.UseDefaultCredentials = false;
            smtpClient.Credentials           = new System.Net.NetworkCredential()
            {
                UserName = emailSendEmail,
                Password = contraseniaCorreoSend
            };
            try {
                MailMessage mail = new MailMessage();
                smtpClient.EnableSsl = true;
                //correo de quien lo envia
                mail.From = new MailAddress(emailSendEmail);
                //corrreo a quien se lo envia
                mail.To.Add(new MailAddress(emailClientLogin));
                if (dataInform.Correos_Adicionales != "" && dataInform.Correos_Adicionales != null)
                {
                    mail.To.Add(new MailAddress(dataInform.Correos_Adicionales));
                    //buscar la forma d enviar correos adicionales
                }
                mail.Subject    = "Monolegal - Nuevo informe: " + dataInform.Titulo;
                mail.IsBodyHtml = true;
                //genera cuerpo del correo
                mail.Body = createBody(dataInform);
                if (data != null)
                {
                    mail.Attachments.Add(data);
                }
                smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
                smtpClient.Send(mail);

                return(true);
            }
            catch (Exception e) {
                return(false);
            }
        }
 public async Task <string> ActualizarInforme(int id, DataGenerarInforme _newInforme)
 {
     return(_dataInfoInformesService.UpdateDataNewInforme(id, _newInforme));
 }
 public async Task <string> AgregarInforme(DataGenerarInforme _newInforme)
 {
     return(_dataInfoInformesService.InsertDataNewInforme(_newInforme));
 }
 //Agregar un nuevo informe a la base de datos
 public string InsertDataNewInforme(DataGenerarInforme data)
 {
     _generateInformes.InsertOne(data);
     return("Add complete");
 }
 //Ordena los procesos segun se le indique
 private IOrderedEnumerable <Procesos> OrdenarListaDeProcesos(List <Procesos> procesos, DataGenerarInforme encabezadosinforme)
 {
     if (encabezadosinforme.OrdenadoPor == "termino")
     {
         return(procesos.OrderBy(x => x.FechaRegistro));
     }
     else if (encabezadosinforme.OrdenadoPor == "primeroCambios")
     {
         return(procesos.OrderBy(x => x.UltimaFechaActuacion));
     }
     else if (encabezadosinforme.OrdenadoPor == "primeroNoCambios")
     {
         return(procesos.OrderBy(x => x.UltimaFechaActuacion));
     }
     else
     {
         return(null);
     }
 }
 //Crea un nuevo informe de procesos y lo agrega a la base de datos
 private void AgregarListaProcesos(IOrderedEnumerable <Procesos> ordenarProcesos, DataTable datatable, List <Procesos> procesos, DataGenerarInforme camposInforme)
 {
     if (ordenarProcesos != null)
     {
         if (camposInforme.CamposRequeridos.Length > 0)
         {
             foreach (Procesos proces_ordenados in ordenarProcesos)
             {
                 datatable.Rows.Add(proces_ordenados.NumProceso);
             }
         }
     }
     else
     {
         if (camposInforme.CamposRequeridos.Length > 0)
         {
             //cuando no se sabe como se ordenan por cualquier error
             foreach (Procesos proces_no_ordenados in procesos)
             {
                 datatable.Rows.Add(proces_no_ordenados.NumProceso);
             }
         }
     }
 }