-- ============================================
-- MIGRACIÓN 013 - PASO 2: Crear procedimiento con tenant_id
-- Ejecutar ESTE archivo después del PASO 1
-- ============================================

DELIMITER //

CREATE PROCEDURE `calulo_boleta`(IN p_socio INT, IN p_lant INT, IN p_lact INT, IN p_tenant_id INT)
BEGIN
    -- ============================================
    -- DECLARACIÓN DE VARIABLES
    -- ============================================
    
    -- Datos del cliente y tarifa (de vista_ingreso_lecturas)
    DECLARE v_precio_metro3 INT DEFAULT 0;
    DECLARE v_sobreconsumo1 INT DEFAULT 0;
    DECLARE v_inicio1 INT DEFAULT 0;
    DECLARE v_inicio2 INT DEFAULT 0;
    DECLARE v_inicio3 INT DEFAULT 0;
    DECLARE v_limite_subsidio INT DEFAULT 0;
    DECLARE v_porcentaje_subsidio INT DEFAULT 0;
    DECLARE v_cargo_fijo_caneria INT DEFAULT 0;
    DECLARE v_alcantarillado INT DEFAULT 0;
    DECLARE v_cuota_mortuoria_flag INT DEFAULT 0;
    DECLARE v_valor_cuota_mortuoria INT DEFAULT 0;
    DECLARE v_multa_atraso_tarifa INT DEFAULT 0;
    DECLARE v_corte_reposicion INT DEFAULT 0;
    DECLARE v_corte_matriz INT DEFAULT 0;
    
    -- Datos del cliente
    DECLARE v_id_ciudad INT;
    DECLARE v_id_tipo_documento INT DEFAULT 3;
    DECLARE v_numero_medidor VARCHAR(50) DEFAULT '';
    DECLARE v_estado_socio INT DEFAULT 0;
    
    -- Datos APR
    DECLARE v_fecha_facturacion VARCHAR(10);
    DECLARE v_porcentaje_multa INT DEFAULT 0;
    DECLARE v_tipo_multa INT DEFAULT 0;
    DECLARE v_impuesto INT DEFAULT 0;
    
    -- Multas del socio
    DECLARE v_multa_atraso_flag INT DEFAULT 0;
    DECLARE v_multa_corte_flag INT DEFAULT 0;
    DECLARE v_multa_matriz_flag INT DEFAULT 0;
    
    -- Cálculos de consumo
    DECLARE v_consumo_m3 INT;
    DECLARE v_metraje_base INT DEFAULT 0;
    DECLARE v_metraje_tramo1 INT DEFAULT 0;
    DECLARE v_metraje_tramo2 INT DEFAULT 0;
    DECLARE v_metraje_tramo3 INT DEFAULT 0;
    DECLARE v_consumo_total INT DEFAULT 0;
    
    -- Cálculos de cargos
    DECLARE v_cargo_fijo INT DEFAULT 0;
    DECLARE v_alcantarillado_valor INT DEFAULT 0;
    DECLARE v_cargo_mortuoria INT DEFAULT 0;
    DECLARE v_subsidio_consumo INT DEFAULT 0;
    DECLARE v_subsidio_cargo_fijo INT DEFAULT 0;
    DECLARE v_subsidio_total INT DEFAULT 0;
    
    -- Multas calculadas
    DECLARE v_multa_atraso_valor INT DEFAULT 0;
    DECLARE v_multa_corte_valor INT DEFAULT 0;
    DECLARE v_multa_matriz_valor INT DEFAULT 0;
    
    -- Totales
    DECLARE v_total_mes_actual INT DEFAULT 0;
    DECLARE v_saldo_anterior INT DEFAULT 0;
    DECLARE v_total_boleta INT DEFAULT 0;
    
    -- Repactación
    DECLARE v_tiene_repactacion INT DEFAULT 0;
    DECLARE v_valor_cuota INT DEFAULT 0;
    DECLARE v_no_cuotas INT DEFAULT 0;
    DECLARE v_ult_cuota_facturada INT DEFAULT 0;
    
    -- Lectura y boleta
    DECLARE v_fecha_lectura DATE;
    DECLARE v_fecha_vencimiento VARCHAR(20);
    DECLARE v_prox_id_boleta INT;
    DECLARE v_prox_id_boletas INT;
    
    -- IDs de tipos de cargo (para boletas_detalle)
    DECLARE v_tc_consumo_base INT;
    DECLARE v_tc_consumo_tramo1 INT;
    DECLARE v_tc_cargo_fijo INT;
    DECLARE v_tc_alcantarillado INT;
    DECLARE v_tc_mortuoria INT;
    DECLARE v_tc_multa_atraso INT;
    DECLARE v_tc_multa_corte INT;
    DECLARE v_tc_multa_matriz INT;
    DECLARE v_tc_subsidio INT;
    DECLARE v_tc_repactacion INT;
    DECLARE v_tc_saldo_anterior INT;
    
    -- Datos del cliente y APR (para snapshot)
    DECLARE v_cliente_nombre VARCHAR(255);
    DECLARE v_cliente_rut VARCHAR(50);
    DECLARE v_cliente_direccion VARCHAR(255);
    DECLARE v_cliente_ciudad VARCHAR(100);
    DECLARE v_cliente_sector VARCHAR(100);
    DECLARE v_apr_nombre VARCHAR(255);
    DECLARE v_apr_rut VARCHAR(50);
    DECLARE v_apr_direccion VARCHAR(255);
    DECLARE v_apr_comuna VARCHAR(100);
    DECLARE v_apr_telefono VARCHAR(50);
    DECLARE v_apr_representante VARCHAR(255);
    DECLARE v_apr_telefono_rep VARCHAR(50);
    
    -- ============================================
    -- INICIO DE TRANSACCIÓN
    -- ============================================
    START TRANSACTION;
    
    -- ============================================
    -- OBTENER DATOS DEL CLIENTE Y TARIFA
    -- ============================================
    SELECT 
        precio_metro3, sobreconsumo1, inicio1, inicio2, inicio3,
        limite_subsidio, porcentaje_subsidio, cargo_fijo_caneria,
        alcantarillado, cuota_mortuoria_flag, valor_cuota_mortuoria,
        multa_atraso_tarifa, corte_reposicion, corte_matriz,
        id_ciudad, id_tipo_documento, numero_medidor, estado_socio,
        fecha_facturacion, porcentaje_multa, tipo_multa, impuesto,
        multa_atraso_flag, multa_corte_flag, multa_matriz_flag,
        lectura_anterior, lectura_actual,
        nombre_cliente, rut_cliente, direccion, ciudad, nombre_sector,
        nombre_servicio, rut_servicio, direccion_servicio, comuna_servicio,
        fono_oficina_servicio, rep_legal_servicio, fono_contacto_rep_legal
    INTO
        v_precio_metro3, v_sobreconsumo1, v_inicio1, v_inicio2, v_inicio3,
        v_limite_subsidio, v_porcentaje_subsidio, v_cargo_fijo_caneria,
        v_alcantarillado, v_cuota_mortuoria_flag, v_valor_cuota_mortuoria,
        v_multa_atraso_tarifa, v_corte_reposicion, v_corte_matriz,
        v_id_ciudad, v_id_tipo_documento, v_numero_medidor, v_estado_socio,
        v_fecha_facturacion, v_porcentaje_multa, v_tipo_multa, v_impuesto,
        v_multa_atraso_flag, v_multa_corte_flag, v_multa_matriz_flag,
        p_lant, p_lact,
        v_cliente_nombre, v_cliente_rut, v_cliente_direccion, v_cliente_ciudad, v_cliente_sector,
        v_apr_nombre, v_apr_rut, v_apr_direccion, v_apr_comuna,
        v_apr_telefono, v_apr_representante, v_apr_telefono_rep
    FROM vista_ingreso_lecturas
    WHERE Id_cliente = p_socio AND tenant_id = p_tenant_id
    LIMIT 1;
    
    IF v_precio_metro3 IS NULL THEN
        ROLLBACK;
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cliente no encontrado o sin datos de tarifa';
    END IF;
    
    -- ============================================
    -- CALCULAR CONSUMO
    -- ============================================
    SET v_consumo_m3 = p_lact - p_lant;
    IF v_consumo_m3 < 0 THEN
        SET v_consumo_m3 = 0;
    END IF;
    
    -- Calcular metrajes por tramos
    IF v_consumo_m3 <= v_inicio1 - 1 THEN
        SET v_metraje_base = v_consumo_m3 * v_precio_metro3;
        SET v_metraje_tramo1 = 0;
        SET v_metraje_tramo2 = 0;
        SET v_metraje_tramo3 = 0;
    ELSEIF v_consumo_m3 <= v_inicio2 - 1 THEN
        SET v_metraje_base = (v_inicio1 - 1) * v_precio_metro3;
        SET v_metraje_tramo1 = (v_consumo_m3 - (v_inicio1 - 1)) * v_sobreconsumo1;
        SET v_metraje_tramo2 = 0;
        SET v_metraje_tramo3 = 0;
    ELSEIF v_consumo_m3 <= v_inicio3 - 1 THEN
        SET v_metraje_base = (v_inicio1 - 1) * v_precio_metro3;
        SET v_metraje_tramo1 = (v_inicio2 - v_inicio1) * v_sobreconsumo1;
        SET v_metraje_tramo2 = (v_consumo_m3 - (v_inicio2 - 1)) * (v_sobreconsumo1 * 2);
        SET v_metraje_tramo3 = 0;
    ELSE
        SET v_metraje_base = (v_inicio1 - 1) * v_precio_metro3;
        SET v_metraje_tramo1 = (v_inicio2 - v_inicio1) * v_sobreconsumo1;
        SET v_metraje_tramo2 = (v_inicio3 - v_inicio2) * (v_sobreconsumo1 * 2);
        SET v_metraje_tramo3 = (v_consumo_m3 - (v_inicio3 - 1)) * (v_sobreconsumo1 * 3);
    END IF;
    
    SET v_consumo_total = v_metraje_base + v_metraje_tramo1 + v_metraje_tramo2 + v_metraje_tramo3;
    
    -- ============================================
    -- CALCULAR CARGOS Y SUBSIDIOS
    -- ============================================
    SET v_cargo_fijo = v_cargo_fijo_caneria;
    SET v_alcantarillado_valor = v_alcantarillado;
    
    -- Cuota mortuoria
    IF v_cuota_mortuoria_flag = 1 THEN
        SET v_cargo_mortuoria = v_valor_cuota_mortuoria;
    ELSE
        SET v_cargo_mortuoria = 0;
    END IF;
    
    -- Subsidios
    IF v_consumo_m3 <= v_limite_subsidio AND v_porcentaje_subsidio > 0 THEN
        SET v_subsidio_consumo = ROUND(v_consumo_total * v_porcentaje_subsidio / 100);
        SET v_subsidio_cargo_fijo = ROUND(v_cargo_fijo * v_porcentaje_subsidio / 100);
    ELSE
        SET v_subsidio_consumo = 0;
        SET v_subsidio_cargo_fijo = 0;
    END IF;
    SET v_subsidio_total = v_subsidio_consumo + v_subsidio_cargo_fijo;
    
    -- ============================================
    -- CALCULAR MULTAS
    -- ============================================
    -- Obtener deuda anterior
    SELECT COALESCE(SUM(saldo), 0) INTO v_saldo_anterior
    FROM deudas
    WHERE Id_cliente = p_socio AND estado_deuda = 5 AND tenant_id = p_tenant_id;
    
    -- Multa por atraso
    IF v_saldo_anterior > 0 AND v_multa_atraso_flag = 1 THEN
        SET v_multa_atraso_valor = ROUND(v_saldo_anterior * v_multa_atraso_tarifa / 100);
    ELSE
        SET v_multa_atraso_valor = 0;
    END IF;
    
    -- Multa por corte
    IF v_multa_corte_flag = 1 THEN
        SET v_multa_corte_valor = v_corte_reposicion;
    ELSE
        SET v_multa_corte_valor = 0;
    END IF;
    
    -- Multa matriz
    IF v_multa_matriz_flag = 1 THEN
        SET v_multa_matriz_valor = v_corte_matriz;
    ELSE
        SET v_multa_matriz_valor = 0;
    END IF;
    
    -- ============================================
    -- CALCULAR REPACTACIÓN
    -- ============================================
    SELECT 
        COUNT(*), valor_cuota, no_cuotas, ult_cuota_facturada
    INTO
        v_tiene_repactacion, v_valor_cuota, v_no_cuotas, v_ult_cuota_facturada
    FROM repactaciones
    WHERE Id_cliente = p_socio AND estado_repactacion = 0 AND tenant_id = p_tenant_id
    LIMIT 1;
    
    IF v_tiene_repactacion > 0 AND v_ult_cuota_facturada < v_no_cuotas THEN
        SET v_valor_cuota = v_valor_cuota;
    ELSE
        SET v_valor_cuota = 0;
    END IF;
    
    -- ============================================
    -- CALCULAR TOTALES
    -- ============================================
    SET v_total_mes_actual = v_consumo_total + v_cargo_fijo + v_alcantarillado_valor 
                            + v_cargo_mortuoria - v_subsidio_total;
    SET v_total_boleta = v_total_mes_actual + v_saldo_anterior + v_multa_atraso_valor 
                        + v_multa_corte_valor + v_multa_matriz_valor + v_valor_cuota;
    
    -- ============================================
    -- OBTENER ID DE BOLETA Y FECHAS
    -- ============================================
    SELECT AUTO_INCREMENT INTO v_prox_id_boletas
    FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'boletas';
    
    SET v_prox_id_boleta = COALESCE(v_prox_id_boletas, 1);
    
    SET v_fecha_lectura = CURDATE();
    SET v_fecha_vencimiento = DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 25 DAY), '%Y-%m-%d');
    
    -- ============================================
    -- OBTENER IDs DE TIPOS DE CARGO
    -- ============================================
    SELECT 
        MAX(CASE WHEN codigo = 'CONSUMO_BASE' THEN id_tipo_cargo END),
        MAX(CASE WHEN codigo = 'CONSUMO_TRAMO1' THEN id_tipo_cargo END),
        MAX(CASE WHEN codigo = 'CARGO_FIJO' THEN id_tipo_cargo END),
        MAX(CASE WHEN codigo = 'ALCANTARILLADO' THEN id_tipo_cargo END),
        MAX(CASE WHEN codigo = 'CUOTA_MORTUORIA' THEN id_tipo_cargo END),
        MAX(CASE WHEN codigo = 'MULTA_ATRASO' THEN id_tipo_cargo END),
        MAX(CASE WHEN codigo = 'MULTA_CORTE' THEN id_tipo_cargo END),
        MAX(CASE WHEN codigo = 'MULTA_MATRIZ' THEN id_tipo_cargo END),
        MAX(CASE WHEN codigo = 'SUBSIDIO' THEN id_tipo_cargo END),
        MAX(CASE WHEN codigo = 'REPACTACION' THEN id_tipo_cargo END),
        MAX(CASE WHEN codigo = 'SALDO_ANTERIOR' THEN id_tipo_cargo END)
    INTO
        v_tc_consumo_base, v_tc_consumo_tramo1, v_tc_cargo_fijo,
        v_tc_alcantarillado, v_tc_mortuoria, v_tc_multa_atraso,
        v_tc_multa_corte, v_tc_multa_matriz, v_tc_subsidio,
        v_tc_repactacion, v_tc_saldo_anterior
    FROM tipos_cargo
    WHERE activo = 1;
    
    -- ============================================
    -- INSERT EN DEUDAS
    -- ============================================
    INSERT INTO deudas (
        tenant_id,
        Id_cliente, Id_boleta, fecha, monto, respaldo_monto, 
        estado_deuda, saldo, respaldo_saldo, estado_saldo
    ) VALUES (
        p_tenant_id,
        p_socio, v_prox_id_boleta, CURDATE(), v_total_boleta, 0, 
        5, v_saldo_anterior, 0, 5
    );

    -- ============================================
    -- INSERT EN BOLETAS (mantiene compatibilidad)
    -- ============================================
    INSERT INTO boletas (
        tenant_id,
        num_boleta, id_cliente, tipo_de_docto, fecha_a_pagar, fecha_vencimiento, 
        lectura_ant_m3, lectura_act_m3, cosumo_m3, total_mes_act, cargo_fijo, 
        alcantarillado, subsidio, consumo, saldo_anterior, total_boleta, estado_pago, 
        cuota_mortuoria, donaciones, multa_atraso, tramo_base, tramo1, tramo2, tramo3, 
        subsidio1, subsidio2, subsidio3, subsidio4, subsidio5, repactacion, 
        fecha_toma_lectura, num_medidor, repactaciones,
        -- Datos APR (columnas obligatorias)
        nombre_servicio, rut_servicio, direccion_servicio, comuna_servicio,
        fono_oficina_servicio, rep_legal_servicio, fono_contacto_rep_legal,
        -- Datos Cliente (columnas obligatorias)
        nombre, rut, direccion, ciudad
    ) VALUES (
        p_tenant_id,
        0, p_socio, v_id_tipo_documento, CURDATE(), v_fecha_vencimiento, 
        p_lant, p_lact, v_consumo_m3, v_total_mes_actual, v_cargo_fijo, 
        v_alcantarillado_valor, v_subsidio_total, v_consumo_total, v_saldo_anterior, v_total_boleta, 5, 
        v_cargo_mortuoria, 0, v_multa_atraso_valor, v_metraje_base, v_metraje_tramo1, v_metraje_tramo2, v_metraje_tramo3, 
        v_subsidio_consumo, 0, 0, 0, 0, 0, 
        v_fecha_lectura, v_numero_medidor, v_valor_cuota,
        -- Valores APR
        v_apr_nombre, v_apr_rut, v_apr_direccion, v_apr_comuna,
        v_apr_telefono, v_apr_representante, v_apr_telefono_rep,
        -- Valores Cliente
        v_cliente_nombre, v_cliente_rut, v_cliente_direccion, v_cliente_ciudad
    );

    -- ============================================
    -- INSERT EN BOLETAS_DETALLE
    -- (Inserts condicionales - compatible MySQL 5.6)
    -- ============================================
    
    -- Consumo base
    IF v_metraje_base > 0 AND v_tc_consumo_base IS NOT NULL THEN
        INSERT INTO boletas_detalle (tenant_id, id_boleta, id_tipo_cargo, cantidad, valor_unitario, monto)
        VALUES (p_tenant_id, v_prox_id_boleta, v_tc_consumo_base, LEAST(v_consumo_m3, v_inicio1 - 1), v_precio_metro3, v_metraje_base);
    END IF;
    
    -- Consumo tramo 1
    IF v_metraje_tramo1 > 0 AND v_tc_consumo_tramo1 IS NOT NULL THEN
        INSERT INTO boletas_detalle (tenant_id, id_boleta, id_tipo_cargo, cantidad, valor_unitario, monto)
        VALUES (p_tenant_id, v_prox_id_boleta, v_tc_consumo_tramo1, v_consumo_m3 + 1 - v_inicio1, v_sobreconsumo1, v_metraje_tramo1);
    END IF;
    
    -- Cargo fijo
    IF v_cargo_fijo > 0 AND v_tc_cargo_fijo IS NOT NULL THEN
        INSERT INTO boletas_detalle (tenant_id, id_boleta, id_tipo_cargo, cantidad, valor_unitario, monto)
        VALUES (p_tenant_id, v_prox_id_boleta, v_tc_cargo_fijo, 1, v_cargo_fijo, v_cargo_fijo);
    END IF;
    
    -- Alcantarillado
    IF v_alcantarillado_valor > 0 AND v_tc_alcantarillado IS NOT NULL THEN
        INSERT INTO boletas_detalle (tenant_id, id_boleta, id_tipo_cargo, cantidad, valor_unitario, monto)
        VALUES (p_tenant_id, v_prox_id_boleta, v_tc_alcantarillado, 1, v_alcantarillado_valor, v_alcantarillado_valor);
    END IF;
    
    -- Cuota mortuoria
    IF v_cargo_mortuoria > 0 AND v_tc_mortuoria IS NOT NULL THEN
        INSERT INTO boletas_detalle (tenant_id, id_boleta, id_tipo_cargo, cantidad, valor_unitario, monto)
        VALUES (p_tenant_id, v_prox_id_boleta, v_tc_mortuoria, 1, v_cargo_mortuoria, v_cargo_mortuoria);
    END IF;
    
    -- Multa atraso
    IF v_multa_atraso_valor > 0 AND v_tc_multa_atraso IS NOT NULL THEN
        INSERT INTO boletas_detalle (tenant_id, id_boleta, id_tipo_cargo, cantidad, valor_unitario, monto)
        VALUES (p_tenant_id, v_prox_id_boleta, v_tc_multa_atraso, 1, v_multa_atraso_valor, v_multa_atraso_valor);
    END IF;
    
    -- Multa corte
    IF v_multa_corte_valor > 0 AND v_tc_multa_corte IS NOT NULL THEN
        INSERT INTO boletas_detalle (tenant_id, id_boleta, id_tipo_cargo, cantidad, valor_unitario, monto)
        VALUES (p_tenant_id, v_prox_id_boleta, v_tc_multa_corte, 1, v_multa_corte_valor, v_multa_corte_valor);
    END IF;
    
    -- Multa matriz
    IF v_multa_matriz_valor > 0 AND v_tc_multa_matriz IS NOT NULL THEN
        INSERT INTO boletas_detalle (tenant_id, id_boleta, id_tipo_cargo, cantidad, valor_unitario, monto)
        VALUES (p_tenant_id, v_prox_id_boleta, v_tc_multa_matriz, 1, v_multa_matriz_valor, v_multa_matriz_valor);
    END IF;
    
    -- Subsidio
    IF v_subsidio_total > 0 AND v_tc_subsidio IS NOT NULL THEN
        INSERT INTO boletas_detalle (tenant_id, id_boleta, id_tipo_cargo, cantidad, valor_unitario, monto)
        VALUES (p_tenant_id, v_prox_id_boleta, v_tc_subsidio, 1, v_subsidio_total, v_subsidio_total);
    END IF;
    
    -- Repactación
    IF v_valor_cuota > 0 AND v_tc_repactacion IS NOT NULL THEN
        INSERT INTO boletas_detalle (tenant_id, id_boleta, id_tipo_cargo, cantidad, valor_unitario, monto)
        VALUES (p_tenant_id, v_prox_id_boleta, v_tc_repactacion, 1, v_valor_cuota, v_valor_cuota);
    END IF;
    
    -- Saldo anterior
    IF v_saldo_anterior > 0 AND v_tc_saldo_anterior IS NOT NULL THEN
        INSERT INTO boletas_detalle (tenant_id, id_boleta, id_tipo_cargo, cantidad, valor_unitario, monto)
        VALUES (p_tenant_id, v_prox_id_boleta, v_tc_saldo_anterior, 1, v_saldo_anterior, v_saldo_anterior);
    END IF;

    -- NUEVO: Guardar snapshot histórico (CONCAT para MySQL 5.6)
    INSERT INTO boletas_snapshot (tenant_id, id_boleta, snapshot_datos, fecha_creacion)
    VALUES (
        p_tenant_id,
        v_prox_id_boleta,
        CONCAT(
            '{"datos_cliente":{"nombre":"', REPLACE(IFNULL(v_cliente_nombre, ''), '"', '\\"'), '",',
            '"rut":"', IFNULL(v_cliente_rut, ''), '",',
            '"direccion":"', REPLACE(IFNULL(v_cliente_direccion, ''), '"', '\\"'), '",',
            '"ciudad":"', REPLACE(IFNULL(v_cliente_ciudad, 'Sin especificar'), '"', '\\"'), '",',
            '"sector":"', REPLACE(IFNULL(v_cliente_sector, ''), '"', '\\"'), '",',
            '"numero_medidor":"', IFNULL(v_numero_medidor, '0'), '"},',
            '"datos_apr":{"nombre_servicio":"', REPLACE(IFNULL(v_apr_nombre, ''), '"', '\\"'), '",',
            '"rut_servicio":"', IFNULL(v_apr_rut, ''), '",',
            '"direccion_servicio":"', REPLACE(IFNULL(v_apr_direccion, ''), '"', '\\"'), '",',
            '"comuna_servicio":"', REPLACE(IFNULL(v_apr_comuna, ''), '"', '\\"'), '",',
            '"telefono_oficina":"', IFNULL(v_apr_telefono, ''), '",',
            '"representante_legal":"', REPLACE(IFNULL(v_apr_representante, ''), '"', '\\"'), '",',
            '"telefono_representante":"', IFNULL(v_apr_telefono_rep, ''), '"},',
            '"datos_boleta":{"num_boleta":0,',
            '"fecha_emision":"', CURDATE(), '",',
            '"fecha_vencimiento":"', IFNULL(v_fecha_vencimiento, ''), '",',
            '"total_boleta":', IFNULL(v_total_boleta, 0), ',',
            '"estado_pago":5,',
            '"lectura_anterior":', IFNULL(p_lant, 0), ',',
            '"lectura_actual":', IFNULL(p_lact, 0), ',',
            '"consumo_m3":', IFNULL(v_consumo_m3, 0), '}}'
        ),
        CURDATE()
    );

    -- ============================================
    -- ACTUALIZAR ESTADO DEL SOCIO
    -- ============================================
    IF v_estado_socio < 3 THEN
        UPDATE clientes 
        SET estado_socio = estado_socio + 1 
        WHERE Id_cliente = p_socio AND tenant_id = p_tenant_id;
    END IF;
    
    COMMIT;
END //

DELIMITER ;
