コード例 #1
0
        /// <summary>
        /// Obtiene los datos de un certificado recibido
        /// </summary>
        /// <param name="docEntry"></param>
        /// <returns></returns>
        public List <CertificadoRecibido> ObtenerCertificadoRecibido(string docEntry)
        {
            List <CertificadoRecibido> listaCertificadoRecibido = new List <CertificadoRecibido>();
            CertificadoRecibido        certificadoRecibido      = null;
            string consulta = "";

            //Obtener objeto estadar de record set
            Recordset recSet = null;

            try
            {
                recSet = ProcConexion.Comp.GetBusinessObject(BoObjectTypes.BoRecordset);

                consulta = "SELECT U_RucRec, U_RucEmi, U_IdCons, U_IdEmisor, U_NomSob, U_CorEmi, U_FeSob, U_FeFir, U_CanCfe FROM [@TFESOBREC] " +
                           " WHERE DocEntry = '" + docEntry + "'";

                //Ejecutar consulta
                recSet.DoQuery(consulta);

                //Validar que se hayan obtenido resultado
                recSet.MoveFirst();

                if (recSet.RecordCount > 0)
                {
                    certificadoRecibido = new CertificadoRecibido();

                    certificadoRecibido.RucReceptor  = recSet.Fields.Item("U_RucRec").Value + "";
                    certificadoRecibido.RucEmisor    = recSet.Fields.Item("U_RucEmi").Value + "";
                    certificadoRecibido.IdConsecutio = recSet.Fields.Item("U_IdCons").Value + "";
                    certificadoRecibido.IdEmisor     = recSet.Fields.Item("U_IdEmisor").Value + "";
                    certificadoRecibido.NombreSobre  = recSet.Fields.Item("U_NomSob").Value + "";
                    certificadoRecibido.CorreoEmisor = recSet.Fields.Item("U_CorEmi").Value + "";
                    certificadoRecibido.FechaSobre   = recSet.Fields.Item("U_FeSob").Value + "";
                    certificadoRecibido.FechaEmision = recSet.Fields.Item("U_FeFir").Value + "";
                    certificadoRecibido.CantCFE      = recSet.Fields.Item("U_CanCfe").Value + "";
                }

                listaCertificadoRecibido.Add(certificadoRecibido);
                //Se libera de memoria el objeto recSet
            }
            catch (Exception)
            {
            }
            finally
            {
                if (recSet != null)
                {
                    //Se libera de memoria el objeto recSet
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(recSet);
                    GC.Collect();
                }
            }

            return(listaCertificadoRecibido);
        }
コード例 #2
0
        /// <summary>
        /// Retorna los datos de caratula de un sobre recibido
        /// </summary>
        /// <param name="comp"></param>
        /// <param name="DocEntry"></param>
        /// <returns></returns>
        public CertificadoRecibido ConsultarDatosCertificadoRecibido(string idRespuesta)
        {
            Recordset           recSet = null;
            CertificadoRecibido certificadoRecibido = null;

            string consulta = "";

            try
            {
                recSet = ProcConexion.Comp.GetBusinessObject(BoObjectTypes.BoRecordset);

                consulta = "select U_RucRec, U_RucEmi, U_IdCons, U_IdEmisor from [@TFESOBREC] where U_IdCons = " + idRespuesta;
                recSet.DoQuery(consulta);

                if (recSet.RecordCount > 0)
                {
                    certificadoRecibido              = new CertificadoRecibido();
                    certificadoRecibido.RucReceptor  = recSet.Fields.Item("U_RucRec").Value + "";
                    certificadoRecibido.RucEmisor    = recSet.Fields.Item("U_RucEmi").Value + "";
                    certificadoRecibido.IdConsecutio = recSet.Fields.Item("U_IdCons").Value + "";
                    certificadoRecibido.IdEmisor     = recSet.Fields.Item("U_IdEmisor").Value + "";
                }
            }
            catch (Exception)
            {
            }
            finally
            {
                if (recSet != null)
                {
                    //Se libera de memoria el objeto recSet
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(recSet);
                    GC.Collect();
                }
            }

            return(certificadoRecibido);
        }
