# CHECKLIST TÉCNICO Y DE CERTIFICACIÓN: CONSENTIMIENTO Y CREACIÓN CONDICIONADA DE USUARIOS EN MODAL FISCAL
**Convocatorias FOCINE — Instituto Mexicano de Cinematografía (IMCINE)**
**Entorno:** Desarrollo / Puesta a Punto · 2026

---

## 🎯 Objetivo General
Garantizar la **certeza jurídica y técnica** de que ningún usuario o proyecto sea creado en la base de datos de una convocatoria hasta que el ciudadano **apruebe explícitamente compartir sus datos, confirme su personalidad fiscal y acepte inscribirse en dicha convocatoria** mediante la casilla de verificación en el modal institucional. Si el ciudadano no acepta o cancela, se emitirá una alerta informativa y **no se creará ningún registro en la base de datos**.

---

## 📊 Matriz de Control de Fases

| Fase | Descripción del Hito | Estado | Responsable / Validación |
| :---: | :--- | :---: | :--- |
| **Fase 1** | **Análisis de Flujo y Estructura de Sesión Temporal** | 🟢 Completada | Inspección y esquema `$_SESSION['registro_pendiente_llavemx']` definido |
| **Fase 2** | **Desacople de Creación Prematura en `control_llavemx.php`** | 🟢 Completada | Retención en sesión temporal, 0 INSERTs y redirección a `confirmar_registro.php` |
| **Fase 3** | **Actualización de Interfaz y Botón "Cancelar / No Acepto"** | 🟢 Completada | Texto explícito, botón institucional de cancelación y alerta |
| **Fase 4** | **Controlador Backend de Creación Atómica (`switch.php`)** | 🟢 Completada | `crearProyectoDesdeConsentimiento` y `cancelarRegistroPendiente` certificados |
| **Fase 5** | **Pruebas de Certificación (Piloto en Convocatoria Base)** | 🟢 Completada | 100% certificada: Rechazo (0 en BD), Aprobación (1 en BD), Reingreso (login directo) |
| **Fase 6** | **Despliegue y Certificación Cruzada en las 13 Convocatorias** | 🟢 Completada | 13/13 convocatorias certificadas con registro y render de formulario OK |

---

## 📝 Detalle de Fases y Criterios de Aceptación

### 🔹 Fase 1: Análisis de Flujo y Estructura de Sesión Temporal
- [x] Mapear el ciclo de vida de autenticación desde el retorno de Llave MX (`llavemx_callback.php`).
- [x] Definir el esquema de datos temporal en `$_SESSION['registro_pendiente_llavemx']`:
  - `curp`, `nombre`, `primer_apellido`, `segundo_apellido`, `nombre_completo`, `correo`, `telefono`.
  - `rfc_fisica`, `rfc_moral`, `razon_social`, `tipo_persona_lmx`, `arregloSync`, `datosLmx`.
- [x] Validar que la sesión temporal no rompa las consultas de cabecera si el usuario navega antes de confirmar (controlado en `init_session.php`).

### 🔹 Fase 2: Desacople de Creación Prematura en Backend (`control_llavemx.php`)
- [x] En `ClaseControlLlaveMX::procesarAutenticacion()`:
  - [x] Verificar si el usuario ya existe en la convocatoria actual (`buscarProyectoPorCurp`).
  - [x] **Si el usuario YA existe:** Mantener el flujo existente (actualizar sesión, verificar vigencia y pasar a `datos.php`).
  - [x] **Si el usuario es NUEVO:**
    - [x] **NO** ejecutar `$dao->registrarProyectoDesdeLlaveMX()` prematuramente.
    - [x] **NO** enviar correo electrónico de bienvenida de forma anticipada.
    - [x] Guardar los datos verificados de Llave MX en `$_SESSION['registro_pendiente_llavemx']`.
    - [x] Marcar bandera `$_SESSION['esperando_consentimiento_fiscal'] = 1`.
    - [x] Redirigir a la vista de confirmación `confirmar_registro.php` con el modal institucional.
  - [x] Certificado con script automatizado: 0 inserciones en BD y 0 correos prematuros para usuarios nuevos.

### 🔹 Fase 3: Interfaz del Modal, Consentimiento y Alerta de Rechazo (`modal_datos_fiscales.php` y JS)
- [x] **Redacción de la Casilla de Conformidad:**
  - [x] Ajustar el texto del checkbox para contemplar explícitamente:
    > *"He revisado y confirmo que postularé este proyecto bajo la personalidad fiscal y RFC especificados, y autorizo la creación de mi cuenta compartiendo los datos correspondientes para esta convocatoria."*
- [x] **Botón "No Acepto / Cancelar":**
  - [x] Integrar botón visible de cancelación (`.btn-fiscal-cancel`) junto al botón "Confirmar y Continuar".
  - [x] Si el usuario pulsa "No Acepto / Cancelar":
    - [x] Disparar confirmación y alerta institucional:  
      `⚠️ Has decidido no compartir tus datos ni registrarte en esta convocatoria. No se creará ninguna cuenta ni registro en la plataforma.`
    - [x] Destruir la sesión temporal (`$_SESSION['registro_pendiente_llavemx']` y `$_SESSION['esperando_consentimiento_fiscal']`).
    - [x] Redirigir limpiamente a `acceso.php`.
    - [x] Garantizar que no quede ningún rastro en la base de datos (0 proyectos creados comprobado).
- [x] **Validación Estricta en Cliente:**
  - [x] El botón "Confirmar y Continuar" permanece bloqueado/deshabilitado hasta que:
    1. El RFC cumpla la longitud legal (13 para persona física, 12 para persona moral).
    2. La casilla de consentimiento esté marcada (`checked == true`).

