/// <summary> /// Ejecuta la generación de pdfs en un thread independiente /// </summary> /// <param name="e">trxVentas</param> protected override void OnDoWork(DoWorkEventArgs e) { ReportProgress(0, "Iniciando proceso...\r\n"); object[] args = e.Argument as object[]; vwCfdTransaccionesDeVenta trxVenta = (vwCfdTransaccionesDeVenta)args[0]; int i = 1; int errores = 0; string eBinario = ""; string eBase = ""; string msj = ""; cfdReglasFacturaXml DocumentoEmitido = new cfdReglasFacturaXml(_Conex, _Param); //log de facturas xml emitidas y anuladas ReglasME maquina = new ReglasME(_Param); if (DocumentoEmitido.numMensajeError != 0) { e.Result = DocumentoEmitido.ultimoMensaje + "\r\n"; ReportProgress(100, DocumentoEmitido.ultimoMensaje + "\r\n"); return; } trxVenta.Rewind(); //move to first record do { if (CancellationPending) { e.Cancel = true; return; } msj = ""; if (maquina.ValidaTransicion(_Param.tipoDoc, "IMPRIME PDF", trxVenta.EstadoActual, "impreso")) if (trxVenta.Voidstts == 0 && trxVenta.EstadoContabilizado.Equals("contabilizado")) //no anulado y contabilizado { if (!_Param.emite && !maquina.impreso(trxVenta.EstadoActual)) eBase = "emitido"; else eBase = "impreso"; //Si no emite y es primera impresión: guardar el archivo pdf y registrar el log: emitido //sino: registrar el log impreso if (DocumentoEmitido.AlmacenaEnRepositorio(trxVenta, eBase, maquina.eBinarioNuevo, maquina.EnLetras(maquina.eBinarioNuevo, _Param.tipoDoc))) { eBinario = maquina.eBinarioNuevo; } else { eBinario = maquina.eBinActualConError; errores++; } if (_Param.emite && !maquina.impreso(trxVenta.EstadoActual)) DocumentoEmitido.ActualizaFacturaEmitida(trxVenta.Soptype, trxVenta.Sopnumbe, _Conex.Usuario, "emitido", "emitido", eBinario, maquina.EnLetras(eBinario, _Param.tipoDoc) + DocumentoEmitido.ultimoMensaje, String.Empty); } else msj = "No se puede generar porque no está Contabilizado o está Anulado."; ReportProgress(i * 100 / trxVenta.RowCount, "Doc:" + trxVenta.Sopnumbe + " " + DocumentoEmitido.ultimoMensaje + maquina.ultimoMensaje + msj + "\r\n"); i++; } while (trxVenta.MoveNext() && errores < 10); e.Result = "Generación de Pdfs finalizado! \r\n"; ReportProgress(100, ""); }
/// <summary> /// Ejecuta la generación de documentos xml: factura, boleta, nc, nd /// </summary> public async Task GeneraDocumentoXmlAsync() { try { String msj = String.Empty; trxVenta.Rewind(); //move to first record int errores = 0; int i = 1; cfdReglasFacturaXml DocVenta = new cfdReglasFacturaXml(_Conex, _Param); //log de facturas xml emitidas y anuladas ReglasME maquina = new ReglasME(_Param); ValidadorXML validadorxml = new ValidadorXML(_Param); TransformerXML loader = new TransformerXML(); OnProgreso(1, "INICIANDO EMISION DE COMPROBANTES DE VENTA..."); //Notifica al suscriptor do { msj = String.Empty; try { String accion = "EMITE XML Y PDF"; if (trxVenta.Estado.Equals("no emitido") && maquina.ValidaTransicion(_Param.tipoDoc, accion, trxVenta.EstadoActual, "emitido/impreso") && trxVenta.EstadoContabilizado.Equals("contabilizado")) { if (trxVenta.Voidstts == 0) //documento no anulado { trxVenta.ArmarDocElectronico(); var proxy = new HttpClient { BaseAddress = new Uri(ConfigurationManager.AppSettings["UrlOpenInvoicePeruApi"]) }; string metodoApi = string.Empty; switch (trxVenta.DocElectronico.TipoDocumento) { case "07": metodoApi = "api/GenerarNotaCredito"; if (trxVenta.DocElectronico.Relacionados.Count() == 0) { msj = "La nota de crédito no está aplicada."; continue; } else { if (trxVenta.DocElectronico.Relacionados .Where(f => f.NroDocumento.Substring(0, 1) == trxVenta.DocElectronico.IdDocumento.Substring(0, 1)).Count() != trxVenta.DocElectronico.Relacionados.Count()) { msj = "La serie de la nota de crédito y de la factura aplicada deben empezar con la misma letra: F o B."; continue; } } if (trxVenta.DocElectronico.Discrepancias.Count() == 0) { msj = "No ha informado la causa de la discrepancia en la nota de crédito."; continue; } break; case "08": metodoApi = "api/GenerarNotaDebito"; break; case "01": metodoApi = "api/GenerarFactura"; break; case "03": //boleta metodoApi = "api/GenerarFactura"; break; default: metodoApi = "No existe API para el tipo de documento: " + trxVenta.DocElectronico.TipoDocumento; throw new ApplicationException(metodoApi); //break; } var response = await proxy.PostAsJsonAsync(metodoApi, trxVenta.DocElectronico); response.EnsureSuccessStatusCode(); var respuesta = await response.Content.ReadAsAsync <DocumentoResponse>(); if (!respuesta.Exito) { throw new ApplicationException(respuesta.MensajeError); } if (!_Param.seguridadIntegrada) { String RutaArchivo = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"{trxVenta.DocElectronico.IdDocumento}sf.xml"); byte[] bTramaXmlSinFirma = Convert.FromBase64String(respuesta.TramaXmlSinFirma); File.WriteAllBytes(RutaArchivo, bTramaXmlSinFirma); } await FirmaYEnviaASunat(respuesta.TramaXmlSinFirma, trxVenta.DocElectronico.TipoDocumento, trxVenta.DocElectronico.IdDocumento, trxVenta.DocElectronico.Emisor.NroDocumento, false, false, false); //if (!_Param.seguridadIntegrada) //{ // String RutaArchivox = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"{trxVenta.DocElectronico.IdDocumento}.xml"); // byte[] bTramaXmlFirmado = Convert.FromBase64String(tramaXmlFirmado); // File.WriteAllBytes(RutaArchivox, bTramaXmlFirmado); //} //Guardar el comprobante como emitido rechazado bool ebinarioErr = int.Parse(_codigoRespuesta) >= 2000 && int.Parse(_codigoRespuesta) < 4000; //Guarda el archivo xml, genera el pdf. //Luego anota en la bitácora la factura emitida o el error al generar cbb o pdf. DocVenta.AlmacenaEnRepositorio(trxVenta, Encoding.UTF8.GetString(Convert.FromBase64String(tramaXmlFirmado)), maquina, tramaXmlFirmado, tramaZipCdr, "FAC", nombreArchivoCdr, _Param.tipoDoc, accion, !ebinarioErr); } else //si el documento está anulado en gp, agregar al log como emitido { maquina.ValidaTransicion("FACTURA", "ANULA VENTA", trxVenta.EstadoActual, "emitido"); msj = "Anulado en GP y marcado como emitido."; DocVenta.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, "Anulado en GP", "0", _Conex.Usuario, "", "emitido", maquina.eBinarioNuevo, msj.Trim()); } } } catch (HttpRequestException he) { msj = string.Concat(he.Message, Environment.NewLine, he.StackTrace); errores++; } catch (ApplicationException ae) { msj = ae.Message + Environment.NewLine + ae.StackTrace; errores++; } catch (IOException io) { msj = "Excepción al revisar la carpeta/archivo: " + trxVenta.Ruta_clave + " Verifique su existencia y privilegios." + Environment.NewLine + io.Message + Environment.NewLine; errores++; } catch (Exception lo) { string imsj = lo.InnerException == null ? "" : lo.InnerException.ToString(); msj = lo.Message + " " + imsj + Environment.NewLine + lo.StackTrace; errores++; } finally { OnProgreso(i * 100 / trxVenta.RowCount, "Doc:" + trxVenta.Sopnumbe + " " + msj.Trim() + Environment.NewLine); //Notifica al suscriptor i++; } } while (trxVenta.MoveNext() && errores < 10); } catch (Exception xw) { string imsj = xw.InnerException == null ? "" : xw.InnerException.ToString(); this.ultimoMensaje = xw.Message + " " + imsj + Environment.NewLine + xw.StackTrace; } finally { OnProgreso(100, ultimoMensaje); } OnProgreso(100, "Proceso finalizado!"); }
public async Task ProcesaBajaComprobante(String motivoBaja) { try { String msj = String.Empty; String eBinario = String.Empty; trxVenta.Rewind(); //move to first record int errores = 0; int i = 1; cfdReglasFacturaXml DocVenta = new cfdReglasFacturaXml(_Conex, _Param); //log de facturas xml emitidas y anuladas ReglasME maquina = new ReglasME(_Param); OnProgreso(1, "INICIANDO BAJA DE DOCUMENTO..."); //Notifica al suscriptor do { msj = String.Empty; try { String accion = "DAR DE BAJA"; if (maquina.ValidaTransicion(_Param.tipoDoc, accion, trxVenta.EstadoActual, "baja solicitada")) { eBinario = maquina.eBinarioNuevo; trxVenta.ArmarBaja(motivoBaja); var proxy = new HttpClient { BaseAddress = new Uri(ConfigurationManager.AppSettings["UrlOpenInvoicePeruApi"]) }; var response = await proxy.PostAsJsonAsync("api/GenerarComunicacionBaja", trxVenta.DocumentoBaja); response.EnsureSuccessStatusCode(); var respuesta = await response.Content.ReadAsAsync <DocumentoResponse>(); if (!respuesta.Exito) { throw new ApplicationException(respuesta.MensajeError); } if (!_Param.seguridadIntegrada) { String RutaArchivo = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"{trxVenta.DocumentoBaja.IdDocumento}sf.xml"); byte[] bTramaXmlSinFirma = Convert.FromBase64String(respuesta.TramaXmlSinFirma); File.WriteAllBytes(RutaArchivo, bTramaXmlSinFirma); } await FirmaYEnviaASunat(respuesta.TramaXmlSinFirma, string.Empty, trxVenta.DocumentoBaja.IdDocumento, trxVenta.DocumentoBaja.Emisor.NroDocumento, false, false, true); DocVenta.AlmacenaEnRepositorio(trxVenta, Encoding.UTF8.GetString(Convert.FromBase64String(respuesta.TramaXmlSinFirma)), maquina, tramaXmlFirmado, String.Empty, nroTicket, String.Empty, _Param.tipoDoc, accion, true); DocVenta.ActualizaFacturaEmitida(trxVenta.Soptype, trxVenta.Sopnumbe, _Conex.Usuario, "emitido", "emitido", eBinario, maquina.EnLetras(eBinario, _Param.tipoDoc), nroTicket); } } catch (HttpRequestException he) { msj = string.Concat(he.Message, Environment.NewLine, he.StackTrace); errores++; } catch (ApplicationException ae) { msj = ae.Message + Environment.NewLine + ae.StackTrace; errores++; } catch (IOException io) { msj = "Excepción al revisar la carpeta/archivo: " + trxVenta.Ruta_clave + " Verifique su existencia y privilegios." + Environment.NewLine + io.Message + Environment.NewLine; errores++; } catch (Exception lo) { string imsj = lo.InnerException == null ? "" : lo.InnerException.ToString(); msj = lo.Message + " " + imsj + Environment.NewLine + lo.StackTrace; errores++; } finally { OnProgreso(i * 100 / trxVenta.RowCount, "Doc:" + trxVenta.Sopnumbe + " " + msj.Trim() + " " + maquina.ultimoMensaje + Environment.NewLine); //Notifica al suscriptor i++; } } while (trxVenta.MoveNext() && errores < 10 && i < 2); //Dar de baja uno por uno } catch (Exception xw) { string imsj = xw.InnerException == null ? "" : xw.InnerException.ToString(); this.ultimoMensaje = xw.Message + " " + imsj + Environment.NewLine + xw.StackTrace; } finally { OnProgreso(100, ultimoMensaje); } OnProgreso(100, "Proceso finalizado!"); }
public async Task ProcesaConsultaCDR() { try { String msj = String.Empty; String eBinario = String.Empty; trxVenta.Rewind(); //move to first record int errores = 0; int i = 1; cfdReglasFacturaXml DocVenta = new cfdReglasFacturaXml(_Conex, _Param); //log de facturas xml emitidas y anuladas ReglasME maquina = new ReglasME(_Param); OnProgreso(1, "INICIANDO CONSULTA DE CDRs..."); //Notifica al suscriptor do { msj = String.Empty; try { String ticket = trxVenta.Regimen; String td = !trxVenta.Docid.Equals("RESUMEN") ? _Param.tipoDoc : trxVenta.Docid; String accion = "CONSULTA CDR"; if (maquina.ValidaTransicion(td, accion, trxVenta.EstadoActual, "consulta a la sunat")) { if (trxVenta.Voidstts == 0) //documento no anulado { await ConsultaCDR(ticket, trxVenta.Sopnumbe, trxVenta.Rfc); if (_codigoRespuesta.Equals("0")) //aceptada { eBinario = maquina.eBinarioNuevo; _mensajeSunat = string.IsNullOrEmpty(_mensajeSunat) ? "Consulta CDR OK" : _mensajeSunat; } else //if (!_consultaCDRExito) { eBinario = maquina.eBinActualConError; errores++; } DocVenta.AlmacenaEnRepositorio(trxVenta, _mensajeSunat, maquina, string.Empty, tramaZipCdr, ticket, string.Concat(trxVenta.Sopnumbe, nombreArchivoCdr), td, accion, _codigoRespuesta.Equals("0")); DocVenta.ActualizaFacturaEmitida(trxVenta.Soptype, trxVenta.Sopnumbe, _Conex.Usuario, "emitido", "emitido", eBinario, maquina.EnLetras(eBinario, td) + _mensajeSunat, ticket); } } } catch (ApplicationException ae) { msj = ae.Message + Environment.NewLine + ae.StackTrace; errores++; } catch (IOException io) { msj = "Excepción al revisar la carpeta/archivo: " + trxVenta.Ruta_clave + " Verifique su existencia y privilegios." + Environment.NewLine + io.Message + Environment.NewLine; errores++; } catch (Exception lo) { string imsj = lo.InnerException == null ? "" : lo.InnerException.ToString(); msj = lo.Message + " " + imsj + Environment.NewLine + lo.StackTrace; errores++; } finally { OnProgreso(i * 100 / trxVenta.RowCount, "Doc:" + trxVenta.Sopnumbe + " " + msj.Trim() + " " + maquina.ultimoMensaje + Environment.NewLine); //Notifica al suscriptor i++; } } while (trxVenta.MoveNext() && errores < 10); } catch (Exception xw) { string imsj = xw.InnerException == null ? "" : xw.InnerException.ToString(); this.ultimoMensaje = xw.Message + " " + imsj + Environment.NewLine + xw.StackTrace; } finally { OnProgreso(100, ultimoMensaje); } OnProgreso(100, "PROCESO FINALIZADO!"); }
/// <summary> /// Ejecuta la generación del resumen de boletas /// </summary> public async Task GeneraResumenXmlAsync() { try { String msj = String.Empty; trxVenta.Rewind(); //move to first record int errores = 0; int i = 1; cfdReglasFacturaXml DocVenta = new cfdReglasFacturaXml(_Conex, _Param); //log de facturas xml emitidas y anuladas ReglasME maquina = new ReglasME(_Param); OnProgreso(1, "INICIANDO ENVIO DE RESUMEN..."); //Notifica al suscriptor do { msj = String.Empty; try { String accion = "ENVIA RESUMEN"; if (maquina.ValidaTransicion("RESUMEN", accion, trxVenta.EstadoActual, "emitido/enviado a la sunat")) { if (trxVenta.Voidstts == 0) //documento no anulado { trxVenta.ArmarResumenElectronico(); var cAgrupados = trxVenta.ResumenElectronico.Resumenes.GroupBy(y => y.IdDocumento, (key, num) => new { id = key, cantidad = num.Count() }); var c = cAgrupados.Where(q => q.cantidad > 1); if (c.Count() > 0) { throw new ApplicationException("La siguiente nota de crédito o débito aplica a más de un comprobante: " + c.First().id + " Ingrese a GP y aplique un solo comprobante."); } var proxy = new HttpClient { BaseAddress = new Uri(ConfigurationManager.AppSettings["UrlOpenInvoicePeruApi"]) }; var response = await proxy.PostAsJsonAsync("api/GenerarResumenDiario/v2", trxVenta.ResumenElectronico); response.EnsureSuccessStatusCode(); var respuesta = await response.Content.ReadAsAsync <DocumentoResponse>(); if (!respuesta.Exito) { throw new ApplicationException(respuesta.MensajeError); } if (!_Param.seguridadIntegrada) { String RutaArchivo = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"{trxVenta.ResumenElectronico.IdDocumento}sf.xml"); byte[] bTramaXmlSinFirma = Convert.FromBase64String(respuesta.TramaXmlSinFirma); File.WriteAllBytes(RutaArchivo, bTramaXmlSinFirma); } await FirmaYEnviaASunat(respuesta.TramaXmlSinFirma, String.Empty, trxVenta.ResumenElectronico.IdDocumento, trxVenta.ResumenElectronico.Emisor.NroDocumento, true, false, false); //Guarda el archivo xml, genera el cbb y el pdf. //Luego anota en la bitácora la factura emitida o el error al generar cbb o pdf. DocVenta.AlmacenaEnRepositorio(trxVenta, Encoding.UTF8.GetString(Convert.FromBase64String(respuesta.TramaXmlSinFirma)), maquina, tramaXmlFirmado, String.Empty, nroTicket, String.Empty, "RESUMEN", accion, true); } } } catch (HttpRequestException he) { msj = string.Concat(he.Message, Environment.NewLine, he.StackTrace); errores++; } catch (ApplicationException ae) { msj = ae.Message + Environment.NewLine + ae.StackTrace; errores++; } catch (IOException io) { msj = "Excepción al revisar la carpeta/archivo: " + trxVenta.Ruta_clave + " Verifique su existencia y privilegios." + Environment.NewLine + io.Message + Environment.NewLine; errores++; } catch (Exception lo) { string imsj = lo.InnerException == null ? "" : lo.InnerException.ToString(); msj = lo.Message + " " + imsj + Environment.NewLine + lo.StackTrace; errores++; } finally { OnProgreso(i * 100 / trxVenta.RowCount, "Doc:" + trxVenta.Sopnumbe + " " + msj.Trim() + " " + maquina.ultimoMensaje + Environment.NewLine); //Notifica al suscriptor i++; } } while (trxVenta.MoveNext() && errores < 10); } catch (Exception xw) { string imsj = xw.InnerException == null ? "" : xw.InnerException.ToString(); this.ultimoMensaje = xw.Message + " " + imsj + Environment.NewLine + xw.StackTrace; } finally { OnProgreso(100, ultimoMensaje); } OnProgreso(100, "Proceso finalizado!"); }
/// <summary> /// Ejecuta la generación de archivos xml y pdf en un thread independiente /// </summary> /// <param name="e">trxVentas</param> protected override void OnDoWork(DoWorkEventArgs e) { try { String msj = String.Empty; ReportProgress(0, "Revisando configuración...\r\n"); object[] args = e.Argument as object[]; vwCfdTransaccionesDeVenta trxVenta = (vwCfdTransaccionesDeVenta)args[0]; trxVenta.Rewind(); //move to first record int errores = 0; int i = 1; string antiguoIdCertificado = ""; XmlDocument sello = new XmlDocument(); TecnicaDeEncriptacion criptografo = null; XmlDocument comprobante = new XmlDocument(); XmlDocumentFragment addenda; cfdReglasFacturaXml DocVenta = new cfdReglasFacturaXml(_Conex, _Param); //log de facturas xml emitidas y anuladas ReglasME maquina = new ReglasME(_Param); ValidadorXML validadorxml = new ValidadorXML(_Param); TransformerXML loader = new TransformerXML(_Param); PAC representanteSat = new PAC(trxVenta.Ruta_clavePac, trxVenta.Contrasenia_clavePac, _Param); String Sello = string.Empty; ReportProgress(0, "Iniciando proceso...\r\n"); do { _Param.PrefijoDefaultFactura = trxVenta.Sopnumbe.Substring(_Param.PosicionPrefijoFactura, 1); msj = String.Empty; try { if (CancellationPending) { e.Cancel = true; return; } if (trxVenta.Estado.Equals("no emitido") && maquina.ValidaTransicion(_Param.tipoDoc, "EMITE XML Y PDF", trxVenta.EstadoActual, "emitido/impreso")) { if (trxVenta.Voidstts == 0) //documento no anulado { //Cargar los datos del certificado por cada nuevo Id de certificado asociado al documento de venta if (!trxVenta.ID_Certificado.Equals(antiguoIdCertificado)) { criptografo = new TecnicaDeEncriptacion(trxVenta.Ruta_clave, trxVenta.Contrasenia_clave, trxVenta.Ruta_certificado.Trim(), trxVenta.Ruta_certificado.Replace(".cer", ".pem").Trim()); antiguoIdCertificado = trxVenta.ID_Certificado; } comprobante.LoadXml(trxVenta.ComprobanteXml); comprobante.DocumentElement.SetAttribute("NoCertificado", criptografo.noCertificado); loader.getCadenaOriginal(comprobante); //Obtener cadena original del CFD Sello = criptografo.obtieneSello(loader.cadenaOriginal); //Crear el archivo xml y sellarlo comprobante.DocumentElement.SetAttribute("Sello", Sello); comprobante.DocumentElement.SetAttribute("Certificado", criptografo.certificadoFormatoPem); if (!_Conex.IntegratedSecurity) //para testeo: { comprobante.Save(new XmlTextWriter(trxVenta.Sopnumbe.Trim() + "tst.xml", Encoding.UTF8)); } validadorxml.ValidarXSD(comprobante); //Validar el esquema del archivo xml representanteSat.comprobanteFiscal = comprobante; representanteSat.timbraCFD(); //agregar sello al comprobante //Agregar el nodo addenda si existe if (trxVenta.Addenda != null && trxVenta.Addenda.Length > 0) { addenda = comprobante.CreateDocumentFragment(); addenda.InnerXml = trxVenta.Addenda; comprobante.DocumentElement.AppendChild(addenda); } //Guarda el archivo xml, genera el cbb y el pdf. //Luego anota en la bitácora la factura emitida o el error al generar cbb o pdf. DocVenta.AlmacenaEnRepositorio(trxVenta, comprobante, maquina, representanteSat.Uuid, Sello); //CodigoDeBarras cbb = new CodigoDeBarras(); //cbb.GenerarQRBidimensional(_Param.URLConsulta + "?&id=AABBCCDDEEFFGGHHIIOOPPQQRRSSTTUU&re=" + trxVenta.Rfc + "&rr=" + trxVenta.IdImpuestoCliente.Trim() + "&tt=" + trxVenta.Total.ToString() + "&fe=QWERTYU8" // , trxVenta.RutaXml.Trim() + "cbb\\cbbtest.jpg"); } else //si el documento está anulado en gp, agregar al log como emitido { maquina.ValidaTransicion("FACTURA", "ANULA VENTA", trxVenta.EstadoActual, "emitido"); msj = "Anulado en GP y marcado como emitido."; DocVenta.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, "Anulado en GP", "0", _Conex.Usuario, "", "emitido", maquina.eBinarioNuevo, msj.Trim()); } } } catch (Exception lo) { string imsj = lo.InnerException == null ? "" : lo.InnerException.ToString(); msj = lo.Message + " " + imsj + Environment.NewLine + comprobante.InnerXml; //lo.StackTrace; errores++; } finally { ReportProgress(i * 100 / trxVenta.RowCount, "Doc:" + trxVenta.Sopnumbe + " " + msj.Trim() + Environment.NewLine); i++; } } while (trxVenta.MoveNext() && errores < 10); } catch (Exception xw) { string imsj = xw.InnerException == null ? "" : xw.InnerException.ToString(); this.ultimoMensaje = xw.Message + " " + imsj + "\r\n" + xw.StackTrace; } finally { ReportProgress(100, ultimoMensaje); } e.Result = "Proceso finalizado! \r\n "; ReportProgress(100, ""); }
/// <summary> /// Ejecuta la generación de archivos xml y pdf en un thread independiente /// </summary> /// <param name="e">trxVentas</param> protected override void OnDoWork(DoWorkEventArgs e) { ReportProgress(0, "Iniciando proceso...\r\n"); object[] args = e.Argument as object[]; vwCfdTransaccionesDeVenta trxVenta = (vwCfdTransaccionesDeVenta)args[0]; trxVenta.Rewind(); //move to first record int errores = 0; int i = 1; string antiguoIdCertificado = ""; XmlDocument sello = new XmlDocument(); TecnicaDeEncriptacion criptografo = null; XmlDocument comprobante = new XmlDocument(); XmlDocumentFragment addenda; cfdReglasFacturaXml DocVenta = new cfdReglasFacturaXml(_Conex, _Param); //log de facturas xml emitidas y anuladas ReglasME maquina = new ReglasME(_Param); ValidadorXML validadorxml = new ValidadorXML(_Param); TransformerXML loader = new TransformerXML(); XslCompiledTransform xslCompilado = loader.Load(_Param.URLArchivoXSLT); PAC representanteSat = new PAC(trxVenta.Ruta_clavePac, trxVenta.Contrasenia_clavePac, _Param); ultimoMensaje = validadorxml.mensajeError; if (validadorxml.numErrores != 0 || DocVenta.numMensajeError != 0 || loader.numErrores != 0 || representanteSat.numErr != 0) { e.Result = validadorxml.mensajeError + " " + DocVenta.ultimoMensaje + " " + loader.mensajeError + " " + representanteSat.msjError + "\r\n"; ReportProgress(100, validadorxml.mensajeError + " " + DocVenta.ultimoMensaje + " " + loader.mensajeError + " " + representanteSat.msjError + "\r\n"); return; } do { if (CancellationPending) { e.Cancel = true; return; } if (trxVenta.Estado.Equals("no emitido") && maquina.ValidaTransicion(_Param.tipoDoc, "EMITE XML Y PDF", trxVenta.EstadoActual, "emitido/impreso")) { if (trxVenta.Voidstts == 0) //documento no anulado { //Cargar los datos del certificado por cada nuevo Id de certificado asociado al documento de venta if (!trxVenta.ID_Certificado.Equals(antiguoIdCertificado)) { criptografo = new TecnicaDeEncriptacion(trxVenta.Ruta_clave, trxVenta.Contrasenia_clave, trxVenta.Ruta_certificado.Trim(), trxVenta.Ruta_certificado.Replace(".cer", ".pem").Trim()); antiguoIdCertificado = trxVenta.ID_Certificado; } comprobante.LoadXml(trxVenta.ComprobanteXml); if (criptografo.numErrores == 0 && loader.getCadenaOriginal(comprobante, xslCompilado)) //Obtener cadena original del CFD { //Crear el archivo xml y sellarlo comprobante.DocumentElement.SetAttribute("sello", criptografo.obtieneSello(loader.cadenaOriginal)); comprobante.DocumentElement.SetAttribute("noCertificado", criptografo.noCertificado); comprobante.DocumentElement.SetAttribute("certificado", criptografo.certificadoFormatoPem); if (!_Conex.IntegratedSecurity) //para testeo: { comprobante.Save(new XmlTextWriter(trxVenta.Sopnumbe + "tst.xml", Encoding.UTF8)); } } if (loader.numErrores == 0 && criptografo.numErrores == 0 && validadorxml.ValidarXSD(comprobante)) //Validar el esquema del archivo xml { representanteSat.comprobanteFiscal = comprobante; representanteSat.timbraCFD(); //agregar sello al comprobante } else { errores++; } if (loader.numErrores == 0 && validadorxml.numErrores == 0 && criptografo.numErrores == 0 && representanteSat.numErr == 0) { //Agregar el nodo addenda si existe if (trxVenta.Addenda != null && trxVenta.Addenda.Length > 0) { addenda = comprobante.CreateDocumentFragment(); addenda.InnerXml = trxVenta.Addenda; comprobante.DocumentElement.AppendChild(addenda); } //Guarda el archivo xml, genera el cbb y el pdf. //Luego anota en la bitácora la factura emitida o el error al generar cbb o pdf. if (!DocVenta.AlmacenaEnRepositorio(trxVenta, comprobante, maquina, representanteSat.Uuid)) { errores++; } } else { errores++; } this.ultimoMensaje = criptografo.ultimoMensaje + " " + validadorxml.mensajeError + " " + DocVenta.ultimoMensaje + " " + loader.mensajeError + " " + representanteSat.msjError; } else //si el documento está anulado en gp, agregar al log como emitido { maquina.ValidaTransicion("FACTURA", "ANULA VENTA", trxVenta.EstadoActual, "emitido"); this.ultimoMensaje = "Anulado en GP y marcado como emitido."; DocVenta.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, "Anulado en GP", "0", _Conex.Usuario, "", "emitido", maquina.eBinarioNuevo, this.ultimoMensaje.Trim()); } } ReportProgress(i * 100 / trxVenta.RowCount, "Doc:" + trxVenta.Sopnumbe + " " + this.ultimoMensaje.Trim() + "\r\n"); i++; } while (trxVenta.MoveNext() && errores < 10); e.Result = "Generación de archivos finalizado! \r\n"; ReportProgress(100, ""); }