-- Seleccionar base de datos
USE testing_votaciones;
GO

DROP PROCEDURE IF EXISTS TJT.insert_update_tarjetas_propietarios_tipos;
GO
CREATE PROCEDURE TJT.insert_update_tarjetas_propietarios_tipos
    @varPkTipo INT OUTPUT,
    @varNombre VARCHAR(100),
    @varDescripcion VARCHAR(255),
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;
    DECLARE @existe INT;

    -- MAYÚSCULAS
    SET @varNombre = UPPER(@varNombre);
    SET @varDescripcion = UPPER(@varDescripcion);

    -- VALIDAR SI YA EXISTE
    SELECT @existe = COUNT(*)
    FROM TJT.tarjetas_propietarios_tipos
    WHERE nombre = @varNombre
        AND estado <> 3
        AND (@varOpc = 1 OR id_tarjeta_propietario_tipo <> @varPkTipo);

    IF @existe > 0
    BEGIN
        SET @result = 'El nombre del tipo de propietario ya existe.';
        SELECT @save AS 'save', @result AS result;
        RETURN;
    END;

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO TJT.tarjetas_propietarios_tipos (nombre, descripcion, creado_por)
        VALUES (@varNombre, @varDescripcion, @varUsuario);

        SET @varPkTipo = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE TJT.tarjetas_propietarios_tipos
        SET nombre = @varNombre,
            descripcion = @varDescripcion,
            modificado_por = @varUsuario
        WHERE id_tarjeta_propietario_tipo = @varPkTipo;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPkTipo AS pk;
END;
GO





DROP PROCEDURE IF EXISTS TJT.insert_update_tarjetas_propietarios;
GO
CREATE PROCEDURE TJT.insert_update_tarjetas_propietarios
    @varPk INT OUTPUT,
    @varIdPropietarioId INT,
    @varIdPropietarioTipo INT,
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;
    DECLARE @existe INT;

    -- VALIDAR SI YA EXISTE
    SELECT @existe = COUNT(*)
    FROM TJT.tarjetas_propietarios
    WHERE id_tarjeta_propietario_id = @varIdPropietarioId
        AND id_tarjeta_propietario_tipo = @varIdPropietarioTipo
        AND estado <> 3
        AND (@varOpc = 1 OR id_tarjeta_propietario <> @varPk);

    IF @existe > 0
    BEGIN
        SET @result = 'El propietario ya existe con este tipo.';
        SELECT @save AS 'save', @result AS result;
        RETURN;
    END;

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO TJT.tarjetas_propietarios (id_tarjeta_propietario_id, id_tarjeta_propietario_tipo, creado_por)
        VALUES (@varIdPropietarioId, @varIdPropietarioTipo, @varUsuario);

        SET @varPk = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE TJT.tarjetas_propietarios
        SET id_tarjeta_propietario_id = @varIdPropietarioId,
            id_tarjeta_propietario_tipo = @varIdPropietarioTipo,
            modificado_por = @varUsuario
        WHERE id_tarjeta_propietario = @varPk;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPk AS pk;
END;
GO





DROP PROCEDURE IF EXISTS TJT.insert_update_tarjetas_tipos;
GO
CREATE PROCEDURE TJT.insert_update_tarjetas_tipos
    @varPkTipo INT OUTPUT,
    @varNombre VARCHAR(100),
    @varDescripcion VARCHAR(255),
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;
    DECLARE @existe INT;

    -- MAYÚSCULAS
    SET @varNombre = UPPER(@varNombre);
    SET @varDescripcion = UPPER(@varDescripcion);

    -- VALIDAR SI YA EXISTE
    SELECT @existe = COUNT(*)
    FROM TJT.tarjetas_tipos
    WHERE nombre = @varNombre
        AND estado <> 3
        AND (@varOpc = 1 OR id_tarjeta_tipo <> @varPkTipo);

    IF @existe > 0
    BEGIN
        SET @result = 'El nombre del tipo de tarjeta ya existe.';
        SELECT @save AS 'save', @result AS result;
        RETURN;
    END;

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO TJT.tarjetas_tipos (nombre, descripcion, creado_por)
        VALUES (@varNombre, @varDescripcion, @varUsuario);

        SET @varPkTipo = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE TJT.tarjetas_tipos
        SET nombre = @varNombre,
            descripcion = @varDescripcion,
            modificado_por = @varUsuario
        WHERE id_tarjeta_tipo = @varPkTipo;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPkTipo AS pk;
END;
GO





