use votaciones
go


DROP PROCEDURE IF EXISTS VOT_get_elecciones_proceso_acta;
GO
CREATE PROCEDURE VOT_get_elecciones_proceso_acta
    @varPK INT,
    @opc INT
AS
BEGIN
    SELECT 
        acta.pk_acta,
        acta_tipo.pk_tipo,
        partido.pk_partido,
        proceso.pk_proceso,
        j.id AS pk_jrv,
        acta_tipo.nombre AS pk_tipo_nombre,
        eleccion_tipo.nombre AS pk_proceso_pk_eleccion_pk_tipo_nombre,
        eleccion_region.nombre AS pk_proceso_pk_eleccion_pk_region_nombre,
        CONCAT(proceso.dia, ' de ', 
               CASE proceso.mes 
                   WHEN '1' THEN 'Enero' 
                   WHEN '2' THEN 'Febrero' 
                   WHEN '3' THEN 'Marzo' 
                   WHEN '4' THEN 'Abril' 
                   WHEN '5' THEN 'Mayo' 
                   WHEN '6' THEN 'Junio' 
                   WHEN '7' THEN 'Julio' 
                   WHEN '8' THEN 'Agosto' 
                   WHEN '9' THEN 'Sprocesotiembre' 
                   WHEN '10' THEN 'Octubre' 
                   WHEN '11' THEN 'Noviembre' 
                   WHEN '12' THEN 'Diciembre' 
               END, ' del ', proceso.anio) AS pk_proceso_fecha,
        proceso.anio AS pk_proceso_anio,
        partido.nombre AS pk_partido_nombre,
        partido.abreviatura AS pk_partido_abreviatura,
        j.codigo AS pk_jrv_codigo,
        -- CAMPOS ADICIONALES
        acta.fecha_hora_inicio,
        acta.fecha_hora_finalizacion,
        acta.cantidad_papeletas_recibidas,
        acta.cantidad_papeletas_sobrantes,
        acta.cantidad_papeletas_utilizadas,
        acta.cantidad_votantes_ciudadanos,
        acta.cantidad_votantes_jrv,
        acta.cantidad_votantes_informaticos_electorales,
        acta.cantidad_votantes_total,
        acta.cantidad_votos_en_blanco,
        acta.cantidad_votos_nulos,
        acta.cantidad_votos_total,
        acta.cantidad_papeletas_validas,
        acta.cantidad_papeletas_en_blanco,
        acta.cantidad_papeletas_nulas,
        acta.url_foto
    FROM elecciones_proceso_acta acta
    LEFT JOIN elecciones_proceso_acta_tipo acta_tipo ON acta_tipo.pk_tipo = acta.pk_tipo AND acta_tipo.estado <> 3
    LEFT JOIN elecciones_proceso proceso ON acta.pk_proceso = proceso.pk_proceso AND proceso.estado <> 3
    LEFT JOIN elecciones eleccion ON proceso.pk_eleccion = eleccion.pk_eleccion AND eleccion.estado <> 3
    LEFT JOIN elecciones_tipo eleccion_tipo ON eleccion.pk_tipo = eleccion_tipo.pk_tipo AND eleccion_tipo.estado <> 3
    LEFT JOIN catalogo_regiones eleccion_region ON eleccion.pk_region = eleccion_region.pk_region AND eleccion_region.estado <> 3
    LEFT JOIN partidos partido ON acta.pk_partido = partido.pk_partido AND partido.estado <> 3
    LEFT JOIN jrv j ON j.id = acta.pk_jrv AND j.estado <> 3
    WHERE (@varPK = 0 OR acta.pk_acta = @varPK)
        AND (@opc = 0 OR acta.estado <> 3);
END;
GO






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

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

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

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

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

        SET @varPkTipo = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE elecciones_proceso_acta_tipo
        SET nombre = @varNombre,
            modificado_por = @varUsuario,
            fecha_hora_modificado = GETDATE()
        WHERE pk_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 VOT_insert_update_elecciones_proceso_acta_conteo;
GO
CREATE PROCEDURE VOT_insert_update_elecciones_proceso_acta_conteo
    @varPkConteo INT OUTPUT,
    @varPkActa INT,
    @varPkCandidato INT,
    @varCantidad INT,
    @varUsuario INT,
    @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 elecciones_proceso_acta_conteo
    WHERE pk_acta = @varPkActa
        AND pk_candidato = @varPkCandidato
        AND estado <> 3
        AND (@varOpc = 1 OR pk_conteo <> @varPkConteo);

    IF @existe > 0
    BEGIN
        SET @result = 'Ya existe un conteo para ese candidato en la misma acta.';
        SELECT @save AS 'save', @result AS result;
        RETURN;
    END

    IF @varOpc = 1 -- INSERTAR
    BEGIN
        INSERT INTO elecciones_proceso_acta_conteo (pk_acta, pk_candidato, cantidad, creado_por)
        VALUES (@varPkActa, @varPkCandidato, @varCantidad, @varUsuario);

        SET @varPkConteo = SCOPE_IDENTITY();
        SET @save = 1;
        SET @result = 'Registro insertado correctamente';
    END
    ELSE IF @varOpc = 2 -- ACTUALIZAR
    BEGIN
        UPDATE elecciones_proceso_acta_conteo
        SET pk_acta = @varPkActa,
            pk_candidato = @varPkCandidato,
            cantidad = @varCantidad,
            modificado_por = @varUsuario,
            fecha_hora_modificado = GETDATE()
        WHERE pk_conteo = @varPkConteo;

        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, @varPkConteo AS pk;
END;
GO
