¿Cómo crear el archivo pdf a partir de un xml timbrado 3.3 C# .Net? | Creación de QR | SAT #3

En este tercer video te mostrare como crear el código QR como lo exige el SAT.

Código del video: clic aquí

Primer video: https://www.youtube.com/watch?v=gHSC8GrEC5g

Segundo video: https://www.youtube.com/watch?v=ZppyFAM2JQM

Cuarto video: https://youtu.be/0nmqpoCTUuM

Curso para que aprendas a crear el xml 3.3 desde cero: https://www.youtube.com/watch?v=XlTz0NRQLm4&list=PLWYKfSbdsjJg-yuu9K53GwthkEE8lkXDL

Catálogos sat mysql: https://hdeleon.net/catalogos-para-facturar-3-3-sat-en-mysql/

¿Por qué se cae el sistema de facturación electrónica del SAT? Cfdi 3.3, Facturación Electrónica



¿Cuantas veces este año te ha pasado que quieres hacer una factura en el sistema del SAT y resulta que esta muerto?

Yo como contribuyente y como desarrollador de software me puedo dar cuenta de las deficiencias de sistemas como lo es el sistema para facturación del SAT que es gratuito para todos los contribuyentes. Pero muchas personas que tienen pocos conocimientos de informática solo se enfrentan a la siguiente pantalla famosa cada que desean hacer una factura en el sistema gratuito del SAT (15 y ultimo de mes es ya un mal común):

A continuación te explicare por que pasa esto, y porque esto es algo que debe cambiar.

Para entender cómo funciona un sistema web, en el caso del sistema para realizar tu factura gratuitamente en el portal del SAT, te explicare como funciona un sistema web.

Los sistemas web son alojados en servidores, imagina que el sistema web del SAT es un restaurante, tú vas a comer al restaurante por que necesitas comer (el SAT te crea la necesidad de facturar), te diriges y pides tú platillo al mesero, y como todo restaurante el número de meseros es limitado, ¿Qué pasa cuando el restaurante está casi lleno de comensales? Los meseros tardaran más en atender a los clientes, es lo mismo que pasa cuando el sistema de facturación se satura, se comienza a hacer lento el sistema.

Pero hay otro punto que hay que mencionar. ¿Qué pasa cuando el restaurante está lleno al tope? Se comienza a hacer una espera de personas fuera del lugar las cuales no pueden ser atenidas, aquí es donde te encuentras tu todos los días 15 y fin de mes, en la sala de espera haciendo fila por tu turno.

¿Qué es lo que debería hacer un sistema cuando está saturado? Para esto al igual que un restaurante se aumentan recursos, cuando se diseña un sistema, se contempla el número de usuarios que habrá multiplicado por la carga de los procesos, y se analiza si es suficiente el hardware empleado, en caso de que no sea suficiente se contempla un segundo servidor y es repartida la carga. Al igual que los restaurantes, cuando está saturado un negocio, este amplía su espacio o crea una nueva sucursal, y de esta manera los clientes que van a comer se dispersan según el lugar este más vacio. Obviamente al resolver este problema cuesta, pero ahorita veremos que es algo insignificante para lo que recaba el SAT.

Obviamente el SAT sabe la carga que recibirá su sistema, y puede fácilmente arreglar el problema, pero les diré algo, no quiere ni lo hará, ya que el SAT opto por otra solución, creo franquicias llamadas PAC. Creo un negocio basado en una necesidad.

El SAT presume de una recaudación récord, una recaudación que no se nota en sus sistemas ineficientes, mal diseñados, mal organizados, y sobre todo inestables. Solo te diré a ti lector, que si el SAT invirtiera de sus $ 52,700,000,000.00 recaudados en el 2017 solo el 0.0001% (poco más de 5 millones de pesos), créanme, jamás tendría porque caerse el sistema gratuito para facturación (¿Quien se beneficia con al facturación electrónica 3.3?).

Ahora ya sabes porque cada 15 y fin de mes no puedes realizar tu factura, simplemente por que el SAT solo quiere que contrates un sistema de tercero, una franquicia llamada PAC.

Si el SAT te exige, tú debes exigir una herramienta decente y gratuita para facturar.

 

¿Cómo crear el archivo pdf a partir de un xml timbrado 3.3 C# .Net? | Convertir Html a PDF con ayuda de Razor | SAT #2