DROP PROCEDURE IF EXISTS TJT.insert_update_bancos;
GO
CREATE PROCEDURE TJT.insert_update_bancos
    @varPkBanco INT OUTPUT,
    @varNombre VARCHAR(100),
    @varIdRegion INT,
    @varDireccion VARCHAR(255),
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;
    DECLARE @existe INT;

    -- MAYÚSCULAS
    SET @varNombre = UPPER(@varNombre);
    SET @varDireccion = UPPER(@varDireccion);

    -- VALIDAR SI YA EXISTE
    SELECT @existe = COUNT(*)
    FROM TJT.bancos
    WHERE nombre = @varNombre
        AND estado <> 3
        AND (@varOpc = 1 OR id_banco <> @varPkBanco);

    IF @existe > 0
    BEGIN
        SET @result = 'El nombre del banco ya existe.';
        SELECT @save AS 'save', @result AS result;
        RETURN;
    END;

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO TJT.bancos (nombre, id_region, direccion, creado_por)
        VALUES (@varNombre, @varIdRegion, @varDireccion, @varUsuario);

        SET @varPkBanco = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE TJT.bancos
        SET nombre = @varNombre,
            id_region = @varIdRegion,
            direccion = @varDireccion,
            modificado_por = @varUsuario
        WHERE id_banco = @varPkBanco;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPkBanco AS pk;
END;
GO





DROP PROCEDURE IF EXISTS TJT.insert_update_tarjetas;
GO
CREATE PROCEDURE TJT.insert_update_tarjetas
    @varPkTarjeta INT OUTPUT,
    @varIdPropietario INT,
    @varIdTipo INT,
    @varIdBanco INT,
    @varNumero VARCHAR(20),
    @varMesVencimiento VARCHAR(2),
    @varAnioVencimiento VARCHAR(4),
    @varCvv VARCHAR(4),
    @varTitularNombre VARCHAR(150),
    @varComentarios VARCHAR(500),
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;
    DECLARE @existe INT;

    -- MAYÚSCULAS
    SET @varTitularNombre = UPPER(@varTitularNombre);
    SET @varComentarios = UPPER(@varComentarios);

    -- VALIDAR SI YA EXISTE
    SELECT @existe = COUNT(*)
    FROM TJT.tarjetas
    WHERE numero = @varNumero
        AND estado <> 3
        AND (@varOpc = 1 OR id_tarjeta <> @varPkTarjeta);

    IF @existe > 0
    BEGIN
        SET @result = 'El número de tarjeta ya existe.';
        SELECT @save AS 'save', @result AS result;
        RETURN;
    END;

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO TJT.tarjetas (
            id_tarjeta_propietario, id_tarjeta_tipo, id_banco, numero,
            mes_vencimiento, anio_vencimiento, cvv, titular_nombre,
            comentarios, creado_por
        )
        VALUES (
            @varIdPropietario, @varIdTipo, @varIdBanco, @varNumero,
            @varMesVencimiento, @varAnioVencimiento, @varCvv, @varTitularNombre,
            @varComentarios, @varUsuario
        );

        SET @varPkTarjeta = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE TJT.tarjetas
        SET id_tarjeta_propietario = @varIdPropietario,
            id_tarjeta_tipo = @varIdTipo,
            id_banco = @varIdBanco,
            numero = @varNumero,
            mes_vencimiento = @varMesVencimiento,
            anio_vencimiento = @varAnioVencimiento,
            cvv = @varCvv,
            titular_nombre = @varTitularNombre,
            comentarios = @varComentarios,
            modificado_por = @varUsuario
        WHERE id_tarjeta = @varPkTarjeta;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPkTarjeta AS pk;
END;
GO





DROP PROCEDURE IF EXISTS TJT.insert_update_empresas_empleados;
GO
CREATE PROCEDURE TJT.insert_update_empresas_empleados
    @varPkEmpleado INT OUTPUT,
    @varNombres VARCHAR(100),
    @varApellidos VARCHAR(100),
    @varIdentidad VARCHAR(20),
    @varCelular VARCHAR(20),
    @varEmail VARCHAR(100),
    @varDireccion VARCHAR(255),
    @varIdEmpresa INT,
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;
    DECLARE @existe INT;

    -- MAYÚSCULAS
    SET @varNombres = UPPER(@varNombres);
    SET @varApellidos = UPPER(@varApellidos);
    SET @varDireccion = UPPER(@varDireccion);

    -- VALIDAR SI YA EXISTE
    SELECT @existe = COUNT(*)
    FROM TJT.empresas_empleados
    WHERE identidad = @varIdentidad
        AND estado <> 3
        AND (@varOpc = 1 OR id_empresa_empleado <> @varPkEmpleado);

    IF @existe > 0
    BEGIN
        SET @result = 'El empleado con esta identidad ya existe.';
        SELECT @save AS 'save', @result AS result;
        RETURN;
    END;

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO TJT.empresas_empleados (
            nombres, apellidos, identidad, celular, email,
            direccion, id_empresa, creado_por
        )
        VALUES (
            @varNombres, @varApellidos, @varIdentidad, @varCelular, @varEmail,
            @varDireccion, @varIdEmpresa, @varUsuario
        );

        SET @varPkEmpleado = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE TJT.empresas_empleados
        SET nombres = @varNombres,
            apellidos = @varApellidos,
            identidad = @varIdentidad,
            celular = @varCelular,
            email = @varEmail,
            direccion = @varDireccion,
            id_empresa = @varIdEmpresa,
            modificado_por = @varUsuario
        WHERE id_empresa_empleado = @varPkEmpleado;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPkEmpleado AS pk;
