martes, 4 de octubre de 2016

Chat uno a uno del SAT



El día 30 de septiembre de 2016 el tres veces heroico cuerpo de desarrollo de la Secretaría de Administración Tributaria (o uno de sus fabulosísimos proveedores) liberó la versión 1.2 del esquema para el complemento de Nómina.

Inmediatamente tuvimos que ponernos manos a la obra para poder comenzar a trabajar en los ajustes necesarios en los sistemas para poder generar XML que respeten ese esquema en enero de 2017, y... ¡oh sorpresa!, ¡lo que esperaba!, le encontramos un error (no sé cuántos vaya a tener)

Fíjense cómo está el texto que acompaña al atributo "CuentaBancaria" del nodo "Receptor":

"Atributo condicional para la expresión de la cuenta bancaria a 11 posiciones o número de teléfono celular a 10 posiciones o número de tarjeta de crédito, débito o servicios a 15 ó 16 posiciones o la CLABE a 18 posiciones o número de monedero electrónico, donde se realiza el depósito de nómina."

Siendo que el número más grande que aparece en la documentación es de 18 posiciones, entonces te esperas una expresión regular más o menos así: "\d{10,18}", y sí, nos encontramos con algo así:

<xs:simpleType name="t_CuentaBancaria">
  <xs:annotation>
    <xs:documentation>Tipo definido para expresar la cuenta bancarizada.</xs:documentation>
  </xs:annotation>
  <xs:restriction base="xs:int">
    <xs:whiteSpace value="collapse"/>
    <xs:pattern value="[0-9]{10,18}"/>
  </xs:restriction>
</xs:simpleType>

Después de notar que el valor máximo que soportaría es de 2147483647, realizamos una conexión para hacerle saber al heorico equipo de soporte técnico del SAT lo que estaba pasando.    Y, como dijera la canción que cantaban Alberto Vázquez y Joan Sebastian, "esto fue lo que sucedió".



Para el equipo de soporte técnico en el chat uno a uno del SAT el problema es de los bancos, supongo que es culpa de los bancos que hayan hecho la CLABE de 18 dígitos, inclusive también sería culpa de los bancos por hacer que los números de tarjeta sean de 15 o 16 dígitos.

No es triste que la gente que trabaja ahí no tenga capacidad cerebral para identificar que le está siendo reportado algo que está fuera de su alcance, lo triste es que se monten en su caballo de que la culpa es de todos menos de ellos y que su pequeño conjunto de neuronas les permita tener un sueldo para cobrar por no trabajar.

Esperemos algún día (antes del 1 de enero de 2017) el brillante equipo de desarrollo del SAT, o de su proveedor, se den cuenta del error y lo corrijan.    A menos que lo hayan hecho con la intención de que esté mal y así dar prórroga hasta junio de 2017... lo cual también es probable.

sábado, 17 de octubre de 2015

EIG - Abonando a un ladrón de varias cabezas



Hace algunos meses realicé la adquisición de un servicio de alojamiento con un proveedor llamado Arvixe, no puedo quejarme de esos primeros meses, el servicio muy bueno, la atención por parte del personal de soporte muy buena, y el rendimiento del servidor bastante bueno.

Después de un buen tiempo, hubo un cambio radical en sus servicios, y puedo decir que en toda su gama por la cantidad de tickets y quejas que llueven en twitter, a lo que nuestros amigos siempre se limitan a responder algo así:
  1. "Gracias por proporcionar el id del ticket, te responderé en él".
  2. "¿Podrías proporcionar el id del ticket?"
Obviamente tienen un programa muy sencillo donde reciben sus tweets y apretando un botón, se realiza la respuesta del mismo.    ¿El esfuerzo?, elegir entre la respuesta 1 o la respuesta 2, de ahí en fuera, nada.

Después de esperar por más de 3 horas y media con el chat abierto, finalmente una persona atiende la conversación, después de comentar la situación y mencionar que el 99.99% que GARANTIZAN en su página de inicio no se estaba cumpliendo, esta personita comentaba que como era un problema grave ellos no podían dar ese 99.99%.

En este momento pensé, vamos 2-0 y la atención es inexistente.    Procedí a levantar un ticket, después de esperar 6 horas, levanté otro... y así siguió el ciclo, el cual no interrumpí para verificar en qué momento o qué tipo de ticket es el que responden.

