Gaceta Oficial 41231 sumario

Gaceta Oficial N° 41.231: aumento de sueldo 40% 1° septiembre 2017.

Abrimos septiembre con los precios aumentados de agosto, ante cada arremetida de la inflación inducida y especulativa un aumento de sueldo correspondiente (los precios suben en ascensor y los salarios por las escaleras). No es primera vez que vemos esta situación, en 1994 sucedio algo parecido pero en menor cuantía, en todo caso echarse a llorar nos deshidrata y no cambia en lo absoluto la situación. Volviendo al trabajo: en nuestra aplicación de farmacia por primera vez (en 2006 no se nos ocurrió pensar en ello) colocaremos la combinación de teclas CTRL+M al introducir cantidades monetarias para multiplicar por mil ya que de la reconversión monetaria del 2007 solo quedó el recuerdo. En los puntos de debito de los bancos podrían programar una de las teclas especiales como multiplicador por mil en cualquier país del mundo puede suceder esto, de hecho hay modelos de calculadoras electrónicas marca Casio que tienen teclas “doble cero” y “triple cero”.

Como podrán notar la cuenta Twitter de la Imprenta Nacional invita a descargarla en su “servicio de Gaceta del Día” y literalmente es eso, del día, porque lo que hacen es subir a un sitio de almacenaje llamado “mega.nz” y cada día cambian el enlace. A esta fecha tampoco funciona la página web del Tribunal Supremo de Justicia, o dice “servicio no disponible” o si abre no muestra el calendario de siempre y cuando uno mete el número de la Gaceta no devuelve resultado. En fin, nadie dijo que esto iba a ser fácil, pero contribuimos con nuestro granito de arena compartiendo la información con todos, sin ningún distingo, a continuación las cinco primeras hojitas, 1,5 megabytes en formato PDF:


Desde esta vuestra humilde página web lo pueden descargar del siguiente enlace:

—>>> Gaceta Oficial N° 41.231 <<<—


Continue reading

enlaces web

Enlaces de interés en el mundo de la programación en castellano

Pues en uno de esos momentos que uno dedica a “holgazanear” nos encontramos con el grato hallazgo de una página donde pone los enlaces web de sitios en castellano, los así llamados «blog técnicos». En cada pie de página de nuestro sitio hallaréis los sitios amigos a nosotros, pero en esta oportunidad os presentamos ¿a los futuros amigos? ¡Pues quien sabe, a lo mejor! Mejor anotarlos para luego irlos visitando uno por uno y poco a poco ¡Nuestra primera entrada que consiste de solo copiar y pegar! 😉

Enlaces relacionados con la programación.

Primero el blog de donde copiamos los enlaces: SYSADMIT.

Y ahora sí, copiar y pegar:

NombreSitio webCuenta en Twitter
José Luis Sánchez Borquehttps://mytcpip.com/
Juan Carlos Martínezhttp://www.martinezmartinez.eu/
Juan José Leónhttp://www.mellamansysadmin.es/
Luis Arandeshttp://www.navegandosistemas.es/
Josep Roshttp://www.josepros.com/
Ncorahttp://blog.ncora.com/
Jorge de la Cruzhttp://www.jorgedelacruz.es/
José Luis Gómezhttp://blog.e2h.net/
Roberto Tejerohttp://blogs.itpro.es/rtejero/
Blog de MegaCrackhttp://www.megacrack.es/
Juan Carlos Gilaranzhttp://www.mundosql.es/
Héctor Herrerohttp://www.bujarra.com/
Xavier Caballéhttp://www.pantallazos.es/
Ricard Ibáñezhttp://www.cenabit.com/
Gonz Gómezhttp://gonzgomez.blogspot.com/
Federico Cinallihttp://federicocinalli.com/
Leandro Ariel Leonhardthttp://www.blogvmware.com
Jordi Pratshttp://systemadmin.es/
Patricio Cerdahttp://patriciocerda.com
Luis Aitor Gonzálezhttp://luisaitorgonzalez.com
Gorka Izquierdohttp://www.aprendiendoavirtualizar.com/
Kyle Murleyhttps://kylemurley.wordpress.com/
Radek Strycharzhttp://greckzero.com/
Oscar Nogaleshttp://www.elblogtic.com/
Daniel Garciahttp://www.elinformatiku.es/
José Ramón Ramos Gatahttp://blog.ragasys.es/
Emiliano Marinihttp://www.linuxito.com/
Agustín Camposhttp://www.acampos.net/
David Hernándezhttp://www.daboblog.com/
Frikilinuxhttp://frikinux.blogspot.com.es/
Félix Merahttp://www.ingenieroinformatico.org
Roberto Garcíahttp://1gbdeinformacion.blogspot.com.es/
Santiago Buitragohttp://blog.asirsl.com/
Miguel Ángel Usechehttp://skatox.com/Skatox
Guillermo Sanchezhttp://www.itsanchez.com.ar/
Gaspar Fernándezhttp://totaki.com/poesiabinaria/
Blog Bitixhttps://picodotdev.github.io/blog-bitix/
Blog davidochobitshttp://www.ochobitshacenunbyte.com/
Toni de la Fuentehttp://www.blyx.com/
Ariel Antiguahttp://arielantigua.com/weblog/
Itxaso Larrinagahttps://mundoitblog.wordpress.com/
Jose Miguel Bernalhttp://jmbernal.com/
Rigoberto Sanchezhttp://www.elblogderigo.info/
Javier Peralhttps://www.sputniklab.net/
Alfonso Lópezhttp://www.zonademarrones.com/
Fernando Boladohttp://fernandoboladogarcia.blogspot.com.es/
José Domingohttp://www.josedomingo.org/
Aprendiz de sysadminhttp://aprendizdesysadmin.com@aprendizdsys
@fpalenzuela
Pedro Gonzálezhttp://goigon.blogspot.com.es
Javier Carrascohttp://www.javiercarrasco.es/
Juan Antonio Izquierdohttp://www.administracion-linux.com/
La fatiga del geekhttp://nauj27.com/blog/
Oscar Navarretehttp://www.aratech.es/
La senda del adminhttp://www.lasendadeladmin.com
El blog del roothttp://www.elblogdelroot.com
La mar de todohttps://lamardetodo.com
Deividhttps://deividsdocs.wordpress.com/
Miguel Carretashttps://elblogdeladministrador.com
Yudel Cartahttp://lawebdelyuyo.eu/
Diego Maciashttp://dmaciasblog.com
David Romero Trejohttp://www.davidromerotrejo.com/
Gurú de la informáticahttp://www.gurudelainformatica.es/
Hackerdecabecerahttp://www.hackerdecabecera.com/
Cambiadesohttps://www.cambiadeso.es
Chema Alonsohttp://www.elladodelmal.com/@ChemaAlonso
Instituto de Enseñanza Secundaria "José María Pereda"http://materialestic.es/
I.E.S. Las Galletashttp://www.asirlasgalletas.com
Blog de Nadiahttps://soynadiablog.wordpress.com/@SoyNadia_
Luigino Bracci Roahttp://softwarelibresocialista.blogspot.com/@Lubrio
Pandora FMS Opensource monitoringhttp://blog.pandorafms.org/es@PandoraFMS
Xanadu distro GNU/linuxhttps://xombra.com/@Xombra
Linux gnu bloghttp://linuxgnublog.org/@LinuxGnuBlog
ComputerNewAgehttps://computernewage.com/
El Baúl del Programadorhttps://elbauldelprogramador.com/
Pijus Magnificushttps://www.pijusmagnificus.com/
SysAdmithttp://www.sysadmit.com/
José María Morales Vásquezhttps://blog.unlugarenelmundo.es/@JoseMaria
Daniel Rodríguez Martínezhttps://www.makigas.es/@Makigas
@danirod93
Ondiz Zarragahttps://ondahostil.wordpress.com/lo-que-he-aprendido/@Makigas
@OndaHostil
Fran (@Cyberhadesblog)
Rafael (@Tuxotron)
http://www.cyberhades.com/@Cyberhadesblog
Zagurhttps://portallinux.es/@T3rr0rZ0n3
Ignacio Brihuega Rodriguezhttps://www.fwhibbit.es/@fwhibbit_blog
Damián Amoedohttps://entreunosyceros.net/@EntreUnosYceros
José Antonio Dongil Sánchezhttps://elabismodenull.wordpress.com/@jdonsan
Raúl Caro Pastorinohttp://www.laguialinux.es/@LaGuiaLinux
Diego Córdobahttps://juncotic.com/blog/@d1cor
@juncotic
Agustín Montero Blascohttps://israelmgo.es/@israelmgo
Josué Encinarhttps://www.ciberbyte.com/@_ciberbyte_
@JosueEncinar

Blog técnico en portugués:

Homelaber Brasil: http://homelaber.com.br/

Enlaces relacionados con el mundo forense.

Este es un paso más avanzado, para llegar acá debemos tener sólidos conocimientos aprendidos en los enlaces anteriores, acá tenemos un enlace cortesía de Manuel ” @CiberPoliES “Guerra, aquí la tenemos:

https://glider.es/webs-amigas-20-anos-despues/

Nota: allí también utilizan software privativo, el cual nosotros desaconsejamos ahora su uso, pero para combatir al crímen debemos echar mano de todos los recursos habidos y por haber; los cibercriminales siempre está al día con la tecnología.

Como véis ésa si que es una profesión muy ruda: saber programar en ambos mundos, libre y privativo, y lidiar con las fabricantes de hardware ¡menuda tarea! 😮


<Eso es todo, por ahora>.

 

eSpeak

eSpeak en Ubuntu 16 (y otros ambientes)

Yo renombraría esta utilería como “e-Speak”, un apócope de “Electronic Speak” porque para nosotros los castellanohablantes nos suena como un “espanglish“, pero bueno, así se llamaeSpeak” (así nos confunda) ¿Y qué hace este software? Pues simplemente nos “habla” el texto que querramos y es especialmente útil para añadir ayuda auditiva para los discapacitados visuales en nuestros programas. La imagen de los labios la he sacado de su propio sitio web, el programa es de los años 90 y las gráficas se necesitaban así, ligeras y toscas (por extensión a la licencia imagino la imagen será de dominio público, en todo caso siempre enlazamos dando crédito de autoría). Acá haremos unas simples líneas de comando (nosotros siempre usando solo la venta terminal ¡cuándo no es pascua en diciembre!) así que disfrutad de nuestra primera entrada de agosto de 2017.

eSpeak
eSpeak (página web)

Instalación.

Como reza el título estamos en un ambiente Ubuntu 16 así que las instrucciones serán para esta popular distribución (para Fedora seguid el enlace de las fuentes consultadas al final de este artículo). Abrimos una ventana terminal CTRL+ALT+T y tipeamos lo siguiente:

sudo apt-get install espeak
apt-get install espeak
apt-get install espeak

Una vez hayáis introducido vuestra contraseña y esperar que se descarguen los archivos de internet pues tendremos instalada nuestra nueva utilidad de deletreo. Probad, como todos los programas que por defecto vienen en idioma inglés, con el parámetro ” –help” para visualizar la ayuda disponible; leed y analizad antes de pasar al siguiente punto, las voces instaladas.

Otros sistemas operativos.

Lo bueno del software libre es que como tiene acceso al código fuente, podréis instalarlo vosotros mismos (con los ajustes y correcciones necesarios) en varios ambientes. En su repositorio en GitHub hay instrucciones detalladas al respecto para Windows, Mac, BSD y Android.

Voces instaladas.

Si nosotros hablaramos inglés, pues al diablo, todo sería más fácil, pero como hablamos “spanish” (¿habrá alguna aplicación que se llame “eSpanish“? 😉 ) procedemos a buscar las voces en nuestro idioma, mirad la figura:

espeak --voices | grep "spanish"
espeak --voices | grep "spanish"
espeak –voices | grep “spanish”

Acá vemos las dos letras claves son las del principio “es”, investigando más a fondo listamos las voces correspondientes al castellano:

espeak --voices="es"
espeak –voices=”es”

Ya vemos las voces disponibles para nuestro idioma pero en la documentación advierten que muchos idiomas son experimentales, así que solo esperad la perfección de Dios solamente, nosotros pobres mortales somos imperfectos (pero buscando siempre la excelencia).

Usando “eSpeak”.

La voz que vamos a utilizar entonces es “venezuala-mbrola-1” (para los angloparlantes el nombre de nuestro país es difícil de pronunciar, por eso lo escriben mal allí arriba en la opción, para ellos es “vene -pausa- zuuuuu-Ela”) así que podemos, por ejemplo, dar la siguiente orden en un guion para que nos avise que finalizó el proceso solicitado:

echo "Respaldo completado" | espeak -v es-vz

Así mismo podemos grabarlo en un archivo con la extensión .wav con el parámetro nemotécnico “-w“:

echo "Respaldo completado" | espeak -v es-vz -w respaldo_completado.wav

Otro uso es leer un archivo de texto que tengamos para ayudar a nuestros usuarios, pues “eSpeak” lo lee por nostros con el parámetro “-f” seguido del nombre del fichero:

espeak -f archivo.txt -v es-vz

Por último, si queremos que cada minuto nos de la hora de nuestro sistema, en castellano, lanzad lo siguiente:

while true; do date +%S | grep '00' && date +%H:%M | espeak -v es-vz; sleep 1; done

Si la voz “venezuala” está instalada, oiréis la hora en castellano y si es demasiado robotizada podemos jugar con los parámetros de amplitud, tono, etcétera, acá un ejemplo, experimentad vosotros mismos con otras cifras:

while true; do date +%S | grep '00' && date +%H:%M | espeak -v es-vz -s 160 -a 100 -g 4; sleep 1; done

Uso práctico.

Se nos ocurre que podemos agregar un trabajo por fecha “cron-job” para que revise un registro .log (archivos de texto con la extension .log) para que revise las últimas 10 líneas (valor por defecto de tail) y si encuentra un error nos advierta de manera auditiva:

tail -1F /tu/fichero/log | grep --line-buffered 'ERROR' | espeak  -v es-vz

Conclusión.

Ya no hay excusas para no ayudar a nuestros compatriotas discapacitados visualmente e incluso nos ayudamos nosotros mismos con recordatorios, podemos agregarlo a una aplicación o simplemente agregar una tarea programada para que ejecute un guion de un fichero donde agreguemos las cosas que queremos recordar ¿Qué os parece?

Fuentes consultadas:

En idioma inglés:

Chromium Web Browser Logo

Chromium extension tutorial

Por supuesto que no estamos hablando del elemento químico cromo (“chromium” en inglés) sino del popular navegador web de código abierto para todos. Lo que desarrollaremos es una “extensión”, una herramienta integrada al navegador y que tiene muy diferentes propósitos. Con fines didácticos haremos una extensión muy sencilla que nos redirige hacia una página web que nos devuelve simplemente nuestra propia dirección IPv4, ¡manos al teclado!

¿Qué es una extensión para Chromium?

Chromium Web Browser Logo

Como ya lo definimos al principio, una herramienta puede tener fines diversos, uno o más:

  • Pueden ser usadas para notificarnos si tenemos nuevos mensajes de correo electrónico por medio del pequeño icono que se coloca al lado de la barra de direcciones.
  • Si no hemos iniciado sesión en nuestra cuenta de correo-e basado en web, podemos hacer click en el icono para ir a la página donde introduciremos nuestras credenciales (¡Cuidado con las páginas falsas o “phishing”!).
  • Podría alertarnos si una palabra clave en particular aparece en la página que estemos visitando.
  • Podríamos programarla para NO cargar las imágenes de un sitio determinado -o todos los que visitemos-.
  • Tal vez sería útil para alertarnos de la modificación de una página (aunque para ellos hay lectores RSS específicos para ese trabajo) o su cambio de estado.
  • ¡Incluso, si somos aventureros, nos permitiría programar una calculadora!