END;
GO





DROP PROCEDURE IF EXISTS TJT.insert_update_empresas_departamentos;
GO
CREATE PROCEDURE TJT.insert_update_empresas_departamentos
    @varPkDepartamento INT OUTPUT,
    @varNombre VARCHAR(100),
    @varDescripcion VARCHAR(255),
    @varIdEmpresa INT,
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;
    DECLARE @existe INT;

    -- MAYÚSCULAS
    SET @varNombre = UPPER(@varNombre);
    SET @varDescripcion = UPPER(@varDescripcion);

    -- VALIDAR SI YA EXISTE
    SELECT @existe = COUNT(*)
    FROM TJT.empresas_departamentos
    WHERE nombre = @varNombre
        AND id_empresa = @varIdEmpresa
        AND estado <> 3
        AND (@varOpc = 1 OR id_empresa_departamento <> @varPkDepartamento);

    IF @existe > 0
    BEGIN
        SET @result = 'El nombre del departamento ya existe para esta empresa.';
        SELECT @save AS 'save', @result AS result;
        RETURN;
    END;

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO TJT.empresas_departamentos (
            nombre, descripcion, id_empresa, creado_por
        )
        VALUES (
            @varNombre, @varDescripcion, @varIdEmpresa, @varUsuario
        );

        SET @varPkDepartamento = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE TJT.empresas_departamentos
        SET nombre = @varNombre,
            descripcion = @varDescripcion,
            id_empresa = @varIdEmpresa,
            modificado_por = @varUsuario
        WHERE id_empresa_departamento = @varPkDepartamento;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPkDepartamento AS pk;
END;
GO





DROP PROCEDURE IF EXISTS TJT.insert_update_tarjetas_beneficios;
GO
CREATE PROCEDURE TJT.insert_update_tarjetas_beneficios
    @varPkBeneficio INT OUTPUT,
    @varIdTarjeta INT,
    @varNombre VARCHAR(100),
    @varDescripcion VARCHAR(255),
    @varMonto DECIMAL(18,2),
    @varTasa DECIMAL(5,2),
    @varSumaResta INT,
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;
    DECLARE @existe INT;

    -- MAYÚSCULAS
    SET @varNombre = UPPER(@varNombre);
    SET @varDescripcion = UPPER(@varDescripcion);

    -- VALIDAR SI YA EXISTE
    SELECT @existe = COUNT(*)
    FROM TJT.tarjetas_beneficios
    WHERE 
        id_tarjeta = @varIdTarjeta
        AND nombre = @varNombre
        AND estado <> 3
        AND (@varOpc = 1 OR id_tarjeta_beneficio <> @varPkBeneficio);

    IF @existe > 0
    BEGIN
        SET @result = 'El nombre del beneficio ya existe.';
        SELECT @save AS 'save', @result AS result;
        RETURN;
    END;

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO TJT.tarjetas_beneficios (
            id_tarjeta, nombre, descripcion, monto, tasa, suma_o_resta, creado_por
        )
        VALUES (
            @varIdTarjeta, @varNombre, @varDescripcion, @varMonto, @varTasa, @varSumaResta, @varUsuario
        );

        SET @varPkBeneficio = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE TJT.tarjetas_beneficios
        SET 
            id_tarjeta = @varIdTarjeta,
            nombre = @varNombre,
            descripcion = @varDescripcion,
            monto = @varMonto,
            tasa = @varTasa,
            suma_o_resta = @varSumaResta,
            modificado_por = @varUsuario
        WHERE id_tarjeta_beneficio = @varPkBeneficio;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPkBeneficio AS pk;
END;
GO





