-- Cambios incrementales fuera de actualizaciones.sql.
-- Ejecutar en la BD cuando corresponda; luego pegar al final de actualizaciones.sql para unificar historial.
--
-- Fase 3 — Cancelación venta en línea + config empresa (2026-03-22)
-- =============================================================================

-- Tabla singleton: plazos cancelación / aviso devolución (editable en administración)
CREATE TABLE IF NOT EXISTS config_empresa (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    dias_max_cancelacion_venta_linea_tras_pago SMALLINT UNSIGNED NOT NULL DEFAULT 7
        COMMENT 'Días calendario desde fecha_pago_verificado para permitir cancelación por cliente (pago ya verificado)',
    dias_habiles_max_devolucion_aviso SMALLINT UNSIGNED NOT NULL DEFAULT 10
        COMMENT 'Días hábiles — texto informativo al cliente sobre devolución manual tras cancelación',
    updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO config_empresa (id, dias_max_cancelacion_venta_linea_tras_pago, dias_habiles_max_devolucion_aviso)
VALUES (1, 7, 10)
ON DUPLICATE KEY UPDATE id = id;

-- Ventas: cancelación iniciada por cliente en línea (sin DELETE físico; cancelado=si)
ALTER TABLE ventas
ADD COLUMN fecha_pago_verificado DATETIME NULL DEFAULT NULL COMMENT 'Cuando es_pago_tienda pasa a si (autorizar)' AFTER es_tienda_online;

ALTER TABLE ventas
ADD COLUMN es_cancelacion_cliente ENUM('si','no') NOT NULL DEFAULT 'no' COMMENT 'Cancelación solicitada desde tienda/cliente' AFTER observacion_cancelado;

ALTER TABLE ventas
ADD COLUMN fecha_cancelacion_cliente DATETIME NULL DEFAULT NULL AFTER es_cancelacion_cliente;

-- Impacto reportes / cortes / inventario:
-- - Listados y cortes deben seguir filtrando cancelado=no (ya aplicado en CorteCajaController y paginacion).
-- - Inventario: la cancelación por cliente revierte existencias solo si el pago ya estaba verificado (misma lógica que canledado).
-- - ventas_cortes: no permitir cancelar en línea si la venta ya está en un corte (validación en backend).

-- Datos existentes: aproximar fecha de verificación de pago para ventas en línea ya autorizadas
UPDATE ventas
SET fecha_pago_verificado = COALESCE(updated_at, fecha_registro, created_at)
WHERE es_pago_tienda = 'si'
  AND es_tienda_online = 'si'
  AND fecha_pago_verificado IS NULL;

-- Fase 4 — Citas: pago transferencia pendiente de verificación (equivalente a es_pago_tienda en ventas)
-- =============================================================================
ALTER TABLE sesiones
ADD COLUMN es_pago_cita ENUM('si','no') NOT NULL DEFAULT 'si'
    COMMENT 'no = comprobante recibido, pago pendiente de validar en admin'
    AFTER comprobante_pago;

ALTER TABLE sesiones
ADD COLUMN fecha_pago_cita_verificado DATETIME NULL DEFAULT NULL
    COMMENT 'Cuando admin autoriza el pago de la cita'
    AFTER es_pago_cita;

-- Datos existentes
UPDATE sesiones
SET fecha_pago_cita_verificado = COALESCE(updated_at, created_at)
WHERE comprobante_pago IS NOT NULL AND aprobado = 'SI' AND fecha_pago_cita_verificado IS NULL;
UPDATE sesiones
SET es_pago_cita = 'no'
WHERE comprobante_pago IS NOT NULL AND aprobado = 'NO' AND opcion_pago_transferencia_id IS NOT NULL;

-- =============================================================================
-- Renombre descriptivo de sucursales (UI lateral usa id 1 = Matriz, id 3 = Plaza deportiva)
-- =============================================================================
UPDATE sucursales SET nombre = 'S.U.C Usumacinta' WHERE id = 1;
UPDATE sucursales SET nombre = 'S.U.C Deportiva' WHERE id = 3;

-- =============================================================================
-- Fase 5 — config_empresa: SMTP administrable + control de inventario en ventas (2026-04-01)
-- =============================================================================
-- SMTP: si mail_host queda NULL, la app sigue usando config/mail.php y variables .env.
-- mail_password se almacena cifrado (Laravel encrypted cast). Rellenar desde administración.

ALTER TABLE config_empresa
ADD COLUMN exige_inventario_ventas TINYINT(1) NOT NULL DEFAULT 1
    COMMENT '1=validar existencias al vender; 0=permitir venta sin stock (igual descuenta/revierte inventario)'
    AFTER dias_habiles_max_devolucion_aviso;

ALTER TABLE config_empresa
ADD COLUMN mail_mailer VARCHAR(32) NOT NULL DEFAULT 'smtp'
    COMMENT 'Mailer Laravel (normalmente smtp)' AFTER exige_inventario_ventas;

ALTER TABLE config_empresa
ADD COLUMN mail_host VARCHAR(255) NULL DEFAULT NULL AFTER mail_mailer;

ALTER TABLE config_empresa
ADD COLUMN mail_port SMALLINT UNSIGNED NULL DEFAULT NULL AFTER mail_host;

ALTER TABLE config_empresa
ADD COLUMN mail_username VARCHAR(255) NULL DEFAULT NULL AFTER mail_port;

ALTER TABLE config_empresa
ADD COLUMN mail_password TEXT NULL DEFAULT NULL
    COMMENT 'Contraseña SMTP en texto plano (desde administración)' AFTER mail_username;

ALTER TABLE config_empresa
ADD COLUMN mail_encryption VARCHAR(16) NULL DEFAULT NULL
    COMMENT 'tls, ssl o NULL/vacío' AFTER mail_password;

ALTER TABLE config_empresa
ADD COLUMN mail_from_address VARCHAR(255) NULL DEFAULT NULL AFTER mail_encryption;

ALTER TABLE config_empresa
ADD COLUMN mail_from_name VARCHAR(255) NULL DEFAULT NULL AFTER mail_from_address;

-- =============================================================================
-- Upsert inicial con valores de .env (host/port/usuario/from/encryption)
-- Nota: MAIL_PASSWORD no se inserta aquí porque en la app se guarda/cifra con APP_KEY.
-- Debe configurarse desde administración (o se puede cifrar en SQL si lo necesitas).
-- =============================================================================
INSERT INTO config_empresa (
    id,
    mail_mailer,
    mail_host,
    mail_port,
    mail_username,
    mail_encryption,
    mail_from_address,
    mail_from_name
)
VALUES (
    1,
    'smtp',
    'mail.clinicaegurrola.com.mx',
    465,
    'contacto@clinicaegurrola.com.mx',
    'tls',
    'contacto@clinicaegurrola.com.mx',
    'EGURROLA'
)
ON DUPLICATE KEY UPDATE
    mail_mailer = VALUES(mail_mailer),
    mail_host = VALUES(mail_host),
    mail_port = VALUES(mail_port),
    mail_username = VALUES(mail_username),
    mail_encryption = VALUES(mail_encryption),
    mail_from_address = VALUES(mail_from_address),
    mail_from_name = VALUES(mail_from_name),
    mail_password = NULL,
    updated_at = CURRENT_TIMESTAMP;

-- =============================================================================
-- Prompt Z — Checklist de pruebas manuales (detalle en docs/prompts-actualizacion-sistema.md)
-- (1) Ticket: varios tipos de pago visibles en impresión / verificar venta.
-- (2) Correos: venta, tienda, cita, cancelación — revisar bandeja o modo prueba.
-- (3) Cancelación: permitida sin envío o dentro de plazo; denegada con envío o fuera de días.
-- (4) Corte de caja: venta cancelada no contabiliza como venta válida / no rompe reportes.
-- (5) Cliente no local: API tratamientos sin precios reales.
-- (6) Cliente local: reservar cita con comprobante → verificar pagos → autorizar pago cita.
-- =============================================================================