En este segundo video te mostrare una forma fácil de crear un archivo PDF a partir de un archivo HTML, y con ayuda de Razor poder incrustar nuestro objeto Comprobante obtenido en el primer video.

Código del video: clic aquí

Video 1: https://hdeleon.net/como-crear-el-archivo-pdf-a-partir-de-un-xml-timbrado-3-3-c-net-xml-a-clase-objeto-sat-1/

Video 3: https://hdeleon.net/como-crear-el-archivo-pdf-a-partir-de-un-xml-timbrado-3-3-c-net-creacion-de-qr-sat-3/

Curso para que aprendas a crear el xml 3.3 desde cero: https://hdeleon.net/curso-para-crear-la-factura-electronica-3-3-cfdi-del-sat-gratis-en-c-net/

Catálogos sat mysql: https://hdeleon.net/catalogos-para-facturar-3-3-sat-en-mysql/

¿Cómo pasar un archivo XML de factura electrónica 3.3 timbrado a una clase u objeto en C# .Net? cfdi SAT

Para convertir un archivo XML ya timbrado a un objeto en C# haremos uso de la deserialización.

Lo primero que debes hacer es descargar las 2 clases que están debajo, estas clases fueron generadas por medio de los xsd del SAT (Como convertir un archivo xsd a clases).

cfdv33_tdCFDI_catCFDI.cs

TimbreFiscalDigitalv11_tdCFDI.cs

Una vez que tengas estas clases debes hacer lo siguiente (comento línea a línea para que entiendas el flujo):


 //crear un objeto el cual tendrá el resultado final, este objeto es el principal
 Comprobante oComprobante;
//pon la ruta donde tienes tu archivo XML Timbrado
 string path = @"C:\miXML.xml";

//creamos un objeto XMLSerializer para deserializar
XmlSerializer oSerializer = new XmlSerializer(typeof(Comprobante));

//creamos un flujo el cual recibe nuestro xml
using (StreamReader reader= new StreamReader(path))
{
      //aqui deserializamos
      oComprobante = (Comprobante)oSerializer.Deserialize(reader);

      //Deserializamos el complemento timbre fiscal
      foreach (var oComplemento in oComprobante.Complemento)
      {
              foreach (var oComplementoInterior in oComplemento.Any)
              {
                        //si el complemento es TimbreFiscalDigital lo deserializamos
                        if (oComplementoInterior.Name.Contains("TimbreFiscalDigital")) { 

                            //Objeto para aplicar ahora la deserialización del complemento timbre
                            XmlSerializer oSerializerComplemento = new XmlSerializer(typeof(TimbreFiscalDigital));
                            //creamos otro flujo para el complemento
                            using (var readerComplemento = new StringReader(oComplementoInterior.OuterXml))
                            {
                                //y por ultimo deserializamos el complemento
                                oComprobante.TimbreFiscalDigital =
                                    (TimbreFiscalDigital)oSerializerComplemento.Deserialize(readerComplemento);
                            }

                        }
                    }
                }
            }

Te invito a que tomes mi curso gratuito para crear la factura electrónica 3.3, en menos de 1 hr ya serás capaz de desarrollar módulos para facturación según obliga el SAT.

¿Cómo timbrar el XML para cfdi 3.3 facturación electrónica C# .Net? – conectandonos al PAC – SAT #6

Para contratar el servicio de timbrado comunícate al siguiente teléfono (33) 36581329 o al correo electrónico [email protected]. Y si deseas un DESCUENTO diles que viste los videos de Héctor de León o hdeleon.

En este video te mostrare como timbrar el xml que en los videos anteriores construimos y sellamos.

Descargar proyecto hecho en el video: clic aquí.

Video 1: https://www.youtube.com/watch?v=XlTz0NRQLm4

Video 2: https://www.youtube.com/watch?v=HjfqdTspnio

Video 3: https://www.youtube.com/watch?v=qIr-LdCzfF0

Video 4: https://www.youtube.com/watch?v=suRypKtb7VU

Video 5: https://www.youtube.com/watch?v=FBcEeEpgwr0

Catálogos sat mysql: https://hdeleon.net/catalogos-para-facturar-3-3-sat-en-mysql/


