¿Cómo enviar un objeto json en una solicitud Get o Post en C# .Net?

Ahora que estamos en la era de los webservice todos tenemos la necesidad de saber la forma de enviar datos por medio de Get o Post. En C# la forma de hacer una solicitud a un servicio o a un api es muy sencilla y en el siguiente ejemplo te muestro como hacerlo por medio de una clase que yo hice.

La clase siguiente está preparada para enviar cualquier tipo de objeto ya que recibe el tipo de objeto que se enviara y lo serializa en json.

Recuerda que si el objeto tiene referencias circulares, la siguiente clase no funcionara.

Clase:


public class RequestHdeleon

  //esta clase nos sirve para tener control del resultado regresado por la solicitud
  public class Reply
    {
        public Reply()
        {
            this.success = 0;
            message = "";
        }

        public int success { get; set; }
        public object data { get; set; }
        public String menssage { get; set; }

    }

  public Reply Send<T>(string url,T objectRequest, string method="POST"){

            try {
		Reply oReply= new Reply();                

                JavaScriptSerializer js = new JavaScriptSerializer();

		//serializamos el objeto
                string json = Newtonsoft.Json.JsonConvert.SerializeObject(objectRequest);

                //peticion
                WebRequest request = WebRequest.Create(url_callback);
                //headers
                request.Method = method;
                request.PreAuthenticate = true;
                request.ContentType = "application/json;charset=utf-8'";
                request.Timeout = 10000; //esto es opcional

                using (var streamWriter = new StreamWriter(request.GetRequestStream()))
                {
                    streamWriter.Write(json);
                    streamWriter.Flush();
                }

                var httpResponse = (HttpWebResponse)request.GetResponse();
                using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
                {
                    result = streamReader.ReadToEnd();
                }
                oReply.success = 1;
                //y aquí va nuestra respuesta, la cual es lo que nos regrese el sitio solicitado
                oReply.data = result;
            }catch(Exception e){

                oReply.result = 0;
		//en caso de error lo manejamos en el mensaje
                oReply.menssage = e.Message;

            }

            return oReply;
        }
}

Ejemplo de como utilizarla:


public class UnaClase(){
   public string algo{get;set;}
}

//creamos la clase para enviar los parametros
UnaClase oUnObjeto= new UnaClase();
oUnObjeto.algo="pato feliz";

//Creamos el objeto para solicitud
RequestHdeleon oRequest= new RequestHdeleon();

//primer parametro url
//segundo parametro el objeto
//tercer parametro el metodo: POST, GET, PUT, DELETE
RequestHdeleon.Reply oReply=oRequest.Send<UnaClase>("http://somesite.com/api/somecontroller/",oUnObjeto,"POST");

¿Cómo enviar un valor en ViewBag por RedirectToAction en C# MVC .Net?

Algunas veces tenemos la necesidad de llamar un método por medio de otro, y para ello hacemos uso de RedirectToAction.

RedirectToAction nos sirve para redirigir al usuario a otro controlador o a otro método dependiendo de la lógica de negocio, pero aparte, a veces necesitamos recibir en nuestro elemento destino algún valor para mostrarle al usuario o para realizar alguna validación. Para ello lo primero que se nos viene a la mente es por medio de ViewBag.

Lamentablemente ViewBag no tiene un tiempo de vida más allá del dominio del método, pero podemos apoyarnos de otro diccionario llamado TempData el cual se mantiene en toda la vida de la solicitud HTTP.

A continuación muestro un ejemplo sencillo de cómo quedaría:


public ActionResult Accion1 {
 TempData["mensaje"] = "Un mensaje feliz :)";

 //redirigimos a la Accion2 del mismo controlador
 return RedirectToAction("Action2");

}

public ActionResult Accion2 {

  if(TempData["mensaje"])
     ViewBag.mensaje = TempData["mensaje"].ToString();

  //de esta manera nuestra vista recibiria el ViewBag.mensaje solo cuando TempData no sea null
  return View();
}

