# Análisis del Proyecto: restApi

**Fecha:** 2026-05-29  
**Ruta:** `/serverApps/repos/api/restApi`

---

## 1. Arquitectura

### Descripción General
API REST construida en **PHP nativo (procedimental)**, sin framework web moderno. Usa el patrón **DAO (Data Access Object)** para acceso a datos y sirve respuestas JSON.

### Capas
```
Cliente HTTP
    │
    ▼
Endpoint (archivo PHP en raíz o subdirectorio)
    │  - Parsea $_REQUEST o JSON via php://input
    │  - Aplica lógica de negocio directa
    ▼
DAO (/lib/dao/)
    │  - 72 clases DAO, una por entidad/tabla
    │  - Ejecutan queries directamente con ADODB
    ▼
Base de Datos
    │  - Informix (principal, bases CO y EC)
    │  - MySQL (módulo corporate_signature)
    ▼
Servicios Externos
    - ATW+ Backend (flotas)
    - Contifico (facturación)
    - Azure Functions (CRM)
    - AWS SES (email)
    - Gotenberg (generación PDF)
    - SICE (facturación baja)
```

### Estructura de Directorios
| Directorio | Propósito |
|---|---|
| `/lib/dao/` | 72 Data Access Objects |
| `/lib/funcionesGenerales/` | Funciones compartidas y envío de correos |
| `/lib/aws/` | SDK de AWS para SES |
| `/lib/jwt-master/`, `/php-jwt-master/`, `/php-jwt-master2/` | Tres copias de librerías JWT |
| `/lib/mailer/`, `/phpmailer6/` | Dos versiones de PHPMailer |
| `/invoices/` | Módulo de facturas y estados de cuenta |
| `/contifico/` | Integración con sistema Contifico |
| `/pcpk/` | Sistema de contratación de llantas |
| `/integrationCRM/` | Integración con CRM vía Azure |
| `/integrationATW/` | Integración ATW+ (gestión de flota) |
| `/multiorders/` | Módulo de multiordenes |
| `/customer/` | Módulo de clientes |
| `/articles/` | Artículos/inventario |
| `/corporate_signature/` | Firmas corporativas |
| `/sincronize_az/` | Sincronización con Azure |
| `/log/` | Archivos de log |

### Estadísticas
- **Total archivos PHP:** ~105
- **DAOs:** 72
- **Endpoints en raíz:** 33
- **Subdirectorios de módulos:** 20+
- **Integraciones externas:** 6+
- **Bases de datos conectadas:** 3

---

## 2. Funcionalidad y Lógica

### Endpoints Principales
| Endpoint | Método | Descripción |
|---|---|---|
| `/clientes.php` | GET/POST/PATCH | CRUD de clientes |
| `/autenticacion.php` | POST | Autenticación por token |
| `/login.php` | POST | Login con usuario/contraseña |
| `/generatePDFv2.php` | GET | Genera y envía PDF via AWS SES |
| `/invoices/invoiceSice.php` | GET | Consulta facturas SICE |
| `/invoices/statement_customers.php` | POST | Estados de cuenta de clientes |
| `/contifico/create_document.php` | POST | Crea documentos en Contifico |
| `/pcpk/mdPcpkFacturacionBaja.php` | POST | Facturación baja PCPK |
| `/consultarArticulo.php` | GET | Consulta artículos/inventario |
| `/ctwflhis.php` | GET | Historial de flota CTW |
| `/multiorderPDF.php` | POST | PDF de multiordenes |
| `/integrationCRM/sendTiquetCRM.php` | POST | Envía tiquetes al CRM vía Azure |

### Flujo Típico de Request
```php
// 1. CORS headers
header("Access-Control-Allow-Origin: *");

// 2. Parseo de input
$data = json_decode(file_get_contents('php://input'), true);
$param = $_REQUEST['param'];

// 3. Instancia DAO
$dao = new ClienteDAO($db);
$result = $dao->getById($id);

// 4. Respuesta JSON
echo json_encode(['data' => $result]);
```

