Herramientas Informaticas

Etiqueta: GNU/LINUX Página 1 de 13

Boilerplate de Órdenes de Mantenimiento para CodeIgniter 4

Entrada fija
Versión Estable
Descargas Totales
Versión Inestable
Licencia

Boilerplate Mantenimiento

Boilerplate de Órdenes de Mantenimiento para CodeIgniter 4

Módulo de Gestión de Órdenes de Mantenimiento

Un módulo profesional y escalable para la gestión de órdenes de mantenimiento, desarrollado para CodeIgniter 4.

Este boilerplate está diseñado para:

  • Departamentos de TI
  • Talleres automotrices
  • Mantenimiento de equipos industriales
  • Centros de reparación en general

Características

  • Arquitectura modular (fácil integración)
  • Gestión completa de órdenes de mantenimiento
  • Catálogo de departamentos
  • Gestión de empleados
  • Asignación de activos por empleado
  • Dashboard con órdenes pendientes
  • Estructura escalable lista para integrarse en ERP

Requisitos

  • PHP 8.1 o superior
  • CodeIgniter 4
  • phpcfdi/sat-catalogos
  • julio101290/boilerplatelog
  • julio101290/boilerplateinventory

Instalación

Instalar vía Composer

composer require julio101290/boilerplatemaintenance

Ejecutar migraciones y seeders

php spark boilerplatemaintenance:installmaintenance

Capturas del Módulo

Dashboard – Órdenes Pendientes

Catálogo de Departamentos

Órdenes de Mantenimiento


Ejemplo de Integración en el Menú

Menú Principal de Mantenimiento

Dashboard

Departamentos

Empleados

Productos por Empleado

Órdenes de Mantenimiento


Sistema Listo


Uso

Revisa las rutas, controladores, modelos, vistas, migraciones y seeders para comprender el funcionamiento interno y adaptarlo a tu sistema.


Historial de Cambios

Consulta el archivo CHANGELOG para conocer las actualizaciones recientes.


Contribuciones

Las contribuciones son bienvenidas:

  1. Haz un fork del repositorio
  2. Crea una rama de mejora
  3. Envía un pull request

Licencia

Este paquete es software libre distribuido bajo la Licencia MIT.


Autor

Desarrollado y mantenido por Julio Leyva
¡Feliz programación! 🚀

Guía Definitiva: Conectividad PHP a SAP HANA en Linux (Drivers Nativos)

Entrada fija

Cómo eliminar la dependencia de drivers de pago y configurar una conexión profesional, gratuita y permanente.


Introducción

En el desarrollo de aplicaciones que interactúan con SAP Business One, la conectividad desde entornos Linux suele ser un desafío técnico. Muchos desarrolladores optan por drivers de terceros que, si bien son funcionales, requieren licencias costosas o expiran tras periodos de prueba.

Esta publicación detalla el proceso paso a paso para instalar el HDB Client oficial de SAP y configurar el gestor unixODBC para lograr una integración transparente con PHP, manteniendo la compatibilidad total con servidores Windows.

1. Preparación del Entorno

Antes de comenzar, debemos instalar las dependencias necesarias para que Linux pueda gestionar conexiones ODBC y para que PHP pueda comunicarse con ellas.

sudo apt-get update
sudo apt-get install unixodbc unixodbc-dev php-odbc

Tras la instalación, es vital reiniciar el servidor web para cargar el módulo ODBC:

sudo systemctl restart apache2

2. Instalación del SAP HANA Client (HDBClient)

El driver nativo de SAP es una librería de alto rendimiento (libodbcHDB.so). No busques un instalador .deb; SAP proporciona un script de instalación propio.

  1. Descarga el paquete HDB CLIENT LINUX X86_64.
  2. Descomprime y entra en la carpeta mediante la terminal.
  3. Ejecuta el instalador con privilegios de superusuario:
sudo ./hdbinst

Por defecto, el software se ubicará en /usr/sap/hdbclient/. Esta ruta será nuestra referencia para la configuración.

3. Registro del Driver en el Sistema

Linux utiliza el archivo /etc/odbcinst.ini para saber qué drivers están disponibles. Aquí es donde solucionaremos de forma global los problemas de certificados SSL y X.509.

Edita el archivo: sudo nano /etc/odbcinst.ini y pega lo siguiente:

[SAP_HANA_NATIVE]
Description = SAP HANA Driver Oficial
Driver      = /usr/sap/hdbclient/libodbcHDB.so
Setup       = /usr/sap/hdbclient/libodbcHDB.so
UsageCount  = 1
# Desactivación de cifrado para evitar errores de comunicación
encrypt                = false
sslValidateCertificate = false

4. Configuración del DSN (Data Source Name)

El DSN es el alias que usará tu código PHP. Al definirlo en /etc/odbc.ini, abstraes la dirección IP y el puerto de tu código fuente.

Edita el archivo: sudo nano /etc/odbc.ini:

[MI_DSN_SAPHANA]
Driver     = SAP_HANA_NATIVO
ServerNode = 192.168.x.x:30015
User       = TU_USUARIO_DB
Password   = TU_CONTRASEÑA_DB

