-- Seleccionar base de datos
USE data_nexapps;
GO

-- INCLUDE_NULL_VALUES: no elimina las columna del json si todas las filas tienen columna.null


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, INCLUDE_NULL_VALUES
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *
            FROM dbo.catalogo_regiones_tipo
            WHERE pk_tipo = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    END;

    IF @json IS NULL
        SET @json = N'{}';

    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
                , JSON_QUERY(dbo.obj_regiones_tipos(pk_tipo, 1)) AS pk_tipo_json
                , JSON_QUERY(dbo.obj_regiones(pk_region_mayor, 1)) AS pk_region_mayor_json
            FROM dbo.catalogo_regiones
            WHERE pk_region = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    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, INCLUDE_NULL_VALUES
        );
    END;
    
    IF @json IS NULL
        SET @json = N'{}';

    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, INCLUDE_NULL_VALUES
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *
            FROM TJT.tarjetas_propietarios_tipos
            WHERE id_tarjeta_propietario_tipo = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    END;

    IF @json IS NULL
        SET @json = N'{}';

    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, INCLUDE_NULL_VALUES
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *
            FROM TJT.tarjetas_tipos
            WHERE id_tarjeta_tipo = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    END;

    IF @json IS NULL
        SET @json = N'{}';

    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
                , JSON_QUERY(dbo.obj_regiones(id_region, 1)) AS id_region_json
            FROM TJT.bancos
            WHERE id_banco = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    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, INCLUDE_NULL_VALUES
        );
    END;

    IF @json IS NULL
        SET @json = N'{}';

    RETURN @json;
END;
GO

-- USE data_nexapps;
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
                -- el mes y anio en lazy 1 deberia ser usado soloo para get_ai_context
                , mes_vencimiento
                , anio_vencimiento
                -- TODO: HARDCODED
                , JSON_QUERY(
                    CASE 
                        WHEN id_tarjeta_propietario_tipo = 1 THEN seg_nexapps.dbo.obj_usuarios(id_tarjeta_propietario_id, 1)
                        WHEN id_tarjeta_propietario_tipo = 2 THEN TJT.obj_empresas_empleados(id_tarjeta_propietario_id, 1)
                        WHEN id_tarjeta_propietario_tipo = 3 THEN TJT.obj_empresas_departamentos(id_tarjeta_propietario_id, 1)
                        ELSE NULL
                    END
                ) AS id_tarjeta_propietario_id_json
                , JSON_QUERY(
                    TJT.obj_tarjetas_tipos(id_tarjeta_tipo, 1)
                ) AS id_tarjeta_tipo_json
                , JSON_QUERY(
                    TJT.obj_bancos(id_banco, 1)
                ) AS id_banco_json
            FROM TJT.tarjetas
            WHERE id_tarjeta = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT id_tarjeta
                , numero
                -- TODO: HARDCODED
                , JSON_QUERY(
                    CASE 
                        WHEN id_tarjeta_propietario_tipo = 1 THEN seg_nexapps.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
                , fecha_corte
            FROM TJT.tarjetas
            WHERE id_tarjeta = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    END;

    IF @json IS NULL
        SET @json = N'{}';

    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
                , JSON_QUERY(seg_nexapps.dbo.obj_empresas(id_empresa, 1)) AS id_empresa_json
            FROM TJT.empresas_empleados
            WHERE id_empresa_empleado = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *
                , JSON_QUERY(seg_nexapps.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, INCLUDE_NULL_VALUES
        );
    END;

    IF @json IS NULL
        SET @json = N'{}';

    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
                , JSON_QUERY(seg_nexapps.dbo.obj_empresas(id_empresa, 1)) AS id_empresa_json
            FROM TJT.empresas_departamentos
            WHERE id_empresa_departamento = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *
                , JSON_QUERY(seg_nexapps.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, INCLUDE_NULL_VALUES
        );
    END;

    IF @json IS NULL
        SET @json = N'{}';

    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
                , JSON_QUERY(TJT.obj_tarjetas(id_tarjeta, 1)) AS id_tarjeta_json
            FROM TJT.tarjetas_beneficios
            WHERE id_tarjeta_beneficio = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    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, INCLUDE_NULL_VALUES
        );
    END;

    IF @json IS NULL
        SET @json = N'{}';

    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
                , JSON_QUERY(TJT.obj_tarjetas(id_tarjeta, 1)) AS id_tarjeta_json
            FROM TJT.tarjetas_intereses
            WHERE id_tarjeta_interes = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    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, INCLUDE_NULL_VALUES
        );
    END;

    IF @json IS NULL
        SET @json = N'{}';

    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, INCLUDE_NULL_VALUES
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *
            FROM TJT.cuentas
            WHERE id_cuenta = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    END;

    IF @json IS NULL
        SET @json = N'{}';

    RETURN @json;
END;
GO