コード例 #3
0
ファイル: RespuestaConsultaCFE.cs プロジェクト: ahazan/FE21
        /// <summary>
        /// Retorna el nombre del archivo de ACK de certificados
        /// </summary>
        /// <param name="idRespuesta"></param>
        /// <returns></returns>
        private string ObtenerNombre(string idRespuesta)
        {
            string nombreArchivo = "";

            try
            {
                CertificadoRecibido certificadoRecibido = manteUdoSobreRecibido.ConsultarDatosCertificadoRecibido(idRespuesta);
                DateTime            fechaActual;

                //Obtiene la fecha actual
                fechaActual = DateTime.Now;
                //Formatea fecha de modo: YYYYMMDD
                string fechaFormateada = String.Format("{0:yyyyMMdd}", fechaActual);
                //Firmar el xml
                nombreArchivo = "ME_" + idRespuesta + "_Sob_" + certificadoRecibido.RucReceptor + "_" + fechaFormateada + "_" + certificadoRecibido.IdEmisor;
            }
            catch (Exception)
            {
                // SAPbouiCOM.Framework.Application.SBO_Application.MessageBox("RespuestaConsultaCFE/Error: " + ex.ToString());
            }

            return(nombreArchivo);
        }
コード例 #4
0
ファイル: RespuestaConsultaCFE.cs プロジェクト: ahazan/FE21
        /// <summary>
        /// Retorna un string con lo datos de la caratula de la respueta
        /// </summary>
        /// <param name="idRespuesta"></param>
        /// <param name="listaCertificados"></param>
        /// <returns></returns>
        private string ObtenerTagCaratula(string idRespuesta, ArrayList listaCertificados, string nombreArchivo)
        {
            string xmlCaratula = "";

            try
            {
                CertificadoRecibido certificadoRecibido = manteUdoSobreRecibido.ConsultarDatosCertificadoRecibido(idRespuesta);
                int cantidadCertificadosSobre           = manteUdoSobreRecibido.ConsultarCantidadCertificadosSobre(idRespuesta);

                DateTime dt = DateTime.Now;

                xmlCaratula += "<Caratula>";
                xmlCaratula += "<RUCReceptor>" + certificadoRecibido.RucReceptor + "</RUCReceptor>";
                xmlCaratula += "<RUCEmisor>" + certificadoRecibido.RucEmisor + "</RUCEmisor>";
                xmlCaratula += "<IDRespuesta>" + certificadoRecibido.IdConsecutio + "</IDRespuesta>";
                xmlCaratula += "<NomArch>sob_219999830019_20141210_2.xml</NomArch>";
                xmlCaratula += "<FecHRecibido>" + dt.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK") + "</FecHRecibido>";
                xmlCaratula += "<IDEmisor>" + certificadoRecibido.IdEmisor + "</IDEmisor>";
                xmlCaratula += "<IDReceptor>" + certificadoRecibido.IdConsecutio + "</IDReceptor>";
                xmlCaratula += "<CantenSobre>" + cantidadCertificadosSobre + "</CantenSobre>";
                xmlCaratula += "<CantResponden>" + listaCertificados.Count + "</CantResponden>";
                xmlCaratula += "<CantCFEAceptados>" + ObtenerCantidadCertificados(listaCertificados, EEstado.aceptado) + "</CantCFEAceptados>";
                xmlCaratula += "<CantCFERechazados>" + ObtenerCantidadCertificados(listaCertificados, EEstado.rechazado) + "</CantCFERechazados>";
                xmlCaratula += "<CantCFCAceptados>0</CantCFCAceptados>";
                xmlCaratula += "<CantCFCObservados>0</CantCFCObservados>";
                xmlCaratula += "<CantOtrosRechazados>0</CantOtrosRechazados>";
                xmlCaratula += "<Tmst>" + dt.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssK") + "</Tmst>";
                xmlCaratula += "</Caratula>";
            }
            catch (Exception)
            {
                //SAPbouiCOM.Framework.Application.SBO_Application.MessageBox("RespuestaConsultaCFE/Error: " + ex.ToString());
            }

            return(xmlCaratula);
        }
