# Pendientes Frontend — Post-migración Tarjetas/Lotes

**Fecha:** 2026-02-23  
**BD destino:** Sis2000 (10.1.1.12) — datos ya migrados  
**Totales:** tatarlot=2,094 | tatarjeta=117,131

---

## 1. Verificar que la vista "Generar Códigos" cargue los lotes migrados

- **Componente:** `cards.component`
- **Endpoint:** `GET /api/v1/cards/lots`
- **Query backend:** JOIN `tatarlot` con `macanalalt` y `maproductos`
- Los lotes migrados que tengan `ccanalalt = NULL` o `cproducto = NULL` mostrarán vacío en las columnas Canal y Producto
- Con 2,094 lotes la tabla puede tardar en cargar — evaluar si se necesita **paginación server-side**

---

## 2. Verificar "Detalle Lote"

- **Componente:** `card-detail.component`
- **Endpoint:** `GET /api/v1/cards/lot-detail/:ctarlot`
- **SP:** `sp_ConsultarDetalleLote` — trae email, RIF, intermediario, plan
- Si el `ccanalalt` del lote no está registrado en `maclient_api`, los campos email/RIF/intermediario saldrán vacíos
- **Test rápido:** abrir un lote con canal conocido (ej. Farmatodo = ccanalalt 8)

---

## 3. Asignar Producto (`cproducto`) a los lotes migrados

Todos los lotes migrados tienen `cproducto = NULL`.

**Opciones:**

### Opción A — Desde el frontend (manual, lote por lote)
Usar el botón "Editar Lote" → seleccionar producto.  
Endpoint: `POST /api/v1/cards/edit-lot` con `{ ctarlot, xnombre_lote, ccanalalt, cproducto }`

### Opción B — UPDATE masivo en BD (recomendado)
Ejecutar SQL directamente en MSSQL usando el linked server para cruzar con MySQL:

```sql
-- Vida Temporal (insurance 3, 13, 63, 66) → cproducto '3'
UPDATE L SET L.cproducto = '3'
FROM tatarlot L
WHERE L.ctarlot IN (
    SELECT DISTINCT id_cards_lot 
    FROM MYSQL_QA.lamundial_bk_19_02_2026..cards 
    WHERE id_insurance IN (3, 13, 63, 66)
);

-- 4en1 / 3en1 (insurance 5, 9, 44, 47) → cproducto '5'
UPDATE L SET L.cproducto = '5'
FROM tatarlot L
WHERE L.ctarlot IN (
    SELECT DISTINCT id_cards_lot 
    FROM MYSQL_QA.lamundial_bk_19_02_2026..cards 
    WHERE id_insurance IN (5, 9, 44, 47)
);

-- RCV (insurance 10, 16, 22, 49, 55) → cproducto '56'
UPDATE L SET L.cproducto = '56'
FROM tatarlot L
WHERE L.ctarlot IN (
    SELECT DISTINCT id_cards_lot 
    FROM MYSQL_QA.lamundial_bk_19_02_2026..cards 
    WHERE id_insurance IN (10, 16, 22, 49, 55)
);

-- Funerario (insurance 11, 58) → cproducto '11'
UPDATE L SET L.cproducto = '11'
FROM tatarlot L
WHERE L.ctarlot IN (
    SELECT DISTINCT id_cards_lot 
    FROM MYSQL_QA.lamundial_bk_19_02_2026..cards 
    WHERE id_insurance IN (11, 58)
);

-- Salud Individual (insurance 14) → cproducto '14'
UPDATE L SET L.cproducto = '14'
FROM tatarlot L
WHERE L.ctarlot IN (
    SELECT DISTINCT id_cards_lot 
    FROM MYSQL_QA.lamundial_bk_19_02_2026..cards 
    WHERE id_insurance IN (14)
);

-- Salud Familiar (insurance 15) → cproducto '15'
UPDATE L SET L.cproducto = '15'
FROM tatarlot L
WHERE L.ctarlot IN (
    SELECT DISTINCT id_cards_lot 
    FROM MYSQL_QA.lamundial_bk_19_02_2026..cards 
    WHERE id_insurance IN (15)
);
```

> NOTA: Los IDs de insurance listados arriba son ejemplos. Ejecutar `node migrate.cjs --explore` para ver la lista completa de 79 insurances y decidir el mapeo correcto.

---

## 4. Registrar canales faltantes

3 clientes MySQL no tenían `ccanalalt_sisip`, sus lotes aparecen sin canal:

| Lotes afectados | Cliente MySQL | Acción |
|-----------------|---------------|--------|
| Los de id_client_card=1 | Hospital Clínico del Este | Registrar con `sp_GestionarClienteAPI` o asignar ccanalalt manualmente |
| Los de id_client_card=12 | Canal5 | Igual |
| Los de id_client_card=98 | CANAL 33-FUNERARIO | Igual |

---

## 5. Verificar creación de lotes nuevos

- Crear un lote nuevo desde el frontend
- Debe generarse con `ctarlot > 2100` (IDENTITY reseed aplicado)
- Requiere `ccanalalt` y `cproducto` obligatorios

---

## 6. Verificar descarga de CSV

- `GET /api/v1/cards/download-csv/:id_cards_lot`
- Probar con un lote migrado (ej. ctarlot=1)
- El CSV tiene columnas: `CodigoOculto;CodigoProducto`

---

## 7. (Opcional) Paginación server-side

El endpoint `GET /api/v1/cards/lots` trae los 2,094 lotes en una sola consulta.  
Si el frontend se pone lento, implementar paginación:
- Backend: agregar parámetros `?page=1&limit=50` al query `queryCardsLots`
- Frontend: paginador en `cards.component`

---

## 8. (Opcional) Canal Farmago

`ccanalalt=42` (Farmago) necesita registro con `sp_GestionarClienteAPI` para que el detalle de lote muestre email/intermediario.
