示例#1
0
        private void EjecutarCorridaCallBack(object state)
        {
            EjecucionSubidaArchivos      ejecucionData = (EjecucionSubidaArchivos)state;
            EjecutarCorridaSubidaArchivo corrida       = new EjecutarCorridaSubidaArchivo();

            corrida.CorridaId = ejecucionData.CorridaId;
            corrida.FileNames = ejecucionData.FileList;
            SubidaArchivoService.EjecutarCorrida(corrida);
        }
        private bool AsignarValoresEnPantallaACorrida(EjecutarCorridaSubidaArchivo corrida)
        {
            bool validadoOk = false;

            errorProviderCargaDeDatos.Clear();
            bool validoCUIT               = ValidarCUIT();
            bool validoCAE                = ValidarCAE();
            bool validoMonto              = ValidarMonto();
            bool validoNroComprobante     = ValidarNroComprobante();
            bool validoPeriodoFacturacion = ValidarPeriodoDeFacturacion();
            bool validoPuntoDeVenta       = ValidarPuntoDeVenta();
            bool diasDeVto                = ValidarDiasDeVto();

            validadoOk = validoCUIT && validoCAE && validoMonto && validoNroComprobante && validoPeriodoFacturacion && validoPuntoDeVenta && diasDeVto;

            if (validadoOk)
            {
                // Asignar los valores en pantalla (luego hacer el servicio y listo liston
                corrida.Cuit = this.mskCUIT.Text.Trim();
                corrida.CAE  = this.txtCAE.Text.Trim();
                if (this.datFechaVtoCAE.Checked)
                {
                    corrida.FechaVencimientoCAE = this.datFechaVtoCAE.Value;
                }

                corrida.TipoDeComprobanteCodigo = Convert.ToString(this.cboTipoComprobante.SelectedValue);
                corrida.NroComprobante          = Convert.ToInt64(this.mskNroComprobante.Text);

                corrida.FechaComprobante = datFechaDelComprobante.Value;

                corrida.PeriodoDeFacturacion = this.mskPeriodoDeFacturacion.Text.Trim();

                if (this.datFechaDeVencimiento.Checked)
                {
                    corrida.FechaDeVencimiento = this.datFechaDeVencimiento.Value;
                }
                else
                {
                    corrida.DiasDeVencimiento = Convert.ToInt32(this.mskDiasVto.Text.Trim());
                }

                corrida.PuntoDeVenta = Convert.ToInt32(this.mskPtoVta.Text.Trim());

                corrida.MontoTotal = this.mskMonto.Text.Trim().Replace(",", "."); // ya está validado de antes

                corrida.TipoContratoCodigo = this.cboTipoContrato.SelectedValue.ToString();
            }

            return(validadoOk);
        }
        public void EjecutarCorrida(EjecutarCorridaSubidaArchivo corrida)
        {
            CorridaSubidaArchivoDto    dto    = null;
            SubidaArchivoServiceClient client = new SubidaArchivoServiceClient();

            ClientCredentialHelper.SetCredentials(client.ClientCredentials);
            try
            {
                client.EjecutarCorrida(corrida);
                client.Close();
            }
            catch
            {
                if (client.State != System.ServiceModel.CommunicationState.Closed)
                {
                    client.Abort();
                }
            }
        }