-- USE data_nexapps;
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,
                JSON_QUERY(TJT.obj_tarjetas(id_tarjeta, 1)) AS id_tarjeta_json
            FROM TJT.tarjetas_gastos_categorias
            WHERE id_tarjeta_gasto_categoria = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    END;
    ELSE IF @lazy = 2
    BEGIN
        SELECT @json = (
            SELECT id_tarjeta, nombre,
                JSON_QUERY(TJT.obj_tarjetas(id_tarjeta, 1)) AS id_tarjeta_json
            FROM TJT.tarjetas_gastos_categorias
            WHERE id_tarjeta_gasto_categoria = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *,
                JSON_QUERY(TJT.obj_tarjetas(id_tarjeta, 0)) AS id_tarjeta_json
            FROM TJT.tarjetas_gastos_categorias
            WHERE id_tarjeta_gasto_categoria = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    END;

    IF @json IS NULL
        SET @json = N'{}';

    RETURN @json;
END;
GO

-- USE data_nexapps;
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
                , fecha_hora_creado
                , JSON_QUERY(TJT.obj_tarjetas(id_tarjeta, 1)) AS id_tarjeta_json
                , JSON_QUERY(TJT.obj_tarjetas_gastos_categorias(id_tarjeta_gasto_categoria, 1)) AS id_tarjeta_gasto_categoria_json
                , JSON_QUERY(TJT.obj_comercios(id_comercio, 1)) AS id_comercio_json
                , JSON_QUERY(TJT.obj_comercios_productos(id_comercio_producto, 1)) AS id_comercio_producto_json
            FROM TJT.tarjetas_gastos
            WHERE id_tarjeta_gasto = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    END;
    ELSE IF @lazy = 2
    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
                , JSON_QUERY(TJT.obj_comercios(id_comercio, 0)) AS id_comercio_json
                , JSON_QUERY(TJT.obj_comercios_productos(id_comercio_producto, 0)) AS id_comercio_producto_json
            FROM TJT.tarjetas_gastos
            WHERE id_tarjeta_gasto = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *
                -- añadimos fecha_corte formateada como 'YYYY-MM'
                , CASE WHEN CAST(DAY(fecha_gasto) AS INT) > CAST(JSON_VALUE(TJT.obj_tarjetas(id_tarjeta, 0), '$.fecha_corte') AS INT)
                    THEN FORMAT(DATEADD(MONTH, 1, fecha_gasto), 'yyyy-MM')
                    ELSE FORMAT(fecha_gasto, 'yyyy-MM')
                END AS mes_corte
                , 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
                , JSON_QUERY(TJT.obj_comercios(id_comercio, 0)) AS id_comercio_json
                , JSON_QUERY(TJT.obj_comercios_productos(id_comercio_producto, 0)) AS id_comercio_producto_json
            FROM TJT.tarjetas_gastos
            WHERE id_tarjeta_gasto = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    END;

    IF @json IS NULL
        SET @json = N'{}';

    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
                , JSON_QUERY(TJT.obj_cuentas(id_cuenta, 1)) AS id_cuenta_json
                , JSON_QUERY(TJT.obj_tarjetas_gastos(id_tarjeta_gasto, 1)) AS id_tarjeta_gasto_json
            FROM TJT.cuentas_gastos_asignaciones
            WHERE id_cuenta_gasto_asignacion = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    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, INCLUDE_NULL_VALUES
        );
    END;

    IF @json IS NULL
        SET @json = N'{}';

    RETURN @json;
END;
GO

