# TEMPLATE: CAMBIAR ENRUTAMIENTO DE LLAMADAS
# Fecha: _____________
# Servicio(s) afectado(s): _____________
# Tipo de cambio: [ ] Prioridades [ ] Desvío [ ] Distribución [ ] Otro: _____________

## DESCRIPCIÓN DEL CAMBIO

### Situación actual:
_________________________________
_________________________________

### Situación deseada:
_________________________________
_________________________________

## TIPOS DE CAMBIO DE ENRUTAMIENTO

### TIPO 1: CAMBIAR ORDEN/PRIORIDAD DE AGENTES

#### Servicio: _______________
#### Orden actual: _______________
#### Orden nuevo: _______________

**Implementación:**
```sql
-- Verificar configuración actual
SELECT numero, prio2 FROM [TABLA_SERVICIOS] WHERE numero = '_______________';

-- Actualizar orden
UPDATE [TABLA_SERVICIOS] 
SET prio2 = '_______________'  -- Nueva lista: 324,350,355
WHERE numero = '_______________';

-- Verificar cambio
SELECT numero, prio2 FROM [TABLA_SERVICIOS] WHERE numero = '_______________';
```

### TIPO 2: DESVÍO COMPLETO A OTRO SERVICIO

#### Servicio origen: _______________
#### Servicio destino: _______________
#### Duración del desvío: [ ] Permanente [ ] Temporal hasta: _______________

**Implementación Opción A - En Python:**
```python
# En trunk_processor.py, agregar al inicio de process()
service_redirects = {
    '_______________': '_______________',  # origen: destino
}

if self.service_number in service_redirects:
    self.service_number = service_redirects[self.service_number]
    self.log_processor_step("REDIRECT", 
                           f"Redirigiendo a {self.service_number}")
```

**Implementación Opción B - En Dialplan:**
```asterisk
; En extensions.conf, contexto [from-trunk]
exten => _______________,1,Goto(from-trunk,_______________,1)
```

### TIPO 3: DISTRIBUCIÓN POR PORCENTAJE

#### Servicio: _______________
#### Distribución deseada:
- Agente _______________: _____%
- Agente _______________: _____%
- Agente _______________: _____%

**Implementación:**
```python
# En trunk_processor.py
import random

def distribute_by_percentage(self, agents_list):
    """Distribuye llamadas por porcentaje"""
    distribution = {
        '_______________': _____,  # 50%
        '_______________': _____,  # 30%
        '_______________': _____,  # 20%
    }
    
    rand = random.randint(1, 100)
    cumulative = 0
    
    for agent, percentage in distribution.items():
        cumulative += percentage
        if rand <= cumulative:
            return agent
    
    return agents_list[0]  # Fallback
```

### TIPO 4: ENRUTAMIENTO POR TIPO DE LLAMANTE

#### Criterio: [ ] Prefijo [ ] Lista blanca [ ] Lista negra [ ] Otro: _______________

**Para prefijos específicos:**
```python
# En trunk_processor.py
def route_by_caller_prefix(self):
    """Enruta según prefijo del llamante"""
    caller = self.agi.get_variable('CALLERID(num)')
    
    # Móviles a un grupo específico
    if caller.startswith(('6', '7')):
        return ['350', '355']  # Solo estos agentes
    # Fijos a otro grupo
    elif caller.startswith(('9', '8')):
        return ['324', '325']
    
    return self.get_all_agents()  # Default
```

**Para lista blanca/negra:**
```sql
-- Crear tabla si no existe
CREATE TABLE IF NOT EXISTS caller_lists (
    id INT AUTO_INCREMENT PRIMARY KEY,
    phone_number VARCHAR(20),
    list_type ENUM('whitelist', 'blacklist', 'vip'),
    service_number VARCHAR(20),
    preferred_agents VARCHAR(200),
    notes TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_phone_service (phone_number, service_number)
);

-- Agregar números a lista
INSERT INTO caller_lists (phone_number, list_type, service_number, preferred_agents)
VALUES 
    ('_______________', 'vip', '_______________', '324'),
    ('_______________', 'blacklist', '_______________', NULL);
```

### TIPO 5: ENRUTAMIENTO POR SKILLS/IDIOMA

#### Configuración de skills:
- Skill: _______________ → Agentes: _______________
- Skill: _______________ → Agentes: _______________

**Implementación:**
```sql
-- Crear tabla de skills si no existe
CREATE TABLE IF NOT EXISTS agent_skills (
    id INT AUTO_INCREMENT PRIMARY KEY,
    agent_code VARCHAR(10),
    skill VARCHAR(50),
    level INT DEFAULT 1,
    active TINYINT DEFAULT 1,
    INDEX idx_agent_skill (agent_code, skill)
);

-- Asignar skills
INSERT INTO agent_skills (agent_code, skill, level) VALUES
    ('_______________', 'english', 5),
    ('_______________', 'tarot_visa', 3),
    ('_______________', 'astrologia', 4);
```

