CREATE PROCEDURE [dbo].[sp_finLeerNomina2]
(
    @CUENTA VARCHAR(10) = '0',
    @fechaHasta DATE = '2050-01-01',
    @RUTINI INT = 0,
    @RUTFIN INT = 999999999,
    @VENCIMIENTO INT = 0,
    @fechaDesde DATE = '1900-01-01',
    @uniNeg INT = 0,
    @nomina INT
)
AS
BEGIN
    SET NOCOUNT ON;
    
    DECLARE @CONCOMPRA INT = (SELECT TOP(1) ISNULL(comprasnocon, 0) FROM cobParametros);
    DECLARE @AHORA DATE = @fechaHasta;
    DECLARE @clasificacion INT = 1;
    DECLARE @esCuenta1 BIT = CASE WHEN LTRIM(SUBSTRING(CONVERT(VARCHAR(10), @cuenta), 1, 1)) = '1' THEN 1 ELSE 0 END;
    DECLARE @esCuenta2 BIT = CASE WHEN LTRIM(SUBSTRING(CONVERT(VARCHAR(10), @cuenta), 1, 1)) = '2' THEN 1 ELSE 0 END;

    -- CUENTAS QUE EMPIEZAN POR 1 (ACTIVOS)
    IF @esCuenta1 = 1
    BEGIN
        -- Crear tabla temporal para comprobantes
        SELECT
            TC.descripcion AS TipoComprobante,
            C.numero,
            C.cuenta,
            C.linea,
            PC.descripcion AS NombreCuenta,
            C.clasificacion,
            C.fecha,
            C.debe,
            C.haber,
            C.glosa_linea,
            C.ctacte,
            CC.digcte,
            CC.nomcte,
            C.tipo_docto,
            C.num_docto,
            C.vencimiento,
            PC.tipoAnalisis,
            C.analisis,
            conAnalisis.descripcion AS descanalisis,
            C.tipo,
            C.uni_negocio,
            C.sistema,
            CASE 
                WHEN CUN.descripcion = '' THEN 'SIN UNIDAD' 
                WHEN CUN.descripcion IS NULL THEN 'SIN UNIDAD'
                ELSE CUN.descripcion
            END AS descripcion,
            C.fecha_emision
        INTO #COMPROBANTES
        FROM conComprobantes AS C
        INNER JOIN conCtacte AS CC ON C.ctacte = CC.rutcte
        LEFT OUTER JOIN conUnidadNegocio as CUN ON C.uni_negocio = CUN.idUniNeg
        INNER JOIN conTipoComprobante AS TC ON C.tipo = TC.codigo
        INNER JOIN conPlanCuentas AS PC ON C.cuenta = PC.cuenta AND YEAR(C.fecha) = PC.periodo
        LEFT OUTER JOIN conAnalisis ON PC.tipoAnalisis = conAnalisis.tipoAnalisis AND C.analisis = conAnalisis.codigoAnalisis
        WHERE (C.fecha BETWEEN @fechaDesde AND @fechaHasta)
            AND (C.ctacte = @RUTINI OR @RUTINI = 0)
            AND (C.uni_negocio = @uniNeg OR @uniNeg IN (-1, 0))
            AND (LEN(C.sistema) >= 2)
            AND (C.clasificacion = 1 OR C.clasificacion = @clasificacion)
            AND (PC.marcaCtacte = 1)
        ORDER BY C.ctacte, C.tipo_docto, C.num_docto, C.periodo, C.numero;

        -- Crear índice para mejorar rendimiento
        CREATE INDEX IX_TEMP_COMPROBANTES ON #COMPROBANTES(ctacte, tipo_docto, num_docto, cuenta);

        -- Consulta principal para cuentas tipo 1
        SELECT
            ISNULL(cyvEncabezado.seleccion, 0) AS seleccion,
            DATOS.rut, 
            DD.nomcte, 
            DATOS.num_documento AS numero, 
            CONVERT(VARCHAR, DATOS.tipo_documento) + '-' + ISNULL(venDocumentos.alias_doc, 'NO DEFINIDO') AS nomdoc, 
            MAX(DD.vencimiento) AS fechaven,
            DATEDIFF(DAY, MAX(cyvEncabezado.fecha_vto), @AHORA) AS dias_mora,    
            SUM(DD.haber) AS monto_docto,
            SUM(DD.debe) AS pagos,
            SUM(CONVERT(DECIMAL(18,2), DD.haber - DD.debe)) AS saldo,
            SUM(CONVERT(DECIMAL(18,2), DD.haber - DD.debe)) AS saldo_ori,
            DD.tipo_docto AS tipo,                    
            0 AS id_misbancos,
            0 AS nomina,
            0 AS id_cheque,
            ISNULL(MAX(cyvEncabezado.fecha_ing), '1900-01-01') AS fechaIng,
            DD.uni_negocio AS unineg     
        FROM finNomina AS DATOS
        LEFT OUTER JOIN #COMPROBANTES DD 
            ON DD.ctacte = DATOS.RUT 
            AND DD.tipo_docto = DATOS.tipo_documento 
            AND DD.num_docto = DATOS.num_documento
        LEFT OUTER JOIN venDocumentos ON DD.tipo_docto = venDocumentos.codsii
        LEFT JOIN cyvEncabezado 
            ON cyvEncabezado.tipo_documento = DATOS.tipo_documento 
            AND cyvEncabezado.num_documento = DATOS.num_documento
            AND cyvEncabezado.rut = DATOS.rut
            AND cyvEncabezado.tipo_ingreso = 1
        WHERE DATOS.nomina = @nomina
            AND (
                (@VENCIMIENTO = 0 AND DD.vencimiento >= @fechaDesde)
                OR (@VENCIMIENTO = 1 AND DD.vencimiento BETWEEN @AHORA AND @fechaHasta)
                OR (@VENCIMIENTO = 2 AND DD.vencimiento BETWEEN @fechaDesde AND @AHORA)
            )
            AND (DD.DEBE > 0)
        GROUP BY 
            DD.ctacte,
            DD.nomcte,
            DATOS.num_documento,
            DATOS.tipo_documento,
            venDocumentos.alias_doc,
            DD.tipo_docto,
            DD.uni_negocio;

        DROP TABLE #COMPROBANTES;
    END;

    -- CUENTAS QUE EMPIEZAN POR 2 (PASIVOS)
    IF @esCuenta2 = 1
    BEGIN
        -- Crear tabla temporal para comprobantes
        SELECT
            TC.descripcion AS TipoComprobante,
            C.numero,
            C.cuenta,
            C.linea,
            PC.descripcion AS NombreCuenta,
            C.clasificacion,
            C.fecha,
            C.debe,
            C.haber,
            C.glosa_linea,
            C.ctacte,
            CC.digcte,
            CC.nomcte,
            C.tipo_docto,
            C.num_docto,
            C.vencimiento,
            PC.tipoAnalisis,
            C.analisis,
            conAnalisis.descripcion AS descanalisis,
            C.tipo,
            C.uni_negocio,
            C.sistema,
            CASE 
                WHEN CUN.descripcion = '' THEN 'SIN UNIDAD' 
                WHEN CUN.descripcion IS NULL THEN 'SIN UNIDAD'
                ELSE CUN.descripcion
            END AS descripcion,
            C.fecha_emision
        INTO #COMPROBANTES2
        FROM conComprobantes AS C
        INNER JOIN conCtacte AS CC ON C.ctacte = CC.rutcte
        LEFT OUTER JOIN conUnidadNegocio as CUN ON C.uni_negocio = CUN.idUniNeg
        INNER JOIN conTipoComprobante AS TC ON C.tipo = TC.codigo
        INNER JOIN conPlanCuentas AS PC ON C.cuenta = PC.cuenta AND YEAR(C.fecha) = PC.periodo
        LEFT OUTER JOIN conAnalisis ON PC.tipoAnalisis = conAnalisis.tipoAnalisis AND C.analisis = conAnalisis.codigoAnalisis
        WHERE (C.fecha BETWEEN @fechaDesde AND @fechaHasta)
            AND (C.ctacte = @RUTINI OR @RUTINI = 0)
            AND (C.uni_negocio = @uniNeg OR @uniNeg IN (-1, 0))
            AND (LEN(C.sistema) >= 2)
            AND (C.clasificacion = 1 OR C.clasificacion = @clasificacion)
            AND (PC.marcaCtacte = 1)
        ORDER BY C.ctacte, C.tipo_docto, C.num_docto, C.periodo, C.numero;

        -- Crear índice para mejorar rendimiento
        CREATE INDEX IX_TEMP_COMPROBANTES2 ON #COMPROBANTES2(ctacte, tipo_docto, num_docto, cuenta);

        -- Consulta principal para cuentas tipo 2
        SELECT
            1 as seleccion,
            DATOS1.rut, 
            DD.nomcte,
            (remTrabajadores.apePaterno + ' ' + remTrabajadores.apeMaterno) as apellidos,
            DATOS1.num_documento AS numero, 
            CONVERT(VARCHAR(18), DD.tipo_docto) + '-' + venDocumentos.alias_doc AS nomdoc, 
            MAX(DD.vencimiento) AS fechaven,
            DATEDIFF(DAY, MAX(DD.vencimiento), @AHORA) AS dias_mora,                
            SUM(DD.haber) AS monto_docto,
            SUM(DD.debe) AS pagos,
            SUM(CONVERT(DECIMAL(18,2), DD.haber - DD.debe)) as saldo,
            SUM(CONVERT(DECIMAL(18,2), DD.haber - DD.debe)) as saldo_ori,
            DD.tipo_docto AS tipo,    
            0 AS id_misbancos,
            finNomina.nomina,
            0 AS id_cheque,
            MAX(cyvEncabezado.fecha_ing) AS fechaIng,
            ISNULL(MAX(cyvEncabezado.unidad_negocio), 0) AS unineg,
            ConCtacte.cuentapago as CuentaBeneficiario,
            conBancos.rut as RutBancoBeneficiario,
            conCtacte.emacte as DireccionEmail,
            ISNULL(conCtacte.tipocuenta, '') as TipoCuenta,
            conCtacte.digcte,
            cyvEncabezado.fecha_ing AS fechaEmision,
            ISNULL(conUnidadNegocio.descripcion, 'SIN UNIDAD') as UniNegDesc,
            cyvEncabezado.url
        FROM FINNOMINA AS DATOS1 
        LEFT JOIN #COMPROBANTES2 DD 
            ON DD.ctacte = DATOS1.rut 
            AND DD.tipo_docto = DATOS1.tipo_documento 
            AND DD.num_docto = DATOS1.num_documento 
        LEFT JOIN venDocumentos ON DD.tipo_docto = venDocumentos.codsii 
        LEFT JOIN conCtacte ON DATOS1.rut = conCtacte.rutcte 
        LEFT JOIN conBancos ON conBancos.idBanco = conCtacte.bancopago 
        LEFT JOIN cyvEncabezado 
            ON cyvEncabezado.tipo_documento = DATOS1.tipo_documento 
            AND cyvEncabezado.rut = DATOS1.rut 
            AND cyvEncabezado.num_documento = DATOS1.num_documento 
            AND cyvEncabezado.tipo_ingreso = 1 
        LEFT JOIN conUnidadNegocio ON cyvEncabezado.unidad_negocio = conUnidadNegocio.idUniNeg 
        LEFT JOIN remTrabajadores 
            ON DATOS1.rut = remTrabajadores.rut 
            AND remTrabajadores.periodo = YEAR(GETDATE()) 
            AND remTrabajadores.mes = MONTH(GETDATE()) 
            AND remTrabajadores.activo = 1 
        LEFT JOIN finNomina 
            ON DATOS1.rut = finNomina.rut 
            AND DATOS1.tipo_documento = finNomina.tipo_documento 
            AND DATOS1.num_documento = finNomina.num_documento
        WHERE
            ISNULL(DD.vencimiento, '19000101') >= @fechaDesde
            AND (cyvEncabezado.unidad_negocio = @uniNeg OR @uniNeg = 0)
            AND DATOS1.nomina = @nomina
        GROUP BY 
            DATOS1.rut,
            DD.nomcte,
            DD.num_docto,
			DATOS1.num_documento,
            DD.tipo_docto,
            venDocumentos.alias_doc,
            ConCtacte.cuentapago,
            conBancos.rut,
            conCtacte.emacte,
            conCtacte.tipocuenta,
            conCtacte.digcte,
            cyvEncabezado.fecha_ing,
            cyvEncabezado.unidad_negocio,
            cyvEncabezado.url,
            conUnidadNegocio.descripcion,
            finNomina.nomina,
            remTrabajadores.apePaterno,
            remTrabajadores.apeMaterno
        ORDER BY apellidos ASC;

        DROP TABLE #COMPROBANTES2;
    END;
END;