Como ven los usos son muchos y variados, nuestra imaginación no tiene límites más sin embargo el entorno donde va a funcionar nuestra novel extensión sí que está supeditada al navegador Chromium. Esencialmente una extensión es una pequeñita página web que está alojada en un navegador web – en este caso Chromium – y que además puede acceder a ciertas funciones API (“Application Programming Interface“: conjunto de clases, métodos y funciones normalizadas).

La que nosotros vamos a realizar es bastante modesta y a medida que avanzemos la iremos profundizando más, pero la idea es introduciros en esta área de programación en un entorno de desarrollo bastante peculiar.

Creando el proyecto.

Pues que para comenzar crearemos en nuestro disco duro, donde gustemos, una carpeta con el nombre “KS7000_ConoceTuIPv4” – o el nombre que vosotros querais, sed de libre albedrío, lo importante es que aprendamos los conceptos y procedimientos-.

Primer componente de nuestra extensión en Chromium.

Como somos inclinados al dibujo técnico más que al dibujo artístico (¡Ea, que por allí viene nuestro tutorial sobre Inkscape!) lo que hicimos fue redimensionar un logotipo en formato PNG (que ya teníamos rodando por internet) a un tamaño de 16 por 16 píxeles ya que necesitados una pequeña interfaz gráfica para el botón donde nuestros usuarios harán click y abrirán nuestro trabajo. Cuando “subamos” – y especifiquemos- este icono a Chromium no tendremos que programar línea alguna: ya el navegador sabrá qué hacer al evento de hacer click sobre nuestra pequeña obra de arte microscópica (935 bytes “pesa” el fichero):

KS7000_ConoceTuIPv4 (icono)

Precisamente queremos hacer hincapié en este punto: esa imagen pequeñita que vamos a especificar ya Chromium le añade el evento click para cargar y ejecutar los siguientes componentes que vamos a crear, eso es, en sí, una Interfaz de Programación de Aplicaciones “API” -normalizadas en un ambiente determinado (Chromium, en este caso) -.

Creando un archivo de manifiesto.

Un manifiesto es simplemente una declaración de propósitos o programas. Para este caso es un fichero llamado manifest.json y por su extensión deducireis que está en lenguaje JSON: JavaScript Object Notation, el cual permite el intercambio de información entre cliente y servidor. Aunque está basado en la norma ECMA-262 3ª edición de 1999 nosotros consideramos que es una norma de facto. En todo caso no representa mayor misterio, tal como lo es XML, el JSON (a menos que guarde datos binarios) es plenamente legible tanto a humanos como a máquinas, pasemos a analizar su estructura mínima necesaria:

{
  "manifest_version": 2,
  "name": "KS7000_ConoceTuIPv4",
  "version": "1.0",
}

Explicado línea por línea, los tres primeros elementos son obligatorios:

  1. “manifest_version”: toma el valor 2 -sin comillas- para indicar que es a partir de la versión 18 de Chromium que funcionará la extensión. Al momento de escribir este reportaje vamos por la versión 59 así que ya sabeis que la versión 1 está obsoleta e inútil, de hecho. Notad cada coma para indicar separación de componentes, lo colocamos antes del fin de línea y retorno de carro.
  2. “name”: con hasta un máximo de 45 caracteres, es como identificaremos nuestra extensión y tratad que sea bien original y único si es que quereis algún día hacerlo famoso por internet y evitar malentendidos con otros programadores o incluso poderosas corporaciones.
  3. “version”: pues la numeración que utilizemos para identificar los cambios que le hagamos, y aunque está entrecomillado no os equivoquéis: son cuatro enteros de ntreo cero y 65535 separados por puntos y sirven para identificar – y actualizar a nuestros usuarios si hacemos una mejora -. En nuestro ejemplo colocamos “1.0” ¿Dónde diablos están los otros dos números faltantes? Pues en realidad nuestra versión es “1.0.0.0”, tened mucho cuidado al numerar porque como dijimos se usa para comparar y actualizar, de ser necesario, a nuestros usuarios.

Más adelante ahondaremos en otras propiedades que deberíamos agregar y que implican otros ficheros en nuestra mini aplicación, per antes de finalizar esta sección os contamos que hay otras propiedades interesantes:

  • “description”: la descripción de lo que realiza nuestra extensión, para lo que sirve, sed breve y conciso; entrecomillad.
  • “short_name“: que soporta hasta 12 caracteres y es especialmente útil para titular las pestañas y el lanzador de aplicaciones (en teoría).
  • “version_name”: un nombre no necesariamente numérica, si queremos colocarle un nombre afectuoso, deberiamos tratar de que sea único.

Así las cosas nuestro archivo de manifiesto va quedando como sigue:

{
  "manifest_version": 2,
  "name": "KS7000_ConoceTuIPv4",
  "short_name": "KS7000_IP",
  "description": "Esta extensión os permitirá saber vuestra dirección IPv4.",
  "version": "1.0",
  "version_name": "TuIPv4",
}

¿Acciones de página o acciones de navegador?

Aunque dijimos que Chromium sabría qué hacer con nuestra extensión, esto no es totalmente cierto ya que en esta API desarrollaron dos aciones principales de la cual debemos especificar que nuestra extensión realize alguna de las dos (o ninguna: si es ninguna pues no obtenemos ningún resultado, es una extensión inútil).

  • Acción de navegador: se ejecutará en cualquier pestaña y paǵina que abramos y permite que nuestros usuarios interactuen con nuestra extensión (ejecutar una orden o cambiar las preferencias, por ejemplo).
  • Acción de página: es un icono que indica un estado o condición a la página que estamos visitando (¿recuerdan que propusimos, al principio, una extensión que buesque y notifique la existencia de una palabra clave? pues eso, se puede activar -o no- si esa palabra clave está presente). Esta acción NO permite interactuar con los usuarios, es más bien informativa.

Nosotros usaremos la acción de navegador para lo cual debemos escribir:

"browser_action": {}

y colocamos entre los corchetes los elementos que queremos especificar y que a continuación especificamos:

 "default_icon": "KS7000_ConoceTuIPv4.png",
 "default_popup": "aviso.html"

La primera línea indicamos que utilice el ícono que os mostramos al principo, pero !ah,caramba! ¿habiais dicho que Chromium sabrá que hacer por nosotros? pues aquí el detalle no es culpa de Chromium ya que debido a los múltiples dispositivos (hardware) que pueden ejecutar este navegador web son muy diversos, los tamaños de pantalla son muy diversos también así que debemos -en teoría- hacer íconos de diferentes tamaños Y CHROMIUM SE ENCARGARÁ DE MOSTRAR EL QUE SEA DEL TAMAÑO ADECUADO AL DISPOSITIVO y tal como prometimos nos “harán” el trabajo a nosotros los programadores.

Acá nos quedaremos con un solo ícono, queda para vosotros estudies cómo especificar más iconos. La segunda línea establece cuál archivo .html queremos mostrar cuando el usuario haga click, y de nuevo es cuestión de tener variedad de opciones ya que podemos hacer varios ficheros .html (según la complejidad de nuestra extensión) pero debemos decirle al navegador cual queremos que muestre primero, así solo sea una la que “subamos” ¡NO ESTAMOS PROGRAMANDO EN PYTHON, TAMPOCO ESPERÉIS MILAGROS!

Archivo de manifiesto, versión final, debidamente indentado.

{
  "manifest_version": 2,
  "name": "KS7000_ConoceTuIPv4",
  "short_name": "KS7000_IP",
  "description": "Esta extensión os permitirá saber vuestra dirección IPv4.",
  "version": "1.0",
  "version_name": "TuIPv4",

  "browser_action": {
    "default_icon": "KS7000_ConoceTuIPv4.png",
    "default_popup": "aviso.html"
  } 
}

Elemento emergente de interfaz.

Ya sabemos que nos falta ahora un elemento, el “default_popup” al cual le asignamos el nombre “aviso.html” y como este tema no es un tutorial de HTML5 pues de una os colocamos el código del fichero de marras:

<!doctype html system "about:legacy-compat">
<html lang="es-419">
  <head>
    <meta charset="UTF-8">
    <title>KS7000</title>
  </head>
  <body>
    <h1>KS7000_ConoceTuIPv4</h1>
    <a href="http://www.soporteweb.com/" target="_blank">Haz click para saber saber vuestra dirección IPv4</a>
  </body>
</html>

“Subiendo” nuestra extensión.

Pues tanto como “subir” no será, no vamos a publicar nada por internet (aún no, por lo menos). Para nuestro ejemplo estamos ejecutando Ubuntu 16 64 bits al cual le instalamos Chromium 59 y en la barra de direcciones escribimos lo siguiente:

chrome://extensions/

Luego presionamos Intro o Enter y veremos algo muy parecido a esto:

Chromium instalar y configurar extensiones
Chromium instalar y configurar extensiones

En letras verdes os indicamos dónde “clickar” para activar el modo de programador, se os habilitan tres botones pero el primero de izquierda a derecha es el que nos interesa, el que pone “CARGAR EXTENSIÓN SIN EMPAQUETAR” ya que le vamos simplemente a indicar la carpeta que a tal efecto creamos al comenzar este tutorial. Dice que es “sin empaquetar” porque para publicar nuestra extensión en internet debemos comprimirla en un formato específico y con una herramienta específica que no solamente ahorra tamaño sino que también agrega seguridad, pero no es tema de este tutorial, allí teneis los enlaces si quereis estudiarlos a fondo.

KS7000_ConoceTuIPv4 instalado en Chromium
KS7000_ConoceTuIPv4 instalado en Chromium

Así veremos cuando está instalada nuestra extensión, notad el icono al finalizar la barra de direcciones al cual al hacerle click nos muestra lo siguiente:

KS7000_ConoceTuIPv4 ventana emergente
KS7000_ConoceTuIPv4 ventana emergente

En esa ventana pequeñita es que se “ejecuta” nuestra página web con el enlace deseado, pues bueno, click y listo, se abre una pestaña nueva (ya que usamos el target “_blank”) y vamos a un dominio cuyo único trabajo es devolver la dirección pública IPv4 de nosotros los internautas. ¡Felicidades, hemos creado nuestra primera extensión!

Posibles problemas.

Seguimos insistiendo con las API‘s: si tenemos algún error en nuestro código, “una metida de pata”, el Chromium nos indicará y animará a seguir intentando; en este ejemplo a propósitos omitimos unas comillas de apertura, es decir, no la pusimos por pares y al cargar nos indica esto:

KS7000_ConoceTuIPv4 mensaje de error en comillas de apertura
KS7000_ConoceTuIPv4 mensaje de error en comillas de apertura

El mensaje indica que es un token desconocido, pues claro, no está bien delimitado el elemento y asume que queremos declarar un dichoso token: ¡todo esto por una simple comilla doble que omitimos!

Usando guiones JavaScript.

Recordemos que JavaScript lo podemos ubicar tanto dentro de un archivo html como en un archivo aparte js que sea llamado, desde luego, el fichero html. Ambos métodos son soportados por las extensiones en Chromium y vamos a revisar las dos opciones.

Guiones JavaScript internos.

Primero eliminamos la extensión que creamos en Chromium y vamos a agregar el siguiente guión JavaScript justo en la cabecera <head>:

 <script>alert("Aviso de JavaScript");</script>

A continuación reinstalamos desde nuestra consabida carpeta y hacemos click en el icono de la extensión instalada (si no os funciona, revisad de nuevo bien desde el principio de este artículo) y lograremos ver el siguiente aviso que os lo resaltamos en color verde:

KS7000_ConoceTuIPv4 JavaScript error
KS7000_ConoceTuIPv4 JavaScript error

Cuando hacemos click en diho botón veremos algo parecido a esto:

KS7000_ConoceTuIPv4 hash error
KS7000_ConoceTuIPv4 hash error

¿Qué ha sucedido aquí? Pues simple y llanamente que Chromium tiene ciertos requisitos de seguridad basados en recomendaciones de la W3C a fin de proteger la integridad de nuestro software. Para que se pueda ejecutar algún guión JavaScript insertado en un fichero HTML debemos calcular el hash (tenemos un tutorial que explica este tema) del fichero en cuestión en insertarlo en el manifiesto mediante un comando específico.

Para ello ya tenemos la mitad del trabajo hecho: el cálculo del hash lo hace Chromium sin siquiera pedirselo, así que lo aprovechamos para agregarlo en manifest.json y la idea es que al declararlo se obliga a compararlo con el generado al archivo HTML y si ambos coinciden se considera que no ha habido alteraciones a nuestro trabajo por parte de terceras personas con buenos o malos propósitos.

Debemos entonces incluir estas lineas en el manifiesto:

"content_security_policy": "default-src 'self' 'sha256-jLjrqnmi4O/pyY5/8e4eXAPbFQ6Vq8j76usKTBjmtb4='),

Recargamos con CTRL+R y repetimos el proceso, y ahora logramos ejecutar con éxito:

KS7000-ConoceTuIPv4 mensaje de JavaScript
KS7000-ConoceTuIPv4 mensaje de JavaScript

Para que tengamos presente la seguridad, si cambiamos un solo caracter de “aviso.html” inmediatamente Chromium dejará de ejecutar cualquier script que haya dentro del archivo. Para poder ejecutarlo de nuevo, debemos volver a actualizar el hash, pero surge la pregunta ¿y si el atacante también modifica el hash dentro del manifiesto? Si estamos en nuesstros propios ordenadores pues esto es más que dificil que suceda, un atacante no va a invertir tiempo y esfuerzo para malograr un solo ordenador, es lógico que busque atacar cientos o miles de computadoras así que el obejtivo sería un repositorio en internet y allí interviene lo que comentamos: para “subir” nuestra aplicación para se repartido por internet no solamente la debemos comprimir, SINO QUE TAMBIÉN LE TENEMOS QUE AGREGAR UN HASH AL ARCHIVO COMPRIMIDO (recordad la herramienta crxmake).

Para comprobar lo que afirmamos, solo basta modificar un solo caracter en el fichero aviso.html, nosotros le agregamos par de símbolos de admiración en el mensaje y aunque no afecte para absolutamente nada la seguridad de nuestro equipo de igual manera se muestra la línea que ha sido modificada (o, en la vida real “hackeada”), mirad:

KS7000_ConoceTuIPv4 modificado y el hash es distinto del registrado
KS7000_ConoceTuIPv4 modificado y el hash es distinto del registrado

Como nota curiosa, ya logramos que el guión se ejecute pero eso es solo lo que hará Chromium, es decir, el archivo aviso.html no será mostrado pero poco importa para nosotros porque simplemente estamos aprendiendo a programar, por ello nos olvidaremos de incluir una instrucción de este tipo que llamamos modal. Una ventana modal es aquella que se posesiona del enfoque de una aplicación y la única manera de continuar es obedecer la instrucción que ordena. Para que aprendamos los guiones que se guardan en un fichero aparte, externo a un fichero html, debemos presentar los conceptos de ejecuciones síncronas y asíncronas.

Guiones síncronos y asíncronos.

La principal diferencia entre ambos métodos estriba que mientras el método síncrono detiene su ejecución y espera el resultado o liberación de recursos, el proceso asíncrono se ejecuta por sí solo y va de manera independiente (interactue o no con el proceso que le dio origen). Se pudiera decir que ambos procesos “padre” e “hijo” deberían de alguna forma comunicarse y esto se debe hacer por medio del entorno de desarrollo o IDE, por sus iniciales en inglés de “Integrated Development Environment” o Ambiente de Desarrollo integrado, lo cual simplifica enormemente nuestro trabajo de programación ya que nos permite abstraernos en programar solamente sin importar el hardware o sistema operativo utilizado (si se quiere lo podríamos ver como “aislado por capas” como lo es el modelo OSIpara las redes de ordenadores).

Generando un proceso asíncrono.

Vamos entonces a modificar nuestro fichero “aviso.html” de la siguiente manera, resaltado en verde los cambios:

