public static ResAcc<FacturaElectronica> GenerarXml(FacturaElectronica oFactura) { // Se genera el xml con los datos de la factura var ResProcs = FacturaXml.GenerarXmlDeObjeto(oFactura); string sFacturaXml = ResProcs.Respuesta; // Se transforma al Xml requerido por el Sat v3.2 ResProcs = FacturaXml.TransformarXml(sFacturaXml, Properties.Resources.Cfdi3_2); if (ResProcs.Error) return new ResAcc<FacturaElectronica>(false, ResProcs.Mensaje); string sCfdiXml = ResProcs.Respuesta; // Se valida el Xml generado ResProcs = FacturaXml.ValidarXml(sCfdiXml, Properties.Resources.cfdv32); if (ResProcs.Error) return new ResAcc<FacturaElectronica>(false, ResProcs.Mensaje); // Se genera la cadena original ResProcs = FacturaXml.TransformarXml(sCfdiXml, Properties.Resources.cadenaoriginal_3_2); if (ResProcs.Error) return new ResAcc<FacturaElectronica>(false, ResProcs.Mensaje); string sCadenaOriginal = System.Web.HttpUtility.HtmlDecode(ResProcs.Respuesta); // Se genera la cadena del sello digital var Seguridad = new FacturaSeguridad(); ResProcs = Seguridad.GenerarSelloDigital(oFactura.Configuracion.RutaArchivoKey, oFactura.Configuracion.ContraseniaArchivoKey, sCadenaOriginal); if (ResProcs.Error) return new ResAcc<FacturaElectronica>(false, ResProcs.Mensaje); string sSelloDigital = ResProcs.Respuesta; // Se agregan los nuevos datos al xml a generar var oCertificado = Seguridad.DatosCertificado(oFactura.Configuracion.RutaCertificado); XmlDocument oXml = new XmlDocument(); oXml.LoadXml(sCfdiXml); oXml.DocumentElement.Attributes["noCertificado"].Value = oCertificado["NumeroDeSerie"]; oXml.DocumentElement.Attributes["certificado"].Value = oCertificado["ContenidoBase64"]; oXml.DocumentElement.Attributes["sello"].Value = sSelloDigital; // Se guarda el xml con los cambios var oTexto = new StringWriterMod(Encoding.UTF8); var oEscXml = XmlWriter.Create(oTexto, FacturaXml.ConfigXml); oXml.Save(oEscXml); ResProcs.Exito = true; ResProcs.Respuesta = oTexto.ToString(); oFactura.NumeroDeCertificado = oCertificado["NumeroDeSerie"]; oFactura.Certificado = oCertificado["ContenidoBase64"]; oFactura.Sello = sSelloDigital; oFactura.XmlFactura = ResProcs.Respuesta; return new ResAcc<FacturaElectronica>(true, oFactura); }
public static ResAcc <FacturaElectronica> GenerarXml(FacturaElectronica oFactura) { // Se genera el xml con los datos de la factura var ResProcs = FacturaXml.GenerarXmlDeObjeto(oFactura); string sFacturaXml = ResProcs.Respuesta; // Se transforma al Xml requerido por el Sat v3.2 ResProcs = FacturaXml.TransformarXml(sFacturaXml, Properties.Resources.Cfdi3_2); if (ResProcs.Error) { return(new ResAcc <FacturaElectronica>(false, ResProcs.Mensaje)); } string sCfdiXml = ResProcs.Respuesta; // Se valida el Xml generado ResProcs = FacturaXml.ValidarXml(sCfdiXml, Properties.Resources.cfdv32); if (ResProcs.Error) { return(new ResAcc <FacturaElectronica>(false, ResProcs.Mensaje)); } // Se genera la cadena original ResProcs = FacturaXml.TransformarXml(sCfdiXml, Properties.Resources.cadenaoriginal_3_2); if (ResProcs.Error) { return(new ResAcc <FacturaElectronica>(false, ResProcs.Mensaje)); } string sCadenaOriginal = System.Web.HttpUtility.HtmlDecode(ResProcs.Respuesta); // Se genera la cadena del sello digital var Seguridad = new FacturaSeguridad(); ResProcs = Seguridad.GenerarSelloDigital(oFactura.Configuracion.RutaArchivoKey, oFactura.Configuracion.ContraseniaArchivoKey, sCadenaOriginal); if (ResProcs.Error) { return(new ResAcc <FacturaElectronica>(false, ResProcs.Mensaje)); } string sSelloDigital = ResProcs.Respuesta; // Se agregan los nuevos datos al xml a generar var oCertificado = Seguridad.DatosCertificado(oFactura.Configuracion.RutaCertificado); XmlDocument oXml = new XmlDocument(); oXml.LoadXml(sCfdiXml); oXml.DocumentElement.Attributes["noCertificado"].Value = oCertificado["NumeroDeSerie"]; oXml.DocumentElement.Attributes["certificado"].Value = oCertificado["ContenidoBase64"]; oXml.DocumentElement.Attributes["sello"].Value = sSelloDigital; // Se guarda el xml con los cambios var oTexto = new StringWriterMod(Encoding.UTF8); var oEscXml = XmlWriter.Create(oTexto, FacturaXml.ConfigXml); oXml.Save(oEscXml); ResProcs.Exito = true; ResProcs.Respuesta = oTexto.ToString(); oFactura.NumeroDeCertificado = oCertificado["NumeroDeSerie"]; oFactura.Certificado = oCertificado["ContenidoBase64"]; oFactura.Sello = sSelloDigital; oFactura.XmlFactura = ResProcs.Respuesta; return(new ResAcc <FacturaElectronica>(true, oFactura)); }