# Ejemplo de Transformación: Antes vs Después

## 🔴 ANTES: Duplicación Masiva

```sql
-- CONSULTA ORIGINAL: ~1000 líneas con 8 UNION ALL

SELECT * FROM (
  -- ❌ PRIMERA CONSULTA: Facturas Colombia (POSITIVAS)
  SELECT movfue, movdoc, 'COP' divisa, 'COLOMBIA' pais, ... 
  FROM famov
  JOIN basdat:farfa ON ...
  JOIN basdat:faplah ON ...
  INNER JOIN basdat:faven ON ...
  INNER JOIN basdat:fapla ON ...
  INNER JOIN basdat:fareg ON ...
  INNER JOIN basdat:siubi ON ...
  LEFT JOIN basdat:crcar ON ...
  LEFT JOIN dev_col ON ...
  WHERE famov.movdoc > 0 AND [misma lógica]
  
  UNION ALL
  
  -- ❌ SEGUNDA CONSULTA: Facturas Colombia (NEGATIVAS)
  -- ⚠️ 90% IDÉNTICA a la primera, solo cambia:
  --    - movdoc < 0 en WHERE
  --    - dev1/dev2 en lugar de dev
  SELECT movfue, movdoc, 'COP' divisa, 'COLOMBIA' pais, ...
  FROM famov
  JOIN basdat:farfa ON ...
  JOIN basdat:faplah ON ...
  INNER JOIN basdat:faven ON ...
  INNER JOIN basdat:fapla ON ...
  -- [Repite todo lo anterior]
  
  UNION ALL
  
  -- ❌ TERCERA CONSULTA: Facturas Ecuador (POSITIVAS)
  -- ⚠️ 100% IDÉNTICA a la primera, pero con prefijo dbecuador:
  SELECT dbecuador:famov.movfue, dbecuador:famov.movdoc, 'USD' divisa, 'ECUADOR' pais, ...
  FROM dbecuador:famov
  JOIN dbecuador:farfa ON ...
  JOIN dbecuador:faplah ON ...
  INNER JOIN dbecuador:faven ON ...
  -- [Todo lo anterior repetido con dbecuador:]
  
  UNION ALL
  
  -- ❌ CUARTA CONSULTA: Facturas Ecuador (NEGATIVAS)
  -- ⚠️ 100% IDÉNTICA a la tercera
  
  -- ❌ QUINTA A OCTAVA CONSULTA: Notas Crédito/Débito
  -- ⚠️ Lógica similar pero con tablas cncre/cndeb
  
) AS resultado
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24
ORDER BY fecha_creacion
```

### Ejemplo de lo que se repetía:

```sql
-- Este CASE aparecía 4 veces IDÉNTICO:
CASE 
  WHEN fapla.placod = '01' THEN movval - moviva
  WHEN fapla.placod != '01' THEN ((movval - moviva) / (1 + (plapor / 100)))
END

-- Este JOIN aparecía 8 veces:
LEFT JOIN (SELECT UNIQUE(devcau) causa, devdev, devloc FROM fadev WHERE devanu = '0') AS dev
ON dev.devdev = movdoc AND dev.devloc = movfue

-- Este JOIN aparecía 4 veces:
JOIN faplah ON movpln = placod AND rfafec <= plaffi AND rfafec >= plafin
```

---

## ✅ DESPUÉS: Optimización con CTEs

