# 🚀 WSCONCILIA API Laravel

## 📖 Descripción

Este proyecto migra completamente la funcionalidad de los archivos PHP originales (`ObtenCiudades.php` y `ObtenEmpresas.php`) a una API Laravel moderna, estructurada y escalable. La migración mantiene la compatibilidad con los procedimientos almacenados existentes mientras añade las ventajas del framework Laravel.

## 🎯 Objetivos de la Migración

- ✅ **Modernización:** De archivos PHP individuales a framework Laravel estructurado
- ✅ **Escalabilidad:** Arquitectura preparada para crecimiento futuro
- ✅ **Mantenibilidad:** Código organizado siguiendo patrones MVC
- ✅ **Compatibilidad:** Mantiene procedimientos almacenados existentes
- ✅ **Documentación:** API autodocumentada y endpoints claros

## 🔧 Especificaciones Técnicas

### **Framework y Versiones**
- **Laravel:** 12.x
- **PHP:** >= 8.1
- **Base de datos:** SQL Server
- **Driver:** sqlsrv (Microsoft SQL Server)

### **Configuración de Base de Datos Original**
```php
// Migrado desde config.php
$serverName = "10.201.84.3"; // SQL Server
$connectionOptions = [
    "Database" => "personal",
    "Uid" => "sysdev", 
    "PWD" => "tRGtXNNW1DaT",
    "CharacterSet" => "UTF-8"
];
```

### **Configuración Laravel (.env)**
```env
# Aplicación
APP_NAME=WSCONCILIA-API
APP_ENV=local
APP_DEBUG=true
APP_LOCALE=es
APP_FALLBACK_LOCALE=es

# Base de Datos SQL Server
DB_CONNECTION=sqlsrv
DB_HOST=10.201.84.3
DB_PORT=1433
DB_DATABASE=personal
DB_USERNAME=sysdev
DB_PASSWORD=tRGtXNNW1DaT
```

## 📋 Requisitos del Sistema

### **Software Requerido**
- PHP >= 8.1 con extensiones:
  - `pdo_sqlsrv` (SQL Server)
  - `sqlsrv` (Microsoft SQL Server)
  - `mbstring`
  - `xml`
  - `json`
- Composer (gestor de dependencias PHP)
- SQL Server (accesible desde 10.201.84.3)

### **Dependencias Laravel**
```json
{
    "require": {
        "laravel/framework": "^12.0",
        "doctrine/dbal": "^4.3"
    }
}
```

## 🚀 Instalación y Configuración

### **1. Preparación del Entorno**
```bash
# Clonar o navegar al proyecto
cd /home/xesar/Documents/WSCONCILIA-Laravel

# Verificar archivos principales
ls -la app/Http/Controllers/Api/
ls -la app/Models/
```

### **2. Instalación de Dependencias**
```bash
# Instalar dependencias de Composer
composer install

# Verificar instalación de doctrine/dbal (para SQL Server)
composer show doctrine/dbal
```

### **3. Configuración de Variables de Entorno**
```bash
# El archivo .env ya está configurado con:
cat .env | grep -E "DB_|APP_NAME"
```

### **4. Verificación de Configuración**
```bash
# Verificar configuración (sin conectar a BD)
php artisan config:show database.connections.sqlsrv
```

## 🗂 Arquitectura del Proyecto

### **Estructura de Directorios**
```
WSCONCILIA-Laravel/
├── 📁 app/
│   ├── 📁 Http/
│   │   ├── 📁 Controllers/
│   │   │   └── 📁 Api/
│   │   │       ├── 📄 CiudadesController.php
│   │   │       └── 📄 EmpresasController.php
│   │   └── 📁 Middleware/
│   │       └── 📄 CorsMiddleware.php
│   └── 📁 Models/
│       ├── 📄 Ciudad.php
│       └── 📄 Empresa.php
├── 📁 config/
│   └── 📄 wsconcilia.php (configuración personalizada)
├── 📁 routes/
│   └── 📄 api.php (rutas de la API)
├── 📄 .env (configuración de entorno)
├── 📄 README.md (esta documentación)
└── 📄 test-api.sh (script de pruebas)
```

### **Componentes Principales**

#### **�� Controladores API**

**CiudadesController.php**
```php
// Migrado desde ObtenCiudades.php
- obtenerCiudades() → EXEC sapObtenListadoCiudadesxNombre
- obtenerCiudadesAlternativo() → Query Builder alternativo
```

**EmpresasController.php**
```php
// Migrado desde ObtenEmpresas.php  
- obtenerEmpresas() → EXEC sapObtenEmpresas
- obtenerEmpresasAlternativo() → Query Builder alternativo
- obtenerEmpresaPorId(int $id) → Funcionalidad adicional
```

#### **🗄 Modelos Eloquent**

**Ciudad.php**
```php
// Modelo para tabla ciudades
- $fillable: ['nombre', 'codigo', 'estado_id', 'activo']
- scopeActivas(): Solo ciudades activas
```

