viernes, 10 de julio de 2015

CONFIGURACIÓN AUTOMÁTICA SERVIDOR PROXY



Ya hemos hablado y definido que es un Servidor Proxy WEB, de los beneficios que nos puede brindar y de las opciones que tenemos para instalar, así que en esta ocasión hablaré de los requisitos para, que los clientes Web, puedan configurar automáticamente el el servidor proxy que deben usar estando en nuestra red local


Un problema al momento de instalar nuestro servidor Proxy es que si lo instalamos en modo transparente (sin configuración explicita en el cliente), el filtrado no suele ser eficaz, pues las peticiones https normalmente no pueden ser manejadas por el servidor  Proxy. Por otro lado si optamos por la configuración explicita en el lado del cliente, nos encontramos con el problema de tener que configurar cada cliente con la dirección y puerto del proxy imagina que  debemos configurar manualmente 200 clientes (computdoras). 

Aquí es cuando entra en acción el WPAD o Protocolo para la Detección Automática del Servidor Proxy. Este protocolo tiene como objetivo permitir a los clientes Web conocer la ubicación de un "archivito" llamado  proxy auto-config; este archivo es el encargado de brindar la "Configuración que el cliente debe usar para configurar el uso del Servidor Proxy"

El protocolo o mejor dicho el estándar (ya que se publicó solo como borrador)  WPAP indica que hay dos maneras de "informarle" al cliente Web dónde se encuentra este archivo, la primer manera es mediante la configuracion DHCP , si así es en este caso el servidor DHCP (si es que se tiene configurado uno) , no solo proporcionara la información de la configración IP que el cliente debe usar para el acceso a al red sino que tambien indica donde se encuentra el archivo proxy auto-config (.pac), la otra opción es mediante el servidor DNS


Desde mi punto de vista la mejor manera de hacerlo es mediante la opción DNS, pues en el caso de DHCP no todos los clientes Web lo soportan por ejemplo Mizilla y Google solo soportan la configuración mediante DNS y no mediante DHCP en el caso de IE, soport aambas.


Ejemplo del Archivo Proxy Autoconfig

function FindProxyForURL(url, host)
{
if (isPlainHostName(host))
return "DIRECT";
else
return "PROXY proxy:80";
}


Nota acerca del modo transparente:

Cuando el Proxy está configurado en modo transparente Squid  no es capas de aplicar las reglas de filtrado, es debido, entre otras cosas,  a que la conexión no se hace a través del puerto 80 sino de un puerto seguro 443, (Existe una técnica llamada SSL Bump, que ofrece una posible solución a este problema pero por el momento no la tocaremos; y si estas pensando en usarla solo ten cuidado de avisar a tus usuarios pues podríamos incurrir en una violación a la privacidad). 




martes, 2 de junio de 2015

C# Filtrando un DataGrid

En esta entrada explicaré como filtrar un GridView en C#.

Hay varias formas de filtrar el contenido de un GridView

1.- Modificando la consulta del DataSource y volver a llenar o enlazar el Grid o Rejilla
    El problema de este método es que se genera carga innecesaria al servidor, trafico en la red y posiblemente el usuario experimente cierta lentitud.

2.- Aplicando un filtro al DataSource (Tratandolo como una Tabla)
   En este caso solo se filtran los datos de manera local , no se realiza una nueva consulta a la base de datos.

Para poder realizar este tipo de filtrado lo único que debemos hacer es tratar al DataSet como una Tabla (cast) y una aplicar RowFilter de la propiedad DefaultView

Ejemplo Básico:

  (grdVieComprobantesListado.DataSource as DataTable).DefaultView.RowFilter = 'SERIE = AB"



Ejemplo Complejo

Para este ejemplo partiremos de un formulario que uso para visualizar las facturas emitidas, El formulario tiene en la primer parte todos los filtros, posibles y en la segunda todas las facturas emitidas que cumplan con los filtros.