Importante: Borra cualquier archivo oculto en tu carpeta personal (~/.odbc.ini) para asegurar que el sistema lea la configuración global de /etc/.

5. Prueba de Fuego desde Terminal

Antes de probar en la web, usamos la herramienta isql. Esta prueba valida que los archivos INI son correctos y que el firewall permite la conexión.

isql -v MI_DSN_SAPHANA TU_USUARIO_DB 'TU_CONTRASEÑA'

Si observas el mensaje + Connected! +, tu sistema operativo ya está hablando con SAP HANA.

6. Implementación en PHP

Gracias a esta configuración, tu código PHP se mantiene limpio y profesional. No necesitas strings de conexión kilométricos, solo el nombre del DSN.

<?php
$dsn      = "MI_DSN_SAPHANA";
$usuario  = "TU_USUARIO_DB";
$password = 'TU_CONTRASEÑA_COMPLEJA'; // Usar comillas simples para evitar errores con caracteres especiales

$conexion = odbc_connect($dsn, $usuario, $password);

if ($conexion) {
    echo "Conexión establecida con éxito a SAP HANA.";
    // Ejemplo de consulta
    $result = odbc_exec($conexion, "SELECT 'Conexión Exitosa' FROM DUMMY");
    print_r(odbc_fetch_array($result));
} else {
    echo "Error de conexión: " . odbc_errormsg();
}
?>

7. Mantenimiento de Compatibilidad con Windows

Una de las mayores ventajas de este método es la portabilidad. Si tu servidor de producción es Windows y tu entorno de desarrollo es Linux:

  • En Windows: Crea un DSN de Sistema con el nombre MI_DSN_SAPHANA desde el Administrador de Datos ODBC.
  • En Linux: Mantén el DSN con el mismo nombre en /etc/odbc.ini.

Resultado: El mismo archivo PHP funcionará en ambos sistemas sin modificar una sola línea de código.

Conclusión

Configurar drivers nativos requiere un poco más de trabajo manual que usar instaladores automáticos de pago, pero los beneficios son claros: estabilidad, gratuidad y control total sobre la seguridad de la conexión. Al centralizar la configuración en los archivos del sistema, permitimos que nuestras aplicaciones PHP sean más robustas y fáciles de mantener.

💎 Implementación de Respaldos en jcposUltimate: Ingeniería MVC con PHP 8.3

Entrada fija

💎 Implementación de Respaldos en jcposUltimate: Ingeniería MVC con PHP 8.3

Análisis exhaustivo del commit 3f4d283: Cómo construir un módulo de copias de seguridad robusto, seguro y nativo.


En el desarrollo de jcposUltimate, la eficiencia no es negociable. El reciente commit 3f4d283 introduce el módulo de Respaldos. A diferencia de las implementaciones tradicionales, aquí se ha optado por una arquitectura LGAC (Legacy Green Agile Code), utilizando 135 líneas de código puro en PHP 8.3 para manejar el ciclo completo de un backup SQL.

🏗️ El Triángulo MVC en 135 Líneas

Este commit no solo añade una función, añade una estructura. A pesar de ser un solo bloque lógico, el código se divide en tres capas fundamentales:

  • Modelo (Data Layer): Implementa la lógica de introspección de la base de datos, recorriendo tablas y generando sentencias INSERT y CREATE TABLE dinámicas.
  • Controlador (Logic Layer): Gestiona el flujo de ejecución, valida los tokens editarUuid y asegura que los recursos del servidor se utilicen de forma óptima.
  • Vista (Output Layer): No genera HTML, sino un Stream de Datos Binary-Safe hacia el navegador mediante headers HTTP especializados.

🛠️ Análisis Técnico: Los 10 Pilares de la Implementación

1. Resolución de Rutas de Nivel 2

Para garantizar que los respaldos se guarden fuera de la carpeta de controladores, se utiliza dirname(__DIR__). Esto permite que el sistema localice la carpeta /backups/ en la raíz del proyecto de forma dinámica y absoluta.

2. Gestión de Entradas con Operador de Fusión

PHP 8.3 brilla en la captura de datos: $uuid = $_POST["editarUuid"] ?? '';. Se eliminan los errores de “Undefined Index”, asegurando un flujo de ejecución limpio desde la primera línea.

3. Blindaje contra Path Traversal

La seguridad es prioritaria. El uso de basename() en el input del usuario actúa como un cortafuegos, impidiendo que caracteres maliciosos como ../ puedan escalar directorios en el servidor.

4. Motor de Generación SQL Nativo

El código recorre la estructura de la base de datos mediante ciclos optimizados. No se limita a copiar datos; construye el esquema necesario para que el archivo resultante sea 100% ejecutable en cualquier cliente SQL.

5. Inyección Dinámica de Nombres de Archivo

Utilizando interpolación de variables moderna, el sistema asigna nombres únicos basados en el UUID procesado, evitando colisiones de archivos en entornos multiusuario.

6. Control de Headers de Transferencia Binaria

