USE votaciones
GO

-- # 1
DROP PROCEDURE IF EXISTS CAT_insert_update_regiones;
GO
CREATE PROCEDURE CAT_insert_update_regiones
    @varPkRegion INT OUTPUT,
    @varNombre NVARCHAR(100),
    @varPkTipo INT,
    @varPkRegionMayor INT,
    @varUsuario INT,
    @varOpc INT  -- 1 para INSERT, 2 para UPDATE
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;

    IF @varOpc = 1 
    BEGIN
        INSERT INTO catalogo_regiones (nombre, pk_tipo, pk_region_mayor, creado_por)
        VALUES (@varNombre, @varPkTipo, @varPkRegionMayor, @varUsuario);

        SET @varPkRegion = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END
    ELSE IF @varOpc = 2
    BEGIN
        UPDATE catalogo_regiones
        SET nombre = @varNombre,
            pk_tipo = @varPkTipo,
            pk_region_mayor = @varPkRegionMayor,
            modificado_por = @varUsuario,
            fecha_hora_modificado = GETDATE()
        WHERE pk_region = @varPkRegion;

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

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

-- # 2
DROP PROCEDURE IF EXISTS CAT_insert_update_regiones_tipo;
GO
CREATE PROCEDURE CAT_insert_update_regiones_tipo
    @varPkTipo INT OUTPUT,
    @varNombre NVARCHAR(100),
    @varUsuario INT,
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;

    IF @varOpc = 1 
    BEGIN
        INSERT INTO catalogo_regiones_tipo (nombre, creado_por)
        VALUES (@varNombre, @varUsuario);

        SET @varPkTipo = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END
    ELSE IF @varOpc = 2
    BEGIN
        UPDATE catalogo_regiones_tipo
        SET nombre = @varNombre,
            modificado_por = @varUsuario,
            fecha_hora_modificado = GETDATE()
        WHERE pk_tipo = @varPkTipo;

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

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

-- # 3
DROP PROCEDURE IF EXISTS VOT_insert_update_partidos;
GO
CREATE PROCEDURE VOT_insert_update_partidos
    @varPkPartido INT OUTPUT,
    @varNombre NVARCHAR(100),
    @varAbreviatura NVARCHAR(100),
    @varPkRegion INT,
    @varUrlFoto NVARCHAR(255),
    @varUsuario INT,
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;

    IF @varOpc = 1 
    BEGIN
        INSERT INTO partidos (nombre, abreviatura, pk_region, url_foto, creado_por)
        VALUES (@varNombre, @varAbreviatura, @varPkRegion, @varUrlFoto, @varUsuario);

        SET @varPkPartido = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END
    ELSE IF @varOpc = 2
    BEGIN
        UPDATE partidos
        SET nombre = @varNombre,
            abreviatura = @varAbreviatura,
            pk_region = @varPkRegion,
            url_foto = @varUrlFoto,
            modificado_por = @varUsuario,
            fecha_hora_modificado = GETDATE()
        WHERE pk_partido = @varPkPartido;

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

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

-- # 4
DROP PROCEDURE IF EXISTS VOT_insert_update_movimientos;
GO
CREATE PROCEDURE VOT_insert_update_movimientos
    @varPkMovimiento INT OUTPUT,
    @varNombre NVARCHAR(100),
    @varPkPartido INT,
    @varPartido INT,
    @varUrlFoto NVARCHAR(255),
    @varUsuario INT,
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;

    IF @varOpc = 1 
    BEGIN
        INSERT INTO movimientos (nombre, pk_partido, partido, url_foto, creado_por)
        VALUES (@varNombre, @varPkPartido, @varPartido, @varUrlFoto, @varUsuario);

        SET @varPkMovimiento = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END
    ELSE IF @varOpc = 2
    BEGIN
        UPDATE movimientos
        SET nombre = @varNombre,
            pk_partido = @varPkPartido,
            partido = @varPartido,
            url_foto = @varUrlFoto,
            modificado_por = @varUsuario,
            fecha_hora_modificado = GETDATE()
        WHERE pk_movimiento = @varPkMovimiento;

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

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

-- # 5
DROP PROCEDURE IF EXISTS VOT_insert_update_candidatos_tipo;
GO
CREATE PROCEDURE VOT_insert_update_candidatos_tipo
    @varPkTipo INT OUTPUT,
    @varNombre NVARCHAR(100),
    @varPkRegionTipo INT,
    @varPkTipoMayor INT,
    @varUsuario INT,
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;

    IF @varOpc = 1 
    BEGIN
        INSERT INTO candidatos_tipo (nombre, pk_region_tipo, pk_tipo_mayor, creado_por)
        VALUES (@varNombre, @varPkRegionTipo, @varPkTipoMayor, @varUsuario);

        SET @varPkTipo = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END
    ELSE IF @varOpc = 2
    BEGIN
        UPDATE candidatos_tipo
        SET nombre = @varNombre,
            pk_region_tipo = @varPkRegionTipo,
            pk_tipo_mayor = @varPkTipoMayor,
            modificado_por = @varUsuario,
            fecha_hora_modificado = GETDATE()
        WHERE pk_tipo = @varPkTipo;

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

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