¿Cómo obtener una cadena (string) a partir del contenido de un archivo en C# .Net?

En c# es muy fácil obtener una cadena del contenido de un archivo, esto es algo muy útil ya que podemos almacenar información en texto plano en archivos y esta misma obtenerla en cadenas para darle alguna funcionalidad. Por ejemplo un archivo que contenga el cuerpo de un e-mail en .html y así leerlo como string, manipularlo y después enviarlo.

Anexo una clase que tiene un método estático el cual regresa un string a partir de la ruta de un archivo:


 public class Archivo
    {

        public static string GetStringOfFile(string pathFile)
        {
            try
            {
                var contenido = File.ReadAllText(pathFile);

                return contenido;
            }
            catch (Exception ex)
            {
                return string.Empty;
            }
        }
    }

Y así se utiliza:


string ContenidoArchivo= Archivo.GetStringOfFile("Carpeta/otraCarpeta/AlgunArchivo.html");

Funciona con cualquier extensión: .html, .txt, .xml etc etc.

Código de analizador lexicográfico en Visual Basic 6

Escarbando en mi cajón de códigos escolares me encontré algunas cosas que sería bueno compartirlas.

Comparto mi analizador lexicográfico el cual le servirá a más de uno. El código fuente esta hecho en visual basic 6.0 (no es .Net).

El diagrama de estados es el siguiente (diagrama de transición):

Para descargar el código fuente y el .exe den clic aquí.

Catálogos para facturar CFDI 3.3 SAT en Sql Server

ULTIMA ACTUALIZACIÓN DE LOS CATÁLOGOS: 3 DE ENERO 2018

Pongo a disposición los catálogos en Sql Server publicados por SAT necesarios para la facturación 3.3.

Estaré actualizándolos conforme el SAT libere nuevos registros. Solo dar clic en el siguiente enlace:



DESCARGAR CATÁLOGOS SAT

Si deseas descargar los catálogos para mysql entra aquí

Si deseas descargar los catálogos para SQLite entra aquí

SAT, cfdi 3.3, facturación electrónica, la opinión de un desarrollador de software PARTE II – Beneficio

[quads id=5]
Si no has leído mi primer entrada sobre mi opinión te invito a que leas dando clic aquí.

Les recuerdo que esto solo es una opinión de alguien que tiene desarrollando software por más de 10 años y por lo menos 5 años involucrado en el tema de facturación electrónica, igual no dejo de ser programador y no soy experto fiscalista, ni experto contador.

Quizá no sea la primera vez que leas que la facturación electrónica 3.3 te beneficia a ti como contribuyente, es imposible que no lo hayas leído en otra parte, ya que el SAT nos bombardeó con publicidad por todos lados hablando de que el beneficiado es el contribuyente. Valga broma.
El único beneficiado aquí es el SAT y vamos a verlo a continuación.

¿Quién gasta al adaptarse?

Cuando se nos obligó a facturar con la versión 3.2 todos tuvimos que gastar, claro el SAT nos dio un súper sistema gratuito para facturar (esta será otra entrada, el cómico sistema gratuito 3.3), un sistema que igual hacia su trabajo, al cual llamaban factura fácil, y era todo menos fácil, y mucho menos contemplaba todo lo que se refiere a facturación electrónica. Yo lo utilice algunas veces, jamás supe cómo se agregaba una addenda, o un complemento de impuestos locales, o vaya, no sé si existió un formulario para crear la nómina electrónica gratuitamente (disculpen, si es que existe háganmelo saber). En pocas palabras, SAT te da un sistema mediocre para hacer las facturas electrónicas, facturas que por lo mucho llevan un concepto ya que al momento de agregar más de 5 conceptos se comienza a volver engorroso.

Ahora, SAT ofrece una nueva solución la cual te felicita cada que haces algo bien (para que el contribuyente se sienta felicitado claro).

Ya utilice esta nueva versión de facturación gratuita que otorga el SAT, y yo que soy afín a la tecnología tarde varios minutos en encontrar el botón para crear nueva factura. No se diga para crearla. No quiero imaginar personas de tercera edad haciendo la factura ahí.