**Empresa.php**
```php
// Modelo para tabla empresas
- $fillable: ['nombre', 'rfc', 'direccion', 'telefono', 'email', 'activo']
- scopeActivas(): Solo empresas activas
```

## 🌐 Endpoints de la API

### **📍 Rutas Principales**

| Método | Endpoint | Descripción | Origen |
|--------|----------|-------------|--------|
| `GET` | `/api/health` | Estado de salud del API | Nuevo |
| `GET` | `/api/info` | Información y documentación del API | Nuevo |

### **📍 Rutas de Ciudades (v1)**

| Método | Endpoint | Descripción | Origen |
|--------|----------|-------------|--------|
| `GET` | `/api/v1/ciudades` | Obtener ciudades (SP) | `ObtenCiudades.php` |
| `GET` | `/api/v1/ciudades-alt` | Obtener ciudades (Query Builder) | Nuevo |

### **📍 Rutas de Empresas (v1)**

| Método | Endpoint | Descripción | Origen |
|--------|----------|-------------|--------|
| `GET` | `/api/v1/empresas` | Obtener empresas (SP) | `ObtenEmpresas.php` |
| `GET` | `/api/v1/empresas-alt` | Obtener empresas (Query Builder) | Nuevo |
| `GET` | `/api/v1/empresas/{id}` | Obtener empresa por ID | Nuevo |

### **📊 Formato de Respuesta**

**Respuesta Exitosa** (mantiene formato original):
```json
{
    "tipo": 0,
    "mensaje": "OK", 
    "data": [
        {
            "id": 1,
            "nombre": "Ciudad Ejemplo",
            "codigo": "CE001"
        }
    ]
}
```

**Respuesta de Error**:
```json
{
    "tipo": 1,
    "mensaje": "Descripción del error específico",
    "data": []
}
```

## 🔄 Mapeo de Migración

### **Archivo → Controlador**

#### **ObtenCiudades.php → CiudadesController.php**
```php
// ORIGINAL (ObtenCiudades.php)
$sql = "{CALL sapObtenListadoCiudadesxNombre}";
$stmt = sqlsrv_query($conn, $sql);
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
    $data[] = $row;
}

// MIGRADO (CiudadesController.php)
public function obtenerCiudades(): JsonResponse {
    $ciudades = DB::select('EXEC sapObtenListadoCiudadesxNombre');
    return response()->json([
        "tipo" => 0,
        "mensaje" => "OK",
        "data" => $ciudades
    ]);
}
```

#### **ObtenEmpresas.php → EmpresasController.php**
```php
// ORIGINAL (ObtenEmpresas.php)
$sql = "{CALL sapObtenEmpresas}";
$stmt = sqlsrv_query($conn, $sql);
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
    $data[] = $row;
}

// MIGRADO (EmpresasController.php)
public function obtenerEmpresas(): JsonResponse {
    $empresas = DB::select('EXEC sapObtenEmpresas');
    return response()->json([
        "tipo" => 0,
        "mensaje" => "OK", 
        "data" => $empresas
    ]);
}
```

### **Mejoras Implementadas**

1. **Manejo de Errores Mejorado:**
   ```php
   // Original: die(json_encode(["error" => sqlsrv_errors()]));
   // Nuevo: try-catch con respuestas HTTP apropiadas
   ```

2. **Alternativas con Query Builder:**
   ```php
   // Nuevo método alternativo sin procedimientos almacenados
   DB::table('ciudades')->select('*')->orderBy('nombre')->get();
   ```

3. **Middleware CORS:**
   ```php
   // Configurado para acceso desde frontend
   'Access-Control-Allow-Origin' => '*'
   ```

## 🧪 Testing y Pruebas

### **�� Verificación Sin Conexión a BD**
```bash
# Verificar estructura del proyecto
php artisan route:list --path=api

# Comprobar configuración
php artisan config:show database.connections.sqlsrv
```

### **🚀 Iniciar Servidor de Desarrollo**
```bash
# Iniciar servidor Laravel (puerto 8000)
php artisan serve

# Verificar que el servidor esté funcionando
curl http://localhost:8000/api/health
```

### **📋 Script de Pruebas Automatizado**
```bash
# Ejecutar script de pruebas completo
./test-api.sh

# Contenido del script:
# - Prueba /api/health
# - Prueba /api/info  
# - Prueba /api/v1/ciudades
# - Prueba /api/v1/empresas
```

### **🔧 Pruebas Manuales con cURL**
```bash
# Estado de salud
curl -X GET http://localhost:8000/api/health

# Información del API
curl -X GET http://localhost:8000/api/info

# Ciudades (cuando tengas conexión DB)
curl -X GET http://localhost:8000/api/v1/ciudades

# Empresas (cuando tengas conexión DB)
curl -X GET http://localhost:8000/api/v1/empresas

# Empresa específica
curl -X GET http://localhost:8000/api/v1/empresas/1
```

## ⚙ Configuración Avanzada