-- # 6
DROP PROCEDURE IF EXISTS VOT_insert_update_elecciones;
GO
CREATE PROCEDURE VOT_insert_update_elecciones
    @varPkEleccion INT OUTPUT,
    @varPkRegion INT,
    @varPkTipo INT,
    @varUsuario INT,
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;

    IF @varOpc = 1 
    BEGIN
        INSERT INTO elecciones (pk_region, pk_tipo, creado_por)
        VALUES (@varPkRegion, @varPkTipo, @varUsuario);

        SET @varPkEleccion = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END
    ELSE IF @varOpc = 2
    BEGIN
        UPDATE elecciones
        SET pk_region = @varPkRegion,
            pk_tipo = @varPkTipo,
            modificado_por = @varUsuario,
            fecha_hora_modificado = GETDATE()
        WHERE pk_eleccion = @varPkEleccion;

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

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

-- # 7
DROP PROCEDURE IF EXISTS VOT_insert_update_elecciones_tipo;
GO
CREATE PROCEDURE VOT_insert_update_elecciones_tipo
    @varPkTipo INT OUTPUT,
    @varNombre NVARCHAR(100),
    @varUsuario INT,
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;

    IF @varOpc = 1 
    BEGIN
        INSERT INTO elecciones_tipo (nombre, creado_por)
        VALUES (@varNombre, @varUsuario);

        SET @varPkTipo = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END
    ELSE IF @varOpc = 2
    BEGIN
        UPDATE elecciones_tipo
        SET nombre = @varNombre,
            modificado_por = @varUsuario,
            fecha_hora_modificado = GETDATE()
        WHERE pk_tipo = @varPkTipo;

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

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

-- # 8
DROP
PROCEDURE IF EXISTS VOT_insert_update_elecciones_candidatos_x_region;
GO
CREATE PROCEDURE VOT_insert_update_elecciones_candidatos_x_region
    @varPkConfiguracion INT OUTPUT,
    @varPkEleccion INT,
    @varPkRegion INT,
    @varPkCandidatoTipo INT,
    @varCantidad INT,
    @varUsuario INT,
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;

    IF @varOpc = 1 
    BEGIN
        INSERT INTO elecciones_candidatos_x_region (pk_eleccion, pk_region, pk_candidato_tipo, cantidad, creado_por)
        VALUES (@varPkEleccion, @varPkRegion, @varPkCandidatoTipo, @varCantidad, @varUsuario);

        SET @varPkConfiguracion = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END
    ELSE IF @varOpc = 2
    BEGIN
        UPDATE elecciones_candidatos_x_region
        SET pk_eleccion = @varPkEleccion,
            pk_region = @varPkRegion,
            pk_candidato_tipo = @varPkCandidatoTipo,
            cantidad = @varCantidad,
            modificado_por = @varUsuario,
            fecha_hora_modificado = GETDATE()
        WHERE pk_configuracion = @varPkConfiguracion;

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

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

-- # 9
DROP PROCEDURE IF EXISTS VOT_insert_update_elecciones_proceso;
GO
CREATE PROCEDURE VOT_insert_update_elecciones_proceso
    @varPkProceso INT OUTPUT,
    @varPkEleccion INT,
    @varAnio INT,
    @varMes NVARCHAR(50),
    @varDia INT,
    @varUsuario INT,
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;

    IF @varOpc = 1 
    BEGIN
        INSERT INTO elecciones_proceso (pk_eleccion, anio, mes, dia, creado_por)
        VALUES (@varPkEleccion, @varAnio, @varMes, @varDia, @varUsuario);

        SET @varPkProceso = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END
    ELSE IF @varOpc = 2
    BEGIN
        UPDATE elecciones_proceso
        SET pk_eleccion = @varPkEleccion,
            anio = @varAnio,
            mes = @varMes,
            dia = @varDia,
            modificado_por = @varUsuario,
            fecha_hora_modificado = GETDATE()
        WHERE pk_proceso = @varPkProceso;

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

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

