# Guía y Memoria Técnica: Modal de Personalidad Fiscal y RFC (FOCINE)
## Implementación Centralizada en las 13 Convocatorias
**Instituto Mexicano de Cinematografía (IMCINE) — Gobierno de México**

---

### 1. Resumen Ejecutivo
Se implementó con éxito en las **13 convocatorias** de FOCINE la verificación, confirmación y edición voluntaria de **Personalidad Fiscal y RFC**, con arquitectura centralizada en **`api_imcine_v2`** para evitar duplicidad de estilos CSS y scripts JavaScript, garantizando a la vez respeto estricto a las particularidades normativas de cada convocatoria.

---

### 2. Particularidades Normativas por Convocatoria

| Convocatoria | Base de Datos | Opciones de Personalidad Fiscal | Particularidad |
| :--- | :--- | :--- | :--- |
| **`acervos`** | `..._acervos` | 1. Física, 2. Moral, 3. Moral de derecho público | 3 tipos completos |
| **`animacion`** | `..._animacion` | 1. Física, 2. Moral, 3. Escuela | Opción 3 es Escuela |
| **`cortometraje`** | `..._cortometraje` | 1. Física, 2. Moral | Sólo 2 tipos |
| **`documental`** | `..._documental` | 1. Física, 2. Moral | Sólo 2 tipos |
| **`estados`** | `..._estados` | 1. Física, 2. Moral | Sólo 2 tipos |
| **`exhibicion_equipamientos`** | `..._exhibicion_equipamientos` | 1. Física, 2. Moral, 3. Moral de derecho público | 3 tipos completos |
| **`exhibicion_programas`** | `..._exhibicion_programas` | 1. Física, 2. Moral, 3. Moral de derecho público | 3 tipos completos |
| **`experimental`** | `..._experimental` | 1. Física, 2. Moral | Sólo 2 tipos |
| **`ficcion`** | `..._ficcion` | 1. Física, 2. Moral | Sólo 2 tipos |
| **`infancias`** | `..._infancias` | 1. Física, 2. Moral | Sólo 2 tipos |
| **`infancias_2027`** | `..._infancias` | 1. Física, 2. Moral | Comparte BD con infancias |
| **`operasprimas`** | `..._operasprimas` | 1. Física, 2. Escuela | No admite moral privada |
| **`postproduccion`** | `..._postproduccion` | 1. Física, 2. Moral, 3. Escuelas | Opción 3 es Escuelas |

> **Adaptabilidad Dinámica:** El componente `modal_datos_fiscales.php` consulta en tiempo de ejecución la tabla `persona_fiscal` de la convocatoria actual (`SELECT id_persona_fiscal, persona_fiscal_tipo FROM persona_fiscal`). De este modo, el usuario solo puede seleccionar las opciones legalmente admitidas por las bases del concurso correspondiente.

---

### 3. Arquitectura Centralizada en `api_imcine_v2`

1. **Estilos Centralizados:**  
   Ruta: `/home/convocatoriasdev/public_html/api_imcine_v2/css_base/modal_fiscal.css`  
   URL: `https://convocatoriasdev.imcine.gob.mx/api_imcine_v2/css_base/modal_fiscal.css`
   - Formato apaisado horizontal en **2 columnas** sin scroll vertical.
   - Tipografía grande de alta accesibilidad (WCAG).
   - Fila inferior integrada con casilla de conformidad y botón alineados.

2. **Lógica JavaScript Centralizada:**  
   Ruta: `/home/convocatoriasdev/public_html/api_imcine_v2/js/modal_fiscal.js`  
   URL: `https://convocatoriasdev.imcine.gob.mx/api_imcine_v2/js/modal_fiscal.js`
   - `solicitarModificarFiscal()`: Alerta preventiva institucional `confirm(...)`, reseteo automático de la casilla de conformidad (`chk.checked = false`), deshabilitación preventiva del botón y apertura del modal en modo edición.
   - `abrirModalDatosFiscales(forzado)`: Bloqueo de backdrop en primer inicio o apertura libre.
   - `cerrarModalDatosFiscales()`
   - `cambiarVistaTipoPersona(tipo)`: Muestra/oculta campos dinámicamente según si es persona física o moral/institución/escuela.
   - `validarBotonFiscal()`: Control de habilitación del botón según longitud de RFC (13 o 12) y casilla de conformidad marcada.
   - `enviarConfirmacionFiscal(e, idProyecto, switchUrl)`: Envío asíncrono AJAX a `switch.php` y recarga en caliente.