Lo mas laborioso es crear el procedimiento que nos devolverá la cadena con  el filtro que vamos a aplicar, en este caso podemos filtrar por Serie por Folio POR UUID, por fechas etc.


 /// <summary>
 /// Analiza los valores de los TextBox usados para el filtro 
 /// y devuelve una cadena con el filtro Resultante (Sólo toma        encuenta los cuadros de texto que tiene un valor en la propiedad Text)
/// La operación lógica de concatenación es AND 
/// La operación lógica de comparacion es = (Igual) excepto para los caos del Nombre del Receptor y el UUID en cuyo caso se usa el operador LIKE  
/// </summary>
private string CrearFiltro()
{
    string filtro = "1=1 ";
    
    if (!string.IsNullOrEmpty(txtSerie.Text))
        filtro += " AND Serie = " + "'" + txtSerie.Text +"'" ;

    if(!String.IsNullOrEmpty(txtFolio.Text))
        filtro += "AND Folio = " + txtFolio.Text;

    if (!String.IsNullOrEmpty(txtReferencia.Text))
        filtro += "AND Referencia = " +(""+txtReferencia.Text+""+);

    if (!String.IsNullOrEmpty(txtRfcReceptor.Text))
         filtro += " AND RfcReceptor = " +(""+txtRfcReceptor.Text+"");

    if (!String.IsNullOrEmpty(txtNomReceptor.Text))
         filtro += " AND Receptor like " +( ("'%" + txtNomReceptor.Text + "%'"));
           
    if (!String.IsNullOrEmpty(txtUUID.Text))
         filtro += " AND UUID like " + "'%" + txtUUID.Text + "%'"));

    if (chkFilFechas.Checked)
    {
         filtro += "AND FechaEmision >= " + "" +( dtpFecEmiInicial.Value.Date.ToString() + "");
                filtro += "AND FechaEmision <= " + ""+ dtpFecEmiFinal.Value.Date.AddHours(23.999).ToString() +""+);
            }


    return filtro;

        }

/// <summary>
        /// Aplica los filtros al grid
        /// </summary>
        private void FiltrarGrid()
        {
            (grdVieComprobantesListado.DataSource as DataTable).DefaultView.RowFilter = CrearFiltro(); 

        }


Finalmente en cada uno de los controles en el evento Lave o Change podemos invocar al método CrearFiltro


sábado, 4 de abril de 2015

Facturación Electrónica

Desde hace  algún tiempo en México es obligatorio la facturación electrónica que a groso modo es la obligación del contribuyen de emitir facturas, notas de crédito, recibos de nómina  y demás comprobantes fiscales en un formato electrónico siguiendo cuidadosamente un conjunto de reglas establecidas por el SAT,  (Anexo 20); firmar el archivo con nuestro Certificado de Sello Digital (CDS) y enviarlo a  un PAC para que nos lo valide y firme el SAT.

Si bien existen infinidad de soluciones en el mercado para la generación de facturas y demás comprobantes Digitales por Internet (CFDIs), muchas veces nos vemos en la necesidad de tener que desarrollar una solución propia para dar respuesta a requerimientos muy específicos de nuestros usuario o lograr la integración con los actuales sistemas que se encuentran en la empresa, sea cual sea el caso si tu estas interesado en aprender a generar por tus propios medios el archivo XML y la representación impresa del mismo este blog te será de gran ayuda.

Dimensionando el trabajo

Si bien es cierto que la generación de Facturas electrónicas no es un proceso sencillo tampoco te dejes espantar ni mucho menos te desanimes solo debes armarte con paciencia, curiosidad y algunas herramientas informáticas. ¿Si  somos los que lo hemos logrado por que tu no lo harías?.
Las herramientas que utilizaremos son las siguientes pero no te preocupes por tenerlas todas en este momento con forme avance en tu proyecto las puedes ir descargando

1.-Visual estudio 2012 (Preferentmente)
2.-Heramienta XSD en línea de comandos
3.-Open SSL
4.-Itex Sharp

