-- 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)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @json NVARCHAR(MAX);

    SELECT @json = (
        SELECT *
        FROM dbo.catalogo_regiones_tipo
        WHERE pk_tipo = @id
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    );

    RETURN @json;
END;
GO


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

    SELECT @json = (
        SELECT *,
            dbo.obj_regiones_tipos(pk_tipo) AS pk_tipo_json,
            dbo.obj_regiones(pk_region_mayor) AS pk_region_mayor_json
        FROM dbo.catalogo_regiones
        WHERE pk_region = @id
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    );

    RETURN @json;
END;
GO


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

    SELECT @json = (
        SELECT *
        FROM TJT.tarjetas_propietarios_tipos
        WHERE id_tarjeta_propietario_tipo = @id
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    );

    RETURN @json;
END;
GO


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

    SELECT @json = (
        SELECT *
        FROM TJT.tarjetas_tipos
        WHERE id_tarjeta_tipo = @id
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    );

    RETURN @json;
END;
GO


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

    SELECT @json = (
        SELECT *,
            dbo.obj_regiones(id_region) AS id_region_json
        FROM TJT.bancos
        WHERE id_banco = @id
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    );

    RETURN @json;
END;
GO


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

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

    RETURN @json;
END;
GO


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

    SELECT @json = (
        SELECT *,
            especializadas_seguridad.dbo.obj_empresas(id_empresa) AS id_empresa_json
        FROM TJT.empresas_empleados
        WHERE id_empresa_empleado = @id
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    );

    RETURN @json;
END;
GO


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

    SELECT @json = (
        SELECT *,
            especializadas_seguridad.dbo.obj_empresas(id_empresa) AS id_empresa_json
        FROM TJT.empresas_departamentos
        WHERE id_empresa_departamento = @id
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    );

    RETURN @json;
END;
GO


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

    SELECT @json = (
        SELECT *,
            TJT.obj_tarjetas(id_tarjeta) AS id_tarjeta_json
        FROM TJT.tarjetas_beneficios
        WHERE id_tarjeta_beneficio = @id
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    );

    RETURN @json;
END;
GO


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

    SELECT @json = (
        SELECT *,
            TJT.obj_tarjetas(id_tarjeta) AS id_tarjeta_json
        FROM TJT.tarjetas_intereses
        WHERE id_tarjeta_interes = @id
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    );

    RETURN @json;
END;
GO


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

    SELECT @json = (
        SELECT *
        FROM TJT.cuentas
        WHERE id_cuenta = @id
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    );

    RETURN @json;
END;
GO


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

    SELECT @json = (
        SELECT *
        FROM TJT.tarjetas_gastos_categorias
        WHERE id_tarjeta_gasto_categoria = @id
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    );

    RETURN @json;
END;
GO


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

    SELECT @json = (
        SELECT *,
            TJT.obj_tarjetas(id_tarjeta) AS id_tarjeta_json,
            TJT.obj_tarjetas_gastos_categorias(id_tarjeta_gasto_categoria) AS id_tarjeta_gasto_categoria_json
        FROM TJT.tarjetas_gastos
        WHERE id_tarjeta_gasto = @id
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    );

    RETURN @json;
END;
GO


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

    SELECT @json = (
        SELECT *,
            TJT.obj_cuentas(id_cuenta) AS id_cuenta_json,
            TJT.obj_tarjetas_gastos(id_tarjeta_gasto) AS id_tarjeta_gasto_json
        FROM TJT.cuentas_gastos_asignaciones
        WHERE id_cuenta_gasto_asignacion = @id
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    );

    RETURN @json;
END;
GO


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

    SELECT @json = (
        SELECT *,
            TJT.obj_tarjetas(id_tarjeta) AS id_tarjeta_json,
            TJT.obj_tarjetas_gastos(id_tarjeta_gasto) AS id_tarjeta_gasto_json
        FROM TJT.tarjetas_pagos
        WHERE id_tarjeta_pago = @id
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    );

    RETURN @json;
END;
GO


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

    SELECT @json = (
        SELECT *
        FROM TJT.presupuestos_recipientes_tipos
        WHERE id_presupuesto_recipiente_tipo = @id
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    );

    RETURN @json;
END;
GO


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

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

    RETURN @json;
END;
GO


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

    SELECT @json = (
        SELECT *
        FROM TJT.backups
        WHERE id_backup = @id
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    );

    RETURN @json;
END;
GO


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

    SELECT @json = (
        SELECT *
        FROM TJT.audit_log
        WHERE id_audit_log = @id
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    );

    RETURN @json;
END;
GO


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

    SELECT @json = (
        SELECT *,
            especializadas_seguridad.dbo.obj_usuarios(id_usuario) AS id_usuario_json
        FROM TJT.aichat_mensajes
        WHERE id_mensaje = @id
        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    );

    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) 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)
            WHEN T.id_tarjeta_propietario_tipo = 2 THEN TJT.obj_empresas_empleados(T.id_tarjeta_propietario_id)
            WHEN T.id_tarjeta_propietario_tipo = 3 THEN TJT.obj_empresas_departamentos(T.id_tarjeta_propietario_id)
            ELSE NULL
        END AS id_tarjeta_propietario_id_json,
        TJT.obj_tarjetas_tipos(T.id_tarjeta_tipo) AS id_tarjeta_tipo_json,
        TJT.obj_bancos(T.id_banco) 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 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) 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) 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) 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) 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) AS id_tarjeta_json,
        TJT.obj_tarjetas_gastos_categorias(T.id_tarjeta_gasto_categoria) AS id_tarjeta_gasto_categoria_json,
        TJT.obj_cuentas(A.id_cuenta) 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 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) AS id_cuenta_json,
        TJT.obj_tarjetas_gastos(T.id_tarjeta_gasto) 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) AS id_tarjeta_json,
        TJT.obj_tarjetas_gastos(T.id_tarjeta_gasto) 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 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) AS id_presupuesto_recipiente_tipo_json,
        -- TODO: HARDCODED
        CASE 
            WHEN id_presupuesto_recipiente_tipo = 1 THEN TJT.obj_tarjetas(id_presupuesto_recipiente_id)
            WHEN id_presupuesto_recipiente_tipo = 2 THEN TJT.obj_tarjetas_gastos_categorias(id_presupuesto_recipiente_id)
            WHEN id_presupuesto_recipiente_tipo = 3 THEN TJT.obj_cuentas(id_presupuesto_recipiente_id)
            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 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) 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) 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 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