/// <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, ""); }
public async Task ProcesaObtienePDFAsync(ICfdiMetodosWebService servicioTimbre) { String msj = String.Empty; try { String eBinario = String.Empty; trxVenta.Rewind(); //move to first record int numRegistros = trxVenta.RowCount; int usuarioConAcceso = 1; int errores = 0; int i = 0; cfdReglasFacturaXml LogComprobante = new cfdReglasFacturaXml(_Conex, _Param); //log de facturas xml emitidas y anuladas OnProgreso(1, "INICIANDO CONSULTA DE PDFs..."); //Notifica al suscriptor do { string tipoMEstados = "DOCVENTA-" + trxVenta.EstadoContabilizado; trxVenta.CicloDeVida = new Maquina(trxVenta.EstadoActual, trxVenta.Regimen, trxVenta.Voidstts, "emisor", tipoMEstados); msj = String.Empty; String rutaNombrePDF = String.Empty; try { string nombreArchivo = ArmaNombreDeArchivo() + "_" + Maquina.eventoObtienePDF.ToString(); trxVenta.ArmarDocElectronico(string.Empty); //EjecutaEventoServicioImpuestosAcepta(servicioTimbre, LogComprobante, string.Empty, nombreArchivo, 1); string xmlFactura = await EjecutaEventoServicioImpuestosAceptaAsync(servicioTimbre, LogComprobante, nombreArchivo, ".xml", usuarioConAcceso); rutaNombrePDF = await EjecutaEventoObtienePDFAsync(servicioTimbre, LogComprobante, nombreArchivo, 1); } catch (IOException io) { msj = "Excepción al verificar acceso a 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 { i++; OnProgreso(100 * i / numRegistros, "Doc:" + trxVenta.Sopnumbe + " " + msj.Trim() + Environment.NewLine); //Notifica al suscriptor } } while (trxVenta.MoveNext() && errores < 10); } catch (Exception xw) { msj = string.Concat(xw.Message, " ", xw?.InnerException?.Message, Environment.NewLine, xw.StackTrace); } finally { OnProgreso(100, msj); } OnProgreso(100, "PROCESO FINALIZADO!"); }
private void EjecutaEventoServicioImpuestosRechaza(cfdReglasFacturaXml LogComprobante) { if (trxVenta.CicloDeVida.Transiciona(Maquina.eventoDIANRechaza, 1)) { LogComprobante.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, Maquina.eventoDIANRechaza.ToString(), trxVenta.CicloDeVida.idxTargetSingleStatus.ToString(), _Conex.Usuario, string.Empty, trxVenta.CicloDeVida.targetSingleStatus, trxVenta.CicloDeVida.targetBinStatus, trxVenta.CicloDeVida.EstadoEnPalabras(trxVenta.CicloDeVida.targetBinStatus)); LogComprobante.ActualizaFacturaEmitida(trxVenta.Soptype, trxVenta.Sopnumbe, _Conex.Usuario, Maquina.estadoBaseEmisor, Maquina.estadoBaseEmisor, trxVenta.CicloDeVida.targetBinStatus, trxVenta.CicloDeVida.EstadoEnPalabras(trxVenta.CicloDeVida.targetBinStatus), trxVenta.CicloDeVida.idxTargetSingleStatus.ToString()); } }
/// <summary> /// Ejecuta el envío de correos en un thread independiente /// </summary> /// <param name="e">trxVentas</param> protected override void OnDoWork(DoWorkEventArgs e) { int errores = 0; int i = 1; string asunto = ""; string cuerpo = ""; ReportProgress(0, "Iniciando proceso...\r\n"); object[] args = e.Argument as object[]; vwCfdTransaccionesDeVenta trxVenta = (vwCfdTransaccionesDeVenta)args[0]; cfdReglasEmail cliente = new cfdReglasEmail(_Conex, _Param); if (!cliente.SeccionesEmail(ref asunto, ref cuerpo)) { e.Result = "No puede enviar e-mails \r\n"; ReportProgress(100, cliente.ultimoMensaje + "\r\n"); return; } //log de facturas xml emitidas y anuladas cfdReglasFacturaXml doc = new cfdReglasFacturaXml(_Conex, _Param); EmailSmtp mail = new EmailSmtp(_Param.emailSmtp, _Param.emailPort, _Param.emailUser, _Param.emailPwd, _Param.emailSsl); ReglasME maquina = new ReglasME(_Param); string eBinario = ""; trxVenta.Rewind(); //move to first record do { if (CancellationPending) { e.Cancel = true; return; } if (trxVenta.Voidstts == 0) //documento no anulado { if (maquina.ValidaTransicion(_Param.tipoDoc, "ENVIA EMAIL", trxVenta.EstadoActual, "enviado")) { if (!cliente.ProcesaEnvioMail(mail, trxVenta.CUSTNMBR, trxVenta.Docid, trxVenta.Soptype, trxVenta.Sopnumbe, trxVenta.NombreCliente, trxVenta.EstadoActual, maquina.eBinarioNuevo, trxVenta.Mensaje, asunto, cuerpo)) { eBinario = maquina.eBinActualConError; errores++; } else { eBinario = maquina.eBinarioNuevo; } doc.ActualizaFacturaEmitida(trxVenta.Soptype, trxVenta.Sopnumbe, _Conex.Usuario, "emitido", "emitido", eBinario, maquina.EnLetras(eBinario) + cliente.ultimoMensaje); } } ReportProgress(i * 100 / trxVenta.RowCount, "Doc:" + trxVenta.Sopnumbe + " " + cliente.ultimoMensaje + maquina.ultimoMensaje + "\r\n"); i++; cliente.ultimoMensaje = ""; } while (trxVenta.MoveNext() && errores < 10); e.Result = "Envío de Emails finalizado! \r\n"; ReportProgress(100, ""); }
private void EjecutaEventoEmite(cfdReglasFacturaXml LogComprobante, string nombreArchivo, string extension, int usuarioConAcceso) { if (trxVenta.CicloDeVida.Transiciona(Maquina.eventoGeneraYEnviaXml, usuarioConAcceso)) { string rutaYNombreArchivo = Path.Combine(trxVenta.RutaXml.Trim(), nombreArchivo + extension); LogComprobante.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, rutaYNombreArchivo, trxVenta.CicloDeVida.idxTargetSingleStatus.ToString(), _Conex.Usuario, string.Empty, trxVenta.CicloDeVida.targetSingleStatus, trxVenta.CicloDeVida.targetBinStatus, trxVenta.CicloDeVida.EstadoEnPalabras(trxVenta.CicloDeVida.targetBinStatus)); } }
public async Task ProcesaEnviaCorreoAsync(ICfdiMetodosWebService servicioTimbre) { String msj = String.Empty; try { String eBinario = String.Empty; trxVenta.Rewind(); //move to first record int numRegistros = trxVenta.RowCount; int usuarioConAcceso = 1; int errores = 0; int i = 0; cfdReglasFacturaXml LogComprobante = new cfdReglasFacturaXml(_Conex, _Param); //log de facturas xml emitidas y anuladas cfdReglasEmail dirCorreos = new cfdReglasEmail(_Conex, _Param); OnProgreso(1, "INICIANDO ENVIO DE CORREOS..."); //Notifica al suscriptor do { string tipoMEstados = "DOCVENTA-" + trxVenta.EstadoContabilizado; trxVenta.CicloDeVida = new Maquina(trxVenta.EstadoActual, trxVenta.Regimen, trxVenta.Voidstts, "emisor", tipoMEstados); msj = String.Empty; try { trxVenta.ArmarDocElectronico(string.Empty); msj = await EjecutaEventoEnviaCorreoAsync(servicioTimbre, LogComprobante, dirCorreos, usuarioConAcceso); } catch (Exception lo) { string imsj = lo.InnerException == null ? "" : lo.InnerException.ToString(); msj = lo.Message + " " + imsj + Environment.NewLine + lo.StackTrace; errores++; } finally { i++; OnProgreso(100 * i / numRegistros, "Doc:" + trxVenta.Sopnumbe + " " + msj.Trim() + Environment.NewLine); //Notifica al suscriptor } } while (trxVenta.MoveNext() && errores < 10); } catch (Exception xw) { msj = string.Concat(xw.Message, " ", xw?.InnerException?.Message, Environment.NewLine, xw.StackTrace); } finally { OnProgreso(100, msj); } OnProgreso(100, "PROCESO FINALIZADO!"); }
public bool ProcesaEnvioMail(EmailSmtp mail, string custnmbr, string docId, short Soptype, string Sopnumbe, string nombreCliente, string eBinarioActual, string eBinarioNuevo, string Mensaje, string asunto, string cuerpo) { cfdReglasFacturaXml doc = new cfdReglasFacturaXml(_Conexion, _Param); //log de facturas xml emitidas y anuladas List <string> Adjunto = new List <string>(); DireccionesEmail dir = this.ObtieneDirecciones(custnmbr); string nombreArchivo = Utiles.FormatoNombreArchivo(docId + Sopnumbe + "_" + custnmbr, nombreCliente, 20); //Si hay error al obtener direcciones, no continuar if (ultimoMensaje.Equals(string.Empty)) { if (_Param.emite) { Adjunto.Add(Mensaje.Replace("Almacenado en ", "") + "." + _Param.emailAdjEmite); //xml o zip } if (_Param.imprime) { Adjunto.Add(Mensaje.Replace("Almacenado en ", "") + "." + _Param.emailAdjImprm); //pdf } if (mail.SendMessage(Utiles.Derecha(dir.mailTo, dir.mailTo.Length - 1), _Param.emailAccount, asunto.Trim() + " (" + nombreArchivo + ")", cuerpo, Utiles.Derecha(dir.mailCC, dir.mailCC.Length - 1), Utiles.Derecha(dir.mailCCO, dir.mailCCO.Length - 1), _Param.replyto, Adjunto)) { doc.RegistraLogDeArchivoXML(Soptype, Sopnumbe, "E-mail enviado.", "0", _Conexion.Usuario, "", "enviado", eBinarioNuevo, "E-mail enviado el " + DateTime.Today.ToString()); } else { numMensajeError++; } } else { numMensajeError++; } ultimoMensaje = ultimoMensaje + mail.ultimoMensaje + doc.ultimoMensaje; return(ultimoMensaje.Equals(string.Empty)); }
public async Task <string> ProcesaConsultaStatusAsync(ICfdiMetodosWebService servicioTimbre) { string statusActual = string.Empty; String msj = String.Empty; try { trxVenta.Rewind(); //move to first record int usuarioConAcceso = 1; int numRegistros = trxVenta.RowCount; string extension = ".xml"; int errores = 0; int i = 0; cfdReglasFacturaXml LogComprobante = new cfdReglasFacturaXml(_Conex, _Param); //log de facturas xml emitidas y anuladas OnProgreso(1, "INICIANDO CONSULTA DE STATUS..."); //Notifica al suscriptor do { string tipoMEstados = "DOCVENTA-" + trxVenta.EstadoContabilizado; trxVenta.CicloDeVida = new Maquina(trxVenta.EstadoActual, trxVenta.Regimen, trxVenta.Voidstts, "emisor", tipoMEstados); msj = String.Empty; cfdReglasEmail dirCorreos = new cfdReglasEmail(_Conex, _Param); try { trxVenta.ArmarDocElectronico(string.Empty); statusActual = await servicioTimbre.ConsultaStatusAlOSEAsync(trxVenta.DocGP.DocVenta.consecutivoDocumento, trxVenta.Ruta_certificadoPac, trxVenta.Ruta_clavePac, trxVenta.DocGP.DocVenta.tipoDocumento, trxVenta.DocGP.DocVenta.prefijo, trxVenta.DocGP.DocVenta.consecutivoDocumento); String[] codigoYMensaje = statusActual.Split(new char[] { '-' }); int evento = Maquina.eventoNoHaceNada; //Determina evento en base al resultado del ws switch (codigoYMensaje[0]) { //case "z01": // evento = Maquina.eventoAcuseAceptado; // EjecutaEvento(evento, servicioTimbre, LogComprobante, 1); // break; //case "z02": // evento = Maquina.eventoAcuseRechazado; // EjecutaEvento(evento, servicioTimbre, LogComprobante, 1); // break; case "200": string nombreArchivo = ArmaNombreDeArchivo() + "_" + Maquina.eventoDIANAcepta.ToString(); string rutaYNombreArchivo = string.Empty; EjecutaEventoEmite(LogComprobante, nombreArchivo, extension, usuarioConAcceso); string xmlFactura = await EjecutaEventoServicioImpuestosAceptaAsync(servicioTimbre, LogComprobante, nombreArchivo, extension, usuarioConAcceso); rutaYNombreArchivo = await EjecutaEventoObtienePDFAsync(servicioTimbre, LogComprobante, nombreArchivo, usuarioConAcceso); EjecutaEvento(Maquina.eventoEnviaCorreo, servicioTimbre, LogComprobante, usuarioConAcceso, string.Empty); // msj = await EjecutaEventoEnviaCorreoAsync(servicioTimbre, LogComprobante, dirCorreos, usuarioConAcceso); break; default: evento = Maquina.eventoNoHaceNada; EjecutaEvento(evento, servicioTimbre, LogComprobante, 1, string.Empty); break; } msj = "Status: " + statusActual; } catch (Exception lo) { string imsj = lo.InnerException == null ? "" : lo.InnerException.ToString(); msj = lo.Message + " " + imsj + Environment.NewLine + lo.StackTrace; errores++; } finally { i++; OnProgreso(100 * i / numRegistros, "Doc:" + trxVenta.Sopnumbe + " " + msj.Trim() + Environment.NewLine); //Notifica al suscriptor } } while (trxVenta.MoveNext() && errores < 10); } catch (Exception xw) { msj = string.Concat(xw.Message, " ", xw?.InnerException?.Message, Environment.NewLine, xw.StackTrace); } finally { OnProgreso(100, msj); } OnProgreso(100, "PROCESO FINALIZADO!"); return(statusActual); }
private void EjecutaEvento(int Evento, ICfdiMetodosWebService servicioTimbre, cfdReglasFacturaXml LogComprobante, int usuarioConAcceso, string docXml) { if (trxVenta.CicloDeVida.Transiciona(Evento, usuarioConAcceso)) { LogComprobante.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, Evento.ToString(), trxVenta.CicloDeVida.idxTargetSingleStatus.ToString(), _Conex.Usuario, docXml, trxVenta.CicloDeVida.targetSingleStatus, trxVenta.CicloDeVida.targetBinStatus, trxVenta.CicloDeVida.EstadoEnPalabras(trxVenta.CicloDeVida.targetBinStatus)); LogComprobante.ActualizaFacturaEmitida(trxVenta.Soptype, trxVenta.Sopnumbe, _Conex.Usuario, Maquina.estadoBaseEmisor, Maquina.estadoBaseEmisor, trxVenta.CicloDeVida.targetBinStatus, trxVenta.CicloDeVida.EstadoEnPalabras(trxVenta.CicloDeVida.targetBinStatus), trxVenta.CicloDeVida.idxTargetSingleStatus.ToString()); } }
private async Task <string> EjecutaEventoEnviaCorreoAsync(ICfdiMetodosWebService servicioTimbre, cfdReglasFacturaXml LogComprobante, cfdReglasEmail dirCorreos, int usuarioConAcceso) { string resultado = string.Empty; if (trxVenta.CicloDeVida.Transiciona(Maquina.eventoEnviaCorreo, usuarioConAcceso)) { DireccionesEmail dir = dirCorreos.ObtieneDirecciones(trxVenta.CUSTNMBR); string correos = string.Concat(Utiles.Derecha(dir.mailTo, dir.mailTo.Length - 1), dir.mailCC, dir.mailCCO); String[] acorreos = correos.Split(new char[] { ',' }); if (acorreos.Count() > 0) { resultado = await servicioTimbre.EnviaCorreoAsync(trxVenta.DocGP.DocVenta.cliente_numeroIdentificacion, trxVenta.Ruta_certificadoPac, trxVenta.Ruta_clavePac, trxVenta.DocGP.DocVenta.prefijo, trxVenta.DocGP.DocVenta.consecutivoDocumento, acorreos[0]); LogComprobante.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, resultado, trxVenta.CicloDeVida.idxTargetSingleStatus.ToString(), _Conex.Usuario, string.Empty, trxVenta.CicloDeVida.targetSingleStatus, trxVenta.CicloDeVida.targetBinStatus, trxVenta.CicloDeVida.EstadoEnPalabras(trxVenta.CicloDeVida.targetBinStatus)); LogComprobante.ActualizaFacturaEmitida(trxVenta.Soptype, trxVenta.Sopnumbe, _Conex.Usuario, Maquina.estadoBaseEmisor, Maquina.estadoBaseEmisor, trxVenta.CicloDeVida.targetBinStatus, trxVenta.CicloDeVida.EstadoEnPalabras(trxVenta.CicloDeVida.targetBinStatus), trxVenta.CicloDeVida.idxTargetSingleStatus.ToString()); } else { resultado = "El cliente no tiene una dirección de correo configurada."; } } return(resultado); }
private async Task <string> EjecutaEventoObtienePDFAsync(ICfdiMetodosWebService servicioTimbre, cfdReglasFacturaXml LogComprobante, string nombreArchivo, int usuarioConAcceso) { string rutaYNombreArchivo = string.Empty; if (trxVenta.CicloDeVida.Transiciona(Maquina.eventoObtienePDF, usuarioConAcceso)) { rutaYNombreArchivo = await servicioTimbre.ObtienePDFdelOSEAsync(trxVenta.DocGP.DocVenta.cliente_numeroIdentificacion, trxVenta.Ruta_certificadoPac, trxVenta.Ruta_clavePac, trxVenta.DocGP.DocVenta.tipoDocumento, trxVenta.DocGP.DocVenta.prefijo, trxVenta.DocGP.DocVenta.consecutivoDocumento, trxVenta.RutaXml.Trim(), nombreArchivo, ".pdf"); LogComprobante.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, rutaYNombreArchivo, trxVenta.CicloDeVida.idxTargetSingleStatus.ToString(), _Conex.Usuario, string.Empty, trxVenta.CicloDeVida.targetSingleStatus, trxVenta.CicloDeVida.targetBinStatus, trxVenta.CicloDeVida.EstadoEnPalabras(trxVenta.CicloDeVida.targetBinStatus)); LogComprobante.ActualizaFacturaEmitida(trxVenta.Soptype, trxVenta.Sopnumbe, _Conex.Usuario, Maquina.estadoBaseEmisor, Maquina.estadoBaseEmisor, trxVenta.CicloDeVida.targetBinStatus, trxVenta.CicloDeVida.EstadoEnPalabras(trxVenta.CicloDeVida.targetBinStatus), trxVenta.CicloDeVida.idxTargetSingleStatus.ToString()); } return(rutaYNombreArchivo); }
private async Task <string> EjecutaEventoServicioImpuestosAceptaAsync(ICfdiMetodosWebService servicioTimbre, cfdReglasFacturaXml LogComprobante, string nombreArchivo, string extension, int usuarioConAcceso) { string rutaYNombreArchivo = string.Empty; string xmlFactura = string.Empty; if (trxVenta.CicloDeVida.Transiciona(Maquina.eventoDIANAcepta, usuarioConAcceso)) { xmlFactura = await servicioTimbre.ObtieneXMLdelOSEAsync(trxVenta.DocGP.DocVenta.cliente_numeroIdentificacion, trxVenta.Ruta_certificadoPac, trxVenta.Ruta_clavePac, trxVenta.DocGP.DocVenta.tipoDocumento, trxVenta.DocGP.DocVenta.prefijo, trxVenta.DocGP.DocVenta.consecutivoDocumento); if (!string.IsNullOrEmpty(xmlFactura)) { rutaYNombreArchivo = await LogComprobante.GuardaArchivoAsync(trxVenta, xmlFactura, nombreArchivo, extension, false); } LogComprobante.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, rutaYNombreArchivo, trxVenta.CicloDeVida.idxTargetSingleStatus.ToString(), _Conex.Usuario, xmlFactura.Replace("encoding=\"utf-8\"", "").Replace("encoding=\"UTF-8\"", "").Replace("encoding=\"iso-8859-1\"", ""), trxVenta.CicloDeVida.targetSingleStatus, trxVenta.CicloDeVida.targetBinStatus, trxVenta.CicloDeVida.EstadoEnPalabras(trxVenta.CicloDeVida.targetBinStatus)); LogComprobante.ActualizaFacturaEmitida(trxVenta.Soptype, trxVenta.Sopnumbe, _Conex.Usuario, Maquina.estadoBaseEmisor, Maquina.estadoBaseEmisor, trxVenta.CicloDeVida.targetBinStatus, trxVenta.CicloDeVida.EstadoEnPalabras(trxVenta.CicloDeVida.targetBinStatus), trxVenta.CicloDeVida.idxTargetSingleStatus.ToString()); } return(xmlFactura); }
private void EjecutaEventoServicioImpuestosAcepta(ICfdiMetodosWebService servicioTimbre, cfdReglasFacturaXml LogComprobante, int usuarioConAcceso, string xmlFactura) { if (trxVenta.CicloDeVida.Transiciona(Maquina.eventoDIANAcepta, usuarioConAcceso)) { LogComprobante.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, Maquina.eventoDIANAcepta.ToString(), trxVenta.CicloDeVida.idxTargetSingleStatus.ToString(), _Conex.Usuario, xmlFactura.Replace("encoding=\"utf-8\"", "").Replace("encoding=\"UTF-8\"", "").Replace("encoding=\"iso-8859-1\"", ""), trxVenta.CicloDeVida.targetSingleStatus, trxVenta.CicloDeVida.targetBinStatus, trxVenta.CicloDeVida.EstadoEnPalabras(trxVenta.CicloDeVida.targetBinStatus)); LogComprobante.ActualizaFacturaEmitida(trxVenta.Soptype, trxVenta.Sopnumbe, _Conex.Usuario, Maquina.estadoBaseEmisor, Maquina.estadoBaseEmisor, trxVenta.CicloDeVida.targetBinStatus, trxVenta.CicloDeVida.EstadoEnPalabras(trxVenta.CicloDeVida.targetBinStatus), trxVenta.CicloDeVida.idxTargetSingleStatus.ToString()); } }
public async Task ProcesaObtienePDFAsync(ICfdiMetodosWebService servicioTimbre) { 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); String accion = "IMPRIME PDF"; OnProgreso(1, "INICIANDO CONSULTA DE PDFs..."); //Notifica al suscriptor do { msj = String.Empty; String rutaNombrePDF = String.Empty; String ticket = trxVenta.Regimen; try { String[] serieCorrelativo = trxVenta.Sopnumbe.Split(new char[] { '-' }); string nombreArchivo = Utiles.FormatoNombreArchivo(trxVenta.Docid + trxVenta.Sopnumbe + "_" + trxVenta.s_CUSTNMBR, trxVenta.s_NombreCliente, 20) + "_CDR_" + accion.Substring(0, 2); if (maquina.ValidaTransicion(_Param.tipoDoc, accion, trxVenta.EstadoActual)) { if (trxVenta.Voidstts == 0 && trxVenta.EstadoContabilizado.Equals("contabilizado")) //no anulado y contabilizado { trxVenta.ArmarDocElectronico(string.Empty); rutaNombrePDF = await servicioTimbre.ObtienePDFdelOSEAsync(trxVenta.Rfc, trxVenta.Ruta_certificadoPac, trxVenta.Contrasenia_clavePac, trxVenta.DocGP.DocVenta.tipoDocumento, serieCorrelativo[0], serieCorrelativo[1], trxVenta.RutaXml.Trim(), nombreArchivo, ".pdf"); DocVenta.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, rutaNombrePDF, ticket, _Conex.Usuario, accion, maquina.DestinoStatusBase, maquina.DestinoEBinario, maquina.DestinoMensaje); DocVenta.ActualizaFacturaEmitida(trxVenta.Soptype, trxVenta.Sopnumbe, _Conex.Usuario, "emitido", "emitido", maquina.DestinoEBinario, maquina.DestinoMensaje, ticket); } else { msj = "No se puede generar porque no está Contabilizado o está Anulado."; } } } catch (ArgumentException ae) { msj = ae.Message + Environment.NewLine; //DocVenta.LogDocumento(trxVenta, msj, maquina, ticket, _Param.tipoDoc, accion, false, rutaNombrePDF); //DocVenta.ActualizaFacturaEmitida(trxVenta.Soptype, trxVenta.Sopnumbe, _Conex.Usuario, "emitido", "emitido", maquina.eBinActualConError, maquina.EnLetras(maquina.eBinActualConError, _Param.tipoDoc), ticket); 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!"); }
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> /// Genera documentos xml: factura, nc, nd /// </summary> public async Task GeneraDocumentoXmlAsync(ICfdiMetodosWebService servicioTimbre) { string rutaYNombreArchivo = string.Empty; String msj = String.Empty; try { trxVenta.Rewind(); //move to first record string leyendas = await vwCfdTransaccionesDeVenta.ObtieneLeyendasAsync(); int errores = 0; int i = 0; cfdReglasFacturaXml LogComprobante = new cfdReglasFacturaXml(_Conex, _Param); //log de facturas xml emitidas y anuladas OnProgreso(1, "INICIANDO EMISION DE COMPROBANTES DE VENTA..."); do { string tipoMEstados = "DOCVENTA-" + trxVenta.EstadoContabilizado; msj = String.Empty; try { trxVenta.CicloDeVida = new Maquina(trxVenta.EstadoActual, trxVenta.Regimen, trxVenta.Voidstts, "emisor", tipoMEstados); if (trxVenta.CicloDeVida.Transiciona(Maquina.eventoGeneraYEnviaXml, 1)) { trxVenta.ArmarDocElectronico(leyendas); string nombreArchivo = ArmaNombreDeArchivo() + "_" + Maquina.eventoGeneraYEnviaXml.ToString(); msj = ValidaDatosComprobante(); if (msj.ToLower().Equals("ok")) { msj = await EjecutaEventoEmiteAsync(servicioTimbre, LogComprobante, nombreArchivo, ".xml", 1); } } //if (trxVenta.Voidstts == 1) //documento anulado //{ // //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."; // OnProgreso(1, msj); // LogComprobante.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, "Anulado en GP", "0", _Conex.Usuario, "", "emitido", maquina.eBinarioNuevo, msj.Trim()); //} } catch (XmlException xm) { msj = "Verifique la configuración de leyendas para la impresión PDF. [GeneraDocumentoXmlAsync] " + xm.Message + Environment.NewLine + xm.StackTrace; LogComprobante.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, "GeneraDocumentoXmlAsync " + xm.Message, "errLeyendas", _Conex.Usuario, string.Empty, Maquina.estadoBaseError, trxVenta.CicloDeVida.binStatus, xm.StackTrace); errores++; } catch (DirectoryNotFoundException dnf) { msj = "El comprobante fue emitido, pero no se pudo guardar el archivo en: " + trxVenta.Ruta_clave + " Verifique si existe la carpeta." + Environment.NewLine; LogComprobante.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, msj, "errCarpeta", _Conex.Usuario, string.Empty, Maquina.estadoBaseError, trxVenta.CicloDeVida.binStatus, dnf.Message); msj += dnf.Message + Environment.NewLine; errores++; } catch (IOException io) { msj = "El comprobante fue emitido, pero no se pudo guardar el archivo en: " + trxVenta.Ruta_clave + " Verifique permisos a la carpeta." + Environment.NewLine; LogComprobante.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, msj, "errIO", _Conex.Usuario, string.Empty, Maquina.estadoBaseError, trxVenta.CicloDeVida.binStatus, io.Message); msj += io.Message + Environment.NewLine; errores++; } catch (Exception lo) { string imsj = lo.InnerException == null ? "" : lo.InnerException.ToString(); msj = lo.Message + " " + imsj + Environment.NewLine + lo.StackTrace; LogComprobante.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, lo.Message, "errDesconocido", _Conex.Usuario, string.Empty, Maquina.estadoBaseError, trxVenta.CicloDeVida.binStatus, lo.StackTrace); errores++; } finally { i++; OnProgreso(100 * i / trxVenta.RowCount, "Doc:" + trxVenta.Sopnumbe + " " + msj.Trim() + Environment.NewLine); //Notifica al suscriptor } } while (trxVenta.MoveNext() && errores < 10); msj = string.Empty; } catch (Exception xw) { string imsj = xw.InnerException == null ? "" : xw.InnerException.ToString(); msj = string.Concat(xw.Message, " ", xw?.InnerException?.Message, Environment.NewLine, xw.StackTrace); } finally { OnProgreso(100, msj); } OnProgreso(100, "Proceso finalizado!"); }
public async Task <string> ProcesaConsultaStatusAsync(ICfdiMetodosWebService servicioTimbre) { string statusActual = string.Empty; try { String msj = String.Empty; trxVenta.Rewind(); //move to first record int errores = 0; int i = 0; cfdReglasFacturaXml LogComprobante = new cfdReglasFacturaXml(_Conex, _Param); //log de facturas xml emitidas y anuladas string tipoMEstados = "DOCVENTA-" + trxVenta.EstadoContabilizado; trxVenta.CicloDeVida = new Maquina(trxVenta.EstadoActual, trxVenta.Regimen, trxVenta.Voidstts, "emisor", tipoMEstados); OnProgreso(1, "INICIANDO CONSULTA DE STATUS..."); //Notifica al suscriptor do { msj = String.Empty; try { trxVenta.ArmarDocElectronico(string.Empty); statusActual = await servicioTimbre.ConsultaStatusAlOSEAsync(trxVenta.DocGP.DocVenta.consecutivoDocumento, trxVenta.Ruta_certificadoPac, trxVenta.Ruta_clavePac, trxVenta.DocGP.DocVenta.tipoDocumento, trxVenta.DocGP.DocVenta.prefijo, trxVenta.DocGP.DocVenta.consecutivoDocumento); String[] codigoYMensaje = statusActual.Split(new char[] { '-' }); int evento = Maquina.eventoNoHaceNada; //Determina evento en base al resultado del ws switch (codigoYMensaje[0]) { case "z01": evento = Maquina.eventoAcuseAceptado; break; case "z02": evento = Maquina.eventoAcuseRechazado; break; default: evento = Maquina.eventoNoHaceNada; break; } EjecutaEvento(evento, servicioTimbre, LogComprobante, 1); msj = "Status: " + statusActual; } 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!"); return(statusActual); }
/// <summary> /// Ejecuta la generación de pdfs en un thread independiente /// </summary> /// <param name="e">trxVentas</param> protected override void OnDoWork(DoWorkEventArgs e) { string msj = ""; try { 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 = ""; cfdReglasFacturaXml DocumentoEmitido = null; ReglasME maquina = new ReglasME(_Param); trxVenta.Rewind(); //move to first record do { _Param.PrefijoDefaultFactura = trxVenta.Sopnumbe.Substring(_Param.PosicionPrefijoFactura, 1); DocumentoEmitido = new cfdReglasFacturaXml(_Conex, _Param); //log de facturas xml emitidas y anuladas 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))) { 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) + DocumentoEmitido.ultimoMensaje); } } 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, ""); } catch (Exception xw) { string imsj = xw.InnerException == null ? "" : xw.InnerException.ToString(); msj = xw.Message + " " + imsj + "\r\n" + xw.StackTrace; } finally { ReportProgress(100, msj); } e.Result = "Proceso finalizado! \r\n "; ReportProgress(100, ""); }
/// <summary> /// Genera documentos xml: factura, boleta, nc, nd /// </summary> public async Task GeneraDocumentoXmlAsync(ICfdiMetodosWebService servicioTimbre) { string xmlFactura = string.Empty; string rutaYNom = string.Empty; try { String msj = String.Empty; trxVenta.Rewind(); //un objeto que la lista de todas las facturas que a marcado el usuario para emitir //move to first record string leyendas = await vwCfdTransaccionesDeVenta.ObtieneLeyendasAsync(); 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..."); do { msj = String.Empty; String accion = "EMITE XML Y PDF"; try { if (//trxVenta.Estado.Equals("no emitido") && //maquina.ValidaTransicion(_Param.tipoDoc, accion, trxVenta.EstadoActual) && //trxVenta.EstadoContabilizado.Equals("contabilizado")// 1 == 1) { if (trxVenta.Voidstts == 0) //documento no anulado { trxVenta.ArmarDocElectronico(leyendas); //ver en la linea de abajo si va consecutivo documento. En el proyecto anterior figuraba idDocumento String[] serieCorrelativo = trxVenta.DocGP.DocVenta.consecutivoDocumento.Split(new char[] { '-' }); string nombreArchivo = Utiles.FormatoNombreArchivo(trxVenta.Docid + trxVenta.Sopnumbe + "_" + trxVenta.s_CUSTNMBR, trxVenta.s_NombreCliente, 20) + "_" + accion.Substring(0, 2); //validaciones switch (trxVenta.DocGP.DocVenta.tipoDocumento) { case "07": if (trxVenta.DocGP.LDocVentaRelacionados.Count() == 0) { msj = "La nota de crédito no está aplicada."; continue; } else { if (trxVenta.DocGP.LDocVentaRelacionados // ver si en la linea de abajo va consecutivoDocumento. Antes figuraba idDocumento .Where(f => f.sopnumbeTo.Substring(0, 1) == trxVenta.DocGP.DocVenta.consecutivoDocumento.Substring(0, 1)) .Count() != trxVenta.DocGP.LDocVentaRelacionados.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 (string.IsNullOrEmpty(trxVenta.DocGP.DocVenta.infoRelNotasCodigoTipoNota)) * { * msj = "No ha informado la causa de la discrepancia en la nota de crédito."; * continue; * } */ break; case "08": msj = "ok"; break; case "01": msj = "ok"; break; case "03": msj = "ok"; break; default: msj = "No se puede emitir porque el tipo de documento: " + trxVenta.DocGP.DocVenta.tipoDocumento + " no está configurado."; throw new ApplicationException(msj); } string extension = ".xml"; rutaYNom = Path.Combine(trxVenta.RutaXml.Trim(), nombreArchivo + extension); try { //ver si va consecutivoDocumento en la linea de abajo. antes estaba idDocumento //xmlFactura = await servicioTimbre.TimbraYEnviaASunatAsync(trxVenta.DocGP.DocVenta.consecutivoDocumento, trxVenta.Ruta_certificadoPac, trxVenta.Contrasenia_clavePac, trxVenta.DocGP); // la siguiente linea envia el metodo timbraYEnviaServivio>DeImpuesto envia el objeto armado con la factura al servicio web. xmlFactura = await servicioTimbre.TimbraYEnviaServicioDeImpuestoAsync(trxVenta.DocGP.DocVenta.consecutivoDocumento, trxVenta.Ruta_certificadoPac, trxVenta.Contrasenia_clavePac, trxVenta.DocGP); //xmlFactura = servicioTimbre.TimbraYEnviaServicioDeImpuesto(trxVenta.DocGP.DocVenta.consecutivoDocumento, trxVenta.Ruta_certificadoPac, trxVenta.Contrasenia_clavePac, trxVenta.DocGP); DocVenta.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, rutaYNom, "FAC", _Conex.Usuario, xmlFactura.Replace("encoding=\"utf-8\"", "").Replace("encoding=\"iso-8859-1\"", ""), maquina.DestinoStatusBase, maquina.DestinoEBinario, maquina.DestinoMensaje); } catch (ArgumentException ae) //202 ó 207 { msj = ae.Message; //ver si va consecutivoDocumento en la linea de abajo. antes estaba idDocumento xmlFactura = await servicioTimbre.ObtieneXMLdelOSEAsync(trxVenta.DocGP.DocVenta.consecutivoDocumento, trxVenta.Ruta_certificadoPac, trxVenta.Contrasenia_clavePac, trxVenta.DocGP.DocVenta.tipoDocumento, serieCorrelativo[0], serieCorrelativo[1]); DocVenta.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, rutaYNom, "FAC", _Conex.Usuario, xmlFactura.Replace("encoding=\"utf-8\"", "").Replace("encoding=\"iso-8859-1\"", ""), maquina.DestinoStatusBase, maquina.DestinoEBinario, maquina.DestinoMensaje); } catch (XmlException xm) { msj = "Verifique la configuración de leyendas para la impresión PDF. [GeneraDocumentoXmlAsync] " + xm.Message + Environment.NewLine + xm.StackTrace; DocVenta.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, "GeneraDocumentoXmlAsync " + xm.Message, "errLeyendas", _Conex.Usuario, string.Empty, "error", maquina.DestinoEBinario, xm.StackTrace); errores++; } catch (Exception lo) { msj = "[GeneraDocumentoXmlAsync] " + lo.Message + Environment.NewLine + lo.StackTrace; DocVenta.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, "GeneraDocumentoXmlAsync " + lo.Message, "errDFacture", _Conex.Usuario, string.Empty, "error", maquina.DestinoEBinario, lo.StackTrace); errores++; } if (!string.IsNullOrEmpty(xmlFactura)) {// se guarda el archivo xml en un lugar del servidor rutaYNom = await DocVenta.GuardaArchivoAsync(trxVenta, xmlFactura, nombreArchivo, extension, false); //ver si va consecutivoDocumento en la linea de abajo. antes estaba idDocumento //se obtiene el pdf string tPdf = await servicioTimbre.ObtienePDFdelOSEAsync(trxVenta.DocGP.DocVenta.consecutivoDocumento, trxVenta.Ruta_certificadoPac, trxVenta.Contrasenia_clavePac, trxVenta.DocGP.DocVenta.tipoDocumento, serieCorrelativo[0], serieCorrelativo[1], trxVenta.RutaXml.Trim(), nombreArchivo, ".pdf"); } } 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."; OnProgreso(1, msj); 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 (ArgumentException ae) { msj = ae.Message + Environment.NewLine + ae.StackTrace; errores++; } catch (TimeoutException ae) { string imsj = ae.InnerException == null ? "" : ae.InnerException.ToString(); msj = ae.Message + " " + imsj + Environment.NewLine + ae.StackTrace; errores++; } catch (DirectoryNotFoundException dnf) { msj = "El comprobante fue emitido, pero no se pudo guardar el archivo en: " + trxVenta.Ruta_clave + " Verifique si existe la carpeta." + Environment.NewLine; DocVenta.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, msj, "errCarpeta", _Conex.Usuario, string.Empty, "error", maquina.DestinoEBinario, dnf.Message); msj += dnf.Message + Environment.NewLine; errores++; } catch (IOException io) { msj = "El comprobante fue emitido, pero no se pudo guardar el archivo en: " + trxVenta.Ruta_clave + " Verifique permisos a la carpeta." + Environment.NewLine; DocVenta.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, msj, "errIO", _Conex.Usuario, string.Empty, "error", maquina.DestinoEBinario, io.Message); msj += io.Message + Environment.NewLine; errores++; } catch (Exception lo) { string imsj = lo.InnerException == null ? "" : lo.InnerException.ToString(); msj = lo.Message + " " + imsj + Environment.NewLine + lo.StackTrace; DocVenta.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, lo.Message, "errDesconocido", _Conex.Usuario, string.Empty, "error", maquina.DestinoEBinario, 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!"); }
/// <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!"); }
/// <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 + " " + "\r\n"; // representanteSat.msjError+ // ReportProgress(100, validadorxml.mensajeError + " " + DocVenta.ultimoMensaje + " " + loader.mensajeError + " " + "\r\n"); //representanteSat.msjError + // 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); //para testeo: // comprobante.Save(new XmlTextWriter(@"D:\GPElectronicInvoice\feTowersMexTST\" + 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); // //comprobante.DocumentElement.SetAttribute("xmlns:del", "http://www.deloitte.com/CFD/Addenda/Receptor"); // //XmlAttribute attr = comprobante.CreateAttribute("xsi", "schemaLocation", " "); // //attr.Value = "http://www.deloitte.com/CFD/Addenda/Receptor http://www.pegasotecnologia.com/secfd/schemas/Deloitte_recepcion.xsd"; // //comprobante.Attributes.Append(attr); //} //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)) // 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, ""); }
public async Task <string> ProcesaConsultaStatusAsync(ICfdiMetodosWebService servicioTimbre) { string resultadoSunat = string.Empty; 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); String accion = "CONSULTA STATUS"; OnProgreso(1, "INICIANDO CONSULTA DE STATUS..."); //Notifica al suscriptor do { msj = String.Empty; String claseDocumento = !trxVenta.Docid.Equals("RESUMEN") ? _Param.tipoDoc : trxVenta.Docid; try { String[] serieCorrelativo = trxVenta.Sopnumbe.Split(new char[] { '-' }); if (maquina.ValidaTransicion(claseDocumento, accion, trxVenta.EstadoActual)) { if (trxVenta.Voidstts == 0 && trxVenta.EstadoContabilizado.Equals("contabilizado")) //documento no anulado { string tipoDoc = string.Empty; string serie = string.Empty; string correlativo = string.Empty; trxVenta.ArmarDocElectronico(string.Empty); tipoDoc = trxVenta.DocGP.DocVenta.tipoDocumento; serie = serieCorrelativo[0]; correlativo = serieCorrelativo[1]; resultadoSunat = await servicioTimbre.ConsultaStatusAlOSEAsync(trxVenta.DocGP.DocVenta.consecutivoDocumento, trxVenta.Ruta_certificadoPac, trxVenta.Contrasenia_clavePac, tipoDoc, serie, correlativo); String[] codigoYMensaje = resultadoSunat.Split(new char[] { '-' }); maquina.DestinoAceptado = codigoYMensaje[0] == "0" ? true : false; maquina.ActualizarNodoDestinoStatusBase(); DocVenta.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, codigoYMensaje[1], codigoYMensaje[0], _Conex.Usuario, accion, maquina.DestinoStatusBase, maquina.DestinoEBinario, accion + ":" + codigoYMensaje[0]); if (codigoYMensaje[0].Equals("0") || int.Parse(codigoYMensaje[0]) > 1000) { DocVenta.ActualizaFacturaEmitida(trxVenta.Soptype, trxVenta.Sopnumbe, _Conex.Usuario, "emitido", "emitido", maquina.DestinoEBinario, maquina.DestinoMensaje, codigoYMensaje[0]); } msj = "Mensaje del OCE: " + resultadoSunat; } } } 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!"); return(resultadoSunat); }
public async Task ProcesaBajaComprobanteAsync(String motivoBaja, ICfdiMetodosWebService servicioTimbre) { String msj = String.Empty; try { 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 string tipoMEstados = "DOCVENTA-" + trxVenta.EstadoContabilizado; trxVenta.CicloDeVida = new Maquina(trxVenta.EstadoActual, trxVenta.Regimen, trxVenta.Voidstts, "emisor", tipoMEstados); OnProgreso(1, "INICIANDO BAJA DE DOCUMENTO..."); //Notifica al suscriptor do { msj = String.Empty; try { String accion = "BAJA"; if (trxVenta.CicloDeVida.Transiciona(Maquina.eventoDarDeBaja, 1)) { //eBinario = maquina.eBinarioNuevo; trxVenta.ArmarBaja(motivoBaja); String[] serieCorrelativo = trxVenta.Sopnumbe.Split(new char[] { '-' }); string numeroSunat = serieCorrelativo[0] + "-" + serieCorrelativo[1]; //validaciones switch (trxVenta.DocGP.DocVenta.tipoDocumento) { case "01": if (!trxVenta.Sopnumbe.Substring(0, 1).Equals("F")) { msj = "El folio de la Factura debe empezar con la letra F. "; throw new ApplicationException(msj); } break; case "03": if (!trxVenta.Sopnumbe.Substring(0, 1).Equals("B")) { msj = "El folio de la Boleta debe empezar con la letra B. "; throw new ApplicationException(msj); } break; default: msj = "ok"; break; } string nombreArchivo = Utiles.FormatoNombreArchivo(trxVenta.Docid + trxVenta.Sopnumbe + "_" + trxVenta.s_CUSTNMBR, trxVenta.s_NombreCliente, 20) + "_" + accion.Substring(0, 4); string resultadoBaja = await servicioTimbre.SolicitarBajaAsync(trxVenta.DocGP.DocVenta.cliente_numeroDocumento, trxVenta.Ruta_certificadoPac, trxVenta.Contrasenia_clavePac, string.Concat(trxVenta.DocGP.DocVenta.tipoDocumento, "-", numeroSunat), Utiles.Izquierda(motivoBaja, 100)); //DocVenta.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, resultadoBaja, "baja ok", _Conex.Usuario, string.Empty, maquina.DestinoStatusBase, maquina.DestinoEBinario, maquina.DestinoMensaje); //DocVenta.ActualizaFacturaEmitida(trxVenta.Soptype, trxVenta.Sopnumbe, _Conex.Usuario, "emitido", "emitido", maquina.DestinoEBinario, maquina.DestinoMensaje, "baja ok"); } } 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) { msj = string.Concat(xw.Message, " ", xw?.InnerException?.Message, Environment.NewLine, xw.StackTrace); } finally { OnProgreso(100, msj); } OnProgreso(100, "Proceso finalizado!"); }
private async Task <string> EjecutaEventoEmiteAsync(ICfdiMetodosWebService servicioTimbre, cfdReglasFacturaXml LogComprobante, string nombreArchivo, string extension, int usuarioConAcceso) { string xmlFactura = string.Empty; string rutaYNombreArchivo = Path.Combine(trxVenta.RutaXml.Trim(), nombreArchivo + extension); string resultado = "ok"; try { xmlFactura = await servicioTimbre.TimbraYEnviaServicioDeImpuestoAsync(trxVenta.DocGP.DocVenta.cliente_numeroIdentificacion, trxVenta.Ruta_certificadoPac, trxVenta.Ruta_clavePac, trxVenta.DocGP); String[] mensajeWs = xmlFactura.Split(new char[] { '-' }); if (mensajeWs[0].Trim().Equals("201")) //enviado a la DIAN { LogComprobante.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, rutaYNombreArchivo, trxVenta.CicloDeVida.idxTargetSingleStatus.ToString(), _Conex.Usuario, string.Empty, trxVenta.CicloDeVida.targetSingleStatus, trxVenta.CicloDeVida.targetBinStatus, trxVenta.CicloDeVida.EstadoEnPalabras(trxVenta.CicloDeVida.targetBinStatus)); resultado = xmlFactura; } else { LogComprobante.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, rutaYNombreArchivo, trxVenta.CicloDeVida.idxTargetSingleStatus.ToString(), _Conex.Usuario, xmlFactura.Replace("encoding=\"utf-8\"", "").Replace("encoding=\"UTF-8\"", "").Replace("encoding=\"iso-8859-1\"", ""), trxVenta.CicloDeVida.targetSingleStatus, trxVenta.CicloDeVida.targetBinStatus, trxVenta.CicloDeVida.EstadoEnPalabras(trxVenta.CicloDeVida.targetBinStatus)); if (!string.IsNullOrEmpty(xmlFactura)) { rutaYNombreArchivo = await LogComprobante.GuardaArchivoAsync(trxVenta, xmlFactura, nombreArchivo, extension, false); } EjecutaEvento(Maquina.eventoDIANAcepta, servicioTimbre, LogComprobante, usuarioConAcceso, xmlFactura.Replace("encoding=\"utf-8\"", "").Replace("encoding=\"UTF-8\"", "").Replace("encoding=\"iso-8859-1\"", "")); rutaYNombreArchivo = await EjecutaEventoObtienePDFAsync(servicioTimbre, LogComprobante, nombreArchivo, usuarioConAcceso); EjecutaEvento(Maquina.eventoEnviaCorreo, servicioTimbre, LogComprobante, usuarioConAcceso, string.Empty); } return(resultado); } catch (Exception lo) { string msj = "[EjecutaEventoEmiteAsync] " + lo.Message + Environment.NewLine + lo.StackTrace; String[] mensajeWs = lo.Message.Split(new char[] { '-' }); switch (mensajeWs[0].Trim()) { case "101": //Caso de error interno de Ws LogComprobante.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, rutaYNombreArchivo, trxVenta.CicloDeVida.idxTargetSingleStatus.ToString(), _Conex.Usuario, string.Empty, trxVenta.CicloDeVida.targetSingleStatus, trxVenta.CicloDeVida.targetBinStatus, trxVenta.CicloDeVida.EstadoEnPalabras(trxVenta.CicloDeVida.targetBinStatus)); xmlFactura = await EjecutaEventoServicioImpuestosAceptaAsync(servicioTimbre, LogComprobante, nombreArchivo, extension, usuarioConAcceso); rutaYNombreArchivo = await EjecutaEventoObtienePDFAsync(servicioTimbre, LogComprobante, nombreArchivo, usuarioConAcceso); EjecutaEvento(Maquina.eventoEnviaCorreo, servicioTimbre, LogComprobante, usuarioConAcceso, string.Empty); resultado = rutaYNombreArchivo; break; //case "Z98": //Rechazo de la DIAN. // LogComprobante.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, rutaYNombreArchivo, trxVenta.CicloDeVida.idxTargetSingleStatus.ToString(), _Conex.Usuario, string.Empty, // trxVenta.CicloDeVida.targetSingleStatus, trxVenta.CicloDeVida.targetBinStatus, trxVenta.CicloDeVida.EstadoEnPalabras(trxVenta.CicloDeVida.targetBinStatus)); // EjecutaEventoServicioImpuestosRechaza(LogComprobante); // break; default: LogComprobante.RegistraLogDeArchivoXML(trxVenta.Soptype, trxVenta.Sopnumbe, "EjecutaEventoEmiteAsync " + lo.Message, "errTheFactory", _Conex.Usuario, string.Empty, Maquina.estadoBaseError, trxVenta.CicloDeVida.binStatus, lo.StackTrace); resultado = msj; break; } return(resultado); } }
/// <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, "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); String Sello = string.Empty; do { 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; //} trxVenta.ArmarDocElectronico(); //////////////////////////////////////////////////////////////////////////// //comprobante.LoadXml(trxVenta.ComprobanteXml); //comprobante.DocumentElement.SetAttribute("NoCertificado", criptografo.noCertificado); loader.getCadenaOriginal(comprobante, xslCompilado); //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.InnerXml, maquina, String.Empty, 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 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!"); }