-- USE data_nexapps;
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_pago
                , JSON_QUERY(TJT.obj_tarjetas(id_tarjeta, 1)) AS id_tarjeta_json
                , JSON_QUERY(TJT.obj_tarjetas_gastos(id_tarjeta_gasto, 1)) AS id_tarjeta_gasto_json
            FROM TJT.tarjetas_pagos
            WHERE id_tarjeta_pago = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    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, INCLUDE_NULL_VALUES
        );
    END;

    IF @json IS NULL
        SET @json = N'{}';

    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, INCLUDE_NULL_VALUES
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *
            FROM TJT.presupuestos_recipientes_tipos
            WHERE id_presupuesto_recipiente_tipo = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    END;

    IF @json IS NULL
        SET @json = N'{}';

    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
                , JSON_QUERY(TJT.obj_presupuestos_recipientes_tipos(id_presupuesto_recipiente_tipo, 1)) 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, 1)
                    WHEN id_presupuesto_recipiente_tipo = 2 THEN TJT.obj_tarjetas_gastos_categorias(id_presupuesto_recipiente_id, 1)
                    WHEN id_presupuesto_recipiente_tipo = 3 THEN TJT.obj_cuentas(id_presupuesto_recipiente_id, 1)
                    ELSE NULL
                END) AS id_presupuesto_recipiente_id_json
            FROM TJT.presupuestos
            WHERE id_presupuesto = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    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, INCLUDE_NULL_VALUES
        );
    END;

    IF @json IS NULL
        SET @json = N'{}';

    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, INCLUDE_NULL_VALUES
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *
            FROM TJT.backups
            WHERE id_backup = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    END;

    IF @json IS NULL
        SET @json = N'{}';

    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, INCLUDE_NULL_VALUES
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *
            FROM TJT.audit_log
            WHERE id_audit_log = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    END;

    IF @json IS NULL
        SET @json = N'{}';

    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
                , JSON_QUERY(seg_nexapps.dbo.obj_usuarios(id_usuario, 1)) AS id_usuario_json
            FROM TJT.aichat_mensajes
            WHERE id_mensaje = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    END;
    ELSE
    BEGIN
        SELECT @json = (
            SELECT *
                , JSON_QUERY(seg_nexapps.dbo.obj_usuarios(id_usuario, 0)) AS id_usuario_json
            FROM TJT.aichat_mensajes
            WHERE id_mensaje = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    END;

    IF @json IS NULL
        SET @json = N'{}';

    RETURN @json;
END;
GO


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

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

    IF @json IS NULL
        SET @json = N'{}';

    RETURN @json;
END;
GO

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

    IF @lazy = 1
    BEGIN
        SELECT @json = (
            SELECT 
                id_comercio_producto,
                nombre,
                precio,
                url_foto
            FROM TJT.comercios_productos
            WHERE id_comercio_producto = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    END
    ELSE
    BEGIN
        SELECT @json = (
            SELECT 
                *
                , JSON_QUERY(TJT.obj_comercios(id_comercio, 0)) AS id_comercio_json
            FROM TJT.comercios_productos
            WHERE id_comercio_producto = @id
            FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
        );
    END

    IF @json IS NULL
        SET @json = N'{}';

    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 seg_nexapps.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 seg_nexapps.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 seg_nexapps.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 seg_nexapps.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 seg_nexapps.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 seg_nexapps.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 seg_nexapps.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 seg_nexapps.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 seg_nexapps.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 data_nexapps;

    -- 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(seg_nexapps.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 seg_nexapps.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;
    IF @json IS NULL
        SET @json = N'[]';

    RETURN @json;
END;
GO











USE data_nexapps;
-- GO

DROP FUNCTION IF EXISTS TJT.fn_get_tarjetas_estados_cuentas;
GO
CREATE FUNCTION TJT.fn_get_tarjetas_estados_cuentas (
    @varPK INT, -- si es 0 el sp hará algo "inesperado" de mi parte
    -- @varAnioMes VARCHAR(10), -- 2025-05
    @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 data_nexapps;

    -- 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(seg_nexapps.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;


    DECLARE @id_tarjeta INT
        , @usd_hnl DECIMAL(18,2)
        , @limite_credito DECIMAL(18,2)
        , @moneda VARCHAR(10)
        , @numero VARCHAR(MAX)
        , @moneda_nacional VARCHAR(10)
        , @fecha_corte INT
        , @fecha_pago_dias INT
        , @tasa_interes_anual_extranjera DECIMAL(5,2)
        , @tasa_interes_mensual_extranjera DECIMAL(5,2)
        , @tasa_interes_anual_nacional DECIMAL(5,2)
        , @tasa_interes_mensual_nacional DECIMAL(5,2)
        , @tasa_interes_moratorio_anual DECIMAL(5,2)
        , @tasa_interes_moratorio_mensual DECIMAL(5,2)

        , @tasa_sobregiro DECIMAL(5,2)
        , @monto_min_sobregiro DECIMAL(18,2)
        ;

    SELECT
        @id_tarjeta = T.id_tarjeta
        , @limite_credito = T.limite_credito
        , @moneda = T.moneda
        , @numero = T.numero
        , @moneda_nacional = T.moneda_nacional
        , @fecha_corte = T.fecha_corte
        , @fecha_pago_dias = T.fecha_pago_dias
        , @tasa_interes_anual_extranjera = T.tasa_interes_anual_extranjera
        , @tasa_interes_mensual_extranjera = T.tasa_interes_anual_extranjera / 12
        , @tasa_interes_anual_nacional = T.tasa_interes_anual_nacional
        , @tasa_interes_mensual_nacional = T.tasa_interes_anual_nacional / 12
        , @tasa_interes_moratorio_anual = T.tasa_interes_moratorio_anual
        , @tasa_interes_moratorio_mensual = T.tasa_interes_moratorio_anual / 12
        , @tasa_sobregiro = T.tasa_sobregiro
        , @monto_min_sobregiro = T.monto_min_sobregiro
    FROM TJT.tarjetas T
        LEFT JOIN seg_nexapps.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 @usd_hnl = CAST(CAST(valor AS VARCHAR(50)) AS DECIMAL(18,2)) FROM app_beta.dbo.configuraciones WHERE pk_configuracion = 8;



    --
    DECLARE @id_tarjetas_gastos_json VARCHAR(MAX);
    DECLARE @id_tarjetas_pagos_json VARCHAR(MAX);

    DECLARE @fecha_min_gasto DATE, @fecha_max_gasto DATE;
    DECLARE @meses_gastos_json NVARCHAR(MAX);

    SELECT
        @fecha_min_gasto = MIN(CONVERT(DATE, G.fecha_hora_creado)),
        @fecha_max_gasto = MAX(CONVERT(DATE, G.fecha_hora_creado))
    FROM TJT.tarjetas_gastos G
    WHERE G.id_tarjeta = @id_tarjeta
        AND G.estado <> 3;

    DECLARE @ultimo_mes DATE = CASE
    WHEN DAY(GETDATE()) >= @fecha_corte
        -- si hoy es >= día de corte → primer día del mes siguiente
        THEN DATEFROMPARTS(
                YEAR(DATEADD(MONTH, 1, GETDATE())),
                MONTH(DATEADD(MONTH, 1, GETDATE())),
                1
            )
        ELSE
        -- si hoy es < día de corte → primer día del mes actual
        DATEFROMPARTS(
            YEAR(GETDATE()),
            MONTH(GETDATE()),
            1
        )
    END;

    IF @fecha_min_gasto IS NULL OR @fecha_max_gasto IS NULL
    BEGIN
        SET @meses_gastos_json = '[]'; -- No hay gastos, retornamos lista vacía
    END
    ELSE
    BEGIN
        WITH MesesCTE AS (
            SELECT CASE WHEN DAY(@fecha_min_gasto) > @fecha_corte
                    THEN DATEADD(MONTH, 1, CAST(DATEFROMPARTS(YEAR(@fecha_min_gasto), MONTH(@fecha_min_gasto), 1) AS DATE))
                    ELSE CAST(DATEFROMPARTS(YEAR(@fecha_min_gasto), MONTH(@fecha_min_gasto), 1) AS DATE)
                END AS mes
            UNION ALL
            SELECT DATEADD(MONTH, 1, mes)
            FROM MesesCTE
            -- WHERE DATEADD(MONTH, 1, mes) <= DATEFROMPARTS(YEAR(@fecha_max_gasto), MONTH(@fecha_max_gasto), 1)
            WHERE DATEADD(MONTH, 1, mes) <= @ultimo_mes
        )
        SELECT @meses_gastos_json = (
            SELECT FORMAT(mes, 'yyyy-MM') AS mes
            FROM MesesCTE
            FOR JSON PATH
        )
        OPTION (MAXRECURSION 1000);
    END

    SET @id_tarjetas_gastos_json = ISNULL((
        SELECT 
            JSON_QUERY(TJT.obj_tarjetas_gastos(G.id_tarjeta_gasto, 0)) AS id_tarjeta_gasto_json
        FROM TJT.tarjetas_gastos G
        WHERE G.id_tarjeta = @id_tarjeta
            AND G.estado <> 3
            -- AND G.fecha_hora_creado >= @fecha_corte_mes_anterior
            -- AND G.fecha_hora_creado < @fecha_corte_mes
        FOR JSON PATH
    ), '[]');

    SET @id_tarjetas_pagos_json = ISNULL((
        SELECT
            JSON_QUERY(TJT.obj_tarjetas_pagos(P.id_tarjeta_pago, 0)) AS id_tarjeta_pago_json
        FROM TJT.tarjetas_pagos P
        WHERE P.id_tarjeta = @id_tarjeta 
            AND P.estado <> 3
            -- AND P.fecha_hora_creado >= @fecha_corte_mes
            -- AND P.fecha_hora_creado <  @fecha_pago_mes
        FOR JSON PATH
    ), '[]');


    --
    SELECT @json = (
        SELECT
            @id_tarjeta AS id_tarjeta
            , @usd_hnl AS usd_hnl
            , @limite_credito AS limite_credito
            , @moneda AS moneda
            , @numero AS numero
            , @moneda_nacional AS moneda_nacional
            , @fecha_corte AS fecha_corte
            , @fecha_pago_dias AS fecha_pago_dias
            , FORMAT(@ultimo_mes, 'yyyy-MM') AS mes_actual
            , @tasa_interes_anual_extranjera AS tasa_interes_anual_extranjera
            , @tasa_interes_mensual_extranjera AS tasa_interes_mensual_extranjera
            , @tasa_interes_anual_nacional AS tasa_interes_anual_nacional
            , @tasa_interes_mensual_nacional AS tasa_interes_mensual_nacional
            , @tasa_interes_moratorio_anual AS tasa_interes_moratorio_anual
            , @tasa_interes_moratorio_mensual AS tasa_interes_moratorio_mensual


            --
            -- CONVERT(VARCHAR(20), @fecha_corte_mes, 23) AS fecha_corte_verbosed,
            -- CONVERT(VARCHAR(20), @fecha_pago_mes, 23) AS fecha_pago_verbosed,
            , JSON_QUERY(@id_tarjetas_gastos_json) AS id_tarjetas_gastos_json
            , JSON_QUERY(@id_tarjetas_pagos_json) AS id_tarjetas_pagos_json
            -- , @id_tarjetas_gastos_sum AS id_tarjetas_gastos_sum
            -- , @id_tarjetas_pagos_sum AS id_tarjetas_pagos_sum
            -- @limite_credito_disponible AS limite_credito_disponible,
            -- @credito_final AS credito_final,
            -- @credito_sobregirado AS credito_sobregirado
            , JSON_QUERY(@meses_gastos_json) AS meses_gastos_json

            , @tasa_sobregiro AS tasa_sobregiro
            , @monto_min_sobregiro AS monto_min_sobregiro

        FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES
    );
    -- 
    -- SELECT @json;
    IF @json IS NULL
        SET @json = N'[]';

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


















-- USE data_nexapps;
-- GO

-- DROP FUNCTION IF EXISTS TJT.fn_get_tarjetas_estados_cuentas;
-- GO
-- CREATE FUNCTION TJT.fn_get_tarjetas_estados_cuentas (
--     @varPK INT, -- si es 0 el sp hará algo "inesperado" de mi parte
--     @varAnioMes VARCHAR(10), -- 2025-05
--     @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 data_nexapps;

--     -- 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(seg_nexapps.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;


--     DECLARE @id_tarjeta INT
--         , @limite_credito DECIMAL(18,2)
--         , @moneda VARCHAR(10)
--         , @fecha_corte INT
--         , @fecha_pago_dias INT
--         , @tasa_interes_anual_extranjera DECIMAL(5,2)
--         , @tasa_interes_mensual_extranjera DECIMAL(5,2)
--         , @tasa_interes_anual_nacional DECIMAL(5,2)
--         , @tasa_interes_mensual_nacional DECIMAL(5,2)
--         , @tasa_interes_moratorio_anual DECIMAL(5,2)
--         , @tasa_interes_moratorio_mensual DECIMAL(5,2)
--         ;

--     SELECT
--         @id_tarjeta = T.id_tarjeta
--         , @limite_credito = T.limite_credito
--         , @moneda = T.moneda
--         , @fecha_corte = T.fecha_corte
--         , @fecha_pago_dias = T.fecha_pago_dias
--         , @tasa_interes_anual_extranjera = T.tasa_interes_anual_extranjera
--         , @tasa_interes_mensual_extranjera = T.tasa_interes_anual_extranjera / 12
--         , @tasa_interes_anual_nacional = T.tasa_interes_anual_nacional
--         , @tasa_interes_mensual_nacional = T.tasa_interes_anual_nacional / 12
--         , @tasa_interes_moratorio_anual = T.tasa_interes_moratorio_anual
--         , @tasa_interes_moratorio_mensual = T.tasa_interes_moratorio_anual / 12
--     FROM TJT.tarjetas T
--         LEFT JOIN seg_nexapps.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)
--         );


--     --
--     DECLARE @anio INT = CAST(SUBSTRING(@varAnioMes, 1, 4) AS INT)
--         , @mes INT = CAST(SUBSTRING(@varAnioMes, 6, 2) AS INT);

--     DECLARE @fecha_corte_mes DATE;
--     DECLARE @fecha_corte_mes_anterior DATE;
--     DECLARE @fecha_pago_mes DATE;

--     DECLARE @id_tarjetas_gastos_json VARCHAR(MAX);
--     DECLARE @id_tarjetas_pagos_json VARCHAR(MAX);

--     DECLARE @id_tarjetas_gastos_sum DECIMAL(18,2);
--     DECLARE @id_tarjetas_pagos_sum DECIMAL(18,2);
--     DECLARE @limite_credito_disponible DECIMAL(18,2);
--     DECLARE @credito_final DECIMAL(18,2);
--     DECLARE @credito_sobregirado DECIMAL(18,2);

--     DECLARE @cargo_interes_mensual_extranjera DECIMAL(18,2);
--     DECLARE @cargo_interes_mensual_nacional DECIMAL(18,2);
--     DECLARE @cargo_interes_moratorio DECIMAL(18,2);
--     DECLARE @cargo_sobregiro DECIMAL(18,2);


--     --
--     SET @fecha_corte_mes = CASE 
--         WHEN @fecha_corte <= DAY(EOMONTH(DATEFROMPARTS(@anio, @mes, 1)))
--         THEN DATEFROMPARTS(@anio, @mes, @fecha_corte)
--         ELSE EOMONTH(DATEFROMPARTS(@anio, @mes, 1))
--     END;

--     SET @fecha_corte_mes_anterior = DATEADD(MONTH, -1, DATEFROMPARTS(@anio, @mes, @fecha_corte));
    
--     SET @fecha_pago_mes = DATEADD(DAY, @fecha_pago_dias, @fecha_corte_mes);




--     SET @id_tarjetas_gastos_json = ISNULL((
--         SELECT 
--             JSON_QUERY(TJT.obj_tarjetas_gastos(G.id_tarjeta_gasto, 0)) AS id_tarjeta_gasto_json
--         FROM TJT.tarjetas_gastos G
--         WHERE G.id_tarjeta = @id_tarjeta
--             AND G.estado <> 3
--             AND G.fecha_hora_creado >= @fecha_corte_mes_anterior
--             AND G.fecha_hora_creado < @fecha_corte_mes
--         FOR JSON PATH
--     ), '[]');

--     SET @id_tarjetas_pagos_json = ISNULL((
--         SELECT
--             JSON_QUERY(TJT.obj_tarjetas_pagos(P.id_tarjeta_pago, 0)) AS id_tarjeta_pago_json
--         FROM TJT.tarjetas_pagos P
--         WHERE P.id_tarjeta = @id_tarjeta 
--             AND P.estado <> 3
--             AND P.fecha_hora_creado >= @fecha_corte_mes
--             AND P.fecha_hora_creado <  @fecha_pago_mes
--         FOR JSON PATH
--     ), '[]');

--     SET @id_tarjetas_gastos_sum = 0;
--     SELECT @id_tarjetas_gastos_sum = SUM(TRY_CAST(JSON_VALUE(gasto.value, '$.id_tarjeta_gasto_json.monto') AS DECIMAL(18, 2)))
--     FROM OPENJSON(@id_tarjetas_gastos_json) AS gasto;

--     SET @id_tarjetas_pagos_sum = 0;
--     SELECT @id_tarjetas_pagos_sum = SUM(TRY_CAST(JSON_VALUE(pago.value, '$.id_tarjeta_pago_json.monto_pagado') AS DECIMAL(18, 2)))
--     FROM OPENJSON(@id_tarjetas_pagos_json) AS pago;

--     SET @limite_credito_disponible = @limite_credito - @id_tarjetas_gastos_sum + @id_tarjetas_pagos_sum;
            
--     SET @credito_final = @id_tarjetas_gastos_sum - @id_tarjetas_pagos_sum;
    
--     SET @credito_sobregirado = @id_tarjetas_gastos_sum - @limite_credito - @id_tarjetas_pagos_sum;
--     SET @credito_sobregirado = IIF(@credito_sobregirado < 0, 0, @credito_sobregirado);
    
--     SET @cargo_interes_mensual_extranjera = @id_tarjetas_gastos_sum - @limite_credito - @id_tarjetas_pagos_sum;
--     -- DECLARE @credito_final DECIMAL(18,2) = @id_tarjetas_gastos_sum - @id_tarjetas_pagos_sum;
    
--     -- DECLARE @tasa_interes_anual_extranjero_monto DECIMAL(18,2) = @tasa_interes_anual_extranjero - @id_tarjetas_pagos_sum;

--     --
--     SELECT @json = (
--         SELECT
--             @id_tarjeta AS id_tarjeta
--             , @limite_credito AS limite_credito
--             , @moneda AS moneda
--             , @fecha_corte AS fecha_corte
--             , @fecha_pago_dias AS fecha_pago_dias
--             , @tasa_interes_anual_extranjera AS tasa_interes_anual_extranjera
--             , @tasa_interes_mensual_extranjera AS tasa_interes_mensual_extranjera
--             , @tasa_interes_anual_nacional AS tasa_interes_anual_nacional
--             , @tasa_interes_mensual_nacional AS tasa_interes_mensual_nacional
--             , @tasa_interes_moratorio_anual AS tasa_interes_moratorio_anual
--             , @tasa_interes_moratorio_mensual AS tasa_interes_moratorio_mensual

--             --
--             CONVERT(VARCHAR(20), @fecha_corte_mes, 23) AS fecha_corte_verbosed,
--             CONVERT(VARCHAR(20), @fecha_pago_mes, 23) AS fecha_pago_verbosed,
--             JSON_QUERY(@id_tarjetas_gastos_json) AS id_tarjetas_gastos_json,
--             JSON_QUERY(@id_tarjetas_pagos_json) AS id_tarjetas_pagos_json,
--             @id_tarjetas_gastos_sum AS id_tarjetas_gastos_sum,
--             @id_tarjetas_pagos_sum AS id_tarjetas_pagos_sum,
--             @limite_credito_disponible AS limite_credito_disponible,
--             @credito_final AS credito_final,
--             @credito_sobregirado AS credito_sobregirado

--         FOR JSON PATH
--     );
--     -- 
--     -- SELECT @json;
    -- IF @json IS NULL
    --     SET @json = N'[]';

    -- 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 seg_nexapps.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.*,
        seg_nexapps.dbo.obj_empresas(T.id_empresa, 0) AS id_empresa_json
    FROM TJT.empresas_empleados T
    LEFT JOIN seg_nexapps.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 seg_nexapps.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.*,
        seg_nexapps.dbo.obj_empresas(T.id_empresa, 0) AS id_empresa_json
    FROM TJT.empresas_departamentos T
    LEFT JOIN seg_nexapps.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 seg_nexapps.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 seg_nexapps.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 FUNCTION IF EXISTS TJT.fn_get_tarjetas_beneficios;
GO
CREATE FUNCTION TJT.fn_get_tarjetas_beneficios (
    @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 data_nexapps;

    -- 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(seg_nexapps.dbo.fn_obtain_permisos_usuario(@varUsuario, 3, 'get_tarjetas_beneficios'))
    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_beneficios(T.id_tarjeta_beneficio, @lazy), ',') + ']'
    FROM TJT.tarjetas_beneficios T
    LEFT JOIN seg_nexapps.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)
        );

    -- 
    -- SELECT @json;
    IF @json IS NULL
        SET @json = N'[]';

    RETURN @json;
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 seg_nexapps.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 seg_nexapps.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 FUNCTION IF EXISTS TJT.fn_get_tarjetas_intereses;
GO
CREATE FUNCTION TJT.fn_get_tarjetas_intereses (
    @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 data_nexapps;

    -- 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(seg_nexapps.dbo.fn_obtain_permisos_usuario(@varUsuario, 3, 'get_tarjetas_intereses'))
    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_intereses(T.id_tarjeta_interes, @lazy), ',') + ']'
    FROM TJT.tarjetas_intereses T
    LEFT JOIN seg_nexapps.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)
        );

    -- 
    -- SELECT @json;
    IF @json IS NULL
        SET @json = N'[]';

    RETURN @json;
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 seg_nexapps.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 seg_nexapps.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 seg_nexapps.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 seg_nexapps.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


-- USE data_nexapps;
DROP FUNCTION IF EXISTS TJT.fn_get_tarjetas_gastos_categorias;
GO
CREATE FUNCTION TJT.fn_get_tarjetas_gastos_categorias (
    @varPK INT,
    @id_tarjeta 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 data_nexapps;

    -- 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(seg_nexapps.dbo.fn_obtain_permisos_usuario(@varUsuario, 3, 'get_tarjetas_gastos_categorias'))
    WITH (
        acceso_todos INT
        , acceso_empresa INT
        , acceso_propio INT
        , id_usuario INT
        , id_empresa INT
    ) AS P;


    -- Generar JSON con los resultados filtrados
    -- STRING_AGG(...) devuelve NULL automáticamente si no hay filas que cumplir el WHERE.
    SELECT @json = 
        '[' + STRING_AGG(TJT.obj_tarjetas_gastos_categorias(T.id_tarjeta_gasto_categoria, @lazy), ',') + ']'
    FROM TJT.tarjetas_gastos_categorias T
    LEFT JOIN seg_nexapps.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 (@id_tarjeta = 0 OR T.id_tarjeta = @id_tarjeta)
        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;
    IF @json IS NULL
        SET @json = N'[]';

    RETURN @json;
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 seg_nexapps.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 seg_nexapps.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


-- USE data_nexapps;
DROP FUNCTION IF EXISTS TJT.fn_get_comercios;
GO
CREATE FUNCTION TJT.fn_get_comercios (
    @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;

    -- Permisos
    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(seg_nexapps.dbo.fn_obtain_permisos_usuario(@varUsuario, 3, 'get_comercios'))
    WITH (
        acceso_todos INT,
        acceso_empresa INT,
        acceso_propio INT,
        id_usuario INT,
        id_empresa INT
    ) AS P;

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

    IF @json IS NULL
        SET @json = N'[]';

    RETURN @json;
END;
GO







-- USE data_nexapps;
DROP FUNCTION IF EXISTS TJT.fn_get_tarjetas_gastos;
GO
CREATE FUNCTION TJT.fn_get_tarjetas_gastos (
    @varPK INT,
    @id_tarjeta 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 data_nexapps;

    -- 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(seg_nexapps.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), ',')
        WITHIN GROUP (ORDER BY T.fecha_gasto DESC)   -- <--- aquí ordenas por fecha_gasto
         + ']'
    FROM TJT.tarjetas_gastos T
    LEFT JOIN seg_nexapps.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 (@id_tarjeta = 0 OR T.id_tarjeta = @id_tarjeta)
        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;
    IF @json IS NULL
        SET @json = N'[]';

    RETURN @json;
END;
GO





USE data_nexapps;
DROP FUNCTION IF EXISTS TJT.fn_get_tarjetas_gastos_reportes;
GO
CREATE FUNCTION TJT.fn_get_tarjetas_gastos_reportes (
    @varPK INT,
    @id_tarjeta 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 data_nexapps;

    -- 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(seg_nexapps.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;


    --
    DECLARE @meses_gastos_json NVARCHAR(MAX)
        , @categorias_gastos_json NVARCHAR(MAX)
        , @min_fecha DATE
        , @max_fecha DATE
        ;


    --
    SELECT 
        @min_fecha = MIN(T.fecha_gasto),
        @max_fecha = MAX(T.fecha_gasto)
    FROM TJT.tarjetas_gastos T
        LEFT JOIN seg_nexapps.dbo.usuarios U ON T.creado_por = U.usuario
    WHERE (@varPK = 0 OR T.id_tarjeta_gasto = @varPK)
        AND (@opc = 0 OR T.estado <> 3)
        AND (@id_tarjeta = 0 OR T.id_tarjeta = @id_tarjeta)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND T.creado_por = @varUsuario)
        );

    DECLARE @fecha_corte INT = CAST(JSON_VALUE(TJT.obj_tarjetas(@id_tarjeta, 0), '$.fecha_corte') AS INT);

    DECLARE @ultimo_mes DATE = CASE
    WHEN DAY(GETDATE()) >= @fecha_corte
        -- si hoy es >= día de corte → primer día del mes siguiente
        THEN DATEFROMPARTS(
                YEAR(DATEADD(MONTH, 1, GETDATE())),
                MONTH(DATEADD(MONTH, 1, GETDATE())),
                1
            )
        ELSE
        -- si hoy es < día de corte → primer día del mes actual
        DATEFROMPARTS(
            YEAR(GETDATE()),
            MONTH(GETDATE()),
            1
        )
    END;

    --
    IF @min_fecha IS NULL
    BEGIN
        SET @meses_gastos_json = '[]'; -- No hay gastos, retornamos lista vacía
    END
    ELSE
    BEGIN
        WITH MesesCTE AS (
            SELECT CASE WHEN DAY(@min_fecha) > @fecha_corte
                    THEN DATEADD(MONTH, 1, CAST(DATEFROMPARTS(YEAR(@min_fecha), MONTH(@min_fecha), 1) AS DATE))
                    ELSE CAST(DATEFROMPARTS(YEAR(@min_fecha), MONTH(@min_fecha), 1) AS DATE)
                END AS mes
            UNION ALL
            SELECT DATEADD(MONTH, 1, mes)
            FROM MesesCTE
            -- WHERE DATEADD(MONTH, 1, mes) <= DATEFROMPARTS(YEAR(@fecha_max_gasto), MONTH(@fecha_max_gasto), 1)
            WHERE DATEADD(MONTH, 1, mes) <= @ultimo_mes
        )
        SELECT @meses_gastos_json = (
            SELECT FORMAT(mes, 'yyyy-MM') AS mes
            FROM MesesCTE
            FOR JSON PATH
        )
        OPTION (MAXRECURSION 1000);
    END


    --
    SELECT @categorias_gastos_json = '[' + STRING_AGG(TJT.obj_tarjetas_gastos_categorias(cat.id_tarjeta_gasto_categoria, @lazy), ',') + ']'
    FROM (
        SELECT DISTINCT T.id_tarjeta_gasto_categoria
        FROM TJT.tarjetas_gastos T
        LEFT JOIN seg_nexapps.dbo.usuarios U ON T.creado_por = U.usuario
        WHERE (@varPK = 0 OR T.id_tarjeta_gasto = @varPK)
          AND (@opc = 0 OR T.estado <> 3)
          AND (@id_tarjeta = 0 OR T.id_tarjeta = @id_tarjeta)
          AND (
                @acceso_todos   = 1
             OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
             OR (@acceso_propio  = 1 AND T.creado_por = @varUsuario)
          )
    ) AS cat;


    --
    IF @json IS NULL
        SET @json = N'[]';

    IF @categorias_gastos_json IS NULL
        SET @categorias_gastos_json = N'[]';

    RETURN
        N'{'
    --    + N'"gastos":' + @json + N','
       + N'"mes_actual":"' + FORMAT(@ultimo_mes, 'yyyy-MM') + N'",'
       + N'"meses_gastos_json":' + @meses_gastos_json + N','
       + N'"categorias_json":' + @categorias_gastos_json 
       + N'}';
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 seg_nexapps.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 seg_nexapps.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 seg_nexapps.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 seg_nexapps.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 data_nexapps;

    -- 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(seg_nexapps.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 seg_nexapps.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;
    IF @json IS NULL
        SET @json = N'[]';

    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 seg_nexapps.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 seg_nexapps.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 seg_nexapps.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 seg_nexapps.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 data_nexapps;

    -- 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(seg_nexapps.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 seg_nexapps.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;
    IF @json IS NULL
        SET @json = N'[]';

    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 seg_nexapps.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 seg_nexapps.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 seg_nexapps.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 seg_nexapps.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 seg_nexapps.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.*,
        seg_nexapps.dbo.obj_usuarios(T.id_usuario, 0) AS id_usuario_json
    FROM TJT.aichat_mensajes T
    LEFT JOIN seg_nexapps.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 seg_nexapps.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,
        seg_nexapps.dbo.obj_empresas(R.id_empresa, 0) AS id_empresa_json
    FROM seg_nexapps.dbo.usuarios R
    INNER JOIN seg_nexapps.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 data_nexapps;

    -- 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(seg_nexapps.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(seg_nexapps.dbo.obj_usuarios(R.id_usuario, @lazy), ',') + ']'
    FROM seg_nexapps.dbo.usuarios R
    INNER JOIN seg_nexapps.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;
    IF @json IS NULL
        SET @json = N'[]';

    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 seg_nexapps.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 seg_nexapps.dbo.empresas R
    LEFT JOIN seg_nexapps.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 data_nexapps;

    -- 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(seg_nexapps.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(seg_nexapps.dbo.obj_empresas(R.id_empresa, @lazy), ',') + ']'
    FROM seg_nexapps.dbo.empresas R
    LEFT JOIN seg_nexapps.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;
    IF @json IS NULL
        SET @json = N'[]';

    RETURN @json;
END;
GO

-- USE data_nexapps;
DROP FUNCTION IF EXISTS TJT.fn_get_comercios;
GO
CREATE FUNCTION TJT.fn_get_comercios (
    @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;

    -- Permisos
    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(seg_nexapps.dbo.fn_obtain_permisos_usuario(@varUsuario, 3, 'get_comercios'))
    WITH (
        acceso_todos INT,
        acceso_empresa INT,
        acceso_propio INT,
        id_usuario INT,
        id_empresa INT
    ) AS P;

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

    IF @json IS NULL
        SET @json = N'[]';

    RETURN @json;
END;
GO

DROP FUNCTION IF EXISTS TJT.fn_get_comercios_productos;
GO
CREATE FUNCTION TJT.fn_get_comercios_productos (
    @varPK INT,
    @varIdComercio 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;

    -- Permisos
    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(seg_nexapps.dbo.fn_obtain_permisos_usuario(@varUsuario, 3, 'get_comercios_productos'))
    WITH (
        acceso_todos INT,
        acceso_empresa INT,
        acceso_propio INT,
        id_usuario INT,
        id_empresa INT
    ) AS P;

    -- Generar JSON con resultados filtrados
    SELECT @json = 
        '[' + STRING_AGG(TJT.obj_comercios_productos(P.id_comercio_producto, @lazy), ',') + ']'
    FROM TJT.comercios_productos P
    LEFT JOIN seg_nexapps.dbo.usuarios U ON P.creado_por = U.usuario
    WHERE (@varPK = 0 OR P.id_comercio_producto = @varPK)
        AND (@varIdComercio = 0 OR P.id_comercio = @varIdComercio)
        AND (@opc = 0 OR P.estado <> 3)
        AND (
            @acceso_todos = 1
            OR (@acceso_empresa = 1 AND U.id_empresa = @id_empresa)
            OR (@acceso_propio = 1 AND P.creado_por = @varUsuario)
    );

    IF @json IS NULL
        SET @json = N'[]';

    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 seg_nexapps.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 seg_nexapps.dbo.empresas R
--     LEFT JOIN seg_nexapps.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 seg_nexapps.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 seg_nexapps.dbo.usuarios 
            --  WHERE id_usuario = @id_usuario
            --  FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES) AS usuario_actual,
            JSON_QUERY(TJT.fn_get_usuarios(0, @varUsuario, 1, 1)) AS usuario_actual,
            
            
            -- =============================================
            -- INFORMACIÓN DE LA EMPRESA
            -- =============================================
            -- (SELECT 
            --     id_empresa,
            --     nombre_empresa,
            --     direccion_empresa,
            --     telefono,
            --     estado
            --  FROM seg_nexapps.dbo.empresas 
            --  WHERE id_empresa = @id_empresa
            --  FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES) AS empresa_usuario,
            JSON_QUERY(TJT.fn_get_empresas(0, @varUsuario, 1, 1)) 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, 1)) 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,
             JSON_QUERY(TJT.fn_get_tarjetas_beneficios(0, @varUsuario, 1, 1)) AS beneficios_tarjetas,
            
            -- =============================================
            -- TARJETAS INTERESES
            -- =============================================
             JSON_QUERY(TJT.fn_get_tarjetas_intereses(0, @varUsuario, 1, 1)) AS intereses_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, 0, @varUsuario, 1, 1)) AS gastos_recientes,
            
            
            -- =============================================
            -- PAGOS RECIENTES (ÚLTIMOS 10)
            -- =============================================
            -- (SELECT TOP 10
            --     TP.id_tarjeta_pago,
            --     TP.monto_pagado,
            --     -- TP.metodo_pago,
            --     CONVERT(VARCHAR, TP.fecha_pago, 120) AS fecha_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_pago DESC
            --  FOR JSON PATH) AS pagos_recientes,
             JSON_QUERY(TJT.fn_get_tarjetas_pagos(0, @varUsuario, 1, 1)) 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, 1)) 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, INCLUDE_NULL_VALUES
    );
    
    -- 3. Retornar el contexto completo
    SELECT @contexto AS contexto_json;
END;
GO



-- USE data_nexapps;
DROP FUNCTION IF EXISTS TJT.fn_get_catalogo_tarjetas_gastos_categorias;
GO
CREATE FUNCTION TJT.fn_get_catalogo_tarjetas_gastos_categorias (
    @varUsuario VARCHAR(50)
)
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;

    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(seg_nexapps.dbo.fn_obtain_permisos_usuario(@varUsuario, 3, 'get_catalogo_tarjetas_gastos_categorias'))
    WITH (
        acceso_todos INT,
        acceso_empresa INT,
        acceso_propio INT,
        id_usuario INT,
        id_empresa INT
    ) AS P;

    -- Lista genérica embebida (mínimo 10 categorías)
    WITH categorias_base AS (
        SELECT 'Alimentación' AS nombre, 'Comidas, snacks y bebidas' AS descripcion
        UNION ALL SELECT 'Transporte', 'Gasolina, taxi, bus'
        UNION ALL SELECT 'Entretenimiento', 'Cine, conciertos, etc.'
        UNION ALL SELECT 'Educación', 'Cursos, libros'
        UNION ALL SELECT 'Salud', 'Medicinas, consultas'
        UNION ALL SELECT 'Compras personales', 'Ropa, gadgets'
        UNION ALL SELECT 'Servicios básicos', 'Luz, agua, internet'
        UNION ALL SELECT 'Viajes', 'Hoteles, boletos'
        UNION ALL SELECT 'Suscripciones', 'Netflix, Spotify'
        UNION ALL SELECT 'Otros', 'Gastos misceláneos'
    )
    SELECT @json = (
        SELECT nombre, descripcion
        FROM categorias_base
        WHERE
            @acceso_todos = 1
        FOR JSON PATH
    );

    IF @json IS NULL
        SET @json = N'[]';

    RETURN @json;
END;
GO