Pasos Para crear el CFDI

1.- Crear el archivo XML con toda la información requerida por el SAT (emisor, receptor, conceptos etc. Descarga el anexo 20 que será tu libro de cabecera durante casi todo el proyecto)

2.-Crear la cadena de verificación (esto es un resumen del documento creado  en el paso anterior)

3.-Firmar la cadena de verificación con la FIEL o el CSD (Aquí las cosas se pondrían un poco ruda pero gracias a Dios hay mucha gente que colabora en la red y disponemos de una librería open source para esta tarea,Open SSL)

4.-Incorporar la cadena Firmada al XML creado

5.-Enviar el   XML para ser sellado por el SAT
Si no hubo ningún error debemos crear la representación impresa del XML

Divide y Vencerás
Lo primero en lo que nos enfocaremos en crear el archivo XML, despues en sellar el documento y finalmente en crear el PDF.

Para la creación del XML hay varias alternativas, en nuestro caso optaremos por la serialización-deserialización que en pocas palabras podemos definir de la siguiente manera:


Serializar: Consisten en representar un objeo y su estado en un lenguaje especifico, los lenguajes mas comunes para la serialización son JSON y XML.

Deserializar: Consiste en el proceso inverso, es decir tomar la definición del XML o JSON y crear un
objeto o instancia de clase.

Junto con estos conceptos entra en escena nuestra primer herramienta

xsd.exe tool  Esta es una herramienta que viene integrada en el  .Net Framework Software Developmen Kit y nos permite crear una clase a paritr de un XSD. Asi es partiendo de una definicion en XML podemos obtener una o más clases que representen el esquema definido en el archivo XSD


Esta es la manera en la que obtendremos nuestras clases a partir del XSD que nos da el SAT (desde http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd)

viernes, 6 de marzo de 2015

Agregar el xsi:schemaLocation XML a partir de la serialización


       Actualmente estoy trabajando en un proyecto para implementar la facturación electrónica o CFDI. en mi caso  el XML lo obtengo a partir de la serializacion (convertir una clase en un XML) y uno de mis dolores de cabeza fue lograr que el XML contenga el xsi:schemaLocation;

Para solucionarlo es muy sencillo en la clase generada por la herramienta xsd hay que agregar una propiedad o campo quedando de la siguiente manera, marcado como instancia del Namespace:

public partial class Comprobante {

