private async void DoWork(object state)
        {
            /*
             *  Obtener los documentos necesarios para cierre de Cajas y finalizar wf
             *
             *  1. Obtener archivos de Iron Mountain
             *  2. Leer Archivos
             */



            var horaActual = DateTime.Now.TimeOfDay;

            if (horaActual >= horaInicial && horaActual <= horaFinal && !estaOcupado)
            {
                /*Ponemos al servicio en modo ocupado */
                estaOcupado = true;
                string rutaDescargar = _configuration.GetValue <string>("RutasWorkers:ArchivoCreditosRecibidosIM");
                _logger.LogInformation("Iniciando el proceso de Cierre de Workflows.");

                string         host           = "www.imrmconnect.cl";
                string         username       = "******";
                string         password       = "******";
                ConnectionInfo connectionInfo = new ConnectionInfo(host, "sftp", new PasswordAuthenticationMethod(username, password));
                using (SftpClient sftp = new SftpClient(connectionInfo))
                {
                    sftp.Connect();
                    sftp.ChangeDirectory("reportes");
                    //var sftpFileInfo = sftp.GetStatus(@"Rpt_LA_CRED_Recepcionados.csv");

                    using (Stream fileStream = File.Create(rutaDescargar))
                    {
                        sftp.DownloadFile("Rpt_LA_CRED_Recepcionados.csv", fileStream);
                    }
                    sftp.Disconnect();
                }

                CsvParserOptions                csvParserOptions = new CsvParserOptions(true, ';');
                CreditosRecibidosMapping        csvMapper        = new CreditosRecibidosMapping();
                CsvParser <CreditosRecibidosIM> csvParser        = new CsvParser <CreditosRecibidosIM>(csvParserOptions, csvMapper);

                var result = csvParser
                             .ReadFromFile(rutaDescargar, Encoding.ASCII)
                             .Where(x => x.IsValid)
                             .Select(x => x.Result)
                             .AsSequential()
                             .ToList();

                StringBuilder inserts = new StringBuilder();
                result.ForEach(x => inserts.AppendLine($"insert into dbo.RecepcionadosIM values ('{x.Folio}');"));

                using (var connection = new SqlConnection(_configuration.GetConnectionString("DocumentManagementConnection")))
                {
                    //_logger.LogInformation($"La cantidad es: {result.Count.ToString()}");

                    string limpiezas = @"
                        truncate table dbo.RecepcionadosIM;
                        truncate table dbo.TareasFinalizarWF;";

                    await connection.ExecuteAsync(limpiezas, null, null, 240);

                    await connection.ExecuteAsync(inserts.ToString(), null, null, 240);

                    string tareasAFinalizar = @" insert into dbo.TareasFinalizarWF
                                    SELECT b.Id TareaId,  b.SolicitudId, c.NumeroTicket, d.FolioCredito, b.EtapaId
                                    FROM Tareas b
                                    INNER JOIN Solicitudes c on b.SolicitudId = c.Id
                                    INNER JOIN Creditos d on c.NumeroTicket = d.NumeroTicket
                                    INNER JOIN ExpedientesCreditos e on d.Id = e.CreditoId
                                    INNER JOIN Etapas f on b.EtapaId = f.Id
                                    INNER JOIN RecepcionadosIM im on d.FolioCredito = im.Folio
                                    where b.Estado = 'Activada'
                                    and b.EtapaId <> 18";

                    await connection.ExecuteAsync(tareasAFinalizar.ToString(), null, null, 240);

                    string cerrarEtapas = @"update a 
                                            set a.EjecutadoPor = 'wfboot', a.Estado = 'Finalizada', a.FechaTerminoFinal = GETDATE()
                                            from Tareas a
                                            inner join TareasFinalizarWF b on a.Id = b.TareaId";

                    await connection.ExecuteAsync(cerrarEtapas, null, null, 240);


                    string abrirEtapaFinal = @"insert into Tareas(SolicitudId, EtapaId, AsignadoA, ReasignadoA, EjecutadoPor, Estado, FechaInicio, FechaTerminoEstimada, FechaTerminoFinal, UnidadNegocioAsignada)
                                                select SolicitudId, 18 EtapaId, 'wfboot' AsignadoA, null rEA, null Ejec, 'Activada' estado, GETDATE() fechaini, null fecterestimada, null fectermfinal, null una 
                                                from TareasFinalizarWF";

                    await connection.ExecuteAsync(abrirEtapaFinal, null, null, 240);
                }


                var           destinatarios = _configuration.GetSection("CoordinacionWorkers:CierrePagaresDeIronMountainWorker:DestinatariosNotificaciones").Get <string[]>();
                StringBuilder mailTemplate  = new StringBuilder();
                mailTemplate.AppendLine("<p>Los Pagaré Ingresados en IM, han sido cerrados</p>");
                mailTemplate.AppendLine("<small>Correo enviado automaticamente por Galvarino favor no contestar.</small>");
                await _mailService.SendEmail(destinatarios, "Cierre de Pagarés de IM", mailTemplate.ToString());
            }
            else
            {
                _logger.LogInformation("No estamos dentro del rango de horas, el servicio eta ocupado o ya corrio para el dia de hoy.");
            }
        }