```python
# En trunk_processor.py
def get_agents_by_skill(self, skill):
    """Obtiene agentes con skill específico"""
    sql = """
    SELECT DISTINCT a.usuario
    FROM agentes a
    JOIN agent_skills s ON a.usuario = s.agent_code
    WHERE s.skill = %s
    AND s.active = 1
    AND a.activo = 1
    AND a.estado_login = 1
    ORDER BY s.level DESC, a.orden_display
    """
    return self.execute_db_query(sql, (skill,))
```

### TIPO 6: COLA CON ESTRATEGIA ESPECÍFICA

#### Estrategia: [ ] Ring all [ ] Round robin [ ] Least recent [ ] Fewest calls

**Crear cola en Asterisk:**
```bash
# En /etc/asterisk/queues.conf
cat >> /etc/asterisk/queues.conf << EOF

[queue________________]
strategy = _______________ ; ringall, roundrobin, leastrecent, fewestcalls
timeout = 30
retry = 5
maxlen = 50
joinempty = yes
leavewhenempty = no
ringinuse = no

; Miembros estáticos
member => Local/_______________@agent-dial,0,_______________ 
member => Local/_______________@agent-dial,0,_______________
EOF

# Recargar colas
asterisk -rx "queue reload all"
```

## PASOS DE IMPLEMENTACIÓN

### 1. ANÁLISIS Y BACKUP
```bash
# Ejecutado por: _______________ Fecha/Hora: _______________

# Backup de configuración actual
mysqldump -u asteriskuser -p asterisk [TABLA_SERVICIOS] > \
    backup_servicios_$(date +%Y%m%d_%H%M%S).sql

# Backup de código si se modifica
cp /var/lib/asterisk/agi-bin/call_system/processors/trunk_processor.py \
   trunk_processor.py.backup_$(date +%Y%m%d_%H%M%S)

# Documentar estado actual
echo "=== ESTADO ACTUAL $(date) ===" > cambio_enrutamiento_$(date +%Y%m%d).log
mysql -u asteriskuser -p asterisk -e "SELECT * FROM [TABLA_SERVICIOS] WHERE numero='_______________'" >> cambio_enrutamiento_$(date +%Y%m%d).log
```

### 2. IMPLEMENTAR CAMBIOS
```bash
# Según el tipo de cambio elegido arriba
# Copiar y ejecutar los comandos correspondientes
```

### 3. PRUEBAS

#### Test 1: Verificar configuración
```sql
-- Verificar cambios en BD
SELECT * FROM [TABLA_SERVICIOS] WHERE numero = '_______________';

-- Si hay listas especiales
SELECT * FROM caller_lists WHERE service_number = '_______________';

-- Si hay skills
SELECT * FROM agent_skills WHERE agent_code IN ('_______________');
```

#### Test 2: Llamada de prueba con trazabilidad
```bash
# Activar debug detallado
echo "SET GLOBAL log_level = 'DEBUG'" | mysql -u asteriskuser -p asterisk

# En una terminal, monitorear logs
tail -f /var/log/asterisk/python_call_system.log | grep -E "(ROUTING|_______________)"

# En otra terminal, hacer llamada
asterisk -rx "originate Local/_______________@from-trunk application Playback demo-congrats"
```

#### Test 3: Verificar distribución
```bash
# Script para verificar distribución real
cat > /tmp/test_routing.sh << 'EOF'
#!/bin/bash
for i in {1..10}; do
    echo "=== Prueba $i ==="
    asterisk -rx "originate Local/_______________@from-trunk application Playback demo-congrats" &
    sleep 2
done
wait
echo "Verificar en logs a qué agentes se enviaron las llamadas"
EOF

chmod +x /tmp/test_routing.sh
/tmp/test_routing.sh
```

### 4. MONITOREO INICIAL (Primeras 2 horas)

```bash
# Monitor en tiempo real
watch -n 5 'mysql -u asteriskuser -p asterisk -e "
SELECT 
    a.agent_code,
    a.agent_name,
    COUNT(*) as calls_received,
    AVG(TIMESTAMPDIFF(SECOND, a.start_time, a.end_time)) as avg_duration
FROM active_agent_calls a
WHERE a.service_number = '\''_______________'\''
AND a.start_time > NOW() - INTERVAL 2 HOUR
GROUP BY a.agent_code
ORDER BY calls_received DESC"'
```