コード例 #5
0
        /// <summary>
        /// Ingresa un nuevo registro a la tabla @TFESOBREC y su hija
        /// @TFESOBRECDET.
        /// </summary>
        /// <param name="comp"></param>
        /// <param name="maestro"></param>
        /// <returns></returns>
        public bool AlmacenarMaestro(CertificadoRecibido certificado, string correo, string nombreSobre)
        {
            bool resultado = false;

            GeneralService        servicioGeneral = null;
            GeneralData           dataGeneral     = null;
            GeneralData           dataDetalle     = null;
            GeneralDataCollection detalle         = null;

            try
            {
                //Obtener el servicio general de la compañia
                servicioGeneral = ProcConexion.Comp.GetCompanyService().GetGeneralService("TTFESOBREC");

                //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_RucEmi", certificado.RucEmisor);
                dataGeneral.SetProperty("U_RucRec", certificado.RucReceptor);
                dataGeneral.SetProperty("U_FeSob", certificado.FechaSobre);
                dataGeneral.SetProperty("U_FeFir", certificado.FechaFirma);
                dataGeneral.SetProperty("U_TipoCFE", certificado.TipoCFE);
                dataGeneral.SetProperty("U_NumCom", certificado.NumeroComprobante);
                dataGeneral.SetProperty("U_SerCom", certificado.SerieComprobante);
                dataGeneral.SetProperty("U_DNroCAE", certificado.DNroCAE);
                dataGeneral.SetProperty("U_HNroCAE", certificado.HNroCAE);
                dataGeneral.SetProperty("U_FVenCAE", certificado.FVenCAE);
                dataGeneral.SetProperty("U_IdCons", certificado.IdConsecutio);
                dataGeneral.SetProperty("U_IdEmisor", certificado.IdEmisor);
                dataGeneral.SetProperty("U_NomSob", nombreSobre);
                dataGeneral.SetProperty("U_CorEmi", correo);
                dataGeneral.SetProperty("U_CanCfe", certificado.CantCFE);
                dataGeneral.SetProperty("U_RazSoc", certificado.RazonSocial);

                detalle = dataGeneral.Child("TFESOBRECDET");

                foreach (DetCertificadoRecibido certificadoDetalle in certificado.DetalleCertificadoRecibido)
                {
                    dataDetalle = detalle.Add();
                    dataDetalle.SetProperty("U_NumCom", certificadoDetalle.NumeroComprobante);
                    dataDetalle.SetProperty("U_SerCom", certificadoDetalle.SerieComprobante);
                    dataDetalle.SetProperty("U_TipCFE", certificadoDetalle.TipoCFE);
                    dataDetalle.SetProperty("U_NomItem", certificadoDetalle.NombreItem);
                    string temp = certificadoDetalle.Cantidad.ToString();
                    temp = temp.Replace(".", ",");
                    dataDetalle.SetProperty("U_Cant", temp);//
                    dataDetalle.SetProperty("U_PreUni", certificadoDetalle.PrecioUnitario);
                    dataDetalle.SetProperty("U_MonIte", certificadoDetalle.MontoItem);
                    dataDetalle.SetProperty("U_TpoMon", certificadoDetalle.TipoMoneda);
                }

                ////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("ManteUdoCertificadoRecibido/Error: " + ex.ToString());
            }
            finally
            {
                if (dataGeneral != null)
                {
                    //Liberar memoria utlizada por el objeto dataGeneral
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(dataGeneral);
                    System.GC.Collect();
                }
                if (dataDetalle != null)
                {
                    //Liberar memoria utlizada por el objeto dataDetalle
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(dataDetalle);
                    System.GC.Collect();
                }
                if (detalle != null)
                {
                    //Liberar memoria utlizada por el objeto detalle
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(detalle);
                    System.GC.Collect();
                }
                if (servicioGeneral != null)
                {
                    //Liberar memoria utlizada por el objeto servicioGeneral
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(servicioGeneral);
                    System.GC.Collect();
                }
            }

            return(resultado);
        }
