2025-09-12 13:06:36 -07:00

507 lines
13 KiB
Markdown
Raw Permalink Blame History

# 🚀 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**
#### **<2A><> 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
### **<2A><> 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