<!doctype html system "about:legacy-compat">
<html lang="es-419">
  <head>
    <meta charset="UTF-8">
    <title>KS7000</title>
  </head>
  <body>
    <h1>KS7000_ConoceTuIPv4</h1>
    <button id="conoceIPv4">¡Conoce tu dirección IPv4!</button>
    <p id="IPv4"></p>
    <script src="emergente.js"></script>  </body>
</html>

¡ IMPORTANTE ! : declarad vuestro guion externo en JavaScript DESPUÉS de los elementos, de lo contrario arrojará un error “null” indicando que los elementos no existen. Esto es así debido a que el analizador “parser” va de arriba hacia abajo, línea por línea, y el proceso asíncrono que lanzamos debe tener con qué trabajar. En este caso hay dos elementos que “pasaremos”: el botón identificado como “conoceIPv4” y el párrafo sin texto o “en blanco” identificado como”IPv4″.

Ahora vamos a crear nuestro elemento escrito en JavaScript. un guión que, por ahora, simplemente colocará un mensajito de texto en el párrafo identificado como “IPv4”:

document.getElementById("conoceIPv4").addEventListener("click", buscaIPv4);
  function buscaIPv4() {
    document.getElementById("IPv4").innerHTML = "vuestra IPv4 es:";
  }

Como veis es algo bien sencillo:

  • En la primera línea declaramos que al documento identificado como “conoceIPv4” le agregue un evento que esté en función de si el usuario hace click en el botón y que ejecute la función “buscaIPv4”.
  • A su vez la función buscaIPv4 POR AHORA lo único que hace es sustituir al elemento (párrafo) con el identificador “IPv4” y lo sustituya con el mensaje “Vuestra IPv4 es:”.

Al guardar y recargar con CTRL+R las extensiones instaladas va a volver a mostrarnos el mensaje de que los hash NO coinciden, copiamos el hash actualizado y lo pegamos en el fichero manifiest.json para volver a recargar y ejecutar, podréis observar algo muy parecido a esto:

KS7000_ConoceTuIPv4 mensaje de encabezado
KS7000_ConoceTuIPv4 mensaje de encabezado

¡LISTO, HEMOS CREADO UN PROCESO ASÍNCRONO! MUY FÁCIL, ¿CIERTO? 🤓

Creando

Comprobando compatibilidad en Mozilla Firefox.

Por medio de la cuenta Twitter de un desarrollador web de Mauritania tuvimos la excelente oportunidad de revisar cómo se desarrolla una extensión en Mozilla Firefox (versión 45 o superior) y además cómo preparse para presentarla al público, todo muy detallado y bien pensado.

Como Chromium y Firefox ambos comparten el entorno de programación chrome hace que compartan la misma estructura de datos pero se “llega” de diferente manera. Primero debemos introducir en la barra de direcciones el siguiente comando:

about:debugging

Presionamos la tecla intro y seleccionamos complementos y hacemos click en el botón “Cargar complementario temporario” (sí, suena extraño en castellano pero si queremos colaborar con las traducciones, pues las puertas están abiertas). Seleccionamos la carpeta con nuestro mini proyecto y listo ¡a comprobar!

KS7000_ConoceTuIPv4 ejecutado en Mozilla Firefox
KS7000_ConoceTuIPv4 ejecutado en Mozilla Firefox

Fuentes consultadas.

En idioma francés.

En idioma italiano.

En idioma inglés.

Content Delivery Network (CDN)

“Content Delivery Network” (CDN)  o Red de Entrega de Contenidos es la forma moderna de garantizar que nuestra página web pueda ser visitada por millones de usuarios y consiste, de manera muy simplificada, de repartir nuestro contenido estático a través de servidores ubicados físicamente en distintas partes del planeta, de tal manera que según sea la dirección IP del visitante se contacte con el servidor más cercano. Veamos ahora los detalles ¡vamos!

“Content Delivery Network” (CDN).

Content Delivery Network versus tradicional imagen de Wikipedia
Content Delivery Network versus tradicional imagen de Wikipedia

Para poder entender hacia dónde vamos debemos ver de dónde venimos.

El primer servidor web.

Tim Berner-Lee, inventor del hiperenlace y del internet tal como lo conocemos, arrancó con un ordenador avanzado para la época fabricado por la compañía “NEXT Computers” la cual fue fundada por el legendario Steve Jobs luego de que lo despidieron de “Apple Computer”, la empresa por él creada. En aquellos años 90 nosotros comprábamos la revista PCMagazine en castellano donde daban cuenta en un artículo que esas computadoras NEXT tenían la increíble cantidad de 1024 megabytes en RAM y costaba cada una más de 10 mil US$ ¡sorprendente!

Primer servidor web NEXT en el CERN
Primer servidor web NEXT en el CERN

A dicho computador le pegaron un papelito indicando que era un servidor y que no debía ser apagado, estaba alojando la primera página web del mundo y pocos usuarios se conectaban a ella, específicamente los investigadores del CERN (“European Organization for Nuclear Research” Organización Europea para la Investigación Nuclear).

Montando nuestra primera página web.

Pues hoy en día tenemos los mismos recursos -incluso rebasan- que contaban y disponían los investigadores europeos: ordenadores con más de 8 mil megabytes de RAM y 4 núcleos de 64 bits con conexiones fijas a internet con más de 1 mbps de velocidad y sin ningún límite de megabytes son comunes, ¿Qué nos impide montar en nuestro hogar u oficina nuestra página web? La limitación es que nuestro proveeedor de internet muy probablemente nos proporcionará una dirección IP dinámica: al apagar el modem y volverlo a encender tendremos una dirección IP diferente y a nuestros usuarios tendremos que volver a notificarles del cambio. Para evitar dicho inconveniente desde los albores del nacimiento del internet se utilizan los DNS “Domain Name Service” Servicio de Nombres de Dominios: son ordenadores que uno les pregunta por un dominio (dirección web) y nos devuelve la dirección IP para conectarnos al ordenador que contiene la página web deseada.

Lo anterior lo podemos simplificar con los teléfonos móviles celulares: cuando una amiga os da su número simplemente lo ingresamos al teléfono y le damos marcar y listo, la encontramos y conectamos. Pero luego recordar ese número es el problema, para ello nuestro celular tiene una agenda donde podemos colocar el nombre de la chica asociada a su número telefónico. En este ejemplo el DNS sería la agenda de contactos y el número de teléfono sería la dirección IP. Huelga decir que los DNS son más avanzados que la agenda de contactos: si un dominio cambia su dirección IP ésta es automáticamente actualizada, cosa que no hace el programita de agenda de contactos del celular (a menos que llamara todos los días a la chica confirmando el número telefónico ¡Qué locura!).

Tráfico hacia nuestra página web.

Con este escenario, un ordenador en nuestra casa u oficina, con un acceso a internet las 24 horas del día sin limites de megabytes y una dirección IP fija y un DNS configurado estamos prestos a difundir al mundo nuestro trabajo sobre el software libre. Pero para hacerle honor a la verdad, lo que distingue un servidor web de un ordenador normal es la redundancia de sus componentes, así que tienen al menos dos fuentes de poder (si una se “quema”queda la otra funcionando y se puede cambiar sin necesidad de apagar el servidor)tienen al menos dos discos duros en RAID (escriben y leen los mismos datos en ambos discos) y también se pueden reemplazar sin apagarlo (al conectar un disco nuevo automáticamente la tarjeta madre copiará los datos del disco viejo al nuevo y “emparejará” la información), memoria RAM de seguridad que -adivinen- internamente son dobles y almacenan y comparan ambas copias constantemente y también tienen dos o más tarjetas de red, generalmente ethernet con cables de cobre o fibra óptica, de igual manera si una falla queda la otra funcionando -y no se pueden reemplazar porque son integradas a la tarjeta madre pero se puede adicionar una(s) en una(s) ranura(s) PCI libre-.

En cuanto a qué podremos hacer con un ordenador con dos o más tarjetas de red (si tenéis un ordenador portátil con tarjeta de red inalámbrica y  ethernet podéis hacer pruebas)  varios usos le podemos dar:

  • Ambas tarjetas de red conectados a un concentrador/enrutador en una red de área local con diferentes direcciones IP (por supuesto de área local): podemos balancear la carga para enviar nuestra página web por ambas tarjetas, eso se configura facilmente con ifenslave para luego aplicar modprobe.
  • Una tarjeta de red conectada al modem y la otra al concentrador/enrutador para trabajarlo como “puente”.
  • Una tarjeta de red conectada al enrutador/concentrador y la otra a otro ordenador con una base de datos para aislar y aumentar la seguridad de nuestra información (páginas web dinámicas).
  • Una tarjeta de red conectada a un concentrador y la otra a otro para crear dos segmentos de red.
  • Muchas otras combinaciones (aquí imaginen ustedes).

Esto que acabamos de explicar es para ir “abriendo la mente”, para lo que luego queremos explicar acerca de los CDN’s.

Para continuar optaremos por configurar nuestro modem/concentrador/enrutador (hoy en día se puede dar los tres aparatos en uno, por eso decimos que tenemos más poder de hardware que los investigadores del CERN en los años 90). En todo caso explicamos que:

  • Un modem, generalmente ADSL, nos conecta a internet.
  • Un enrutador toma una dirección IP asignada a nuestro modem (que está en “modo puente”) y traslada las peticiones (NAT) a nuestra red de área local (LAN).
  • Un concentrador amplía la cantidad de puertos necesarios para conectar hasta 255 ordenadores en un segmento de red (la mayoría de enrutadores tienen 4 puertos físico alámbricos, son pocos en realidad).

Así las cosas nuestro enrutador recibe las peticiones y las reenvía a nuestro servidor web: hasta allí todo va bien, pero ¿qué sucede si recibimos más visitas?

Ampliando la cantidad de ordenadores en una LAN.

Con 4 ordenadores podemos realizar el siguiente esquema para atender más visitantes:

  • Ordenador 1: recibe las peticiones y balancea la carga de trabajo hacia los ordenadores 2 y 3.
  • Ordenadores 2 y 3 son los servidores web como tal, reciben las cabeceras de peticiones de ordenador 1.
  • Ordenador 4: será donde guardemos nuestra página web y que los ordenadores 2 y 3 se encargarán de verificar constantemente si tienen la última versión de nuestra página web.

Este esquema tiene como ventaja, por supuesto, el poder atender más visitantes, manteniendo nuestro trabajo original en el ordenador 4 y teniendo respaldos en los ordenadores 2 y 3, el punto débil de la cadena sería el ordenador 1, que balancea la carga ya que si falla se cae por completo nuestro dominio, ojo con eso. Como desventaja podríamos mencionar, entre otras, el registro de los visitantes (quién ha sido atendido por ordenador 2 y quién por ordenador 3), problemas con las carpetas temporales en el caso que nuestros usuarios necesiten “subir” archivos a nuestra página web y con respecto al lenguaje PHP el almacenamiento de las variables de sesión que no serán iguales para todas las páginas (aquí debemos aclarar que nuestra página web es un sitio web conformado por varias páginas que pueden ser servidas tanto por ordenador 2 y ordenador 3: un visitante puede ver una hoja en ordenador 1 y al cabo del tiempo al volver a visitar el balanceo de carga lo envia a ordenador 3 por lo tanto las variables de sesión PHP serán con distintos valores, lo que pudiera ocasionar problemas de programación -“amnesia” de las aplicaciones-).

Añadiendo más “ancho de banda” a nuestra conexión a internet.

Pues que llega un momento que nuestro humilde modem ADSL no da para más velocidad, así que le pedimos a nuestro Proveedor de Servicio de Internet (“Internet Service Provider” ISP) nos suba la velocidad pero va a ser que no, lo máximo ya lo tenemos, 10 mbps y ADSL2 que llega a 25 mbps no está disponible… Pues agregamos otra línea telefónica y otro modem y en teoría nuestro ISP debería colocarlos en modo vinculado “bonding”: con la misma dirección IP transmite por ambos modem entre nuestra casa u oficina hasta la central telefónica más cercana. ¿Recuerdan la redundancia de tarjetas de red en los servidores? Pues bueno, aquí es lo mismo, es una habilitación en una de las capas del modelo OSI, específicamente la capa física (de hecho cada modem en sí mismo cumple con esa capa y cada capa es independiente de las otras capas tanto por encima como por debajo).

Servidores espejos “mirrors”.

Pues he aquí que nuestro negocio o portal educativo ha crecido y expandido en todo nuestro país, o incluso hacia el exterior , así que decidimos contratar alojamiento web en nuestro país y/o el exterior. En esos ordenadores contratados colocaremos una sincronización de archivos para que al modificar nuestros ficheros se copien, al cabo de cierto tiempo, a los servidores espejo.

Como ya tenemos configurado nuestro balanceo de carga lo único que tenemos que configurar es que se redirija hacia unas direcciones IP que no están en nuestra red de área local, sino en internet. El pequeño detalle de esta configuración estriba en que nuestro alojamiento debe ser dedicado, tal como tenemos montado en nuestra casa u oficina, si es alojamiento compartido deberemos comprar otro dominio web porque de esa manera es que sabe un servidor web compartido qué datos mostrar al visitante.

shared hosting
shared hosting

Si contratamos un servidor dedicado bien puede ser una máquina real o, lo que es más común hoy en día, una máquina virtual que igual compartiremos con otros sitios web un ordenador físico pero con varias máquinas virtuales que tendrán sus propias tarjetas de red virtuales con sus propios y únicos MAC por los cuales se podrán identificar y asignar sus propias direcciones IP fijas (esto es particularmente atractivo para cuando migremos, por fin, a las direcciones IPv6)

Inconvenientes de los servidores espejos.

Pues como ya se habrán percatado, nuestra debilidad sigue siendo el “balanceador de carga”: nuestro dominio y por medio de los DNS sigue devolviendo una única dirección IP, la de nuestro ordenador en nuestra casa u oficina, ¡pues he aquí la brillante solución de los CDN!

CDN “Content Delivery Network”.

De nuevo simplificaremos al máximo para ilustrar de manera didáctica sobre el como funciona. A nivel mundial las direcciones IP están repartidas por grandes proveedores de acceso a internet o incluso por países enteros. Acá en Venezuela CANTV tiene su rango de direcciones IP asignadas, así que para los servidores web es “facil” determinar si nuestro visitante esta conectado por medio de ese proveedor de internet, simplemente comparando la dirección IP contra los rango registrados. Pueden incluso llegar  a determinar desde cual ciudad se conectan. Basado en esto:

  • Una empresa decide montar un CDN a nivel mundial, así que va país por país donde montar una granja de servidores con acceso a internet por medio de algún proveedor que a su vez tiene su rango de direcciones IP asignadas. Aparte de la compra de conexión en sí como tal, también se incluye la compra de un rango de direcciones IP para asignarlas a los ordenadores de la nueva granja.
  • El siguiente paso es configurar con algunas de esas máquinas unos servidores DNS (generalmente uno principal y otro secundario). Dichos servidores DNS estarán a la orden de los servidores DNS del proveedor de internet y llevarán registro de los dominios web que van a alojar.
  • Este procedimiento se repite país por páis, o región por región.
  • Una vez tengan “armada” la red es hora de ofrecer el servicio, no sin antes “unificar” todos sus servidores DNS para que operen como un conjunto armónico.

¿Cómo funciona el CDN?

Al comprar nosotros un alojamiento en CDN lo primero que tenemos que hacer es configurar ante quien nos vendió el nombre o dominio web y establecer los DNS de la empresa que ofrece el servicio CDN. Nuestro trabajo es seguir manteniendo nuestro “balanceador de carga” como siempre lo hemos hecho pero con privilegios especiales para que los ordenadores del CDN tengan acceso y copien nuestra página web y la distribuyan por cada una de las granjas de servidores que nombramos anteriormente.

