public JsonResult CargarCSV(HttpPostedFileBase archivoCSV, int lineaNegocio) { List <string> listaErrores = new List <string>(); IEnumerable <string> lineas = null; object respuesta = null; int totalProcesados = 0; int lineaActual = 2; bool status = false; string exception = "Error, se presento un error inesperado."; try { DateTime fechaContable; if (lineaNegocio == 1) { fechaContable = DateTime.Parse(db.cargaDocumentoRoaming.Where(x => x.estatusCarga == "PC" && x.ordenCarga == "A" && x.idDocumento == "TAPOUT").Select(x => x.periodoCarga).SingleOrDefault()); } else { fechaContable = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1); } /// Se salta la primera linea, el encabezado List <string> csvData = new List <string>(); using (System.IO.StreamReader reader = new System.IO.StreamReader(archivoCSV.InputStream, Encoding.Default)) { while (!reader.EndOfStream) { csvData.Add(reader.ReadLine()); } } lineas = csvData.Skip(1); using (TransactionScope scope = new TransactionScope()) { foreach (string linea in lineas) { var lineaSplit = linea.Split(';'); if (lineaSplit.Count() == 11) { try { AjustesObjecion aObj = new AjustesObjecion(); aObj.sentido = lineaSplit[0]; aObj.sociedad = lineaSplit[1]; aObj.trafico = lineaSplit[2]; aObj.servicio = lineaSplit[3]; aObj.deudorAcreedor = lineaSplit[4]; aObj.operador = lineaSplit[5]; aObj.grupo = lineaSplit[6]; aObj.periodo = DateTime.ParseExact(lineaSplit[7], "dd/MM/yyyy", new CultureInfo("es-ES")); aObj.importe = decimal.Parse(lineaSplit[8]); aObj.moneda = lineaSplit[9]; aObj.lineaNegocio = lineaNegocio; aObj.periodo_carga = fechaContable; aObj.origen = "CARGA"; aObj.minutos = decimal.Parse(lineaSplit[10]); var result = db.spValidaAjustesObj(aObj.sentido, aObj.sociedad, aObj.trafico, aObj.servicio, aObj.deudorAcreedor, aObj.operador, aObj.grupo, lineaNegocio).ToList(); aObj.idSociedad = result[0].idSociedad; aObj.idTrafico = result[0].idTrafico; aObj.idServicio = result[0].idServicio; aObj.idDeudorAcreedor = result[0].idDeudorAcreedor; aObj.idOperador = result[0].idOperador; aObj.idGrupo = result[0].idGrupo; if (result[0].idStatus == 1) { aObj.activo = 1; totalProcesados++; } else { aObj.activo = 0; listaErrores.Add("Línea " + lineaActual + ": Error en la carga, no se encontraron coincidencias en los catálogo(s)."); } db.AjustesObjecion.Add(aObj); Log log = new Log(); log.insertaNuevoOEliminado(aObj, "Nuevo", "ajustesObjecion.html", Request.UserHostAddress); } catch (FormatException) { listaErrores.Add("Línea " + lineaActual + ": Campo con formato erróneo."); } } else { listaErrores.Add("Línea " + lineaActual + ": Número de campos insuficiente."); } ++lineaActual; } // Termina exitosamente la transaccion db.SaveChanges(); scope.Complete(); exception = "Datos cargados con éxito"; status = true; } } catch (FileNotFoundException) { exception = "El archivo Selecionado aún no existe en el Repositorio."; status = false; } catch (UnauthorizedAccessException) { exception = "No tiene permiso para acceder al archivo actual."; status = false; } catch (IOException e) when((e.HResult & 0x0000FFFF) == 32) { exception = "Falta el nombre del archivo, o el archivo o directorio está en uso."; status = false; } catch (TransactionAbortedException) { exception = "Transacción abortada. Se presentó un error."; status = false; } finally { respuesta = new { success = true, results = listaErrores, mensaje = exception, totalProcesados, status }; } return(Json(respuesta, JsonRequestBehavior.AllowGet)); }