示例#2
0
        private void DoWork(object state)
        {
            var    _context = _scope.ServiceProvider.GetRequiredService <ApplicationDbContext>();
            string Schema   = _configuration.GetValue <string>("schema");
            string nombreArchivo;
            //nombreArchivo = "Carga";
            string        rutaDescargar;
            int           registrosCargados = 0;
            StringBuilder mailTemplate      = new StringBuilder(); // se genera string correo noticación
            StringBuilder foliosRepetidos   = new StringBuilder(); //se genera string para folio repetidos
            string        sql  = "";
            string        ruta = "";


            using (var connection = new SqlConnection(_configuration.GetConnectionString("DocumentManagementConnection")))
            {
                var horaActual = DateTime.Now.TimeOfDay;
                if (horaActual >= horaInicial && horaActual <= horaFinal && !estaOcupado)
                {
                    /*Todo:  Revisar Findesemanas*/
                    if (DateTime.Now.DayOfWeek == DayOfWeek.Monday)
                    {
                        nombreArchivo = "Carga" + DateTime.Now.AddDays(-3).ToString("ddMMyyyy");
                        ruta          = _configuration["RutaCargaCredito"] + nombreArchivo + ".txt";
                    }
                    else if (
                        DateTime.Now.DayOfWeek == DayOfWeek.Thursday ||
                        DateTime.Now.DayOfWeek == DayOfWeek.Wednesday ||
                        DateTime.Now.DayOfWeek == DayOfWeek.Tuesday ||
                        DateTime.Now.DayOfWeek == DayOfWeek.Friday
                        )
                    {
                        nombreArchivo = "Carga" + DateTime.Now.AddDays(-1).ToString("ddMMyyyy");
                        ruta          = _configuration["RutaCargaCredito"] + nombreArchivo + ".txt";
                    }
                    else
                    {
                        return;
                    }
                    rutaDescargar = _configuration.GetValue <string>("RutaCargaCredito") + nombreArchivo + ".txt";

                    rutaDescargar = @"c:\cargainicial\CargaExtra04122019.txt";
                    nombreArchivo = "CargaHistoricoTotal";
                    //Valida si archivo de carga y dia de hoy estan cargados en BASE
                    int existeCarga;
                    sql = "select count(*) from " + Schema + ".CargasIniciales" +
                          " where convert(varchar, fechaCarga,112)= convert(varchar, getdate(), 112)" +
                          " and NombreArchivoCarga = '" + nombreArchivo + "'";
                    existeCarga = connection.Query <int>(sql).FirstOrDefault();


                    if (existeCarga != 0)
                    {
                        estaOcupado = true;
                        //CsvParserOptions csvParserOptions = new CsvParserOptions(true, ';');
                        //CargaInicialMapping csvMapper = new CargaInicialMapping();
                        //CsvParser<CargaInicialIM> csvParser = new CsvParser<CargaInicialIM>(csvParserOptions, csvMapper);

                        //var result = csvParser
                        //    .ReadFromFile(rutaDescargar, Encoding.ASCII)
                        //    .Where(x => x.IsValid)
                        //    .Select(x => x.Result)
                        //    .AsSequential()
                        //    .ToList();
                        //StringBuilder inserts = new StringBuilder();
                        //result.ForEach(x => inserts.AppendLine($"insert into {Schema}.Cargasiniciales values ('{DateTime.Now}','{DateTime.ParseExact(x.FechaCorresponde.ToString(), "ddMMyyyy", CultureInfo.InvariantCulture)}','{x.FolioCredito}','{x.RutAfiliado}','{x.CodigoOficinaIngreso}','{x.CodigoOficinaPago}','{x.LineaCredito}','{x.RutResponsable}','{x.CanalVenta}','{x.Estado}','{x.FechaCorresponde}','{nombreArchivo}');"));
                        //connection.Execute(inserts.ToString(), null, null, 240);


                        //----------- Fin carga de Registros en Cargas Iniciales


                        //---------- SE cuenta Cantidad de Registros cargados en Cargas Iniciales

                        var cargaInicials = new List <CargaInicial>();
                        sql = "select  * from " + Schema + ".CargasIniciales" +
                              " where convert(varchar, fechaCarga,112)= convert(varchar, getdate(), 112)" +
                              " and NombreArchivoCarga = '" + nombreArchivo + "'";

                        cargaInicials = connection.Query <CargaInicial>(sql).AsList();
                        //-------------Se genera Registro de Carga
                        //StringBuilder mailTemplate = new StringBuilder();
                        mailTemplate.AppendLine("<p>Los créditos han sido cargados exitosamente</p>");
                        mailTemplate.AppendLine("<p>REPORTE DE CARGA DIARIA GALVARINO</p> ");
                        mailTemplate.AppendLine("<p>---------------------------------</p>");
                        mailTemplate.AppendLine("<p>Fecha de Carga: " + DateTime.Now + "</p>");
                        mailTemplate.AppendLine("<p> \n</p>");
                        mailTemplate.AppendLine("<p> \n</p>");
                        mailTemplate.AppendLine("<p> \n</p>");
                        mailTemplate.AppendLine("<p>* Nombre Archivo : " + nombreArchivo + ".txt</p>");
                        //mailTemplate.AppendLine("<p>* Archivo Base Carga " + result.Count + " Registro(s)</p>");
                        mailTemplate.AppendLine("<p> \n</p>");
                        mailTemplate.AppendLine("<p>* Carga en Tabla CargasInicales " + cargaInicials.Count + " Registro(s)</p>");


                        int i = 1;

                        foreach (var ci in cargaInicials)
                        {
                            ////Se valida si credito ya esta cargado en BD
                            sql = "select count(*)" +
                                  " from " + Schema + ".creditos" +
                                  " where FolioCredito='" + ci.FolioCredito + "'";
                            int existe = connection.Query <int>(sql).FirstOrDefault();


                            //Valida que No está cargado anteriormente el folio
                            if (existe == 0)
                            {
                                //-----------SE inicia creacion de objeto para cargas en Tablas creditos.

                                var    oficinaProceso = _context.Oficinas.Include(x => x.OficinaProceso).FirstOrDefault(x => x.Codificacion == ci.CodigoOficinaPago);
                                string esRM           = oficinaProceso.EsRM ? $"1" : $"0";

                                /*  TODO: Caso de La Unión ver con Jenny Bernales  */
                                Dictionary <string, string> _setVariables = new Dictionary <string, string>();
                                _setVariables.Add("OFICINA_PAGO", ci.CodigoOficinaPago);
                                _setVariables.Add("OFICINA_INGRESO", ci.CodigoOficinaIngreso);
                                _setVariables.Add("FOLIO_CREDITO", ci.FolioCredito);
                                _setVariables.Add("RUT_AFILIADO", ci.RutAfiliado);
                                _setVariables.Add("FECHA_VENTA", ci.FechaCorresponde.ToString());
                                _setVariables.Add("ES_RM", esRM);
                                _setVariables.Add("DOCUMENTO_LEGALIZADO", $"0");
                                _setVariables.Add("OFICINA_PROCESA_NOTARIA", oficinaProceso.OficinaProceso.Codificacion);

                                //---------Se Genera Registo en Tareas y Solicitudes
                                _wfservice = new WorkflowService(new DefaultWorkflowKernel(_context, _configuration));
                                var wf = _wfservice.InstanciarHistorico(ProcesoDocumentos.NOMBRE_PROCESO, "wfboot", "Ingreso Automatico de Creditos Vendidos", _setVariables);


                                Credito cred = new Credito
                                {
                                    FechaDesembolso = ci.FechaCorresponde,
                                    FechaFormaliza  = DateTime.Now.AddDays(-1),
                                    FolioCredito    = ci.FolioCredito,
                                    MontoCredito    = 0,
                                    RutCliente      = ci.RutAfiliado,
                                    NumeroTicket    = wf.NumeroTicket
                                };

                                if (ci.LineaCredito.ToLower().Contains("credito normal") && ci.Estado.Contains("Reprogramado"))
                                {
                                    cred.TipoCredito = TipoCredito.Reprogramacion;
                                }
                                else if (ci.LineaCredito.ToLower().Contains("credito normal") || ci.LineaCredito.ToLower().Contains("compra cartera") || ci.LineaCredito.ToLower().Contains("credito paralelo"))
                                {
                                    cred.TipoCredito = TipoCredito.Normal;
                                }
                                else if (ci.LineaCredito.ToLower().Contains("reprogr"))
                                {
                                    cred.TipoCredito = TipoCredito.Reprogramacion;
                                }
                                else if (ci.LineaCredito.ToLower().Contains("acuerdo de creditos castigados"))
                                {
                                    cred.TipoCredito = TipoCredito.AcuerdoPago;
                                }

                                IEnumerable <ConfiguracionDocumento> configs = _context.ConfiguracionDocumentos.Where(x => x.TipoCredito == cred.TipoCredito && x.TipoExpediente == TipoExpediente.Legal).ToList();


                                ExpedienteCredito expcred = new ExpedienteCredito
                                {
                                    Credito        = cred,
                                    FechaCreacion  = DateTime.Now,
                                    TipoExpediente = TipoExpediente.Legal,
                                };

                                int incrementor = 1;
                                foreach (var confItem in configs)
                                {
                                    Documento docmnt = new Documento
                                    {
                                        TipoDocumento = confItem.TipoDocumento,
                                        Codificacion  = confItem.Codificacion,
                                        Resumen       = confItem.TipoDocumento.ToString("D")
                                    };
                                    expcred.Documentos.Add(docmnt);
                                    incrementor++;
                                }
                                _context.ExpedientesCreditos.Add(expcred);
                            }
                            //else
                            //{
                            //    // se elimina registro de tabla carga inicial para no se incluida en cargas de Workflow

                            //    sql = "delete   CargasIniciales" +
                            //  " where FolioCredito = '" + ci.FolioCredito + "'" +
                            //  " and CONVERT(VARCHAR, fechaCarga, 112) = CONVERT(VARCHAR, GETDATE(), 112)" +
                            //  " and NombreArchivoCarga = '" + nombreArchivo + "'";

                            //    connection.Execute(sql);

                            //    foliosRepetidos.AppendLine("<p>Folio Repetido: " + ci.FolioCredito + "</p>");

                            //}
                            i++;
                        }
                        _context.SaveChangesAsync();


                        //--------- Cuenta Cantidad de Registros Cargados en Solicitudes
                        sql = "select count(*) from " + Schema + ".Solicitudes" +
                              " where NumeroTicket in" +
                              " (select NumeroTicket from " + Schema + ".Creditos" +
                              " where FolioCredito in(select FolioCredito from " + Schema + ".CargasIniciales" +
                              " where convert(varchar, fechaCarga,112)= convert(varchar, getdate(), 112)" +
                              " and NombreArchivoCarga = '" + nombreArchivo + "'" +
                              " ))";

                        registrosCargados = connection.Query <int>(sql).FirstOrDefault();

                        mailTemplate.AppendLine("<p> \n</p>");
                        mailTemplate.AppendLine("<p>* Carga en Tabla Solicitudes " + registrosCargados.ToString() + " Registro(s)</p>");



                        //----------Cuenta Cantidad de Registros en Tablas Creditos
                        sql = "select count(*) from " + Schema + ".Creditos" +
                              " where FolioCredito in (" +
                              " select FolioCredito" +
                              " from " + Schema + ".CargasIniciales" +
                              " where convert(varchar, fechaCarga, 112) = convert(varchar, getdate(), 112)" +
                              " and NombreArchivoCarga = '" + nombreArchivo + "'" +
                              " )";

                        registrosCargados = connection.Query <int>(sql).FirstOrDefault();

                        mailTemplate.AppendLine("<p> \n</p>");
                        mailTemplate.AppendLine("<p>* Carga en Tabla Creditos " + registrosCargados.ToString() + " Registro(s)</p>");

                        //----------Cuenta Cantidad de Registros en Tablas expediented creditos

                        sql = " select count(*) from " + Schema + ".ExpedientesCreditos" +
                              " where CreditoId in (" +
                              " select id from " + Schema + ".Creditos" +
                              " where FolioCredito in (" +
                              " select FolioCredito" +
                              " from " + Schema + ".CargasIniciales" +
                              " where convert(varchar, fechaCarga, 112) = convert(varchar, getdate(), 112)" +
                              " and NombreArchivoCarga = '" + nombreArchivo + "'" +
                              " ))";
                        registrosCargados = connection.Query <int>(sql).FirstOrDefault();

                        mailTemplate.AppendLine("<p> \n</p>");
                        mailTemplate.AppendLine("<p>* Carga en Tabla ExpedientesCreditos " + registrosCargados.ToString() + " Registro(s)</p>");
                        estaOcupado = false;
                        var destinatarios = _configuration.GetSection("CoordinacionWorkers:CargaInicialCreditosWorker:DestinatariosNotificaciones").Get <string[]>();


                        mailTemplate.AppendLine("<p>" + foliosRepetidos + "</p>");
                        mailTemplate.AppendLine("<p><small>Correo enviado automaticamente por Galvarino favor no contestar!!!!.</small></p>");
                        _mailService.SendEmail(destinatarios, "Carga de Créditos", mailTemplate.ToString());
                    }
                }
            }// fin estado ocupado
        }
        private async void DoWork(object state)
        {
            /*
             *  Generar el Cierre de Cajas
             *  1.- Correr Script de Cierre de Cajas
             *
             *  Generar Archivo para Iron Mountain
             *
             *  1.- detectar todos los documentos que esten en la etapa de despacho a custodia
             *  2.- generar el archivo con los documentos encontrados
             *  3.- subir el archivo a ftp
             *  4.- mover los documentos en el workflow
             *
             */

            /* Antes que todo se debe revisar
             *  1.- Que la hora actual esta entre las 23:10 y 23:59
             *  2.- Que el servicio no este ocupado haciendo un trabajo
             *  3.- manejar la ejecucion diaria y que no se vuelva a repetir la tarea un dia (podria sobreescribir datos y nos deja la FOX papá)
             */

            var cantidadTablaControl = 0;

            using (var connection = new SqlConnection(_configuration.GetConnectionString("DocumentManagementConnection")))
            {
                var sqlControlArchivo = @"
                        SELECT count(*) Total
                        FROM Tareas b
                        INNER JOIN Solicitudes c on b.SolicitudId = c.Id
                        INNER JOIN Creditos d on c.NumeroTicket = d.NumeroTicket
                        INNER JOIN ExpedientesCreditos e on d.Id = e.CreditoId
                        INNER JOIN Etapas f on b.EtapaId = f.Id
                        INNER JOIN (
                            select distinct cv.CodigoSeguimiento, pvv.FolioCredito, cv.Usuario
                            from CajasValoradas cv
                            inner join PasosValijasValoradas pvv on cv.CodigoSeguimiento  = pvv.CodigoCajaValorada
                            where cv.MarcaAvance in ('READYTOPROCESS-', 'READYTOPROCESS')
                        ) caja on d.FolioCredito = caja.FolioCredito

                        where b.Estado = 'Activada'
                        and b.EtapaId = 16
                ";
                cantidadTablaControl = connection.Query <int>(sqlControlArchivo).FirstOrDefault();
            }

            var horaActual = DateTime.Now.TimeOfDay;

            if (horaActual >= horaInicial && horaActual <= horaFinal && !estaOcupado && cantidadTablaControl > 0)
            {
                /*Ponemos al servicio en modo ocupado */
                estaOcupado = true;

                /* Comenzamos con el cierre de cajas */
                _logger.LogInformation("Iniciando el proceso de Cierre de cajas.");

                using (var connection = new SqlConnection(_configuration.GetConnectionString("DocumentManagementConnection")))
                {
                    var sqlCierreCajas = @"             
                        truncate table TareasFinalizarCustodia
                        insert into TareasFinalizarCustodia
                        SELECT b.Id TareaId,  b.SolicitudId, caja.Usuario, caja.FolioCredito, caja.CodigoSeguimiento, c.NumeroTicket
                        FROM Tareas b
                        INNER JOIN Solicitudes c on b.SolicitudId = c.Id
                        INNER JOIN Creditos d on c.NumeroTicket = d.NumeroTicket
                        INNER JOIN ExpedientesCreditos e on d.Id = e.CreditoId
                        INNER JOIN Etapas f on b.EtapaId = f.Id
                        INNER JOIN (
                            select distinct cv.CodigoSeguimiento, pvv.FolioCredito, cv.Usuario
                            from CajasValoradas cv
                            inner join PasosValijasValoradas pvv on cv.CodigoSeguimiento  = pvv.CodigoCajaValorada
                            where cv.MarcaAvance in ('READYTOPROCESS-', 'READYTOPROCESS')
                        ) caja on d.FolioCredito = caja.FolioCredito

                        where b.Estado = 'Activada'
                        and b.EtapaId = 16

                        update a 
                        set a.EjecutadoPor = b.Usuario, a.Estado = 'Finalizada', a.FechaTerminoFinal = GETDATE()
                        from Tareas a
                        inner join TareasFinalizarCustodia b on a.Id = b.TareaId

                        insert into Tareas(SolicitudId, EtapaId, AsignadoA, ReasignadoA, EjecutadoPor, Estado, FechaInicio, FechaTerminoEstimada, FechaTerminoFinal, UnidadNegocioAsignada)
                        select SolicitudId, 17 EtapaId, 'Custodia' AsignadoA, null rEA, null Ejec, 'Activada' estado, GETDATE() fechaini, null fecterestimada, null fectermfinal, null una 
                        from TareasFinalizarCustodia

                        update a
                        set a.CajaValoradaId = d.Id
                        from ExpedientesCreditos a
                        inner join Creditos b on a.CreditoId = b.Id
                        inner join TareasFinalizarCustodia c on b.FolioCredito = c.FolioCredito
                        inner join CajasValoradas d on c.CodigoSeguimiento = d.CodigoSeguimiento

                        delete from PasosValijasValoradas
                        where CodigoCajaValorada in (
                            select distinct cv.CodigoSeguimiento
                            from CajasValoradas cv
                            inner join PasosValijasValoradas pvv on cv.CodigoSeguimiento  = pvv.CodigoCajaValorada
                            where cv.MarcaAvance in ('READYTOPROCESS-', 'READYTOPROCESS')
                        )

                        update CajasValoradas  set MarcaAvance = 'DESPACUST'
                        where MarcaAvance in ('READYTOPROCESS-', 'READYTOPROCESS')
                    ";

                    var registrosCierreCajas = connection.Execute(sqlCierreCajas, null, commandType: CommandType.Text);

                    var sqlArchivo = @"
                    select a.FolioCredito + ';' + a.RutCliente + ';' +  case when a.TipoCredito = 0 then 'Nuevo' when a.TipoCredito = 1 then 'Reprogramacion' when a.TipoCredito = 2 then 'AcuerdoPago' end Data
                    from Creditos a
                    inner join TareasFinalizarCustodia b on a.FolioCredito = b.FolioCredito";

                    registrosArchivoIM = connection.Query <string>(sqlArchivo).ToList();
                }

                StringBuilder sb = new StringBuilder();
                sb.AppendLine("FolioCredito;RutCliente;TipoCredito");
                foreach (var registro in registrosArchivoIM)
                {
                    sb.AppendLine(registro);
                }

                string       nombreArchivo   = "galvarino" + DateTime.Now.ToString("ddMMyyyy", CultureInfo.InvariantCulture) + ".txt";
                string       archivoSalida   = @"C:\galvarino\envios_ftp\" + nombreArchivo;
                StreamWriter escritorArchivo = new StreamWriter(archivoSalida);
                escritorArchivo.Write(sb.ToString());
                escritorArchivo.Close();
                string host           = "www.imrmconnect.cl";
                string username       = "******";
                string password       = "******";
                var    connectionInfo = new ConnectionInfo(host, "sftp", new PasswordAuthenticationMethod(username, password));
                using (var sftp = new SftpClient(connectionInfo))
                {
                    sftp.Connect();
                    //sftp.ChangeDirectory("/MyFolder");
                    using (var uplfileStream = File.OpenRead(archivoSalida))
                    {
                        sftp.UploadFile(uplfileStream, nombreArchivo, true);
                    }
                    sftp.Disconnect();
                }
                var           destinatarios = _configuration.GetSection("CoordinacionWorkers:PublicacionPagaresHaciaIronMountainWorker:DestinatariosNotificaciones").Get <string[]>();
                var           attach        = new string[] { archivoSalida };
                StringBuilder mailTemplate  = new StringBuilder();
                mailTemplate.AppendLine("<p>En el adjunto podras encontrar los folios cargados</p>");
                mailTemplate.AppendLine("<small>Correo enviado automaticamente por Galvarino favor no contestar.</small>");
                await _mailService.SendEmail(destinatarios, "Carga de Archivo Iron Mountain => " + nombreArchivo, mailTemplate.ToString(), attach);
            }
            else
            {
                _logger.LogInformation("No estamos dentro del rango de horas, el servicio eta ocupado o ya corrio para el dia de hoy.");
            }
        }
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            _logger.LogDebug($"tarea en segundo plano esta iniciando");
            stoppingToken.Register(() => _logger.LogDebug("Deteniendo la tarea en segundo plano"));
            var _context = _scope.ServiceProvider.GetRequiredService <ApplicationDbContext>();

            while (!stoppingToken.IsCancellationRequested)
            {
                _logger.LogDebug("Ejecutando tarea en segundo plano");
                string ruta          = "";
                string nombreArchivo = "";
                /*Todo:  Revisar Findesemanas*/
                //if(DateTime.Now.DayOfWeek == DayOfWeek.Monday)
                //{
                //    nombreArchivo = "Carga" + DateTime.Now.AddDays(-3).ToString("ddMMyyyy");
                //    ruta = _configuration["RutaCargaCredito"] + nombreArchivo + ".txt";
                //}
                //else if(
                //    DateTime.Now.DayOfWeek == DayOfWeek.Thursday ||
                //    DateTime.Now.DayOfWeek == DayOfWeek.Wednesday ||
                //    DateTime.Now.DayOfWeek == DayOfWeek.Tuesday ||
                //    DateTime.Now.DayOfWeek == DayOfWeek.Friday
                //)
                //{
                //    nombreArchivo = "Carga" + DateTime.Now.AddDays(-1).ToString("ddMMyyyy");
                //    ruta = _configuration["RutaCargaCredito"] + nombreArchivo + ".txt";
                //}
                //else {
                //    break;
                //}

                nombreArchivo = "Carga17092019";
                ruta          = _configuration["RutaCargaCredito"] + nombreArchivo + ".txt";
                _logger.LogDebug(ruta);

                var existencia = _context.CargasIniciales.Where(x => x.NombreArchivoCarga == nombreArchivo).ToList();
                if ((File.Exists(ruta) && existencia.Count == 0) || (File.Exists(ruta) && File.ReadLines(ruta).Count() - 1 > existencia.Count))
                {
                    _logger.LogDebug("Cargando Archivo a la BD (Carga Inicial diaria)......");

                    int lap             = 0;
                    int emperzardenuevo = File.ReadLines(ruta).Count() - 1 > existencia.Count ? existencia.Count + 1 : 1;
                    foreach (var linea in File.ReadLines(ruta))
                    {
                        if (lap > 0 && emperzardenuevo == lap)
                        {
                            emperzardenuevo++;
                            string[] campos            = linea.Split(new char[] { ';' });
                            var      existenciaCredito = _context.CargasIniciales.FirstOrDefault(ci => ci.FolioCredito == campos[1] && ci.RutAfiliado == campos[0]);

                            if (existenciaCredito == null)
                            {
                                DateTime     ferchaCorresponde = DateTime.ParseExact(campos[10], "ddMMyyyy", CultureInfo.InvariantCulture);
                                CargaInicial ci = new CargaInicial
                                {
                                    RutAfiliado          = campos[0],
                                    FolioCredito         = campos[1],
                                    CodigoOficinaIngreso = campos[2],
                                    CodigoOficinaPago    = campos[4],
                                    Estado             = campos[6],
                                    LineaCredito       = campos[7],
                                    RutResponsable     = campos[8],
                                    CanalVenta         = campos[9],
                                    FechaVigencia      = campos[10],
                                    FechaCarga         = DateTime.Now,
                                    FechaCorresponde   = ferchaCorresponde,
                                    NombreArchivoCarga = nombreArchivo
                                };
                                _context.CargasIniciales.Add(ci);


                                var    oficinaProceso = _context.Oficinas.Include(x => x.OficinaProceso).FirstOrDefault(x => x.Codificacion == ci.CodigoOficinaPago);
                                string esRM           = oficinaProceso.EsRM  ? $"1" : $"0";

                                /*  TODO: Caso de La Unión ver con Jenny Bernales  */
                                Dictionary <string, string> _setVariables = new Dictionary <string, string>();
                                _setVariables.Add("OFICINA_PAGO", campos[4]);
                                _setVariables.Add("OFICINA_INGRESO", campos[2]);
                                _setVariables.Add("FOLIO_CREDITO", campos[1]);
                                _setVariables.Add("RUT_AFILIADO", campos[0]);
                                _setVariables.Add("FECHA_VENTA", campos[10]);
                                _setVariables.Add("ES_RM", esRM);
                                _setVariables.Add("DOCUMENTO_LEGALIZADO", $"0");
                                _setVariables.Add("OFICINA_PROCESA_NOTARIA", oficinaProceso.OficinaProceso.Codificacion);



                                _wfservice = new WorkflowService(new DefaultWorkflowKernel(_context, _configuration));
                                var wf = _wfservice.Instanciar(ProcesoDocumentos.NOMBRE_PROCESO, "wfboot", "Ingreso Automatico de Creditos Vendidos", _setVariables);

                                Credito cred = new Credito
                                {
                                    FechaDesembolso = ferchaCorresponde,
                                    FechaFormaliza  = DateTime.Now.AddDays(-1),
                                    FolioCredito    = ci.FolioCredito,
                                    MontoCredito    = 0,
                                    RutCliente      = ci.RutAfiliado,
                                    NumeroTicket    = wf.NumeroTicket
                                };

                                if (ci.LineaCredito.ToLower().Contains("credito normal") && ci.Estado.Contains("Reprogramado"))
                                {
                                    cred.TipoCredito = TipoCredito.Reprogramacion;
                                }
                                else if (ci.LineaCredito.ToLower().Contains("credito normal") || ci.LineaCredito.ToLower().Contains("compra cartera") || ci.LineaCredito.ToLower().Contains("credito paralelo"))
                                {
                                    cred.TipoCredito = TipoCredito.Normal;
                                }
                                else if (ci.LineaCredito.ToLower().Contains("reprogr"))
                                {
                                    cred.TipoCredito = TipoCredito.Reprogramacion;
                                }
                                else if (ci.LineaCredito.ToLower().Contains("acuerdo de creditos castigados"))
                                {
                                    cred.TipoCredito = TipoCredito.AcuerdoPago;
                                }



                                IEnumerable <ConfiguracionDocumento> configs = _context.ConfiguracionDocumentos.Where(x => x.TipoCredito == cred.TipoCredito && x.TipoExpediente == TipoExpediente.Legal).ToList();


                                ExpedienteCredito expcred = new ExpedienteCredito
                                {
                                    Credito        = cred,
                                    FechaCreacion  = DateTime.Now,
                                    TipoExpediente = TipoExpediente.Legal,
                                };

                                int incrementor = 1;
                                foreach (var confItem in configs)
                                {
                                    Documento docmnt = new Documento {
                                        TipoDocumento = confItem.TipoDocumento,
                                        Codificacion  = confItem.Codificacion,
                                        Resumen       = confItem.TipoDocumento.ToString("D")
                                    };
                                    expcred.Documentos.Add(docmnt);
                                    incrementor++;
                                }
                                _context.ExpedientesCreditos.Add(expcred);
                                await _context.SaveChangesAsync();
                            }
                        }
                        lap++;
                    }
                    _logger.LogDebug("Carga terminada");
                    var           destinatarios = _configuration.GetSection("CoordinacionWorkers:CargaInicialCreditosWorker:DestinatariosNotificaciones").Get <string[]>();
                    StringBuilder mailTemplate  = new StringBuilder();
                    mailTemplate.AppendLine("<p>La carga Inicial ha Terminado con éxito.</p>");
                    mailTemplate.AppendLine("<small>Correo enviado automaticamente por Galvarino favor no contestar.</small>");
                    await _mailService.SendEmail(destinatarios, $"Carga Inicial {nombreArchivo}", mailTemplate.ToString());
                }
                else
                {
                    _logger.LogDebug("Nada que cargar");
                }

                _logger.LogDebug("Esperando!!!!");
                await Task.Delay(60000, stoppingToken);
            }
        }