Ahora analicemos quien es el que gasta, el SAT otorga una herramienta que estimándola de lejos sale menos de 100 mil pesos su desarrollo, una herramienta para sus contribuyentes a nivel nacional, la cual te hace la factura versión 3.3 pero la hace de una manera tediosa, tardada y sin una buena interfaz de usuario que sea intuitiva. Esto tiene un plan con maña ya que el SAT te da algo mediocre para que hagas tu factura pero casi te está diciendo “pues es lo que hay”.
Yo me pregunte, porque será que el SAT no ofrece un buen servicio, que tenga calidad y no se caiga todos las quincenas ¿Porque hace esto el SAT? Pues muy simple, porque el mismo SAT crea un océano azul (dirían los mercadologos), crean un negocio, un giro donde no existía, un giro el cual es un negocio en el que en la cima de la pirámide está el mismo SAT, veamos:

  • SAT crea un requerimiento el cual es obligatorio para sus millones de contribuyentes.
  • SAT otorga una herramienta mediocre.
  • Los amigos del SAT crean herramientas más sofisticadas, pero estos amigos del SAT llamados PAC, le pagan al SAT dinero (mucho dinero) para tener el permiso de timbrar. Ademas existen servicios web los cuales solo los PAC tienen privilegio como: recuperar facturas emitidas, recuperar facturas canceladas, recuperar facturas recibidas etc.
  • El contribuyente al estar cansado de utilizar la mediocre herramienta, paga a un PAC para poder realizar su facturación de manera ágil.

Entonces concluimos que el único que se beneficia es el SAT, creando un negocio donde no existía, no sé si exista transparencia para todo ese dinero que recibe, desconozco si ese dinero se utiliza para algo, que para beneficiar al contribuyente no lo es. Y lo genial de este negocio es que si ellos quieren, pueden obligar nuevamente a una nueva facturación electrónica 3.4, 3.5 etc etc. Y así seguir sacando mucho mas dinero.

¿Qué es lo mínimo que debió otorgar el SAT? El SAT por lo menos debió dar puntos de venta gratuitos los cuales ayudaran a sus contribuyentes a llevar la facturación, y digo lo mínimo, ya que si tu como institución obligas a tus contribuyentes a realizar un trámite, debes agilizárselo. Es triste que nadie se queje directamente sobre todo este tema. Entiendo que no todo es malo con la facturación electrónica 3.3, existen puntos buenos pero a medias, ya que si esto por arriba del iceberg de lo que dice servir es ayudar al contribuyente es lo menos que se está haciendo. Si esto es para detener negocios fraudulentos que no facturan, creo que está creando más dificultades por lo cual las personas mucho menos se darán de alta.

Esto solo es una opinión de un programador de software, disculpen si hay errores, es desde mi visión como programador todo el escrito anterior.

¿Cómo obtener todos los parámetros enviados a un controller? C# MVC .Net