-- # 10
DROP PROCEDURE IF EXISTS VOT_insert_update_elecciones_proceso_acta;
GO
CREATE PROCEDURE VOT_insert_update_elecciones_proceso_acta
    @varPkActa INT OUTPUT,
    @varPkProceso INT,
    @varPkCandidato INT,
    @varVotos INT,
    @varUsuario INT,
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;

    IF @varOpc = 1 
    BEGIN
        INSERT INTO elecciones_proceso_acta (pk_proceso, pk_candidato, votos, creado_por)
        VALUES (@varPkProceso, @varPkCandidato, @varVotos, @varUsuario);

        SET @varPkActa = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END
    ELSE IF @varOpc = 2
    BEGIN
        UPDATE elecciones_proceso_acta
        SET pk_proceso = @varPkProceso,
            pk_candidato = @varPkCandidato,
            votos = @varVotos,
            modificado_por = @varUsuario,
            fecha_hora_modificado = GETDATE()
        WHERE pk_acta = @varPkActa;

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

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

-- # 11
DROP PROCEDURE IF EXISTS CAT_insert_update_sexos;
GO
CREATE PROCEDURE CAT_insert_update_sexos
    @varPkSexo INT OUTPUT,
    @varNombre NVARCHAR(50),
    @varUsuario INT,
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;

    IF @varOpc = 1 
    BEGIN
        INSERT INTO catalogo_sexos (nombre, creado_por)
        VALUES (@varNombre, @varUsuario);

        SET @varPkSexo = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END
    ELSE IF @varOpc = 2
    BEGIN
        UPDATE catalogo_sexos
        SET nombre = @varNombre,
            modificado_por = @varUsuario,
            fecha_hora_modificado = GETDATE()
        WHERE pk_sexo = @varPkSexo;

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

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

-- # 12
DROP PROCEDURE IF EXISTS CAT_insert_update_nacionalidades;
GO
CREATE PROCEDURE CAT_insert_update_nacionalidades
    @varPkNacionalidad INT OUTPUT,
    @varNombre NVARCHAR(100),
    @varUsuario INT,
    @varOpc INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;

    IF @varOpc = 1 
    BEGIN
        INSERT INTO catalogo_nacionalidades (nombre, creado_por)
        VALUES (@varNombre, @varUsuario);

        SET @varPkNacionalidad = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END
    ELSE IF @varOpc = 2
    BEGIN
        UPDATE catalogo_nacionalidades
        SET nombre = @varNombre,
            modificado_por = @varUsuario,
            fecha_hora_modificado = GETDATE()
        WHERE pk_nacionalidad = @varPkNacionalidad;

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

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