    [XmlAttribute(Namespace = XmlSchema.InstanceNamespace)]    public string schemaLocation = "http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd";

 

martes, 9 de diciembre de 2014

Respaldos Automatizados con WinRar

Una de las tareas más comunes en el mundo de la informática es tener que mantener copias de seguridad si bien existen muchas maneras de realizar este trabajo  desde hacerlas manualmente, recurrir a programas especializados o hacer uso del comando "robocopy" de Windows que esta pensado precisamente para este tipo de trabajo resulta que normalmente después de hacer la copia de seguridad con Robocopy tenemos que comprimir dicho respaldo por lo cual prefiero hacer uso del famoso WinRar, en este caso de la interfaz de linea de comando que posee WinRar, que por cierto es bastante poderosa.



Básicamente solo hay que seguir dos pasos: 

1.-Crear un archivo BAT con el código para que realice el respaldo (en realidad es sólo una linea o comando la que realiza el trabajo) pero en el ejemplo agrego la funcionalidad de mostrar un mensaje al iniciar la tarea y mensaje al terminar la tarea esperamos unos segundos y cerramos la ventana de MS-DOS además de estar comentado con detalle.
2.-Agregar una tarea automática en Windows e invocar al archivo creado
      Inicio>>Todos Los Programas>> Accesorios>>Herramientas del Sistema>>Programador de Tareas
    Crear tarea básica
    Ingresar nombre y descripción de lo que hace la tarea en este caso se trata de un respaldo
    Indicar la periodicidad (Diario, Semanal; Mensual)
    Indicar horario
    Seleccionar la opcion "Iniciar un Programa"
    Seleccionar el archivo .bat que creamos en el paso 1
   Finalizar el asistente.

   

Aquí dejo un ejemplo de un archivo BAT 


@ECHO off
REM *** Script creado el 2014/12/08 por Guillermo Rmz P.***
REM *** Este script crear un na copia de seguridad en la carpeta "\\PC-Destino\Carpeta-Destino\Nombre-del-Archivo"  de la carpeta  "C:\Carpeta-Orige"
REM *** El respaldo es creado por el programa WinRar, por lo cual es indispensble que se encuentre instaldo
REM *** Explicación de comando:
REM ***                "c:\Archivos de programa\WinRAR\WinRar" : Ruta donde esta instalado WinRar
REM ***                a: Agrega el archivo
REM ***                -ag: Agrega la Fecha al archivo creado
REM ***                +YYYYMMDD: Establece el formato AAA MM DD
REM *** ping localhost -n 10 >nul  es  solo un "truco" para mantener la ventana abierta durante 10 segundo si requieres mas tiempo cambia el 10 por el numero de segundos; si no requieres que se mantenga la ventana elimina esta linea

REM *****************Inicio del Script ***************************

ECHO El proceso de copia de seguridad ha iniciado: %date% " " %time%

"c:\Archivos de programa\WinRAR\WinRar" a -ag+YYYYMMDD "\\PC-Destino\Carpeta-Destino\Nombre-del-Archivo" "C:\Carpeta-Orige"

ECHO El proceso de copia de seguridad ha terminado: %date% " " %time%

ping localhost -n 10 >nul

Exit

Nota: Si deseas comprimir solo cierto tipo de archivos puedes modificar la ruta de origne de la siguiente manera C:\Carpeta-Orige\*.txt

De esta manera se comprimirán los archivos con extensión *.txt

lunes, 3 de noviembre de 2014

Modificar Reportes Aspel SAE o CAJA (agregar una nueva consulta)

    Como ya lo comenté no soy fanático de ASPEl sin embargo muchos de mis clientes usan alguno de estos sistemas así que no queda de otra mas que aprender un poco y en esta ocasión quiero compartirles la manera en la que se puede agregar una nueva consulta a un reporte; en especifico estoy modificando el reporte "Emisión de Compras" ya que debo agregarle el precio público y como se darán cuenta este campo no viene en ninguna de las tablas o consultas del reporte por lo cual hay que generar la consulta y relacionarla con la tabla cdtsPartidas



Para modificar un reporte debemos seguir estos pasos

1.-Reportes-->>Administrador de reportes

2.-Navegamos hasta el reporte que deseamos modificar y lo seleccionamos (dando un clic)

3.-Damos clic con el botón secundario del ratón y seleccionamos la opción Editar Reporte

4.-Damos clic en el icono amarillo (Base de datos)

5.-Nuevo

6.-Query

7.-Ingresamos el nombre para la nueva consulta,

8.-Seleccionamos la tabla MAESTRA, esto no es otra cosa mas que la tabla o consulta que del reporte y que nos servirá para relacionar la nueva consulta con una consulta del reporte, la cual realizara la albor de Tabla Maestra. Esto es muy similar a realizar un INNER JOIN

9.-Generamos la consulta en este caso sería:

SELECT  cve_art, precio
FROM     PRECIO_X_PROD01
WHERE  cve_precio = 1
       AND cve_art = :cve_art

Esta consulta selecciona la clave del articulo y el precio de la lista de precios filtrando solo  los precios al publico (cve-precio = 1)  y  relaciona esta consulta con el campo cve_art de la Tabla Maestra, en este caso cdtsPartidas (cve_art = :cve_art)

10.-Finalmente no queda nada mas que dar clic en la boton Parámetros, donde nos aparecera nuestro unico parametro, seleccionamos el tipo de dato, en este caso string y seleccionamos la opcion Asignar valor desde el conjunto de datos maestro.

Ahora podemos usar el campo precio en nuestro reporte y sabemos que este precio es el precio publico ya que nosotros filtramos la consulta ..




Guillermo Ramírez Palomares
Tecnotlan... Ciudad de la Tecnología
Salu2


jueves, 8 de mayo de 2014

Servidores Proxy Web

Servidor Proxy WEB