コード例 #6
0
ファイル: RespuestaSobre.cs プロジェクト: ahazan/FE21
        /// <summary>
        /// Metodo que genera el Acuse de Recibo
        /// </summary>
        public string GenerarACK(string estado, CertificadoRecibido sobreRecibido, string correoEmisor, List <ErrorValidarSobre> listaErrores, string nombreSobre)
        {
            ValidarSobre validaSobre = new ValidarSobre();

            //Se crea objeto de tipo Consecutivo
            Consecutivo   consecutivo = new Consecutivo();
            XmlTextWriter writer = null;
            string        nombreACK = "", nombreACKF = "";
            DateTime      fechaActual;

            try
            {
                //Genera el idReceptor para el ACK
                consecutivo.IdReceptor = validaSobre.generarIdReceptor();
                //Genera el TokenBinario para el ACK
                consecutivo.Token = validaSobre.generarTokenBinario(consecutivo.IdReceptor);

                ManteUdoConsecutivo manteConsecutivo = new ManteUdoConsecutivo();
                //Inserta en la tabla TFECONS el nuevo registro de consecutivo
                manteConsecutivo.Almacenar(consecutivo);

                //Obtiene la fecha actual
                fechaActual = DateTime.Now;
                //Formatea fecha de modo: YYYYMMDD
                string fechaFormateada = String.Format("{0:yyyyMMdd}", fechaActual);

                //Nombre del ACK segun formato de DGI
                nombreACK = "M_" + consecutivo.IdReceptor + "_Sob_" + sobreRecibido.RucEmisor + "_" + fechaFormateada + "_" + sobreRecibido.IdEmisor + "sf" + ".xml";
                //Nombre del ACK firmado digitalmente
                nombreACKF = "M_" + consecutivo.IdReceptor + "_Sob_" + sobreRecibido.RucEmisor + "_" + fechaFormateada + "_" + sobreRecibido.IdEmisor + ".xml";

                writer            = new XmlTextWriter(RutasCarpetas.RutaCarpetaAcuseRecibidoSobre + nombreACK, Encoding.UTF8);
                writer.Formatting = Formatting.Indented;

                //Empieza el documento ACKSOBRE
                writer.WriteStartDocument();

                //Agrega el primer elemento y el namespace
                writer.WriteStartElement("ACKSobre");
                writer.WriteAttributeString("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
                writer.WriteAttributeString("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
                writer.WriteAttributeString("version", "1.0");
                writer.WriteAttributeString("xmlns", "http://cfe.dgi.gub.uy");

                //Empieza el Tag de Caratula
                writer.WriteStartElement("Caratula");
                writer.WriteElementString("RUCReceptor", sobreRecibido.RucReceptor);
                writer.WriteElementString("RUCEmisor", sobreRecibido.RucEmisor);
                writer.WriteElementString("IDRespuesta", consecutivo.IdReceptor);
                writer.WriteElementString("NomArch", nombreSobre.ToLower());
                writer.WriteElementString("FecHRecibido", sobreRecibido.FechaSobre);
                writer.WriteElementString("IDEmisor", sobreRecibido.IdEmisor);
                writer.WriteElementString("IDReceptor", consecutivo.IdReceptor);
                writer.WriteElementString("CantidadCFE", sobreRecibido.CantCFE);
                writer.WriteElementString("Tmst", sobreRecibido.FechaEmision);

                //Termina el Tag de Caratula
                writer.WriteEndElement();

                //Empieza el Tag de Detalle
                writer.WriteStartElement("Detalle");
                writer.WriteElementString("Estado", estado);
                //Caso sobre rechazado
                if (estado.Equals("BS"))
                {
                    //Empieza el Tag de MotivosRechazo
                    writer.WriteStartElement("MotivosRechazo");
                    foreach (ErrorValidarSobre error in listaErrores)
                    {
                        writer.WriteElementString("Motivo", error.CodigoRechazo);
                        writer.WriteElementString("Glosa", error.GlosaRechazo);
                    }
                    //Termina el Tag de MotivosRechazo
                    writer.WriteEndElement();
                }
                //Caso sobre Aceptado
                else if (estado.Equals("AS"))
                {
                    //Empieza el Tag de ParamConsulta
                    writer.WriteStartElement("ParamConsulta");
                    writer.WriteElementString("Token", consecutivo.Token);

                    fechaFormateada = String.Format("{0:yyyy-MM-dd H:mm:ss}", fechaActual);

                    writer.WriteElementString("Fechahora", fechaFormateada);

                    //Termina el Tag de ParamConsulta
                    writer.WriteEndElement();
                }
                //Termina el Tag de Detalle
                writer.WriteEndElement();

                //Termina el Tag de ACKSobre
                writer.WriteEndElement();

                //Termina el documento SOBREACK
                writer.WriteEndDocument();

                //Envia el contenido al documento
                writer.Flush();

                //Cierra el documento
                writer.Close();

                FirmaDigital firma = new FirmaDigital();

                //Procede a intentar firmar el xml del ACK
                if (firma.FirmarACK(RutasCarpetas.RutaCarpetaAcuseRecibidoSobre + nombreACK,
                                    RutasCarpetas.RutaCarpetaAcuseRecibidoSobre + nombreACKF))
                {
                    if (!nombreACK.Equals(""))
                    {
                        //Borra el ACK generado
                        System.IO.File.Delete(RutasCarpetas.RutaCarpetaAcuseRecibidoSobre + nombreACK);

                        //Instancia para obtener datos de cuenta de correo electronico
                        ManteUdoCorreos mante  = new ManteUdoCorreos();
                        Correo          correo = mante.Consultar();

                        string[] adjuntos = new string[1];
                        adjuntos[0] = RutasCarpetas.RutaCarpetaAcuseRecibidoSobre + nombreACKF;

                        if (correo != null)
                        {
                            ///Envia correo con una cuenta de gmail
                            Mail mail = new Mail(correoEmisor, correo.Cuenta, Mensaje.cACKAsunto,
                                                 Mensaje.cACKMensaje, Mensaje.pdfServidorGmail, correo.Cuenta, correo.Clave, adjuntos, 587);
                            mail.enviarCorreoGmail();
                        }
                    }
                }
                else
                {
                    //Borra el ACK firmado
                    System.IO.File.Delete(RutasCarpetas.RutaCarpetaAcuseRecibidoSobre + nombreACK);
                }
            }
            catch (Exception)
            {
                if (!nombreACK.Equals(""))
                {
                    //Borra el ACK generado
                    System.IO.File.Delete(RutasCarpetas.RutaCarpetaAcuseRecibidoSobre + nombreACK);
                }

                //SAPbouiCOM.Framework.Application.SBO_Application.MessageBox("RespuestaSobre/Error: " + ex.ToString());
            }
            finally
            {
                //Cierre de documento
                writer.Close();
            }

            return(consecutivo.IdReceptor);
        }
コード例 #7
0
ファイル: RespuestaSobre.cs プロジェクト: ahazan/FE21
        /// <summary>
        /// Metodo para cargar sobres con facturas desde un archivo xml a la tabla TFESOBFAC y TFESOBFACDET
        /// </summary>
        /// <param name="rutaRespuesta"></param>
        public void GenerarXML(string rutaSobre, string nombreSobre, string correoEmisor)
        {
            string                      contenido = "", tag = "", tag2 = "DGICFE:", tag3 = "cfe:";
            bool                        dgiActivado = false, tag3Activado = false;
            ValidarSobre                validaSobre           = new ValidarSobre();
            ValidarCFE                  validaCfe             = new ValidarCFE();
            ManteUdoConsecutivo         manteUdoConsecutivo   = new ManteUdoConsecutivo();
            ManteUdoCertificadoRecibido manteUdoSobreRecibido = new ManteUdoCertificadoRecibido();

            try
            {
                XmlDocument documento = new XmlDocument();
                List <CertificadoRecibido> listaCertificadosRecibidos = new List <CertificadoRecibido>();
                CertificadoRecibido        certificadoRecibido;

                documento.Load(rutaSobre + nombreSobre);

                //Obtiene el contenido del xml en string
                contenido = documento.InnerXml;

                //Se obtiene el nodo princicpal
                XmlNodeList sobre = documento.GetElementsByTagName("DGICFE:EnvioCFE");

                if (sobre.Count == 0)
                {
                    sobre = documento.GetElementsByTagName("EnvioCFE_entreEmpresas");
                }

                if (sobre.Count == 0)
                {
                    sobre       = documento.GetElementsByTagName("DGICFE:EnvioCFE_entreEmpresas");
                    dgiActivado = true;
                }

                if (sobre.Count == 0)
                {
                    sobre        = documento.GetElementsByTagName("cfe:EnvioCFE_entreEmpresas");
                    dgiActivado  = true;
                    tag3Activado = true;
                }

                //Se valida el tipo de tag
                if (ValidarNSTag(documento))
                {
                    tag = "ns0:";
                }

                XmlNodeList caratula = documento.GetElementsByTagName("Caratula");

                if (caratula.Count == 0)
                {
                    caratula = documento.GetElementsByTagName(tag2 + "Caratula");
                }

                if (caratula.Count == 0)
                {
                    caratula = documento.GetElementsByTagName(tag3 + "Caratula");
                }

                foreach (XmlElement nodoCaratula in caratula)
                {
                    certificadoRecibido = new CertificadoRecibido();

                    if (!dgiActivado)
                    {
                        tag2 = "";
                    }


                    if (tag3Activado)
                    {
                        tag2 = tag3;
                        tag  = "";
                    }

                    //Se obtienen los datos de la caratula
                    certificadoRecibido.RucReceptor = nodoCaratula.GetElementsByTagName(tag2 + "RutReceptor")[0].InnerText;
                    certificadoRecibido.RucEmisor   = nodoCaratula.GetElementsByTagName(tag2 + "RUCEmisor")[0].InnerText;
                    certificadoRecibido.IdEmisor    = nodoCaratula.GetElementsByTagName(tag2 + "Idemisor")[0].InnerText;
                    certificadoRecibido.FechaSobre  = nodoCaratula.GetElementsByTagName(tag2 + "Fecha")[0].InnerText;
                    certificadoRecibido.CantCFE     = nodoCaratula.GetElementsByTagName(tag2 + "CantCFE")[0].InnerText;

                    XmlNodeList listaCfes = documento.GetElementsByTagName(tag + "CFE");
                    foreach (XmlElement nodoCfe in listaCfes)
                    {
                        certificadoRecibido.FechaFirma        = nodoCfe.GetElementsByTagName(tag + "TmstFirma")[0].InnerText;
                        certificadoRecibido.TipoCFE           = nodoCfe.GetElementsByTagName(tag + "TipoCFE")[0].InnerText;
                        certificadoRecibido.SerieComprobante  = nodoCfe.GetElementsByTagName(tag + "Serie")[0].InnerText;
                        certificadoRecibido.NumeroComprobante = nodoCfe.GetElementsByTagName(tag + "Nro")[0].InnerText;
                        certificadoRecibido.FechaEmision      = nodoCfe.GetElementsByTagName(tag + "FchEmis")[0].InnerText;
                        certificadoRecibido.RazonSocial       = nodoCfe.GetElementsByTagName(tag + "RznSoc")[0].InnerText;

                        //Datos del CAE
                        certificadoRecibido.DNroCAE = nodoCfe.GetElementsByTagName(tag + "DNro")[0].InnerText;
                        certificadoRecibido.HNroCAE = nodoCfe.GetElementsByTagName(tag + "HNro")[0].InnerText;
                        if (!certificadoRecibido.TipoCFE.Equals("182"))
                        {
                            if (!certificadoRecibido.TipoCFE.Equals("282"))
                            {
                                certificadoRecibido.FVenCAE = nodoCfe.GetElementsByTagName(tag + "FecVenc")[0].InnerText;
                            }
                        }

                        //Se inicializa una nueva lista para el detalle de la factura del sobre
                        certificadoRecibido.DetalleCertificadoRecibido = new List <DetCertificadoRecibido>();

                        string tipoMoneda = "";
                        foreach (XmlElement totales in nodoCfe.GetElementsByTagName(tag + "Totales"))
                        {
                            tipoMoneda = totales.GetElementsByTagName(tag + "TpoMoneda")[0].InnerText;
                        }

                        foreach (XmlElement detalle in nodoCfe.GetElementsByTagName(tag + "Detalle"))
                        {
                            //Se crea un elemento de detalle de factura
                            DetCertificadoRecibido detalleCertificadoRecibido;

                            foreach (XmlElement item in detalle.GetElementsByTagName(tag + "Item"))
                            {
                                detalleCertificadoRecibido = new DetCertificadoRecibido();
                                detalleCertificadoRecibido.NumeroComprobante = certificadoRecibido.NumeroComprobante;
                                detalleCertificadoRecibido.SerieComprobante  = certificadoRecibido.SerieComprobante;
                                detalleCertificadoRecibido.TipoCFE           = certificadoRecibido.TipoCFE;
                                detalleCertificadoRecibido.PrecioUnitario    = item.GetElementsByTagName(tag + "PrecioUnitario")[0].InnerText;
                                detalleCertificadoRecibido.MontoItem         = item.GetElementsByTagName(tag + "MontoItem")[0].InnerText;
                                detalleCertificadoRecibido.NombreItem        = item.GetElementsByTagName(tag + "NomItem")[0].InnerText;
                                string cantidad = item.GetElementsByTagName(tag + "Cantidad")[0].InnerText;
                                cantidad = cantidad.Replace(".", ",");
                                detalleCertificadoRecibido.Cantidad   = double.Parse(cantidad);
                                detalleCertificadoRecibido.TipoMoneda = tipoMoneda;

                                //Se agregan los detalles al sobre
                                certificadoRecibido.DetalleCertificadoRecibido.Add(detalleCertificadoRecibido);
                            }
                        }
                    }
                    listaCertificadosRecibidos.Add(certificadoRecibido);
                }

                ValidarSobre             valida       = new ValidarSobre();
                List <ErrorValidarSobre> listaErrores = new List <ErrorValidarSobre>();
                bool estadoSobre = true;

                if (!valida.validarRucSobreContraComprobante(documento, listaErrores, tag))
                {
                    estadoSobre = false;
                }

                if (!valida.validarCantidadCfe(documento, listaErrores, tag))
                {
                    estadoSobre = false;
                }

                //Valida el sobre con el XSD
                if (!valida.ValidarXsdSobre(contenido))
                {
                    estadoSobre = false;
                    foreach (string rechazo in ValidarSobre.erroresEncontrados)
                    {
                        ErrorValidarSobre error = new ErrorValidarSobre();
                        error.CodigoRechazo  = Mensaje.errSobValXsdCod;
                        error.DetalleRechazo = Mensaje.errSobValXsdDet;
                        error.GlosaRechazo   = rechazo;
                        listaErrores.Add(error);
                    }
                }

                if (estadoSobre)
                {
                    //Sobre validado

                    foreach (CertificadoRecibido certRecibido in listaCertificadosRecibidos)
                    {
                        certRecibido.IdConsecutio = "";

                        //Se insertan los datos en la tabla de la BD
                        manteUdoSobreRecibido.AlmacenarMaestro(certRecibido, correoEmisor, nombreSobre);
                    }
                }
                else
                {
                    //Sobre rechazado
                    if (listaCertificadosRecibidos.Count > 0)
                    {
                        GenerarACK("BS", listaCertificadosRecibidos[0], correoEmisor, listaErrores, nombreSobre);
                    }
                }
            }

            catch (Exception)
            {
                //SAPbouiCOM.Framework.Application.SBO_Application.MessageBox("RespuestaSobre/GenerarXml/Error:" + ex.ToString());
            }
        }