/// <summary> /// Metodo para obtener datos de un ACK /// </summary> /// <param name="nombreACK"></param> /// <returns></returns> private SobreTransito ObtenerSobreTransito(string nombreACK, string correoReceptor) { SobreTransito resultado = new SobreTransito(); string idReceptor = "", token = ""; try { XmlDocument datosAck = new XmlDocument(); datosAck.Load(RutasCarpetas.RutaCarpetaBandejaEntrada + nombreACK); idReceptor = ObtenerTag(datosAck, true); token = ObtenerTag(datosAck, false); resultado.IdReceptor = datosAck.GetElementsByTagName(idReceptor).Item(0).InnerText; resultado.NombreSobre = nombreACK; resultado.TipoReceptor = SobreTransito.ETipoReceptor.Receptor; resultado.Token = datosAck.GetElementsByTagName(token).Item(0).InnerText; resultado.CorreoReceptor = correoReceptor; } catch (Exception) { // AdminEventosUI.mostrarMensaje("Mail/ObtenerSobreTransito/Error: " + ex.ToString(), AdminEventosUI.tipoMensajes.error); } return(resultado); }
/// <summary> /// Consulta el listado de todos los sobres en transito que existan /// </summary> /// <param name="comp"></param> /// <returns></returns> public List <SobreTransito> ConsultarNoInterfiere(SobreTransito.ETipoReceptor tipoRec) { List <SobreTransito> listaSobresTransito = new List <SobreTransito>(); Recordset recSet = null; SobreTransito sobreTransito = null; string consulta = ""; int i = 0; try { //Obtener objeto de recordset recSet = ProcConexion.Comp.GetBusinessObject(BoObjectTypes.BoRecordset); //Establecer consulta // consulta = "SELECT DocEntry, U_NomSob, U_Token, U_IdRec, U_CorRec, U_TipoRec FROM [@TFEST] where U_TipoRec = '" + tipoRec + "' ORDER BY DocEntry Desc"; consulta = " SELECT T1.DocEntry, T1.U_NomSob, T1.U_Token, T1.U_IdRec, T1.U_CorRec, T1.U_TipoRec, T1.U_Tipo, T1.U_Serie, T1.U_Numero FROM [@TFEST] T1 " + " inner join [@TFECFE] T2 on T2.U_NumCFE = T1.U_Numero and T2.U_TipoDoc = T1.U_Tipo and T2.U_Serie = T1.U_Serie " + " where T2.U_EstadoDgi = 'PendienteDGI' and T2.U_TipoDoc <> 101 or (T2.U_TipoDoc = 101 and T2.U_MayorUI = 'Y' and T2.U_EstadoDgi = 'PendienteDGI') " + " order by T1.docentry desc "; //Ejectura consulta recSet.DoQuery(consulta); //Posicionar cursor al inicio recSet.MoveFirst(); //Validar que existan valores while (i < recSet.RecordCount) { //Crear objeto SobreTransito y establecer valores sobreTransito = new SobreTransito(); sobreTransito.DocEntry = recSet.Fields.Item("DocEntry").Value + ""; sobreTransito.NombreSobre = recSet.Fields.Item("U_NomSob").Value + ""; sobreTransito.Token = recSet.Fields.Item("U_Token").Value + ""; sobreTransito.IdReceptor = recSet.Fields.Item("U_IdRec").Value + ""; sobreTransito.CorreoReceptor = recSet.Fields.Item("U_CorRec").Value + ""; sobreTransito.TipoReceptor = (SobreTransito.ETipoReceptor)Enum.Parse(typeof(SobreTransito.ETipoReceptor), recSet.Fields.Item("U_TipoRec").Value + ""); listaSobresTransito.Add(sobreTransito); recSet.MoveNext(); i++; } } catch (Exception) { listaSobresTransito = null; } finally { if (recSet != null) { //Se libera el objeto de memoria System.Runtime.InteropServices.Marshal.ReleaseComObject(recSet); System.GC.Collect(); } } return(listaSobresTransito); }
private void ConsultarDGI(Object parametros, SobreTransito sobreTransito) { string xmlConsulta = ""; string xmlRespuesta = ""; WebServiceDGI webServiceDgi = new WebServiceDGI(parametros); try { //Armar el xml con los datos de para la consulta xmlConsulta = "<ConsultaCFE xmlns=\"http://dgi.gub.uy\"> <IdReceptor>" + sobreTransito.IdReceptor + "</IdReceptor><Token>" + sobreTransito.Token + "</Token> </ConsultaCFE>"; //Invocar el web service xmlRespuesta = webServiceDgi.WSDGI.SendWSDGI(xmlConsulta, clsWSDGI.WsMethod.Query); if (ValidarRespuesta(xmlRespuesta) == false) { //Procesar la respuesta respuestaCertificado.ProcesarRespuesta(xmlRespuesta, CFE.ESTipoReceptor.DGI, sobreTransito.DocEntry); } else { // Elimino sobre con error. //manteUdoSobreTransito.Eliminar(sobreTransito.DocEntry); } } catch (Exception) { //SAPbouiCOM.Framework.Application.SBO_Application.MessageBox("consultarDGI " + ex.ToString()); } }
/// <summary> /// Consulta el listado de todos los sobres en transito que existan /// </summary> /// <param name="comp"></param> /// <returns></returns> public List <SobreTransito> Consultar(SobreTransito.ETipoReceptor tipoRec) { List <SobreTransito> listaSobresTransito = new List <SobreTransito>(); Recordset recSet = null; SobreTransito sobreTransito = null; string consulta = ""; int i = 0; try { //Obtener objeto de recordset recSet = ProcConexion.Comp.GetBusinessObject(BoObjectTypes.BoRecordset); //Establecer consulta consulta = "SELECT DocEntry, U_NomSob, U_Token, U_IdRec, U_CorRec, U_TipoRec FROM [@TFEST] where U_TipoRec = '" + tipoRec + "'"; //Ejectura consulta recSet.DoQuery(consulta); //Posicionar cursor al inicio recSet.MoveFirst(); //Validar que existan valores while (i < recSet.RecordCount) { //Crear objeto SobreTransito y establecer valores sobreTransito = new SobreTransito(); sobreTransito.DocEntry = recSet.Fields.Item("DocEntry").Value + ""; sobreTransito.NombreSobre = recSet.Fields.Item("U_NomSob").Value + ""; sobreTransito.Token = recSet.Fields.Item("U_Token").Value + ""; sobreTransito.IdReceptor = recSet.Fields.Item("U_IdRec").Value + ""; sobreTransito.CorreoReceptor = recSet.Fields.Item("U_CorRec").Value + ""; sobreTransito.TipoReceptor = (SobreTransito.ETipoReceptor)Enum.Parse(typeof(SobreTransito.ETipoReceptor), recSet.Fields.Item("U_TipoRec").Value + ""); listaSobresTransito.Add(sobreTransito); recSet.MoveNext(); i++; } } catch (Exception) { listaSobresTransito = null; } finally { if (recSet != null) { //Se libera el objeto de memoria System.Runtime.InteropServices.Marshal.ReleaseComObject(recSet); System.GC.Collect(); } } return(listaSobresTransito); }
/// <summary> /// Ingresa un nuevo registro a la tabla @TFEST /// </summary> /// <param name="comp"></param> /// <param name="maestro"></param> /// <returns></returns> public bool Almacenar(SobreTransito sobreTransito) { bool resultado = false; GeneralService servicioGeneral = null; GeneralData dataGeneral = null; try { //Obtener el servicio general de la compañia servicioGeneral = ProcConexion.Comp.GetCompanyService().GetGeneralService("TTFEST"); //Apuntar a la cabecera del udo dataGeneral = servicioGeneral.GetDataInterface(GeneralServiceDataInterfaces.gsGeneralData); //Establecer los valores para cada una de las propiedades del udo dataGeneral.SetProperty("U_NomSob", sobreTransito.NombreSobre); dataGeneral.SetProperty("U_Token", sobreTransito.Token); dataGeneral.SetProperty("U_IdRec", sobreTransito.IdReceptor); dataGeneral.SetProperty("U_TipoRec", sobreTransito.TipoReceptor.ToString()); dataGeneral.SetProperty("U_CorRec", sobreTransito.CorreoReceptor); dataGeneral.SetProperty("U_Tipo", sobreTransito.Tipo); dataGeneral.SetProperty("U_Numero", sobreTransito.Numero); dataGeneral.SetProperty("U_Serie", sobreTransito.Serie); //Agregar el nuevo registro a la base de dato utilizando el servicio general de la compañia servicioGeneral.Add(dataGeneral); resultado = true; } catch (Exception ex) { SAPbouiCOM.Framework.Application.SBO_Application.MessageBox("Error Almacenar Sobre Transito " + ex.ToString()); } finally { if (servicioGeneral != null) { //Liberar memoria utlizada por el objeto servicioGeneral GC.SuppressFinalize(servicioGeneral); System.GC.Collect(); } if (dataGeneral != null) { //Liberar memoria utlizada por el objeto dataGeneral GC.SuppressFinalize(dataGeneral); System.GC.Collect(); } } return(resultado); }
/// <summary> /// Valida que el archivo contenga la informacion para la consulta del estado de un CFE /// </summary> /// <param name="nombreArchivo"></param> /// <returns></returns> public SobreTransito ValidarContenidoConsulta(string nombreArchivo) { SobreTransito sobreTransito = null; XmlDocument xmlDocumento = new XmlDocument(); try { xmlDocumento.Load(RutasCarpetas.RutaCarpetaConsultaEstado + "" + nombreArchivo); sobreTransito = new SobreTransito(); sobreTransito.Token = xmlDocumento.GetElementsByTagName("Token").Item(0).InnerText; sobreTransito.IdReceptor = xmlDocumento.GetElementsByTagName("IDReceptor").Item(0).InnerText; } catch (Exception) { //SAPbouiCOM.Framework.Application.SBO_Application.MessageBox("RespuestaConsultaCFE/Error: " + ex.ToString()); } return(sobreTransito); }
/// <summary> /// Metodo que obtiene descarga los archivos adjuntos de /// los correos no leido y los marca como leido de la /// bandeja de entrada de Gmail /// </summary> /// <returns></returns> public void bandejaEntradaGmail() { while (!detenerHilo) { try { //Se obtiene informacion de cuenta de correo ManteUdoCorreos manteUdo = new ManteUdoCorreos(); Correo correo = manteUdo.Consultar(); string clave = correo.Clave, usuario = correo.Cuenta; ImapClient cliente = new ImapClient(); //Se conecta con el servidor if (cliente.Connect(Mensaje.cliGmail, true)) { //Se loguea con el usuario y la clave cliente.Login(usuario, clave); //Se obtiene la carpeta de bandeja de entrada ImapX.Collections.FolderCollection folder = cliente.Folders; ImapX.Folder buzonEntrada = cliente.Folders.Inbox; //Se obtiene los mensajes no leidos ImapX.Message[] mensajes = buzonEntrada.Search("UNSEEN", ImapX.Enums.MessageFetchMode.Full); //Se recorren la lista de mensajes obtenidos foreach (ImapX.Message mensaje in mensajes) { //Se obtienen los archivos adjuntos foreach (var archivo in mensaje.Attachments) { //Se comprueba que sea un archivo xml if (ValidarXmlSobre(archivo.FileName)) { mensaje.Seen = true; //Se descargan los archivos adjuntos archivo.Download(); archivo.Save(RutasCarpetas.RutaCarpetaBandejaEntrada); string desde = mensaje.From.ToString(); //Se guarda en la tabla de sobres Recibidos respuestaSobre.GenerarXML(RutasCarpetas.RutaCarpetaBandejaEntrada, archivo.FileName, desde); } //Se comprueba que sea un ACK else if (ValidarXmlACKSobre(archivo.FileName)) { archivo.Download(); archivo.Save(RutasCarpetas.RutaCarpetaBandejaEntrada); mensaje.Seen = true; //Obtiene datos del sobre de un ACK xml SobreTransito sobreTransito = ObtenerSobreTransito(archivo.FileName, mensaje.From.ToString()); //Guarda los datos en la tabla TFEST(Sobre en transito) ManteUdoSobreTransito manteSobreTransito = new ManteUdoSobreTransito(); manteSobreTransito.Almacenar(sobreTransito); } //else if (ValidarXmlACKCFE(archivo.FileName)) //{ // archivo.Save(RutasCarpetas.RutaCarpetaAcuseRecibidoCertificado); // mensaje.Seen = true; // RespuestaCertificados respuestaCFE = new RespuestaCertificados(); // respuestaCFE.ProcesarRespuesta(archivo.FileName, CFE.ESTipoReceptor.Receptor); //} //else //{ // archivo.Save(RutasCarpetas.RutaCarpetaConsultaEstado); // mensaje.Seen = true; // RespuestaConsultaCFE respuestaConsultaCfe = new RespuestaConsultaCFE(); // SobreTransito sobreTransito = respuestaConsultaCfe.ValidarContenidoConsulta(archivo.FileName); // if (sobreTransito != null) // { // respuestaConsultaCfe.ObtenerEstadoCFE(sobreTransito.Token, sobreTransito.IdReceptor, mensaje.From.ToString(), archivo.FileName); // } //} } } //Se cierra sesion cliente.Logout(); //Se desconecta del servidor cliente.Disconnect(); //Se libera el objeto cliente.Dispose(); } } catch (Exception) { //SAPbouiCOM.Framework.Application.SBO_Application.MessageBox("Mail/BandejaEntradaGmail/Error: " + ex.ToString()); } finally { Thread.Sleep(30000); } } }
/// <summary> /// Metodo que descarga los archivos adjuntos de los correos /// no leidos de la cuenta de outlook /// </summary> public void bandejaEntradaOutlook() { Microsoft.Office.Interop.Outlook.Application app = null; Microsoft.Office.Interop.Outlook._NameSpace ns = null; Microsoft.Office.Interop.Outlook.MAPIFolder inboxFolder = null; Microsoft.Office.Interop.Outlook.MailItem sinLeer; int p = 0, t = 0; while (!detenerHilo) { try { app = new Microsoft.Office.Interop.Outlook.Application(); ns = app.GetNamespace("MAPI"); ns.Logon(null, null, false, false); inboxFolder = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook. OlDefaultFolders.olFolderInbox); ///Se obtiene la bandeja de entrada de la cuenta de correo Microsoft.Office.Interop.Outlook.Items inboxItems = inboxFolder.Items; t = inboxFolder.UnReadItemCount; ///Se obtiene la bandeja de entrada de correos no leidos inboxItems = inboxItems.Restrict("[unread] = true"); while (p < t) { if (p == 0) { ///Se obtiene el primer elemento de la bandeja de entrada sinLeer = inboxItems.GetFirst(); } else { ///Se obtiene el elemento siguiente de la bandeja de entrada sinLeer = inboxItems.GetNext(); } ///Se obtiene los archivos adjuntos del correo Microsoft.Office.Interop.Outlook.Attachments adjuntos = sinLeer.Attachments; foreach (Microsoft.Office.Interop.Outlook.Attachment archivo in adjuntos) { if (ValidarXmlSobre(archivo.FileName)) { ///Se marca el correo como no leido sinLeer.UnRead = false; //Se descargar el archivo adjunto del correo archivo.SaveAsFile(RutasCarpetas.RutaCarpetaBandejaEntrada + archivo.FileName); string desde = sinLeer.Sender.ToString(); //Se sube el archivo al servidor FTP FTP ftp = new FTP(); ftp.CargarArchivos(archivo.FileName, RutasCarpetas.RutaCarpetaBandejaEntrada, 3); //Se guarda en la tabla de sobres Recibidos respuestaSobre.GenerarXML(RutasCarpetas.RutaCarpetaBandejaEntrada, archivo.FileName, desde); } //Se comprueba que sea un ACK else if (ValidarXmlACKSobre(archivo.FileName)) { archivo.SaveAsFile(RutasCarpetas.RutaCarpetaBandejaEntrada); sinLeer.UnRead = false; SobreTransito sobreTransito = ObtenerSobreTransito(archivo.FileName, sinLeer.Sender.ToString()); ManteUdoSobreTransito manteSobreTransito = new ManteUdoSobreTransito(); manteSobreTransito.Almacenar(sobreTransito); } } p = p + 1; } } catch (Exception) { } finally { ns = null; app = null; inboxFolder = null; Thread.Sleep(60000); } } }
/// <summary> /// Procesa la respuesta del web service de DGI /// </summary> /// <param name="xmlRespuesta"></param> /// <param name="parametros"></param> public void ProcesarRespuesta(string xmlRespuesta, object parametros) { string estadoRespuesta = "", token = "", idReceptor = ""; ParametrosJobWsDGI parametrosJob = parametros as ParametrosJobWsDGI; XmlDocument xmlDocumento = new XmlDocument(); ManteUdoSobre manteSobre = new ManteUdoSobre(); try { xmlDocumento.LoadXml(xmlRespuesta); idReceptor = xmlDocumento.GetElementsByTagName("IDReceptor").Item(0).InnerText; estadoRespuesta = xmlDocumento.GetElementsByTagName("Estado").Item(0).InnerText; if (estadoRespuesta.Equals("AS")) { token = xmlDocumento.GetElementsByTagName("Token").Item(0).InnerText; string hora = xmlDocumento.GetElementsByTagName("Fechahora").Item(0).InnerText; SobreTransito sobreTransito = new SobreTransito(); sobreTransito.NombreSobre = parametrosJob.Sobre.Nombre; sobreTransito.Token = token; sobreTransito.IdReceptor = idReceptor; sobreTransito.TipoReceptor = SobreTransito.ETipoReceptor.DGI; sobreTransito.Tipo = parametrosJob.Cfe.TipoCFEInt; sobreTransito.Serie = parametrosJob.Cfe.SerieComprobante; sobreTransito.Numero = parametrosJob.Cfe.NumeroComprobante; ManteUdoSobreTransito manteTransito = new ManteUdoSobreTransito(); manteTransito.Almacenar(sobreTransito); //True = AS, no se agrega detalle correspondiente a info de rechazo manteSobre.cargarSobreXml(xmlDocumento, parametrosJob.Sobre.Nombre, true); //Se crea el documento Pdf //CrearPDF(parametrosJob.Cfe, parametrosJob.Cae); } else if (estadoRespuesta.Equals("BS")) { //False = BS, se agrega detalle correspondiente a info de rechazo manteSobre.cargarSobreXml(xmlDocumento, parametrosJob.Sobre.Nombre, false); } } catch (Exception) { app.MessageBox("No se pudo enviar a DGI por problemas de conexión, recordar reenvio de documento."); ManteUdoControlSobres manteUdoControlSobres = new ManteUdoControlSobres(); ParametrosJobWsDGI parametrosDGI = parametros as ParametrosJobWsDGI; ControlSobres controlSobres = new ControlSobres(); controlSobres.Estado = "Pendiente"; controlSobres.Serie = parametrosDGI.Cfe.SerieComprobante; controlSobres.Numero = parametrosDGI.Cfe.NumeroComprobante.ToString(); controlSobres.Tipo = parametrosDGI.Cfe.TipoCFEInt.ToString(); controlSobres.DocumentoSap = parametrosDGI.Cfe.DocumentoSAP; controlSobres.UsuarioSap = ProcConexion.Comp.UserName; manteUdoControlSobres.Almacenar(controlSobres); //app.MessageBox("ERROR RESPUESTA: " + ex.ToString()); } finally { if (xmlDocumento != null) { //Libera de memoria el objeto factura GC.SuppressFinalize(xmlDocumento); GC.Collect(); } if (xmlDocumento != null) { //Libera de memoria el objeto factura GC.SuppressFinalize(xmlDocumento); GC.Collect(); } if (manteSobre != null) { //Libera de memoria el objeto factura GC.SuppressFinalize(manteSobre); GC.Collect(); } } }
/// <summary> /// Procesa la respuesta del web service de DGI /// </summary> /// <param name="xmlRespuesta"></param> /// <param name="parametros"></param> public void ProcesarRespuesta(string xmlRespuesta, object parametros, ControlSobres controlSobres) { string estadoRespuesta = "", token = "", idReceptor = ""; ParametrosJobWsDGIMasivo parametrosJob = parametros as ParametrosJobWsDGIMasivo; ManteUdoControlSobres manteUdoControlSobres = new ManteUdoControlSobres(); ManteUdoCFE manteUdoCfe = new ManteUdoCFE(); try { XmlDocument xmlDocumento = new XmlDocument(); xmlDocumento.LoadXml(xmlRespuesta); idReceptor = xmlDocumento.GetElementsByTagName("IDReceptor").Item(0).InnerText; estadoRespuesta = xmlDocumento.GetElementsByTagName("Estado").Item(0).InnerText; if (estadoRespuesta.Equals("AS")) { manteUdoControlSobres.Eliminar(controlSobres); token = xmlDocumento.GetElementsByTagName("Token").Item(0).InnerText; string hora = xmlDocumento.GetElementsByTagName("Fechahora").Item(0).InnerText; SobreTransito sobreTransito = new SobreTransito(); sobreTransito.NombreSobre = parametrosJob.NombreSobre; sobreTransito.Token = token; sobreTransito.IdReceptor = idReceptor; sobreTransito.TipoReceptor = SobreTransito.ETipoReceptor.DGI; sobreTransito.Serie = parametrosJob.Serie; sobreTransito.Numero = parametrosJob.Numero; sobreTransito.Tipo = parametrosJob.Tipo; ManteUdoSobreTransito manteTransito = new ManteUdoSobreTransito(); manteTransito.Almacenar(sobreTransito); ManteUdoSobre manteSobre = new ManteUdoSobre(); //True = AS, no se agrega detalle correspondiente a info de rechazo manteSobre.cargarSobreXml(xmlDocumento, parametrosJob.NombreSobre, true); } else if (estadoRespuesta.Equals("BS")) { manteUdoControlSobres.Eliminar(controlSobres); ManteUdoSobre manteSobre = new ManteUdoSobre(); //False = BS, se agrega detalle correspondiente a info de rechazo manteSobre.cargarSobreXml(xmlDocumento, parametrosJob.NombreSobre, false); } } catch (Exception) { controlSobres.Estado = "Pendiente"; manteUdoControlSobres.Actualizar(controlSobres); app.MessageBox("No se pudo enviar a DGI"); } finally { if (parametrosJob != null) { //Libera de memoria el objeto factura GC.SuppressFinalize(parametrosJob); GC.Collect(); } if (manteUdoControlSobres != null) { //Libera de memoria el objeto factura GC.SuppressFinalize(manteUdoControlSobres); GC.Collect(); } if (manteUdoCfe != null) { //Libera de memoria el objeto factura GC.SuppressFinalize(manteUdoCfe); GC.Collect(); } } }
/// <summary> /// Determina que tipo de cuentas de correo utilizar /// </summary> /// <returns></returns> public bool tipoCorreo(SobreTransito sobreTransito) { bool resultado = false; try { //Se obtiene credenciales para el envio del correo ManteUdoCorreos manteUdo = new ManteUdoCorreos(); Correo correo = manteUdo.Consultar(); if (correo != null) { string[] adjuntos = new string[1]; //Se agregan las rutas de los archivos adjuntos adjuntos[0] = RutasCarpetas.RutaCarpetaACKSobreReceptor + sobreTransito.NombreSobre + ".xml"; string mensaje = "Datos para Consulta de Estado de CFEs" + Environment.NewLine + "<ACKReceptor>" + Environment.NewLine + " <Token> " + sobreTransito.Token + "</Token>" + Environment.NewLine + " <IdReceptor> " + sobreTransito.IdReceptor + "</IdReceptor>" + Environment.NewLine + "</ACKReceptor>" + Environment.NewLine + "Saludos"; //0 == Gmail if (correo.Opcion.Equals("0")) { ///Envia correo con una cuenta de gmail Mail mail = new Mail(sobreTransito.CorreoReceptor, correo.Cuenta, Mensaje.ACKAsunto, mensaje, Mensaje.pdfServidorGmail, correo.Cuenta, correo.Clave, adjuntos, 587); if (mail.enviarCorreoGmail()) { if (!adjuntos[0].Equals("")) { //Borra el archivo de sobre copiado para enviar en el correo System.IO.File.Delete(adjuntos[0]); } resultado = true; } } //1 == Outlook else if (correo.Opcion.Equals("0")) { ///Envia correo con una cuenta de outlook Mail mail = new Mail(sobreTransito.CorreoReceptor, Mensaje.ACKAsunto, mensaje, adjuntos); if (mail.enviarOutlook()) { if (!adjuntos[1].Equals("")) { //Borra el archivo de sobre copiado para enviar en el correo System.IO.File.Delete(adjuntos[0]); } resultado = true; } } } } catch (Exception) { } return(resultado); }