-- DROP PROCEDURE IF EXISTS TJT.insert_update_tarjetas_beneficios_asignaciones;
-- GO
-- CREATE PROCEDURE TJT.insert_update_tarjetas_beneficios_asignaciones
--     @varPkAsignacion INT OUTPUT,
--     @varIdTarjeta INT,
--     @varIdBeneficio INT,
--     @varUsuario VARCHAR(100),
--     @varOpc INT
-- AS
-- BEGIN
--     SET NOCOUNT ON;
--     DECLARE @result NVARCHAR(200), @save INT = 0;
--     DECLARE @existe INT;

--     -- VALIDAR SI YA EXISTE
--     SELECT @existe = COUNT(*)
--     FROM TJT.tarjetas_beneficios_asignaciones
--     WHERE id_tarjeta = @varIdTarjeta
--         AND id_tarjeta_beneficio = @varIdBeneficio
--         AND estado <> 3
--         AND (@varOpc = 1 OR id_tarjeta_beneficio_asignacion <> @varPkAsignacion);

--     IF @existe > 0
--     BEGIN
--         SET @result = 'Esta asignación de beneficio ya existe para la tarjeta.';
--         SELECT @save AS 'save', @result AS result;
--         RETURN;
--     END;

--     IF @varOpc = 1 -- INSERTAR
--     BEGIN
--         INSERT INTO TJT.tarjetas_beneficios_asignaciones (
--             id_tarjeta, id_tarjeta_beneficio, creado_por
--         )
--         VALUES (
--             @varIdTarjeta, @varIdBeneficio, @varUsuario
--         );

--         SET @varPkAsignacion = SCOPE_IDENTITY();
--         SET @save = 1;
--         SET @result = 'Registro insertado correctamente';
--     END;
--     ELSE IF @varOpc = 2 -- ACTUALIZAR
--     BEGIN
--         UPDATE TJT.tarjetas_beneficios_asignaciones
--         SET id_tarjeta = @varIdTarjeta,
--             id_tarjeta_beneficio = @varIdBeneficio,
--             modificado_por = @varUsuario
--         WHERE id_tarjeta_beneficio_asignacion = @varPkAsignacion;

--         SET @save = 1;
--         SET @result = 'Registro actualizado correctamente';
--     END;
--     ELSE
--     BEGIN
--         SET @result = 'Opción no válida';
--     END;

--     SELECT @save AS 'save', @result AS result, @varPkAsignacion AS pk;
-- END;
-- GO





DROP PROCEDURE IF EXISTS TJT.insert_update_tarjetas_intereses;
GO
CREATE PROCEDURE TJT.insert_update_tarjetas_intereses
    @varPkInteres INT OUTPUT,
    @varIdTarjeta INT,
    @varNombre VARCHAR(100),
    @varDescripcion VARCHAR(255),
    @varMonto DECIMAL(18,2),
    @varTasa DECIMAL(5,2),
    @varSumaResta INT,
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;
    DECLARE @existe INT;

    -- MAYÚSCULAS
    SET @varNombre = UPPER(@varNombre);
    SET @varDescripcion = UPPER(@varDescripcion);

    -- VALIDAR SI YA EXISTE
    SELECT @existe = COUNT(*)
    FROM TJT.tarjetas_intereses
    WHERE
        id_tarjeta = @varIdTarjeta
        AND nombre = @varNombre
        AND estado <> 3
        AND (@varOpc = 1 OR id_tarjeta_interes <> @varPkInteres);

    IF @existe > 0
    BEGIN
        SET @result = 'El nombre del interés ya existe.';
        SELECT @save AS 'save', @result AS result;
        RETURN;
    END;

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO TJT.tarjetas_intereses (
            id_tarjeta, nombre, descripcion, monto, tasa, suma_o_resta, creado_por
        )
        VALUES (
            @varIdTarjeta, @varNombre, @varDescripcion, @varMonto, @varTasa, @varSumaResta, @varUsuario
        );

        SET @varPkInteres = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE TJT.tarjetas_intereses
        SET id_tarjeta = @varIdTarjeta,
            nombre = @varNombre,
            descripcion = @varDescripcion,
            monto = @varMonto,
            tasa = @varTasa,
            suma_o_resta = @varSumaResta,
            modificado_por = @varUsuario
        WHERE id_tarjeta_interes = @varPkInteres;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPkInteres AS pk;
END;
GO





-- DROP PROCEDURE IF EXISTS TJT.insert_update_tarjetas_intereses_asignaciones;
-- GO
-- CREATE PROCEDURE TJT.insert_update_tarjetas_intereses_asignaciones
--     @varPkAsignacion INT OUTPUT,
--     @varIdTarjeta INT,
--     @varIdInteres INT,
--     @varUsuario VARCHAR(100),
--     @varOpc INT
-- AS
-- BEGIN
--     SET NOCOUNT ON;
--     DECLARE @result NVARCHAR(200), @save INT = 0;
--     DECLARE @existe INT;