Lo brillante de la idea de los CDN es analizar la dirección IP de un visitante de nuestra página web RECORDAD que primero tiene que pasar por los DNS del CDN para saber la dirección IP de nuestro balanceador de carga… PUES VA A SER QUE NO porque si nuestro visitante está más cerca de una granja de servidores del CDN pues le pasa esa dirección IP al visitante de una manera totalmente transparente, al fin y al cabo es una copia exacta de nuestra web lo que le va a ser retribuida al internauta.

Un  asunto importante para un CDN es el poder identificar según la dirección IP recibida del webnauta de dónde viene para redirigirlo a la granja de servidores más cercana -y que contiene copia de nuestra página(s) web-. Es por ello que muchas empresas ofrecen para descargar sus bases de datos, con su respectivo “manual de uso”, por ejemplo, desde MaxMind podeis visitar su página designada al respecto en este enlace. Esencialmente se resume en este comando, siempre respetando y considerando de no abusar del servicio:

wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCityv6-beta/GeoLiteCityv6.dat.gz

Dicha base de datos es utilizada por aplicaciones de seguridad para proteger servidores web de ataques maliciosos. Dado el caso que suframos un ataque masivo de denegación de servicio (millones de dispositivos al mismo tiempo visitan nuestra página web con la intención de saturarla y colapsarla) pues simplemente será repartida a lo largo y ancho del planeta. Puede darse el caso que el ataque provenga, por ejemplo, de millones de dispositivos infectados que están localizados fisicamente en Europa: pues bien las granjas de servidores ubicadas en Europa (digamos que hayan tres, una en Francia, otra en Inglaterra y otra en Italia) solo esas tres granjas de servidores serán colapsados, si es que pueden, mientras que las demás granjas en el resto del mundo mantendrán nuestra página web incólume.

 

Conclusión.

Si queremos simplificar a tope podríamos decir, en una gran perspectiva, que los CDN actúan como unos “balanceadores de carga” pero a una gran medida, no sin antes realizar un arduo rabajo de sincronización de DNS y contenidos web. Esperamos les haya sido útil la información.

Fuentes consultadas.

En idioma castellano.

En idioma inglés.

Recursos multimedia.

Gaceta Oficial Extraordinario N° 6313 SUMARIO

Gaceta Oficial Extraordinario N° 6.313: aumento de sueldo 50% 1° julio 2017.

El aumento del sueldo mínimo en sí es el Decreto Presidencial N° 2.966 “mediante el cual se aumenta en un cincuenta por ciento (50%) el Salario Mínimo Nacional mensual obligatorio en todo el territorio de la República Bolivariana de Venezuela, para los trabajadores y las trabajadoras que presten servicios en los sectores público y privado, a partir del 1° de julio de 2017, estableciéndose la cantidad que en él se menciona.”

Es una sola hojita en formato PDF que no tuvimos que hacerle procedimiento alguno ya que lo descargamos de la Imprenta Nacional (institución al cual nos hemos referido en anteriores oportunidades) que ahora permite escoger una sola hoja o sino el documento completo con 16 hojas debido a que no fue posible descargarla del Tribunal Supremo de Justicia (que de todas maneras les dejamos el enlace para ver si ustedes tienen suerte por esta vía).


Desde esta vuestra humilde página web lo pueden descargar del siguiente enlace:

—>>> Gaceta Oficial Extraordinario N° 6.313 <<<—


Gaceta Oficial Extraordinario N° 6313 SUMARIO
Gaceta Oficial Extraordinario N° 6.313 SUMARIO

Asimismo se aumenta la Cestaticket socialista a 17 Unidades Tributarias por día, tanto para el sector privado como el sector público, y con dos decretos más adicionales para este último sector que por estar regidos por contrataciones colectivas las benditas burocracias no permiten el aumento de sueldo automático y para no tener que llamar a los sindicalistas y explicarles que todo aumento es bueno y no perder tiempo, pues de una se aumenta por decreto, de hecho las leyes rezan que todo lo que sea beneficioso al trabajador, aplíquese y después veremos las formas correspondiente(s), si es que hubiera(n).

Sumario

Decreto Presidencial N° 2.966

Decreto N° 2.966 mediante el cual se aumenta en un cincuenta por ciento (50%) el Salario Mínimo Nacional mensual obligatorio en todo el territorio de la República Bolivariana de Venezuela, para los trabajadores y las trabajadoras que presten servicios en los sectores público y privado, a partir del 1° de julio de 2017, estableciéndose la cantidad que en él se menciona.

Decreto Presidencial N° 2.967

Decreto N° 2.967, mediante el cual se ajusta la base de cálculo para el pago del Cestaticket Socialista para los trabajadores y las trabajadoras que presten servicios en los sectores público y privado, a diecisiete Unidades Tributarias (17 U.T.) por día, a razón de treinta (30) días por mes.

Decreto Presidencial N° 2.968

Decreto N° 2.968, mediante el cual se establece la Escala General de Sueldos para Funcionarias y Funcionarios Públicos de Carrera de la Administración Pública Nacional.

Decreto Presidencial N° 2.969

Decreto N° 2.969, mediante el cual se establece el Tabulador General Salarial para las Obreras y los Obreros que participan en el proceso social de trabajo en la Administración Pública Nacional.

Transcripciones

Decreto 2.966


Decreto 2.966

02 de julio de 2017

Nicolás Maduro Moros

Presidente de la República

Con el supremo compromiso y voluntad de lograr la mayor eficacia política y calidad revolucionaria en la construcción del Socialismo, la refundación de la patria venezolana, basado en principios humanistas, sustentado en condiciones morales y éticas que persiguen el progreso del país y del colectivo, por mandato del pueblo, de conformidad con lo establecido en los artículos 80 y 91 de la Constitución de la República Bolivariana de Venezuela; concatenado con el artículo 226 ejusdem, en ejercicio de las atribuciones que me confiere el numeral 11 del artículo 236 ibídem, en concordancia con el artículo 46 del Decreto con Rango, Valor y Fuerza de Ley Orgánica de la Administración Publica, y de acuerdo a lo preceptuado en los artículos 10, 98, 111 y 129 del Decreto con Rango, Valor y Fuerza de Ley Orgánica del Trabajo, los Trabajadores y las Trabajadoras, en Consejo de Ministros,

CONSIDERANDO

Que es una función fundamental del gobierno revolucionario la protección social, de la economía del Pueblo y de la guerra económica desarrollada por el imperialismo y sectores apátridas nacionales, que impulsan procesos inflacionarios y desestabilizacién económica como instrumentos de acumulación de capital y perturbación económica, política y social,

CONSIDERANDO

Que es función constitucional del Estado defender principios democráticos de equidad, así como una política de recuperación sostenida del poder adquisitivo de la población venezolana, así como la dignificación de la remuneración del trabajo y el desarrollo de un modelo productivo soberano, basado en la justa distribución de la riqueza, capaz de generar trabajo estable y de calidad, garantizando que las y los trabajadores disfruten de un salario mínimo igual para todas y todos,

CONSIDERANDO

Que el Decreto con Rango, Valor y Fuerza de Ley Orgánica del Trabajo, los Trabajadores y las Trabajadoras, promulgado por el Comandante Supremo de la Revolución Bolivariana, Hugo Rafael Chávez Frías, el 30 de abril de 2012 y publicado en la Gaceta Oficial de la República Bolivariana de Venezuela de fecha 07 de mayo de 2012, establece que el Estado fijará el salario mínimo, el cual deberá ser igual para todos las trabajadoras y los trabajadores en el territorio nacional y pagarse en moneda de curso legal.

DICTO

El siguiente,

DECRETO N0. 37 EN EL MARCO DEL ESTADO DE EXCEPCIÓN Y DE EMERGENCIA ECONÓMICA, MEDIANTE EL CUAL SE AUMENTA EL SALARIO MÍNIMO MENSUAL OBLIGATORIO Y SE AJUSTA EL BONO ESPECIAL COMPENSATORIO DE GUERRA ECONÓMICA A LAS PENSIONADAS Y PENSIONADOS

Artículo 1.

Se incrementa en un cincuenta por ciento (50%) el salario mínimo nacional mensual obligatorio en todo el territorio de la República Bolivariana de Venezuela, para las trabajadoras y los trabajadores que presten servicios en los sectores públicos y privados, sin perjuicio de lo dispuesto en el artículo 2° de este Decreto, a partir del 1° de julio de 2017, estableciéndose la cantidad de NOVENTA Y SIETE MIL QUINIENTOS TREINTA Y UN BOLÍVARES CON CINCUENTA Y SEIS CÉNTIMOS (Bs. 97.531,56) mensuales.

El monto de salario diurno por jornada, sera cancelado con base al salario mínimo mensual a que se refiere este artículo,
dividido entre treinta (30) días.

Artículo 2°.

Se fija un incremento del salario mínimo nacional mensual obligatorio en todo el territorio de la República Bolivariana de Venezuela para las y los adolescentes aprendices, de conformidad con los previsto en el Capítulo II del Título V, del Decreto con Rango, Valor y Fuerza de Ley Orgánica del Trabajo, los Trabajadores y las Trabajadoras, a partir del 1° de julio de 2017, por la cantidad SETENTA Y DOS MIL QUINIENTOS TREINTA Y DOS BOLÍVARES CON CUARENTA Y CUATRO CÉNTIMOS (Bs. 72.532,44) mensuales.

El monto del salario por jornada diurna, aplicable a las y los adolescentes aprendices, sera cancelado con base a| salario
mínimo mensual a que se refiere este artículo, dividido entre treinta (30) días.

Cuando la labor realizada por las y los adolescentes aprendices, sea efectuada en condiciones iguales a la de las demás trabajadoras y trabajadores, su salario mínimo será el establecido en el artículo 1° de este Decreto, de conformidad con el artículo 303 del Decreto con Rango, Valor y Fuerza de Ley Orgánica del Trabajo, los Trabajadores y las Trabajadoras.

Artículo 3.

Los salarios mínimos establecidos en este Decreto, deberán ser pagados en dinero en efectivo y no comprenderán, como parte de los mismos, ningún tipo de contraprestación en especie.

Artículo 4°.

Se fija como monto de |as pensiones de las jubiladas y los jubiladas, las pensionadas y los pensionados de la Administración Pública, el salario mínimo nacional obligatorio establecido en el artículo 1° de este Decreto.

Artículo 5°.

Se fija como monto de Ias pensiones otorgadas a las jubiladas y los jubilados, las pensionadas y los pensionados, por el Instituto Venezolano de los Seguros Sociales (I.V.S.S.), el salario mínimo nacional obligatorio establecido en el artículo 1° de este Decreto.

Artículo 6.

Adicionalmente, a lo establecido en el artículo 1° de este Decreto se otorga a las pensionadas y los pensionados por el Instituto Venezolano de los Seguros Sociales (I.V.S.S.), que perciban el equivalente a un salario mínimo un Bono Especial de Guerra Económica del treinta por ciento (30%), equivalente a la cantidad de VEINTINUEVE MIL DOSCIENTOS CINCUENTA Y NUEVE BOLiVARES CON CUARENTA Y SIETE CéNTIMOS (Bs.29.259,47) mensuales.

Quienes fueren beneficiarios de más de una pensión en el marco del ordenamiento jurídico aplicable, recibirán el beneficio solo con respecto a una de ellas.

Artículo 7.

Cuando la participación en el proceso social de trabajo se hubiere convenido a tiempo parcial, el salario estipulado como mínimo, podrá someterse a lo dispuesto en el artículo 172 del Decreto con Rango, Valor y Fuerza de Ley Orgánica del Trabajo, los Trabajadores y las Trabajadoras, en cuanto fuere pertinente.

Artículo 8.

El pago de un salario inferior a los estipulados como mínimos en este Decreto, obligara al patrono o patrona a su pago de conformidad con el artículo 130 del Decreto con Rango, Valor y Fuerza de Ley Orgánica del Trabajo, los Trabajadores y las Trabajadoras y dará lugar a la sanción indicada en su artículo 533.

Artículo 9.

Se mantendrán inalterables las condiciones de trabajo no modificadas en este Decreto, salvo las que se adopten o acuerden en beneficio de la trabajadora y el trabajador.

Artículo 10.

Queda encargado de la ejecución de este Decreto, el Ministro del Poder Popular para el Proceso Social de Trabajo.

Artículo 11.

Este Decreto entrara en vigencia a partir del 1° de julio de 2017.

Dado en Caracas, a los dos días del mas de julio de dos mil diecisiete. Años 207° de la Independencia, 158° de la Federación y 18° de la Revolución Bolivariana.

Ejecútese,
(Ls.)


Decreto N° 2.967


Decreto N° 2.967

02 de julio de 2017

NICOLÁS MADURO MOROS

Presidente de la República

Con el supremo compromiso y voluntad de lograr la mayor eficacia política y calidad revolucionaria en la construcción del Socialismo, la refundación de la patria venezolana, basado en principios humanistas, sustentado en condiciones morales y éticas que persiguen el progreso del país y del colectivo, por mandato del pueblo, de conformidad con lo establecido en el artículo 226 de la Constitución de la República Bolivariana de Venezuela; en ejercicio de las atribuciones que me confiere el numeral 11 del artículo 236 ejusdem, en concordancia con lo dispuesto en el artículo 46 del Decreto con Rango, Valor y Fuerza de Ley Orgánica de la Administración Publica, concatenado con el articularlo 7° del Decreto con Rango, Valor y Fuerza de Ley del Cestaticket Socialista para los Trabajadores y Trabajadoras, en Consejo de Ministros,

CONSIDERANDO

Que el Estado debe promover el desarrollo económico, con el generar fuentes de trabajo, con alto valor agregado nacional y elevar el nivel de vida de la población para garantizar la seguridad jurídica y la equidad en el crecimiento de la
economía, a objeto de lograr una justa distribución de la riqueza, mediante una planificación estratégica, democrática y participativa,

CONSIDERANDO

Que es obligación del Estado, proteger al pueblo venezolano de los embates de la guerra económica propiciada por factores tanto internos como externos; razón por la cual, considera necesario equilibrar los diferentes eslabones del proceso productivo y garantizar el acceso de la población a los productos de primera necesidad ante las circunstancias que vive la economía venezolana,

CONSIDERANDO

Que es interés del Ejecutivo Nacional, asegurar los niveles de bienestar y prosperidad de las trabajadoras y los trabajadores y de su núcleo familiar.

DICTO

El siguiente,

DECRETO N0. 38 EN EL MARCO DEL ESTADO DE EXCEPCIÓN Y DE EMERGENCIA ECONÓMICA,  MEDIANTE EL CUAL SE INCREMENTA LA BASE DE CALCULO PARA EL PAGO DEL BENEFICIO DEL CESTATICKET SOCIALISTA.

Articulo 1°.

Se ajusta la base de calculo para el pago del Cestaticket Socialista para Ias trabajadoras y los trabajadores que presten servicios en los sectores público y privado, a Diecisiete Unidades Tributarias (17 U.T.) por día, a razón de treinta (30) días por mes, pudiendo percibir hasta un maximo del equivalente a Quinientas Diez Unidades Tributarias (510 U.T.) a| mes, sin perjuicio de lo dispuesto en el articulo 7° del Decreto con Rango, Valor y Fuerza de Ley del Cestaticket Socialista para los Trabajadores y Trabajadoras.

Articulo 2°.

Las entidades de trabajo de los sectores público y privado, ajustaran de conformidad con Io establecido en el artículo 1° de este Decreto, el beneficio de alimentación denominado “Cestaticket Socialista” a todos las trabajadoras y Ios trabajadores a su servicio.

Articulo 3°.

Las empleadoras y empleadores tanto del sector público como del privado, pagaran a cada trabajadora y trabajador en efectivo 0 mediante abono en su cuenta nómina el monto por concepto de Cestaticket Socialista a que se refiere e| artículo 1° de este Decreto, expresando en el recibo de pago separado el monto que resulte por los días laborados, así como indicando que el mismo no genera incidencia salarial alguna, y en consecuencia no podrán efectuarse deducciones sobre éste, salvo las que expresamente autorice el trabajador para la adquisición de bienes y servicios en el marco de los programas  y misiones sociales para la satisfacción de sus necesidades.