Se implementan encabezados nativos para forzar la descarga: header("Content-Type: application/sql"); y header("Content-Disposition: attachment; ...");. Esto le indica al navegador que no debe intentar mostrar el código, sino guardarlo físicamente.

7. Optimización de Memoria (Output Buffering)

Al manejar archivos potencialmente grandes, el código asegura que el buffer de salida esté limpio antes de enviar el archivo, evitando que caracteres extra corrompan el script SQL.

8. Compatibilidad con Caché Inversa

Se incluyen directivas Pragma: no-cache y Expires: 0. Esto es vital en sistemas de gestión para asegurar que cada backup descargado sea la versión más reciente y no una copia temporal del servidor o el proxy.

9. Cierre de Proceso Determinista

El uso de exit; al finalizar el stream de datos es una práctica de ingeniería robusta que evita que cualquier lógica posterior del servidor se filtre en el archivo descargado.

10. Estándar de Codificación PHP 8.3

Todo el módulo respeta las nuevas convenciones de tipado y manejo de errores, lo que reduce la deuda técnica y facilita futuras auditorías de código.

📈 Impacto en el Rendimiento

Al evitar el uso de una librería de terceros o un plugin pesado, jcposUltimate logra:

MétricaResultado
Velocidad de GeneraciónInstantánea (Nativo)
Consumo de RAMBajo impacto (Lineal)
SeguridadGrado Empresarial

💡 Conclusión

La implementación del módulo de respaldos en el commit 3f4d283 es un ejemplo de cómo la simplicidad bien ejecutada supera a la complejidad innecesaria. En 135 líneas, jcposUltimate ahora cuenta con una herramienta de recuperación ante desastres potente, segura y extremadamente rápida.

¿Eres desarrollador? Explora el código completo en nuestro repositorio y únete a la evolución de los sistemas de gestión nativos.

Tags: #PHP83 #MVC #jcposUltimate #Backend #CyberSecurity #WebDev #OpenSource #SoftwareArchitecture #LGAC

🚀 Boilerplate CFDI v1.1.2: DataTables server-side preciso, filtros reales y control total 📊⚙️

Entrada fija

🚀 Boilerplate CFDI v1.1.2: DataTables server-side preciso, filtros reales y control total 📊⚙️

Cuando se trabaja con CFDI, XML, PHP, MySQL / MariaDB y DataTables, hay una verdad que todo desarrollador aprende con la experiencia:

👉 si el backend no entiende exactamente lo que el frontend pide, el sistema termina dando resultados incorrectos 😬

Búsquedas que no coinciden, columnas que se ordenan cuando no deberían, filtros que parecen funcionar “a medias”… y lo peor: sin errores visibles.

Por eso llega Boilerplate CFDI v1.1.2, una actualización enfocada en precisión, coherencia y rendimiento real, especialmente en el manejo de DataTables en modo server-side 🚀


🧩 El reto real al usar DataTables en sistemas CFDI

DataTables es una herramienta poderosa, pero cuando se usa con:

serverSide: true

ocurre algo muy importante:

  • 📤 El frontend envía reglas claras
  • 📥 El backend debe interpretarlas correctamente

Ejemplo típico:

columnDefs: [{
    targets: [0, 19],
    searchable: false,
    orderable: false
}]

Esto indica que ciertas columnas:

  • ❌ No deben buscarse
  • ❌ No deben ordenarse

Si el backend ignora esta información, el comportamiento del sistema se vuelve impredecible ⚠️


❌ Síntomas clásicos de una implementación incompleta

Antes de esta mejora, era común encontrar situaciones como:

  • ❌ Búsquedas aplicadas a columnas visuales
  • ❌ Ordenamientos en botones o acciones
  • ❌ Filtros que no respetan la columna
  • ❌ Resultados distintos a lo que ve el usuario
  • ❌ Consultas SQL más pesadas de lo necesario

Todo parecía “funcionar”… hasta que la tabla empezaba a crecer 📈


✅ El enfoque aplicado en Boilerplate CFDI v1.1.2

En esta versión, el manejo de DataTables server-side fue refinado desde la base, siguiendo una regla simple pero poderosa:

El backend solo hace lo que el frontend permite.

Ahora el servidor interpreta directamente los parámetros enviados por DataTables:

  • columns[]
  • search
  • order
  • start
  • length

Y valida cada uno antes de construir la consulta SQL.


🔍 Búsqueda global inteligente

La búsqueda global ahora funciona de forma precisa y eficiente:

  • ✔ Solo se aplica a columnas marcadas como buscables
  • ✔ Ignora columnas visuales o auxiliares
  • ✔ Reduce condiciones LIKE innecesarias
  • ✔ Mejora tiempos de respuesta en MySQL / MariaDB

Esto es clave en sistemas CFDI, donde se manejan:

  • 📄 UUID
  • 📄 RFC
  • 📄 Razones sociales
  • 📄 Fechas
  • 📄 Métodos de pago
  • 📄 Tipos de comprobante

Buscar en todo ya no es una opción escalable 🚫


🔎 Filtros por columna confiables