--     -- VALIDAR SI YA EXISTE
--     SELECT @existe = COUNT(*)
--     FROM TJT.tarjetas_intereses_asignaciones
--     WHERE id_tarjeta = @varIdTarjeta
--         AND id_tarjeta_interes = @varIdInteres
--         AND estado <> 3
--         AND (@varOpc = 1 OR id_tarjeta_interes_asignacion <> @varPkAsignacion);

--     IF @existe > 0
--     BEGIN
--         SET @result = 'Esta asignación de interés ya existe para la tarjeta.';
--         SELECT @save AS 'save', @result AS result;
--         RETURN;
--     END;

--     IF @varOpc = 1 -- INSERTAR
--     BEGIN
--         INSERT INTO TJT.tarjetas_intereses_asignaciones (
--             id_tarjeta, id_tarjeta_interes, creado_por
--         )
--         VALUES (
--             @varIdTarjeta, @varIdInteres, @varUsuario
--         );

--         SET @varPkAsignacion = SCOPE_IDENTITY();
--         SET @save = 1;
--         SET @result = 'Registro insertado correctamente';
--     END;
--     ELSE IF @varOpc = 2 -- ACTUALIZAR
--     BEGIN
--         UPDATE TJT.tarjetas_intereses_asignaciones
--         SET id_tarjeta = @varIdTarjeta,
--             id_tarjeta_interes = @varIdInteres,
--             modificado_por = @varUsuario
--         WHERE id_tarjeta_interes_asignacion = @varPkAsignacion;

--         SET @save = 1;
--         SET @result = 'Registro actualizado correctamente';
--     END;
--     ELSE
--     BEGIN
--         SET @result = 'Opción no válida';
--     END;

--     SELECT @save AS 'save', @result AS result, @varPkAsignacion AS pk;
-- END;
-- GO





DROP PROCEDURE IF EXISTS TJT.insert_update_cuentas;
GO
CREATE PROCEDURE TJT.insert_update_cuentas
    @varPkCuenta INT OUTPUT,
    @varCodigoContable VARCHAR(50),
    @varNombre VARCHAR(100),
    @varDescripcion VARCHAR(255),
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;
    DECLARE @existe INT;

    -- MAYÚSCULAS
    SET @varCodigoContable = UPPER(@varCodigoContable);
    SET @varNombre = UPPER(@varNombre);
    SET @varDescripcion = UPPER(@varDescripcion);

    -- VALIDAR SI YA EXISTE
    SELECT @existe = COUNT(*)
    FROM TJT.cuentas
    WHERE (codigo_contable = @varCodigoContable OR nombre = @varNombre)
        AND estado <> 3
        AND (@varOpc = 1 OR id_cuenta <> @varPkCuenta);

    IF @existe > 0
    BEGIN
        SET @result = 'El código contable o nombre de cuenta ya existe.';
        SELECT @save AS 'save', @result AS result;
        RETURN;
    END;

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO TJT.cuentas (
            codigo_contable, nombre, descripcion, creado_por
        )
        VALUES (
            @varCodigoContable, @varNombre, @varDescripcion, @varUsuario
        );

        SET @varPkCuenta = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE TJT.cuentas
        SET codigo_contable = @varCodigoContable,
            nombre = @varNombre,
            descripcion = @varDescripcion,
            modificado_por = @varUsuario
        WHERE id_cuenta = @varPkCuenta;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPkCuenta AS pk;
END;
GO





DROP PROCEDURE IF EXISTS TJT.insert_update_tarjetas_gastos_categorias;
GO
CREATE PROCEDURE TJT.insert_update_tarjetas_gastos_categorias
    @varPkCategoria INT OUTPUT,
    @varNombre VARCHAR(100),
    @varDescripcion VARCHAR(255),
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;
    DECLARE @existe INT;

    -- MAYÚSCULAS
    SET @varNombre = UPPER(@varNombre);
    SET @varDescripcion = UPPER(@varDescripcion);

    -- VALIDAR SI YA EXISTE
    SELECT @existe = COUNT(*)
    FROM TJT.tarjetas_gastos_categorias
    WHERE
        nombre = @varNombre
        AND creado_por = @varUsuario
        AND estado <> 3
        AND (@varOpc = 1 OR id_tarjeta_gasto_categoria <> @varPkCategoria);

    IF @existe > 0
    BEGIN
        SET @result = 'El nombre de la categoría ya existe.';
        SELECT @save AS 'save', @result AS result;
        RETURN;
    END;

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO TJT.tarjetas_gastos_categorias (
            nombre, descripcion, creado_por
        )
        VALUES (
            @varNombre, @varDescripcion, @varUsuario
        );

        SET @varPkCategoria = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE TJT.tarjetas_gastos_categorias
        SET nombre = @varNombre,
            descripcion = @varDescripcion,
            modificado_por = @varUsuario
        WHERE id_tarjeta_gasto_categoria = @varPkCategoria;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPkCategoria AS pk;
