-- Seleccionar base de datos
USE testing_votaciones;
GO


DROP FUNCTION IF EXISTS dbo.obj_regiones_tipos;
GO
CREATE FUNCTION dbo.obj_regiones_tipos(@id INT, @lazy INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @json NVARCHAR(MAX);

    IF @lazy = 1
    BEGIN
        SELECT @json = (
            SELECT nombre
            FROM dbo.catalogo_regiones_tipo
            WHERE pk_tipo = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *
            FROM dbo.catalogo_regiones_tipo
            WHERE pk_tipo = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;

    RETURN @json;
END;
GO


DROP FUNCTION IF EXISTS dbo.obj_regiones;
GO
CREATE FUNCTION dbo.obj_regiones(@id INT, @lazy INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @json NVARCHAR(MAX);

    IF @lazy = 1
    BEGIN
        SELECT @json = (
            SELECT nombre
            FROM dbo.catalogo_regiones
            WHERE pk_region = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *
                , JSON_QUERY(dbo.obj_regiones_tipos(pk_tipo, 0)) AS pk_tipo_json
                , JSON_QUERY(dbo.obj_regiones(pk_region_mayor, 0)) AS pk_region_mayor_json
            FROM dbo.catalogo_regiones
            WHERE pk_region = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;
    
    RETURN @json;
END;
GO


DROP FUNCTION IF EXISTS TJT.obj_tarjetas_propietarios_tipos;
GO
CREATE FUNCTION TJT.obj_tarjetas_propietarios_tipos(@id INT, @lazy INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @json NVARCHAR(MAX);

    IF @lazy = 1
    BEGIN
        SELECT @json = (
            SELECT nombre
            FROM TJT.tarjetas_propietarios_tipos
            WHERE id_tarjeta_propietario_tipo = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *
            FROM TJT.tarjetas_propietarios_tipos
            WHERE id_tarjeta_propietario_tipo = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;

    RETURN @json;
END;
GO


DROP FUNCTION IF EXISTS TJT.obj_tarjetas_tipos;
GO
CREATE FUNCTION TJT.obj_tarjetas_tipos(@id INT, @lazy INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @json NVARCHAR(MAX);

    IF @lazy = 1
    BEGIN
        SELECT @json = (
            SELECT nombre
            FROM TJT.tarjetas_tipos
            WHERE id_tarjeta_tipo = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *
            FROM TJT.tarjetas_tipos
            WHERE id_tarjeta_tipo = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;

    RETURN @json;
END;
GO


DROP FUNCTION IF EXISTS TJT.obj_bancos;
GO
CREATE FUNCTION TJT.obj_bancos(@id INT, @lazy INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @json NVARCHAR(MAX);

    IF @lazy = 1
    BEGIN
        SELECT @json = (
            SELECT nombre
            FROM TJT.bancos
            WHERE id_banco = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *,
                JSON_QUERY(dbo.obj_regiones(id_region, 0)) AS id_region_json
            FROM TJT.bancos
            WHERE id_banco = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;

    RETURN @json;
END;
GO


DROP FUNCTION IF EXISTS TJT.obj_tarjetas;
GO
CREATE FUNCTION TJT.obj_tarjetas(@id INT, @lazy INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @json NVARCHAR(MAX);

    IF @lazy = 1
    BEGIN
        SELECT @json = (
            SELECT id_tarjeta
                , numero
            FROM TJT.tarjetas
            WHERE id_tarjeta = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT id_tarjeta
                , numero
                -- TODO: HARDCODED
                , JSON_QUERY(
                    CASE 
                        WHEN id_tarjeta_propietario_tipo = 1 THEN especializadas_seguridad.dbo.obj_usuarios(id_tarjeta_propietario_id, 0)
                        WHEN id_tarjeta_propietario_tipo = 2 THEN TJT.obj_empresas_empleados(id_tarjeta_propietario_id, 0)
                        WHEN id_tarjeta_propietario_tipo = 3 THEN TJT.obj_empresas_departamentos(id_tarjeta_propietario_id, 0)
                        ELSE NULL
                    END
                ) AS id_tarjeta_propietario_id_json
                , JSON_QUERY(
                    TJT.obj_tarjetas_tipos(id_tarjeta_tipo, 0)
                ) AS id_tarjeta_tipo_json
                , JSON_QUERY(
                    TJT.obj_bancos(id_banco, 0)
                ) AS id_banco_json
            FROM TJT.tarjetas
            WHERE id_tarjeta = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;

    RETURN @json;
END;
GO


DROP FUNCTION IF EXISTS TJT.obj_empresas_empleados;
GO
CREATE FUNCTION TJT.obj_empresas_empleados(@id INT, @lazy INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @json NVARCHAR(MAX);

    IF @lazy = 1
    BEGIN
        SELECT @json = (
            SELECT nombres
                , apellidos
                , identidad
            FROM TJT.empresas_empleados
            WHERE id_empresa_empleado = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *,
                JSON_QUERY(especializadas_seguridad.dbo.obj_empresas(id_empresa, 0)) AS id_empresa_json
            FROM TJT.empresas_empleados
            WHERE id_empresa_empleado = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;

    RETURN @json;
END;
GO


DROP FUNCTION IF EXISTS TJT.obj_empresas_departamentos;
GO
CREATE FUNCTION TJT.obj_empresas_departamentos(@id INT, @lazy INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @json NVARCHAR(MAX);

    IF @lazy = 1
    BEGIN
        SELECT @json = (
            SELECT nombre
            FROM TJT.empresas_departamentos
            WHERE id_empresa_departamento = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *,
                JSON_QUERY(especializadas_seguridad.dbo.obj_empresas(id_empresa, 0)) AS id_empresa_json
            FROM TJT.empresas_departamentos
            WHERE id_empresa_departamento = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;

    RETURN @json;
END;
GO


DROP FUNCTION IF EXISTS TJT.obj_tarjetas_beneficios;
GO
CREATE FUNCTION TJT.obj_tarjetas_beneficios(@id INT, @lazy INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @json NVARCHAR(MAX);

    IF @lazy = 1
    BEGIN
        SELECT @json = (
            SELECT nombre
                , monto
                , tasa
                , suma_o_resta
            FROM TJT.tarjetas_beneficios
            WHERE id_tarjeta_beneficio = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *,
                JSON_QUERY(TJT.obj_tarjetas(id_tarjeta, 0)) AS id_tarjeta_json
            FROM TJT.tarjetas_beneficios
            WHERE id_tarjeta_beneficio = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;

    RETURN @json;
END;
GO


DROP FUNCTION IF EXISTS TJT.obj_tarjetas_intereses;
GO
CREATE FUNCTION TJT.obj_tarjetas_intereses(@id INT, @lazy INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @json NVARCHAR(MAX);

    IF @lazy = 1
    BEGIN
        SELECT @json = (
            SELECT nombre
                , monto
                , tasa
                , suma_o_resta
            FROM TJT.tarjetas_intereses
            WHERE id_tarjeta_interes = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *,
                JSON_QUERY(TJT.obj_tarjetas(id_tarjeta, 0)) AS id_tarjeta_json
            FROM TJT.tarjetas_intereses
            WHERE id_tarjeta_interes = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;

    RETURN @json;
END;
GO


DROP FUNCTION IF EXISTS TJT.obj_cuentas;
GO
CREATE FUNCTION TJT.obj_cuentas(@id INT, @lazy INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @json NVARCHAR(MAX);

    IF @lazy = 1
    BEGIN
        SELECT @json = (
            SELECT nombre
                , codigo_contable
            FROM TJT.cuentas
            WHERE id_cuenta = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *
            FROM TJT.cuentas
            WHERE id_cuenta = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;

    RETURN @json;
END;
GO


DROP FUNCTION IF EXISTS TJT.obj_tarjetas_gastos_categorias;
GO
CREATE FUNCTION TJT.obj_tarjetas_gastos_categorias(@id INT, @lazy INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @json NVARCHAR(MAX);

    IF @lazy = 1
    BEGIN
        SELECT @json = (
            SELECT nombre
            FROM TJT.tarjetas_gastos_categorias
            WHERE id_tarjeta_gasto_categoria = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *
            FROM TJT.tarjetas_gastos_categorias
            WHERE id_tarjeta_gasto_categoria = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;

    RETURN @json;
END;
GO


DROP FUNCTION IF EXISTS TJT.obj_tarjetas_gastos;
GO
CREATE FUNCTION TJT.obj_tarjetas_gastos(@id INT, @lazy INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @json NVARCHAR(MAX);

    IF @lazy = 1
    BEGIN
        SELECT @json = (
            SELECT id_tarjeta
                , id_tarjeta_gasto_categoria
                , monto
            FROM TJT.tarjetas_gastos
            WHERE id_tarjeta_gasto = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *
                , JSON_QUERY(TJT.obj_tarjetas(id_tarjeta, 0)) AS id_tarjeta_json
                , JSON_QUERY(TJT.obj_tarjetas_gastos_categorias(id_tarjeta_gasto_categoria, 0)) AS id_tarjeta_gasto_categoria_json
            FROM TJT.tarjetas_gastos
            WHERE id_tarjeta_gasto = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;

    RETURN @json;
END;
GO


DROP FUNCTION IF EXISTS TJT.obj_cuentas_gastos_asignaciones;
GO
CREATE FUNCTION TJT.obj_cuentas_gastos_asignaciones(@id INT, @lazy INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @json NVARCHAR(MAX);

    IF @lazy = 1
    BEGIN
        SELECT @json = (
            SELECT id_cuenta
                , id_tarjeta_gasto
            FROM TJT.cuentas_gastos_asignaciones
            WHERE id_cuenta_gasto_asignacion = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *,
                JSON_QUERY(TJT.obj_cuentas(id_cuenta, 0)) AS id_cuenta_json,
                JSON_QUERY(TJT.obj_tarjetas_gastos(id_tarjeta_gasto, 0)) AS id_tarjeta_gasto_json
            FROM TJT.cuentas_gastos_asignaciones
            WHERE id_cuenta_gasto_asignacion = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;

    RETURN @json;
END;
GO


DROP FUNCTION IF EXISTS TJT.obj_tarjetas_pagos;
GO
CREATE FUNCTION TJT.obj_tarjetas_pagos(@id INT, @lazy INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @json NVARCHAR(MAX);

    IF @lazy = 1
    BEGIN
        SELECT @json = (
            SELECT id_tarjeta
                , id_tarjeta_gasto
                , monto_pagado
                , fecha_hora_pago
            FROM TJT.tarjetas_pagos
            WHERE id_tarjeta_pago = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *,
                JSON_QUERY(TJT.obj_tarjetas(id_tarjeta, 0)) AS id_tarjeta_json,
                JSON_QUERY(TJT.obj_tarjetas_gastos(id_tarjeta_gasto, 0)) AS id_tarjeta_gasto_json
            FROM TJT.tarjetas_pagos
            WHERE id_tarjeta_pago = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;

    RETURN @json;
END;
GO


DROP FUNCTION IF EXISTS TJT.obj_presupuestos_recipientes_tipos;
GO
CREATE FUNCTION TJT.obj_presupuestos_recipientes_tipos(@id INT, @lazy INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @json NVARCHAR(MAX);

    IF @lazy = 1
    BEGIN
        SELECT @json = (
            SELECT nombre
            FROM TJT.presupuestos_recipientes_tipos
            WHERE id_presupuesto_recipiente_tipo = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *
            FROM TJT.presupuestos_recipientes_tipos
            WHERE id_presupuesto_recipiente_tipo = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;

    RETURN @json;
END;
GO


DROP FUNCTION IF EXISTS TJT.obj_presupuestos;
GO
CREATE FUNCTION TJT.obj_presupuestos(@id INT, @lazy INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @json NVARCHAR(MAX);

    IF @lazy = 1
    BEGIN
        SELECT @json = (
            SELECT id_presupuesto_recipiente_id
                , id_presupuesto_recipiente_tipo
                , monto
            FROM TJT.presupuestos
            WHERE id_presupuesto = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *,
                JSON_QUERY(TJT.obj_presupuestos_recipientes_tipos(id_presupuesto_recipiente_tipo, 0)) AS id_presupuesto_recipiente_tipo_json,
                -- TODO: HARDCODED
                JSON_QUERY(CASE 
                    WHEN id_presupuesto_recipiente_tipo = 1 THEN TJT.obj_tarjetas(id_presupuesto_recipiente_id, 0)
                    WHEN id_presupuesto_recipiente_tipo = 2 THEN TJT.obj_tarjetas_gastos_categorias(id_presupuesto_recipiente_id, 0)
                    WHEN id_presupuesto_recipiente_tipo = 3 THEN TJT.obj_cuentas(id_presupuesto_recipiente_id, 0)
                    ELSE NULL
                END) AS id_presupuesto_recipiente_id_json
            FROM TJT.presupuestos
            WHERE id_presupuesto = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;

    RETURN @json;
END;
GO


DROP FUNCTION IF EXISTS TJT.obj_backups;
GO
CREATE FUNCTION TJT.obj_backups(@id INT, @lazy INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @json NVARCHAR(MAX);

    IF @lazy = 1
    BEGIN
        SELECT @json = (
            SELECT backup_tipo
                , estatus
                , tamano_mb
            FROM TJT.backups
            WHERE id_backup = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *
            FROM TJT.backups
            WHERE id_backup = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;

    RETURN @json;
END;
GO


DROP FUNCTION IF EXISTS TJT.obj_audit_log;
GO
CREATE FUNCTION TJT.obj_audit_log(@id INT, @lazy INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @json NVARCHAR(MAX);

    IF @lazy = 1
    BEGIN
        SELECT @json = (
            SELECT usuario
                , entidad_afectada
                , id_entidad
                , accion
            FROM TJT.audit_log
            WHERE id_audit_log = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *
            FROM TJT.audit_log
            WHERE id_audit_log = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;

    RETURN @json;
END;
GO


DROP FUNCTION IF EXISTS TJT.obj_aichat_mensajes;
GO
CREATE FUNCTION TJT.obj_aichat_mensajes(@id INT, @lazy INT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @json NVARCHAR(MAX);

    IF @lazy = 1
    BEGIN
        SELECT @json = (
            SELECT mensaje
                , id_usuario
            FROM TJT.aichat_mensajes
            WHERE id_mensaje = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *,
                JSON_QUERY(especializadas_seguridad.dbo.obj_usuarios(id_usuario, 0)) AS id_usuario_json
            FROM TJT.aichat_mensajes
            WHERE id_mensaje = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
        );
    END;

    RETURN @json;
END;
GO










DROP PROCEDURE IF EXISTS TJT.get_tarjetas_propietarios_tipos;
GO
CREATE PROCEDURE TJT.get_tarjetas_propietarios_tipos
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT
AS
BEGIN
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    EXEC especializadas_seguridad.dbo.obtain_permisos_usuario
        @varUsuario = @varUsuario, @varCodigoPermiso = 'get_tarjetas_propietarios_tipos', @varIdModulo = 3, @id_usuario = @id_usuario OUTPUT, @id_empresa = @id_empresa OUTPUT, @acceso_todos = @acceso_todos OUTPUT, @acceso_empresa = @acceso_empresa OUTPUT, @acceso_propio = @acceso_propio OUTPUT;

    -- Ejecutar con filtro según permisos
    SELECT T.*
    FROM TJT.tarjetas_propietarios_tipos T
    LEFT JOIN especializadas_seguridad.dbo.usuarios U ON T.creado_por = U.usuario
    WHERE (@varPK = 0 OR T.id_tarjeta_propietario_tipo = @varPK)
        AND (@opc = 0 OR T.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND T.creado_por = @varUsuario)
        );
END;
GO

DROP PROCEDURE IF EXISTS TJT.get_tarjetas_tipos;
GO
CREATE PROCEDURE TJT.get_tarjetas_tipos
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT
AS
BEGIN
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    EXEC especializadas_seguridad.dbo.obtain_permisos_usuario
        @varUsuario = @varUsuario, @varCodigoPermiso = 'get_tarjetas_tipos', @varIdModulo = 3, @id_usuario = @id_usuario OUTPUT, @id_empresa = @id_empresa OUTPUT, @acceso_todos = @acceso_todos OUTPUT, @acceso_empresa = @acceso_empresa OUTPUT, @acceso_propio = @acceso_propio OUTPUT;

    SELECT T.*
    FROM TJT.tarjetas_tipos T
    LEFT JOIN especializadas_seguridad.dbo.usuarios U ON T.creado_por = U.usuario
    WHERE (@varPK = 0 OR T.id_tarjeta_tipo = @varPK)
        AND (@opc = 0 OR T.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND T.creado_por = @varUsuario)
        );
END;
GO

DROP PROCEDURE IF EXISTS TJT.get_bancos;
GO
CREATE PROCEDURE TJT.get_bancos
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT
AS
BEGIN
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    EXEC especializadas_seguridad.dbo.obtain_permisos_usuario
        @varUsuario = @varUsuario, @varCodigoPermiso = 'get_bancos', @varIdModulo = 3, @id_usuario = @id_usuario OUTPUT, @id_empresa = @id_empresa OUTPUT, @acceso_todos = @acceso_todos OUTPUT, @acceso_empresa = @acceso_empresa OUTPUT, @acceso_propio = @acceso_propio OUTPUT;

    SELECT T.*,
        dbo.obj_regiones(T.id_region, 0) AS id_region_json
    FROM TJT.bancos T
    LEFT JOIN especializadas_seguridad.dbo.usuarios U ON T.creado_por = U.usuario
    WHERE (@varPK = 0 OR T.id_banco = @varPK)
        AND (@opc = 0 OR T.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND T.creado_por = @varUsuario)
        );
END;
GO










-- DROP PROCEDURE IF EXISTS TJT.get_tarjetas;
-- GO
-- CREATE PROCEDURE TJT.get_tarjetas
--     @varPK INT,
--     @varUsuario VARCHAR(50),
--     @opc INT
-- AS
-- BEGIN
--     DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

--     EXEC especializadas_seguridad.dbo.obtain_permisos_usuario
--         @varUsuario = @varUsuario, @varCodigoPermiso = 'get_tarjetas', @varIdModulo = 3, @id_usuario = @id_usuario OUTPUT, @id_empresa = @id_empresa OUTPUT, @acceso_todos = @acceso_todos OUTPUT, @acceso_empresa = @acceso_empresa OUTPUT, @acceso_propio = @acceso_propio OUTPUT;

--     SELECT T.*,
--         -- TODO: HARDCODED
--         CASE 
--             WHEN T.id_tarjeta_propietario_tipo = 1 THEN especializadas_seguridad.dbo.obj_usuarios(T.id_tarjeta_propietario_id, 0)
--             WHEN T.id_tarjeta_propietario_tipo = 2 THEN TJT.obj_empresas_empleados(T.id_tarjeta_propietario_id, 0)
--             WHEN T.id_tarjeta_propietario_tipo = 3 THEN TJT.obj_empresas_departamentos(T.id_tarjeta_propietario_id, 0)
--             ELSE NULL
--         END AS id_tarjeta_propietario_id_json,
--         TJT.obj_tarjetas_tipos(T.id_tarjeta_tipo, 0) AS id_tarjeta_tipo_json,
--         TJT.obj_bancos(T.id_banco, 0) AS id_banco_json
--     FROM TJT.tarjetas T
--     LEFT JOIN especializadas_seguridad.dbo.usuarios U ON T.creado_por = U.usuario
--     WHERE (@varPK = 0 OR T.id_tarjeta = @varPK)
--         AND (@opc = 0 OR T.estado <> 3)
--         AND (
--             @acceso_todos = 1
--             OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
--             OR (@acceso_propio = 1 AND T.creado_por = @varUsuario)
--         );
-- END;
-- GO

-- EXEC TJT.get_tarjetas
--     @varPK = 0,
--     @varUsuario = 'TESTER_TARJETAS_3',
--     @opc = 1;


DROP FUNCTION IF EXISTS TJT.fn_get_tarjetas;
GO
CREATE FUNCTION TJT.fn_get_tarjetas (
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT,
    @lazy INT
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    --
    DECLARE @json NVARCHAR(MAX);
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    -- USE testing_votaciones;

    -- DECLARE @varPK INT = 0;
    -- DECLARE @varUsuario VARCHAR(50) = 'SERGICAST02';
    -- DECLARE @opc INT = 1;

    SELECT 
        @acceso_todos = P.acceso_todos
        , @acceso_empresa = P.acceso_empresa
        , @acceso_propio = P.acceso_propio
        , @id_usuario = P.id_usuario
        , @id_empresa = P.id_empresa
    FROM OPENJSON(especializadas_seguridad.dbo.fn_obtain_permisos_usuario(@varUsuario, 3, 'get_tarjetas'))
    WITH (
        acceso_todos INT
        , acceso_empresa INT
        , acceso_propio INT
        , id_usuario INT
        , id_empresa INT
    ) AS P;


    -- Generar JSON con los resultados filtrados
    SELECT @json = 
        '[' + STRING_AGG(TJT.obj_tarjetas(T.id_tarjeta, @lazy), ',') + ']'
    FROM TJT.tarjetas T
    LEFT JOIN especializadas_seguridad.dbo.usuarios U ON T.creado_por = U.usuario
    WHERE (@varPK = 0 OR T.id_tarjeta = @varPK)
        AND (@opc = 0 OR T.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND T.creado_por = @varUsuario)
    );

    -- 
    -- SELECT @json;
    RETURN @json;
END;
GO

---------------------------------------------------------------------------------









DROP PROCEDURE IF EXISTS TJT.get_empresas_empleados;
GO
CREATE PROCEDURE TJT.get_empresas_empleados
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT
AS
BEGIN
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    EXEC especializadas_seguridad.dbo.obtain_permisos_usuario
        @varUsuario = @varUsuario, @varCodigoPermiso = 'get_empresas_empleados', @varIdModulo = 3, @id_usuario = @id_usuario OUTPUT, @id_empresa = @id_empresa OUTPUT, @acceso_todos = @acceso_todos OUTPUT, @acceso_empresa = @acceso_empresa OUTPUT, @acceso_propio = @acceso_propio OUTPUT;

    SELECT T.*,
        especializadas_seguridad.dbo.obj_empresas(T.id_empresa, 0) AS id_empresa_json
    FROM TJT.empresas_empleados T
    LEFT JOIN especializadas_seguridad.dbo.usuarios U ON T.creado_por = U.usuario
    WHERE (@varPK = 0 OR T.id_empresa_empleado = @varPK)
        AND (@opc = 0 OR T.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND T.creado_por = @varUsuario)
        );
END;
GO

DROP PROCEDURE IF EXISTS TJT.get_empresas_departamentos;
GO
CREATE PROCEDURE TJT.get_empresas_departamentos
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT
AS
BEGIN
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    EXEC especializadas_seguridad.dbo.obtain_permisos_usuario
        @varUsuario = @varUsuario, @varCodigoPermiso = 'get_empresas_departamentos', @varIdModulo = 3, @id_usuario = @id_usuario OUTPUT, @id_empresa = @id_empresa OUTPUT, @acceso_todos = @acceso_todos OUTPUT, @acceso_empresa = @acceso_empresa OUTPUT, @acceso_propio = @acceso_propio OUTPUT;

    SELECT T.*,
        especializadas_seguridad.dbo.obj_empresas(T.id_empresa, 0) AS id_empresa_json
    FROM TJT.empresas_departamentos T
    LEFT JOIN especializadas_seguridad.dbo.usuarios U ON T.creado_por = U.usuario
    WHERE (@varPK = 0 OR T.id_empresa_departamento = @varPK)
        AND (@opc = 0 OR T.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND T.creado_por = @varUsuario)
        );
END;
GO

DROP PROCEDURE IF EXISTS TJT.get_tarjetas_beneficios;
GO
CREATE PROCEDURE TJT.get_tarjetas_beneficios
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT
AS
BEGIN
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    EXEC especializadas_seguridad.dbo.obtain_permisos_usuario
        @varUsuario = @varUsuario, @varCodigoPermiso = 'get_tarjetas_beneficios', @varIdModulo = 3, @id_usuario = @id_usuario OUTPUT, @id_empresa = @id_empresa OUTPUT, @acceso_todos = @acceso_todos OUTPUT, @acceso_empresa = @acceso_empresa OUTPUT, @acceso_propio = @acceso_propio OUTPUT;

    SELECT T.*,
        TJT.obj_tarjetas(T.id_tarjeta, 0) AS id_tarjeta_json
    FROM TJT.tarjetas_beneficios T
    LEFT JOIN especializadas_seguridad.dbo.usuarios U ON T.creado_por = U.usuario
    WHERE (@varPK = 0 OR T.id_tarjeta_beneficio = @varPK)
        AND (@opc = 0 OR T.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND T.creado_por = @varUsuario)
        );
END;
GO

DROP PROCEDURE IF EXISTS TJT.get_tarjetas_intereses;
GO
CREATE PROCEDURE TJT.get_tarjetas_intereses
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT
AS
BEGIN
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    EXEC especializadas_seguridad.dbo.obtain_permisos_usuario
        @varUsuario = @varUsuario, @varCodigoPermiso = 'get_tarjetas_intereses', @varIdModulo = 3, @id_usuario = @id_usuario OUTPUT, @id_empresa = @id_empresa OUTPUT, @acceso_todos = @acceso_todos OUTPUT, @acceso_empresa = @acceso_empresa OUTPUT, @acceso_propio = @acceso_propio OUTPUT;

    SELECT T.*,
        TJT.obj_tarjetas(T.id_tarjeta, 0) AS id_tarjeta_json
    FROM TJT.tarjetas_intereses T
    LEFT JOIN especializadas_seguridad.dbo.usuarios U ON T.creado_por = U.usuario
    WHERE (@varPK = 0 OR T.id_tarjeta_interes = @varPK)
        AND (@opc = 0 OR T.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND T.creado_por = @varUsuario)
        );
END;
GO

DROP PROCEDURE IF EXISTS TJT.get_cuentas;
GO
CREATE PROCEDURE TJT.get_cuentas
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT
AS
BEGIN
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    EXEC especializadas_seguridad.dbo.obtain_permisos_usuario
        @varUsuario = @varUsuario, @varCodigoPermiso = 'get_cuentas', @varIdModulo = 3, @id_usuario = @id_usuario OUTPUT, @id_empresa = @id_empresa OUTPUT, @acceso_todos = @acceso_todos OUTPUT, @acceso_empresa = @acceso_empresa OUTPUT, @acceso_propio = @acceso_propio OUTPUT;

    SELECT T.*
    FROM TJT.cuentas T
    LEFT JOIN especializadas_seguridad.dbo.usuarios U ON T.creado_por = U.usuario
    WHERE (@varPK = 0 OR T.id_cuenta = @varPK)
        AND (@opc = 0 OR T.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND T.creado_por = @varUsuario)
        );
END;
GO

DROP PROCEDURE IF EXISTS TJT.get_tarjetas_gastos_categorias;
GO
CREATE PROCEDURE TJT.get_tarjetas_gastos_categorias
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT
AS
BEGIN
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    EXEC especializadas_seguridad.dbo.obtain_permisos_usuario
        @varUsuario = @varUsuario, @varCodigoPermiso = 'get_tarjetas_gastos_categorias', @varIdModulo = 3, @id_usuario = @id_usuario OUTPUT, @id_empresa = @id_empresa OUTPUT, @acceso_todos = @acceso_todos OUTPUT, @acceso_empresa = @acceso_empresa OUTPUT, @acceso_propio = @acceso_propio OUTPUT;

    SELECT T.*
    FROM TJT.tarjetas_gastos_categorias T
    LEFT JOIN especializadas_seguridad.dbo.usuarios U ON T.creado_por = U.usuario
    WHERE (@varPK = 0 OR T.id_tarjeta_gasto_categoria = @varPK)
        AND (@opc = 0 OR T.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND T.creado_por = @varUsuario)
        );
END;
GO

DROP PROCEDURE IF EXISTS TJT.get_tarjetas_gastos;
GO
CREATE PROCEDURE TJT.get_tarjetas_gastos
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT
AS
BEGIN
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    EXEC especializadas_seguridad.dbo.obtain_permisos_usuario
        @varUsuario = @varUsuario, @varCodigoPermiso = 'get_tarjetas_gastos', @varIdModulo = 3, @id_usuario = @id_usuario OUTPUT, @id_empresa = @id_empresa OUTPUT, @acceso_todos = @acceso_todos OUTPUT, @acceso_empresa = @acceso_empresa OUTPUT, @acceso_propio = @acceso_propio OUTPUT;

    SELECT T.*,
        TJT.obj_tarjetas(T.id_tarjeta, 0) AS id_tarjeta_json,
        TJT.obj_tarjetas_gastos_categorias(T.id_tarjeta_gasto_categoria, 0) AS id_tarjeta_gasto_categoria_json,
        TJT.obj_cuentas(A.id_cuenta, 0) AS id_cuenta_json
    FROM TJT.tarjetas_gastos T
    LEFT JOIN especializadas_seguridad.dbo.usuarios U ON T.creado_por = U.usuario
    LEFT JOIN TJT.cuentas_gastos_asignaciones A ON T.id_tarjeta_gasto = A.id_tarjeta_gasto
    WHERE (@varPK = 0 OR T.id_tarjeta_gasto = @varPK)
        AND (@opc = 0 OR T.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND T.creado_por = @varUsuario)
        );
END;
GO



DROP FUNCTION IF EXISTS TJT.fn_get_tarjetas_gastos;
GO
CREATE FUNCTION TJT.fn_get_tarjetas_gastos (
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT,
    @lazy INT
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    --
    DECLARE @json NVARCHAR(MAX);
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    -- USE testing_votaciones;

    -- DECLARE @varPK INT = 0;
    -- DECLARE @varUsuario VARCHAR(50) = 'SERGICAST02';
    -- DECLARE @opc INT = 1;
    -- TODO agregar lazy
    -- DECLARE @lazy INT = 1;

    SELECT 
        @acceso_todos = P.acceso_todos
        , @acceso_empresa = P.acceso_empresa
        , @acceso_propio = P.acceso_propio
        , @id_usuario = P.id_usuario
        , @id_empresa = P.id_empresa
    FROM OPENJSON(especializadas_seguridad.dbo.fn_obtain_permisos_usuario(@varUsuario, 3, 'get_tarjetas_gastos'))
    WITH (
        acceso_todos INT
        , acceso_empresa INT
        , acceso_propio INT
        , id_usuario INT
        , id_empresa INT
    ) AS P;


    -- Generar JSON con los resultados filtrados
    SELECT @json = 
        '[' + STRING_AGG(TJT.obj_tarjetas_gastos(T.id_tarjeta_gasto, @lazy), ',') + ']'
    FROM TJT.tarjetas_gastos T
    LEFT JOIN especializadas_seguridad.dbo.usuarios U ON T.creado_por = U.usuario
    -- LEFT JOIN TJT.cuentas_gastos_asignaciones A ON T.id_tarjeta_gasto = A.id_tarjeta_gasto
    WHERE (@varPK = 0 OR T.id_tarjeta_gasto = @varPK)
        AND (@opc = 0 OR T.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND T.creado_por = @varUsuario)
        );

    -- 
    -- SELECT @json;
    RETURN @json;
END;
GO


DROP PROCEDURE IF EXISTS TJT.get_cuentas_gastos_asignaciones;
GO
CREATE PROCEDURE TJT.get_cuentas_gastos_asignaciones
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT
AS
BEGIN
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    EXEC especializadas_seguridad.dbo.obtain_permisos_usuario
        @varUsuario = @varUsuario, @varCodigoPermiso = 'get_cuentas_gastos_asignaciones', @varIdModulo = 3, @id_usuario = @id_usuario OUTPUT, @id_empresa = @id_empresa OUTPUT, @acceso_todos = @acceso_todos OUTPUT, @acceso_empresa = @acceso_empresa OUTPUT, @acceso_propio = @acceso_propio OUTPUT;

    SELECT T.*,
        TJT.obj_cuentas(T.id_cuenta, 0) AS id_cuenta_json,
        TJT.obj_tarjetas_gastos(T.id_tarjeta_gasto, 0) AS id_tarjeta_gasto_json
    FROM TJT.cuentas_gastos_asignaciones T
    LEFT JOIN especializadas_seguridad.dbo.usuarios U ON T.creado_por = U.usuario
    WHERE (@varPK = 0 OR T.id_cuenta_gasto_asignacion = @varPK)
        AND (@opc = 0 OR T.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND T.creado_por = @varUsuario)
        );
END;
GO

DROP PROCEDURE IF EXISTS TJT.get_tarjetas_pagos;
GO
CREATE PROCEDURE TJT.get_tarjetas_pagos
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT
AS
BEGIN
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    EXEC especializadas_seguridad.dbo.obtain_permisos_usuario
        @varUsuario = @varUsuario, @varCodigoPermiso = 'get_tarjetas_pagos', @varIdModulo = 3, @id_usuario = @id_usuario OUTPUT, @id_empresa = @id_empresa OUTPUT, @acceso_todos = @acceso_todos OUTPUT, @acceso_empresa = @acceso_empresa OUTPUT, @acceso_propio = @acceso_propio OUTPUT;

    SELECT T.*,
        TJT.obj_tarjetas(T.id_tarjeta, 0) AS id_tarjeta_json,
        TJT.obj_tarjetas_gastos(T.id_tarjeta_gasto, 0) AS id_tarjeta_gasto_json
    FROM TJT.tarjetas_pagos T
    LEFT JOIN especializadas_seguridad.dbo.usuarios U ON T.creado_por = U.usuario
    WHERE (@varPK = 0 OR T.id_tarjeta_pago = @varPK)
        AND (@opc = 0 OR T.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND T.creado_por = @varUsuario)
        );
END;
GO



DROP FUNCTION IF EXISTS TJT.fn_get_tarjetas_pagos;
GO
CREATE FUNCTION TJT.fn_get_tarjetas_pagos (
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT,
    @lazy INT
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    --
    DECLARE @json NVARCHAR(MAX);
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    -- USE testing_votaciones;

    -- DECLARE @varPK INT = 0;
    -- DECLARE @varUsuario VARCHAR(50) = 'SERGICAST02';
    -- DECLARE @opc INT = 1;
    -- TODO agregar lazy
    -- DECLARE @lazy INT = 1;

    SELECT 
        @acceso_todos = P.acceso_todos
        , @acceso_empresa = P.acceso_empresa
        , @acceso_propio = P.acceso_propio
        , @id_usuario = P.id_usuario
        , @id_empresa = P.id_empresa
    FROM OPENJSON(especializadas_seguridad.dbo.fn_obtain_permisos_usuario(@varUsuario, 3, 'get_tarjetas_pagos'))
    WITH (
        acceso_todos INT
        , acceso_empresa INT
        , acceso_propio INT
        , id_usuario INT
        , id_empresa INT
    ) AS P;


    -- Generar JSON con los resultados filtrados
    SELECT @json = 
        '[' + STRING_AGG(TJT.obj_tarjetas_pagos(T.id_tarjeta_pago, @lazy), ',') + ']'
    FROM TJT.tarjetas_pagos T
    LEFT JOIN especializadas_seguridad.dbo.usuarios U ON T.creado_por = U.usuario
    WHERE (@varPK = 0 OR T.id_tarjeta_pago = @varPK)
        AND (@opc = 0 OR T.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND T.creado_por = @varUsuario)
        );

    -- 
    -- SELECT @json;
    RETURN @json;
END;
GO


DROP PROCEDURE IF EXISTS TJT.get_presupuestos_recipientes_tipos;
GO
CREATE PROCEDURE TJT.get_presupuestos_recipientes_tipos
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT
AS
BEGIN
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    EXEC especializadas_seguridad.dbo.obtain_permisos_usuario
        @varUsuario = @varUsuario, @varCodigoPermiso = 'get_presupuestos_recipientes_tipos', @varIdModulo = 3, @id_usuario = @id_usuario OUTPUT, @id_empresa = @id_empresa OUTPUT, @acceso_todos = @acceso_todos OUTPUT, @acceso_empresa = @acceso_empresa OUTPUT, @acceso_propio = @acceso_propio OUTPUT;

    SELECT T.*
    FROM TJT.presupuestos_recipientes_tipos T
    LEFT JOIN especializadas_seguridad.dbo.usuarios U ON T.creado_por = U.usuario
    WHERE (@varPK = 0 OR T.id_presupuesto_recipiente_tipo = @varPK)
        AND (@opc = 0 OR T.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND T.creado_por = @varUsuario)
        );
END;
GO

DROP PROCEDURE IF EXISTS TJT.get_presupuestos;
GO
CREATE PROCEDURE TJT.get_presupuestos
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT
AS
BEGIN
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    EXEC especializadas_seguridad.dbo.obtain_permisos_usuario
        @varUsuario = @varUsuario, @varCodigoPermiso = 'get_presupuestos', @varIdModulo = 3, @id_usuario = @id_usuario OUTPUT, @id_empresa = @id_empresa OUTPUT, @acceso_todos = @acceso_todos OUTPUT, @acceso_empresa = @acceso_empresa OUTPUT, @acceso_propio = @acceso_propio OUTPUT;

    SELECT T.*,
        TJT.obj_presupuestos_recipientes_tipos(T.id_presupuesto_recipiente_tipo, 0) AS id_presupuesto_recipiente_tipo_json,
        -- TODO: HARDCODED
        CASE 
            WHEN id_presupuesto_recipiente_tipo = 1 THEN TJT.obj_tarjetas(id_presupuesto_recipiente_id, 0)
            WHEN id_presupuesto_recipiente_tipo = 2 THEN TJT.obj_tarjetas_gastos_categorias(id_presupuesto_recipiente_id, 0)
            WHEN id_presupuesto_recipiente_tipo = 3 THEN TJT.obj_cuentas(id_presupuesto_recipiente_id, 0)
            ELSE NULL
        END AS id_presupuesto_recipiente_id_json
    FROM TJT.presupuestos T
    LEFT JOIN especializadas_seguridad.dbo.usuarios U ON T.creado_por = U.usuario
    WHERE (@varPK = 0 OR T.id_presupuesto = @varPK)
        AND (@opc = 0 OR T.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND T.creado_por = @varUsuario)
        );
END;
GO

DROP FUNCTION IF EXISTS TJT.fn_get_presupuestos;
GO
CREATE FUNCTION TJT.fn_get_presupuestos (
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT,
    @lazy INT
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    --
    DECLARE @json NVARCHAR(MAX);
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    -- USE testing_votaciones;

    -- DECLARE @varPK INT = 0;
    -- DECLARE @varUsuario VARCHAR(50) = 'SERGICAST02';
    -- DECLARE @opc INT = 1;
    -- TODO agregar lazy
    -- DECLARE @lazy INT = 1;

    SELECT 
        @acceso_todos = P.acceso_todos
        , @acceso_empresa = P.acceso_empresa
        , @acceso_propio = P.acceso_propio
        , @id_usuario = P.id_usuario
        , @id_empresa = P.id_empresa
    FROM OPENJSON(especializadas_seguridad.dbo.fn_obtain_permisos_usuario(@varUsuario, 3, 'get_presupuestos'))
    WITH (
        acceso_todos INT
        , acceso_empresa INT
        , acceso_propio INT
        , id_usuario INT
        , id_empresa INT
    ) AS P;


    -- Generar JSON con los resultados filtrados
    SELECT @json = 
        '[' + STRING_AGG(TJT.obj_presupuestos(T.id_presupuesto, @lazy), ',') + ']'
    FROM TJT.presupuestos T
    LEFT JOIN especializadas_seguridad.dbo.usuarios U ON T.creado_por = U.usuario
    WHERE (@varPK = 0 OR T.id_presupuesto = @varPK)
        AND (@opc = 0 OR T.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND T.creado_por = @varUsuario)
        );

    -- 
    -- SELECT @json;
    RETURN @json;
END;
GO

DROP PROCEDURE IF EXISTS TJT.get_backups;
GO
CREATE PROCEDURE TJT.get_backups
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT
AS
BEGIN
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    EXEC especializadas_seguridad.dbo.obtain_permisos_usuario
        @varUsuario = @varUsuario, @varCodigoPermiso = 'get_backups', @varIdModulo = 3, @id_usuario = @id_usuario OUTPUT, @id_empresa = @id_empresa OUTPUT, @acceso_todos = @acceso_todos OUTPUT, @acceso_empresa = @acceso_empresa OUTPUT, @acceso_propio = @acceso_propio OUTPUT;

    SELECT T.*
    FROM TJT.backups T
    LEFT JOIN especializadas_seguridad.dbo.usuarios U ON T.creado_por = U.usuario
    WHERE (@varPK = 0 OR T.id_backup = @varPK)
        AND (@opc = 0 OR T.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND T.creado_por = @varUsuario)
        );
END;
GO

DROP PROCEDURE IF EXISTS TJT.get_audit_log;
GO
CREATE PROCEDURE TJT.get_audit_log
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT
AS
BEGIN
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    EXEC especializadas_seguridad.dbo.obtain_permisos_usuario
        @varUsuario = @varUsuario, @varCodigoPermiso = 'get_audit_log', @varIdModulo = 3, @id_usuario = @id_usuario OUTPUT, @id_empresa = @id_empresa OUTPUT, @acceso_todos = @acceso_todos OUTPUT, @acceso_empresa = @acceso_empresa OUTPUT, @acceso_propio = @acceso_propio OUTPUT;

    SELECT T.*
    FROM TJT.audit_log T
    LEFT JOIN especializadas_seguridad.dbo.usuarios U ON T.usuario = U.usuario
    WHERE (@varPK = 0 OR T.id_audit_log = @varPK)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND T.usuario = @varUsuario)
        );
END;
GO

DROP PROCEDURE IF EXISTS TJT.get_aichat_mensajes;
GO
CREATE PROCEDURE TJT.get_aichat_mensajes
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT
AS
BEGIN
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    EXEC especializadas_seguridad.dbo.obtain_permisos_usuario
        @varUsuario = @varUsuario, @varCodigoPermiso = 'get_aichat_mensajes', @varIdModulo = 3, @id_usuario = @id_usuario OUTPUT, @id_empresa = @id_empresa OUTPUT, @acceso_todos = @acceso_todos OUTPUT, @acceso_empresa = @acceso_empresa OUTPUT, @acceso_propio = @acceso_propio OUTPUT;

    SELECT T.*,
        especializadas_seguridad.dbo.obj_usuarios(T.id_usuario, 0) AS id_usuario_json
    FROM TJT.aichat_mensajes T
    LEFT JOIN especializadas_seguridad.dbo.usuarios U ON T.creado_por = U.usuario
    WHERE (@varPK = 0 OR T.id_mensaje = @varPK)
        AND (@opc = 0 OR T.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND T.creado_por = @varUsuario)
        );
END;
GO





DROP PROCEDURE IF EXISTS TJT.get_usuarios;
GO
CREATE PROCEDURE TJT.get_usuarios
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT
AS
BEGIN
    -- DECLARE @varPK INT = 0, @varUsuario VARCHAR(50) = 'TESTER_TARJETAS_3', @opc INT = 1;
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    EXEC especializadas_seguridad.dbo.obtain_permisos_usuario
        @varUsuario = @varUsuario, @varCodigoPermiso = 'get_usuarios', @varIdModulo = 3, @id_usuario = @id_usuario OUTPUT, @id_empresa = @id_empresa OUTPUT, @acceso_todos = @acceso_todos OUTPUT, @acceso_empresa = @acceso_empresa OUTPUT, @acceso_propio = @acceso_propio OUTPUT;

    SELECT R.id_usuario, R.usuario, R.id_empresa,
        especializadas_seguridad.dbo.obj_empresas(R.id_empresa, 0) AS id_empresa_json
    FROM especializadas_seguridad.dbo.usuarios R
    INNER JOIN especializadas_seguridad.dbo.usuarios_modulos UM ON R.id_usuario = UM.id_usuario AND UM.id_modulo = 3
    WHERE (@varPK = 0 OR R.id_usuario = @varPK)
        AND (@opc = 0 OR R.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND R.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND R.usuario = @varUsuario)
        );
END;
GO


DROP FUNCTION IF EXISTS TJT.fn_get_usuarios;
GO
CREATE FUNCTION TJT.fn_get_usuarios (
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT,
    @lazy INT
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    --
    DECLARE @json NVARCHAR(MAX);
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    -- USE testing_votaciones;

    -- DECLARE @varPK INT = 0;
    -- DECLARE @varUsuario VARCHAR(50) = 'SERGICAST02';
    -- DECLARE @opc INT = 1;
    -- TODO agregar lazy
    -- DECLARE @lazy INT = 1;

    SELECT 
        @acceso_todos = P.acceso_todos
        , @acceso_empresa = P.acceso_empresa
        , @acceso_propio = P.acceso_propio
        , @id_usuario = P.id_usuario
        , @id_empresa = P.id_empresa
    FROM OPENJSON(especializadas_seguridad.dbo.fn_obtain_permisos_usuario(@varUsuario, 3, 'get_usuarios'))
    WITH (
        acceso_todos INT
        , acceso_empresa INT
        , acceso_propio INT
        , id_usuario INT
        , id_empresa INT
    ) AS P;


    -- Generar JSON con los resultados filtrados
    SELECT @json = 
        '[' + STRING_AGG(especializadas_seguridad.dbo.obj_usuarios(R.id_usuario, @lazy), ',') + ']'
    FROM especializadas_seguridad.dbo.usuarios R
    INNER JOIN especializadas_seguridad.dbo.usuarios_modulos UM ON R.id_usuario = UM.id_usuario AND UM.id_modulo = 3
    WHERE (@varPK = 0 OR R.id_usuario = @varPK)
        AND (@opc = 0 OR R.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND R.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND R.usuario = @varUsuario)
        );

    -- 
    -- SELECT @json;
    RETURN @json;
END;
GO





DROP PROCEDURE IF EXISTS TJT.get_empresas;
GO
CREATE PROCEDURE TJT.get_empresas
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT
AS
BEGIN
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    EXEC especializadas_seguridad.dbo.obtain_permisos_usuario
        @varUsuario = @varUsuario, @varCodigoPermiso = 'get_empresas', @varIdModulo = 3, @id_usuario = @id_usuario OUTPUT, @id_empresa = @id_empresa OUTPUT, @acceso_todos = @acceso_todos OUTPUT, @acceso_empresa = @acceso_empresa OUTPUT, @acceso_propio = @acceso_propio OUTPUT;

    SELECT R.id_empresa, R.nombre_empresa, R.direccion_empresa, R.telefono
    FROM especializadas_seguridad.dbo.empresas R
    LEFT JOIN especializadas_seguridad.dbo.usuarios U ON R.creado_por = U.usuario
    WHERE (@varPK = 0 OR R.id_empresa = @varPK)
        AND (@opc = 0 OR R.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND R.creado_por = @varUsuario)
        );
END;
GO



DROP FUNCTION IF EXISTS TJT.fn_get_empresas;
GO
CREATE FUNCTION TJT.fn_get_empresas (
    @varPK INT,
    @varUsuario VARCHAR(50),
    @opc INT,
    @lazy INT
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    --
    DECLARE @json NVARCHAR(MAX);
    DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

    -- USE testing_votaciones;

    -- DECLARE @varPK INT = 0;
    -- DECLARE @varUsuario VARCHAR(50) = 'SERGICAST02';
    -- DECLARE @opc INT = 1;
    -- TODO agregar lazy
    -- DECLARE @lazy INT = 1;

    SELECT 
        @acceso_todos = P.acceso_todos
        , @acceso_empresa = P.acceso_empresa
        , @acceso_propio = P.acceso_propio
        , @id_usuario = P.id_usuario
        , @id_empresa = P.id_empresa
    FROM OPENJSON(especializadas_seguridad.dbo.fn_obtain_permisos_usuario(@varUsuario, 3, 'get_empresas'))
    WITH (
        acceso_todos INT
        , acceso_empresa INT
        , acceso_propio INT
        , id_usuario INT
        , id_empresa INT
    ) AS P;


    -- Generar JSON con los resultados filtrados
    SELECT @json = 
        '[' + STRING_AGG(especializadas_seguridad.dbo.obj_empresas(R.id_empresa, @lazy), ',') + ']'
    FROM especializadas_seguridad.dbo.empresas R
    LEFT JOIN especializadas_seguridad.dbo.usuarios U ON R.creado_por = U.usuario
    WHERE (@varPK = 0 OR R.id_empresa = @varPK)
        AND (@opc = 0 OR R.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND R.creado_por = @varUsuario)
        );

    -- 
    -- SELECT @json;
    RETURN @json;
END;
GO



DROP PROCEDURE IF EXISTS TJT.get_ai_context;
GO
-- CREATE PROCEDURE TJT.get_ai_context
--     @varUsuario VARCHAR(50)
-- AS
-- BEGIN
--     DECLARE @acceso_todos INT, @acceso_empresa INT, @acceso_propio INT, @id_usuario INT, @id_empresa INT;

--     EXEC especializadas_seguridad.dbo.obtain_permisos_usuario
--         @varUsuario = @varUsuario, @varCodigoPermiso = 'get_empresas', @varIdModulo = 3, @id_usuario = @id_usuario OUTPUT, @id_empresa = @id_empresa OUTPUT, @acceso_todos = @acceso_todos OUTPUT, @acceso_empresa = @acceso_empresa OUTPUT, @acceso_propio = @acceso_propio OUTPUT;

--     SELECT R.id_empresa, R.nombre_empresa, R.direccion_empresa, R.telefono
--     FROM especializadas_seguridad.dbo.empresas R
--     LEFT JOIN especializadas_seguridad.dbo.usuarios U ON R.creado_por = U.usuario
--     WHERE (@varPK = 0 OR R.id_empresa = @varPK)
--         AND (@opc = 0 OR R.estado <> 3)
--         AND (
--             @acceso_todos = 1
--             OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
--             OR (@acceso_propio = 1 AND R.creado_por = @varUsuario)
--         );
-- END;
-- GO

-- EXEC TJT.get_contexto_para_ia
--     @varUsuario = 'SERGICAST02'
CREATE PROCEDURE TJT.get_ai_context
    @varUsuario VARCHAR(50)
AS
BEGIN
    /*
    * Procedimiento para obtener contexto completo para agente IA
    * Incluye todas las entidades relacionadas con tarjetas y usuario
    * Versión con sección de chat comentada pero conservada
    */
    
    -- 1. Obtener información básica del usuario
    DECLARE @id_usuario INT, @id_empresa INT;
    
    SELECT @id_usuario = id_usuario, @id_empresa = id_empresa 
    FROM especializadas_seguridad.dbo.usuarios 
    WHERE usuario = @varUsuario;
    
    -- 2. Crear objeto JSON con información contextual
    DECLARE @contexto NVARCHAR(MAX);
    
    SET @contexto = (
        SELECT 
            -- =============================================
            -- INFORMACIÓN DEL USUARIO
            -- =============================================
            -- (SELECT 
            --     id_usuario,
            --     usuario,
            --     -- nombre,
            --     -- apellido,
            --     email,
            --     id_empresa,
            --     estado
            --  FROM especializadas_seguridad.dbo.usuarios 
            --  WHERE id_usuario = @id_usuario
            --  FOR JSON PATH, WITHOUT_ARRAY_WRAPPER) AS usuario_actual,
            JSON_QUERY(TJT.fn_get_usuarios(0, @varUsuario, 1, 0)) AS usuario_actual,
            
            
            -- =============================================
            -- INFORMACIÓN DE LA EMPRESA
            -- =============================================
            -- (SELECT 
            --     id_empresa,
            --     nombre_empresa,
            --     direccion_empresa,
            --     telefono,
            --     estado
            --  FROM especializadas_seguridad.dbo.empresas 
            --  WHERE id_empresa = @id_empresa
            --  FOR JSON PATH, WITHOUT_ARRAY_WRAPPER) AS empresa_usuario,
            JSON_QUERY(TJT.fn_get_empresas(0, @varUsuario, 1, 0)) AS empresa_usuario,
            
            
            -- =============================================
            -- TARJETAS DEL USUARIO
            -- =============================================
            -- (SELECT 
            --     T.id_tarjeta,
            --     SUBSTRING(T.numero, LEN(T.numero)-3, 4) AS ultimos_digitos,
            --     TT.nombre AS tipo_tarjeta,
            --     B.nombre AS banco,
            --     -- T.limite_credito,
            --     -- T.saldo_actual,
            --     T.mes_vencimiento,
            --     T.anio_vencimiento
            --  FROM TJT.tarjetas T
            --  JOIN TJT.tarjetas_tipos TT ON T.id_tarjeta_tipo = TT.id_tarjeta_tipo
            --  JOIN TJT.bancos B ON T.id_banco = B.id_banco
            --  WHERE (T.id_tarjeta_propietario_tipo = 1 AND T.id_tarjeta_propietario_id = @id_usuario)
            --     OR T.id_tarjeta IN (
            --         SELECT id_tarjeta FROM TJT.tarjetas T
            --         JOIN TJT.empresas_empleados EE ON T.id_tarjeta_propietario_id = EE.id_empresa_empleado 
            --             AND T.id_tarjeta_propietario_tipo = 2
            --         WHERE EE.id_empresa = @id_empresa
                    
            --         UNION
                    
            --         SELECT id_tarjeta FROM TJT.tarjetas T
            --         JOIN TJT.empresas_departamentos ED ON T.id_tarjeta_propietario_id = ED.id_empresa_departamento 
            --             AND T.id_tarjeta_propietario_tipo = 3
            --         WHERE ED.id_empresa = @id_empresa
            --     )
            --  FOR JSON PATH) AS tarjetas_usuario,
            JSON_QUERY(TJT.fn_get_tarjetas(0, @varUsuario, 1, 0)) AS tarjetas_usuario,
            
            
            -- =============================================
            -- BENEFICIOS DE TARJETAS
            -- =============================================
            (SELECT 
                TB.id_tarjeta_beneficio,
                TB.nombre,
                TB.descripcion,
                -- TB.fecha_inicio,
                -- TB.fecha_fin,
                SUBSTRING(T.numero, LEN(T.numero)-3, 4) AS tarjeta_ultimos_digitos
             FROM TJT.tarjetas_beneficios TB
             JOIN TJT.tarjetas T ON TB.id_tarjeta = T.id_tarjeta
             WHERE T.id_tarjeta IN (
                SELECT id_tarjeta FROM TJT.tarjetas 
                WHERE (id_tarjeta_propietario_tipo = 1 AND id_tarjeta_propietario_id = @id_usuario)
                   OR id_tarjeta IN (
                       SELECT id_tarjeta FROM TJT.tarjetas T
                       JOIN TJT.empresas_empleados EE ON T.id_tarjeta_propietario_id = EE.id_empresa_empleado 
                           AND T.id_tarjeta_propietario_tipo = 2
                       WHERE EE.id_empresa = @id_empresa
                       
                       UNION
                       
                       SELECT id_tarjeta FROM TJT.tarjetas T
                       JOIN TJT.empresas_departamentos ED ON T.id_tarjeta_propietario_id = ED.id_empresa_departamento 
                           AND T.id_tarjeta_propietario_tipo = 3
                       WHERE ED.id_empresa = @id_empresa
                   )
             )
             FOR JSON PATH) AS beneficios_tarjetas,
            
            
            -- =============================================
            -- GASTOS RECIENTES (ÚLTIMOS 10)
            -- =============================================
            -- (SELECT TOP 10
            --     TG.id_tarjeta_gasto,
            --     TG.monto,
            --     TG.descripcion,
            --     CONVERT(VARCHAR, TG.fecha_hora_creado, 120) AS fecha_hora_creado,
            --     TGC.nombre AS categoria,
            --     SUBSTRING(T.numero, LEN(T.numero)-3, 4) AS tarjeta_ultimos_digitos
            --  FROM TJT.tarjetas_gastos TG
            --  JOIN TJT.tarjetas T ON TG.id_tarjeta = T.id_tarjeta
            --  JOIN TJT.tarjetas_gastos_categorias TGC ON TG.id_tarjeta_gasto_categoria = TGC.id_tarjeta_gasto_categoria
            --  WHERE T.id_tarjeta IN (
            --     SELECT id_tarjeta FROM TJT.tarjetas 
            --     WHERE (id_tarjeta_propietario_tipo = 1 AND id_tarjeta_propietario_id = @id_usuario)
            --  )
            --  ORDER BY TG.fecha_hora_creado DESC
            --  FOR JSON PATH) AS gastos_recientes,
             JSON_QUERY(TJT.fn_get_tarjetas_gastos(0, @varUsuario, 1, 0)) AS gastos_recientes,
            
            
            -- =============================================
            -- PAGOS RECIENTES (ÚLTIMOS 10)
            -- =============================================
            -- (SELECT TOP 10
            --     TP.id_tarjeta_pago,
            --     TP.monto_pagado,
            --     -- TP.metodo_pago,
            --     CONVERT(VARCHAR, TP.fecha_hora_pago, 120) AS fecha_hora_pago,
            --     SUBSTRING(T.numero, LEN(T.numero)-3, 4) AS tarjeta_ultimos_digitos
            --  FROM TJT.tarjetas_pagos TP
            --  JOIN TJT.tarjetas T ON TP.id_tarjeta = T.id_tarjeta
            --  WHERE T.id_tarjeta IN (
            --     SELECT id_tarjeta FROM TJT.tarjetas 
            --     WHERE (id_tarjeta_propietario_tipo = 1 AND id_tarjeta_propietario_id = @id_usuario)
            --  )
            --  ORDER BY TP.fecha_hora_pago DESC
            --  FOR JSON PATH) AS pagos_recientes,
             JSON_QUERY(TJT.fn_get_tarjetas_pagos(0, @varUsuario, 1, 0)) AS pagos_recientes,
            
            
            -- =============================================
            -- PRESUPUESTOS
            -- =============================================
            -- (SELECT 
            --     P.id_presupuesto,
            --     P.monto,
            --     -- P.periodo,
            --     CASE 
            --         WHEN P.id_presupuesto_recipiente_tipo = 1 THEN 'Tarjeta: ' + 
            --             (SELECT SUBSTRING(numero, LEN(numero)-3, 4) FROM TJT.tarjetas WHERE id_tarjeta = P.id_presupuesto_recipiente_id)
            --         WHEN P.id_presupuesto_recipiente_tipo = 2 THEN 'Categoría: ' + 
            --             (SELECT nombre FROM TJT.tarjetas_gastos_categorias WHERE id_tarjeta_gasto_categoria = P.id_presupuesto_recipiente_id)
            --         WHEN P.id_presupuesto_recipiente_tipo = 3 THEN 'Cuenta: ' + 
            --             (SELECT nombre FROM TJT.cuentas WHERE id_cuenta = P.id_presupuesto_recipiente_id)
            --         ELSE 'Otro'
            --     END AS recipiente
            --  FROM TJT.presupuestos P
            --  WHERE (P.id_presupuesto_recipiente_tipo = 1 AND P.id_presupuesto_recipiente_id IN (
            --         SELECT id_tarjeta FROM TJT.tarjetas 
            --         WHERE id_tarjeta_propietario_tipo = 1 AND id_tarjeta_propietario_id = @id_usuario
            --     ))
            --     OR (P.creado_por = @varUsuario)
            --  FOR JSON PATH) AS presupuestos
             JSON_QUERY(TJT.fn_get_presupuestos(0, @varUsuario, 1, 0)) AS presupuestos
            
            
            -- =============================================
            -- HISTORIAL DE CHAT CON IA (SECCIÓN COMENTADA)
            -- =============================================
            /*
            ,(SELECT TOP 20
                id_mensaje,
                CONVERT(VARCHAR, fecha_hora_creado, 120) AS fecha,
                mensaje,
                respuesta,
                CASE 
                    WHEN mensaje LIKE '%saldo%' OR mensaje LIKE '%pago%' OR mensaje LIKE '%gasto%' 
                        THEN 'Consulta Financiera'
                    WHEN mensaje LIKE '%beneficio%' OR mensaje LIKE '%promo%' 
                        THEN 'Consulta Beneficios'
                    ELSE 'General'
                END AS tipo_consulta
             FROM TJT.aichat_mensajes 
             WHERE id_usuario = @id_usuario
               AND estado = 1 -- Solo mensajes activos
               AND NOT (mensaje LIKE '%hola%' AND respuesta LIKE '%hola%') -- Excluir saludos
             ORDER BY fecha_hora_creado DESC
             FOR JSON PATH) AS historial_chat
            */
            
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    );
    
    -- 3. Retornar el contexto completo
    SELECT @contexto AS contexto_json;
END;
GO