### 🔹 Fase 4: Controlador Backend de Creación Atómica (`switch.php` / `control_sistema.php`)
- [x] En el controlador receptor del formulario fiscal:
  - [x] Validar recepción estricta de `chk_conformidad === '1'`. Si no viene marcado, abortar inmediatamente con error explicativo.
  - [x] Recuperar los datos personales verificados de `$_SESSION['registro_pendiente_llavemx']`.
  - [x] Combinar con la personalidad fiscal seleccionada (`tipo_persona`), RFC y razón social (en caso de moral).
  - [x] Ejecutar el `INSERT INTO proyectos` en MySQL únicamente tras la aprobación del ciudadano.
  - [x] Marcar en el registro `fiscal_confirmado = 1`.
  - [x] Disparar el envío del correo electrónico institucional de bienvenida.
  - [x] Limpiar variables temporales e inicializar la sesión definitiva del proyecto (`id_proyecto`, `visitantemd5`, `ses`, etc.).
  - [x] Redirigir fluidamente al formulario de postulación (`datos.php?tab=1`).
  - [x] Manejar acción `cancelar_registro_pendiente` con auditoría de cancelación voluntaria.

### 🔹 Fase 5: Pruebas de Certificación en Convocatoria Piloto (Acervos)
- [x] **Prueba de Rechazo Voluntario (Caso Negativo):**
  - [x] Iniciar sesión con Llave MX con un CURP no registrado previamente.
  - [x] En el modal, hacer clic en "No Acepto / Cancelar".
  - [x] Validar respuesta JSON y redirección oficial a `acceso.php`.
  - [x] **Verificación en BD:** Ejecutar consulta SQL `SELECT COUNT(*) FROM proyectos WHERE curp = '...'`. Retorna **0**.
- [x] **Prueba de Aprobación Formal (Caso Positivo):**
  - [x] Iniciar sesión con Llave MX con un CURP nuevo.
  - [x] Seleccionar tipo de persona, RFC y marcar la casilla de autorización.
  - [x] Pulsar "Confirmar y Continuar".
  - [x] **Verificación en BD:** Existe exactamente **1 registro** en `proyectos` con `fiscal_confirmado = 1` y datos guardados.
  - [x] Verificar que el correo de bienvenida haya sido despachado.
  - [x] Comprobar que la sesión definitiva queda inicializada en PHP y navega a `datos.php?tab=1`.
- [x] **Prueba de Usuario Existente:**
  - [x] Reingresar con el usuario ya creado.
  - [x] Confirmar que el login es directo a `datos.php` sin duplicar registros ni volver a solicitar consentimiento inicial.
- [x] **Diseño y Contexto Institucional:**
  - [x] Tipografía Montserrat escalada un +50% en modal (`api_imcine_v2/css_base/modal_fiscal.css`).
  - [x] Subtítulo de convocatoria en header del modal.
  - [x] Banner institucional destacado con `NOMBRE_CONVOCATORIA` en el cuerpo del modal.
  - [x] Inclusión explícita del nombre de la convocatoria en el texto legal del checkbox de consentimiento.
  - [x] Reemplazo de todos los emojis por iconos SVG oficiales de **Bootstrap Icons 5** (`bi-bank2`, `bi-journal-bookmark-fill`, `bi-exclamation-triangle-fill`, `bi-info-circle-fill`, `bi-person-check-fill`, `bi-x-circle-fill`, `bi-check-circle-fill`).

---

## 🏛️ Fase 6: Matriz de Despliegue en las 13 Convocatorias

| No. | Convocatoria | Particularidad de Persona Fiscal | Backend `control_llavemx.php` | Modal y Scripts | Certificación BD |
| :---: | :--- | :--- | :---: | :---: | :---: |
| 1 | **acervos** | 1. Física, 2. Moral, 3. Moral derecho público | 🟢 | 🟢 | 🟢 |
| 2 | **animacion** | 1. Física, 2. Moral, 3. Escuela | 🟢 | 🟢 | 🟢 |
| 3 | **cortometraje** | 1. Física, 2. Moral | 🟢 | 🟢 | 🟢 |
| 4 | **documental** | 1. Física, 2. Moral | 🟢 | 🟢 | 🟢 |
| 5 | **estados** | 1. Física, 2. Moral | 🟢 | 🟢 | 🟢 |
| 6 | **exhibicion_equipamientos** | 1. Física, 2. Moral, 3. Moral derecho público | 🟢 | 🟢 | 🟢 |
| 7 | **exhibicion_programas** | 1. Física, 2. Moral, 3. Moral derecho público | 🟢 | 🟢 | 🟢 |
| 8 | **experimental** | 1. Física, 2. Moral | 🟢 | 🟢 | 🟢 |
| 9 | **ficcion** | 1. Física, 2. Moral | 🟢 | 🟢 | 🟢 |
| 10 | **infancias** | 1. Física, 2. Moral | 🟢 | 🟢 | 🟢 |
| 11 | **infancias_2027** | 1. Física, 2. Moral (comparte BD) | 🟢 | 🟢 | 🟢 |
| 12 | **operasprimas** | 1. Física, 2. Escuela | 🟢 | 🟢 | 🟢 |
| 13 | **postproduccion** | 1. Física, 2. Moral, 3. Escuelas | 🟢 | 🟢 | 🟢 |

---

## 🔒 Reglas de Seguridad e Integridad
1. **Idempotencia:** No crear registros huérfanos o dobles ante dobles clics o recargas.
2. **Sanitización:** Todo RFC debe convertirse a mayúsculas y sanearse contra inyecciones SQL.
3. **Respaldo:** Mantener copias de seguridad de cualquier archivo PHP modificado antes de su edición.