END;
GO





DROP PROCEDURE IF EXISTS TJT.insert_update_tarjetas_gastos;
GO
CREATE PROCEDURE TJT.insert_update_tarjetas_gastos
    @varPkGasto INT OUTPUT,
    @varIdTarjeta INT,
    @varIdCategoria INT,
    @varUrlFoto VARCHAR(255),
    @varMonto DECIMAL(18,2),
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO TJT.tarjetas_gastos (
            id_tarjeta, id_tarjeta_gasto_categoria, url_foto, monto, creado_por
        )
        VALUES (
            @varIdTarjeta, @varIdCategoria, @varUrlFoto, @varMonto, @varUsuario
        );

        SET @varPkGasto = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE TJT.tarjetas_gastos
        SET id_tarjeta = @varIdTarjeta,
            id_tarjeta_gasto_categoria = @varIdCategoria,
            url_foto = @varUrlFoto,
            monto = @varMonto,
            modificado_por = @varUsuario
        WHERE id_tarjeta_gasto = @varPkGasto;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPkGasto AS pk;
END;
GO





DROP PROCEDURE IF EXISTS TJT.insert_update_cuentas_gastos_asignaciones;
GO
CREATE PROCEDURE TJT.insert_update_cuentas_gastos_asignaciones
    @varPkAsignacion INT OUTPUT,
    @varIdCuenta INT,
    @varIdGasto INT,
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;
    DECLARE @existe INT;

    -- VALIDAR SI YA EXISTE
    SELECT @existe = COUNT(*)
    FROM TJT.cuentas_gastos_asignaciones
    WHERE id_cuenta = @varIdCuenta
        AND id_tarjeta_gasto = @varIdGasto
        AND estado <> 3
        AND (@varOpc = 1 OR id_cuenta_gasto_asignacion <> @varPkAsignacion);

    IF @existe > 0
    BEGIN
        SET @result = 'Esta asignación de cuenta ya existe para el gasto.';
        SELECT @save AS 'save', @result AS result;
        RETURN;
    END;

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO TJT.cuentas_gastos_asignaciones (
            id_cuenta, id_tarjeta_gasto, creado_por
        )
        VALUES (
            @varIdCuenta, @varIdGasto, @varUsuario
        );

        SET @varPkAsignacion = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE TJT.cuentas_gastos_asignaciones
        SET id_cuenta = @varIdCuenta,
            id_tarjeta_gasto = @varIdGasto,
            modificado_por = @varUsuario
        WHERE id_cuenta_gasto_asignacion = @varPkAsignacion;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPkAsignacion AS pk;
END;
GO





DROP PROCEDURE IF EXISTS TJT.insert_update_tarjetas_pagos;
GO
CREATE PROCEDURE TJT.insert_update_tarjetas_pagos
    @varPkPago INT OUTPUT,
    @varIdTarjeta INT,
    @varIdGasto INT,
    @varMonto DECIMAL(18,2),
    @varUrlFoto VARCHAR(255),
    @varDescripcion VARCHAR(255),
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;

    -- MAYÚSCULAS
    SET @varDescripcion = UPPER(@varDescripcion);

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO TJT.tarjetas_pagos (
            id_tarjeta, id_tarjeta_gasto, monto_pagado, url_foto, descripcion, creado_por
        )
        VALUES (
            @varIdTarjeta, @varIdGasto, @varMonto, @varUrlFoto, @varDescripcion, @varUsuario
        );

        SET @varPkPago = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE TJT.tarjetas_pagos
        SET id_tarjeta = @varIdTarjeta,
            id_tarjeta_gasto = @varIdGasto,
            monto_pagado = @varMonto,
            url_foto = @varUrlFoto,
            descripcion = @varDescripcion,
            modificado_por = @varUsuario
        WHERE id_tarjeta_pago = @varPkPago;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPkPago AS pk;
END;
GO