### **🔐 Configuración de Seguridad**
```php
// config/wsconcilia.php
'cors' => [
    'allowed_origins' => ['*'], // Cambiar en producción
    'allowed_methods' => ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
    'allowed_headers' => ['Content-Type', 'Authorization', 'X-Requested-With'],
]
```

### **📊 Configuración de Base de Datos**
```php
// config/wsconcilia.php  
'database' => [
    'stored_procedures' => [
        'ciudades' => 'sapObtenListadoCiudadesxNombre',
        'empresas' => 'sapObtenEmpresas',
    ],
]
```

### **📝 Logging y Monitoreo**
```php
// Los logs se guardan automáticamente en:
// storage/logs/laravel.log

// Para ver logs en tiempo real:
tail -f storage/logs/laravel.log
```

## 🚦 Estados del Proyecto

### **✅ Completado y Funcional:**
- [x] Migración completa de controladores
- [x] Configuración de rutas API versionadas
- [x] Modelos Eloquent preparados
- [x] Middleware CORS configurado
- [x] Manejo de errores estructurado
- [x] Documentación completa
- [x] Scripts de prueba automatizados
- [x] Configuración SQL Server lista

### **⏳ Pendiente (Requiere Conexión a BD):**
- [ ] Testing de procedimientos almacenados reales
- [ ] Validación de estructura de tablas existentes
- [ ] Optimización de consultas según datos reales
- [ ] Configuración de cache para consultas frecuentes

### **🔮 Mejoras Futuras Sugeridas:**
- [ ] Autenticación API (Sanctum/Passport)
- [ ] Rate limiting para endpoints
- [ ] Paginación para grandes conjuntos de datos
- [ ] Validación de requests con Form Requests
- [ ] Tests unitarios automatizados (PHPUnit)

## 🛠 Comandos Útiles

### **🔄 Artisan Commands**
```bash
# Ver todas las rutas
php artisan route:list

# Limpiar cache de configuración
php artisan config:clear

# Ver configuración actual
php artisan config:show

# Generar clave de aplicación
php artisan key:generate

# Información del entorno
php artisan about
```

### **📦 Composer Commands**
```bash
# Actualizar dependencias
composer update

# Ver paquetes instalados
composer show

# Autoload classes
composer dump-autoload
```

## 🔧 Solución de Problemas

### **❌ Problemas Comunes y Soluciones**

**1. Error de extensión sqlsrv:**
```bash
# Instalar extensión SQL Server para PHP
sudo apt-get install php8.1-sqlsrv php8.1-pdo-sqlsrv
```

**2. Error de permisos:**
```bash
# Dar permisos a directorios de Laravel
chmod -R 755 storage bootstrap/cache
```

**3. Error de conexión a BD:**
```bash
# Verificar configuración sin conectar
php artisan tinker
>>> config('database.connections.sqlsrv')
```

**4. Error de CORS:**
```bash
# Verificar middleware CORS
php artisan route:list --middleware=cors
```

## 📞 Información de Contacto y Soporte

### **📊 Configuración Original Migrada:**
```
Servidor: 10.201.84.3 (SQL Server)
Base de datos: personal  
Usuario: sysdev
Puerto: 1433 (estándar SQL Server)
```

### **🔗 URLs del API en Desarrollo:**
```
Base URL: http://localhost:8000/api
Health Check: http://localhost:8000/api/health
Documentación: http://localhost:8000/api/info
```

## 📚 Referencias y Documentación

- **Laravel Documentation:** https://laravel.com/docs
- **SQL Server PHP Drivers:** https://docs.microsoft.com/en-us/sql/connect/php/
- **Laravel API Resources:** https://laravel.com/docs/eloquent-resources
- **Doctrine DBAL:** https://www.doctrine-project.org/projects/dbal.html

---

## 📋 Checklist de Implementación

### **Para el Desarrollador:**
- [x] ✅ Proyecto Laravel creado y configurado
- [x] ✅ Controladores migrados con lógica original
- [x] ✅ Rutas API estructuradas y versionadas  
- [x] ✅ Modelos Eloquent preparados
- [x] ✅ Configuración SQL Server lista
- [x] ✅ Middleware CORS configurado
- [x] ✅ Documentación completa generada
- [x] ✅ Scripts de prueba creados

### **Para Testing (Cuando tengas conexión):**
- [ ] ⏳ Probar conexión a SQL Server
- [ ] ⏳ Verificar procedimientos almacenados
- [ ] ⏳ Testear endpoints con datos reales
- [ ] ⏳ Validar respuestas JSON
- [ ] ⏳ Comprobar manejo de errores

### **Para Producción:**
- [ ] 🔮 Configurar variables de entorno de producción
- [ ] 🔮 Implementar autenticación API
- [ ] 🔮 Configurar CORS específicos
- [ ] 🔮 Optimizar consultas de base de datos
- [ ] 🔮 Implementar logging avanzado

---

**🎯 Proyecto migrado exitosamente de PHP vanilla a Laravel API**
**📅 Fecha de migración:** 12 de septiembre de 2025
**🔧 Estado:** Listo para testing con conexión a base de datos