示例#4
0
        private void ArmarArchivoAsociadoConContexto(FacturaElectronicaEntities ctx, CorridaSubidaArchivo dbCorrida, string filePath, string fileDestinationPathOk, string fileDestinationPathNoOk, EjecutarCorridaSubidaArchivo corrida)
        {
            string fileName = Path.GetFileName(filePath);

            StringBuilder mensajeError = new StringBuilder();
            string        errorStr     = string.Empty;

            bool procesarArchivo = true;
            long cuit            = 0;

            if (!Int64.TryParse(corrida.Cuit, out cuit))
            {
                errorStr = "No se pudo interpretar el CUIT " + corrida.Cuit;
                mensajeError.AppendLine(errorStr);
                GenerarLog(dbCorrida.Id, errorStr);
                procesarArchivo = false;
            }

            string          tipoComprobante    = corrida.TipoDeComprobanteCodigo;
            TipoComprobante tipoComprobanteObj = null;

            if (!String.IsNullOrEmpty(tipoComprobante))
            {
                tipoComprobanteObj = GetTipoComprobante(ctx).Where(t => t.Codigo == tipoComprobante).SingleOrDefault();
                if (tipoComprobanteObj == null)
                {
                    errorStr = "No se pudo interpretar el Tipo de Comprobante " + tipoComprobante;
                    mensajeError.AppendLine(errorStr);
                    GenerarLog(dbCorrida.Id, errorStr);
                    procesarArchivo = false;
                }
            }
            else
            {
                errorStr = "No se pudo interpretar el Tipo de Comprobante " + tipoComprobante;
                mensajeError.AppendLine(errorStr);
                GenerarLog(dbCorrida.Id, errorStr);
                procesarArchivo = false;
            }

            long nroComprobante = corrida.NroComprobante;

            long?ptovta = corrida.PuntoDeVenta;

            string periodoFactuStr        = corrida.PeriodoDeFacturacion;
            string periodoFactuAnioStr    = periodoFactuStr.Substring(0, 4);
            string periodoFactuMesStr     = periodoFactuStr.Substring(4, 2);
            int    periodoFacturacionAnio = 0;
            int    periodoFacturacionMes  = 0;

            if (!Int32.TryParse(periodoFactuAnioStr, out periodoFacturacionAnio) || !Int32.TryParse(periodoFactuMesStr, out periodoFacturacionMes))
            {
                errorStr = "No se pudo interpretar el Periodo de Facturacion " + periodoFactuStr;
                mensajeError.AppendLine(errorStr);
                GenerarLog(dbCorrida.Id, errorStr);
                procesarArchivo = false;
            }

            bool     tieneFechaVencimiento;
            DateTime fechaDeVencimiento = DateTime.MinValue;
            int      diasDeVencimiento  = 0;

            if (!corrida.FechaDeVencimiento.HasValue)
            {
                tieneFechaVencimiento = false;
                if (!corrida.DiasDeVencimiento.HasValue)
                {
                    errorStr = "No se pudo interpretar la fecha de vencimiento ";
                    mensajeError.AppendLine(errorStr);
                    GenerarLog(dbCorrida.Id, errorStr);
                    procesarArchivo = false;
                }
                else
                {
                    diasDeVencimiento = corrida.DiasDeVencimiento.Value;
                }
            }
            else
            {
                tieneFechaVencimiento = true;
                fechaDeVencimiento    = corrida.FechaDeVencimiento.Value.Date;
            }

            string  montoTotalStr = corrida.MontoTotal;
            decimal montoTotal;

            montoTotalStr = montoTotalStr.Replace(".", CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator);
            if (!Decimal.TryParse(montoTotalStr, out montoTotal))
            {
                errorStr = "No se pudo interpretar el MontoTotal " + montoTotalStr;
                mensajeError.AppendLine(errorStr);
                GenerarLog(dbCorrida.Id, errorStr);
                procesarArchivo = false;
            }

            string       tipoContratoStr = corrida.TipoContratoCodigo;
            TipoContrato tipoContrato    = null;

            if (!String.IsNullOrEmpty(tipoContratoStr))
            {
                tipoContrato = GetTipoContrato(ctx).Where(t => t.Codigo == tipoContratoStr).SingleOrDefault();

                if (tipoContrato == null)
                {
                    errorStr = "No se pudo interpretar el Tipo de Contrato " + tipoContratoStr;
                    mensajeError.AppendLine(errorStr);
                    GenerarLog(dbCorrida.Id, errorStr);
                    procesarArchivo = false;
                }
            }
            else
            {
                errorStr = "No se pudo interpretar el Tipo de Contrato " + tipoContratoStr;
                mensajeError.AppendLine(errorStr);
                GenerarLog(dbCorrida.Id, errorStr);
                procesarArchivo = false;
            }

            CorridaSubidaArchivoDetalle detalle = new CorridaSubidaArchivoDetalle();

            if (procesarArchivo)
            {
                // obtengo el cliente
                var dbCliente = ctx.Clientes.Where(c => c.CUIT == cuit).SingleOrDefault();
                if (dbCliente == null)
                {
                    errorStr = "No se encuentra el cliente " + cuit.ToString();
                    mensajeError.AppendLine(errorStr);
                    GenerarLog(dbCorrida.Id, errorStr);
                    detalle.ProcesadoOK = false;
                }
                else
                {
                    // Obtengo el comprobante al que hay que asociarle el archivo
                    var  dbComprobante = ctx.Comprobantes.Where(c => c.TipoComprobanteId == tipoComprobanteObj.Id && c.PtoVta == ptovta && c.CbteDesde <= nroComprobante && c.CbteHasta >= nroComprobante).FirstOrDefault();
                    bool comprobanteOK = false;
                    if (dbComprobante == null)
                    {
                        if (corrida.ForzarDatosCliente)
                        {
                            // Creo el comprobante
                            dbComprobante = new Comprobante();
                            ctx.Comprobantes.AddObject(dbComprobante);
                            dbComprobante.TipoComprobanteId = tipoComprobanteObj.Id;
                            dbComprobante.FechaDeCarga      = DateTime.Now;
                            dbComprobante.ClienteId         = dbCliente.Id;
                            dbComprobante.CAE = corrida.CAE;
                            dbComprobante.CAEFechaVencimiento = corrida.FechaVencimientoCAE.Value;
                            dbComprobante.CbteFecha           = corrida.FechaComprobante;
                            dbComprobante.CbteDesde           = corrida.NroComprobante;
                            dbComprobante.CbteHasta           = corrida.NroComprobante;
                            dbComprobante.PtoVta = corrida.PuntoDeVenta;
                            ctx.SaveChanges();
                            comprobanteOK = true;
                        }
                        else
                        {
                            // No se puede procesar
                            errorStr = string.Format("No se encuentra el comprobante asociado. Nro {0}, Tipo {1}, PtoVta: {2}", nroComprobante, tipoComprobanteObj.Descripcion, ptovta);
                            mensajeError.AppendLine(errorStr);
                            GenerarLog(dbCorrida.Id, errorStr);

                            // Lo copio a la carpeta de fallidos y registro el estado en el documento
                            //File.Move(filePath, fileDestinationPathNoOk);
                            detalle.ProcesadoOK = false;
                        }
                    }
                    else
                    {
                        comprobanteOK = true;
                    }

                    if (comprobanteOK)
                    {
                        bool clienteOk = true;
                        if (!dbComprobante.ClienteId.HasValue)
                        {
                            dbComprobante.ClienteId = dbCliente.Id;
                        }
                        else if (dbComprobante.ClienteId.Value != dbCliente.Id)
                        {
                            errorStr = string.Format("El cliente del comprobante CUIT {0} es distinto que el indicado en la factura CUIT {1}", dbComprobante.Cliente.CUIT, dbCliente.CUIT);
                            mensajeError.AppendLine(errorStr);
                            GenerarLog(dbCorrida.Id, errorStr);

                            // Lo copio a la carpeta de fallidos y registro el estado en el documento
                            //File.Move(filePath, fileDestinationPathNoOk);
                            detalle.ProcesadoOK = false;
                            clienteOk           = false;
                        }

                        if (clienteOk)
                        {
                            // Lo copio a la carpeta de ok y lo guardo en la base
                            string destPath = Path.Combine(fileDestinationPathOk, fileName);
                            detalle.ProcesadoOK = true;
                            File.Move(filePath, destPath);

                            // Puede ser que el archivo asociado ya exista y lo tengo que actualizar
                            ArchivoAsociado archivoAsociado;
                            archivoAsociado = ctx.ArchivoAsociadoes.Where(a => a.ComprobanteId == dbComprobante.Id && a.NombreArchivo == fileName).SingleOrDefault();
                            if (archivoAsociado != null &&
                                archivoAsociado.EstadoArchivoAsociado.Codigo == CodigosEstadoArchivoAsociado.Visualizado)
                            {
                                // No se puede procesar porque ya fue visualizado
                                errorStr = string.Format("No se puede reemplazar el archivo asociado del comprobante porque ya fue visualizado. (Nro {0}, Tipo {1}, PtoVta: {2})", nroComprobante, tipoComprobanteObj.Descripcion, ptovta);
                                mensajeError.AppendLine(errorStr);
                                GenerarLog(dbCorrida.Id, errorStr);
                            }
                            else
                            {
                                if (archivoAsociado == null)
                                {
                                    archivoAsociado = new ArchivoAsociado();
                                    dbComprobante.ArchivoAsociadoes.Add(archivoAsociado);
                                }

                                detalle.ArchivoAsociado        = archivoAsociado;
                                archivoAsociado.NombreArchivo  = fileName;
                                archivoAsociado.PathArchivo    = destPath;
                                archivoAsociado.NroComprobante = nroComprobante;
                                archivoAsociado.TipoContratoId = tipoContrato.Id;
                                if (tieneFechaVencimiento)
                                {
                                    archivoAsociado.FechaVencimiento = fechaDeVencimiento;
                                }
                                else
                                {
                                    archivoAsociado.DiasVencimiento = diasDeVencimiento;
                                }

                                archivoAsociado.FechaDeCarga    = DateTime.Now;
                                archivoAsociado.MesFacturacion  = periodoFacturacionMes;
                                archivoAsociado.AnioFacturacion = periodoFacturacionAnio;
                                archivoAsociado.EstadoId        = GetEstadoArchivoAsociado(ctx).Where(c => c.Codigo == CodigosEstadoArchivoAsociado.NoVisualizado).Select(e => e.Id).Single();
                                archivoAsociado.MontoTotal      = montoTotal;
                            }
                        }
                    }
                }
            }

            if (!detalle.ProcesadoOK)
            {
                // Lo copio a la carpeta de fallidos y registro el estado en el documento
                string destPath = Path.Combine(fileDestinationPathNoOk, fileName);
                File.Move(filePath, destPath);
            }

            detalle.NombreArchivo = fileName;
            detalle.Mensaje       = mensajeError.ToString();
            dbCorrida.CorridaSubidaArchivoDetalles.Add(detalle);
        }