### Integraciones Externas
| Sistema | Propósito | Protocolo |
|---|---|---|
| ATW+ Backend | Gestión de flotas | REST + Basic Auth |
| Contifico | Facturación electrónica Ecuador | REST + API Key |
| Azure Functions | Gestión de tiquetes CRM | REST + Function Key |
| AWS SES | Envío de correos con attachments | SDK PHP |
| Gotenberg | Conversión de URL a PDF | REST |
| SICE | Facturación baja | SOAP/REST |

---

## 3. Seguridad

### CRÍTICO - SQL Injection Generalizado
**El problema más grave del proyecto.** Los 72 archivos DAO construyen queries por concatenación directa de strings, sin prepared statements ni escape de parámetros.

```php
// DAO típico — VULNERABLE
$sql = "SELECT * FROM clientes WHERE nit = '" . $nit . "'";
$sql .= " AND nombre LIKE '%" . $nombre . "%'";

// validateDAO.php — VULNERABLE (actualiza cualquier tabla/campo)
$sql = "UPDATE ".$tabla." SET ".$campo."='".$valor."' WHERE ".$llave." = '".$valor_llave."'";

// consultarArticulo.php — VULNERABLE
$sqlpro = "execute procedure articulo('".$_REQUEST['articulo']."','"
        . $_REQUEST['tiquete']."','".$_REQUEST['quemado']."')";
```

**Impacto:** Exfiltración completa de datos, modificación de registros, potencial ejecución de comandos si el usuario de BD tiene permisos.

---

### CRÍTICO - Credenciales Hardcodeadas en Código Fuente

Todas las siguientes credenciales están en texto plano en el repositorio:

| Archivo | Tipo | Credencial |
|---|---|---|
| `generatePDFv2.php` | AWS IAM Key | `AKIAVSNT347FVOIMBWZJ` |
| `generatePDFv2.php` | AWS Secret | `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` |
| `lib/param.inc.php` | DB Password | `Z52cW,p28$` |
| `lib/param.inc.php` | ATW+ Basic Auth | `ZWppbWVuZXo6RWR3OTExMjE3QXR3JA==` |
| `lib/funcionesGenerales/envioCorreo.php` | SMTP Password | `YfmA2013DhJ` |
| `lib/funcionesGenerales/envioCorreo.php` | SMTP Password | `HolaLolaAutom$1003` |
| `lib/funcionesGenerales/envioCorreo.php` | SMTP Password | `F@ctur@3cu@dor202309` |
| `contifico/*.php` | API Token | `a5e99382-b4c2-496e-8c21-279aba0a875f` |
| `contifico/*.php` | API Key | `Q4kY2oG54CZPVXw6WNfqVsjJfd6tsGEehEMz4io2yzA` |
| `integrationCRM/sendTiquetCRM.php` | Azure Function Key | `WfA5beCbzG/vGaRg6B4hFHBROZQhSolRdVOlOFpRZO5GY2O5Eem3ig==` |
| `website/connMysql.php` | MySQL Password | `IdSau74CyP` |

**Impacto:** Cualquier persona con acceso al repositorio tiene acceso total a todos los sistemas.

---

### CRÍTICO - CORS Completamente Abierto
Todos los endpoints responden con:
```php
header("Access-Control-Allow-Origin: *");
```
Cualquier dominio puede hacer peticiones autenticadas a esta API desde un navegador.

---

### ALTO - Autenticación Débil o Inexistente
- `autenticacion.php` delega validación a otra URL externa mediante `curl` con el token recibido por GET — sin validación local.
- `autenticacion2.php` tiene la lógica de validación comentada.
- No hay middleware de autenticación centralizado; cada endpoint decide (o no) si validar.
- No hay protección CSRF.

---

### ALTO - Sin Validación de Entrada
- `$_REQUEST` se usa directamente en queries y lógica de negocio sin sanitizar.
- Las funciones en `generic_functions.php` (`validar_correo`, `validar_nombre`, `eliminar_simbolos`) son superficiales y no previenen inyecciones.
- `file_get_contents('php://input')` se lee sin límite de tamaño (riesgo de DoS por payload gigante).

---

### MEDIO - Gestión de Archivos Insegura
- `generatePDFv2.php` y `multiorderPDF.php` escriben archivos en `/log/` sin validar rutas ni tipos.
- `multiorderPDF.php` decodifica base64 directamente y lo escribe a disco.
- `unlink()` se usa sin validación de ruta.

---