-- # 13
DROP PROCEDURE IF EXISTS VOT_insert_update_candidatos;
GO
CREATE PROCEDURE VOT_insert_update_candidatos
    @varPkCandidato INT OUTPUT,                     -- Primary Key
    @varPkMovimiento INT,                    -- FK a movimientos
    @varPkEleccionProceso INT,                    -- FK a elecciones_proceso
    @varPkRegion INT,                    -- FK a regiones
    @varPkTipo INT,                          -- FK a candidatos_tipo
    @varPkCandidatoMayor INT,                -- FK a candidatos (auto-relación)
    @varPkSexo INT,                          -- FK a catalogo_sexos
    @varPkNacionalidad INT,                  -- FK a catalogo_nacionalidades
    @varNombres NVARCHAR(100),               -- Nombres del candidato
    @varApellidos NVARCHAR(100),             -- Apellidos del candidato
    @varDireccion NVARCHAR(255),             -- Dirección del candidato
    @varTelefono NVARCHAR(20),               -- Teléfono del candidato
    @varCelular NVARCHAR(20),                -- Celular del candidato
    @varEmail NVARCHAR(100),                 -- Email del candidato
    @varUrlFotoPerfil NVARCHAR(255),            -- Foto de perfil url
    @varIdentidad NVARCHAR(20),              -- Identidad del candidato
    @varRtn NVARCHAR(20),                    -- RTN del candidato
    @varUrlFotoPapeleta NVARCHAR(255),            -- Foto de papeleta url
    @varUrlFotoIdentidadAnverso NVARCHAR(255),  -- Foto de identidad anverso url
    @varUrlFotoIdentidadReverso NVARCHAR(255),  -- Foto de identidad reverso url
    @varUrlArchivoAdicional NVARCHAR(255),      -- Archivo adicional url
    @varFechaNacimiento DATE,                -- Fecha de nacimiento
    @varUsuario INT,                         -- Usuario que realiza la acción
    @varOpc INT                              -- 1 para INSERT, 2 para UPDATE
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @result NVARCHAR(200), @save INT = 0;

    DECLARE @tipoCandidatoNombre NVARCHAR(100);
    DECLARE @regionNombre NVARCHAR(100);
    DECLARE @regionTipoNombre NVARCHAR(100);
    DECLARE @maxCantidad INT;
    DECLARE @cantidadActual INT;

    IF @varOpc = 1  -- INSERT
    BEGIN
        -- Buscar la regla en elecciones_candidatos_x_region
        SELECT 
            @maxCantidad = ecr.cantidad
        FROM elecciones_candidatos_x_region ecr
        LEFT JOIN catalogo_regiones cr ON ecr.pk_region = cr.pk_region AND cr.estado <> 3
        LEFT JOIN catalogo_regiones_tipo crt ON cr.pk_tipo = crt.pk_tipo AND crt.estado <> 3
        WHERE ecr.pk_eleccion = @varPkEleccionProceso 
          AND ecr.pk_region = @varPkRegion 
          AND ecr.pk_candidato_tipo = @varPkTipo
          AND ecr.estado <> 3;

        SELECT @tipoCandidatoNombre = nombre
        FROM candidatos_tipo
        WHERE pk_tipo = @varPkTipo AND estado <> 3;

        SELECT @regionNombre = r.nombre, @regionTipoNombre = rt.nombre
        FROM catalogo_regiones r
        LEFT JOIN catalogo_regiones_tipo rt ON rt.pk_tipo = r.pk_tipo AND rt.estado <> 3
        WHERE r.pk_region = @varPkRegion AND r.estado <> 3;

        -- Si no existe una regla, obtener el nombre del tipo de candidato y retornar error
        IF @maxCantidad IS NULL
        BEGIN
            SET @result = CONCAT('No existe una regla de cantidad máxima de "', @tipoCandidatoNombre,'" para la región "', @regionNombre, ' (', @regionTipoNombre, ')"');
            SELECT @save AS 'save', @result AS result;
            RETURN;
        END

         -- Contar cuántos candidatos existen ya en esta configuración
        SELECT @cantidadActual = COUNT(*)
        FROM candidatos
        WHERE pk_eleccion_proceso = @varPkEleccionProceso
          AND pk_region = @varPkRegion
          AND pk_tipo = @varPkTipo
          AND estado <> 3;

        -- Si ya alcanzó el límite, retornar error
        IF @cantidadActual >= @maxCantidad
        BEGIN
            SET @result = CONCAT('Se alcanzó el máximo de "', @tipoCandidatoNombre, '" para la región "', @regionNombre, ' (', @regionTipoNombre, ')"');
            SELECT @save AS 'save', @result AS result;
            RETURN;
        END

        -- Insertar candidato si pasa las validaciones
        INSERT INTO candidatos (
            pk_movimiento, pk_eleccion_proceso, pk_region, pk_tipo, pk_candidato_mayor, pk_sexo, pk_nacionalidad,
            nombres, apellidos, direccion, telefono, celular, email, url_foto_perfil, identidad,
            rtn, url_foto_papeleta, url_foto_identidad_anverso, url_foto_identidad_reverso, url_archivo_adicional,
            fecha_nacimiento, creado_por
        )
        VALUES (
            @varPkMovimiento, @varPkEleccionProceso, @varPkRegion, @varPkTipo, @varPkCandidatoMayor, @varPkSexo, @varPkNacionalidad,
            @varNombres, @varApellidos, @varDireccion, @varTelefono, @varCelular, @varEmail, @varUrlFotoPerfil, @varIdentidad,
            @varRtn, @varUrlFotoPapeleta, @varUrlFotoIdentidadAnverso, @varUrlFotoIdentidadReverso, @varUrlArchivoAdicional,
            @varFechaNacimiento, @varUsuario
        );

        SET @varPkCandidato = SCOPE_IDENTITY();  -- Obtener el ID generado
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END
    ELSE IF @varOpc = 2  -- UPDATE
    BEGIN
        UPDATE candidatos
        SET pk_movimiento = @varPkMovimiento,
            pk_eleccion_proceso = @varPkEleccionProceso,
            pk_region = @varPkRegion,
            pk_tipo = @varPkTipo,
            pk_candidato_mayor = @varPkCandidatoMayor,
            pk_sexo = @varPkSexo,
            pk_nacionalidad = @varPkNacionalidad,
            nombres = @varNombres,
            apellidos = @varApellidos,
            direccion = @varDireccion,
            telefono = @varTelefono,
            celular = @varCelular,
            email = @varEmail,
            url_foto_perfil = @varUrlFotoPerfil,
            identidad = @varIdentidad,
            rtn = @varRtn,
            url_foto_papeleta = @varUrlFotoPapeleta,
            url_foto_identidad_anverso = @varUrlFotoIdentidadAnverso,
            url_foto_identidad_reverso = @varUrlFotoIdentidadReverso,
            url_archivo_adicional = @varUrlArchivoAdicional,
            fecha_nacimiento = @varFechaNacimiento,
            modificado_por = @varUsuario,
            fecha_hora_modificado = GETDATE()
        WHERE pk_candidato = @varPkCandidato;

        SET @save = 1;
        SET @result = 'Registro actualizado correctamente';
        SET @varPkCandidato = @varPkCandidato;  -- Devuelve el mismo ID en caso de UPDATE
    END
    ELSE  -- Opción no válida
    BEGIN
        SET @result = 'Opción no válida';
    END

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