Herramientas Informaticas

Autor: juliocesar20200413 Página 2 de 141

Desarrollador web apasionado y gusto por la buena musica

🔥 Grandes cambios y mejoras en el Boilerplate CodeIgniter: Multilenguaje, UX y Seguridad

Entrada fija


El desarrollo de aplicaciones modernas exige algo más que código funcional. Requiere una experiencia de usuario sólida, escalabilidad, seguridad y, sobre todo, una correcta internacionalización 🌍. En este artículo te explico todos los cambios y ajustes recientes aplicados al boilerplate, enfocados en mejorar la gestión de idiomas, autenticación, usabilidad y compatibilidad multiplataforma.


🚀 Internacionalización real: sistema multilenguaje mejorado

Uno de los cambios más importantes fue la optimización del sistema de traducciones. Ahora el boilerplate permite trabajar fácilmente con múltiples idiomas sin duplicar lógica ni romper vistas.

Se agregaron y ajustaron traducciones completas para:

  • 🇬🇧 Inglés
  • 🇩🇪 Alemán
  • 🇮🇹 Italiano
  • 🇮🇩 Indonesio
  • 🌍 Esperanto

Esto permite que el sistema pueda escalar internacionalmente sin modificar el core de la aplicación.

📌 Ejemplo de uso correcto del sistema de idiomas

<?= lang('Auth.showPassword') ?>

Este enfoque mantiene el código limpio, reutilizable y compatible con futuras extensiones.


🔐 Mostrar contraseña: mejora UX sin comprometer seguridad

Se agregó la opción de mostrar u ocultar la contraseña mediante un checkbox, algo esencial hoy en día para mejorar la experiencia del usuario, especialmente en dispositivos móviles 📱.

El texto del checkbox también es traducible:

<?= lang('Auth.showPassword') ?? 'Show password' ?>

De esta forma, si una traducción no existe, el sistema usa un fallback automáticamente.


🎨 Interfaz adaptable: PC, tablet y móvil

Todos los formularios fueron ajustados para verse correctamente en:

  • 🖥️ Computadoras de escritorio
  • 📱 Teléfonos móviles
  • 📲 Tablets

Se cuidaron márgenes, tamaños de fuente y alineación para garantizar una experiencia consistente sin importar el dispositivo.


🧠 Organización de idiomas: estructura clara y mantenible

Los archivos de idioma ahora están mejor organizados por contexto:

  • Global
  • Permisos
  • Roles
  • Menús
  • Usuarios
  • Autenticación

Esto facilita:

  • ✔️ Mantenimiento
  • ✔️ Escalabilidad
  • ✔️ Nuevos idiomas

🛠️ Compatibilidad total con WordPress (documentación)

Un punto clave fue documentar correctamente el código para que pueda mostrarse en WordPress sin que el CMS intente interpretar PHP.

Ejemplo correcto de código documentado:

<?= lang('Admin.Auth.showPassword') ?>

Esto permite compartir documentación técnica sin errores visuales ni de seguridad.


📈 SEO técnico y legibilidad

Se mejoraron:

  • 📌 Encabezados jerárquicos (H1, H2, H3)
  • 📌 Palabras clave relacionadas con CodeIgniter y boilerplates
  • 📌 Lectura natural para humanos 🤝 buscadores

Esto hace que el proyecto no solo sea bueno técnicamente, sino también visible en buscadores 🔍.


🔥 Conclusión

Estos cambios convierten al boilerplate en una base mucho más sólida, moderna y preparada para proyectos reales. No se trata solo de agregar funciones, sino de hacerlo bien: con orden, traducciones, UX y documentación clara.

Si estás construyendo un proyecto serio con CodeIgniter, estos ajustes marcan la diferencia entre un sistema básico y uno profesional 💼.

🚀 Seguiremos mejorando y optimizando el proyecto paso a paso.

Ordenamiento Descendente Correcto en Administrar Ventas con DataTables Server-Side en JCPOS Ultimate

Entrada fija

Ordenamiento Descendente Correcto en Administrar Ventas con DataTables Server-Side en JCPOS Ultimate

Uno de los puntos que más confusión genera al trabajar con DataTables en modo server-side es el ordenamiento por defecto. En el módulo Administrar Ventas de JCPOS Ultimate Punto de Venta, este tema cobra especial importancia, ya que el usuario espera ver siempre las ventas más recientes primero.

En esta publicación explicamos:

  • Por qué el ordenamiento descendente no parecía funcionar
  • Cómo maneja DataTables el orden en server-side
  • Dónde ocurre realmente el ordenamiento
  • Qué se ajustó para que el orden sea correcto
  • Recomendaciones para evitar este problema en el futuro

📁 Archivos involucrados

El flujo completo del listado de ventas utiliza dos archivos clave:

  • Vista:
    vistas/modulos/ventas.php
  • Backend DataTables:
    ajax/datatable-administrarVentas.ajax.php

