DROP FUNCTION MYM_QTDE_REPOSTAS_REC
/

DROP TYPE MYM_QTDE_REPOSTAS_REC_TABLE
/

DROP TYPE MYM_QTDE_REPOSTAS_REC_TYPE
/

CREATE TYPE MYM_QTDE_REPOSTAS_REC_TYPE AS OBJECT
  (NRQUESTAOANTERIOR NUMBER,
   TXQUESTAOANTERIOR  VARCHAR2(2000),
   NRRESPOSTAANTERIOR NUMBER,
   DSRESPOSTAANTERIOR VARCHAR2(2000),
   NRQUESTAO          NUMBER,
   TXQUESTAO          VARCHAR2(2000),
   NRORDENARESPOST    NUMBER,
   NRRESPOSTA         NUMBER,
   DSRESPOSTA         VARCHAR2(2000),
   VRPESORESPOSTA     NUMBER,
   NRPROXIMAQUESTAO   NUMBER,
   QTDE_QUESTAO       NUMBER,
   QTDE_RESPOSTA      NUMBER,
   NRORDEMQUESTAO     VARCHAR2(2000),
   NIVEL              NUMBER
  )
/

CREATE TYPE MYM_QTDE_REPOSTAS_REC_TABLE AS TABLE OF MYM_QTDE_REPOSTAS_REC_TYPE
/