示例#5
0
        public void EjecutarCorrida(EjecutarCorridaSubidaArchivo corrida)
        {
            long corridaId = corrida.CorridaId;

            List <string> files = corrida.FileNames;

            // Proceso los archivos en la corrida y marcos cuales están ok y cuales no
            using (var ctx = new FacturaElectronicaEntities())
            {
                CorridaSubidaArchivo dbCorrida = ctx.CorridaSubidaArchivoes.Where(c => c.Id == corridaId).SingleOrDefault();
                if (dbCorrida != null)
                {
                    try
                    {
                        // Armo los path destinos Ok y con errores
                        string fileDestinationPathOk = ConfigurationManager.AppSettings["PathDestinoArchivosFactura"];

                        fileDestinationPathOk = Path.Combine(fileDestinationPathOk, "ArchivosPDF");

                        fileDestinationPathOk = Path.Combine(fileDestinationPathOk, corridaId.ToString());
                        string sourceFilePath          = Path.Combine(fileDestinationPathOk, "AProcesar");
                        string fileDestinationPathNoOk = Path.Combine(fileDestinationPathOk, "ConErrores");;
                        fileDestinationPathOk = Path.Combine(fileDestinationPathOk, "OK");
                        if (!Directory.Exists(fileDestinationPathOk))
                        {
                            Directory.CreateDirectory(fileDestinationPathOk);
                        }

                        if (!Directory.Exists(fileDestinationPathNoOk))
                        {
                            Directory.CreateDirectory(fileDestinationPathNoOk);
                        }

                        // Una vez que tengo los paths, cargo los archivos
                        foreach (string filePathIterator in files)
                        {
                            try
                            {
                                string filePath = Path.Combine(sourceFilePath, filePathIterator);

                                string fileName = Path.GetFileName(filePath);
                                GenerarLog(dbCorrida.Id, string.Format("Procesando Archivo: {0}", fileName));

                                if (File.Exists(filePath))
                                {
                                    if (!corrida.ForzarDatosCliente)
                                    {
                                        ArmarArchivoAsociado(ctx, dbCorrida, filePath, fileDestinationPathOk, fileDestinationPathNoOk, corrida);
                                    }
                                    else
                                    {
                                        ArmarArchivoAsociadoConContexto(ctx, dbCorrida, filePath, fileDestinationPathOk, fileDestinationPathNoOk, corrida);
                                    }
                                }
                                else
                                {
                                    GenerarLog(dbCorrida.Id, string.Format("No Existe el Archivo: {0}", fileName));
                                }

                                GenerarLog(dbCorrida.Id, string.Format("Fin Procesamiento Archivo: {0}", fileName));
                            }
                            catch (Exception ex)
                            {
                                GenerarLog(dbCorrida.Id, ex.Message);
                            }
                        }

                        GenerarLog(dbCorrida.Id, FinCorridaStr);

                        dbCorrida.Procesada = true;
                        ctx.SaveChanges();
                    }
                    catch (Exception ex)
                    {
                        GenerarLog(dbCorrida.Id, ex.Message);
                    }
                }
            }

            // Al final, envío emails a los clientes informando que ya están listos X cantidad de facturas para
            // ser visualizadas
            SendMailToCustomers(corridaId);
        }
        private void EjecutarCorridaCallBack(object state)
        {
            EjecutarCorridaSubidaArchivo corrida = (EjecutarCorridaSubidaArchivo)state;

            SubidaArchivoService.EjecutarCorrida(corrida);
        }
        private void btnEnviar_Click(object sender, EventArgs e)
        {
            try
            {
                timerLog.Stop();
                this.LogTextBox.Clear();
                string        sourceDirectory = this.txtDirectorio.Text;
                List <string> fileList        = new List <string>();
                this.btnVerDetalleCorrida.Enabled = false;
                lastLogId               = 0;
                this.fechaLog           = DateTime.MinValue;
                this.txtNroCorrida.Text = string.Empty;

                if (File.Exists(sourceDirectory))
                {
                    EjecutarCorridaSubidaArchivo corrida = new EjecutarCorridaSubidaArchivo();

                    // Obtengo los archivos a procesar
                    fileList.Add(sourceDirectory);

                    // Asigno lo valores de la pantalla al objeto corrida
                    if (AsignarValoresEnPantallaACorrida(corrida))
                    {
                        if (fileList.Count > 0)
                        {
                            // Genero una corrida
                            MostrarMensajeEnLog("Creando Corrida...");
                            CorridaSubidaArchivo = SubidaArchivoService.CrearNuevaCorrida();

                            this.txtNroCorrida.Text = CorridaSubidaArchivo.Id.ToString();

                            // Copio los archivos al server de telefónica
                            MostrarMensajeEnLog("Copiando Archivos al Servidor...");

                            this.Refresh();

                            //fileList = CopiarArchivosParaProcesar(fileList);
                            fileList = CopiarArchivosParaProcesarPorFTP(fileList);

                            // Ejecuto
                            MostrarMensajeEnLog("Enviando mensaje de ejecución asincrónica...");

                            corrida.CorridaId          = CorridaSubidaArchivo.Id;
                            corrida.FileNames          = fileList;
                            corrida.ForzarDatosCliente = true;

                            // Asigno los datos de la pantalla;

                            // Activo el timer porque a veces no retorna la siguiente llamada
                            fechaLog          = DateTime.MinValue;
                            timerLog.Interval = 3000;
                            timerLog.Start();

                            ThreadPool.QueueUserWorkItem(new WaitCallback(EjecutarCorridaCallBack), corrida);
                        }
                    }
                }
                else
                {
                    errorProviderCargaDeDatos.SetError(this.txtDirectorio, "Debe seleccionar un archivo");
                }
            }
            catch (Exception ex)
            {
                string message = GetExceptionMessage(ex) + GetExceptionStackTrace(ex);
                MessageBox.Show(message);
            }
        }