Además de la búsqueda global, los filtros individuales por columna ahora:

  • ✔ Respetan la configuración del frontend
  • ✔ Se aplican solo cuando corresponde
  • ✔ No interfieren con otros filtros
  • ✔ Producen resultados coherentes

🎯 El resultado es un filtrado exacto y predecible.


🔃 Ordenamiento exacto y sin sorpresas

El ordenamiento fue otro punto clave corregido en v1.1.2.

Ahora el backend:

  • ✔ Valida el índice de la columna
  • ✔ Obtiene el campo real
  • ✔ Verifica que sea ordenable
  • ✔ Aplica ORDER BY solo cuando corresponde

Esto evita:

  • 🚫 Ordenamientos incorrectos
  • 🚫 Errores SQL
  • 🚫 Resultados inconsistentes

⚡ Rendimiento optimizado en MySQL y MariaDB

Gracias a estos ajustes, las consultas SQL ahora:

  • ✔ Son más limpias
  • ✔ Tienen menos condiciones innecesarias
  • ✔ Aprovechan mejor los índices
  • ✔ Responden mejor en tablas grandes

Esto se nota especialmente cuando se manejan:

  • 📄 Miles de CFDI
  • 🏢 Múltiples empresas
  • 📅 Rangos amplios de fechas

🧠 Menos magia, más control

Uno de los mayores beneficios de esta versión es la claridad del código.

Ahora el backend:

  • ✔ Valida todo explícitamente
  • ✔ Evita comportamientos implícitos
  • ✔ Es más fácil de leer y mantener
  • ✔ Permite escalar sin miedo

Para los equipos de desarrollo esto se traduce en:

  • 👨‍💻 Menos tiempo depurando
  • 👨‍💻 Más tiempo construyendo

🚀 Impacto directo en sistemas CFDI

Con Boilerplate CFDI v1.1.2 obtienes:

  • ✨ Tablas más rápidas
  • ✨ Filtros confiables
  • ✨ Ordenamientos correctos
  • ✨ Menor carga en el servidor
  • ✨ Mejor experiencia de usuario

Todo esto es fundamental cuando se trabaja con información fiscal sensible 📄🔒


🧪 Cambios técnicos destacados

  • 🔧 Refactor completo del server-side de DataTables
  • 🔧 Validación de columnas buscables y ordenables
  • 🔧 Mejor control de filtros globales e individuales
  • 🔧 Código compatible con MySQL y MariaDB
  • 🔧 Listo para producción y escalabilidad

🏁 Conclusión

Boilerplate CFDI v1.1.2 no agrega “features vistosas”. Agrega estabilidad, coherencia y control real 💎

Si trabajas con:

  • CFDI
  • XML
  • PHP
  • MySQL / MariaDB
  • DataTables

👉 esta versión eleva la calidad de tu sistema 🚀🔥

🚀 Guía Definitiva: Openfire + MariaDB + Pidgin en Linux Mint 22

Entrada fija

🚀 Guía Maestra 2025: Cómo Instalar Openfire en Linux Mint 22 con MariaDB y Pidgin

Domina la mensajería instantánea privada con el servidor XMPP más potente del mundo. Guía completa de instalación, seguridad y despliegue.

Índice de Contenidos


🧐 Introducción: El poder de XMPP y Openfire

En el panorama tecnológico actual, la soberanía de los datos es una prioridad tanto para empresas como para usuarios individuales. Openfire surge como la solución definitiva. Es un servidor de colaboración en tiempo real (RTC) bajo licencia dual (Open Source y Comercial) que utiliza el protocolo XMPP (Jabber).

¿Por qué Linux Mint 22? Al estar basado en Ubuntu 24.04 LTS, Mint ofrece una estabilidad sin precedentes, ideal para servicios que deben estar activos las 24 horas del día. Combinar Openfire con MariaDB nos permite manejar no solo texto, sino transferencia de archivos pesados, grupos de chat (MUC) y cifrado de extremo a extremo. 🔒

📋 Requisitos del Sistema

Antes de comenzar la instalación de Openfire, asegúrate de que tu sistema cumple con lo siguiente:

  • Sistema Operativo: Linux Mint 22 (Wilma) o superior.
  • Memoria RAM: Mínimo 2GB (4GB recomendados para más de 100 usuarios).
  • Almacenamiento: 1GB para el software, más espacio adicional para el historial en MariaDB.
  • Privilegios: Acceso root o usuario en el grupo sudo.

☕ Paso 1: Instalación de Java (OpenJDK)

Openfire es una aplicación escrita en Java, por lo que este es el componente más crítico. Linux Mint 22 soporta perfectamente OpenJDK 17 o 21.

Ejecuta los siguientes comandos para actualizar los repositorios e instalar el entorno de ejecución:

sudo apt update
sudo apt install openjdk-17-jre -y

Verifica la instalación con: java -version. Deberías ver una salida que confirme la versión 17 de OpenJDK. Este paso es vital para evitar errores de ejecución en el binario de Openfire. ✨

🗄️ Paso 2: Configuración de MariaDB para Openfire

Usar la base de datos interna (HSQLDB) está bien para pruebas de 5 minutos, pero para un servidor real, MariaDB es obligatorio. Ofrece mejor rendimiento, backups más sencillos y mayor integridad de datos.