¡Finalmente respondieron!, después de 48 horas con el servidor totalmente caído y sin respuesta por ningún lado, pude ver en la lista que uno de tantos estaba respondido, ¿qué podría ser?, entre emoción y coraje abrí el ticket, ¡wow!, la respuesta fue increíble: "olvidó colocar los últimos 4 caracteres de la contraseña de su usuario de facturación, para poder atender su ticket, necesitamos esa información".

Este ir y venir con esta gente lo voy a hacer a un lado, y no por falta de más cosas qué decir, sino que me llamaba la atención que la calidad en el servicio decayera de una forma tan estrepitosa y en tan poco tiempo.

Después de investigar un poco, supe que un corporativo con las siglas EIG (Endurance International Group) había adquidido a Arvixe, y ahí comencé a darle al clavo.

Sucede que estos amigos de EIG son dueños de muchos (pero muchos) proveedores de alojamiento, ¿qué tienen en común aparte del dueño?, que sus primeros meses de servicio son "aceptables", posteriormente comienzan los problemas y niegan cualquier posibilidad de devolución de dinero para sus clientes, ¿qué sucede?, el cliente termina yéndose a otra compañía.

Encontrarán muchas entradas de blog donde te recomiendan pasarte del proveedor X al proveedor Y, que con el proveedor Y están súper contentos y que el servicio es espectacular.    Si le buscamos un poco, ¡el proveedor Y pertenece también a EIG!, ¿resultado?, basta con buscar un poco en los foros de soporte y cuentas de redes sociales del proveedor Y, para darte cuenta que es igual de asqueroso que el proveedor X.

Al final, en todos estos blogs encuentras que te recomiendan ir saltando entre proveedores que pertenecen a esta empresa EIG, al final le caerá dinero a los mismos ladrones y tu servicio seguirá siendo de pésima calidad.

Quiero finalizar esta entrada de blog con una recomendación sumamente simple, cuando vayas a contratar algún servicio de alojamiento, ¡verifica que no sea una empresa que forme parte del grupo EIG!, te ahorrarás muchos dolores de cabeza y pérdidas económicas.

martes, 5 de mayo de 2015

Incorrect syntax near 'go'



El día de hoy me encontré con que un compañero estaba sufriendo bastante para crear un programa en .NET (aplicación de escritorio) que instalara una base de datos, desde su aprovisionamiento hasta la inicialización.

Al revisar el código que estaba utilizando, me encontré que los comandos en el archivo de recursos incluían la palabra GO.

Antes de abordar una solución simple, me gustaría explicar para qué sirve la palabra reservada GO en una sentencia SQL.

Vamos a abrir la página de opciones del SQL Server Management Studio:


Notemos que la opción "Batch separator" tiene el valor GO.    De ello podemos deducir que es una opción de configuración para SQL, de manera tal que en un sólo script podamos meter varias sentencias sin que una interfiera con la otra.    La palabra reservada GO no hace más que decir que ya terminó la sentencia y que la sentencia posterior es totalmente independiente a la anterior.

Vamos a probar esto con un ejemplo muy sencillo:

DECLARE @CurrentTime DATETIME = GETDATE()
PRINT @CurrentTime
GO
PRINT @CurrentTime


El resultado será el siguiente:


La primera sentencia PRINT sí se está ejecutando de forma exitosa, pero la segunda está marcando un error, y esto se debe a que la palabra reservada GO hace un "borrón y cuenta nueva", de manera tal que la variable @CurrentTime ya no existe en la segunda sentencia PRINT.

Debido a esto, el query que está ocupando mi compañero, está marcando el mensaje de error "Incorrect syntax near 'GO'"

Lo que menos se quería era tener que modificar el script para poder instalar la base de datos, por lo que encontramos una solución muy sencilla, crear una función que recibiera el script completo (con todo y GO) y lo dividiera en varios scripts tal como hipotéticamente se hace en SQL Server cuando se ejecuta, y el resultado fue el siguiente:

static void ExecuteCommand(string sqlCommandText, SqlConnection conn)
{
  SqlCommand comm = new SqlCommand("", conn);
  foreach (string sqlCommand in sqlCommandText.Split(new string[] { "GO\r\n" }, StringSplitOptions.RemoveEmptyEntries))
  {
    comm.CommandText = sqlCommand;
    comm.ExecuteNonQuery();
  }
}


Nuestra función aparte recibe una conexión abierta y disponible para ser utilizada.

Podemos notar que lo único que se está haciendo es dividir el script completo en pedazos ejecutables desde .NET.

La solución es sumamente simple, no hubo que ajustar nada en el código del script y la instalación de la base de datos ya tiene un resultado exitoso.

Espero te haya resultado de utilidad, nos vemos la siguiente entrada.