Herramientas Informaticas

Mes: febrero 2026

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.

🚀 Transforma tu Terminal Linux con IA Local

Entrada fija

Usa Llama 3 y Moondream para navegar, auditar seguridad y analizar imágenes.

¿Alguna vez deseaste que tu terminal fuera inteligente? Hoy vamos a crear “Q”, un asistente híbrido que vive en tu consola. Gracias a Ollama, este script puede entender órdenes en lenguaje natural y utilizar visión artificial para buscar archivos visualmente.

🛡️ Seguridad y Auditoría Automática

Con este script, puedes realizar auditorías de seguridad rápidas. Pregunta cosas como:

  • “¿Hay conexiones remotas activas?”
  • “Revisa si alguien ha intentado hackear mi PC”
  • “¿Qué usuarios han iniciado sesión recientemente?”

📦 Requisitos Previos

Primero, instala Ollama y las librerías necesarias:

# Instalar modelos
ollama pull llama3
ollama pull moondream

# Instalar librería de procesamiento de imagen
pip install Pillow

🐍 El Script Completo: ia-term-viva.py

Guarda el siguiente código en tu carpeta personal como ia-term-viva.py:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import subprocess, sys, time, re, os, base64

# Colores para la terminal
BLUE = '\033[94m'; GREEN = '\033[92m'; YELLOW = '\033[93m'
CYAN = '\033[96m'; MAGENTA = '\033[95m'; RED = '\033[91m'
RESET = '\033[0m'; BOLD = '\033[1m'

def typing_print(text, speed=0.02):
    for char in text:
        sys.stdout.write(char); sys.stdout.flush(); time.sleep(speed)
    print()

def image_to_base64(image_path):
    try:
        with open(image_path, "rb") as img_file:
            return base64.b64encode(img_file.read()).decode('utf-8')
    except: return None

def vision_analyze(prompt, image_path):
    img_b64 = image_to_base64(image_path)
    if not img_b64: return "ERROR"
    result = subprocess.run(
        ["ollama", "run", "moondream"],
        input=f"{prompt}\nimage: {img_b64}",
        text=True, capture_output=True, encoding="utf-8"
    )
    return result.stdout.strip()

def run_llama_logic(prompt_input):
    model = "llama3"
    system_instructions = (
        "Eres un experto en terminal Linux y Seguridad Informatica. "
        "Traduce la peticion a un comando Bash puro. FORMATO: Frase | comando."
    )
    res = subprocess.run(
        ["ollama", "run", model], 
        input=f"{system_instructions}\n\nUsuario: {prompt_input}", 
        text=True, capture_output=True, encoding="utf-8"
    )
    return res.stdout.strip()

def main():
    if len(sys.argv) < 2:
        print(f"{CYAN}¿Qué órdenes tienes, Julio César?{RESET}"); return

    query = " ".join(sys.argv[1:])

    # --- LÓGICA DE VISIÓN (MOONDREAM) ---
    if "busca" in query.lower() and ("persona" in query.lower() or "playera" in query.lower() or "imagen" in query.lower()):
        print(f"{YELLOW}👁️  Activando Moondream...{RESET}")
        carpeta = os.getcwd()
        if "en " in query.lower():
            pos_ruta = query.lower().split("en ")[-1].strip()
            if os.path.isdir(pos_ruta): carpeta = pos_ruta
            elif pos_ruta in ["esta carpeta", ".", "aquí"]: carpeta = os.getcwd()

        objetivo = query.lower().split("busca")[-1].split("en")[0].strip()
        fotos = [f for f in os.listdir(carpeta) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.webp'))]

        for foto in fotos:
            ruta = os.path.join(carpeta, foto)
            print(f"🧐 Analizando: {foto}...", end="\r")
            res = vision_analyze(f"Is there {objetivo} in this image? Answer only yes or no.", ruta)
            if "yes" in res.lower():
                print(f"\n{GREEN}✅ ENCONTRADA: {foto}{RESET}")
                subprocess.run(["xdg-open", ruta]); return 
        print(f"\n{RED}Sin resultados.{RESET}"); return

    # --- LÓGICA DE TERMINAL (LLAMA 3) ---
    raw_output = run_llama_logic(query)
    if "|" in raw_output:
        partes = raw_output.split("|")
        frase, comando = partes[0].strip(), "|".join(partes[1:]).strip()
    else:
        frase, comando = "Entendido", raw_output.strip()

    comando = comando.replace("`", "").replace("bash", "").strip().split('\n')[0]
    print(f"\n{BOLD}{BLUE}🤖 Terminal:{RESET} ", end="")
    typing_print(f"'{frase}'")

    if len(comando) > 1:
        print(f"{MAGENTA}💻 Ejecutando:{RESET} {GREEN}{BOLD}{comando}{RESET}")
        with open("/tmp/last_ia_cmd", "w") as f: f.write(comando)
        subprocess.run(comando, shell=True)

if __name__ == "__main__":
    main()

⚙️ Configuración del Alias (.bashrc)

Para habilitar el comando q y permitir la navegación cd, añade esto al final de tu archivo ~/.bashrc:

q() {
    python3 ~/ia-term-viva.py "$@"
    if [ -f /tmp/last_ia_cmd ]; then
        local cmd=$(cat /tmp/last_ia_cmd)
        if [[ "$cmd" == cd* ]]; then eval "$cmd"; fi
        rm -f /tmp/last_ia_cmd
    fi
}

#Linux #InteligenciaArtificial #Ollama #Ciberseguridad #Python

Creado con WordPress & Tema de Anders Norén