Importante: No se modificó la vista ventas.php. El comportamiento correcto se logra entendiendo y respetando la lógica de DataTables server-side.


📊 El problema: “el orden no cambia”

Desde el lado del usuario, el síntoma era claro:

  • Se esperaba que la tabla se ordenara por la primera columna (ID)
  • En forma descendente (ventas más recientes arriba)
  • Pero el orden parecía no cambiar

Esto suele llevar a pensar erróneamente que:

  • El parámetro order no funciona
  • DataTables ignora la configuración
  • Existe un error en JavaScript

La realidad es otra.


⚠️ La clave: server-side cambia las reglas

Cuando DataTables funciona en modo normal (frontend), el ordenamiento se hace completamente en el navegador.

Pero cuando se activa:

serverSide: true

ocurre algo fundamental:

  • DataTables NO ordena los datos
  • Solo envía la instrucción de orden al servidor
  • El backend es quien decide el orden final

Por eso, aunque en JavaScript se indique:

order: [[0, "desc"]]

si el backend no respeta esa instrucción, el orden visual nunca cambiará.


📡 Qué envía realmente DataTables al backend

En cada petición AJAX, DataTables envía parámetros como:

  • order[0][column] → índice de la columna
  • order[0][dir] → asc / desc

En este caso:

  • Columna 0 → ID
  • Dirección → desc

Esto significa: “ordena por ID de forma descendente”


🔍 Por qué antes no se reflejaba el orden

El archivo datatable-administrarVentas.ajax.php recibe los parámetros de DataTables, pero:

  • El método ctrRangoFechasVentas() ya devuelve resultados
  • El orden puede venir definido internamente
  • Si no se aplica el ORDER BY dinámico, el resultado será siempre el mismo

Esto genera la sensación de que:

  • El DataTable “ignora” el orden

Cuando en realidad:

  • El backend está devolviendo los datos sin respetar la instrucción

✅ Qué se hizo para que el orden funcione correctamente

El cambio no fue visual ni estético, fue conceptual y estructural.

✔ Se respetó el flujo server-side

DataTables:

  • Envía la columna y dirección
  • No ordena nada por sí mismo

Backend:

  • Recibe los parámetros
  • Aplica el orden correcto
  • Devuelve los datos ya ordenados

✔ La primera columna (ID) quedó como referencia

Al usar el ID como columna principal:

  • Mayor ID = venta más reciente
  • Orden descendente = últimas ventas primero

Esto coincide con la expectativa natural del usuario.


📈 Beneficios del ordenamiento correcto

  • Mejor experiencia de usuario
  • Acceso inmediato a ventas recientes
  • Menos clics para buscar información
  • Coherencia con sistemas POS profesionales

💡 Recomendaciones técnicas

1️⃣ Siempre pensar en backend cuando uses server-side

Si no se ordena en el servidor, no se ordenará nunca.

2️⃣ Usar IDs autoincrementales como referencia

Facilitan ordenamiento y paginación.

3️⃣ No confiar solo en JavaScript

El JS solo indica la intención, no ejecuta el orden.

4️⃣ Mantener coherencia entre columnas

El índice de columna debe coincidir exactamente con el JSON.

5️⃣ Documentar estos cambios

Evita confusiones futuras al mantener el sistema.


📌 Conclusión

El ordenamiento descendente en Administrar Ventas no fue un simple ajuste visual, sino una correcta aplicación del flujo DataTables server-side.

Entender que el orden se decide en el backend marca la diferencia entre una tabla que “parece no funcionar” y un sistema profesional, escalable y confiable.

Documentado por Julio Leyva