create or replace FUNCTION MYM_QTDE_REPOSTAS_REC 
  (P_NRQUESTAOANTERIOR IN NUMBER,
   P_TXQUESTAOANTERIOR IN VARCHAR,
   P_NRRESPOSTAANTERIOR IN NUMBER,
   P_DSRESPOSTAANTERIOR IN VARCHAR,
   P_QTDE_QUESTAO IN NUMBER,
   P_CDFILIAL IN FILIAL.CDFILIAL%TYPE,
   P_NRLOCALPESQ IN LOCALPESQ.NRLOCALPESQ%TYPE,
   P_NRQUESTIONARIO IN NUMBER,
   P_IDAPLICATIVO IN VARCHAR,
   P_NRTURNO IN NUMBER,
   P_DTINICIO IN DATE,
   P_DTFIM IN DATE,
   P_NRPROXIMAQUESTAO IN NUMBER,
   P_NRORDEMQUESTAO IN VARCHAR,
   P_NRORG IN NUMBER
)  
   RETURN MYM_QTDE_REPOSTAS_REC_TABLE PIPELINED IS

   OUT_RECORD MYM_QTDE_REPOSTAS_REC_TYPE := MYM_QTDE_REPOSTAS_REC_TYPE
   (NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

V_ORDEMQUESTAO VARCHAR2(2000);
V_COUNT NUMBER;
V_TIPO NUMBER;
BEGIN
V_TIPO := 1;
V_COUNT := 1;
V_ORDEMQUESTAO := '';
   FOR C_QUESTOES IN(
      SELECT P_NRQUESTAOANTERIOR AS NRQUESTAOANTERIOR, P_TXQUESTAOANTERIOR AS TXQUESTAOANTERIOR, P_NRRESPOSTAANTERIOR AS NRRESPOSTAANTERIOR, P_DSRESPOSTAANTERIOR AS DSRESPOSTAANTERIOR, 
             Q.NRQUESTAO, Q.TXQUESTAO, R.NRRESPOSTA, R.NRORDENARESPOST, R.DSRESPOSTA, P_QTDE_QUESTAO AS QTDE_QUESTAO, R.NRPROXIMAQUESTAO, R.VRPESORESPOSTA,
             (SELECT COUNT(RP.NRRESPOSTA)
                FROM RESPOSTAPESQ RP INNER JOIN EXECUCAOPESQ EX ON RP.NRORG = EX.NRORG AND RP.NREXECUCAOPESQ = EX.NREXECUCAOPESQ 
               WHERE (EX.NRORG = P_NRORG) AND
                     (EX.CDFILIAL = P_CDFILIAL) AND NVL(EX.NRLOCALPESQ,0) = NVL(P_NRLOCALPESQ,0) AND
                     (EX.NRQUESTIONARIO = P_NRQUESTIONARIO) AND (EX.IDAPLICATIVO = P_IDAPLICATIVO) AND
                     (EX.DTHRFIMPESQ BETWEEN P_DTINICIO AND P_DTFIM) AND 
                     (TURNO_LOCAL(EX.NRLOCALPESQ, TO_CHAR(EX.DTHRFIMPESQ, 'HH24MI'), EX.NRORG) = P_NRTURNO) AND
                     (RP.NRQUESTAO = R.NRQUESTAO) AND (RP.NRRESPOSTA = R.NRRESPOSTA) AND
                     (NVL(RP.NRRESPOSTAANTERIOR,0) = P_NRRESPOSTAANTERIOR)) AS QTDE_RESPOSTA 
        FROM QUESTAO Q INNER JOIN RESPOSTA R ON Q.NRQUESTAO = R.NRQUESTAO AND Q.NRORG = R.NRORG AND Q.NRQUESTAO = P_NRPROXIMAQUESTAO
        ORDER BY R.NRORDENARESPOST    
   )LOOP
      IF C_QUESTOES.NRPROXIMAQUESTAO IS NOT NULL THEN
         SELECT COUNT(*) 
           INTO V_TIPO
           FROM QUESTAO Q
          WHERE IDTIPOQUESTAO = 'ABERTA_TEXTO' AND
                NRQUESTAO = C_QUESTOES.NRPROXIMAQUESTAO;
      END IF;
      V_ORDEMQUESTAO :=  P_NRORDEMQUESTAO||'.'||V_COUNT;
      V_COUNT := V_COUNT + 1;
         
      IF C_QUESTOES.NRPROXIMAQUESTAO IS NOT NULL AND V_TIPO = 0 THEN
      
         OUT_RECORD.NRQUESTAOANTERIOR  := C_QUESTOES.NRQUESTAOANTERIOR;
         OUT_RECORD.TXQUESTAOANTERIOR  := C_QUESTOES.TXQUESTAOANTERIOR;
         OUT_RECORD.NRRESPOSTAANTERIOR := C_QUESTOES.NRRESPOSTAANTERIOR;
         OUT_RECORD.DSRESPOSTAANTERIOR := C_QUESTOES.DSRESPOSTAANTERIOR;
         OUT_RECORD.NRQUESTAO          := C_QUESTOES.NRQUESTAO;
         OUT_RECORD.TXQUESTAO          := C_QUESTOES.TXQUESTAO;
         OUT_RECORD.NRORDENARESPOST    := C_QUESTOES.NRORDENARESPOST;      
         OUT_RECORD.NRRESPOSTA         := C_QUESTOES.NRRESPOSTA;
         OUT_RECORD.DSRESPOSTA         := C_QUESTOES.DSRESPOSTA;
         OUT_RECORD.VRPESORESPOSTA     := C_QUESTOES.VRPESORESPOSTA;
         OUT_RECORD.NRPROXIMAQUESTAO   := C_QUESTOES.NRPROXIMAQUESTAO;
         OUT_RECORD.QTDE_QUESTAO       := C_QUESTOES.QTDE_QUESTAO;
         OUT_RECORD.QTDE_RESPOSTA      := C_QUESTOES.QTDE_RESPOSTA;
         OUT_RECORD.NRORDEMQUESTAO     := V_ORDEMQUESTAO;
         PIPE ROW (OUT_RECORD);             


         FOR C_REC IN (
            SELECT NRQUESTAOANTERIOR, 
                   TXQUESTAOANTERIOR, 
                   NRRESPOSTAANTERIOR, 
                   DSRESPOSTAANTERIOR, 
                   NRORDEMQUESTAO,
                   NRQUESTAO, 
                   TXQUESTAO, 
                   NRRESPOSTA, 
                   NRORDENARESPOST, 
                   DSRESPOSTA, 
                   VRPESORESPOSTA,
                   QTDE_QUESTAO, 
                   NRPROXIMAQUESTAO,
                   QTDE_RESPOSTA
              FROM TABLE (MYM_QTDE_REPOSTAS_REC(C_QUESTOES.NRQUESTAO, C_QUESTOES.TXQUESTAO, C_QUESTOES.NRRESPOSTA, C_QUESTOES.DSRESPOSTA, C_QUESTOES.QTDE_RESPOSTA, P_CDFILIAL,
                                                P_NRLOCALPESQ, P_NRQUESTIONARIO, P_IDAPLICATIVO, P_NRTURNO, P_DTINICIO, P_DTFIM, C_QUESTOES.NRPROXIMAQUESTAO,
                                                V_ORDEMQUESTAO, P_NRORG))     
         ) LOOP
            OUT_RECORD.NRQUESTAOANTERIOR  := C_REC.NRQUESTAOANTERIOR;
            OUT_RECORD.TXQUESTAOANTERIOR  := C_REC.TXQUESTAOANTERIOR;
            OUT_RECORD.NRRESPOSTAANTERIOR := C_REC.NRRESPOSTAANTERIOR;
            OUT_RECORD.DSRESPOSTAANTERIOR := C_REC.DSRESPOSTAANTERIOR;
            OUT_RECORD.NRQUESTAO          := C_REC.NRQUESTAO;
            OUT_RECORD.TXQUESTAO          := C_REC.TXQUESTAO;
            OUT_RECORD.NRORDENARESPOST    := C_REC.NRORDENARESPOST;      
            OUT_RECORD.NRRESPOSTA         := C_REC.NRRESPOSTA;
            OUT_RECORD.DSRESPOSTA         := C_REC.DSRESPOSTA;
            OUT_RECORD.VRPESORESPOSTA     := C_REC.VRPESORESPOSTA;
            OUT_RECORD.NRPROXIMAQUESTAO   := C_REC.NRPROXIMAQUESTAO;
            OUT_RECORD.QTDE_QUESTAO       := C_REC.QTDE_QUESTAO;
            OUT_RECORD.QTDE_RESPOSTA      := C_REC.QTDE_RESPOSTA;
            OUT_RECORD.NRORDEMQUESTAO     := C_REC.NRORDEMQUESTAO;
            PIPE ROW (OUT_RECORD);
         END LOOP;
      ELSE

         OUT_RECORD.NRQUESTAOANTERIOR  := C_QUESTOES.NRQUESTAOANTERIOR;
         OUT_RECORD.TXQUESTAOANTERIOR  := C_QUESTOES.TXQUESTAOANTERIOR;
         OUT_RECORD.NRRESPOSTAANTERIOR := C_QUESTOES.NRRESPOSTAANTERIOR;
         OUT_RECORD.DSRESPOSTAANTERIOR := C_QUESTOES.DSRESPOSTAANTERIOR;
         OUT_RECORD.NRQUESTAO          := C_QUESTOES.NRQUESTAO;
         OUT_RECORD.TXQUESTAO          := C_QUESTOES.TXQUESTAO;
         OUT_RECORD.NRORDENARESPOST    := C_QUESTOES.NRORDENARESPOST;      
         OUT_RECORD.NRRESPOSTA         := C_QUESTOES.NRRESPOSTA;
         OUT_RECORD.DSRESPOSTA         := C_QUESTOES.DSRESPOSTA;
         OUT_RECORD.VRPESORESPOSTA     := C_QUESTOES.VRPESORESPOSTA;
         OUT_RECORD.NRPROXIMAQUESTAO   := C_QUESTOES.NRPROXIMAQUESTAO;
         OUT_RECORD.QTDE_QUESTAO       := C_QUESTOES.QTDE_QUESTAO;
         OUT_RECORD.QTDE_RESPOSTA      := C_QUESTOES.QTDE_RESPOSTA;
         OUT_RECORD.NRORDEMQUESTAO     := V_ORDEMQUESTAO;
            
         PIPE ROW (OUT_RECORD);       
      END IF;
   END LOOP;

   RETURN;
   
END;