public JsonResult CargarCSV(HttpPostedFileBase archivoCSV, int lineaNegocio) { List <string> listaErrores = new List <string>(); var hoy = DateTime.Now; IEnumerable <string> lineas = null; object respuesta = null; int totalProcesados = 0; int lineaActual = 1; bool status = false; string ope, fact; string exception = "Error, se presento un error inesperado."; try { /// 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); //lineas = System.IO.File.ReadLines(path).Skip(1); using (TransactionScope scope = new TransactionScope()) { foreach (string ln in lineas) { string linea = ln.Replace('%', ' '); var lineaSplit = SepararLineas(linea); ++lineaActual; if (lineaSplit.Count() == 25) { documentosIngreso documento = new documentosIngreso(); try { ope = lineaSplit[6]; fact = lineaSplit[19]; //var veriDocumento = db.documentosIngreso.Where(x => x.operador == ope && x.factura == fact && x.activo == 1 && x.lineaNegocio == lineaNegocio).SingleOrDefault(); documentosIngreso veriDocumento = db.documentosIngreso.Where(x => x.operador == ope && x.factura == fact && x.activo == 1 && x.lineaNegocio == lineaNegocio).FirstOrDefault(); if (veriDocumento != null) { listaErrores.Add("Línea " + lineaActual + ": El Operador y Factura actual ya estan dados de alta."); continue; } if (lineaSplit[0] == "") { listaErrores.Add("Línea " + lineaActual + ": El campo Año es obligatorio."); continue; } string strDate = lineaSplit[0] + "-01-01"; documento.ano = DateTime.Parse(strDate); if (lineaSplit[1] == "") { listaErrores.Add("Línea " + lineaActual + ": El campo Fecha Contable es obligatorio."); continue; } DateTime dtFecha = ConvierteFecha(lineaSplit[1], char.Parse("-"), "DMY"); documento.fechaContable = dtFecha;//DateTime.ParseExact( lineaSplit[1], "dd-MM-yyyy", new CultureInfo("en-US"), DateTimeStyles.None); if (lineaSplit[2] == "") { listaErrores.Add("Línea " + lineaActual + ": El campo Fecha Consumo es obligatorio."); continue; } dtFecha = ConvierteFecha("01-" + lineaSplit[2], char.Parse("-"), "DMY"); documento.fechaConsumo = dtFecha; //DateTime.ParseExact( lineaSplit[2], "dd/MM/yyyy", new CultureInfo("en-US"), DateTimeStyles.None); if (documento.fechaConsumo.Month >= hoy.Month && documento.fechaConsumo.Year == hoy.Year) { listaErrores.Add("Línea " + lineaActual + ": No se permite cargar facturas con Mes Consumo que sean del mes en curso en adelante."); continue; } if (lineaSplit[3] == "") { listaErrores.Add("Línea " + lineaActual + ": El campo Compañia es obligatorio."); continue; } documento.compania = lineaSplit[3]; documento.servicio = lineaSplit[4]; if (lineaSplit[5] == "") { listaErrores.Add("Línea " + lineaActual + ": El campo Grupo es obligatorio."); continue; } documento.grupo = lineaSplit[5]; if (lineaSplit[6] == "") { listaErrores.Add("Línea " + lineaActual + ": El campo Id Operador es obligatorio."); continue; } documento.operador = lineaSplit[6]; documento.nombreOperador = lineaSplit[7]; if (lineaSplit[8] == "") { listaErrores.Add("Línea " + lineaActual + ": El campo Deudor es obligatorio."); continue; } documento.deudor = lineaSplit[8]; if (lineaSplit[9] == "") { listaErrores.Add("Línea " + lineaActual + ": El campo Código Material es obligatorio."); continue; } documento.codigoMaterial = lineaSplit[9]; documento.trafico = lineaSplit[10]; if (lineaSplit[11] == "") { listaErrores.Add("Línea " + lineaActual + ": El campo Monto IVA es obligatorio."); continue; } documento.montoIva = decimal.Parse(lineaSplit[11]); if (lineaSplit[12] == "") { listaErrores.Add("Línea " + lineaActual + ": El campo IVA es obligatorio."); continue; } documento.iva = decimal.Parse(lineaSplit[12]); if (lineaSplit[13] == "") { listaErrores.Add("Línea " + lineaActual + ": El campo Moneda es obligatorio."); continue; } documento.moneda = lineaSplit[13]; if (lineaSplit[14] == null || lineaSplit[14] == "") { documento.minutos = null; } else { documento.minutos = decimal.Parse(lineaSplit[14]); } if (lineaSplit[15] == null || lineaSplit[15] == "") { documento.tarifa = null; } else { documento.tarifa = decimal.Parse(lineaSplit[15]); } if (lineaSplit[16] == "") { listaErrores.Add("Línea " + lineaActual + ": El campo Monto es obligatorio."); continue; } documento.monto = decimal.Parse(lineaSplit[16]); if (lineaSplit[17] == "") { listaErrores.Add("Línea " + lineaActual + ": El campo Monto Facturado es obligatorio."); continue; } documento.montoFacturado = decimal.Parse(lineaSplit[17]); if (lineaSplit[18] == "") { listaErrores.Add("Línea " + lineaActual + ": El campo Fecha Factura es obligatorio."); continue; } dtFecha = ConvierteFecha(lineaSplit[18], char.Parse("-"), "DMY"); documento.fechaFactura = dtFecha; //DateTime.ParseExact(lineaSplit[18], "dd/MM/yyyy", new CultureInfo("en-US"), DateTimeStyles.None);// DateTime.Parse(lineaSplit[18]); if (lineaSplit[19] == "") { listaErrores.Add("Línea " + lineaActual + ": El campo Factura es obligatorio."); continue; } documento.factura = lineaSplit[19]; if (lineaSplit[20] == "") { listaErrores.Add("Línea " + lineaActual + ": El campo Tipo Cambio es obligatorio."); continue; } documento.tipoCambio = decimal.Parse(lineaSplit[20]); if (lineaSplit[21] == "") { listaErrores.Add("Línea " + lineaActual + ": El campo Monto MXP es obligatorio."); continue; } documento.montoMXP = decimal.Parse(lineaSplit[21]); documento.cuentaContable = lineaSplit[22]; var result = db.spValidaDocumentosIng(documento.compania, documento.servicio, documento.grupo, documento.deudor, documento.operador, documento.trafico, documento.moneda, documento.cuentaContable, documento.codigoMaterial, lineaNegocio ).ToList(); documento.idSociedad = result[0].idSociedad; documento.idServicio = result[0].idServicio; documento.idGrupo = result[0].idGrupo; documento.idOperador = result[0].idOperador; documento.idDeudor = result[0].idDeudor; documento.idTrafico = result[0].idTrafico; documento.idMoneda = result[0].idMoneda; documento.idCuentaResultado = result[0].idCuentaResultado; if (result[0].idStatus == 1) { documento.activo = 1; totalProcesados++; } else { documento.activo = 0; var cadena = result[0].cadenaResultado; listaErrores.Add("Línea " + lineaActual + ": Error en la carga, no se encontraron coincidencias" + " en los siguientes catálogo(s)" + cadena.Remove(cadena.Length - 1) + "."); } if (lineaSplit[23] == "") { listaErrores.Add("Línea " + lineaActual + ": El campo Clase Documento es obligatorio."); continue; } documento.claseDocumento = lineaSplit[23]; if (lineaSplit[24] == "") { listaErrores.Add("Línea " + lineaActual + ": El campo Clase Documento SAP es obligatorio."); continue; } documento.claseDocumentoSAP = lineaSplit[24]; documento.estatus = "PENDIENTE DE PROCESAR"; documento.lineaNegocio = lineaNegocio; documento.tipoCarga = "MASIVA"; db.documentosIngreso.Add(documento); Log log = new Log(); log.insertaNuevoOEliminado(documento, "Nuevo", "documentosIngreso.html", Request.UserHostAddress); } catch (FormatException) { listaErrores.Add("Línea " + lineaActual + ": Campo con formato erróneo."); } catch (Exception) { listaErrores.Add("Línea " + lineaActual + ": Error desconocido. "); } } else { listaErrores.Add("Línea " + lineaActual + ": Número de campos insuficiente."); } } 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; } catch (Exception err) { exception = "Error desconocido. " + err.InnerException.ToString(); status = false; } finally { respuesta = new { success = true, results = listaErrores, mensaje = exception, totalProcesados, status }; } return(Json(respuesta, JsonRequestBehavior.AllowGet)); }