USE [Sis2000]
GO
/** Object:  StoredProcedure [dbo].[sp_generar_asiento_comision_2_0]    Script Date: 29/1/2026 11:30:00 a.m. **/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Autor:       Licenciado Angel Estrada
-- Fecha:       2026-01-29
-- Descripción: Genera asiento contable de comisiones versión 2.0 con cursor
-- =============================================
ALTER PROCEDURE [dbo].[sp_generar_asiento_comision_2_0]
    @fdesde date, 
    @fhasta date
AS
BEGIN
    SET NOCOUNT ON;

    -- Tabla temporal para el asiento
    CREATE TABLE #AsientoComisiones (
        id INT IDENTITY(1,1),
        codigo_cuenta NUMERIC(18,0),
        cuenta_contable NVARCHAR(150),
        descripcion NVARCHAR(MAX),
        debe NUMERIC(17,2),
        haber NUMERIC(17,2)
    );

    -- 1. Declarar variables para el cursor
    DECLARE @csolpag INT;

    -- 2. Declarar el cursor para obtener todas las órdenes de pago en el rango de fechas
    DECLARE mi_cursor CURSOR FOR
    SELECT csolpag 
    FROM adsolpg 
    WHERE istatsol = 'C' and  CONVERT(date,fmovim) >= @fdesde 
    AND CONVERT(date,fmovim) <= @fhasta;

    -- 3. Abrir el cursor
    OPEN mi_cursor;

    -- 4. Leer la primera fila
    FETCH NEXT FROM mi_cursor INTO @csolpag;

    -- 5. Ciclo de procesamiento (mientras haya filas)
    WHILE @@FETCH_STATUS = 0
    BEGIN
        -- Validar si la orden tiene gastos de ramos (imovcom = GR)
        IF EXISTS (
            SELECT 1 FROM admovcom b 
            WHERE b.csolpag = @csolpag 
            AND b.imovcom = 'GR'
        )
        BEGIN
            -- Omitir esta orden por tener gastos de ramos
            PRINT 'Orden ' + CAST(@csolpag AS VARCHAR) + ' omitida por tener gastos de ramos (imovcom = GR)';
        END
        ELSE
        BEGIN
            -- Insertar comisiones agrupadas por ramo para este csolpag
        INSERT INTO #AsientoComisiones (codigo_cuenta, cuenta_contable, descripcion, debe, haber)
        SELECT 
            -- Obtener la primera cuenta contable del ramo
            COALESCE(
                (SELECT TOP 1 TRY_CAST(e2.ncuenta_cont AS NUMERIC(18,0)) 
                 FROM tmcuentcon e2 WHERE e2.cramo = c.cramo),
                0
            ) AS codigo_cuenta,
            'COMISIÓN ' + TRIM(d.xdescripcion_l) AS cuenta_contable,
            LTRIM(RTRIM(p.xproductor)) + ' / ' 
            + LTRIM(RTRIM(d.xdescripcion_l))  + ' - ' +
            'PÓLIZA: ' + LTRIM(RTRIM(c.cnpoliza)) +  
            ' RECIBO: ' + LTRIM(RTRIM(c.cnrecibo)) AS descripcion,
            COALESCE(TRY_CAST(b.mmovcom AS NUMERIC(17,2)), 0) AS debe,
            0.00 AS haber
        FROM 
        adsolpg a INNER JOIN 
        admovcom b ON a.csolpag = b.csolpag INNER JOIN
        adrecibos c ON b.ccodigo = c.crecibo INNER JOIN 
        maramos d ON d.cramo = c.cramo INNER JOIN 
        maproduc p ON p.cproductor = b.cproductor
        WHERE a.csolpag = @csolpag
        -- GROUP BY d.cramo, TRIM(d.xdescripcion_l);

        -- Insertar O.P BANCO / CAJA para este csolpag
        INSERT INTO #AsientoComisiones (codigo_cuenta, cuenta_contable, descripcion, debe, haber)
        SELECT 
            COALESCE(TRY_CAST(e.ncuenta_cont AS NUMERIC(18,0)), 0) AS codigo_cuenta,
            'O.P BANCO / CAJA' AS cuenta_contable,
            'O.P BANCO / CAJA - SOLICITUD ' + CAST(a.csolpag AS VARCHAR(20)) + ' - ' + COALESCE(m.XBANCO, 'BANCO ' + CAST(b.xbanco_1 AS VARCHAR(10))) + ' - CUENTA: ' + b.xcuenta_1 AS descripcion,
            0.00 AS debe,
            a.mpagosol AS haber
        FROM 
        adsolpg a INNER JOIN 
        adsolpg_d b ON b.csolpag = a.csolpag
        LEFT JOIN MABANCO_DESTINO m ON m.CBANCO_DESTINO = b.xbanco_1 AND m.ctipopago = b.tipopago_1
        INNER JOIN tmcuentcon e ON e.cramo = 28
        WHERE a.csolpag = @csolpag
        AND b.xcuenta_1 IS NOT NULL;

        -- Insertar SUSTRAENDO para este csolpag
        INSERT INTO #AsientoComisiones (codigo_cuenta, cuenta_contable, descripcion, debe, haber)
        SELECT 
            COALESCE(TRY_CAST(e.ncuenta_cont AS NUMERIC(18,0)), 0) AS codigo_cuenta,
            'SUSTRAENDO' AS cuenta_contable,
            'SUSTRAENDO - SOLICITUD ' + CAST(a.csolpag AS VARCHAR(20)) AS descripcion,
            ISNULL(a.mmonto_4, 0) AS debe,
            0.00 AS haber
        FROM 
        adsolpg a INNER JOIN 
        tmcuentcon e ON e.cramo = 28
        WHERE a.csolpag = @csolpag
        AND ISNULL(a.mmonto_4, 0) > 0;

        -- Insertar RET. ISLR para este csolpag
        INSERT INTO #AsientoComisiones (codigo_cuenta, cuenta_contable, descripcion, debe, haber)
        SELECT 
            COALESCE(TRY_CAST(e.ncuenta_cont AS NUMERIC(18,0)), 0) AS codigo_cuenta,
            'RET. ISLR' AS cuenta_contable,
            'RET. ISLR - SOLICITUD ' + CAST(a.csolpag AS VARCHAR(20)) AS descripcion,
            0.00 AS debe,   
            ISNULL(a.mislr, 0) AS haber
        FROM 
        adsolpg a INNER JOIN 
        tmcuentcon e ON e.cramo = 28
        WHERE a.csolpag = @csolpag
        AND ISNULL(a.mislr, 0) > 0;

        -- Cerrar el ELSE
        END;

        -- Leer la siguiente fila
        FETCH NEXT FROM mi_cursor INTO @csolpag;
    END;

    -- 6. Cerrar el cursor
    CLOSE mi_cursor;

    -- 7. Liberar la memoria
    DEALLOCATE mi_cursor;

    -- Retornar el asiento generado
    SELECT 
        codigo_cuenta,
        cuenta_contable,
        descripcion,
        debe,
        haber
    FROM #AsientoComisiones
    ORDER BY id;

    -- Limpiar tabla temporal
    DROP TABLE #AsientoComisiones;

END

---angel Estrada







