Esempio n. 1
0
        public JsonResult CargarCSV(HttpPostedFileBase archivoCSV, int lineaNegocio)
        {
            List <string>        listaErrores = new List <string>();
            var                  hoy = DateTime.Now;
            IEnumerable <string> lineas = null;
            object               respuesta = null;
            string               mensajeExistencia = "";
            int                  totalProcesados = 0;
            int                  lineaActual = 1;
            bool                 status = false;
            string               ope, fact;
            string               exception = "Error, se presento un error inesperado.";

            try {
                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);

                string pd = lineas.First();
                pd = pd.Replace('%', ' ');
                var             pdSplit          = pd.Split(';');
                DateTime        periodoDocumento = FNCGrales.ConvierteFecha(pdSplit[1], char.Parse("-"), "DMY");
                documentosCosto docCosto         = db.documentosCosto.Where(x => x.fechaContable == periodoDocumento && x.activo == 1 && x.lineaNegocio == lineaNegocio).FirstOrDefault();
                if (docCosto != null)
                {
                    mensajeExistencia = "Los documentos del periodo " + periodoDocumento.Year + " " + meses[periodoDocumento.Month] + " se han actualizado";
                    db.sp_BorrarCargas_Delete("documentosCosto", periodoDocumento, lineaNegocio);
                }

                using (TransactionScope scope = new TransactionScope()) {
                    foreach (string ln in lineas)
                    {
                        string linea      = ln.Replace('%', ' ');
                        var    lineaSplit = linea.Split(';');
                        ++lineaActual;
                        if (lineaSplit.Count() == 26)
                        {
                            documentosCosto documento = new documentosCosto();
                            try {
                                ope  = lineaSplit[6];
                                fact = lineaSplit[19];

                                documentosCosto veriDocumento = db.documentosCosto.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;
                                }
                                documento.ano = new DateTime(Int32.Parse(lineaSplit[0]), 01, 01);

                                if (lineaSplit[1] == "")
                                {
                                    listaErrores.Add("Línea " + lineaActual + ": El campo Fecha Contable es obligatorio.");
                                    continue;
                                }
                                DateTime dtFecha = FNCGrales.ConvierteFecha(lineaSplit[1], '-', "DMY");

                                documento.fechaContable = dtFecha;

                                if (lineaSplit[2] == "")
                                {
                                    listaErrores.Add("Línea " + lineaActual + ": El campo Fecha Consumo es obligatorio.");
                                    continue;
                                }

                                dtFecha = FNCGrales.ConvierteFecha("01-" + lineaSplit[2], '-', "DMY");
                                documento.fechaConsumo = dtFecha;
                                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 Acreedor es obligatorio.");
                                    continue;
                                }
                                documento.acreedor = 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;
                                }
                                documento.fechaFactura = DateTime.ParseExact(lineaSplit[18], "dd/MM/yyyy", new CultureInfo("en-US"), DateTimeStyles.None);

                                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.spValidaDocumentosCost(documento.compania, documento.servicio,
                                                                       documento.grupo, documento.acreedor, 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.idAcreedor        = result[0].idAcreedor;
                                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];
                                // Se agrega en el Sprint 7
                                documento.numDocumentoPF = lineaSplit[25];
                                documento.estatus        = "PENDIENTE DE PROCESAR";
                                documento.lineaNegocio   = lineaNegocio;
                                db.documentosCosto.Add(documento);
                                Log log = new Log();
                                log.insertaNuevoOEliminado(documento, "Nuevo", "documentosCosto.html", Request.UserHostAddress);
                            } catch (FormatException e) {
                                if (e.Message == "String was not recognized as a valid DateTime.")
                                {
                                    listaErrores.Add("Línea " + lineaActual + ": Campo de Fecha con formato erróneo.");
                                }
                                else
                                {
                                    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,
                    mensajeExistencia,
                    totalProcesados = totalProcesados,
                    status          = status
                };
            }
            return(Json(respuesta, JsonRequestBehavior.AllowGet));
        }