DROP PROCEDURE IF EXISTS TJT.insert_update_presupuestos_recipientes_tipos;
GO
CREATE PROCEDURE TJT.insert_update_presupuestos_recipientes_tipos
    @varPkTipo INT OUTPUT,
    @varNombre VARCHAR(100),
    @varDescripcion VARCHAR(255),
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;
    DECLARE @existe INT;

    -- MAYÚSCULAS
    SET @varNombre = UPPER(@varNombre);
    SET @varDescripcion = UPPER(@varDescripcion);

    -- VALIDAR SI YA EXISTE
    SELECT @existe = COUNT(*)
    FROM TJT.presupuestos_recipientes_tipos
    WHERE nombre = @varNombre
        AND estado <> 3
        AND (@varOpc = 1 OR id_presupuesto_recipiente_tipo <> @varPkTipo);

    IF @existe > 0
    BEGIN
        SET @result = 'El nombre del tipo de recipiente ya existe.';
        SELECT @save AS 'save', @result AS result;
        RETURN;
    END;

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO TJT.presupuestos_recipientes_tipos (
            nombre, descripcion, creado_por
        )
        VALUES (
            @varNombre, @varDescripcion, @varUsuario
        );

        SET @varPkTipo = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE TJT.presupuestos_recipientes_tipos
        SET nombre = @varNombre,
            descripcion = @varDescripcion,
            modificado_por = @varUsuario
        WHERE id_presupuesto_recipiente_tipo = @varPkTipo;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPkTipo AS pk;
END;
GO





DROP PROCEDURE IF EXISTS TJT.insert_update_presupuestos;
GO
CREATE PROCEDURE TJT.insert_update_presupuestos
    @varPkPresupuesto INT OUTPUT,
    @varIdRecipienteId INT,
    @varIdRecipienteTipo INT,
    @varMonto DECIMAL(18,2),
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;
    DECLARE @existe INT;

    -- VALIDAR SI YA EXISTE
    SELECT @existe = COUNT(*)
    FROM TJT.presupuestos
    WHERE id_presupuesto_recipiente_id = @varIdRecipienteId
        AND id_presupuesto_recipiente_tipo = @varIdRecipienteTipo
        AND estado <> 3
        AND (@varOpc = 1 OR id_presupuesto <> @varPkPresupuesto);

    IF @existe > 0
    BEGIN
        SET @result = 'Ya existe un presupuesto para este recipiente.';
        SELECT @save AS 'save', @result AS result;
        RETURN;
    END;

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO TJT.presupuestos (
            id_presupuesto_recipiente_id, id_presupuesto_recipiente_tipo, monto, creado_por
        )
        VALUES (
            @varIdRecipienteId, @varIdRecipienteTipo, @varMonto, @varUsuario
        );

        SET @varPkPresupuesto = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE TJT.presupuestos
        SET id_presupuesto_recipiente_id = @varIdRecipienteId,
            id_presupuesto_recipiente_tipo = @varIdRecipienteTipo,
            monto = @varMonto,
            modificado_por = @varUsuario
        WHERE id_presupuesto = @varPkPresupuesto;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPkPresupuesto AS pk;
END;
GO





-- DROP PROCEDURE IF EXISTS TJT.insert_update_backups_tipos;
-- GO
-- CREATE PROCEDURE TJT.insert_update_backups_tipos
--     @varPkTipo INT OUTPUT,
--     @varNombre VARCHAR(100),
--     @varDescripcion VARCHAR(255),
--     @varUsuario VARCHAR(100),
--     @varOpc INT
-- AS
-- BEGIN
--     SET NOCOUNT ON;
--     DECLARE @result NVARCHAR(200), @save INT = 0;
--     DECLARE @existe INT;

--     -- MAYÚSCULAS
--     SET @varNombre = UPPER(@varNombre);
--     SET @varDescripcion = UPPER(@varDescripcion);

--     -- VALIDAR SI YA EXISTE
--     SELECT @existe = COUNT(*)
--     FROM TJT.backups_tipos
--     WHERE nombre = @varNombre
--         AND (@varOpc = 1 OR id_backup_tipo <> @varPkTipo);

--     IF @existe > 0
--     BEGIN
--         SET @result = 'El nombre del tipo de backup ya existe.';
--         SELECT @save AS 'save', @result AS result;
--         RETURN;
--     END;

--     IF @varOpc = 1 -- INSERTAR
--     BEGIN
--         INSERT INTO TJT.backups_tipos (
--             nombre, descripcion
--         )
--         VALUES (
--             @varNombre, @varDescripcion
--         );

--         SET @varPkTipo = SCOPE_IDENTITY();
--         SET @save = 1;
--         SET @result = 'Registro insertado correctamente';
--     END;
--     ELSE IF @varOpc = 2 -- ACTUALIZAR
--     BEGIN
--         UPDATE TJT.backups_tipos
--         SET nombre = @varNombre,
--             descripcion = @varDescripcion
--         WHERE id_backup_tipo = @varPkTipo;