class Program
    {
        //modifiquen por su path
        static private string path = @"C:\Users\Bioxor\source\repos\Facturacion3.3-tutorial-hdeleon\";
        static string pathXML = path + @"miPrimerXML.xml";

        static void Main(string[] args)
        {
            //Obtener numero certificado------------------------------------------------------------

            string pathCer = path+@"XSDToXML\CSD01_AAA010101AAA.cer";
            string pathKey = path+@"XSDToXML\CSD01_AAA010101AAA.key";
            string clavePrivada = "12345678a";

            //Obtenemos el numero
            string numeroCertificado, aa, b, c;
            SelloDigital.leerCER(pathCer, out aa, out b, out c, out numeroCertificado);

            //Llenamos la clase COMPROBANTE--------------------------------------------------------
            Comprobante oComprobante = new Comprobante();
            oComprobante.Version = "3.3";
            oComprobante.Serie = "H";
            oComprobante.Folio = "1";
            oComprobante.Fecha = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss");
           // oComprobante.Sello = "faltante"; //sig video
            oComprobante.FormaPago = "99";
            oComprobante.NoCertificado = numeroCertificado;
           // oComprobante.Certificado = ""; //sig video
            oComprobante.SubTotal = 10m;
            oComprobante.Descuento = 1;
            oComprobante.Moneda = "MXN";
            oComprobante.Total = 9;
            oComprobante.TipoDeComprobante = "I";
            oComprobante.MetodoPago = "PUE";
            oComprobante.LugarExpedicion = "20131";

            ComprobanteEmisor oEmisor = new ComprobanteEmisor();

            oEmisor.Rfc = "LEGH870601DM7";
            oEmisor.Nombre = "Una razón rh de cv";
            oEmisor.RegimenFiscal = "605";

            ComprobanteReceptor oReceptor = new ComprobanteReceptor();
            oReceptor.Nombre = "Pepe SA DE CV";
            oReceptor.Rfc = "BIO091204LB1";
            oReceptor.UsoCFDI = "P01";

            //asigno emisor y receptor
            oComprobante.Emisor = oEmisor;
            oComprobante.Receptor = oReceptor;

            List<ComprobanteConcepto> lstConceptos = new List<ComprobanteConcepto>();
            ComprobanteConcepto oConcepto = new ComprobanteConcepto();
            oConcepto.Importe = 10m;
            oConcepto.ClaveProdServ = "92111704";
            oConcepto.Cantidad = 1;
            oConcepto.ClaveUnidad = "C81";
            oConcepto.Descripcion = "Un misil para la guerra";
            oConcepto.ValorUnitario = 10m;
            oConcepto.Descuento = 1;

            lstConceptos.Add(oConcepto);

            oComprobante.Conceptos = lstConceptos.ToArray();

            //Creamos el xml
            CreateXML(oComprobante);

            string cadenaOriginal = "";
            string pathxsl = path+ @"XSDToXML\cadenaoriginal_3_3.xslt";
            System.Xml.Xsl.XslCompiledTransform transformador = new System.Xml.Xsl.XslCompiledTransform(true);
            transformador.Load(pathxsl);

            using (StringWriter sw= new StringWriter())
            using (XmlWriter xwo= XmlWriter.Create(sw,transformador.OutputSettings)) {

                transformador.Transform(pathXML, xwo);
                cadenaOriginal = sw.ToString();
            }

            SelloDigital oSelloDigital = new SelloDigital();
            oComprobante.Certificado = oSelloDigital.Certificado(pathCer);
            oComprobante.Sello = oSelloDigital.Sellar(cadenaOriginal, pathKey, clavePrivada);

            CreateXML(oComprobante);

            //TIMBRE DEL XML
            ServiceReferenceFC.RespuestaCFDi respuestaCFDI = new ServiceReferenceFC.RespuestaCFDi();

            byte[] bXML = System.IO.File.ReadAllBytes(pathXML);

            ServiceReferenceFC.TimbradoClient oTimbrado =new ServiceReferenceFC.TimbradoClient();

            respuestaCFDI = oTimbrado.TimbrarTest("TEST010101ST1", "aaaaaa", bXML);

            if (respuestaCFDI.Documento == null) {
                Console.WriteLine(respuestaCFDI.Mensaje);
            }
            else
            {

                System.IO.File.WriteAllBytes(pathXML, respuestaCFDI.Documento);
            }

        }

        private static void CreateXML(Comprobante oComprobante)
        {
            //SERIALIZAMOS.-------------------------------------------------

            XmlSerializerNamespaces xmlNameSpace = new XmlSerializerNamespaces();
            xmlNameSpace.Add("cfdi", "http://www.sat.gob.mx/cfd/3");
            xmlNameSpace.Add("tfd", "http://www.sat.gob.mx/TimbreFiscalDigital");
            xmlNameSpace.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");

            XmlSerializer oXmlSerializar = new XmlSerializer(typeof(Comprobante));

            string sXml = "";

            using (var sww = new Utils.StringWriterWithEncoding(Encoding.UTF8))
            {

                using (XmlWriter writter = XmlWriter.Create(sww))
                {

                    oXmlSerializar.Serialize(writter, oComprobante,xmlNameSpace);
                    sXml = sww.ToString();
                }

            }

            //guardamos el string en un archivo
            System.IO.File.WriteAllText(pathXML, sXml);
        }
    }