Instalar el servidor de base de datos

sudo apt install mariadb-server -y

Crear la base de datos y el usuario

Entra a la consola de MariaDB:

sudo mariadb

Una vez dentro, ejecuta estos comandos SQL para preparar el terreno:

CREATE DATABASE openfire CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'openfire_user'@'localhost' IDENTIFIED BY 'TuClaveSegura2025';
GRANT ALL PRIVILEGES ON openfire.* TO 'openfire_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Nota SEO: Usar utf8mb4 garantiza que tus usuarios puedan enviarse Emojis 🔥 sin que el servidor arroje errores de caracteres.

📥 Paso 3: Instalación de Openfire (El proceso principal)

Ahora procedemos a la instalación del servidor. En Linux Mint 22, lo más limpio es usar el paquete Debian oficial.

Descarga del paquete

Visita la web oficial de Ignite Realtime o usa wget para bajar la última versión estable (ejemplo versión 4.9.0):

wget https://www.igniterealtime.org/downloadServlet?filename=openfire/openfire_4.9.0_all.deb -O openfire.deb

Ejecución de la instalación

Instala el paquete usando dpkg. Esto configurará automáticamente los scripts de inicio en systemd:

sudo dpkg -i openfire.deb

Gestión del servicio

Asegúrate de que el servicio esté activo y habilitado para que inicie siempre que enciendas tu PC/Servidor:

sudo systemctl enable openfire
sudo systemctl start openfire
sudo systemctl status openfire

🌐 Paso 4: El Asistente de Configuración Web

Con el servicio corriendo, el resto de la magia ocurre en el navegador. Abre Firefox o Chrome y ve a:

http://localhost:9090

Pasos del Asistente:

  1. Idioma: Selecciona “Español”.
  2. Ajustes del Servidor: Define tu dominio (ej: chat.tuempresa.com). Si es local, usa la IP.
  3. Base de Datos: Elige “Conexión estándar a la base de datos”.
  4. Configuración JDBC:
    • Driver: MySQL.
    • URL: jdbc:mysql://localhost:3306/openfire?rewriteBatchedStatements=true&characterEncoding=UTF-8
    • Usuario: openfire_user
    • Contraseña: TuClaveSegura2025
  5. Perfil: Elige “Default” para guardar usuarios en la base de datos (a menos que uses LDAP).
  6. Admin: Define el correo y la contraseña para el usuario admin. No olvides esta clave, ¡es la llave maestra! 🗝️

🐦 Paso 5: Conectando el Cliente Pidgin

Ahora que el servidor está “vivo”, necesitamos que los usuarios hablen entre sí. Pidgin es el cliente ideal por su estabilidad en Linux Mint.

Instalación:

sudo apt install pidgin -y

Configuración de cuenta:

Abre Pidgin y añade una cuenta con estos datos:

  • Protocolo: XMPP.
  • Usuario: El nombre de usuario que creaste en el panel de Openfire.
  • Dominio: La IP del servidor o nombre de dominio configurado.
  • Pestaña Avanzado: Si estás en una red local, en “Servidor de conexión” coloca la IP interna del servidor.

¡Listo! Ahora puedes añadir amigos por su nombre de usuario y empezar a chatear. 😍

💎 ¿Por qué usar Openfire? Ventajas y Estrategia SEO

Implementar esta solución no es solo un capricho técnico, es una estrategia de eficiencia operativa:

  • Costos Cero: No pagas por usuario (como en Slack). Si tienes 1,000 empleados, el ahorro es masivo.
  • Cifrado SSL/TLS: Puedes forzar que todas las conexiones sean cifradas, evitando ataques de hombre en el medio (MITM). 🛡️
  • Plugins: Puedes instalar el plugin de Off-the-Record (OTR) Messaging para conversaciones que no dejan rastro ni siquiera en la base de datos.
  • Historial de Auditoría: Registra quién habló con quién y cuándo (esencial para cumplimiento legal).

🛠️ Mantenimiento y Seguridad Avanzada

Para que tu servidor Openfire en Linux Mint 22 sea indestructible, sigue estas recomendaciones de mantenimiento:

1. Seguridad del Firewall (UFW)

Solo abre los puertos necesarios. En tu terminal:

sudo ufw allow 5222/tcp  # Puerto para clientes
sudo ufw allow 9090/tcp  # Consola de administración
sudo ufw allow 7777/tcp  # Transferencia de archivos

2. Respaldos Automáticos

No confíes en la suerte. Crea un cron job para respaldar tu base de datos MariaDB diariamente:

mysqldump -u openfire_user -pTuClave openfire > /home/tuusuario/backups/openfire_$(date +%F).sql

3. Monitoreo de Logs

Si algo falla, la respuesta siempre está en los logs. Puedes verlos en tiempo real con:

tail -f /var/log/openfire/openfire.log

🚀 Conclusión: Tu Red, Tus Reglas

Instalar Openfire en Linux Mint 22 es un proyecto gratificante que eleva la seguridad de cualquier organización. Has pasado de depender de terceros a ser el administrador de tu propio nodo de comunicación mundial. ¡Felicidades! 🎉