### MEDIO - Errores Expuestos y Debug en Producción
```php
error_reporting(0);           // silencia errores — no se registran en ningún lado
$DBi->debug = true;           // expone queries completas en la respuesta HTTP
```
Combinación que ni protege ni informa: los errores desaparecen en lugar de loguearse.

---

## 4. Rendimiento

### Queries N+1 y Subconsultas Anidadas
`crm_clientesDAO.php` ejecuta múltiples `SELECT COUNT(*)` como subconsultas dentro de `CASE WHEN` para cada fila del resultado. Con cientos de clientes, esto resulta en miles de queries.

```sql
CASE 
    WHEN (SELECT COUNT(*) FROM famovdet, famov WHERE ...) > 0 
     AND (SELECT COUNT(*) FROM famovdet, famov WHERE ...) > 0
    THEN 'No aplica'
```

### Ausencia de Caché
No existe ninguna capa de caché:
- Sin Redis ni Memcached
- Sin caché HTTP (no hay headers `Cache-Control` ni `ETag`)
- Sin memoización de resultados frecuentes

### Límites Sin Control
```php
ini_set('memory_limit', '-1');  // memoria ilimitada — un request puede agotar el servidor
```
Presente en múltiples archivos. Un request con datos grandes puede consumir toda la RAM disponible.

### LIKE '%texto%' — Full Table Scan
Queries como `WHERE nombre LIKE '%texto%'` impiden el uso de índices y hacen escaneo completo de tabla.

### Transacciones Sin Timeout
```php
$DBi->Execute("begin work;");
// ... operaciones que pueden fallar sin manejo de error
$DBi->Execute("commit work;");
```
Sin manejo de errores entre begin y commit, una falla puede dejar transacciones abiertas indefinidamente.

---

## 5. Mantenimiento

### Duplicación de Librerías
- Tres versiones de JWT: `/lib/jwt-master/`, `/php-jwt-master/`, `/php-jwt-master2/`
- Dos versiones de PHPMailer: `/lib/mailer/`, `/phpmailer6/`
No está claro cuál es la canónica en cada módulo.

### Sin Gestor de Dependencias
No hay `composer.json`. Las dependencias se gestionan copiando directorios manualmente, lo que hace difícil actualizar librerías con vulnerabilidades conocidas.

### Sin Tests Automatizados
No existe ningún directorio de tests, ni unitarios ni de integración. Cualquier cambio solo puede validarse manualmente.

### Sin Logging Centralizado
- Algunos módulos escriben a archivos de texto en `/log/` con `generarLog.php`
- Otros silencian todos los errores con `error_reporting(0)`
- No hay integración con ningún sistema centralizado (Sentry, CloudWatch, etc.)

### Código Procedimental Repetido
Cada endpoint repite el mismo bloque de inicialización:
```php
header("Access-Control-Allow-Origin: *");
setlocale(LC_ALL, "es_CO");
require_once '../lib/conexionDB.php';
$metodo = $_SERVER['REQUEST_METHOD'];
```
Sin un front controller ni middleware, cualquier cambio transversal requiere modificar 30+ archivos.

### Sin Versionado de API
No existe `/v1/`, `/v2/`. Cambios en endpoints rompen clientes existentes sin posibilidad de deprecar gradualmente.

---

## 6. Buenas Prácticas Identificadas

- **Patrón DAO**: La separación entre lógica de acceso a datos y endpoints es un paso en la dirección correcta, aunque la implementación tiene fallas graves de seguridad.
- **ADODB**: El uso de una capa de abstracción de BD facilita (en teoría) cambiar el motor de base de datos.
- **Respuestas JSON consistentes**: La función `render()` estandariza el formato de respuesta en varios módulos.
- **Estructura modular por dominio**: La organización en subdirectorios por módulo (invoices, contifico, pcpk, etc.) separa responsabilidades a nivel de sistema de archivos.
- **Uso de HTTPS en integraciones externas**: Los endpoints de ATW+, Azure y Contifico usan HTTPS.

---

## 7. Malas Prácticas Identificadas