--         SET @save = 1;
--         SET @result = 'Registro actualizado correctamente';
--     END;
--     ELSE
--     BEGIN
--         SET @result = 'Opción no válida';
--     END;

--     SELECT @save AS 'save', @result AS result, @varPkTipo AS pk;
-- END;
-- GO





DROP PROCEDURE IF EXISTS TJT.insert_update_backups;
GO
CREATE PROCEDURE TJT.insert_update_backups
    @varPkBackup INT OUTPUT,
    @varTipo VARCHAR(20),
    @varEstatus VARCHAR(20),
    @varEstatusComentario TEXT,
    @varTamanoMb DECIMAL(10,2),
    @varHashVerificacion TEXT,
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO TJT.backups (
            backup_tipo, estatus, estatus_comentario, tamano_mb, hash_verificacion, creado_por
        )
        VALUES (
            @varTipo, @varEstatus, @varEstatusComentario, @varTamanoMb, @varHashVerificacion, @varUsuario
        );

        SET @varPkBackup = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE TJT.backups
        SET backup_tipo = @varTipo,
            estatus = @varEstatus,
            estatus_comentario = @varEstatusComentario,
            tamano_mb = @varTamanoMb,
            hash_verificacion = @varHashVerificacion,
            modificado_por = @varUsuario
        WHERE id_backup = @varPkBackup;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPkBackup AS pk;
END;
GO





DROP PROCEDURE IF EXISTS TJT.insert_audit_log;
GO
CREATE PROCEDURE TJT.insert_audit_log
    @varUsuario VARCHAR(100),
    @varEntidadAfectada VARCHAR(100),
    @varIdEntidad INT,
    @varAccion VARCHAR(20),
    @varIpOrigen VARCHAR(50),
    @varDispositivo VARCHAR(255),
    @varPkLog INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;

    -- MAYÚSCULAS
    SET @varEntidadAfectada = UPPER(@varEntidadAfectada);
    SET @varAccion = UPPER(@varAccion);
    SET @varDispositivo = UPPER(@varDispositivo);

    INSERT INTO TJT.audit_log (
        usuario, entidad_afectada, id_entidad, accion,
        ip_origen, dispositivo
    )
    VALUES (
        @varUsuario, @varEntidadAfectada, @varIdEntidad, @varAccion,
        @varIpOrigen, @varDispositivo
    );

    SET @varPkLog = SCOPE_IDENTITY();
    SET @save = 1;
    SET @result = 'Registro de auditoría creado correctamente';

    SELECT @save AS 'save', @result AS result, @varPkLog AS pk;
END;
GO




DROP PROCEDURE IF EXISTS TJT.insert_update_aichat_mensajes;
GO
CREATE PROCEDURE TJT.insert_update_aichat_mensajes
    @varPkMensaje INT OUTPUT,
    @varMensaje VARCHAR(MAX),
    @varSesion INT,
    @varIdUsuario INT,
    @varUsuario VARCHAR(100),
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @result NVARCHAR(200), @save INT = 0;

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        -- Verificar si el usuario ya tiene 10 mensajes hoy
        IF (
            SELECT COUNT(1)
            FROM TJT.aichat_mensajes
            WHERE 
                id_usuario = @varIdUsuario
                AND CAST(fecha_hora_creado AS DATE) = CAST(GETDATE() AS DATE)
        ) >= 10
        BEGIN
            SET @save = 0;
            SET @result = 'Lo siento. ¡Has alcanzado el límite de mensajes por hoy!' 
             + CHAR(13) + CHAR(10) 
             + 'Recuerda que tienes un máximo de 10 interacciones diarias.';

        END
        ELSE
        BEGIN
            INSERT INTO TJT.aichat_mensajes (
                mensaje, sesion, id_usuario, creado_por
            )
            VALUES (
                @varMensaje, @varSesion, @varIdUsuario, @varUsuario
            );

            SET @varPkMensaje = SCOPE_IDENTITY();
            SET @save = 1;
            SET @result = 'Registro insertado correctamente';
        END
    END;
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE TJT.aichat_mensajes
        SET mensaje = @varMensaje,
            sesion = @varSesion,
            id_usuario = @varIdUsuario,
            modificado_por = @varUsuario
        WHERE id_mensaje = @varPkMensaje;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
    END;
    ELSE
    BEGIN
        SET @result = 'Opción no válida';
    END;

    SELECT @save AS 'save', @result AS result, @varPkMensaje AS pk;
END;
GO
