-- =====================================================================
--  ESQUEMA — wd_membresia.membresiaAccesoLiberado
--
--  Proyecto : CL032BACK (Reservaciones en Línea)
--  Base     : cl032reservacionenlinea
--  Archivo  : database/sql/wd_membresia_add_acceso_liberado.sql
--  Fecha    : 2026-10-06
--
--  ---------------------------------------------------------------------
--  PARA QUÉ
--  ---------------------------------------------------------------------
--  El portal se libera POR ETAPAS: primero a unos cuantos socios de prueba
--  y, cuando esté 100% funcional, a todos. Esta columna es el interruptor
--  por membresía:
--
--      1 = la membresía YA tiene el portal liberado.
--      0 = todavía no (valor por omisión de toda fila, nueva o existente).
--
--  Trabaja junto con la variable ACCESO_LIBERACION_MODO del .env
--  (config/acceso.php → acceso.liberacion.modo):
--
--      general    → entran TODAS las membresías. La columna NO se consulta.
--      especifico → entran SÓLO las membresías con membresiaAccesoLiberado = 1.
--                   Al resto se le muestra la pantalla genérica
--                   /acceso/verificacion/sin-datos, igual que a un número
--                   que no existe.
--
--  Vacío equivale a `general`; cualquier otro valor se trata como
--  `especifico`. La columna sólo SUMA una condición: un socio liberado sigue
--  necesitando estar activo, ser de un tipo con acceso, tener datos de
--  contacto y no tener bloqueo del padrón.
--
--  ---------------------------------------------------------------------
--  POR QUÉ EN wd_membresia, SIENDO UNA RÉPLICA
--  ---------------------------------------------------------------------
--  MembresiasReplicarPortal escribe con updateOrInsert SÓLO su lista cerrada
--  de columnas (MembresiasReplicarPortal::COLUMNAS). Una columna local que no
--  está en esa lista NO se pisa en cada corrida (mismo mecanismo que protege
--  a membresiaAvisoPrivacidadFecha). Una membresía NUEVA que llegue por la
--  réplica nace con 0: no liberada.
--
--  ⚠ Si algún día la tabla se RECARGA A MANO desde el maestro (dump +
--  restore), la columna vuelve a 0 para todos. Con el modo `especifico` eso
--  deja fuera a los socios de prueba: conviene respaldar la lista con la
--  consulta del §4 ANTES de cualquier recarga y volver a correr el §2.
--
--  ---------------------------------------------------------------------
--  EJECUCIÓN
--  ---------------------------------------------------------------------
--   1. DDL: usuario ADMINISTRADOR.
--   2. Respaldo previo:
--        mysqldump -u <ADMIN> -p cl032reservacionenlinea wd_membresia \
--          > /var/backups/cl032_wd_membresia_$(date +%F).sql
--   3. Editar el §2 con los números de socio a liberar (y descomentarlo).
--   4. mysql -u <ADMIN> -p cl032reservacionenlinea < wd_membresia_add_acceso_liberado.sql
--   5. En el .env del portal:  ACCESO_LIBERACION_MODO=especifico
--      y después, porque la configuración está en caché:
--        php artisan config:cache
--      (y reiniciar PHP-FPM / Apache si el servidor no recicla procesos).
--
--  ORDEN IMPORTANTE: primero este script (columna + socios liberados), DESPUÉS
--  el .env. Con `especifico` y sin socios marcados nadie puede entrar.
--
--  ES RE-EJECUTABLE: el §1 consulta information_schema antes de actuar
--  (MySQL no tiene ADD COLUMN IF NOT EXISTS) y el §2 sólo pone 1.
--
--  Para liberar a TODOS al final NO hace falta tocar la base: basta con
--  ACCESO_LIBERACION_MODO=general + php artisan config:cache.
-- =====================================================================

SET @bd := DATABASE();


-- =====================================================================
--  §1. COLUMNA
-- =====================================================================
SET @existe := (
    SELECT COUNT(*) FROM information_schema.COLUMNS
     WHERE TABLE_SCHEMA = @bd AND TABLE_NAME = 'wd_membresia'
       AND COLUMN_NAME = 'membresiaAccesoLiberado'
);

SET @sql := IF(@existe = 0,
    "ALTER TABLE `wd_membresia`
       ADD COLUMN `membresiaAccesoLiberado` TINYINT(1) NOT NULL DEFAULT 0
           COMMENT 'Portal liberado a esta membresía (1) o todavía no (0). Sólo se consulta con ACCESO_LIBERACION_MODO=especifico. Columna LOCAL: la réplica del padrón no la escribe.'",
    'SELECT ''membresiaAccesoLiberado ya existe'''
);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;


-- =====================================================================
--  §2. LIBERAR SOCIOS  (editar la lista y descomentar)
-- =====================================================================
-- Se identifica por membresiaNo, el mismo número que el socio teclea en el
-- login: en MAYÚSCULAS y sin ceros a la izquierda ('1614', 'V12', 'I0').
--
-- I0 es la membresía de pruebas de Sistemas: conviene incluirla para poder
-- seguir probando con el modo `especifico`.
--
-- UPDATE `wd_membresia`
--    SET `membresiaAccesoLiberado` = 1
--  WHERE `membresiaNo` IN ('I0', '1614', 'V12');


-- ---------------------------------------------------------------------
--  §3. RETIRAR LA LIBERACIÓN  (sólo si hace falta; descomentar)
-- ---------------------------------------------------------------------
-- Con el modo `especifico`, la sesión abierta del socio deja de valer en
-- su siguiente petición: no hace falta cerrársela a mano.
--
-- UPDATE `wd_membresia`
--    SET `membresiaAccesoLiberado` = 0
--  WHERE `membresiaNo` IN ('1614');


-- =====================================================================
--  §4. VERIFICACIÓN
-- =====================================================================
SELECT
    COUNT(*)                              AS membresias,
    SUM(`membresiaAccesoLiberado` = 1)    AS liberadas,
    SUM(`membresiaAccesoLiberado` = 0)    AS no_liberadas
  FROM `wd_membresia`;

-- Lista de las liberadas. Sirve también como respaldo antes de una recarga.
SELECT `idMembresia`, `membresiaNo`, `membresiaTitular`, `membresiaTipo`, `membresiaEstado`
  FROM `wd_membresia`
 WHERE `membresiaAccesoLiberado` = 1
 ORDER BY `membresiaNo`;


-- ---------------------------------------------------------------------
--  §5. REVERSA  (sólo si se retira la funcionalidad; descomentar)
-- ---------------------------------------------------------------------
-- ANTES de quitar la columna, dejar ACCESO_LIBERACION_MODO=general (o
-- quitar la variable) y correr php artisan config:cache. Con `especifico`
-- y sin columna, nadie puede entrar.
--
-- ALTER TABLE `wd_membresia` DROP COLUMN `membresiaAccesoLiberado`;
