USE [Sis2000_qa];
GO

IF OBJECT_ID('dbo.sp_TarjetaRegistrarLoteTarjetas_simplificado', 'P') IS NOT NULL
    DROP PROCEDURE dbo.sp_TarjetaRegistrarLoteTarjetas_simplificado;
GO

CREATE PROCEDURE dbo.sp_TarjetaRegistrarLoteTarjetas_simplificado
    @p_xnombre_lote VARCHAR(200),
    @p_ccanalalt INT,
    @p_cproducto NUMERIC(20, 0),
    @p_cantidad INT,
    @p_cusuario INT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @v_ctarlot INT;
    DECLARE @v_contador INT = 1;
    DECLARE @v_cplan CHAR(6);
    DECLARE @v_cramos CHAR(6);

    -- 1. Intentar obtener cplan y cramos directamente vinculados al producto
    SELECT TOP 1 
        @v_cramos = CAST(cramo AS CHAR(6)),
        @v_cplan = cplan
    FROM maplanes 
    WHERE LTRIM(RTRIM(cproducto)) = LTRIM(RTRIM(@p_cproducto)) AND iestado = 'V';

    -- 2. Si no se encuentra vinculación directa, buscar el ramo del producto y el primer plan del ramo
    IF @v_cplan IS NULL
    BEGIN
        SELECT TOP 1 @v_cramos = CAST(cramo AS CHAR(6)) 
        FROM maproductos 
        WHERE cproducto = @p_cproducto;

        SELECT TOP 1 @v_cplan = cplan 
        FROM maplanes 
        WHERE cramo = CAST(@v_cramos AS SMALLINT) AND iestado = 'V'
        ORDER BY cplan;
    END

    -- 3. Fallbacks finales de seguridad
    IF @v_cplan IS NULL OR @v_cplan = '' SET @v_cplan = '1';
    IF @v_cramos IS NULL OR @v_cramos = '' SET @v_cramos = '5';

    BEGIN TRY
        BEGIN TRANSACTION;

        -- Insertar el lote con cplan y cramos
        INSERT INTO tatarlot (xnombre_lote, ccanalalt, cplan, cramos, fingreso, cusuario)
        VALUES (@p_xnombre_lote, @p_ccanalalt, @v_cplan, @v_cramos, GETDATE(), @p_cusuario);

        -- Obtener el ID del lote creado
        SET @v_ctarlot = SCOPE_IDENTITY();

        -- Generar las tarjetas
        WHILE @v_contador <= @p_cantidad
        BEGIN
            DECLARE @v_nro_tarjeta VARCHAR(8);
            DECLARE @v_codigo_unico VARCHAR(8);

            -- Generar número de tarjeta único
            SET @v_nro_tarjeta = RIGHT('00000000' + CAST(ABS(CHECKSUM(NEWID())) % 100000000 AS VARCHAR), 8);
            
            -- Generar código único
            SET @v_codigo_unico =
                CHAR(65 + ABS(CHECKSUM(NEWID())) % 26) +
                CHAR(65 + ABS(CHECKSUM(NEWID())) % 26) +
                CHAR(65 + ABS(CHECKSUM(NEWID())) % 26) +
                CHAR(48 + ABS(CHECKSUM(NEWID())) % 10) +
                CHAR(48 + ABS(CHECKSUM(NEWID())) % 10) +
                CHAR(65 + ABS(CHECKSUM(NEWID())) % 26) +
                CHAR(48 + ABS(CHECKSUM(NEWID())) % 10) +
                CHAR(65 + ABS(CHECKSUM(NEWID())) % 26);

            -- Insertar la tarjeta
            INSERT INTO tatarjeta (ctarlot, nro_tarjeta, xcodigo_unico, iestado, fingreso, cusuario)  
            VALUES (@v_ctarlot, @v_nro_tarjeta, @v_codigo_unico, 1, GETDATE(), @p_cusuario);

            SET @v_contador = @v_contador + 1;
        END

        COMMIT TRANSACTION;

        -- Devolver resultado exitoso
        SELECT
            @v_ctarlot AS ctarlot,
            @p_xnombre_lote AS xnombre_lote,
            @p_ccanalalt AS ccanalalt,
            @v_cplan AS cplan,
            @v_cramos AS cramos,
            @p_cantidad AS cantidad_generada,
            'Lote creado exitosamente con plan y ramos' AS mensaje,
            1 AS success;

    END TRY
    BEGIN CATCH
        IF @@TRANCOUNT > 0
            ROLLBACK TRANSACTION;

        -- Devolver error
        SELECT
            0 AS ctarlot,
            ERROR_MESSAGE() AS mensaje,
            0 AS success;
    END CATCH
END
GO

PRINT 'SP sp_TarjetaRegistrarLoteTarjetas_simplificado creado exitosamente'
GO