Articulo 4°.

El ajuste mencionado en el articulo 1° de este Decreto, es de obligatorio cumplimiento por parte de las empleadoras y los empleadores en todo el territorio de la República Bolivariana de Venezuela.

Articulo 5°.

Las entidades de trabajo de los sectores público y privado, que mantienen en funcionamiento el beneficio establecido en el artículo 4°, numerales 1 al 4 del Decreto con Rango, Valor y Fuerza de Ley del Cestaticket Socialista para los Trabajadores y Trabajadoras, adicionalmente y en forma temporal, deberán otorgar dicho beneficio en efectivo 0 mediante depósito en la cuenta nómina de acuerdo con la establecido en el artículo 3° de este Decreto.

Articulo 6°.

Queda encargado de la ejecución de este Decreto, el Ministro del Poder Popular para el Proceso Social de Trabajo.

Articulo 7°.

Este Decreto entrará en vigencia a partir del 1° de julio de 2017.

Dado en Caracas, a los dos días del mes de julio de dos mil diecisiete. Años 207° de la Independencia, 158° de la Federacion y 18° de la Revolucion Bolivariana.

Ejecútese,
(Ls.)

Fuentes consultadas.

Tomadas de Youtube:

Tomadas de Twitter:

 

Calculando factoriales de números grandes

El día de ayer por medio del perfil de línea de tiempo del Doctor Juan González observamos el interesante artículo tutorial sobre Python publicado por Juan J. Merelo Guervós el cual incluye retos de programación. Ni tardo ni perezoso, a pesar de llegar cansado a mi hogar, y tras una vigorizante taza de café negro con leche de avena sin azúcar nos dimos a la tarea de practicar algunas cositas para mantener el cerebro en forma y al día con las novedades en programación.

Calculando el factorial de un número.

Definición.

No vamos a hacer esta entrada muy profunda, ya que debemos ir a trabajar para ganarnos el pan de cada día, directo y rápido: el factorial de un número viene expresado por la multiplicación sucesiva de sus antecesores, uno a uno, hasta llegar a uno y se denota por ” n! ” ; así, por ejemplo 5!= 5 x 4 x 3 x 2 x 1 = 120 (las equis indican multiplicación).

El reto.

Pues arroja el guante el sr. Merelo con una función recursiva escrita, por supuesto, en lenguaje Python para calcular un factorial y tras ensayo y error llegamos a una satisfactoria y muy parecida a la ya famosa y escrita por todos lados en internet (para ser honestos en algún momento vimos esta función pero no recordabamos… hasta que el buscador DuckDuckGo acudió en nuestra ayuda, un asistente tan capaz -en memoria- como todas las asistentes que tuvo Albert Einstein -que en paz descansen, Valentine Bargmann y el Doctor Einstein-).

Para ilustraros cómo funciona, aprovechando nuestro mundo tecnológico –y añorando el gis y el pizarrón- os colocamos un gif animado tomado de penjee.com, un sitio web dedicado también a la enseñanza de Python:

Función factorial animada tomada de penjee.com
Función factorial animada tomada de penjee.com
def factorial(num):
  if num == 1:
    return 1
  else:
    return num * factorial(num - 1)

Calculando el factorial de un número grande.

Factorial, fórmula y definición
Factorial, fórmula y definición

Hasta acá todo muy bien, pero el reto no finalizaba allí, una segunda pregunta era ¿qué tal calcula los números grandes? Como bien podéis imaginar, el multiplicar y multiplicar en ordenador pues en algún momento se nos agota la memoria suponíamos nosotros… pues que aquí está la pega del asunto, tras calcular el factorial 120! de manera fácil (en Wikipedia en inglés denotan que normalmente el máximo factorial que se puede calcular con un procesador de 64 bits en una variable de tipo entero es 20! –ya nosotros hemos comentado el poder de cómputo de los procesadores y sistemas operativos de 64 bits-) pues nos envalentonamos a ir “al infinito y más allá”.

python factorial.py con n = 120 (ciento veinte)
python factorial.py con n = 120 (ciento veinte)

Siendo así la cosa le establecemos a 1200 (un mil doscientos) a la función de marras y nos arrojó este lindísimo mensaje de error que os mostramos:

python factorial.py con n = 1200 (mil doscientos)
python factorial.py con n = 1200 (mil doscientos)

Pero leyendo nos percatamos que el problema no es el desbordamiento de memoria, no,  el desbordamiento es un error en la profundidad de recursión:

RecursionError: maximum recursion depth exceeded in comparison

El contrareto.

Ya esto se salía del reto impuesto, es un contrareto que nos presenta Python pues claro, en un entorno de programación uno debe siempre imponer límites considerando que aún no ha llegado la computación cuántica (y aún así ésta tiene límites en este universo). Indagando, y hay bastante material sobre el tema, llegamos a la librería sys encargada de manejar tales asuntos y de hecho el manual en línea de Pyton nos advierte:

Set the maximum depth of the Python interpreter stack to limit. This limit prevents infinite recursion from causing an overflow of the C stack and crashing Python. The highest possible limit is platform-dependent. A user may need to set the limit higher when she has a program that requires deep recursion and a platform that supports a higher limit. This should be done with care, because a too-high limit can lead to a crash.

Que traducimos al castellano:

Establece el límite de la profundidad máxima de la pila del interprete Python. Este límite previene una recursión infinita ocasionando un desbordamiento en la pila (del lenguaje) C y la consecuente falla de Python (Dios nos ampare que alguien crea que Python es falible†). El límite más alto posible es dependiente de la plataforma empleada. Un usuario puede necesitar ajustar el límite superior cuando tenga un programa que requiera una mayor recursión y la plataforma que lo soporta lo permita. Esto debería hacerse con cuidado porque un límite muy alto puede conducir a un fallo (Dios nos ampare que alguien crea que Python es falible†).

†(Nota del traductor en tono de sarcasmo).

Python recursion limit get and set
Python recursion limit get and set

O inventamos o erramos.

Don Simón Rodríguez: "Inventamos o erramos".
Don Simón Rodríguez: “Inventamos o erramos”.

Como nuestro insigne Don Simón Rordríguez nos legó, debemos inventar y a lo sumo fallar (y reintentar y así sucesivamente hasta lograr inventar) nosotros pensamos ¿Y si establecemos el límite superior de la pila de procedimientos (límite de recursión) precisamente de manera recursiva? 🤔

Pues acá vamos entonces:

import sys
def factorial(num):
  '''Return large factorial by Jimmy Olano Sayago
               (GNU General Public License v3.0) '''
  if num<=1:
    return 1
  else:
    sys.setrecursionlimit(sys.getrecursionlimit()+1)
    return num * factorial(num - 1)

file = open('large_factorial_result.txt', 'w')
cad = factorial.__doc__
file.write( cad )
file.write( ' factorial(21700): ' )
file.write( str( factorial( 21700) ) )
file.close

Al tener nosotros establecida la función, por tanteo y utilizando un procesador AMD A8-6600K APU (64 bits, 4 núcleos y 8 gigabytes en RAM) llegamos un valor de 21700! el cual ocupa 86400 digitos. Esencialmente el guion que hicimos basados en la clásica función recursiva de cálculo factorial es aumentar el límite de pila de Python de manera recursiva para luego abrir un archivo de texto y guardar allí el resultado.

El delicado tema de los typos de variables y la memoria disponible.

Consultamos muy diversos reportajes sobre el tema del manejo de la memoria y las variables pero el que fue revelador para nosotros es uno escrito hace más de once años pero que goza de plena vigencia: una comparación sobre cómo trabajan las variables los lenguajes C y Python.

Tiene su teoría y abunda su práctica y probamos los diferentes ejemplos y nos resultó en valore comprobatorios contra lo que se afirma en dicha entrada pero la conclusión es tan excelente que se las traemos en idioma inglés y la traducimos al castellano:

Python removes this confusion, there is only the integer object. Does it have any limits? Very early versions of Python had a limit that was later removed. The limits now are set by the amount of memory you have in your computer. If you want to create an astronomical integer 5,000 digits long, go ahead. Typing it or reading it will be the only problem! How does Python do all of this? It automatically manages the integer object, which is initially set to 32 bits for speed. If it exceeds 32 bits, then Python increases its size as needed up to the RAM limit.

La traducción hecha por nosotros:

Python elimina esta confusión (de variables), hay solo el objeto entero. ¿Tiene algún límite? Muy tempranas versiones de Python tuevieron un límite que luego más tarde fue removido. Los límites ahora son establecidos por el monto de memoria que usted tenga en su computadora. Si quiere crear un entero astronómico de 5 mil dígitos, ¡adelante! ¡Escribirlo o leerlo será el único problema! ¿Cómo Python hace todo esto posible? Pues automáticamente dirige el objeto entero, el cual inicialmente estaba configurada a 32 bits por motivos de velocidad. Si excede los 32 bits, entonces Python incrementa su tamaño tanto como se necesite hasta llegar al límite de la memoria RAM.

Así como lo podéis leer, en el año 2006 se consideraba “astronómico” una cifra de 5000 dígitos, ¡PUES HE AQUÍ QUE CALCULAMOS UN FACTORIAL CON 86400 DÍGITOS! Para nosotros es todo un logro digno de dedicarle una entrada y una pequeña nota en las Wikipedia(s).

Sometido a consideración por la comunidad de programación y comunidad matemática.

De inmediato subimos el guion y su resultado (utilizando el idioma inglés) a Gist mantenido en línea por GitHub.com (¡gracias!) y “tuiteado” con la etiqueta #Python y #1linepy tal como recomienda el sr. Merelo:

Experimento social.

Como experimeto social hemos cometido una torpeza en la fórmula cuando establecemos:

if num<=1:
  return 1

El objetivo es detectar cuántas personas realmente analizan nuestra propuesta y nos hacen llegar sus observaciones (se especula que el mismísimo Leonardo DaVinci codificaba mal sus planos a propósito por si caían en manos enemigas) ya que el cálculo de factoriales está supeditado al campo de los números positivos, ya sean reales o imaginarios (esto es así porque el cálculo factorial es clave en la determinación de combinaciones y permutas, todas ellas en el campo de los números positivos).

También hemos publicado en Wikipedia en inglés nuestra experiencia (y próximamente en castellano, francés, italiano, portugués, alemán y ruso en la medida de lo posible y de nuestro tiempo libre) para determinar cuales sociedades unidas por un idioma común aceptan o rechazan nuestra propuesta (cada idioma Wiki tiene sus wikipedistas que algunas veces nos han “echado para atrás” nuestras ediciones por diversos motivos variopintos).

 

Conclusión: no hemos llegado aún al infinito, menos más allá.

Una inquietud que tenemos es la gran cantidad de ceros al final del resultado y una cosa que nos tranquiliza es la serie de resultados hasta 20! que va aumentado la cantidad de ceros a la derecha. Lo lógico es que si estamos multiplicando pues “corremos la coma hacia la derecha” y se debe, desde luego, rellenar con ceros para ello.

Aún falta por determinar hasta qué punto alcanza nuestro hardware su límite, podremos hacer un ciclo “for” que arranque con este último valor de 21700! e irlo incrementando y guardando en archivos cuyos nombres tengan el valor calculado apara identificarlos hasta que simplemente falle Python, ¡PERO ESPEREN, HAY MÁS!

Pensamos que arrancando nuestro sistema operativo Ubuntu 16.04 LTS en modo terminal, sin cargar interfaz gráfica y “tumbando” los servicios diversos -Apache server, MySQL, etc.- y los más que se puedan de systemd ganaremos más memoria y compararemos resultados a ver si influye y si es así, cuánto influye, ¡SOMOS TODO OÍDOS A VUESTRAS IDEAS AL RESPECTO POR MEDIO DE NUESTRA CUENTA EN TWITTER @KS7000!

Fuentes consultadas.

En idioma castellano.

En idioma italiano.

En idioma inglés.

Language programming books, photo by Helder da Rocha

Clases, Objetos e Instancias

Abrimos el mes de julio con mucho trabajo y hemos estado lentos en la publicación por este vuestro humilde “web log” pero hicimos un paréntesis con la simple traducción de un artículo duro y contundente a propósito de un trabajo de investigación que venimos desarrollando. Estos conceptos -expuestos de una manera muy práctica y orientados sobre lenguaje Java- los consideramos fundamentales (a pesar que algunos programadores han anunciado este modelo como en decadencia) por ello los traducimos tal cual y además les agregamos unos enlaces para que veaís cuán profundo es el tema y como de maravilloso lo simplificaron en el artículo que citamos en idioma castellano a continuación.

Language programming books, photo by Helder da Rocha
Language programming books, photo by Helder da Rocha /147570929

Clase versus Objeto versus Instancia

En la Programación Orientada a Objeto frecuentemente escuchamos términos como “Clase”, “Objeto” e “Instancia” pero ¿qué es una Clase / Objeto / Instancia en realidad?

En resumen, un objeto es un paquete de software de estado y comportamiento relacionados. Una Clase es un modelo o prototipo del que se crean los Objetos. Una Instancia es una sencilla y singular unidad de una clase.

Por ejemplo, tenemos un proyecto (Clase) que representa al “Estudiante” (Objeto) con campos como nombre, edad, curso (miembro de la Clase). Y tenemos dos estudiantes aquí, José y María. Así, José y María son dos Instancias diferentes de la clase “Estudiante” que representan el Objeto (personas Estudiantes). Veamos mayores detalles.

Objeto.

Los objetos del mundo real comparten 2 características principales, estado y comportamiento. Los humanos tienen estado (nombre, edad) y comportamiento (correr, dormir). Los objetos de software son conceptualmente similares a los objetos del mundo real: ellos también consisten en el estado y el comportamiento relacionado. Un Objeto almacena su estado en campos y expone su comportamiento a través de métodos.

Clase.

La clase es una “plantilla” o “modelo” que se utiliza para crear objetos. Básicamente, una clase consistirá en campo, campo estático, método, método estático y constructor. Campo se utiliza para mantener el estado de la clase (por ejemplo: nombre del objeto Estudiante). El método se utiliza para representar el comportamiento de la clase (por ejemplo: cómo un objeto Estudiante va a ponerse de pie). Constructor se utiliza para crear una nueva instancia de la clase.

Instancia.

Una Instancia es una copia única de una clase que representa un Objeto. Cuando se crea una nueva Instancia de una Clase, el ordenador asignará un espacio de memoria para esa Instancia de Clase (en nuestro ejemplo, José y María tendrán su espacio aparte e independientes en memoria).

Nota: aunque no está en el artículo original, quisieramos agregar algo adicional con respecto a las Instancias, y es que pudiera darse el caso que se pudieran compartir los valores de campo fácilmente entre dos o más Instancias y precisamente eso es lo que facilita la programación. Si la Clase Estudiante tiene un campo llamado “residencia” (la cual tiene subcampos que contienen la dirección de habitación – estado, ciudad, barrio, calle, casa, etc.- de José y María) y ellos son parejas y viven en la misma casa pues con solo rellenar los campos de María al finalizar los “igualamos” -copiamos- en un solo paso a la Instancia Pedro ¡fácil!.

Fuentes consultadas.

En idioma castellano.

En idioma inglés.

Impuesto Sobre La Renta (ISLR)

ISLR retenciones

El pasado 12 de mayo se cumplieron 20 años del Decreto Presidencial 1.808 el cual dicta las normas y procedimientos para las retenciones del Impuesto Sobre La Renta (ISLR). En todo ese tiempo hemos tenido dos Constituciones (enmienda incluida), varios Presidentes de la República, Congreso de Diputados y Senadores y luego una Asamblea Nacional Legislativa e infinidad de Ministros y Ministras ¿Cómo es posible que este decreto haya sobrevivido tanto tiempo?

Advertencia.
Advertencia.

