¿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);

        }
    }

¿Cómo ejecutar una URL desde SQL Server? Transact-SQL

Es posible ejecutar una url desde SQL Server, esto es útil si quieres realizar algunas tareas programadas por medio de SQL Agent, tareas que inicien por una Url de tu pagina o sistema.

A continuación te muestro cómo es posible ejecutar una URL desde Sql Server.


-- declaramos una variable cadena y ponemos la url a invocar
Declare @url varchar(max)='https://hdeleon.net/'
-- declaramos una variable entero, para guardar el id del objeto OLE que crearemos
Declare @Object as Int;
-- Una variable cadena para la respuesta
Declare @ResponseText as Varchar(8000);

-- creamos un objeto OLE
Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
-- Ejecutamos la url por medio de post
Exec sp_OAMethod @Object, 'open', NULL, 'post',@url,'false'
Exec sp_OAMethod @Object, 'send'
Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT

-- imprimimos resultado
Select @ResponseText

--eliminamos nuestro id de objeto OLE
Exec sp_OADestroy @Object

Con esto ya puedes ejecutar cualquier URL desde Sql Server.

¿Cómo poner el formato correcto de fecha para facturación electrónica 3.3 en C# .Net? cfdi SAT

Para ponerle el formato correcto para un xml que será timbrado con las reglas de cfdi 3.3, vamos a aplicar el formato a un DateTime de la siguiente forma:


//teniendo el dato en un DateTime en una variable llamada Fecha

string sFechaSAT= Fecha.ToString("yyyy-MM-ddTHH:mm:ss");

Así tu fecha tendrá el formato correcto para el timbrado.

¿Cómo poner la ruta relativa a un archivo SQLite en una conexión en .Net?

Para que nuestra conexión a un archivo de SQLite sea relativa y funcione en cualquier equipo solo basta con agregar “.\” al inicio de la ruta en nuestra cadena de conexión (AppConfig o WebConfig).

Por ejemplo si nuestra base de datos está en una carpeta de nombre Data y el archivo se llama MiData.db, quedaría de la siguiente manera:


data source=.\Data\MiData.db

Recuerda que el archivo de la base de datos tenga en su propiedad la opción “Copiar siempre”, para que este en la carpeta Debug o Release según corresponda.

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

Este es el segundo video de cómo crear un xml para la creación del cfdi 3.3 de acuerdo a las especificaciones del SAT:

Clase para crear xml: clic para descargar

Primer video – ¿Cómo convertir archivos XSD a clases de C# .Net?: https://www.youtube.com/watch?v=XlTz0NRQLm4

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

Catálogos SAT Sql Server: https://hdeleon.net/catalogos-para-facturar-cfdi-3-3-sat-en-sql-server/


Comprobante oComprobante = new Comprobante();
oComprobante.Folio = "666";

ComprobanteEmisor oEmisor = new ComprobanteEmisor();
oEmisor.Rfc = "POWE870601DM7";
oEmisor.Nombre = "Una razón";
oEmisor.RegimenFiscal = c_RegimenFiscal.Item605;

ComprobanteReceptor oReceptor = new ComprobanteReceptor();
 oReceptor.Nombre = "Pepe";
 oReceptor.Rfc = "PEPE080801JH1";

oComprobante.Emisor = oEmisor; oComprobante.Receptor = oReceptor;

//SERIALIZAMOS.-------------------------------------------------
string pathXML = @"C:\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);

¿Cómo cambiar el color de fondo de un Formulario que es contenedor de formularios secundarios MDI? C# .Net

Cuando creamos nuestro sistema en Windows form y el formulario principal lo convertimos en MDI, la mayoría de veces queremos cambiar el color gris por defecto a otro, pero nos damos cuenta que al cambiar el color no cambia el gris oscuro del MDI, esto es porque al crear el formulario MDI en realidad se está incorporando otro control de tipo MdiClient.

A continuación te muestro como podemos cambiar el color del MdiCliente:


//Haz esto en el evento Load de tu formulario MDI

 MdiClient oMDI;

//recorremos todos los controles hijos del formulario
foreach (Control ctl in this.Controls)
{
        try
        {
           // Intentamos castear el objeto MdiClient
           oMDI = (MdiClient)ctl;

          // Cuando sea casteado con éxito, podremos cambiar el color así
          oMDI.BackColor = Color.White;
        }
        catch (InvalidCastException exc)
        {
          // No hacemos nada cuando el control no sea tupo MdiClient
        }
}