JCPOS Ultimate: Corrección profesional de descuentos en tickets y facturas PDF (TCPDF

Entrada fija

JCPOS Ultimate: Corrección profesional de descuentos en tickets y facturas PDF (TCPDF)

En JCPOS Ultimate Punto de Venta seguimos afinando cada detalle para ofrecer un sistema sólido, preciso y visualmente profesional. En este nuevo ajuste técnico se corrigió y optimizó el manejo de descuentos tanto en facturas PDF (TCPDF) como en la impresión de tickets, evitando errores visuales, desbordes de columnas y cálculos inconsistentes.

🔧 ¿Qué problema se resolvió?

Al agregar la columna de descuento en los documentos de venta, surgieron dos problemas comunes en sistemas POS:

  • 📄 El encabezado del PDF se desalineaba y aumentaba el alto del renglón.
  • 🧾 El ticket no reflejaba correctamente el total de descuentos aplicados por producto.

Esto ocurre principalmente por saltos de línea automáticos, padding excesivo y falta de normalización visual en TCPDF y HTML de impresión.

✅ Solución aplicada en JCPOS Ultimate

El commit implementa una solución limpia, compatible y optimizada:

  • ✔ Redistribución exacta de anchos sin romper el layout
  • ✔ Eliminación de saltos de línea forzados (white-space: nowrap)
  • ✔ Ajuste de line-height y padding para encabezados compactos
  • ✔ Cálculo acumulado real de descuentos por producto

📄 Factura PDF (TCPDF)

Se ajustó el encabezado de la tabla para que la nueva columna de descuento:

  • No incremente el alto del renglón
  • No rompa el ancho total del documento
  • Mantenga una lectura clara incluso en impresoras térmicas

Esto es especialmente importante en PDFs generados con TCPDF, donde el control de pixeles es crítico.

Archivo modificado:
extensiones/tcpdf/pdf/factura.php

🧾 Ticket de venta: descuentos correctamente reflejados

En la impresión del ticket se implementó:

  • 📌 Acumulación correcta de descuentos por producto
  • 📌 Visualización clara del subtotal, descuento, IVA y total
  • 📌 Compatibilidad total con impresión automática

Ahora el cliente puede ver claramente cuánto se le descontó en su compra, aumentando transparencia y confianza.

Archivos involucrados:

  • extensiones/impresionTicket/impresionTicket.php
  • Controladores y modelos de ventas, productos y empresa

💡 ¿Por qué este cambio es importante en un POS?

  • 📊 Evita errores contables por descuentos mal aplicados
  • 🖨 Mejora la impresión en tickets térmicos
  • 🧠 Facilita auditorías y revisiones
  • 🎯 Ofrece una imagen más profesional al cliente final

🔗 Commit del cambio

Puedes revisar el cambio completo aquí:
Ver commit en GitHub

🚀 JCPOS Ultimate sigue evolucionando

Cada ajuste en JCPOS Ultimate está pensado para resolver problemas reales del día a día en puntos de venta: desde el cálculo correcto de descuentos hasta la impresión perfecta en PDF y ticket.

Capturas de pantalla

Aqui seleccionamos el descuento por producto

Podemos elegir diferentes descuentos

En configuraciones->Descuentos podemos capturar los diferentes descuentos

Podemos darle acceso a los descuentos por usuario

Si usas JCPOS Ultimate, este cambio mejora directamente la precisión y presentación de tus ventas.

Adaptado y desarrollado por Julio Leyva.


#JCPOSUltimate #PuntoDeVenta #TCPDF #DescuentosPOS #PHP #OpenSource #SistemasDeVenta #Tickets #FacturasPDF

🚀 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.

Cómo instalar Plex en Linux Mint 22 y solucionar el audio “subido de tono”

Entrada fija

En esta guía aprenderás a transformar tu ordenador con Linux Mint 22 en un servidor multimedia profesional y a corregir el error común de audio acelerado en la TV.


1. Instalación de Plex Media Server

Para asegurar la estabilidad y recibir actualizaciones automáticas, utilizaremos el repositorio oficial de los desarrolladores de Plex.

Paso 1: Preparar el sistema

Abre la terminal e instala las dependencias necesarias con el siguiente comando:

sudo apt update && sudo apt upgrade -y
sudo apt install apt-transport-https curl wget -y

Paso 2: Añadir el repositorio oficial

Ejecuta estos comandos para configurar la llave de seguridad y el repositorio:

# Añadir llave GPG
curl https://downloads.plex.tv/plex-keys/PlexSign.key | gpg --dearmor | sudo tee /usr/share/keyrings/plexserver.gpg > /dev/null

# Añadir fuente de repositorio
echo "deb [signed-by=/usr/share/keyrings/plexserver.gpg] https://downloads.plex.tv/repo/deb public main" | sudo tee /etc/apt/sources.list.d/plexmediaserver.list

Paso 3: Instalar el servidor

sudo apt update
sudo apt install plexmediaserver -y

2. Solución al Audio “Subido de Tono” (Efecto Ardilla)

Si el sonido en tu TV se escucha más agudo de lo normal o acelerado, el problema suele estar en la comunicación entre el servidor y el reproductor. Aquí tienes las soluciones:

Solución A: Desactivar el Passthrough de Audio

Esto suele ocurrir cuando la TV intenta decodificar un formato que no soporta. Para arreglarlo:

  • Abre la App de Plex en tu Smart TV.
  • Ve a Configuración > Audio.
  • Busca la opción Passthrough y selecciona Desactivado (o “None”).

Solución B: Sincronización de Frecuencia en Linux Mint

Si tu servidor está conectado por HDMI, asegúrate de que la frecuencia de salida sea la estándar:

  1. Ve al Menú > Configuración de Sonido.
  2. En la salida HDMI, verifica que esté configurada a 48000 Hz (en lugar de 44100 Hz).

3. Configuración de Permisos y Acceso

Plex necesita permisos para leer tus carpetas de películas. Si no aparecen tus archivos, ejecuta:

sudo chmod -R 755 /ruta/a/tus/peliculas

Para finalizar la configuración, accede vía web desde cualquier navegador de tu red:

http://IP-DE-TU-SERVIDOR:32400/web


Nota: Recuerda que para que los discos duros externos funcionen siempre, deben estar configurados para montarse automáticamente en el inicio del sistema.

Página 2 de 141

Creado con WordPress & Tema de Anders Norén