```sql
-- VERSIÓN OPTIMIZADA: ~300 líneas, 70% más corta

WITH 
  -- 🟢 REUTILIZABLE 1: Devoluciones Colombia
  dev_col AS (
    SELECT UNIQUE(devcau) causa, devdev, devloc 
    FROM basdat:fadev 
    WHERE devanu = '0' OR devart = 'DEV-FAC'
  ),
  
  -- 🟢 REUTILIZABLE 2: Devoluciones Ecuador
  dev_ec AS (
    SELECT UNIQUE(devcau) causa, devdev, devloc 
    FROM dbecuador:fadev 
    WHERE devanu = '0'
  ),
  
  -- 🟢 REUTILIZABLE 3: TODAS LAS FACTURAS (Colombia + Ecuador)
  facturas AS (
    SELECT 
      mov.movfue localizacion,
      CASE WHEN mov.movdoc > 0 THEN 'FACTURA' ELSE 'DEVOLUCION' END tipo_documento,
      -- [Campos unificados]
      CASE 
        WHEN mov.placod = '01' THEN mov.movval - mov.moviva
        ELSE ((mov.movval - mov.moviva) / (1 + (COALESCE(mov.plapor, 0) / 100)))
      END total_documento_sin_iva,  -- ✅ Definido UNA SOLA VEZ
      -- [Más campos]
    FROM (
      -- Colombia facturas
      SELECT 
        f.movfue, f.movdoc, f.movcli, f.movfec, f.movfve, f.movven, 
        f.movpln, f.movrgn, f.movanu, f.movval, f.moviva,
        'COLOMBIA' pais, 'basdat' db,
        va.veneml, va.vencod, va.vennom,
        pl.placod, pl.planom,
        rg.regnom, ph.plapor,
        cr.crcpag, cr.crctot,
        dv.causa,
        ub.ubinom,
        fc.cufpdf
      FROM basdat:famov f
      INNER JOIN basdat:faven va ON f.movven = va.vencod
      INNER JOIN basdat:fapla pl ON f.movpln = pl.placod
      INNER JOIN basdat:fareg rg ON f.movrgn = rg.regcod
      INNER JOIN basdat:siubi ub ON f.movfue = ub.ubicod
      JOIN basdat:farfa fa ON fa.rfaloc = f.movfue AND fa.rfadoc = f.movdoc
      JOIN basdat:faplah ph ON f.movpln = ph.placod 
        AND fa.rfafec <= ph.plaffi AND fa.rfafec >= ph.plafin
      LEFT JOIN basdat:crcar cr ON f.movfue = cr.crcloc 
        AND ((f.movdoc > 0 AND f.movdoc = cr.crcfac AND cr.crcfue = '55') 
             OR (f.movdoc < 0 AND f.movdoc * -1 = cr.crcfac AND cr.crcfue = '56'))
        AND f.movcli = cr.crccli
      LEFT JOIN dev_col dv ON dv.devdev = f.movdoc AND dv.devloc = f.movfue  -- ✅ Reutiliza dev_col
      LEFT JOIN basdat:fecuf fc ON fc.cuffac = CONCAT(f.movfue, ABS(f.movdoc)) 
        AND fc.cuftdo IN ('FA', 'NC')
      WHERE (f.movdoc > 0 OR f.movdoc < 0)  -- ✅ Combinado en UN WHERE
      
      UNION ALL
      
      -- Ecuador facturas (igual lógica, diferente prefijo)
      SELECT 
        f.movfue, f.movdoc, f.movcli, f.movfec, f.movfve, f.movven, 
        f.movpln, f.movrgn, f.movanu, f.movval, f.moviva,
        'ECUADOR' pais, 'dbecuador' db,
        va.veneml, va.vencod, va.vennom,
        pl.placod, pl.planom,
        rg.regnom, 0 plapor,
        cr.crcpag, cr.crctot,
        dv.causa,
        ub.ubinom,
        NULL cufpdf
      FROM dbecuador:famov f
      INNER JOIN dbecuador:faven va ON f.movven = va.vencod
      -- [Estructura idéntica, prefijos diferentes]
      LEFT JOIN dev_ec dv ON dv.devdev = f.movdoc AND dv.devloc = f.movfue  -- ✅ Reutiliza dev_ec
      WHERE (f.movdoc > 0 OR f.movdoc < 0)  -- ✅ Combinado
    ) mov
  ),
  
  -- 🟢 REUTILIZABLE 4: TODAS LAS NOTAS (Crédito + Débito, ambos países)
  notas_credito AS (
    SELECT cnc.cncloc, 'NOTA CREDITO', ... FROM basdat:cncre cnc
    UNION ALL
    SELECT cnd.cndloc, 'NOTA DEBITO', ... FROM basdat:cndeb cnd
    UNION ALL
    SELECT cnc.cncloc, 'NOTA CREDITO', ... FROM dbecuador:cncre cnc
    UNION ALL
    SELECT cnd.cndloc, 'NOTA DEBITO', ... FROM dbecuador:cndeb cnd
  ),
  
  -- 🟢 REUTILIZABLE 5: OTROS DOCUMENTOS (CRECI)
  otros_documentos AS (
    SELECT cr.creloa, CASE WHEN ... THEN 'FACTURA' ... FROM basdat:creci cr
    UNION ALL
    SELECT cr.creloa, CASE WHEN ... THEN 'FACTURA' ... FROM dbecuador:creci cr
  )

-- 🟢 RESULTADO FINAL: Solo 3 selecciones
SELECT * FROM facturas
UNION ALL
SELECT * FROM notas_credito
UNION ALL
SELECT * FROM otros_documentos
GROUP BY 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24
ORDER BY fecha_creacion
```

---

## 📊 Comparación Visual