Curso para crear la factura electrónica 3.3 cfdi del SAT GRATIS en C# .Net




Gratuitamente te enseñare como puedes crear tu factura electrónica con los siguientes videos, te aseguro que después de ver los videos podrás entender a la perfección como realizar el cfdi 3.3 que tanto martirio tiene a todos los contribuyentes en México.

Te invito a que te suscribas a mi canal de youtube para mas videos interesantes sobre programación.

1.- ¿Cómo convertir archivos XSD a clases de C# .Net? cfdi 3.3 

En este primer video te muestro como generar automáticamente las clase a partir de los archivos xsd del SAT.

2.- ¿Cómo crear el XML para cfdi 3.3 facturación electrónica C# .Net? – Limpiando código 

Una vez que creaste las clases de manera automatica, es momento de optimizarlas, y a continuación te muestro como hacerlo.

3.- ¿Cómo crear el XML para cfdi 3.3 facturación electrónica C# .Net? – implementando anexo 20

Ya por fin que tenemos nuestras clases adecuadas para crear el archivo XML, es momento de ir llenandolo conforme el anexo 20 del SAT, para ello te explico los campos del SAT para que son y como llenarlos de la forma correcta.

4.- ¿Cómo sellar el XML para cfdi 3.3 facturación electrónica C# .Net? – utf8, obtener número de Certificado

Ya que tenemos el xml listo, es momento comenzar el sellado, y te diré como obtener el numero del certificado; tambien te enseñare como cambiar la codificación de tu xml a utf8.

5.- ¿Cómo sellar el XML para cfdi 3.3 facturación electrónica C# .Net? – Sellar con key

Ya por fin vamos a sellar nuestro xml con nuestro archivo key, al igual te mostrare como arreglar el problema con los campos FieldSpecified que se generaron al crear nuestras clases en el primer video, agregar los namespace adecuados del SAT, y a obtener la cadena original por medio del archivo xslt necesaria para el sellado.

6.- ¿Cómo timbrar el XML para cfdi 3.3 facturación electrónica C# .Net? – conectandonos al PAC

Ya por fin en este vide veras como realizar el mitico timbrado de la factura, con lo cual tu factura ya sera valida para el SAT.

Para contratar el servicio de timbrado comunícate al siguiente teléfono (33) 36581329 o al correo electrónico [email protected]. Y si deseas un DESCUENTO diles que viste los videos de Héctor de León.

Si eres un perezoso o te urge hacer la facturación electrónica, te dejo el enlace al código del proyecto, espero te sirva: Código del proyecto

Dudas y comentarios pueden hacérmelos llegar en los comentarios abajo.

¿Cómo sellar el XML para cfdi 3.3 facturación electrónica C# .Net? – Sellar con key – SAT #5

En este video te mostrare como contrarrestar los campos FieldSpecified creados en el primer video, poner el formato correcto de fecha, obtener la cadena original, obtener el campo certificado, poner los namespaces al xml, y por ultimo como sellar el xml con tu key.

Descargar proyecto hecho en el video: clic aquí.

Video 1: https://www.youtube.com/watch?v=XlTz0NRQLm4

Video 2: https://www.youtube.com/watch?v=HjfqdTspnio

Video 3: https://www.youtube.com/watch?v=qIr-LdCzfF0

Video 4: https://www.youtube.com/watch?v=suRypKtb7VU

Catálogos sat mysql: https://hdeleon.net/catalogos-para-facturar-3-3-sat-en-mysql/

Puedes preguntarme sobre programación aquí: https://www.youtube.com/watch?v=M84D75OcuUU


