-- =====================================================================
--  ESQUEMA — wd_membresia.membresiaAvisoPrivacidadFecha
--
--  Proyecto : CL032BACK (Reservaciones en Línea)
--  Base     : cl032reservacionenlinea
--  Archivo  : database/sql/wd_membresia_add_aviso_privacidad_fecha.sql
--  Fecha    : 2026-09-24
--
--  ---------------------------------------------------------------------
--  PARA QUÉ
--  ---------------------------------------------------------------------
--  El aviso de privacidad se mostraba en CADA inicio de sesión porque no
--  había dónde recordar que el socio ya lo aceptó: la aceptación sólo dejaba
--  un asiento en rsv_bitacora (acción 6 "Aceptar aviso").
--
--  Esta columna guarda el momento de la ÚLTIMA aceptación. NULL = nunca la
--  aceptó. Con ella AvisoPrivacidadService decide si el aviso se vuelve a
--  pedir, según config/acceso.php (modo `primera_vez` o `siempre`, y fecha
--  de vigencia del texto).
--
--  ---------------------------------------------------------------------
--  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: es el mismo mecanismo que
--  protege hoy a las columnas de Sanctum y a las credenciales del socio.
--
--  ⚠ Si algún día la tabla se RECARGA A MANO desde el maestro (dump +
--  restore), esta columna vuelve a NULL y los socios verán el aviso una vez
--  más. La falla es benigna —se pide de más, nunca de menos—, pero conviene
--  volver a correr el §2 de este script después de una recarga.
--
--  ---------------------------------------------------------------------
--  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. mysql -u <ADMIN> -p cl032reservacionenlinea < wd_membresia_add_aviso_privacidad_fecha.sql
--
--  ES RE-EJECUTABLE: el §1 consulta information_schema antes de actuar
--  (MySQL no tiene ADD COLUMN IF NOT EXISTS) y el §2 sólo toca filas NULL.
-- =====================================================================

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 = 'membresiaAvisoPrivacidadFecha'
);

SET @sql := IF(@existe = 0,
    "ALTER TABLE `wd_membresia`
       ADD COLUMN `membresiaAvisoPrivacidadFecha` DATETIME NULL DEFAULT NULL
           COMMENT 'Última aceptación del aviso de privacidad en el portal. NULL = nunca lo aceptó. Columna LOCAL: la réplica del padrón no la escribe.'
           AFTER `membresiaBloqueosReservaciones`",
    'SELECT ''membresiaAvisoPrivacidadFecha ya existe'''
);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;


-- =====================================================================
--  §2. RELLENO DESDE LA BITÁCORA
-- =====================================================================
-- Los socios que YA aceptaron el aviso antes de este cambio tienen su asiento
-- en rsv_bitacora (idBitacoraAccion = 6). Se toma la ÚLTIMA aceptación de
-- cada uno. Sin este relleno todos los socios verían el aviso una vez más
-- aunque ya lo hubieran aceptado.
--
-- Sólo filas en NULL: re-ejecutarlo nunca retrocede una aceptación posterior.
UPDATE `wd_membresia` m
  JOIN (
        SELECT `idMembresia`, MAX(`bitacoraFecha`) AS ultima
          FROM `rsv_bitacora`
         WHERE `idBitacoraAccion` = 6
           AND `idMembresia` IS NOT NULL
           AND `bitacoraFecha` IS NOT NULL
         GROUP BY `idMembresia`
       ) b ON b.`idMembresia` = m.`idMembresia`
   SET m.`membresiaAvisoPrivacidadFecha` = b.ultima
 WHERE m.`membresiaAvisoPrivacidadFecha` IS NULL;


-- =====================================================================
--  §3. VERIFICACIÓN
-- =====================================================================
SELECT
    COUNT(*)                                  AS membresias,
    SUM(`membresiaAvisoPrivacidadFecha` IS NOT NULL) AS con_aceptacion,
    SUM(`membresiaAvisoPrivacidadFecha` IS NULL)     AS sin_aceptacion
  FROM `wd_membresia`;
