📝 Por: julio 101290
Especialista en integraciones SAP – PHP – CodeIgniter
¿Cansado de los atascos en la aprobación de gastos, viáticos y facturas? ¿Los comprobantes se pierden en correos electrónicos o en papeles que nunca llegan? En este artículo te muestro cómo construí un módulo de autorización de comprobantes conectado directamente a SAP HANA usando CodeIgniter 4, ODBC y tecnologías web modernas. Además, te cuento los beneficios reales que obtendrás.
📌 Índice
- El problema de siempre: autorización manual
- La solución técnica: arquitectura limpia y directa
- Beneficios clave (✅ productividad, ✅ seguridad, ✅ movilidad)
- Código y componentes principales
- Lecciones aprendidas (y errores que evitar)
- Mejoras futuras y recomendaciones
- Conclusión: ¿por qué deberías implementarlo ya?
1. El problema de siempre: autorización manual 📄❌
Imaginemos el día a día:
- Un empleado genera un comprobante de gasto en SAP (ej.
CV__300000366). - El comprobante queda con estado
U_Status = 2(pendiente de autorización). - El autorizador recibe un correo, imprime, firma, escanea… o peor, usa un Excel compartido.
- Contabilidad tarda días en enterarse de la aprobación.
- No hay trazabilidad: ¿quién aprobó? ¿cuándo? ¿por qué?
🔴 Resultado: retrasos, errores, falta de control y equipos frustrados.
2. La solución técnica: arquitectura limpia y directa 🏗️
Decidí construir una interfaz web que se conecte directamente a las tablas de usuario de SAP (@QSYS_GLO_VOUC y @QSYS_GLO_VODE) usando ODBC. No necesitamos API intermedias ni modificar el núcleo de SAP.
🧱 Stack tecnológico elegido
| Componente | ¿Por qué? |
|---|---|
| CodeIgniter 4 | Ligero, rápido, con excelente soporte para ODBC y JSON |
| ODBC | Conexión nativa a SAP HANA; sin controladores adicionales complicados |
| DataTables | Tablas dinámicas con búsqueda, ordenamiento y paginación server-side |
| SweetAlert2 | Diálogos modernos para confirmar autorizaciones |
| Bootstrap 4 | Diseño responsivo (funciona en móvil, tableta y escritorio) |
| jQuery + AJAX | Comunicación asíncrona sin recargar la página |
🔄 Flujo de trabajo
- El autorizador ingresa a la URL
/admin/refundsauth. - Se carga una DataTable con todos los comprobantes pendientes (
U_Status = 2). - Por cada fila, botones: Autorizar y Detalle.
- Al hacer clic en Detalle, se abre un modal responsivo que muestra las líneas del comprobante (tabla VODE).
- Al hacer clic en Autorizar, se confirma con SweetAlert y se envía una petición AJAX que actualiza
U_Status = 4directamente en SAP. - La fila desaparece de la tabla y queda registrado en una bitácora local.
✅ Todo en tiempo real, sin papeles, sin correos, sin pérdidas.