Por supuesto que este artículo está dirigido a los venezolanos y venezolanas que hace muchísimos años nos retienen el Impuesto Sobre La Renta  “ISLR” en nuestro trabajo intelectual de servicios a las empresas privadas (nunca hemos laborado ni contratado con el sector público). No somos licenciados, ni contadores, mucho menos abogados, pero ya saben como reza el dicho “se puede desconocer la Ley pero la Ley no lo desconoce a usted” Y POR ESO ES MEJOR ESTUDIAR LA LEGISLACIÓN AL RESPECTO ya que estamos directamente involucrados. Vamos pues a este proceso de aprendizaje (o redescubrimiento, en realidad) de las Ciencias Sociales, rama Tributaria.

Impuesto Sobre La Renta (ISLR)
Impuesto Sobre La Renta (ISLR)

Antecedentes.

Acá hemos reportado sobre lo que es la Gaceta Oficial de la República, el Registro de Información Fiscal (ley de identificación incluída), las Normas de Emisión de Documentos, las retenciones de impuesto al valor agregado, la Unidad Tributaria y hasta un glosario tributario: todo esto, y aún más , “toca” y/o se ve relacionado con la Ley de Impuesto Sobre la Renta.

Las razones por las que a perdurado esta normativa tributaria fue debido a la quiebra del Banco Latino y que generó una seguidilla de quiebras a lo que llevó a la “crisis bancaria” de 1994 (esencialmente los dueños de los bancos usaron nuestros ahorros, compraron dólares estadounidenses en gran cuantía y se los llevaron a EEUU y otros paraísos fiscales para poner de rodillas al gobierno del Dr. Rafael Caldera -quien no es santo de nuestra devoción-).

Tenemos un artículo que trata sobre el tema, ya que lo que hacemos acá en Venezuela es vivir de la renta petrolera y al bajar los precios y los banqueros robarse las reservas internacionales con nuestros ahorros (teníamos cuenta en el Banco de Maracaibo y como iba a quebrar nos pasamos al Banco de Venezuela… el cual también quebró pero lo reflotaron, privatizaron y volvieron a nacionalizar y ahora es el primer banco del país) se descalabra la economía nacional toda.

Banco de Maracaibo libretas de ahorro 1994
Banco de Maracaibo libretas de ahorro 1994

Para no aburrirlos con nuestras historias que vivimos en carne propia acá una entrevista al Presidente (E) José Guillermo Andueza, padre del Decreto Presidencial 1.808 (el Dr. Rafael Caldera debido a su edad en su segundo mandato estaba muy aquejado de salud) ofrece declaraciones de lo que sucedía en el país para aquel entonces (cualquier similitud al dia de hoy NO es pura coincidencia, son los ciclos de altas y bajas de los precios del petróleo):

En 1997 con esa situación económica no solo se tenían que recaudar más impuestos sino que había que recortar “gastos” y aunque era el sector público el del problema, el sector privado también sufrió mucho por el aumento indiscrimidado de la divisa US$ así que el Doctor Rafel Caldera tuvo que echar marcha atrás en sus ideales (él es el padre de la Ley del Trabajo) y así lo anunciaba en ese mismo año 1997:

De aquella época guardamos los folletos que entregaba la Guardia Nacional, negocio por negocio, y recordamos la Ley de Remisión Tributaria que fue una ley de amnistías fiscal (si es que ese término existe) porque la evasión era espantosa, EXISTÍA MUY POCA CULTURA TRIBUTARÍA EN ESE PERÍODO PRESIDENCIAL pero afortunadamente DISIP y Guardia Nacional pudieron poco a poco enmendar el capote.

Impresión y emisión de factura y otros documentos LEY DE REMISIÓN TRIBUTARIA 1994
Impresión y emisión de factura y otros documentos LEY DE REMISIÓN TRIBUTARIA 1994
Máquinas fiscales 1994
Máquinas fiscales 1994
Disposición transitoria ICSVM 1994
Disposición transitoria ICSVM 1994

Volver al futuro: estamos en el año 2017, veinte años después.

Lo que era el Ministerio de Hacienda desapareció y vino el Ministerio de Finanza en sus distintos nombres pero lo que no ha cambiado su nombre es el Servicio Nacional Integrado de Administración Tributaria y Aduanera (SENIAT). Como ente encargado de la recolección de impuestos se ha modernizado mucho con el tiempo y de un tiempo a esta parte mantienen en línea un Portal Fiscal donde almacenan la información relevante y actualizada. Primero la Constitución, luego las Leyes, después los Reglamentos, Decretos, Resoluciones y Providencias (en ese orden y apenas “rasguñamos” la burocracia) es entonces que vamos a concentrarnos en los Reglamentos.

Enlaces para la descarga de los documentos.

Página web del SENIAT “Portal Fiscal”.

En este enlace del Portal Fiscal, sección “Tributos Internos-> Impuesto Sobre La Renta-> Leyes” aparece el «Decreto con Rango, Valor y Fuerza de Ley de impuesto sobre la Renta» vigente al momento de escribir este artículo.

En este otro enlace del Portal Fiscal, sección “Tributos Internos-> impuesto Sobre La Renta-> Reglamentos” aparecen el «Reglamento de la Ley de Impuesto Sobre la Renta» y el objeto de nuestro somero y humilde estudio de hoy, el «Decreto 1.808, Reglamento Parcial de la Ley de Impuesto Sobre la Renta en Materia de Retenciones».

Documentos en formato PDF.

No obstante vamos a colocar los enlaces directos de donde pueden descargar los ejemplares electrónicos de las Gacetas Oficiales primero primero desde el Portal Fiscal del SENIAT:

No, no están viendo mal, el Reglamento Parcial está de primero en orden cronológico, luego viene el Reglamento y de último y más reciente está la Ley. De hecho, el Reglamento reconoce en su artículo 220 que se derogan cualesquiera otras disposiciones reglamentarias que se opongan o colidan con el Reglamento.

Detalles acerca del Reglamento del ISLR.

Otros detalles del Reglamento, antes de comenzar con el Reglamento Parcial:

  • El artículo 27 especifica que se deben especificar por separado el pago a capital y el pago de intereses y de no hacerlo se considerará que todo el pago es a intereses lo cual genera tributo y los bancos se cuidan muy bien de ello.
  • El artículo 30 (Título II, Capítulo I) del Reglamento viene a ser copia del artículo 14 (Capítulo V) del Reglamento Parcial (por no decir que son idénticos).
  • El artículo 31 del Reglamento es el Parágrafo Único del artículo 14 del Reglamento Parcial.
  • El artículo 32 del Reglamento contienen los literales de la a) a la e) del artículo 14 del Reglamento Parcial.
  • El artículo 33 del Reglamento es el artículo 15 del Reglamento Parcial.
  • El Reglamento incluye una larguísima normativa sobre los ajustes de inflación los cuales se revirtieron con la útlima reforma de la Ley del Impuesto Sobre La Renta (si estamos equivocados: Twitter @ks7000).
  • El Título V, Capítulo I habla sobre las normas de facturación y que son ratificadas en la Providencia 00071 del SENIAT .
  • El Título V, Capítulo II versa sobre el movimiento y registro de los inventarios (“magnético” -léase computarizado- sí y sólo sí el SENIAT autoriza a la persona jurídica a llevarlo de esta manera el SENIAT NO CERTIFICA SOFTWARE NI APLICACIONES; al hacer una inspección fiscal ellos y ellas observan cómo funciona el sistema, los campos que llevan los informes impresos y dan luz verde para que soliciten el permiso de manera escrita por ante la oficina regional correspondiente).
  • El artículo 104 y 119 introducen el concepto de “procedimiento tradicional del costo de ventas” con el cual todos los contadores y contadoras con que hemos laborado nos piden constantemente (incluso tenemos una rutina automatizada para ello); es el famosísimo “…inventario inicial más las compras menos el inventario final.
  • El Título V, Capítulo III especifica la instauración y amntenimiento del Registro de información Fiscal el cual posteriormente es formalmente creado por la Providencia 0013 del SENIAT en el año 2006 y es modificada para adecuarla a los progresos en computación en la Providencia 0048 del SENIAT en el año 2013.
  • El Título V, Capítulo IV indica que el Registro Inmobiliario queda en manos del SENIAT y es por ello que allí registramos nuestra vivienda principal para asuntos de declaración de impuesto sobre la renta de cada año.
  • Todo lo relacionado con el ISLR en Venezuela, país petrolero, está íntimamente relacionado con empresas extranjeras en suelo patrio o de nuestros trabajadores en el exterior: por ello las tarifas y tratamientos son marcadamente diferenciados si se tratan de personas (naturales o jurídicas) residenciadas o no residenciadas en nuestro país, eso lo veremos en el Reglamento Parcial.
  • Para finalizar el somero estudio del Reglamento, se norma que cualquier reclamo en cuanto a errores de declaración del impuesto sobre la renta cada oficina regional del SENIAT será quienes diriman dichos asuntos, los cuales son variopintos.

Reglamento Parcial de la Ley De Impuesto Sobre La Renta en Materia de Retenciones.

Al final de esta entrada y como suplemento, próximamente, hallarán la transcripción de las Gacetas Oficiales lo cual haremos con ayuda del Tesseract OCR.

Artículo uno: sujetos obligados a retener.

Entrando en materia y al grano, son objeto de retenciones, básicamente:

  1. Ganancias fortuitas (loterías -juegos de azar- y caballos).
  2. Enajenación de acciones en la Bolsas de Valores.
  3. Sueldos y salarios (excluídos viáticos y alimentación).
  4. Honorarios Profesionales con las siguientes excepciones:
    • carpintería.
    • herrería.
    • latonería.
    • pintura.
    • mecánica.
    • electricidad.
    • albañilería.
    • plomería.
    • jardinería.
    • zapatería.
    • cualquier otro de naturaleza manual (…pues ¡ de haber comenzado por ahí ! ).
  5. Servicios cuando sean principales las obligaciones de hacer, excepto los siguientes:
    • suministro de agua.
    • electricidad.
    • gas.
    • telefonía fija o celular.
    • aseo domiciliario.
  6. Fletes en el territorio nacional.
  7. Primas de seguros y reaseguros.
  8. Cánones de Arrendamiento de bienes muebles e inmuebles.
  9. Intereses de Capitales.
  10. Comisiones de ventas de bienes muebles e inmuebles.
  11. Impuestos proporcionales.
  12. Rentas presuntas.
  13. Publicidad y Propaganda.

Artículo 21: plazos para enterar

En el caso número uno del artículo uno, se deben enterar (es decir, pagar al gobierno, al Tesoro Nacional) al día siguiente hábil de la retención (para poder pagar el premio se debe hacer primero la retención correspondiente).

En el caso número dos del artículo uno se deben enterar los siguientes tres días hábiles, esto es exclusivamente con las bolsas de valores.

Del tercer caso en adelante se hacen los tres primeros días hábiles del mes excepto si se es nombrado como “contribuyente especial” ya que tienen un calendario especial según el parágrafo único (nosotros ya hicimos una entrada al respecto por estos lares con respecto a retenciones de IVA y cuyo calendario coincide con lo del ISLR).

Artículos 2 al 8: retenciones de sueldos y salarios.

En el renglón tercero del artículo uno, lo correspondiente a retenciones de sueldos y salarios la materia es densa y delicada, por ello los remitimos a profesionales especializados que han hecho una guía práctica al respecto.

Artículo 9: tabla de retenciones.

Del renglón cuarto al séptimo son los más comunes, es por ello que nos enfocaremos más en esos casos.

Se debe prestar especial atención si la persona natural es residente o NO residente en nuestro país porque los porcentajes de retención que se aplican en el segundo caso son prácticamente los mismos establecidos en la declaración anual ISLR (34%), así que ojo con eso (igual sucede con las personas jurídicas domiciliadas). Hay un detalle en el artículo 3, parágrafo primero del Reglamento Parcial que estipula que si una persona natural demuestra que ha permanecido 180 días en el país (de manera contínua o no) se debe considerar RESIDENTE y se ha de tramitar un RIF de oficio con el SENIAT. Osea, el hecho de que tengan pasaporte no necesariamente es indicativo de que NO es residente, atención a esto.

 

Cuando aquí nombremos a “residentes” nos referimos a las “Personas Naturales Residentes en nuestro país”. Cuando acá nombremos a “domiciliadas”nos referimos a las “Personas Jurídica Domiciliadas en nuestro país”. Cuando escribimos “UT” nos referimos a “Unidad(es) Tributaria(s)”.

 

Los «beneficiarios de la remuneración» que son residentes tienen un porcentaje distinto de retención de la domiciliadas.

 

En el caso de los NO residentes y NO domiciliados los porcentajes de retención pueden ser varios debidos a los montos en función con cantidad de unidades tributarias. Por ejemplo especifican que hasta dos mil UT un 15%, desde dos mil hasta tres mil UT un 22% y para más de tres mil UT un 34%, Y ATENCIÓN si el pago OTRO EJEMPLO es por el equivalente a siete mil UT se debe retener 15% a las primeras 2000 UT, 22% a las próximas 1000 UT y 34% a las restantes 4000 UT. Es por ello que nuestra tabla de causales será un maestro y en otra tabla de detalles colocaremos los porcentajes de retención a todos los causales y con cada uno de sus condicionales en el caso de haber más de un procentaje de retención. OTRA COSA IMPORTANTE es que cada una de los “escalones” retenidos deberán ser informado al SENIAT en registros separados para cada monto (por supuesto, repitiendo los numeros de factura y los numeros de control para cada registro) POR ELLO DECIDIMOS REALIZAR PARA CADA REGISTRO UN NÚMERO DE COMPROBANTE DISTINTO E INDIVIDUALIZADO.

En el artículo 9°, parágrafo segundo, tuvieron un “gazapo”: en el monto mínimo de las retenciones a domiciliadas (cuando el porcentaje a retener es del 5% y 3%) COLOCARON LOS MONTOS DE MANERA ABSOLUTA (1250 y 750) , ES DECIR, NO EN FUNCIÓN DEL VALOR DE LA UNIDAD TRIBUTARIA. En 2007 se le aplicó, tal como establece la Ley de Reconversión Monetaria, estos montos quedaron en 1,25 (si el porcentaje de retención es del 5%) y 0,75 (idem 3%) LO QUE QUIERE DECIR, EN LA PRÁCTICA -Y DESDE HACE MUCHOS AÑOS- QUE SE RETIENE A TODO MONTO EN ESTOS CASOS (y se cumple con el espíritu del legislador ya que las retenciones con porcentaje del 3% y 1% es a todo monto por eso entrecomillamos la palarbra gazapo al principio de esta cita citable). ¡ATENCIÓN! La ley es la ley, así que cuando programamos debemos colocar este valor absoluto de 1,25 y 0,75, respectivamente en el código de nuestro programa, así signifique en la práctica que se retiene a todo monto a persona jurídica domiciliada en nuestro país.

Artículo 25: sistemas computarizados especiales.

Y ahora es que llegamos a la aparte de la programación, lo que se empeñan en llamar el “manual técnico”. En este artículo se establece, con visión de futuro, que el SENIAT (mejor dicho, la Administración Tributaria, cualquiera sea el nombre que tenga o tuviere en ese o este momento) colocará lineamientos generales o específicos y en este caso vaya que son bien específicos.

Todo deriva del manual vigente que a la fecha de escribir estas líneas tiene establecido el SENIAT en su Portal Fiscal. Lo primero que tenemos que aclarar es que vamos a generar un archivo en lenguaje XML que contendrá los datos de la retención pero que en realidad serán calculados por “los servidores web del SENIAT” y nos devolverá un valor con la suma de las retenciones. Nosotros lo vemos como un “doble ciego”: con el programa que hagamos calculamos y hacemos las retenciones oportunamente y su sumatoria ha de ser igual al cálculo -según los datos fidedignos que le enviemos- a los “servidores web” del SENIAT, ¿qué les parece?