| Práctica | Archivos Afectados | Severidad |
|---|---|---|
| SQL por concatenación de strings | 72 DAOs | Crítica |
| Credenciales en código fuente | 11+ archivos | Crítica |
| `Access-Control-Allow-Origin: *` | 33+ endpoints | Alta |
| `$_REQUEST` sin sanitizar en queries | Todos los endpoints | Alta |
| `ini_set('memory_limit', '-1')` | Múltiples archivos | Alta |
| `$DBi->debug = true` en producción | Varios archivos | Media |
| `error_reporting(0)` sin log alternativo | Múltiples archivos | Media |
| Librerías duplicadas sin gestor | `/lib/` | Media |
| Sin front controller / middleware | Arquitectura global | Media |
| Lógica de negocio en endpoints | 33 archivos raíz | Baja |
| Sin paginación en queries | DAOs | Baja |

---

## 8. Opciones de Mejora

### Inmediatas (Seguridad Crítica)

1. **Rotar todas las credenciales comprometidas** — Las credenciales de AWS, DB, SMTP, Contifico y Azure deben rotarse de inmediato y nunca volver al repositorio. Usar variables de entorno o un gestor de secretos (AWS Secrets Manager, HashiCorp Vault).

2. **Prepared Statements en todos los DAOs** — Reemplazar concatenación SQL con parámetros preparados usando ADODB:
   ```php
   // En lugar de:
   $sql = "SELECT * FROM cli WHERE nit = '" . $nit . "'";
   // Usar:
   $sql = "SELECT * FROM cli WHERE nit = ?";
   $result = $db->Execute($sql, [$nit]);
   ```

3. **Restringir CORS** — Cambiar `*` por los dominios de frontend autorizados:
   ```php
   header("Access-Control-Allow-Origin: https://app.automundial.com.co");
   ```

4. **Middleware de autenticación centralizado** — Un solo archivo que valide el token JWT antes de ejecutar cualquier lógica de negocio.

### Corto Plazo (Arquitectura y Mantenimiento)

5. **Introducir Composer** — Gestionar todas las dependencias (PHPMailer, JWT, ADODB) con `composer.json`. Eliminar copias duplicadas de librerías.

6. **Front Controller** — Un `index.php` único que enrute todas las peticiones. Elimina la repetición de headers y configuración en cada archivo.

7. **Logging centralizado** — Integrar Monolog o un handler hacia CloudWatch/Sentry. Eliminar `error_reporting(0)`.

8. **Validación de entrada con esquema** — Usar una librería de validación (como Respect/Validation) en los endpoints que reciben parámetros del usuario.

9. **Eliminar `memory_limit = -1`** — Establecer un límite razonable (512M) y optimizar las queries que lo requieran.

### Mediano Plazo (Calidad y Rendimiento)

10. **Migrar a un framework moderno** — Laravel o Slim Framework darían: routing, middleware, ORM con protección automática contra SQL injection, manejo de errores, y testing integrado.

11. **Caché de queries frecuentes** — Redis para resultados de consultas costosas (listas de clientes, catálogos de artículos).

12. **Paginación en todos los endpoints de listado** — Ningún endpoint devuelve conjuntos grandes de datos con paginación. Puede resultar en timeouts y respuestas de megabytes.

13. **Refactorizar subconsultas N+1** — Los `CASE WHEN (SELECT COUNT(*) ...)` en `crm_clientesDAO.php` deben reemplazarse por JOINs o vistas materializadas.

14. **Versionado de API** — Introducir prefijo `/v1/` para poder evolucionar la API sin romper clientes existentes.

15. **Tests automatizados** — Al menos tests de integración para los endpoints críticos (autenticación, facturación, estados de cuenta).

---

## 9. Resumen Ejecutivo

| Dimensión | Calificación | Comentario |
|---|---|---|
| **Seguridad** | 1/10 | SQL Injection generalizado + credenciales expuestas = compromiso total del sistema |
| **Arquitectura** | 3/10 | Patrón DAO presente pero sin framework, front controller, ni separación real |
| **Rendimiento** | 4/10 | Funcional para carga baja, colapsaría con carga media por N+1 y sin caché |
| **Mantenimiento** | 3/10 | Sin tests, sin gestor de dependencias, lógica duplicada en 30+ archivos |
| **Funcionalidad** | 7/10 | Cubre el dominio de negocio; las integraciones externas son amplias |

**Prioridad absoluta:** Rotar credenciales comprometidas y corregir SQL Injection antes de cualquier otro trabajo.