  En términos generales un servidor Proxy , es un equipo que actúa como intermediario entre dos equipos o dispositivos; para el caso especifico del servidor Proxy WEB  se trata de un servidor que recibe peticiones de los clientes, estas peteciones son accesos a contenido WEB de ahí su nombre, este ejecuta la consulta, en nombre del cliente, y devuelve el contenido.

Usos:

Controlar y Administrar: Un servidor Proxy WEB nos permite controlar y administrar la navegación hacia Internet por parte de los usuarios, asì pues el servidor proxi nos da la posibilidad de aplicar reglas de navegación a ciertos usuarios.   Por ejemplo podríamos definir tres grupos de usuarios: "Operadores", "Administrativos", "Directores" y aplicar las sigueintes reglas:

Operadores: Sin acceso a Internet
Administrativos: Acceso a Internet, excepto a páginas de redes sociales  y contenido inapropiado
Directores: Acceso ilimitado a Internet


Reducción del Trafico:  Esta es otra de las ventajas que podemos tener al implementar un Servidor Proxy WEB, siempre y cuando tenga habilitado el cache; Como se mencionó anteriormente el servidor recibe peticiones de los clientes (usuarios) y devuelve el recurso (normalmente páginas de Internet), al cliente, así que al tener  habilitada la función de chache es posible almacenar este recurso ("pagina") en el disco duro del servidor para cuando otro cliente (usuario) solicite la misma página el servidor no tendrá que volver a ejecutar la consulta sino que podrá devolver la pagina que tiene almacenada en cahce,  de esta manera se logra reducir el trafico generado hacia Internet.


Servidores Proxy Populares

Squid

 Squid es sin duda uno de los más famosos servidores WEB que existen es usado  tanto para pequeñas oficinas como grandes por corporativos. Su función es implementar un servidor proxy con cache.

En honor a la verdad resulta ser un excelente servidor proxy,  pero su configuración no es lo  mas sencilla especialmente si estamos acostumbrados a los asistentes de Microsoft y a las interfaces gráficas, en otra publicación tratare de abordad con detalle la manera de instalarlo y configurarlo desde cero y a "mano". Aqui les dejo la liga de la pagina por si estan interesados en ingresar a las entrañas del mundo de Squid (http://www.squid-cache.org/)


 Microsoft Proxy Server

  Proxy Server, de Microsoft tiene coo funcion controlar el acceso desde la red local a Internet permitiendo hacer cache de los recurso de internet acelerando la navegacion y reforzando las politicas de seguridad y acceso desde la red local hacia Internet. 

En escencia es exactamente lo mismo que Squid, aun que solo he trabajado muy poco con el  puedo decir que resulta amigable pero no tan flexible como lo puede ser Squid, ademas que  hay que pagar licencias.


Zentyal

  Zentyal es mucho pero mucho mas que un servidor Proxy con Cache, en es un conjunto de herramientas Open Source integradas en una sola distribución y con una interfaz WEB extremadamente intuitiva que lo convierte en un software muy amigable, el principal objetivo de Zentyal no es ser un servidor WEB sino un reemplazo de  Microsoft Exchange, al ser 100% compatible con los clientes de correo outlook (Correos, calendarios, agenda)

Bueno retomando Zentyal como servidor proxy es importante recalcar que la implantación del servidor proxy no es otra que Squid junto con DansGuardian, sólo que Zentyal nos hace las cosas fáciles, pues tiene una Interfaz gráfica muy intuitiva, como es costumbre en Zentyal, y el se encarga de hacer el trabajo rudo,