Pero esperen, aún hay más: el propio SENIAT pone a nuestra disposición un XML con el que podemos comprobar los datos antes de enviarlos siempre y cuando tengamos un software confiable que realice dicha comprobación.

Es entonces que aparte del trabajo del XML y sus correspondientes tablas y campos en la base de datos, también debemos establecer otros datos que necesitaremos para cumplir con el artículo 24 que tratamos a continuación.

Artículo 24: de la obligatoriedad de entregar comprobantes de retención, entre otros datos.

Este artículo es el mejor de todos: los dos campos obligatorios son el monto de lo pagado y la cantidad retenida, tal cual. He aquí que se nos abre nuestra vena creativa siempre teniendo en cuenta las reglas de normalización de las bases de datos. Como abrebocas la tabla que contendrá al RIF:

  • El campo RIF, el cual será único según la ley respectiva, lo guardaremos en una tabla junto con un identificador autonumérico entero, indexado, y en otras tablas el resto de los datos de los “beneficiarios de la remuneración”.
  • Nombre o razón social en una tabla aparte, ya que los nombres de las empresas pueden cambiar con el tiempo y nuestros documentos deben ser fidedignos a como fueron impresos, esto se logra agregando un campo lógico verdadero/falso llamado “activo” y que será verdadero en el único caso del último cambio de razón social y válido para las nuevas retenciones; las anteriores retenciones van relacionadas con el nombre o razón social que tenían al momento de hacer el comprobante. También necesitaremos un campo autonumérico entero, indexado, para identificar el nombre o razón social que lleva el comprobante.
  • Dirección fiscal: igual al ítem anterior pero con algo añadido si la persona jurídica tiene sucursales, lo mejor es guardar cada dirección aparte para saber con quién “hicimos negocio” (de hecho las normas contables en una sucursal son las mismas como si fuera empresa independiente, la “pesadilla” es para los contadores y auditores que tienen que consolidar en la casa matríz o principal todos los días).
  • Teléfonos: pues los que sean necesarios, aunque no es un requisito de ley vaya que nos ahorramos problemas y malentendidos con una simple llamada telefónica.
  • Correo(s) electrónico(s): que a pesar que el ISLR ni sus reglamentos son obligatorios -a diferencia de las retenciones de IVA que si están claramente tipificadas el comprobante por vía electrónica- cumple el mismo papel de los números de teléfonos.
  • Cualesquiera de otros datos que consideremos necesarios: pues bien, creamos una tabla con el identificador numérico relacionado con la tabla que contiene los RIF, un identificador autonumérico entero, un campo lógico para indicar si está activo o no y el campo a guardar (fecha, texto, numérico, etc).

Manual técnico: descripción de los elementos del archivo.

Ya nos “apartamos” un poco del Reglamento Parcial y estamos de lleno con lo nuestro, la programación y los ordenadores. A diferencia de la sección anterior, artículo 24, el Manual Técnico ordena unos campos mínimos con características muy precisas que debemos colocarlas en nuestra base de datos sin más:

  1. RifAgente: <elemento raíz>, tipo cadena, 10 caracteres, primero una letra y luego dígitos que identifica al Agente de Retención.
  2. Periodo: <elemento raíz>, mes cuando se hizo la retención en el formato “AAAAMM” (año completo 4 dígitos y número de mes incluyendo cero a la izquierda de enero a septiembre ).
  3. RifRetenido: <elemento>, igual a (1) pero identifica al “beneficiario de la remuneración”.
  4. NumeroFactura: <elemento>, mínimo 1 caracter (cero si no es factura), máximo diez caracteres (los últimos 20 dígitos, de ser más largo el número de factura).
  5. NumeroControl: <elemento>, mínimo 1 caracter, máximo 10 (colocar “NA” si no es factura).
  6. FechaOperacion: <elemento>, campo fecha, que en el Manual Técnico NO APARECE porque fue a partir de septiembre de 2014 que lo implementaron para poder tomar el valor de la UT correcto (esto se requiere una vez al año, cuando aumenta la UT pero en teoría de programación -LEYES APARTE- serviría para cualquier aumento O MODIFICACIÓN del valor de la UT). Dicha fecha debe coincidir con el perído que se declara. No debemos confundir FechaOperacion con, por ejemplo, la fecha de una factura, son cosas distintas (entiéndase que es la fecha cuando hicimos el comprobante).  Para mayor información, descargar en el siguiente comunicado publicado el Portal Fiscal.
  7. CodigoConcepto: <elemento>, tabla tipificada por el SENIAT que analizaremos luego que consiste en dos dígitos (aunque acepta máximo tres caracteres ¿visión a futuro, números con mantisa o signo?).
  8. MontoOperación: <elemento>, el separador decimal es el punto con máximo dos posiciones decimales, el valor mínimo es cero, un caracter “0”.
  9. PorcentajeRetencion: <elemento>, mínimo cero, máximo cien, separador decimal el punto, dos posiciones decimales.

Para los sistemas informáticos del SENIAT no existen acentos ni caracteres especiales. Además, en el caso que permitan el separador decimal, éste siempre será el punto. Advertidos todos y todas.

Advertencia.
Advertencia.

En el Manual Técnico se asegura que es posible sumar y declarar todas las operaciones que tengan el mismo “CodigoConcepto” colocandole los datos  de una FACTURA CUALQUIERA (“NumeroFactura” y “NumeroControl”) DEL PERÍODO CORRESPONDIENTE, PERO EN LA PRÁCTICA NADIE HACE ESO debido a la sencilla razón de que uno, “el beneficiario de la remuneración” revisa por medio  de nuestra Clave de Usuario en el Portal Fiscal cada una de las retenciones, POR AQUELLOS DE QUE “CUENTAS CLARAS MANTIENEN AMISTADES (Y NEGOCIOS también)”.

 

Eso es lo que exige el SENIAT en los datos y campos a transferir pero para nuestro programa tenemos que agregar unos campos que consideramos necesarios ya que varían en el tiempo:

  • En una tabla aparte que llamaremos (¡qué original!) Unidad_Tributaria con un campo identificador autonumérico entero, valor monetario, fecha de inicio de vigencia, fecha de finalización (la unidad tributaria vigente finaliza el 31 de diciembre de 9999 nueve mil novecientos noventa y nueve y cambiará a un día antes de la fecha de entrada en vigencia de una nueva unidad tributaria -la cual generalmente cambia una vez al año en febrero-). Las restricciones de fecha son relativas  a otros registros, no en valores absolutos: la fecha de inicio de vigencia no podrá ser menor que la mayor fecha de inicio registrada y en cascada para la fecha de finalización.
  • Otra tabla llamada Unidad_Tributaria_Gaceta contendrá información tales como número, fecha y tipo de Gaceta Oficial donde se decretó el valor de la unidad tributaria y otra tabla llamada Unidad_Tributaria_Gaceta_Enlaces con las posibles direcciones web de donde descargar u obtener más información al respecto. Estas tablas puede esperar, no las definiremos ahora, no en esta entrada.

Diseñando la base de datos en MySQL y phpMyAdmin.

La base de datos que vamos a crear la llamaremos (pecando de originales) “ks7000_ks7000” con un ordenamiento de caracteres utf8_spanish_ci (ordena la eñe entre la ene y la letra o, y la che es una letra entre ce y de e igual la doble ele). El almacenamiento InnoDB (y en otra entrada hablaremos de MySQL con calma). Como comentario le colocaremos “Valores de la Unidad Tributaria a lo largo de los años”, veamos:

1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE `Unidad_Tributaria` (
`UT_id` INT(10) UNSIGNED NOT NULL,
`UT_val` DECIMAL(10,0) NOT NULL DEFAULT '0',
`UT_fec_ini` DATE NOT NULL DEFAULT '1994-01-01',
`UT_fec_fin` DATE NOT NULL DEFAULT '9999-12-31'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci COMMENT='Valores de la Unidad Tributaria a lo largo de los años.';

ALTER TABLE `Unidad_Tributaria`
ADD PRIMARY KEY (`UT_id`);

ALTER TABLE `Unidad_Tributaria`
MODIFY `UT_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;

Volviendo al tema de los comprobantes de retención del ISRL, necesitamos el valor de la Unidad Tributaria actual para poder realizar el cálculo de la retención. Según el Manual Técnico, TODOS los datos son obligatorios y puede darse el caso que una “retención” no tenga monto, es decir, debido al monto de la remuneración no procede ningún monto a retener más sin embargo debemos informarle esto al SENIAT quienes de nuevo harán al cálculo para certificar que esto es cierto. Esto es análogo al caso de las retenciones de IVA y la caja chica pero éstas (facturas de caja chica) no debemos reportarlas en el txt a “subir” al SENIAT.

Atención: recordemos que los trabajos por labores manuales (carpintería, herrería, etc.) al igual que los servicios de agua, telefonía, etcétera, NO llevan retención ISLR alguna. NO LOS INCLUIREMOS EN EL XML (más si le haremos su respectiva retención de IVA si su monto es más de 20 UT).

Hemos visto el caso de empresas que retienen ISLR indebidamente (¡ups!), pues nada se le reintegra al “beneficiario de la remuneración” acompañado de una disculpa e incluso hay casos que expresan que le hagan una nota de crédito (nada que ver con IVA ni formas libres ni impresoras fiscales) en el estado de cuenta (CxP) para la próxima vez que cobren otro “trabajo”, que no sabemos cuando será pero eventualmente se producirá; así da gusto trabajar con la gente, que tomen las cosas con calma.

Creando la tabla que alojará los comprobantes de retención.

Dicha tabla la llamaremos de manera muy explícita ISLR_retenciones y contendrá los campos que anuncia el Manual Técnico y, según nuestro criterio, de manera adicional los siguientes campos:

  • ISLR_idNumeroComprobante: autonumérico, entero, indexado; como para cada documento hay una sola retención ISLR (a diferencia de las retenciones de IVA) este autonumérico puede funcionar como número de comprobante y al SENIAT le importa un pepino esto, ya que para ellos no es obligatorio sin embargo nosotros, maniáticos del orden y decoro es necesario para nosotros.
  • ISLR_UnidadTributariaValor: el valor en sí de la UT para nuestros memorias (los servidores web del SENIAT simplemente aplican el valor vigente de la UT a la fecha según el campo FechaOperacion y hacen el cálculo ¿Ven ahora por qué debemos llevar aparte en una tabla los valores históricos de la UT?). Como es un valor preferimos colocarlo, pero miren el próximo campo.
  • ISLR_idUnidadTributariaValor: aquí si podemos normalizar para los detalles que dijimos, número de Gaceta Oficial, enlaces web, etc.

Creando la tabla que alojará los causales de retención.

Estos causales están basados en el Manual Técnico sin embargo no es suficiente para nuestros usuarios de software, aquellos quienes pagan nuestras habilidades de programación.

Nuestra genialidad estriba en desarrollar software para que nuestros usuarios escojan rápidamente y de acuerdo a las restricciones los llevamos a un solo resultado, la realización de la retención. Es así que nuestros usuarios expresarán “¡QUÉ FÁCIL Y SENCILLO ES HACER RETENCIONES DE ISLR!”.

Como ya habíamos adelantado, tenemos una tabla maestra que llamaremos ISLR_RetencionesCausales:

  • idCausal: campo autonumérico para identificar cada causal.
  • El segundo campo lo llamaremos “Codigo” tipo CHAR de 4 caracteres que utilizaremos para especificar nuestros propios causales (que no generan ni retencion -ni su declaración informativa- de ISRL) a partir de mil en potencias de base dos (1002, 1004, 1008, etcétera) y para menores de mil los especificados en el Manual Técnico.
  • El segundo campo lo llamaremos “Actividad” y lo rellenaremos tal como lo describen en el Manual Técnico. Para nuestros causales mayores en código a mil le colocaremos “NA” tal como estila el Manual Técnico cuando “No Aplica”.
  • BaseExenta: monto a partir del cual podremos retener, puede ser un monto específico o un monto calculado dependiente de el valor de la Unidad Tributaria y una constante cuyo valor es 83,3334. Deberemos, a futuro, colocar un disparador cuando se agregue un registro (nuevo valor) de la Unidad Tributaria para recalcular dichos montos que dependan de la fórmula (ver siguiente campo). Si el valor es cero entonces es todo pago.
  • BaseExentaFormula: sirve para indicar si BaseExenta depende de una fórmula que debamos aplicar si se agrega un nuevo valor de la Unidad TRibutaria, por defecto cero, falso.
  • Sustraendo: es un monto que depende siempre de una fórmula, misma consideración que con BaseExenta pero no necesita un campo lógico adicional, el disparador actualizará automáticamente -según fórmula, UT multiplicada por el procentaje de retención y el resultado multiplicado por la constante de ley 83,3334.
  • BaseImponible: algunos causales especifican que NO es todo el monto al cual vamos a retener sino un porcentaje o del mismo al cual luego le aplicaremos el procentaje correspondiente de retención, esto es para no residente o no domiciliados, que son casos que consideramos “especiales”.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE `ISLR_RetencionesCausales` (
`idCausal` INT(11) NOT NULL,
`Codigo` CHAR(4) COLLATE utf8_spanish_ci NOT NULL DEFAULT '0000',
`Actividad` VARCHAR(255) COLLATE utf8_spanish_ci NOT NULL DEFAULT 'NA' COMMENT 'Así lo llama el Manual Técnico.',
`BaseExenta` DECIMAL(10,0) NOT NULL DEFAULT '0' COMMENT 'Monto mínimo para hacer retención ya sea valor o fórmula UT*83,3334',
`BaseExentaFormula` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'Si BaseExenta depende de fórmula',
`Sustraendo` DECIMAL(10,0) NOT NULL DEFAULT '0' COMMENT 'Valor según fórmula UT*%ret*83,3334',
`BaseImponible` DECIMAL(10,0) NOT NULL DEFAULT '100' COMMENT 'Porcentaje del monto al cual aplicarle procentaje de retención'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

ALTER TABLE `ISLR_RetencionesCausales`
ADD PRIMARY KEY (`idCausal`),
ADD KEY `Codigo` (`Codigo`);

ALTER TABLE `ISLR_RetencionesCausales`
MODIFY `idCausal` INT(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;

La acompañaremos de una tabla con los detalles de los porcentajes de retención y la llamaremos  ISLR_RetencionesPorcentajes:

  • idCausal: entero, que está relacionado con IdCausal de la tabla anterior.
  • Porcentaje: decimal, explícito.
  • Monto: en el caso que explicamos (no domiciliada) que se debe retener “en escalones” según las unidades tributarias pero colocamos aquí el monto “de una vez” y con el disparador al agregar un valor de la UT se multipilicará ese nuevo valor por el próximo campo NumeroUT.
  • NumeroUT: ver renglón anterior.
  • Ordinal: lo tendremos en cuenta para retribuir en el orden correcto de la base de datos los “escalones” a los cuales les haremos retenciones. Este campo cambia si y solo si modifican el Reglamento Parcial.

Rellenando los causales de retención.

 

Descripción completa de los causales de retención, según Manual Técnico.

Decidimos compartir con todos los venezolanos y venezolanas (y unos cuantos extranjeros tal vez les sea útil esta información) por medio de un repositorio en GitHub de manera pública en este enlace web. Lo publicamos en dos formatos diferentes, en lenguaje SQL y en XML, no obstante acá publicamos también ambos códigos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
-- phpMyAdmin SQL Dump
-- version 4.5.4.1deb2ubuntu2
-- http://www.phpmyadmin.net
--
-- Servidor: localhost
-- Tiempo de generación: 24-06-2017 a las 16:14:24
-- Versión del servidor: 5.7.18-0ubuntu0.16.04.1
-- Versión de PHP: 7.0.18-0ubuntu0.16.04.1
-- Creado por: Jimmy Olano
-- Correo-e: olano@ks7000.net.ve
-- Códigos por concepto de retención de Impuesto Sobre La Renta
-- según Manual técnico SENIAT N° 60.40.40.039, Versión 2.3, enero 2017,
-- disponible en el Portal Fiscal en formato pdf en el siguiente enlace web:
-- http://declaraciones.seniat.gob.ve/portal/page/portal/MANEJADOR_CONTENIDO_SENIAT/05MENU_HORIZONTAL/5.3ANUNCIOS_CARTELES/5.3.2CARTELES_NOTIFICACION/CARTELES/MT_Retenciones%20ISLRV3.0_2014.pdf
-- Según artículo 25 del Reglamento Parcial de la Ley De Impuesto Sobre La Renta
-- en Materia de Retenciones publicado en la Gaceta Oficial N° 36.203,
-- de fecha lunes 12 de mayo de 1997.
--
-- Usted es libre de usar y/o distribuir esta información
-- según la siguiente licencia:
-- https://creativecommons.org/licenses/by-sa/3.0/ve/

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "-04:00";

&nbsp;

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- Base de datos: `seniat-islr`
--

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `seniat_codigo_concepto_retencion_islr`
--

CREATE TABLE `seniat_codigo_concepto_retencion_islr` (
`codigo` tinyint(4) NOT NULL,
`concepto` VARCHAR(1024) COLLATE utf8_spanish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci COMMENT='Manual técnico SENIAT N° 60.40.40.039 Versión 2.3 enero 2017';

--
-- Volcado de datos para la tabla `seniat_codigo_concepto_retencion_islr`
--

INSERT INTO `seniat_codigo_concepto_retencion_islr` (`codigo`, `concepto`) VALUES
(1, 'Sueldos y Salarios'),
(2, 'Honorarios Profesionales No Mercantiles (PNR)'),
(3, 'Honorarios Profesionales No Mercantiles (PNNR)'),
(4, 'Honorarios Profesionales No Mercantiles (PJD)'),
(5, 'Honorarios Profesionales No Mercantiles (PJND)'),
(6, 'Honorarios Profesionales Mancomunados No Mercantiles(PNR)'),
(7, 'Honorarios Profesionales Mancomunados No Mercantiles(PNNR)'),
(8, 'Honorarios Profesionales Mancomunados No Mercantiles(PJD)'),
(9, 'Honorarios Profesionales Mancomunados No Mercantiles(PJND)'),
(10, 'Honorarios Profesionales pagados a Jinetes,Veterinarios, Preparadores o Entrenadores (PNR)'),
(11, 'Honorarios Profesionales pagados a Jinetes, Veterinarios, Preparadores o Entrenadores (PNNR)'),
(12, 'Honorarios Profesionales pagados por Clínicas, Hospitales, Centros de Salud, Bufetes, Escritorios, Oficinas, Colegios Profesionales u otra Institución Profesionales No Mercantiles a Profesionales sin relación de dependencia (PNR)'),
(13, 'Honorarios Profesionales pagados por Clínicas, Hospitales, Centros de Salud, Bufetes, Escritorios, Oficinas, Colegios Profesionales u otra Institución Profesionales No Mercantiles a Profesionales sin relación de dependencia (PNNR)'),
(14, 'Comisiones pagadas por la venta de bienes inmuebles (PNR)'),
(15, 'Comisiones pagadas por la venta de bienes inmuebles (PNNR)'),
(16, 'Comisiones pagadas por la venta de bienes inmuebles (PJD)'),
(17, 'Comisiones pagadas por la venta de bienes inmuebles (PJND)'),
(18, 'Cualquier otra Comisión distintas a Remuneraciones accesorias de los sueldos, salarios y demás remuneraciones similares (PNR)'),
(19, 'Cualquier otra Comisión distintas a Remuneraciones accesorias de los sueldos, salarios y demás remuneraciones similares (PNNR)'),
(20, 'Cualquier otra Comisión distintas a Remuneraciones accesorias de los sueldos, salarios y demás remuneraciones similares (PJD)'),
(21, 'Cualquier otra Comisión distintas a Remuneraciones accesorias de los sueldos, salarios y demás remuneraciones similares (PJND)'),
(22, 'Intereses de Capitales tomados en préstamo e invertidos en la producción de la renta (PNNR)'),
(23, 'Intereses de Capitales tomados en préstamo e invertidos en la producción de la renta (PJND)'),
(24, 'Intereses provenientes de préstamos y otros créditos pagaderos a instituciones financieras constituidas en el exterior y no domiciliadas en el país (PJND)'),
(25, 'Intereses pagados por las personas jurídicas o comunidades a cualquier otra persona natural, jurídica o comunidad (PNR)'),
(26, 'Intereses pagados por las personas jurídicas o comunidades a cualquier otra persona natural, jurídica o comunidad (PNNR)'),
(27, 'Intereses pagados por las personas jurídicas o comunidades a cualquier otra persona natural, jurídica o comunidad (PJD)'),
(28, 'Intereses pagados por las personas jurídicas o comunidades a cualquier otra persona natural, jurídica o comunidad (PJND)'),
(29, 'Enriquecimientos Netos de las Agencias Internacionales cuando el pagador sea una personas jurídica o comunidad domiciliada en el país (PJND)'),
(30, 'Enriquecimientos Netos de Gastos de Transporte conformados por fletes pagados a agencias o empresas de transporte internacional constituidas y domiciliadas en el exterior (PNNR)'),
(31, 'Enriquecimientos Netos de Gastos de Transporte conformados por fletes pagados a agencias o empresas de transporte internacional constituidas y domiciliadas en el exterior (PJND)'),
(32, 'Enriquecimientos Netos de Exhibición de Películas, Cine o la Televisión (PNNR)'),
(33, 'Enriquecimientos Netos de Exhibición de Películas, Cine o la Televisión (PJND)'),
(34, 'Enriquecimientos obtenidos por concepto de regalías y demás participaciones análogas (PNNR)'),
(35, 'Enriquecimientos obtenidos por concepto de regalías y demás participaciones análogas (PJND)'),
(36, 'Enriquecimientos obtenidos por las Remuneraciones, Honorarios y pagos análogos por Asistencia Técnica (PNNR)'),
(37, 'Enriquecimientos obtenidos por las Remuneraciones, Honorarios y pagos análogos por Asistencia Técnica (PJND)'),
(38, 'Enriquecimientos obtenidos por Servicios Tecnológicos utilizados en el país o cedidos a Terceros (PNNR)'),
(39, 'Enriquecimientos obtenidos por Servicios Tecnológicos utilizados en el país o cedidos a Terceros (PJND)'),
(40, 'Enriquecimientos Netos derivados de las Primas de Seguros y Reaseguros (PJND)'),
(41, 'Ganancias Obtenidas por Juegos y Apuestas (PNR)'),
(42, 'Ganancias Obtenidas por Juegos y Apuestas (PNNR)'),
(43, 'Ganancias Obtenidas por Juegos y Apuestas (PJD)'),
(44, 'Ganancias Obtenidas por Juegos y Apuestas (PJND)'),
(45, 'Ganancias Obtenidas por Premios de Loterías y de Hipódromos (PNR)'),
(46, 'Ganancias Obtenidas por Premios de Loterías y de Hipódromos (PNNR)'),
(47, 'Ganancias Obtenidas por Premios de Loterías y de Hipódromos (PJD)'),
(48, 'Ganancias Obtenidas por Premios de Loterías y de Hipódromos (PJND)'),
(49, 'Pagos a Propietarios de Animales de Carrera por concepto de Premios (PNR)'),
(50, 'Pagos a Propietarios de Animales de Carrera por concepto de Premios (PNNR)'),
(51, 'Pagos a Propietarios de Animales de Carrera porconcepto de Premios (PJD)'),
(52, 'Pagos a Propietarios de Animales de Carrera por concepto de Premios (PJND)'),
(53, 'Pagos a Empresas Contratistas o Subcontratistas domiciliadas o no en el país, por la ejecución de obras o de la prestación de servicios en base a valuaciones y ordenes de pago (PNR)'),
(54, 'Pagos a Empresas Contratistas o Subcontratistas domiciliadas o no en el país, por la ejecución de obras o de la prestación de servicios en base a valuaciones y ordenes de pago (PNNR)'),
(55, 'Pagos a Empresas Contratistas o Subcontratistas domiciliadas o no en el país, por la ejecución de obras o de la prestación de servicios en base a valuaciones y ordenes de pago (PJD)'),
(56, 'Pagos a Empresas Contratistas o Subcontratistas domiciliadas o no en el país, por la ejecución de obras o de la prestación de servicios en base a valuaciones y ordenes de pago (PJND)'),
(57, 'Pagos a los Arrendadores de los bienes inmuebles a los Arrendadores de los bienes inmuebles situados en el país (PNR)'),
(58, 'Pagos a los Arrendadores de los bienes inmuebles a los Arrendadores de los bienes inmuebles situados en el país (PNNR)'),
(59, 'Pagos a los Arrendadores de los bienes inmuebles a los Arrendadores de los bienes inmuebles situados en el país (PJD)'),
(60, 'Pagos a los Arrendadores de los bienes inmuebles a los Arrendadores de los bienes inmuebles situados en el país (PJND)'),
(61, 'Cánones de Arrendamientos de Bienes Muebles situados en el país (PNR)'),
(62, 'Cánones de Arrendamientos de Bienes Muebles situados en el país (PNNR)'),
(63, 'Cánones de Arrendamientos de Bienes Muebles situados en el país (PJD)'),
(64, 'Cánones de Arrendamientos de Bienes Muebles situados en el país (PJND)'),
(65, 'Pagos de las Empresas Emisoras de Tarjetas de Crédito o Consumo por la Venta de Bienes y servicios, o cualquier otro concepto (PNR)'),
(66, 'Pagos de las Empresas Emisoras de Tarjetas de Crédito o Consumo por la Venta de Bienes y servicios, o cualquier otro concepto (PNNR)'),
(67, 'Pagos de las Empresas Emisoras de Tarjetas de Crédito o Consumo por la Venta de Bienes y servicios, o cualquier otro concepto (PJD)'),
(68, 'Pagos de las Empresas Emisoras de Tarjetas de Crédito o Consumo por la Venta de Bienes y servicios, o cualquier otro concepto (PJND)'),
(69, 'Pagos de las Empresas Emisoras de Tarjetas de Crédito por la venta de gasolina en las Estaciones de Servicios (PNR)'),
(70, 'Pagos de las Empresas Emisoras de Tarjetas de Crédito por la venta de gasolina en las Estaciones de Servicios (PJD)'),
(71, 'Pagos por Gastos de Transporte conformados por Fletes (PNR)'),
(72, 'Pagos por Gastos de Transporte conformados por Fletes (PJD)'),
(73, 'Pagos de las Empresas de Seguro, las Sociedades de Corretaje de Seguros y las Empresas de Reaseguros por las Prestaciones de Servicios que le son propios (PNR'),
(74, 'Pagos de las Empresas de Seguro, las Sociedades de Corretaje de Seguros y las Empresas de Reaseguros por las Prestaciones de Servicios que le son propios (PJD)'),
(75, 'Pagos de las Empresas de Seguro a sus Contratistas por la Reparación de Daños sufridos de sus Asegurados (PNR)'),
(76, 'Pagos de las Empresas de Seguro a sus Contratistas por la Reparación de Daños sufridos de sus Asegurados (PJD)'),
(77, 'Pagos de las Empresas de Seguros a Clínicas, Hospitales y/o Centros de Salud por la Atención Medica a sus Asegurados (PNR)'),
(78, 'Pagos de las Empresas de Seguros a Clínicas, Hospitales y/o Centros de Salud por la Atención Medica a sus Asegurados (PJD)'),
(79, 'Cantidades que se paguen por adquisición de Fondos de Comercio situados en el país (PNR)'),
(80, 'Cantidades que se paguen por adquisición de Fondos de Comercio situados en el país (PNNR)'),
(81, 'Cantidades que se paguen por adquisición de Fondos de Comercio situados en el país (PJD'),
(82, 'Cantidades que se paguen por adquisición de Fondos de Comercio situados en el país (PJND)'),
(83, 'Pagos por Servicios de Publicidad y Propaganda y la Cesión de la Venta de Espacios para tales fines (PNR)'),
(84, 'Pagos por Servicios de Publicidad y Propaganda y la Cesión de la Venta de Espacios para tales fines (PJD)'),
(85, 'Pagos por Servicios de Publicidad y Propaganda y la Cesión de la Venta de Espacios para tales fines (PJND)'),
(86, 'Pagos por Servicios de Publicidad y Propaganda y la Cesión de la Venta de Espacios para tales fines a Emisoras de Radio (PJD)');

--
-- Índices para tablas volcadas
--

--
-- Indices de la tabla `seniat_codigo_concepto_retencion_islr`
--
ALTER TABLE `seniat_codigo_concepto_retencion_islr`
ADD PRIMARY KEY (`codigo`);

--
-- AUTO_INCREMENT de las tablas volcadas
--

--
-- AUTO_INCREMENT de la tabla `seniat_codigo_concepto_retencion_islr`
--
ALTER TABLE `seniat_codigo_concepto_retencion_islr`
MODIFY `codigo` tinyint(4) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=87;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

&nbsp;

Una vez hallamos creado esta tabla en nuestra base de datos nos valemos de dos archivos para conectar a ella y obtener mediante el identificador único de cada causal. Nosotros utilizamos una variable numérica autoincrementada, pero bien sabemos que los verdaderos causales son tipo cadena con ceros a la izquierda como relleno hasta completar una longitud de tres caracteres, así que recuerden hacer una función que realizar este ajuste de número a cadena de texto(y viceversa para consultar la base de datos, de cadena de texto a número).

El archivo principal que va a recibir una consulta tipo GET es el siguiente:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
&lt;?php
  if ( $_GET['causal'] !='' )
   {
   // conectar($servidor , $usuario, $contra, $basedato) ¡usen sus propios valores!
   include("seniat-islr-conectar.php");
   $link=conectar( "localhost", $usuario, $contra, "ks7000ne_seniat-islr");

   if ( $_GET['causal'] !='' )
   {
   // conectar($servidor , $usuario, $contra, $basedato) ¡usen sus propios valores!
   include("seniat-islr-conectar.php");
   $link=conectar( "localhost", $usuario, $contra, "ks7000ne_seniat-islr");

   if ( !$link )
     {
       echo "ERROR Fallo la funcion conectar(ks7000ne_seniat).&lt;br&gt;";
     }

   if ( $link )
     {
       $sql = "SELECT * FROM `seniat_codigo_concepto_retencion_islr` WHERE `codigo` = ".$_GET['causal'].";";
       $result = mysql_query($sql, $link);

   if (!$result)
     {
       echo "ERROR Fallo la consulta de datos.&lt;br&gt;";
     }

   if ($result)
     {
       while($row = mysql_fetch_array($result))
         {
           printf(" %s ", $row['concepto'] );
         }
      mysql_free_result($result);
      mysql_close($link);
      }
    }
  }
?&gt;

Nos valemos de la siguiente función para conectar a la base de datos (nos gusta obtener siempre un mensaje para saber donde ocurre una excepción, de haberla):


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
&lt;?php
 function conectar($servidor , $usuario, $contra, $basedato){
   if (!($link=mysql_connect($servidor, $usuario, $contra)))
     {
       echo "Error conectando a la base de datos.&lt;br&gt;";
       return 0;
       //exit();
     }
   if (!($seleccion=mysql_select_db( $basedato, $link)))
     {
       echo "Error seleccionando la base de datos.&lt;br&gt;";
       return 0;
       //exit();
     }
   return $link;
   }
 ?&gt;

Así podemos consultar, por ejemplo, el código 77, de esta manera, prueben:

http://www.ks7000.net.ve/wp-content/uploads/2017/06/seniat-islr.php?causal=77

Seguimos

 

Fuentes consultadas (todas en castellano).

Copias de documentos almacenados en esta vuestra página web.