//CÓDIGO UTILIZADO EN EL VIDEO
 class Program
    {
        //modifiquen por su path
        static private string path = @"C:\Users\Bioxor\source\repos\Facturacion3.3-tutorial-hdeleon\";
        static string pathXML = path + @"miPrimerXML.xml";

        static void Main(string[] args)
        {
            //Obtener numero certificado------------------------------------------------------------

            string pathCer = path+@"XSDToXML\CSD01_AAA010101AAA.cer";
            string pathKey = path+@"XSDToXML\CSD01_AAA010101AAA.key";
            string clavePrivada = "12345678a";

            //Obtenemos el numero
            string numeroCertificado, aa, b, c;
            SelloDigital.leerCER(pathCer, out aa, out b, out c, out numeroCertificado);

            //Llenamos la clase COMPROBANTE--------------------------------------------------------
            Comprobante oComprobante = new Comprobante();
            oComprobante.Version = "3.3";
            oComprobante.Serie = "H";
            oComprobante.Folio = "1";
            oComprobante.Fecha = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss");
           // oComprobante.Sello = "faltante"; //sig video
            oComprobante.FormaPago = "99";
            oComprobante.NoCertificado = numeroCertificado;
           // oComprobante.Certificado = ""; //sig video
            oComprobante.SubTotal = 10m;
            oComprobante.Descuento = 1;
            oComprobante.Moneda = "MXN";
            oComprobante.Total = 9;
            oComprobante.TipoDeComprobante = "I";
            oComprobante.MetodoPago = "PUE";
            oComprobante.LugarExpedicion = "20131";

            ComprobanteEmisor oEmisor = new ComprobanteEmisor();

            oEmisor.Rfc = "POWE870601DM7";
            oEmisor.Nombre = "Una razón rh de cv";
            oEmisor.RegimenFiscal = "605";

            ComprobanteReceptor oReceptor = new ComprobanteReceptor();
            oReceptor.Nombre = "Pepe SA DE CV";
            oReceptor.Rfc = "PEPE080801JH1";
            oReceptor.UsoCFDI = "P01";

            //asigno emisor y receptor
            oComprobante.Emisor = oEmisor;
            oComprobante.Receptor = oReceptor;

            List<ComprobanteConcepto> lstConceptos = new List<ComprobanteConcepto>();
            ComprobanteConcepto oConcepto = new ComprobanteConcepto();
            oConcepto.Importe = 10m;
            oConcepto.ClaveProdServ = "92111704";
            oConcepto.Cantidad = 1;
            oConcepto.ClaveUnidad = "C81";
            oConcepto.Descripcion = "Un misil para la guerra";
            oConcepto.ValorUnitario = 10m;
            oConcepto.Descuento = 1;

            lstConceptos.Add(oConcepto);

            oComprobante.Conceptos = lstConceptos.ToArray();

            //Creamos el xml
            CreateXML(oComprobante);

            string cadenaOriginal = "";
            string pathxsl = path+ @"XSDToXML\cadenaoriginal_3_3.xslt";
            System.Xml.Xsl.XslCompiledTransform transformador = new System.Xml.Xsl.XslCompiledTransform(true);
            transformador.Load(pathxsl);

            using (StringWriter sw= new StringWriter())
            using (XmlWriter xwo= XmlWriter.Create(sw,transformador.OutputSettings)) {

                transformador.Transform(pathXML, xwo);
                cadenaOriginal = sw.ToString();
            }

            SelloDigital oSelloDigital = new SelloDigital();
            oComprobante.Certificado = oSelloDigital.Certificado(pathCer);
            oComprobante.Sello = oSelloDigital.Sellar(cadenaOriginal, pathKey, clavePrivada);

            CreateXML(oComprobante);

        }

        private static void CreateXML(Comprobante oComprobante)
        {
            //SERIALIZAMOS.-------------------------------------------------

            XmlSerializerNamespaces xmlNameSpace = new XmlSerializerNamespaces();
            xmlNameSpace.Add("cfdi", "http://www.sat.gob.mx/cfd/3");
            xmlNameSpace.Add("tfd", "http://www.sat.gob.mx/TimbreFiscalDigital");
            xmlNameSpace.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");

            XmlSerializer oXmlSerializar = new XmlSerializer(typeof(Comprobante));

            string sXml = "";

            using (var sww = new Utils.StringWriterWithEncoding(Encoding.UTF8))
            {

                using (XmlWriter writter = XmlWriter.Create(sww))
                {

                    oXmlSerializar.Serialize(writter, oComprobante,xmlNameSpace);
                    sXml = sww.ToString();
                }

            }

            //guardamos el string en un archivo
            System.IO.File.WriteAllText(pathXML, sXml);
        }
    }