¿Tienes dudas con los certificados SSL de Let’s Encrypt para Openfire? ¡Escríbeme en los comentarios y lo resolvemos!

🛠️ Corrección de ordenamiento y búsqueda en DataTables (Server-Side) – Bitácora

Entrada fija

Se ha implementado una mejora importante en el manejo de DataTables con procesamiento server-side para el módulo de Bitácora en el proyecto jcposUltimate, resolviendo problemas de ordenamiento, paginación y búsqueda que impedían un funcionamiento correcto con MariaDB / MySQL.

🔗 Commit

https://github.com/julio101290/jcposUltimate/commit/7400ede1b2a826d7e9918c7475623ca0b2d5dc48

📂 Archivos modificados

❌ Problema detectado

El DataTable de la bitácora presentaba varios inconvenientes:

  • El ordenamiento por columnas no funcionaba, aunque visualmente aparecían las flechas.
  • El ORDER BY no se aplicaba dinámicamente desde los parámetros enviados por DataTables.
  • El mapeo de columnas para el ordenamiento era incorrecto.
  • La paginación y la búsqueda global no seguían buenas prácticas de seguridad.
  • La lógica del modelo no estaba alineada con el flujo real de DataTables server-side.

✅ Solución implementada

Se realizó una refactorización enfocada en robustez, compatibilidad y seguridad, logrando:

✔ Ordenamiento dinámico real

  • Implementación de un whitelist de columnas permitidas.
  • Construcción dinámica del ORDER BY usando los parámetros enviados por DataTables.

✔ Búsqueda global correcta

  • Uso exclusivo de LIKE, compatible con MariaDB / MySQL.
  • Eliminación de ILIKE, que es exclusivo de PostgreSQL.
  • Uso de bind parameters para prevenir SQL Injection.

✔ Paginación adecuada

  • Uso correcto de: LIMIT :start, :length
  • Totalmente compatible con el flujo estándar de DataTables.

✔ Separación clara de responsabilidades

  • El archivo AJAX se encarga únicamente de generar el JSON.
  • El controlador actúa como intermediario.
  • El modelo concentra toda la lógica SQL.

🧠 Beneficios obtenidos

💎 Guía Maestra: Instalación de SAP HANA Client 2.0

Entrada fija

Edición SAP Business One (HANA 2.0 Rev 56)

Esta guía detalla el despliegue del cliente de base de datos, componente esencial para conectar SAP B1, Crystal Reports, Excel y Power BI.


1 Ubicación del Kit de Instalación

En entornos de SAP Business One, el instalador reside dentro de los paquetes de datos del servidor. No busque instaladores genéricos; navegue a la siguiente ruta:

…\HANA 2.0 rev 56\DATA_UNITS\SAP HANA CLIENT 2.0 FOR B1

Dentro encontrará la arquitectura dual de SAP:

  • 📂 NT_X64: Carpeta exclusiva para Windows (64 bits).
  • 📂 LINX64SUSE: Carpeta para servidores Linux/SUSE.

2 Instalación Paso a Paso

  1. Acceda a la carpeta NT_X64.
  2. Localice el ejecutable hdbinst.exe.
  3. Derechos de Administrador: Haga clic derecho y seleccione “Ejecutar como administrador”.
  4. Consola: Presione Enter para aceptar la ruta por defecto C:\hdbclient.

⚠️ Verificación: La instalación finaliza correctamente cuando visualiza el mensaje: Installation done.

3 Configuración del PATH

Para ejecutar herramientas como hdbsql desde cualquier carpeta, configure la variable de entorno:

  • Busque “Variables de Entorno” en el menú Inicio.
  • En Variables del sistema, edite la variable Path.
  • Agregue una nueva línea con: C:\hdbclient.

4 Activación ODBC (64 bits)

Para habilitar la conexión en aplicaciones de terceros:

  1. Abra el Administrador de orígenes de datos ODBC (64 bits).
  2. Vaya a DSN de sistema > Agregar.
  3. Seleccione el controlador HDBODBC.
  4. Configure la IP del servidor y el puerto (ej: 30015).

// Prueba de fuego en CMDhdbsql -n 192.168.X.X:30015 -u SYSTEM -p Password123 "SELECT * FROM DUMMY"

🚀 Troubleshooting Rápido

  • ¿No ve el driver? Instale “Visual C++ Redistributable 2013/2015”.
  • ¿Error -10709? Verifique el Firewall del servidor en el puerto 30015.

Cómo enlazar sucursales locales con SAP Business One usando ODBC (HANA)

Entrada fija

Repositorio: boilerplateservicelayer
Commit documentado: 53bbd3fe03b083957043911f46b59a04e31175f4

Este manual técnico explica cómo enlazar sucursales locales con sucursales de SAP Business One (OBPL) utilizando ODBC (eODBC) sobre SAP HANA, evitando el uso del Service Layer para consultas de alto rendimiento.


¿Qué problema resuelve esta implementación?