## VALIDACIONES POST-CAMBIO

### Inmediatas (primeros 30 minutos):
- [ ] Llamadas llegan a agentes correctos
- [ ] No hay errores en logs
- [ ] Distribución según lo esperado
- [ ] Tiempo de respuesta normal

### Primer día:
- [ ] Revisar estadísticas de distribución
- [ ] Verificar satisfacción de agentes
- [ ] Comprobar quejas de clientes
- [ ] Analizar llamadas perdidas

### Primera semana:
- [ ] Análisis completo de KPIs
- [ ] Ajustes finos si necesario
- [ ] Documentar resultados

## ROLLBACK DE EMERGENCIA

### Si algo sale mal:

#### 1. Restaurar configuración BD
```bash
mysql -u asteriskuser -p asterisk < backup_servicios_[FECHA].sql
```

#### 2. Restaurar código Python (si se modificó)
```bash
cp trunk_processor.py.backup_[FECHA] \
   /var/lib/asterisk/agi-bin/call_system/processors/trunk_processor.py
```

#### 3. Limpiar cambios adicionales
```sql
-- Si se crearon tablas nuevas
DROP TABLE IF EXISTS caller_lists;
DROP TABLE IF EXISTS agent_skills;

-- Si se modificó dialplan
asterisk -rx "dialplan reload"
```

#### 4. Verificar funcionamiento
```bash
# Test rápido
asterisk -rx "originate Local/_______________@from-trunk application Playback demo-congrats"
```

## COMUNICACIÓN DEL CAMBIO

### A coordinadores:
```
Asunto: Cambio en enrutamiento - Servicio _______________

Se ha modificado el enrutamiento del servicio _______________ 

Cambios realizados:
- _______________
- _______________

Efectivo desde: _______________

Por favor monitorear y reportar cualquier incidencia.
```

### A agentes afectados:
```
Estimados agentes,

A partir de _______________ se ha modificado la distribución 
de llamadas del servicio _______________.

Cambios que les afectan:
- _______________
- _______________

Esto puede significar:
[ ] Más llamadas
[ ] Menos llamadas  
[ ] Llamadas de diferente tipo

Gracias por su comprensión.
```

## MÉTRICAS A MONITOREAR

### KPIs principales:
```sql
-- Crear vista para monitoreo
CREATE OR REPLACE VIEW routing_metrics AS
SELECT 
    DATE(start_time) as fecha,
    HOUR(start_time) as hora,
    service_number,
    agent_code,
    COUNT(*) as total_calls,
    COUNT(CASE WHEN status = 'completed' THEN 1 END) as completed_calls,
    COUNT(CASE WHEN status = 'abandoned' THEN 1 END) as abandoned_calls,
    AVG(CASE WHEN status = 'completed' 
        THEN TIMESTAMPDIFF(SECOND, start_time, end_time) END) as avg_duration,
    AVG(TIMESTAMPDIFF(SECOND, start_time, answer_time)) as avg_wait_time
FROM active_agent_calls
WHERE start_time > NOW() - INTERVAL 7 DAY
GROUP BY DATE(start_time), HOUR(start_time), service_number, agent_code;

-- Consultar métricas
SELECT * FROM routing_metrics 
WHERE service_number = '_______________'
AND fecha = CURDATE()
ORDER BY hora DESC, total_calls DESC;
```

## DOCUMENTACIÓN FINAL

### Actualizar:
1. **CHANGELOG.md**
```bash
echo "## [$(date +%Y-%m-%d)] - Cambio de enrutamiento
- Servicio: _______________
- Tipo de cambio: _______________
- Descripción: _______________
- Implementado por: _______________
- Resultado: _______________" >> /var/www/html/CHANGELOG.md
```

2. **Documentación de servicios**
- [ ] Actualizar wiki con nuevo enrutamiento
- [ ] Actualizar diagrama de flujos
- [ ] Documentar reglas especiales

3. **Runbook de operaciones**
- [ ] Agregar nuevo procedimiento si aplica
- [ ] Actualizar troubleshooting

## LECCIONES APRENDIDAS

### ¿Qué funcionó bien?
_________________________________
_________________________________

### ¿Qué se puede mejorar?
_________________________________
_________________________________

### ¿Qué haríamos diferente?
_________________________________
_________________________________

## NOTAS/OBSERVACIONES

_________________________________
_________________________________
_________________________________

## FIRMAS

Solicitado por: _______________ Fecha: _______________
Diseñado por: _______________ Fecha: _______________
Implementado por: _______________ Fecha: _______________
Probado por: _______________ Fecha: _______________
Aprobado por: _______________ Fecha: _______________