CREATE OR ALTER PROCEDURE SPC_FORMULARIO_SAT_PERG_CLIENTE (
    FORMULARIO_ID INTEGER,
    DATA_INI TIMESTAMP,
    DATA_FIM TIMESTAMP,
    REPRESENTANTE_ID INTEGER,
    UF VARCHAR(2))
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 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;
    META_SATISF = 0;
    NIVEL_SATISF = 0;
    PERC_SATISF = 0;
    
    --PERGUNTAS
    FOR
        SELECT DISTINCT
            FP.ID,
            FP.ORDEM
                    
        FROM
            TBFORMULARIO_PERGUNTA FP
            LEFT JOIN TBFORMULARIO_PESQ_CLIENTE FPC
                ON FPC.FORMULARIO_ID = FP.FORMULARIO_ID
                AND FPC.STATUSEXCLUSAO = '0'

        WHERE
            FP.STATUSEXCLUSAO = '0'
        AND FP.FORMULARIO_ID = :FORMULARIO_ID
        AND FPC.DATAHORA_INSERT BETWEEN :DATA_INI AND :DATA_FIM
            
    INTO
        :PERGUNTA_ID,
        :PERGUNTA_ORDEM
    
    DO BEGIN
    
        -- RESPOSTAS
        FOR            
            SELECT
                X.FORMULARIO_PERGUNTA_ID,
                COALESCE(X.NIVEL_SATISFACAO, 0) NIVEL_SATISFACAO
                
            FROM (
                SELECT
                    FR.FORMULARIO_PERGUNTA_ID,

                    (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
                    LEFT JOIN TBFORMULARIO_PESQ_CLIENTE FPC
                        ON FPC.ID = FR.FORMULARIO_PESQ_CLIENTE_ID
                        AND FPC.STATUSEXCLUSAO = '0'
                    LEFT JOIN TBCLIENTE C
                        ON C.CODIGO = FPC.CLIENTE_ID

                WHERE
                    FR.STATUSEXCLUSAO = '0'
                AND FPC.DATAHORA_INSERT BETWEEN :DATA_INI AND :DATA_FIM
                AND IIF(CAST(:REPRESENTANTE_ID AS INTEGER) IS NULL, TRUE, C.REPRESENTANTE_CODIGO = :REPRESENTANTE_ID)
                AND IIF(CAST(:UF AS VARCHAR(2)) IS NULL, TRUE, C.UF = :UF)
            ) X    
                
        INTO
            :RESPOSTA_PERGUNTA_ID,
            :NIVEL_SATISF
            
        DO BEGIN

            IF (RESPOSTA_PERGUNTA_ID = PERGUNTA_ID) THEN
            BEGIN
            
                -- SATISFACAO
                IF (NIVEL_SATISF = 1) THEN
                    QTD_SATISF = QTD_SATISF + 1;
                    
                -- INSATISFACAO
                ELSE IF (NIVEL_SATISF = 2) THEN
                    QTD_INSATISF = QTD_INSATISF + 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 > 0, ((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;