En muchos proyectos con SAP Business One, el uso del Service Layer para catálogos o consultas simples introduce latencia innecesaria. Este módulo soluciona ese problema permitiendo:

  • Relacionar sucursales locales con sucursales SAP
  • Consultar la tabla OBPL directamente desde SAP HANA
  • Reducir tiempos de respuesta usando ODBC
  • Eliminar dependencias innecesarias del Service Layer

¿Por qué usar ODBC en SAP Business One?

El uso de ODBC en SAP HANA es ideal para consultas de solo lectura, catálogos y validaciones rápidas.

CaracterísticaService LayerODBC SAP HANA
RendimientoMedioAlto
LatenciaAltaBaja
Ideal paraCRUD complejoCatálogos y consultas
Dependencia SAPAltaMedia

Estructura del módulo de enlace SAP

La solución se divide en cuatro componentes principales:

  1. Tabla de enlace entre sucursal local y SAP
  2. Controlador con consultas ODBC
  3. Vista con DataTables server-side
  4. Formulario con Select2 dinámico

Tabla link_sap_branchoffice

Esta tabla permite mantener la relación entre el sistema local y SAP Business One sin duplicar información de SAP.

CampoDescripción
idID interno
idEmpresaEmpresa local
idBranchOfficeSucursal local
idBranchOfficeSAPSucursal SAP (OBPL.BPLId)
created_atFecha de creación
updated_atFecha de actualización
deleted_atBorrado lógico

Conexión a SAP HANA usando ODBC

La conexión ODBC se realiza directamente contra SAP HANA, lo que permite consultas rápidas y estables.

Conexión ODBC en PHP


$conn = odbc_connect(
    $dataConect['nameODBC'],
    $dataConect['userODBC'],
    $dataConect['passwordODBC']
);

Fijar el schema en SAP HANA


SET SCHEMA "COMPANYDB"

Este paso es obligatorio para evitar errores como invalid table name en SAP HANA.


Consulta optimizada a la tabla OBPL

Para obtener una sucursal SAP se realiza una consulta directa a la tabla OBPL:


SELECT
    "BPLId",
    "BPLName"
FROM OBPL
WHERE "Disabled" <> 'Y'
  AND "BPLId" = ?
  • Consulta directa
  • Sin bucles innecesarios
  • Ideal para formularios y edición

Listado con DataTables server-side

El módulo utiliza DataTables en modo server-side para manejar grandes volúmenes de datos:

  • Paginación eficiente
  • Búsqueda global
  • Ordenamiento dinámico
  • Filtrado por empresa del usuario

Select2 dinámico para sucursales

Sucursal local

Se cargan las sucursales locales vía AJAX usando Select2.

Sucursal SAP (OBPL)

Las sucursales SAP se consultan directamente desde SAP HANA vía ODBC, sin Service Layer.


Beneficios clave de esta arquitectura

  • Mayor rendimiento en SAP Business One
  • Menor latencia en consultas
  • Menos carga en el Service Layer
  • Arquitectura escalable y mantenible

Buenas prácticas recomendadas

  • Usar ODBC solo para consultas de lectura
  • Usar Service Layer para escrituras en SAP
  • Centralizar credenciales ODBC
  • Siempre definir el schema en SAP HANA

Conclusión

Este enfoque permite integrar SAP Business One con sistemas locales de forma eficiente, utilizando ODBC sobre SAP HANA como alternativa rápida y estable al Service Layer.

Ideal para catálogos, validaciones, reportes y sistemas híbridos SAP.

🚀 Guía de Activación CData ODBC SAP BUSINESS ONE

Entrada fija

SAP HANA Driver 2025 | Linux Mint & Ubuntu

Esta guía resuelve el error Could not find a valid license permitiendo la activación del periodo de prueba o licencia comercial.

1. Localizar el Motor de Activación

El driver incluye una utilidad Java específica. En la versión 2025, el archivo clave es:

/opt/cdata/cdata-odbc-driver-for-saphana/lib/cdata.odbcm.saphana.jar

2. Ejecutar el Asistente por Terminal

Usa el siguiente comando para forzar la apertura del gestor de licencias (requiere privilegios de sudo):

sudo java -cp /opt/cdata/cdata-odbc-driver-for-saphana/lib/cdata.odbcm.saphana.jar cdata.odbc.saphana.DriverMain -license

3. Datos de Registro (Modo TRIAL)

Dentro del asistente, completa la información solicitada:

  • 👤 Name: Tu nombre completo
  • 📧 Email: Tu correo electrónico
  • 🔑 Product Key: Escribe TRIAL

Nota: Si tienes una clave comprada, ingrésala en lugar de “TRIAL”.

4. Configuración de Permisos Finales

Es vital copiar la licencia y dar permisos de lectura para que PHP/Apache puedan detectarla:

# Crear carpeta de configuración
mkdir -p ~/.cdata

# Copiar archivo de licencia
sudo cp /opt/cdata/cdata-odbc-driver-for-saphana/lib/CData.ODBC.SAPHANA.lic ~/.cdata/

# Liberar permisos de lectura
sudo chmod 644 ~/.cdata/CData.ODBC.SAPHANA.lic
sudo chmod 644 /opt/cdata/cdata-odbc-driver-for-saphana/lib/CData.ODBC.SAPHANA.lic