```
ORIGINAL:                          OPTIMIZADO:
┌─────────────────────┐           ┌─────────────────────┐
│ Fact Col (+)        │           │   CTE: dev_col      │
│ ~150 líneas         │           │   CTE: dev_ec       │
├─────────────────────┤           │                     │
│ Fact Col (-)        │───┐       │ CTE: facturas       │
│ ~150 líneas (90%    │   │       │ (ambos países)      │
│  duplicado)         │   │       │ ~200 líneas         │
├─────────────────────┤   │       ├─────────────────────┤
│ Fact Ec (+)         │   │       │ CTE: notas_credito  │
│ ~150 líneas (100%   │   ├─────→ │ (4 variantes)       │
│  duplicado)         │   │       │ ~100 líneas         │
├─────────────────────┤   │       ├─────────────────────┤
│ Fact Ec (-)         │   │       │ CTE: otros_docs     │
│ ~150 líneas (100%   │   │       │ (ambos países)      │
│  duplicado)         │   │       │ ~100 líneas         │
├─────────────────────┤   │       ├─────────────────────┤
│ Nota Cred Col       │   │       │ SELECT * FROM       │
│ ~60 líneas          │   │       │ facturas            │
├─────────────────────┤   │       │ UNION ALL           │
│ Nota Deb Col        │   │       │ notas_credito       │
│ ~60 líneas          │───┼─────→ │ UNION ALL           │
├─────────────────────┤   │       │ otros_documentos    │
│ Nota Cred Ec        │   │       │ ~30 líneas          │
│ ~60 líneas          │   │       └─────────────────────┘
├─────────────────────┤   │
│ Nota Deb Ec         │───┘
│ ~60 líneas          │
├─────────────────────┤
│ Otros Docs Col      │
│ ~200 líneas         │
├─────────────────────┤
│ Otros Docs Ec       │
│ ~200 líneas (100%   │
│  duplicado)         │
├─────────────────────┤
│ SELECT/UNION        │
│ ~20 líneas          │
└─────────────────────┘

TOTAL: ~1000+ líneas      TOTAL: ~300 líneas
DUPLICACIÓN: 70%         DUPLICACIÓN: <5%
```

---

## 🎯 Cambios Clave Realizados

### 1. Consolidación de Devoluciones
**ANTES:**
```sql
LEFT JOIN (SELECT ... FROM basdat:fadev ...) AS dev1 ON ...
LEFT JOIN (SELECT ... FROM basdat:fadev ...) AS dev2 ON ...
LEFT JOIN (SELECT ... FROM dbecuador:fadev ...) AS dev ON ...
-- [Repetido 4+ veces]
```

**DESPUÉS:**
```sql
LEFT JOIN dev_col dv ON ...     -- Reutiliza la misma CTE
LEFT JOIN dev_ec dv ON ...      -- Reutiliza la misma CTE
```

### 2. Unificación de Facturas
**ANTES:** 4 consultas separadas (2 x Colombia, 2 x Ecuador)

**DESPUÉS:** 1 CTE con 2 partes UNION ALL (misma estructura, diferentes prefijos)

### 3. Simplificación de Notas
**ANTES:** 4 consultas independientes

**DESPUÉS:** 1 CTE con 4 partes UNION ALL

### 4. Cálculos Centralizados
**ANTES:**
```sql
CASE WHEN fapla.placod = '01' THEN ... END  -- En 4 lugares
CASE WHEN fapla.placod = '01' THEN ... END  -- En 4 lugares
CASE WHEN fapla.placod = '01' THEN ... END  -- En 4 lugares
```

**DESPUÉS:**
```sql
CASE WHEN mov.placod = '01' THEN ... END  -- En 1 lugar (dentro de facturas CTE)
```

---

## ✨ Beneficios Concretos

| Cambio | Beneficio | Impacto |
|--------|-----------|--------|
| CTEs para dev | No repetir subconsultas | -50 líneas |
| Facturas unificadas | Lógica centralizada | -300 líneas |
| Notas consolidadas | Estructura reutilizable | -100 líneas |
| CASE simplificados | Menos código | -150 líneas |
| Últimas 3 UNIONs | Más legible | Fácil mantener |
| **Total** | **Código limpio** | **~70% menos** |

Este cambio es especialmente útil si en el futuro necesitas:
- ✅ Agregar nuevos países (Perú, Venezuela)
- ✅ Cambiar la lógica de cálculo de IVA
- ✅ Modificar filtros que aplican a todos
- ✅ Debuggear problemas
- ✅ Mejorar el rendimiento de indexación
