# Scripts de Migración de Base de Datos - Módulo Tarjetas

Scripts organizados para desplegar el módulo de tarjetas en una nueva base de datos SQL Server.

## Orden de Ejecución

| # | Archivo | Descripción |
|---|---------|-------------|
| 0 | `00_setup_linked_server.sql` | Opcional: Configura el Link a MySQL## 📁 Estructura de Scripts

### 🏗️ Scripts de Despliegue (01-11)
- `00_setup_linked_server.sql` - Configuración de Linked Server a MySQL
- `01_tablas.sql` - Creación de tablas principales del módulo de tarjetas
- `02_stored_procedures.sql` - Stored procedures de negocio del sistema
- `03_vistas.sql` - Vistas simplificadas para consultas
- `04_datos_productos.sql` - Migración de productos desde MySQL
- `05_datos_canales.sql` - Migración de canales desde MySQL
- `06_datos_iniciales.sql` - Datos de prueba para desarrollo
- `07_indices.sql` - Índices para optimización de rendimiento
- `08_permisos.sql` - Roles y permisos de seguridad
- `09_mantenimiento.sql` - Procedimientos de mantenimiento
- `10_validacion_tarjetas.sql` - SP de validación de tarjetas
- `11_tests_validacion.sql` - Tests completos de validación

### 🛠️ Scripts de Desarrollo (carpeta `../scripts/`)
- `debug_tipos_datos.sql` - Análisis de tipos de datos y debugging
- `test_validacion_sp.sql` - Pruebas específicas del SP de validación completo |

## Notas Importantes

- Ejecutar en el orden indicado (tablas → SPs → vistas → datos → índices → permisos → mantenimiento → validación)
- Los scripts son **idempotentes** (usan `IF NOT EXISTS` / `IF OBJECT_ID`)
- Base de datos destino: `Sis2000` (cambiar el `USE` si es diferente)
- Los scripts 04 y 05 dependen del linked server MySQL (`MYSQL_QA`)
- Scripts 6-10 son opcionales pero recomendados para producción

## Scripts Nuevos (Agregados)

### **06_datos_iniciales.sql**
- Datos de prueba para desarrollo
- Canales de ejemplo
- Lotes de prueba (Vida, RCV)
- Tarjetas de ejemplo con códigos únicos
- Factura de prueba

### **07_indices.sql**
- Índices únicos para `xcodigo_unico` y `nro_tarjeta`
- Índices de rendimiento para consultas frecuentes
- Índices compuestos para búsquedas combinadas
- Estadísticas para optimización del query optimizer

### **08_permisos.sql**
- Roles de seguridad: `rol_app_tarjetas`, `rol_tarjetas_readonly`, `rol_tarjetas_admin`
- Usuarios de ejemplo: `user_app_tarjetas`, `user_reportes_tarjetas`, `user_admin_tarjetas`
- Permisos granulares por rol
- Denegación de permisos peligrosos

### **09_mantenimiento.sql**
- Procedimiento `sp_LimpiarLogsAntiguos` para limpieza automática
- Procedimiento `sp_ArchivarTarjetasInactivas` para archivado
- Procedimiento `sp_ObtenerEstadisticasSistema` para monitoreo
- Procedimiento `sp_OptimizarBaseDatos` para mantenimiento de índices
- Tabla `taconfig_mantenimiento` para configuración

### **10_validacion.sql**
- Tests completos de estructura y funcionalidad
- Validación de integridad de datos
- Verificación de permisos e índices
- Tests de funcionalidad básica
- Reporte detallado de resultados

## Comandos de Ejecución

### **Ejecución Completa (Producción):**
```sql
-- 1. Configurar linked server (si es necesario)
-- :r 00_setup_linked_server.sql

-- 2. Estructura base
-- :r 01_tablas.sql
-- :r 02_stored_procedures.sql
-- :r 03_vistas.sql

-- 3. Datos iniciales (requiere MySQL link)
-- :r 04_datos_productos.sql
-- :r 05_datos_canales.sql
-- :r 06_datos_iniciales.sql

-- 4. Optimización y seguridad
-- :r 07_indices.sql
-- :r 08_permisos.sql

-- 5. Mantenimiento y validación
-- :r 09_mantenimiento.sql
-- :r 10_validacion.sql
```

### **Ejecución Mínima (Desarrollo):**
```sql
-- Solo estructura básica
-- :r 01_tablas.sql
-- :r 02_stored_procedures.sql
-- :r 03_vistas.sql
-- :r 06_datos_iniciales.sql
-- :r 10_validacion.sql
```

## Verificación Post-Instalación

Después de ejecutar todos los scripts, verificar:

```sql
-- 1. Validación completa
EXEC 10_validacion.sql;

-- 2. Estadísticas del sistema
EXEC sp_ObtenerEstadisticasSistema;

-- 3. Datos de prueba
SELECT COUNT(*) AS total_tarjetas FROM tatarjeta;
SELECT COUNT(*) AS total_lotes FROM tatarlot;
SELECT COUNT(*) AS total_facturas FROM tafactura;
```

## Mantenimiento Programado

Configurar jobs SQL Server para:

```sql
-- Limpieza de logs (diaria)
EXEC sp_LimpiarLogsAntiguos @p_dias_retencion = 90;

-- Archivado de inactivas (semanal)
EXEC sp_ArchivarTarjetasInactivas @p_dias_inactividad = 365;

-- Optimización (semanal)
EXEC sp_OptimizarBaseDatos;
```

## Troubleshooting

### **Errores Comunes:**
1. **Linked Server no configurado:** Ejecutar `00_setup_linked_server.sql` primero
2. **Permisos insuficientes:** Ejecutar como usuario con privilegios de sysadmin
3. **Base de datos incorrecta:** Cambiar `USE [Sis2000]` al nombre correcto
4. **MySQL no disponible:** Omitir scripts 04 y 05 si no hay acceso a MySQL

### **Validación de Instalación:**
```sql
-- Verificar todos los objetos creados
SELECT 
    'TABLE' AS type, name, create_date, modify_date
FROM sys.tables 
WHERE name LIKE 'ta%'
UNION ALL
SELECT 
    'VIEW' AS type, name, create_date, modify_date
FROM sys.views 
WHERE name = 'mavcanal'
UNION ALL
SELECT 
    'PROCEDURE' AS type, name, create_date, modify_date
FROM sys.procedures 
WHERE name LIKE 'sp_%' AND name LIKE '%tarjeta%' OR name LIKE '%lote%'
ORDER BY type, name;
```