📋 Detalles de la Licencia Trial

  • Vigencia: 30 días a partir de la activación.
  • Capacidad: Funcionalidad completa sin límite de registros.
  • Requisito: Requiere Java JRE instalado en el sistema.

Guía generada para Julio César – Linux Mint 22

Conectarse a SAP HANA desde Linux Mint usando CDATA ODBC (Guía Completa)

Entrada fija

Conectar aplicaciones PHP o frameworks como CodeIgniter a SAP HANA desde Linux puede ser un reto, especialmente cuando no se quiere instalar el SAP HANA Client oficial. En esta guía aprenderás paso a paso cómo instalar y configurar CDATA ODBC Driver para SAP HANA en Linux Mint, una alternativa rápida y funcional para entornos de desarrollo.


¿Qué es CDATA ODBC para SAP HANA?

CDATA es un proveedor de drivers ODBC comerciales que permiten conectarse a múltiples bases de datos empresariales, incluido SAP HANA, sin necesidad de instalar clientes pesados de SAP.

Ventajas

  • Instalación sencilla
  • Compatible con PHP, Python y Java
  • Ideal para Linux Mint / Ubuntu
  • No requiere SAP HANA Client

Consideraciones

  • Driver comercial
  • Incluye periodo de prueba (~30 días)
  • Recomendado para desarrollo y pruebas

Requisitos del sistema

  • Linux Mint 22 (64 bits)
  • Acceso a SAP HANA (IP, puerto, usuario y base de datos)
  • Permisos sudo
  • PHP (opcional para pruebas)

1. Instalar dependencias necesarias

sudo apt update
sudo apt install -y unixodbc unixodbc-dev libssl3 libc6

Verifica la instalación:

odbcinst -j

2. Descargar CDATA ODBC Driver para SAP HANA

Descarga el driver desde el sitio oficial:

https://www.cdata.com/drivers/saphana/odbc

Selecciona:

  • Platform: Linux
  • Architecture: 64-bit
  • Technology: ODBC

El archivo descargado tendrá un nombre similar a:

CDataODBCDriverforSAPHANA.tar.gz

3. Descomprimir el instalador

cd ~/Descargas
tar -xvzf CDataODBCDriverforSAPHANA.tar.gz
cd CDataODBCDriverforSAPHANA

4. Instalar el driver CDATA

sudo ./install.sh

El driver se instalará por defecto en:

/opt/cdata/cdata-odbc-driver-for-saphana/

5. Registrar el driver en ODBC

Verifica que la librería exista:

ls /opt/cdata/cdata-odbc-driver-for-saphana/lib/

Debe existir:

libcdataodbcHANA.so

Edita el archivo odbcinst.ini:

sudo nano /etc/odbcinst.ini

Agrega lo siguiente:

[CData SAP HANA ODBC Driver]
Description=CData ODBC Driver for SAP HANA
Driver=/opt/cdata/cdata-odbc-driver-for-saphana/lib/libcdataodbcHANA.so
UsageCount=1

Verifica el registro:

odbcinst -q -d

6. Crear el DSN de conexión

Edita el archivo odbc.ini:

sudo nano /etc/odbc.ini

Ejemplo de conexión para SAP Business One HANA:

[hana_dev]
Driver=CData SAP HANA ODBC Driver
Server=192.168.1.50
Port=30015
User=HANAUSER
Password=MySecurePass123
Database=SBODEV_HANA

7. Probar la conexión ODBC

isql -v hana_dev

Resultado esperado:

Connected!

8. Instalar soporte ODBC para PHP

sudo apt install php-odbc
sudo systemctl restart apache2

Verifica que PHP tenga ODBC habilitado:

php -m | grep odbc

9. Ejemplo de conexión PHP a SAP HANA

<?php

$conn = odbc_connect(
    'hana_dev',
    'HANAUSER',
    'MySecurePass123'
);

if (!$conn) {
    die(odbc_errormsg());
}

echo "Conectado a SAP HANA usando CDATA ODBC";

10. Ejemplo de consulta SAP HANA

$sql = '
    SELECT 
        "DocEntry",
        "DocNum",
        "CardCode",
        "CardName"
    FROM "OPCH"
    LIMIT 10
';

$rs = odbc_exec($conn, $sql);

while ($row = odbc_fetch_array($rs)) {
    print_r($row);
}

Nota: SAP HANA es sensible a mayúsculas y minúsculas, por lo que es obligatorio usar comillas dobles para tablas y campos.


Conclusión

El driver CDATA ODBC para SAP HANA es una excelente alternativa cuando necesitas conectarte rápidamente a SAP HANA desde Linux Mint sin instalar el cliente oficial de SAP.

  • Instalación sencilla
  • Compatible con PHP y CodeIgniter
  • Ideal para desarrollo y pruebas

Esta configuración puede adaptarse fácilmente a entornos productivos ajustando credenciales, seguridad y manejo de conexiones.

Página 1 de 13

Creado con WordPress & Tema de Anders Norén