---

### 4. Componentes y Código Implementado

#### A. Base de Datos
Columna agregada a la tabla `proyectos` en las 12 bases de datos:
```sql
ALTER TABLE `proyectos` ADD COLUMN `fiscal_confirmado` TINYINT(1) NOT NULL DEFAULT 0 AFTER `persona_fiscal`;
UPDATE `proyectos` SET `fiscal_confirmado` = 1 WHERE `estatus_proyecto` IN (3, 5, 6, 7, 8, 9, 10) OR `datos_validados` = 1;
```

#### B. `backEnd/DAO/dao_sistema.php`
```php
function actualizarPersonalidadFiscal($idProyecto, $tipoPersona, $rfc, $razonSocial = '') {
    $conexion = new OBD();
    $id = intval($idProyecto);
    $tipo = intval($tipoPersona);
    $rfcs = str_replace("'", "''", strtoupper(trim($rfc)));
    $rz = str_replace("'", "''", trim($razonSocial));

    if ($tipo === 1) {
        $sql = "UPDATE proyectos SET persona_fiscal = 1, rfc_user_fisica = '{$rfcs}', fiscal_confirmado = 1 WHERE id_proyecto = {$id}";
    } else {
        $sql = "UPDATE proyectos SET persona_fiscal = {$tipo}, rfc_user_moral = '{$rfcs}', razon_social = '{$rz}', fiscal_confirmado = 1 WHERE id_proyecto = {$id}";
    }
    return $conexion->query_update($sql, DSN_LOCAL);
}
```

#### C. `backEnd/CONTROL/control_sistema.php`
Método `confirmarPersonalidadFiscal($arreglo)` con validaciones normativas y sincronización en caliente de `$_SESSION['tipo_persona']`, `$_SESSION['tipo']` y `$_SESSION['fiscal_confirmado']`.

#### D. `switch.php`
Caso `case "confirmar_personalidad_fiscal":` para recepción del payload AJAX.

#### E. `backEnd/CONTROL/control_llavemx.php` e `init_session.php`
- En usuarios existentes, se preserva la personalidad fiscal confirmada previamente sin permitir que la clasificación genérica de Llave MX la sobreescriba.
- Carga de `$_SESSION['fiscal_confirmado']`.

#### F. `datos.php`
- Botón **"Modificar"** con `onclick="solicitarModificarFiscal();"` junto a la sección de persona fiscal.
- Inclusión del modal antes de `footer.php`:
  ```php
  <?php include_once __DIR__ . '/modal_datos_fiscales.php'; ?>
  ```

---

### 5. Matriz de Verificación Técnica (100% Superada)

| Convocatoria | Sintaxis PHP | Columna BD `fiscal_confirmado` | Botón Modificar en `datos.php` | Modal Incluido | Action en `switch.php` |
| :--- | :---: | :---: | :---: | :---: | :---: |
| **`acervos`** | ✔ OK | ✔ OK | ✔ OK | ✔ OK | ✔ OK |
| **`animacion`** | ✔ OK | ✔ OK | ✔ OK | ✔ OK | ✔ OK |
| **`cortometraje`** | ✔ OK | ✔ OK | ✔ OK | ✔ OK | ✔ OK |
| **`documental`** | ✔ OK | ✔ OK | ✔ OK | ✔ OK | ✔ OK |
| **`estados`** | ✔ OK | ✔ OK | ✔ OK | ✔ OK | ✔ OK |
| **`exhibicion_equipamientos`** | ✔ OK | ✔ OK | ✔ OK | ✔ OK | ✔ OK |
| **`exhibicion_programas`** | ✔ OK | ✔ OK | ✔ OK | ✔ OK | ✔ OK |
| **`experimental`** | ✔ OK | ✔ OK | ✔ OK | ✔ OK | ✔ OK |
| **`ficcion`** | ✔ OK | ✔ OK | ✔ OK | ✔ OK | ✔ OK |
| **`infancias`** | ✔ OK | ✔ OK | ✔ OK | ✔ OK | ✔ OK |
| **`infancias_2027`** | ✔ OK | ✔ OK | ✔ OK | ✔ OK | ✔ OK |
| **`operasprimas`** | ✔ OK | ✔ OK | ✔ OK | ✔ OK | ✔ OK |
| **`postproduccion`** | ✔ OK | ✔ OK | ✔ OK | ✔ OK | ✔ OK |
