static void ExecuteExcel(string filename, string rutasubwork, string rutaoutput, string conexion, LogWriter logWriter)
 {
     try
     {
         OracleFunctions oracleFunctions = new OracleFunctions(conexion, logWriter);
         string          varchivovalido  = oracleFunctions.SelectFromWhere("SELECT SUBSTR(nombrearchivocarga, 1, INSTR(nombrearchivocarga, '.', 1, 1) - 1) " +
                                                                           "FROM concargarchivos " +
                                                                           "WHERE SUBSTR(nombrearchivocarga, 1, INSTR(nombrearchivocarga, '.', 1, 1) - 1) IS NOT NULL " +
                                                                           "AND UPPER('" + filename + "') " +
                                                                           "LIKE '%'||SUBSTR(nombrearchivocarga, 1, INSTR(nombrearchivocarga, '.', 1, 1) - 1)||'%' " +
                                                                           "GROUP BY nombrearchivocarga " +
                                                                           "ORDER BY nombrearchivocarga", true);
         if (!(String.IsNullOrEmpty(varchivovalido)))
         {
             logWriter.addLog("Procesando " + filename, false);
             //logWriter.LogWrite();
             Read_file(Path.Combine(rutasubwork, filename), varchivovalido, conexion, logWriter);
             Readed_file(Path.Combine(rutasubwork, filename), rutaoutput, conexion, logWriter);
         }
         else
         {
             Console.WriteLine(" >>> Rechazado: Nombre Archivo no se encuentra parametrizado en la tabla CONCARGARCHIVOS");
             logWriter.addLog("Nombre Archivo no se encuentra parametrizado en la tabla CONCARGARCHIVOS", true);
         }
     }
     catch (Exception ex)
     {
         Console.WriteLine(ex.Message);
         logWriter.addLog(ex.Message, true);
         logWriter.LogWrite();
     }
 }
        public static void Readed_file(string xlsFilePath, string rutaoutput, string conexion, LogWriter logWriter)
        {
            int vId_Archivo = 0;

            try
            {
                Process currentProcess = Process.GetCurrentProcess();
                vId_Archivo = currentProcess.Id;

                string queryString = "SELECT DISTINCT acbtmp.ID_ARCHIVO, " +
                                     "(CASE MOD(acbtmp.ESTADO, 2) WHEN 1 THEN 'APROBADO' ELSE 'RECHAZADO' END) APROBADO, " +
                                     "(CASE WHEN LENGTH(pkg_syst900.F_OBT_TBLDESCRI(39, acbtmp.codigobanco)) > 0 THEN pkg_syst900.F_OBT_TBLDESCRI(39, acbtmp.codigobanco) WHEN LENGTH(pkg_syst900.F_OBT_TBLDESCRI(39, acbtmp.codigobanco)) = 0 THEN '' END) BANCO, " +
                                     "(CASE WHEN LENGTH(pkg_syst900.F_OBT_TBLDESCRI(22, acbtmp.moneda)) > 0 THEN pkg_syst900.F_OBT_TBLDESCRI(22, acbtmp.moneda) WHEN LENGTH(pkg_syst900.F_OBT_TBLDESCRI(22, acbtmp.moneda)) = 0 THEN '' END) MONEDA, " +
                                     "(CASE WHEN LENGTH(acbtmp.numerocuenta) > 0 THEN acbtmp.numerocuenta WHEN LENGTH(acbtmp.numerocuenta) = 0 THEN '' END) CUENTA, " +
                                     "(CASE WHEN acbtmp.ESTADO = 1 OR acbtmp.ESTADO = 2 THEN 'BANCO-MONEDA-CUENTA' WHEN acbtmp.ESTADO = 3 OR acbtmp.ESTADO = 4 THEN 'TIPO-CARGA' WHEN acbtmp.ESTADO = 5 OR acbtmp.ESTADO = 6 THEN 'PARAMETROS' WHEN acbtmp.ESTADO = 7 THEN 'PROCESADO' ELSE 'SIN_INFORMACION' END) ESTADO, " +
                                     "CASE WHEN LENGTH((Select Distinct Max(ct.secuencarga) From concargaprimeratmp ct Where ct.fechacarga = trunc(acbtmp.fechacarga) And ct.codigobanco = acbtmp.codigobanco)) > 0 THEN (Select Distinct Decode(Max(ct.secuencarga), Null, 0, Max(ct.secuencarga)) From concargaprimeratmp ct Where ct.fechacarga = trunc(acbtmp.fechacarga) And ct.codigobanco = acbtmp.codigobanco) ELSE (CASE MOD(acbtmp.ESTADO, 2) WHEN 1 THEN 0 ELSE NULL END) END MAXIDBANCO, " +
                                     "TO_CHAR(SYSDATE, 'dd-mm-YYYY_HH24MISS') FECHA, " +
                                     "SUBSTR(acbtmp.NOMBREARCHIVO, (INSTR(acbtmp.NOMBREARCHIVO, '.', -1, 1) + 1), length(acbtmp.NOMBREARCHIVO)) EXTENSION " +
                                     "FROM archivosconcibancatmp acbtmp " +
                                     "WHERE ID_ARCHIVO = " + vId_Archivo;
                string vfileoutput;

                using (OracleConnection connection =
                           new OracleConnection(conexion))
                {
                    OracleCommand command = connection.CreateCommand();
                    command.CommandText = queryString;
                    string subPath = DateTime.Now.ToString("dd-MM-yyyy");

                    if (!Directory.Exists(rutaoutput + subPath))
                    {
                        Directory.CreateDirectory(rutaoutput + subPath);
                    }

                    connection.Open();
                    OracleDataReader reader = command.ExecuteReader();
                    while (reader.Read())
                    {
                        vfileoutput  = rutaoutput + subPath + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(xlsFilePath); //Path.GetFileName
                        vfileoutput += "_" + reader["APROBADO"].ToString();
                        vfileoutput += "_" + reader["BANCO"].ToString().Replace(" ", "_");
                        vfileoutput += "_" + reader["MONEDA"].ToString();
                        vfileoutput += "_" + reader["CUENTA"].ToString();
                        vfileoutput += "_" + reader["ESTADO"].ToString();
                        vfileoutput += "_" + reader["MAXIDBANCO"].ToString();
                        vfileoutput += "_" + reader["FECHA"].ToString();
                        vfileoutput += "." + reader["EXTENSION"].ToString();
                        if (File.Exists(xlsFilePath))
                        {
                            File.Move(xlsFilePath, vfileoutput);
                            Console.WriteLine("   > " + vfileoutput);
                        }
                        OracleFunctions oracleFunctions = new OracleFunctions(conexion, logWriter);
                        oracleFunctions.InsUpdDel_Oracle("DELETE FROM ARCHIVOSCONCIBANCATMP WHERE ID_ARCHIVO = " + vId_Archivo);
                    }
                    reader.Close();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                logWriter.addLog(ex.Message, true);
                logWriter.LogWrite();
                try
                {
                    OracleFunctions oracleFunctions = new OracleFunctions(conexion, logWriter);
                    oracleFunctions.InsUpdDel_Oracle("DELETE FROM ARCHIVOSCONCIBANCATMP WHERE ID_ARCHIVO = " + vId_Archivo);
                }
                catch (Exception ex2)
                {
                    Console.WriteLine(ex2.Message);
                    logWriter.addLog(ex2.Message, true);
                    logWriter.LogWrite();
                }
            }
        }
        public static void Read_file(string xlsFilePath, string ArchivoValido, string conexion, LogWriter logWriter)
        {
            try
            {
                int limitereintento = 5;

                if (!File.Exists(xlsFilePath))
                {
                    return;
                }

                Console.WriteLine("                  >>> " + DateTime.Now.ToString("HH:mm:ss") + ": Lectura y Escritura del excel... ");
                logWriter.addLog("Lectura y Escritura del excel", false);
                logWriter.LogWrite();
                FileInfo fi       = new FileInfo(xlsFilePath);
                long     filesize = fi.Length;

                Application xlApp;
                Workbook    xlWorkBook;
                Worksheet   xlWorkSheet;
                Range       range;
                var         misValue = Type.Missing;

                // abrir el documento
                xlApp      = new Application();
                xlWorkBook = xlApp.Workbooks.Open(xlsFilePath, misValue, misValue,
                                                  misValue, misValue, misValue, misValue, misValue, misValue,
                                                  misValue, misValue, misValue, misValue, misValue, misValue);

                // seleccion de la hoja de calculo
                // get_item() devuelve object y numera las hojas a partir de 1
                xlWorkSheet = (Worksheet)xlWorkBook.Worksheets.get_Item(1);

                // seleccion rango activo
                range = xlWorkSheet.UsedRange;
                range.Columns.AutoFit();

                // Variables de Campos
                string vCampo_A, vCampo_B, vCampo_C, vCampo_D, vCampo_E, vCampo_F, vCampo_G, vCampo_H, vCampo_I, vCampo_J, vCampo_K, vCampo_L, vCampo_M, vCampo_N, vCampo_O, vCampo_P, vCampo_Q, vCampo_R, vCampo_S, vCampo_T;
                string queryinsert, queryvalues;

                // leer las celdas
                int nFilaNada = 0, nFilaAlgo = 0;
                int rows = range.Rows.Count;
                int cols = range.Columns.Count;

                if (cols > 20)
                {
                    cols = 20;
                }

                Process currentProcess = Process.GetCurrentProcess();
                int     vId_Archivo    = Convert.ToInt32(currentProcess.Id);

                DateTime hoy = DateTime.Now;

                OracleFunctions oracleFunctions = new OracleFunctions(conexion, logWriter);
                oracleFunctions.InsUpdDel_Oracle("DELETE FROM ARCHIVOSCONCIBANCATMP WHERE ID_ARCHIVO = " + vId_Archivo);

                for (int row = 1; row <= rows; row++)
                {
                    vCampo_A = ""; vCampo_B = ""; vCampo_C = ""; vCampo_D = "";
                    vCampo_E = ""; vCampo_F = ""; vCampo_G = ""; vCampo_H = "";
                    vCampo_I = ""; vCampo_J = ""; vCampo_K = ""; vCampo_L = "";
                    vCampo_M = ""; vCampo_N = ""; vCampo_O = ""; vCampo_P = "";
                    vCampo_Q = ""; vCampo_R = ""; vCampo_S = ""; vCampo_T = "";

                    for (int col = 1; col <= cols; col++)
                    {
                        // lectura como cadena
                        var cellText = xlWorkSheet.Cells[row, col].Text;
                        cellText = Convert.ToString(cellText);
                        cellText = cellText.Replace("'", ""); // Comillas simples no pueden pasar en el Texto

                        switch (col)
                        {
                        case 1: vCampo_A = cellText; break;

                        case 2: vCampo_B = cellText; break;

                        case 3: vCampo_C = cellText; break;

                        case 4: vCampo_D = cellText; break;

                        case 5: vCampo_E = cellText; break;

                        case 6: vCampo_F = cellText; break;

                        case 7: vCampo_G = cellText; break;

                        case 8: vCampo_H = cellText; break;

                        case 9: vCampo_I = cellText; break;

                        case 10: vCampo_J = cellText; break;

                        case 11: vCampo_K = cellText; break;

                        case 12: vCampo_L = cellText; break;

                        case 13: vCampo_M = cellText; break;

                        case 14: vCampo_N = cellText; break;

                        case 15: vCampo_O = cellText; break;

                        case 16: vCampo_P = cellText; break;

                        case 17: vCampo_Q = cellText; break;

                        case 18: vCampo_R = cellText; break;

                        case 19: vCampo_S = cellText; break;

                        case 20: vCampo_T = cellText; break;
                        }
                    }

                    if (String.IsNullOrEmpty(vCampo_A.Trim()) && String.IsNullOrEmpty(vCampo_B.Trim()) && String.IsNullOrEmpty(vCampo_C.Trim()) && String.IsNullOrEmpty(vCampo_D.Trim()) && String.IsNullOrEmpty(vCampo_E.Trim()) && String.IsNullOrEmpty(vCampo_F.Trim()) && String.IsNullOrEmpty(vCampo_G.Trim()) && String.IsNullOrEmpty(vCampo_H.Trim()) && String.IsNullOrEmpty(vCampo_I.Trim()) && String.IsNullOrEmpty(vCampo_J.Trim()) && String.IsNullOrEmpty(vCampo_K.Trim()) && String.IsNullOrEmpty(vCampo_L.Trim()) && String.IsNullOrEmpty(vCampo_M.Trim()) && String.IsNullOrEmpty(vCampo_N.Trim()) && String.IsNullOrEmpty(vCampo_O.Trim()) && String.IsNullOrEmpty(vCampo_P.Trim()) && String.IsNullOrEmpty(vCampo_Q.Trim()) && String.IsNullOrEmpty(vCampo_R.Trim()) && String.IsNullOrEmpty(vCampo_S.Trim()) && String.IsNullOrEmpty(vCampo_T.Trim()))
                    {
                        nFilaNada++;
                    }
                    else
                    {
                        nFilaAlgo = row;
                        nFilaNada = 0;
                    }

                    if (nFilaNada > 10)
                    {
                        rows = row++;
                    }

                    //Caracter  indica Ultima Fila Santander
                    if (vCampo_A != "")
                    {
                        queryinsert = "INSERT INTO ARCHIVOSCONCIBANCATMP (CAMPO_A, CAMPO_B, CAMPO_C, CAMPO_D, CAMPO_E, CAMPO_F, CAMPO_G, CAMPO_H, CAMPO_I, CAMPO_J, CAMPO_K, CAMPO_L, CAMPO_M, CAMPO_N, CAMPO_O, CAMPO_P, CAMPO_Q, CAMPO_R, CAMPO_S, CAMPO_T, ID_ARCHIVO, NOMBREARCHIVO, TAMANOARCHIVO, ID_FILAS, ESTADO, ARCHIVOVALIDO) ";
                        queryvalues = "VALUES ('" + vCampo_A + "', '" + vCampo_B + "', '" + vCampo_C + "', '" + vCampo_D + "', '" + vCampo_E + "', '" + vCampo_F + "', '" + vCampo_G + "', '" + vCampo_H + "', '" + vCampo_I + "', '" + vCampo_J + "', '" + vCampo_K + "', '" + vCampo_L + "', '" + vCampo_M + "', '" + vCampo_N + "', '" + vCampo_O + "', '" + vCampo_P + "', '" + vCampo_Q + "', '" + vCampo_R + "', '" + vCampo_S + "', '" + vCampo_T + "', " + vId_Archivo + ", '" + xlsFilePath + "', " + filesize + ", " + row + ", " + 0 /* 0 para Estado Carga Inicial */ + ", '" + ArchivoValido + "')";
                        oracleFunctions.InsUpdDel_Oracle(queryinsert + queryvalues);
                    }
                }
                oracleFunctions.InsUpdDel_Oracle("DELETE FROM ARCHIVOSCONCIBANCATMP WHERE ID_ARCHIVO = " + vId_Archivo + " AND ID_FILAS > " + nFilaAlgo);

                // cerrar
                xlWorkBook.Close(false, misValue, misValue);
                xlApp.Quit();

                // liberar
                ReleaseObject(xlWorkSheet, logWriter);
                ReleaseObject(xlWorkBook, logWriter);
                ReleaseObject(xlApp, logWriter);

                Console.WriteLine("                  >>> " + DateTime.Now.ToString("HH:mm:ss") + ": Validando Banco-Moneda-Cuenta... ");
                logWriter.addLog("Validando Banco-Moneda-Cuenta", false);
                logWriter.LogWrite();
                oracleFunctions.Function_Procedure_Oracle(2, "PKG_CARGARARCHIVOSAUTO.P_UPD_BUSCA_BANCOMONEDACUENTA", "PIid_archivo", vId_Archivo, "", -1, "", -1);
                string codigobanco = oracleFunctions.SelectFromWhere("SELECT DISTINCT CODIGOBANCO FROM ARCHIVOSCONCIBANCATMP WHERE ID_ARCHIVO = " + vId_Archivo + " AND ROWNUM = 1", false);

                if (!(String.IsNullOrEmpty(codigobanco)))
                {
                    int vCodigoBanco = Convert.ToInt32(codigobanco);

                    //BBVA
                    //eliminar caracter "Espacio Duro" del numero de movimiento (HTML)
                    if (vCodigoBanco == 6)
                    {
                        Console.WriteLine("                  >>> " + DateTime.Now.ToString("HH:mm:ss") + ": Removiendo Espacio Duro en el campo Num. Mvto (BBVA) ");
                        logWriter.addLog("Removiendo Espacio Duro en el campo Num. Mvto (BBVA)", false);
                        //logWriter.LogWrite();
                        oracleFunctions.InsUpdDel_Oracle("UPDATE ARCHIVOSCONCIBANCATMP SET CAMPO_E = REPLACE(CAMPO_E, ' ', '') WHERE ID_ARCHIVO = " + vId_Archivo);
                    }

                    Console.WriteLine("                  >>> " + DateTime.Now.ToString("HH:mm:ss") + ": Buscando Tipo Carga... ");
                    logWriter.addLog("Buscando Tipo Carga", false);
                    logWriter.LogWrite();
                    int vTipoCarga       = Convert.ToInt32(oracleFunctions.Function_Procedure_Oracle(1, "PKG_CARGARARCHIVOSAUTO.F_OBT_BUSCA_TIPOCARGABANCO", "PIid_archivo", vId_Archivo, "PIcodigobanco", vCodigoBanco, "", -1));
                    int vEstadoTipoCarga = 4;
                    if (vTipoCarga > 0)
                    {
                        vEstadoTipoCarga = 3;
                    }
                    oracleFunctions.InsUpdDel_Oracle("UPDATE ARCHIVOSCONCIBANCATMP SET TIPOCARGA = " + vTipoCarga + ", ESTADO = " + vEstadoTipoCarga + " WHERE ID_ARCHIVO = " + vId_Archivo + " AND CODIGOBANCO = " + vCodigoBanco);

                    Console.WriteLine("                  >>> " + DateTime.Now.ToString("HH:mm:ss") + ": Buscando Parametros... ");
                    logWriter.addLog("Buscando Parametros", false);
                    logWriter.LogWrite();
                    int vParametros       = Convert.ToInt32(oracleFunctions.Function_Procedure_Oracle(1, "PKG_CARGARARCHIVOSAUTO.F_UPD_BUSCA_EXISTEPARAMETRO", "PIid_archivo", vId_Archivo, "PIcodigobanco", vCodigoBanco, "PItipocarga", vTipoCarga));
                    int vEstadoParametros = 6;
                    if (vParametros > 0)
                    {
                        vEstadoParametros = 5;
                    }

                    Console.WriteLine("                  >>> " + DateTime.Now.ToString("HH:mm:ss") + ": Actualizando Temporal... ");
                    logWriter.addLog("Actualizando Temporal", false);
                    logWriter.LogWrite();
                    oracleFunctions.InsUpdDel_Oracle("UPDATE ARCHIVOSCONCIBANCATMP SET ESTADO = " + vEstadoParametros + " WHERE ID_ARCHIVO = " + vId_Archivo + " AND CODIGOBANCO = " + vCodigoBanco + " AND TIPOCARGA = " + vTipoCarga);

                    Console.Write("                  >>> " + DateTime.Now.ToString("HH:mm:ss") + ": Buscando Num. Cta... ");
                    logWriter.addLog("Buscando Num. Cta", false);
                    //logWriter.LogWrite();
                    string vCodigoCuenta = oracleFunctions.SelectFromWhere("SELECT DISTINCT NUMEROCUENTA FROM ARCHIVOSCONCIBANCATMP WHERE ID_ARCHIVO = " + vId_Archivo + " AND ROWNUM = 1", false);
                    Console.WriteLine(vCodigoCuenta);
                    logWriter.addLog("Numero de Cuenta " + vCodigoCuenta, false);
                    //logWriter.LogWrite();

                    if (vEstadoParametros % 2 == 1)
                    {
                        Console.WriteLine("                  >>> " + DateTime.Now.ToString("HH:mm:ss") + ": APROBADO");
                        logWriter.addLog("APROBADO", false);
                        //logWriter.LogWrite();
                    }
                    else
                    {
                        Console.WriteLine("                  >>> " + DateTime.Now.ToString("HH:mm:ss") + ": RECHAZADO");
                        logWriter.addLog("RECHAZADO", true);
                        //logWriter.LogWrite();
                        return;
                    }

                    if (!(String.IsNullOrEmpty(vCodigoCuenta)))
                    {
                        Console.WriteLine("                  >>> " + DateTime.Now.ToString("HH:mm:ss") + ": Insertando en CONCARGAPRIMERATMP... ");
                        logWriter.addLog("Insertando en CONCARGAPRIMERATMP", false);
                        logWriter.LogWrite();
                        oracleFunctions.Function_Procedure_Oracle(2, "PKG_CARGARARCHIVOSAUTO.P_GEN_CONCARGAPRIMERATMP", "PIid_archivo", vId_Archivo, "", -1, "", -1);

                        //Sin parametros
                        //Function_Procedure_Oracle(conexion, 2, "PKG_CARGARARCHIVOSAUTO.P_GEN_CARGABANCOS_CAJA", "", -1, "", -1, "", -1);

                        using (OracleConnection connection =
                                   new OracleConnection(conexion))
                        {
                            Console.WriteLine("                  >>> " + DateTime.Now.ToString("HH:mm:ss") + ": Generando Caja y Conciliando... ");
                            logWriter.addLog("Generando Caja y Conciliando", false);
                            logWriter.LogWrite();

                            OracleCommand command = new OracleCommand("PKG_CARGARARCHIVOSAUTO.P_GEN_CARGABANCOS_CAJA", connection)
                            {
                                CommandType = CommandType.StoredProcedure
                            };

                            var prm1 = new OracleParameter("PIvalarchivocarga", OracleDbType.Varchar2)
                            {
                                Direction = ParameterDirection.Input, Value = Path.GetFileName(xlsFilePath)
                            };
                            command.Parameters.Add(prm1);

                            bool reintentar       = true;
                            int  cantidadintentos = 0;
                            connection.Open();
                            while (reintentar && cantidadintentos < limitereintento)
                            {
                                cantidadintentos++;
                                try
                                {
                                    command.ExecuteNonQuery();
                                    //Console.WriteLine("                  >>> " + DateTime.Now.ToString("HH:mm:ss") + ": Fin.");
                                    Console.WriteLine("                  >>> " + DateTime.Now.ToString("HH:mm:ss") + ": Archivo Procesado");
                                    logWriter.addLog("Archivo Procesado", false);
                                    reintentar = false;
                                }
                                catch (Exception ex)
                                {
                                    Console.WriteLine(ex.Message);
                                    if (cantidadintentos < limitereintento)
                                    {
                                        Console.WriteLine("Reintento " + cantidadintentos + 1 + "/" + limitereintento + "...");
                                        logWriter.addLog("Intento " + cantidadintentos + "/" + limitereintento + ": " + ex.Message, true);
                                        logWriter.LogWrite();
                                    }
                                    else
                                    {
                                        Console.WriteLine("                  >>> " + DateTime.Now.ToString("HH:mm:ss") + ": Archivo NO PROCESADO.");
                                        logWriter.addLog("Archivo NO PROCESADO", false);
                                    }
                                }
                            }

                            connection.Close();
                            command.Dispose();

                            //logWriter.LogWrite();
                        }
                        //
                    }
                    else
                    {
                        Console.WriteLine("                  >>> Error: Codigo Cuenta Errada");
                        Console.WriteLine("Codigo Cuenta Errada");
                    }
                }
                else
                {
                    Console.WriteLine("                  >>> RECHAZADO. Banco no encontrado, revisar extracto descargado y parametros en SISGO");
                    logWriter.addLog("Banco no encontrado, revisar extracto descargado y parametros en SISGO", true);
                    logWriter.LogWrite();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                logWriter.addLog(ex.Message, true);
                logWriter.LogWrite();
            }
        }
        static void Main(string[] args)
        {
            const int SW_HIDE = 0;
            //const int SW_SHOW = 5;
            var handle = GetConsoleWindow();

            Process currentProcess = Process.GetCurrentProcess();

            Console.Title = "Lector Excel Conciliación (PID: " + currentProcess.Id + ")";
            Console.WriteLine("Lector Excel Conciliación (PID: " + currentProcess.Id + ")");

            //String de conexion
            ConnString connString = new ConnString();
            //customString
            string          conexion = "";
            OracleFunctions oracleFunctions;
            string          rutainput = "", rutaoutput = "", rutawork = "\\\\wlspacifico\\E\\ConciliacionBancaria$\\WORK";
            //inicio log
            LogWriter logWriter;

            try
            {
                if (ConfigurationManager.AppSettings["customConnection"].ToString() != "")
                {
                    conexion = ConfigurationManager.AppSettings["customConnection"].ToString();
                }
                else
                {
                    conexion = connString.GetString(ConfigurationManager.AppSettings["ambiente"].ToString());
                }
                //
                oracleFunctions = new OracleFunctions(conexion, null);
                //ruta INPUT
                rutainput = oracleFunctions.ObtRuta(14, "INPUT");
                //

                //ruta OUTPUT
                rutaoutput = oracleFunctions.ObtRuta(15, "OUTPUT");
                //

                //ruta WORK
                rutawork  = oracleFunctions.ObtRuta(29, "WORK");
                logWriter = new LogWriter(rutawork);
            }
            catch (Exception ex)
            {
                logWriter = new LogWriter(rutawork);
                logWriter.addLog("Inicio", false);
                Console.WriteLine("Error Connexion " + currentProcess.Id);
                Console.WriteLine(ex.Message);
                logWriter.addLog("Error Connexion " + currentProcess.Id, false);
                logWriter.addLog(ex.Message, false);
                Console.WriteLine("Fin del proceso");
                logWriter.addLog("Fin", false);
                logWriter.LogWrite();
                Environment.Exit(0);
            }


            try
            {
                logWriter.addLog("Inicio", false);
                logWriter.LogWrite();
                //Sub carpeta dentro de WORK
                string rutasubwork = rutawork + currentProcess.Id + Path.DirectorySeparatorChar;
                if (!Directory.Exists(rutasubwork))
                {
                    try
                    {
                        Directory.CreateDirectory(rutasubwork);
                    }
                    catch (Exception ex2)
                    {
                        Console.WriteLine("Error creando carpeta WORK" + Path.DirectorySeparatorChar + currentProcess.Id + Path.DirectorySeparatorChar);
                        Console.WriteLine(ex2.Message);
                        logWriter.addLog(ex2.Message, true);
                        logWriter.addLog("Fin", false);
                        Console.WriteLine("Fin del proceso");
                        logWriter.LogWrite();
                        Environment.Exit(0);
                    }
                }
                else
                {
                    BorrarSubWork(rutasubwork, currentProcess.Id, false, logWriter);
                    Directory.CreateDirectory(rutasubwork);
                }
                //

                int  offset           = 0;
                bool pause            = true;
                bool fileindividual   = false;
                bool carpetaparametro = false;
                while (args.Length - offset > 0)
                {
                    if (args[0 + offset] == "-help" || args[0 + offset] == "--help" || args[0 + offset] == "-nopause" || args[0 + offset] == "-hide" || args[0 + offset] == "-killall" || args[0 + offset] == "-file" || args[0 + offset] == "-path")
                    {
                        if (args[0 + offset] == "-help" || args[0 + offset] == "--help")
                        {
                            BorrarSubWork(rutasubwork, currentProcess.Id, true, logWriter);
                            ArgInvalid(false, false);
                        }
                        if (args[0 + offset] == "-nopause")
                        {
                            pause = false;
                            offset++;
                        }
                        else if (args[0 + offset] == "-hide")
                        {
                            ShowWindow(handle, SW_HIDE);
                            //ShowWindow(handle, SW_SHOW);
                            offset++;
                        }
                        else if (args[0 + offset] == "-killall")
                        {
                            foreach (var process in Process.GetProcessesByName("LectorExcelConciliacion"))
                            {
                                if (process.Id != currentProcess.Id)
                                {
                                    process.Kill();
                                    Console.WriteLine(" LectorExcelConciliacion con PID " + process.Id + " cerrado.");
                                    logWriter.addLog("LectorExcelConciliacion con PID " + process.Id + " cerrado.", false);
                                }
                            }
                            BorrarSubWork(rutasubwork, currentProcess.Id, true, logWriter);
                            logWriter.addLog("Fin", false);
                            Console.WriteLine("Fin del proceso");
                            logWriter.LogWrite();
                            Environment.Exit(0);
                        }
                        else if (args[0 + offset] == "-file")
                        {
                            fileindividual = true;
                            if (args[1 + offset] == null)
                            {
                                BorrarSubWork(rutasubwork, currentProcess.Id, true, logWriter);
                                logWriter.LogWrite();
                                ArgInvalid(false, true);
                            }
                            logWriter.addLog("Se recibio parametro FILE: " + args[1 + offset], false);
                            if (File.Exists(args[1 + offset]))
                            {
                                Console.Write(" Moviendo archivo a ruta Work... ");
                                string nombrearchivo = Path.Combine(rutasubwork, Path.GetFileNameWithoutExtension(args[1 + offset]) + "_" + currentProcess.Id + Path.GetExtension(args[1 + offset]));
                                File.Move(args[1 + offset], nombrearchivo);
                                Console.WriteLine(" OK");
                                logWriter.addLog("Se movió " + Path.GetFileName(nombrearchivo) + " a SubWork", false);
                                logWriter.LogWrite();
                                Console.WriteLine("\n    Procesando >> " + nombrearchivo);
                                ExecuteExcel(Path.GetFileName(nombrearchivo), rutasubwork, rutaoutput, conexion, logWriter);
                            }
                            else
                            {
                                Console.WriteLine(" Archivo no encontrado\n Ruta: " + args[1 + offset]);
                                Console.WriteLine("Fin del proceso");
                                logWriter.addLog("Archivo no encontrado. Ruta: " + args[1 + offset], true);
                                logWriter.LogWrite();
                            }
                            offset += 2;
                        }
                        else if (args[0 + offset] == "-path")
                        {
                            carpetaparametro = true;
                            rutainput        = args[1 + offset];
                            offset          += 2;
                        }
                    }
                    else
                    {
                        BorrarSubWork(rutasubwork, currentProcess.Id, true, logWriter);
                        if (offset == 0)
                        {
                            logWriter.LogWrite();
                            ArgInvalid(true, true);
                        }
                        else
                        {
                            logWriter.LogWrite();
                            ArgInvalid(pause, true);
                        }
                    }
                }

                //Caso no halla parametro -file, revisa carpeta
                if (!fileindividual)
                {
                    if (carpetaparametro)
                    {
                        logWriter.addLog("Se recibio parametro PATH: " + rutainput, false);
                    }
                    Console.Write(" Buscando archivos en la carpeta...");
                    string[] dirs = Directory.GetFiles(rutainput);


                    if (dirs.Length > 0)
                    {
                        Console.WriteLine(" OK");
                        Console.WriteLine("  Se encontró " + dirs.Length + " archivos:");
                        logWriter.addLog("Se encontró " + dirs.Length + " archivos en la ruta: " + rutainput, false);
                        logWriter.LogWrite();

                        foreach (string dir in dirs)
                        {
                            Console.WriteLine("   > " + dir);
                        }
                    }
                    else
                    {
                        Console.WriteLine("  No se encontró archivos en la ruta\n  Ruta: " + rutainput);
                        if (pause)
                        {
                            Console.WriteLine("Presione cualquier tecla para salir...");
                            Console.ReadKey();
                        }

                        BorrarSubWork(rutasubwork, currentProcess.Id, true, logWriter);
                        logWriter.addLog("No se encontró archivos en la ruta: " + rutainput, true);
                        logWriter.addLog("Fin", false);
                        Console.WriteLine("\nFin del proceso");
                        logWriter.LogWrite();
                        Environment.Exit(0);
                    }
                    Console.WriteLine(" Moviendo archivos a ruta Work...");
                    foreach (string dir in dirs)
                    {
                        string nombrearchivo = Path.Combine(rutasubwork, Path.GetFileNameWithoutExtension(dir) + "_" + currentProcess.Id + Path.GetExtension(dir));
                        File.Move(dir, nombrearchivo);
                        logWriter.addLog("Se movió " + Path.GetFileName(nombrearchivo) + " a SubWork", false);
                        //logWriter.LogWrite();
                    }

                    string[] dirswork = Directory.GetFiles(rutasubwork);
                    int      count    = 1;
                    foreach (string dir in dirswork)
                    {
                        Console.WriteLine("\n Procesando " + count + "/" + dirswork.Length + " >> " + Path.GetFileName(dir));
                        ExecuteExcel(Path.GetFileName(dir), rutasubwork, rutaoutput, conexion, logWriter);
                        count++;
                    }
                }

                BorrarSubWork(rutasubwork, currentProcess.Id, true, logWriter);
                Console.WriteLine("\nFin del proceso");
                logWriter.addLog("Fin", false);
                logWriter.LogWrite();
                if (pause)
                {
                    Console.WriteLine("Presione cualquier tecla para salir...");
                    Console.ReadKey();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                logWriter.addLog(ex.Message, true);
                logWriter.LogWrite();
            }
        }