3. Beneficios clave (✅ productividad, ✅ seguridad, ✅ movilidad)
🚀 Velocidad y productividad
- De días a segundos: la autorización se hace con un clic.
- El autorizador ve solo lo que le corresponde (filtros, búsqueda, orden).
- Autorización masiva (se puede implementar fácilmente).
🔒 Trazabilidad y auditoría
- Cada autorización queda registrada en la tabla
logcon usuario, fecha y detalles. - SAP conserva el histórico de
U_Status(si se audita, se sabe cuándo cambió a 4). - Evita fraudes o aprobaciones sin conocimiento.
📱 Acceso móvil y responsivo
- El diseño con Bootstrap y DataTables se adapta a cualquier dispositivo.
- El modal de detalle tiene scroll horizontal (ideal para ver muchas columnas).
- Los gerentes pueden aprobar gastos desde el móvil mientras viajan.
🧩 Integración sin fricción con SAP
- No se necesita licencia adicional de Service Layer.
- Las tablas
@...son de usuario → se pueden leer/escribir con ODBC con permisos estándar. - La actualización es inmediata y consistente.
🛡️ Seguridad basada en roles
- Cada usuario del sistema se vincula con un
sapuserautorizador (tablauser_sap_link). - Solo los usuarios con el permiso adecuado pueden ver y autorizar.
💰 Bajo costo y rápido desarrollo
- Solución implementada en menos de una semana.
- Código 100% reutilizable y extensible.
- No requiere comprar add‑ons caros de terceros.
4. Código y componentes principales (fragmentos clave) 🧩
Aquí te muestro las partes más importantes del controlador RefundsAuthController.php.
📡 Conexión ODBC y consulta de pendientes
$conn = odbc_connect($dataConect['nameODBC'], $dataConect['userODBC'], $dataConect['passwordODBC']);
$tableName = '"' . $dataConect['companyDB'] . '"."@QSYS_GLO_VOUC"';
$sql = "SELECT * FROM $tableName WHERE \"U_Status\" = 2 ORDER BY \"U_Date\" DESC";
$result = odbc_exec($conn, $sql);✏️ Autorización (update directo)
$sqlUpdate = "UPDATE $tableName SET \"U_Status\" = 4 WHERE \"Code\" = $code";
odbc_exec($conn, $sqlUpdate);📋 Detalle responsivo (modal con scroll)
$.ajax({
url: base_url + '/admin/servicelayer/refundsauth/showVoucherDetails',
data: JSON.stringify({ code: code }),
success: function(resp) {
var html = '<div class="table-responsive">' +
'<table class="table table-sm table-bordered">' +
// ... cabeceras y filas ...
'</table></div>';
$('#modalVoucherDetailsBody').html(html);
}
});💡 El código completo lo puedes encontrar en mi repositorio de GitHub (link al final).
5. Lecciones aprendidas (y errores que evitar) 🧠
❌ Error 1: Nombres de tablas con @ sin comillas dobles
Solución: Siempre usar "DBNAME"."@TABLA". HANA es sensible a mayúsculas/minúsculas.
❌ Error 2: Usar LIMIT en ODBC sin ROW_NUMBER()
Solución: Emplear la función analítica ROW_NUMBER() OVER (ORDER BY ...) y filtrar por rn.
❌ Error 3: El modal se quedaba en “Cargando…”
Causa: Los IDs del contenedor en el modal no coincidían con los del JavaScript.
Solución: Sincronizar id="modalVoucherDetailsBody" en el HTML y en el JS.
❌ Error 4: La tabla no hacía scroll en móvil
Solución: Envolver la tabla en <div class="table-responsive"> y dar a la tabla un min-width: 700px mediante CSS.
❌ Error 5: Caracteres extraños en JSON
Solución: Aplicar utf8ize() recursivo a cada fila antes de enviarla.
6. Mejoras futuras y recomendaciones 🧪
Si quieres llevar el sistema al siguiente nivel, considera:
- Autorización por lotes (seleccionar varios y aprobar con un botón).
- Notificaciones por correo o WhatsApp cuando llegue un nuevo comprobante.
- Rechazo con motivo y notificación al empleado.
- Dashboard de indicadores (tiempo promedio de autorización, montos aprobados, etc.).
- Firma digital para cumplir normativas.
- Integración con SAP Business Workflow (si la empresa lo requiere).
7. Conclusión: ¿por qué deberías implementarlo ya? 🎯
La combinación CodeIgniter 4 + ODBC + DataTables permite construir en pocos días un sistema de autorización de comprobantes que:
- Reduce drásticamente los tiempos de espera.
- Elimina el papeleo y los correos perdidos.
- Brinda movilidad a los aprobadores.
- Aporta transparencia y auditoría.
- Se integra de forma nativa con SAP sin costes adicionales.
¿Tu empresa sigue aprobando gastos con firmas manuales y hojas de cálculo?
Es hora de dar el salto a la automatización web. Yo ya lo hice para varios clientes, y los resultados han sido increíbles: +80% de agilidad, 0 errores de registro y aprobaciones desde el móvil.
🔗 Recursos adicionales
- Repositorio GitHub del proyecto (ejemplo funcional)
- Documentación oficial de CodeIgniter 4
- Consejos para ODBC con SAP HANA
📢 Comparte este artículo si te ha resultado útil
♻️ ¿Conoces a alguien que todavía autoriza comprobantes en papel? Etiquétalo en los comentarios.
#SAP #CodeIgniter #ODBC #AutorizaciónDeGastos #PHP #DesarrolloWeb #TransformaciónDigital
Deja un comentario