Cuando estamos utilizando MVC .Net muchas veces es necesario guardar lo que el usuario está enviando en logs o en la base de datos para poder monitorear errores de usuario final (Ver log sencillo en c# .Net).

De la siguiente forma obtenemos todos los parámetros enviados y ordenados en una variable cadena:


string parametros="";

//recorremos todos los parametros
 foreach (var parameter in Request.Params.AllKeys)
                {
                    parametros += parameter + ": " + Request.Params[parameter]+"\n";
                }

//se ira guardando de la siguiente forma
//parametro1: pato
//parametro2: pato2

Sistema de facturación electrónica cfdi 3.3 gratis por 90 días – Facturacenter.com.mx

Pocas veces hablo de los sistemas que yo he hecho, pero esta vez me tome la tarea de hablar de algo que a muchos les puede servir.

Ver la funcionalidad del sistema en youtube.

Hace algunos días hice una factura en la aplicación que hizo SAT para cfdi 3.3 y es una burla, parece una plataforma hecha por becarios. La opinión que tengo de todo lo que es la facturación electrónica la pueden encontrar aquí.

Ya que estamos en este enrollo de la fiscalización que nos obliga el SAT a más de uno le servirá el sitio que yo he liderado para su desarrollo y el cual ya utilizan muchísimas personas.

Formulario para facturación

Primero te registras y seleccionas el paquete de 30 folios gratis así puedes utilizarlos, solo recuerda que tienen caducidad de 90 días, una vez que lleguen esos 90 días puedes seguir entrando pero deberás comprar otro paquete, los cuales hay desde 10 folios hasta muchísimos (no recuerdo el dato solo soy un programador), estos últimos folios tienen caducidad de un año, pero algo importante, los folios se congelan solamente. Es decir:

Si tengo el paquete gratuito de 30 folios y solo gaste 1 folio en una factura en los 3 meses, compro mi paquete de 10 folios, ahora tendría 39 folios (29 que me quedaron + 10 nuevos), y estos me duraran de caducidad 1 año, e igual al año se congelaría la cantidad.

¿Qué diferencia tiene con la aplicación del SAT?
Que tu factura la harás mucho más rápido ya que puedes guardar datos de tus clientes, empleados (también se pueden timbrar nominas), productos, tipos de comprobantes, tienes asistencia rápida, puedes entrar desde el celular ya que el sitio es responsivo, puedes ver tus facturas rápidamente, descargarlas, enviarlas por correo, y muchas cosas más, además el sistema se actualiza con nuevas cosas y todo esto es solo por el precio de tus folios (no se cobro ni la actualización de 3.2 a 3.3).

Precios paquetes (tomo la imagen del sitio igual revisar en el sitio los precios por si cambiaron):

Es decir si eres un doctor, un arquitecto, un freelance o una persona que utiliza pocos folios al año, es conveniente esta plataforma ya que por un precio bastante bajo tienes todo un poderoso sistema.

El enlace es el siguiente (recuerden seleccionar el paquete gratuito de 30 folios al registrarse):

Facturacenter.com
facturacenter.com.mx

Dudas y comentarios abajo hay un formulario.

¿Cómo crear un archivo pfx en c#? cancelación de factura electrónica SAT cfdi 3.3

Para cancelar una factura electrónica es necesario crear un tercer certificado llamado pfx, este certificado se debe crear por medio de Openssl en conjunto de nuestro archivo Cer y nuestro archivo Key los cuales debemos ya tener si es que estamos timbrando.

Para crear el archivo pfx utilizaremos la clase Process de .Net, esta clase sirve para mandar comandos como si estuviéramos en consola, de esta manera utilizaremos los comandos de Openssl.

Les recuerdo que antes deben instalar Openssl y como está en el siguiente ejemplo debe estar instalado en la unidad c:/openssl-win32.

En caso que se tenga Openssl instalado en otra ruta distinta, solo modifiquen esa parte del código. A continuación la clase mágica:

 public class PFX
    {
        string cer = "";
        string key = "";
        string clavePrivada = "";
        string ArchivoPFX = "";
        string ArchivoKPEM = "";
        string ArchivoCPEM = "";

        public string error = "";
        public string mensajeExito = "";

        ///
<summary>
        ///
        /// </summary>

        /// <param name="cer_">archivo cer a utilizar</param>
        /// <param name="key_">archivo key a utilizar</param>
        /// <param name="clavePrivada_">clave para el archivo pfx</param>
        /// <param name="archivoPfx_">ruta del archivo pfx</param>
        /// <param name="path">ruta para archivos temporales PEM</param>
        public PFX(string cer_, string key_, string clavePrivada_, string archivoPfx_, string pathTemp)
        {
            cer = cer_;
            key = key_;
            clavePrivada = clavePrivada_;

            ArchivoKPEM = pathTemp + "k.pem";
            ArchivoCPEM = pathTemp + "c.pem";
            ArchivoPFX = archivoPfx_;
        }

        public bool creaPFX()
        {
            bool exito = false;

            //validaciones
            if (!File.Exists(cer))
            {
                error = "No existe el archivo cer en el sistema";
                return false;
            }
            if (!File.Exists(key))
            {
                error = "No existe el archivo key en el sistema";
                return false;
            }
            if (clavePrivada.Trim().Equals(""))
            {
                error = "No existe una clave privada aun en el sistema";
                return false;
            }

            //creamos objetos Process
            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            System.Diagnostics.Process proc2 = new System.Diagnostics.Process();
            System.Diagnostics.Process proc3 = new System.Diagnostics.Process();
            proc.EnableRaisingEvents = false;
            proc2.EnableRaisingEvents = false;
            proc3.EnableRaisingEvents = false;

            //openssl x509 -inform DER -in certificado.cer -out certificado.pem
            proc.StartInfo.FileName = "openssl";
            proc.StartInfo.Arguments = "x509 -inform DER -in \"" + cer + "\" -out \"" + ArchivoCPEM + "\"";
            proc.StartInfo.WorkingDirectory = @"C:\openssl-win32\bin\";
            proc.Start();
            proc.WaitForExit();

            //openssl pkcs8 -inform DER -in llave.key -passin pass:a0123456789 -out llave.pem
            proc2.StartInfo.FileName = "openssl";
            proc2.StartInfo.Arguments = "pkcs8 -inform DER -in \"" + key + "\" -passin pass:" + clavePrivada + " -out \"" + ArchivoKPEM + "\"";
            proc2.StartInfo.WorkingDirectory = @"C:\openssl-win32\bin\";
            proc2.Start();
            proc2.WaitForExit();

            //openssl pkcs12 -export -out archivopfx.pfx -inkey llave.pem -in certificado.pem -passout pass:clavedesalida
            proc3.StartInfo.FileName = "openssl";
            proc3.StartInfo.Arguments = "pkcs12 -export -out \"" + ArchivoPFX + "\" -inkey \"" + ArchivoKPEM + "\" -in \"" + ArchivoCPEM + "\" -passout pass:" + clavePrivada;
            proc3.StartInfo.WorkingDirectory = @"C:\openssl-win32\bin\";
            proc3.Start();
            proc3.WaitForExit();

            proc.Dispose();
            proc2.Dispose();
            proc3.Dispose();

            //enviamos mensaje exitoso
            if (System.IO.File.Exists(ArchivoPFX))
                mensajeExito = "Se ha creado el archivo PFX ";
            else
            {
                error = "Error al crear el archivo PFX, puede ser que el cer o el key no sean archivos con formato correcto";
                return false;
            }

            //eliminamos los archivos pem
            if (System.IO.File.Exists(ArchivoCPEM)) System.IO.File.Delete(ArchivoCPEM);
            if (System.IO.File.Exists(ArchivoKPEM)) System.IO.File.Delete(ArchivoKPEM);

            exito = true;

            return exito;
        }
    }

Para utilizarla de la siguiente manera:


//yo siempre utilizo la misma clave privada de mi timbrado para encriptar el pfx
//la ruta para archivos temporales solo se utiliza para archivos que serán eliminados al final
oPFX = new PFX("algunaruta/archivocer.cer", "algunaruta/archivokey.key", "algunpassword", "algunacarpeta/miarchivo.pfx", "rutaparacreararchivostemporalesPem/");

if (oPFX.creaPFX())
                    Console.WriteLine("Archivo creado con éxito");
else
                    Console.WriteLine(oPFX.error);

8 inventos descabellados de Nikola Tesla

Nikola Tesla es uno de los científicos olvidados, los cuales realizaron demasiados avances en la ciencia, uno de sus logros siendo la corriente alterna, el radio, la luz neón y más de 700 patentes, en esta entrada hablaremos de 8 de los inventos mas descabellados de este gran científico.

1.- La Torre Tesla

También conocida como la torre Wardenclyffe, fue construida entre los años 1901 y 1917, y su propósito era demostrar la transmisión de energía sin cables.

Su construcción nunca termino por falta de presupuesto, y la torre fue demolida al iniciar la primera guerra mundial.
Se dice que la torre era el inicio para una idea que tenia Tesla sobre transmitir la electricidad por medio de la atmósfera, y así economizar la energía para todo el mundo. Por cualquier cosa, nunca logro a cumplirse este proyecto, aunque, en los últimos meses está circulando el renacimiento de este invento, dos rusos (los hermanos Plekhanov) buscan fondos para revivir la Torre Tesla. Quizá seamos testigos de ver uno de los sueños de Tesla, hecho realidad.

2.- Energía a partir del vacío

Tesla fue uno de los pioneros de la idea de energía de punto cero, esto quiere decir, que el vacio quizá posea cantidades de energía infinitas. Si esto es realidad, existiría energía en todo el universo la cual espera a ser utilizada.
Esta idea parecía violar la primera ley de termodinámica (principio de conservación de la energía), pero nuevos estudios sugieren lo contrario.
Los científicos han analizado datos procedentes de satélites en el espacio, y han llegado a la conclusión de que el 75% del universo tiene energía oscura, energía de un vacio puro. Esto quiere decir que el mayor almacén de energía, es el espacio entre las galaxias. Tesla tenía razón en que existe energía en el vacío, el único problema es que en nuestro planeta, la cantidad existente es demasiado pequeña, insuficiente para el fin que tenia este científico.

3.- Teslascopio

El teslascopio, un aparato que podía captar las señales electromagnéticas. Tesla pretendía con este invento comunicarse con vida extraterrestre.
Todo comenzó en 1899, se encontraba Tesla investigando la electricidad producida en la atmosfera, cuando comenzó a recibir señales repetitivas y con un patrón que no parecía azar, lo cual indujo a pensar que era un mensaje inteligente, esto dio inicio a la creación del teslascopio, invento que más tarde fue protagonista de muchas burlas, por parte de la comunidad científica.


Tesla afirmaba que se comunicaba con los habitantes de Marte (alguna vez menciono Venus), y a pesar de las burlas, murió convencido de ello.

4.- Teleforce (Rayo Mortal)

Tesla decía haber creado un rayo que podía destruir 10,000 aviones a una distancia de 350 kilómetros.
Se trataba de un proyector de partículas cargadas inspirado en el generador Van de Graff.Nunca fue visto este invento, pero el FBI se lo tomo tan en serio, que al momento de su muerte, tomo posesión de todas las notas de Tesla, los cuales en su mayoría siguen bajo llave).

