CREATE PROCEDURE SPC_FORMULARIO_SATISF_PERGUNTA(
  FORMULARIO_ID INTEGER)
RETURNS(
  PERC_SATISF NUMERIC(12, 1),
  TOTAL_SATISF INTEGER,
  TOTAL_INSATISF INTEGER,
  FORMULARIO_PERGUNTA_ID INTEGER,
  FORMULARIO_PERGUNTA_ORDEM INTEGER)
AS
DECLARE VARIABLE QTD_SATISF INTEGER;
DECLARE VARIABLE QTD_INSATISF INTEGER;
DECLARE VARIABLE PESO SMALLINT;
DECLARE VARIABLE META_SATISF INTEGER;
DECLARE VARIABLE NIVEL_SATISF SMALLINT;
DECLARE VARIABLE PERGUNTA_ID INTEGER;
DECLARE VARIABLE PERGUNTA_ORDEM INTEGER;
DECLARE VARIABLE RESPOSTA_PERGUNTA_ID INTEGER;
BEGIN
    QTD_SATISF = 0;
    QTD_INSATISF = 0;
    PESO = 0;
    META_SATISF = 0;
    NIVEL_SATISF = 0;
    PERC_SATISF = 0;
    
    --PERGUNTAS
    FOR
        SELECT
            FP.ID,
            FP.ORDEM
                    
        FROM
            TBFORMULARIO_PERGUNTA FP

        WHERE
            FP.STATUSEXCLUSAO = '0'
        AND FP.FORMULARIO_ID = :FORMULARIO_ID
            
    INTO
        :PERGUNTA_ID,
        :PERGUNTA_ORDEM
    
    DO BEGIN
    
        -- RESPOSTAS
        FOR            
            SELECT
                X.FORMULARIO_PERGUNTA_ID,
                
                IIF(X.RESPONDEU_PESO_COLAB IS NULL, 
                    X.RESPONDEU_PESO_USUARIO, 
                    X.RESPONDEU_PESO_COLAB
                ) RESPONDEU_PESO,
                
                COALESCE(X.NIVEL_SATISFACAO, 0) NIVEL_SATISFACAO
                
            FROM (
                SELECT
                    FR.FORMULARIO_PERGUNTA_ID,
                    
                    (SELECT FIRST 1 FD.PESO_RESPOSTA 
                        FROM TBFORMULARIO_DESTINATARIO FD 
                        WHERE 
                            FD.STATUSEXCLUSAO = '0'
                        AND FD.FORMULARIO_ID = FR.FORMULARIO_ID 
                        AND FD.USUARIO_ID = FR.USUARIO_ID   
                    ) RESPONDEU_PESO_USUARIO,
                    
                    (SELECT FIRST 1 FD.PESO_RESPOSTA 
                        FROM TBFORMULARIO_DESTINATARIO FD 
                        WHERE
                            FD.STATUSEXCLUSAO = '0'
                        AND FD.FORMULARIO_ID = FR.FORMULARIO_ID 
                        AND FD.CCUSTO = FR.CCUSTO
                    ) RESPONDEU_PESO_COLAB,

                    (SELECT FIRST 1 FA.FORMULARIO_ALTERN_NIVEL_ID
                        FROM TBFORMULARIO_ALTERNATIVA FA
                        WHERE
                            FA.STATUSEXCLUSAO = '0'
                        AND FA.FORMULARIO_ID = FR.FORMULARIO_ID
                        AND FA.ID = FR.ALTERNATIVA_ESCOLHIDA_ID
                    ) NIVEL_SATISFACAO

                FROM
                    TBFORMULARIO_RESPOSTA FR

                WHERE
                    FR.STATUSEXCLUSAO = '0'
                AND FR.USUARIO_ID IS NOT NULL
                AND FR.FORMULARIO_ID = :FORMULARIO_ID
            ) X    
                
        INTO
            :RESPOSTA_PERGUNTA_ID,
            :PESO,
            :NIVEL_SATISF
            
        DO BEGIN

            IF (RESPOSTA_PERGUNTA_ID = PERGUNTA_ID) THEN
            BEGIN
            
                -- SATISFACAO
                IF (NIVEL_SATISF = 1) THEN
                    QTD_SATISF = QTD_SATISF + COALESCE(PESO, 1);
                    
                -- INSATISFACAO
                ELSE IF (NIVEL_SATISF = 2) THEN
                    QTD_INSATISF = QTD_INSATISF + COALESCE(PESO, 1); 
            END
        END 
        
        META_SATISF     = QTD_SATISF + QTD_INSATISF;
        TOTAL_SATISF    = QTD_SATISF;
        TOTAL_INSATISF  = QTD_INSATISF;
                
        -- 'PERC_SATISF' NULO CASO A META SEJA 0, SENDO ASSIM O NIVEL DE SATISFACAO EH 'NAO SE APLICA'.
        PERC_SATISF = IIF(META_SATISF > 1, ((QTD_SATISF * 100.0) / META_SATISF), NULL);
                
        -- PARA CONTROLE NA VIEW
        FORMULARIO_PERGUNTA_ID = PERGUNTA_ID;
        FORMULARIO_PERGUNTA_ORDEM = PERGUNTA_ORDEM;
        
        -- ZERANDO VALORES PARA O PROXIMO REGISTRO
        QTD_SATISF = 0;
        QTD_INSATISF = 0;
        
        SUSPEND;
    END
                    
END;

COMMENT ON PROCEDURE SPC_FORMULARIO_SATISF_PERGUNTA IS 'Calcular o percentual de satisfacao por pergunta das pesquisas.';