-- =====================================================================================
-- OPTIMIZACIÓN DEL REPORTE MONTHLY SUMMARY
-- =====================================================================================
-- Este archivo contiene los índices necesarios para mejorar el rendimiento del reporte
-- de resumen mensual (Monthly Summary)
--
-- IMPORTANTE: Ejecutar estos índices en horarios de bajo tráfico
-- Fecha de creación: 2025-10-01
-- =====================================================================================

-- Verificar índices existentes antes de agregar
-- SELECT * FROM information_schema.statistics WHERE table_schema = 'trebol_produccion';

-- -------------------------------------------------------------------------------------
-- TABLA: invoices
-- Esta tabla es la más crítica ya que se consulta intensivamente con filtros por fecha
-- -------------------------------------------------------------------------------------

-- Índice compuesto para consultas que filtran por debtor_id, created_at y process_id
-- Mejora las consultas de capital_income que agrupan por mes y proceso
ALTER TABLE invoices
ADD INDEX idx_invoices_debtor_date_process (debtor_id, created_at, process_id);

-- Índice para created_at solo (si no existe)
-- Muchas consultas filtran solo por año/mes
ALTER TABLE invoices
ADD INDEX idx_invoices_created_at (created_at);

-- Índice para process_id (si no existe)
ALTER TABLE invoices
ADD INDEX idx_invoices_process_id (process_id);


-- -------------------------------------------------------------------------------------
-- TABLA: staff_customers
-- Es la tabla que relaciona clientes, deudores y órdenes de servicio
-- -------------------------------------------------------------------------------------

-- Índice compuesto para consultas que filtran por customer_id y debtor_id
ALTER TABLE staff_customers
ADD INDEX idx_staff_customers_customer_debtor (customer_id, debtor_id);

-- Índice compuesto para consultas que filtran por debtor_id y service_order_id
ALTER TABLE staff_customers
ADD INDEX idx_staff_customers_debtor_service (debtor_id, service_order_id);

-- Índice para staff_id
ALTER TABLE staff_customers
ADD INDEX idx_staff_customers_staff_id (staff_id);


-- -------------------------------------------------------------------------------------
-- TABLA: debtors
-- Filtros frecuentes por status
-- -------------------------------------------------------------------------------------

-- Índice para status (si no existe)
ALTER TABLE debtors
ADD INDEX idx_debtors_status (status);


-- -------------------------------------------------------------------------------------
-- TABLA: service_orders
-- Filtros frecuentes por wallet_type_id
-- -------------------------------------------------------------------------------------

-- Índice para wallet_type_id (si no existe)
ALTER TABLE service_orders
ADD INDEX idx_service_orders_wallet_type (wallet_type_id);


-- -------------------------------------------------------------------------------------
-- TABLA: users
-- Filtros por branch_office_id
-- -------------------------------------------------------------------------------------

-- Índice para branch_office_id (si no existe)
ALTER TABLE users
ADD INDEX idx_users_branch_office (branch_office_id);


-- -------------------------------------------------------------------------------------
-- TABLA: invoices_customers
-- Si esta tabla existe, necesita optimización para las consultas de análisis
-- -------------------------------------------------------------------------------------

-- Verificar si la tabla existe antes de crear índices
-- SHOW TABLES LIKE 'invoices_customers';

-- Si la tabla existe, agregar estos índices:
-- ALTER TABLE invoices_customers
-- ADD INDEX idx_invoices_customers_customer_mes (customer_id, mes);

-- ALTER TABLE invoices_customers
-- ADD INDEX idx_invoices_customers_process_mes (process_id, mes);


-- =====================================================================================
-- NOTAS IMPORTANTES DESPUÉS DE APLICAR LOS ÍNDICES:
-- =====================================================================================
--
-- 1. Verificar el tamaño de la tabla invoices:
--    SELECT
--        table_name AS "Table",
--        ROUND(((data_length + index_length) / 1024 / 1024), 2) AS "Size (MB)"
--    FROM information_schema.TABLES
--    WHERE table_schema = 'trebol_produccion'
--    AND table_name = 'invoices';
--
-- 2. Analizar las tablas después de crear índices:
--    ANALYZE TABLE invoices, staff_customers, debtors, service_orders, users;
--
-- 3. Monitorear el uso de índices con:
--    EXPLAIN SELECT ... (copiar consultas del código)
--
-- 4. Si la base de datos tiene muchos registros (>1 millón), considerar:
--    - Particionar la tabla invoices por año
--    - Crear una tabla de resumen pre-calculado (materialized view)
--    - Implementar caché en la aplicación para este reporte
--
-- =====================================================================================