¿Cómo sellar el XML para cfdi 3.3 facturación electrónica C# .Net? – utf8, obtener No Cer – SAT #4

En este video te mostrare como crear tu xml en utf8, también a obtener el número del certificado a partir del archivo Cer e incluirlo en el xml.

Descargar código del tutorial

Certificados de prueba: http://www.sat.gob.mx/informacion_fiscal/factura_electronica/Paginas/certificado_sello_digital.aspx

Video 1: https://www.youtube.com/watch?v=XlTz0NRQLm4

Video 2: https://www.youtube.com/watch?v=HjfqdTspnio

Video 3: https://www.youtube.com/watch?v=qIr-LdCzfF0

Catálogos sat mysql: https://hdeleon.net/catalogos-para-facturar-3-3-sat-en-mysql/

¿Cómo crear el XML para cfdi 3.3 facturación electrónica C# .Net? – implementando anexo 20 – SAT #3

Te muestro como crear el xml según la documentación del SAT establecida en el anexo 20.

Clase para crear el XML: clic aquí

Video 1: https://www.youtube.com/watch?v=XlTz0NRQLm4

Video 2: https://www.youtube.com/watch?v=HjfqdTspnio

Catálogos SAT mysql: https://hdeleon.net/catalogos-para-facturar-3-3-sat-en-mysql/


 class Program
    {
        static void Main(string[] args)
        {

            //Llenamos la clase COMPROBANTE--------------------------------------------------------

            Comprobante oComprobante = new Comprobante();
            oComprobante.Version = "3.3";
            oComprobante.Serie = "H";
            oComprobante.Folio = "1";
            oComprobante.Fecha = DateTime.Now;
            oComprobante.Sello = "faltante"; //sig video
            oComprobante.FormaPago = "99";
            oComprobante.NoCertificado = "12312312313112121212"; //sig video
            oComprobante.Certificado = ""; //sig video
            oComprobante.SubTotal = 10m;
            oComprobante.Descuento =1;
            oComprobante.Moneda = "MXN";
            oComprobante.Total =9;
            oComprobante.TipoDeComprobante = "I";
            oComprobante.MetodoPago = "PUE";
            oComprobante.LugarExpedicion = "20131";

            ComprobanteEmisor oEmisor = new ComprobanteEmisor();

            oEmisor.Rfc = "POWE870601DM7";
            oEmisor.Nombre = "Una razón rh de cv";
            oEmisor.RegimenFiscal = "605";

            ComprobanteReceptor oReceptor = new ComprobanteReceptor();
            oReceptor.Nombre = "Pepe SA DE CV";
            oReceptor.Rfc = "PEPE080801JH1";
            oReceptor.UsoCFDI = "P01";

            //asigno emisor y receptor
            oComprobante.Emisor = oEmisor;
            oComprobante.Receptor = oReceptor;

            List<ComprobanteConcepto> lstConceptos = new List<ComprobanteConcepto>();
            ComprobanteConcepto oConcepto = new ComprobanteConcepto();
            oConcepto.Importe = 10m;
            oConcepto.ClaveProdServ = "92111704";
            oConcepto.Cantidad = 1;
            oConcepto.ClaveUnidad = "C81";
            oConcepto.Descripcion = "Un misil para la guerra";
            oConcepto.ValorUnitario = 10m;
            oConcepto.Descuento = 1;

            lstConceptos.Add(oConcepto);

            oComprobante.Conceptos = lstConceptos.ToArray();

            //SERIALIZAMOS.-------------------------------------------------
            string pathXML = @"C:\Users\Bioxor\source\repos\XSDToXML\miPrimerXML.xml";

            XmlSerializer oXmlSerializar = new XmlSerializer(typeof(Comprobante));

            string sXml = "";

            using (var sww= new StringWriter())
            {
                using (XmlWriter writter = XmlWriter.Create(sww))
                {

                    oXmlSerializar.Serialize(writter,oComprobante);
                    sXml = sww.ToString();
                }

            }

            //guardamos el string en un archivo
            System.IO.File.WriteAllText(pathXML,sXml);

        }
    }