5.- Modificación del clima

Tesla observando que la ionosfera mantenía un potencial positivo, formando un circuito con tierra, llego a la conclusión de que las nubes se podían manipular, si se modificaba el circuito global.


Enviando potentes ondas electromagnéticas dependiendo el clima deseado, se podría tener un control del ambiente (esto huele a HAARP).

6.- Iluminación del desierto del Sáhara.

En sus últimos años, con la idea de que se comunicaba con vida extraterrestre, Tesla propuso iluminar el desierto más grande del mundo, el desierto del Sáhara, para así dar una señal a los extraterrestres de Marte que en el planeta Tierra, también existía vida.

7.- El avión de Tesla

Tesla había ideado una maquina la cual se elevaba verticalmente, realizando pruebas de despegue mucho antes que los hermanos Wright. El proyecto no tomo forma, a pesar de haber nacido en una época que no existían los aviones, quizá porque Tesla perdió el interés y se enfoco a nuevas cosas, pero nunca lo sabremos.

8.- Maquina de terremotos

Esta invención sucedió según Tesla en el año de 1889, el dispositivo era pequeño, pero su sistema (desconocido), era suficientemente fuerte para hacer temblar todo el edificio donde lo probó en su laboratorio en Manhattan. Observando el peligro de seguir con este proyecto, decidió destruirlo tomando un mazo, y despareciéndolo para siempre.

Nikola Tesla, un científico que no suele aparecer en los libros escolares, pero un genio que poco a poco es más conocido por todos, y este articulo tiene ese fin, no olvidar a los que tenían una visión de crear una humanidad mejor.