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(); } } }
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); }
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); } }