CREATE OR REPLACE FUNCTION VERIFICA_PARAMETROS_CNC_CTB(P_SEQESTABELEC IN NUMBER,
                                                       P_DTINICIAL IN DATE,
                                                       P_DTFINAL IN DATE) RETURN VARCHAR
AS
   V_NRORG NUMBER;
   V_CTBTIPOCONTA VARCHAR2(01);
   V_COUNT NUMBER;
   V_CHAVE VARCHAR2(100);
   V_NRADQUIRENTEVD NUMBER;
   V_CDCONTCTBL VARCHAR2(100);
   V_IDTIPOCOME VARCHAR2(100);
   V_IDCONTABILIZA VARCHAR2(100);
   V_CDTPDEBIBANC VARCHAR2(100);
   V_CONTACTBLCONTCORR VARCHAR2(100);
   V_IDTIPOCOMECONTCORR VARCHAR2(100);
   V_CDCONTACLIENTE VARCHAR2(100);
   V_CDTPCTRECEB VARCHAR2(100);
   V_CDREDUCONT VARCHAR2(100);
   V_CDTPCREDBANC VARCHAR2(100);

   V_RESULT VARCHAR2(01);
   V_DTINICIOINT DATE;

   PROCEDURE PERIODO_CTB
   AS
   BEGIN
      /* VERIFICA SE O PERODO DE EXECUO DA ROTINA EST DENTRO DO PERODO CONTBIL DO FINANCEIRO */
      V_COUNT := 0;
      BEGIN
         SELECT COUNT(*)
           INTO V_COUNT
           FROM CONTOPECTBL C, ESTABELECIMENTO E
          WHERE C.CDEMPRESA = E.CDEMPRESA
            AND E.NRESTABELEC = P_SEQESTABELEC
            AND P_DTINICIAL BETWEEN DTINICCTBL AND DTFINACCTBL
            AND P_DTFINAL BETWEEN DTINICCTBL AND DTFINACCTBL;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_COUNT := 0;
      END;
      IF V_COUNT = 0 THEN
         V_RESULT := 'N';
         GRAVAERROCTBCNC(P_SEQESTABELEC,
                         P_DTINICIAL,
                         P_DTFINAL,
                         'PERODO EST FORA DO PERODO CONTBIL.',
                         'O PERODO DAS INFORMAES ('||P_DTINICIAL||' A '||P_DTFINAL||') DEVE ESTAR DENTRO DO PERODO CONTBIL DO FINANCEIRO.',
                         'S',
                         V_NRORG);
      END IF;
   END;
BEGIN
   BEGIN
      SELECT NVL(DECODE(SYS_CONTEXT('nrorg_ctx', 'nrorg'), 0, 1, SYS_CONTEXT('nrorg_ctx', 'nrorg')), 1) NRORG
        INTO V_NRORG
        FROM DUAL;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_NRORG := 1;
   END;

   V_DTINICIOINT := NULL;

    BEGIN
        SELECT TRUNC(CTF.DTINICIOINT)
        INTO V_DTINICIOINT
        FROM CTRLDTFINCNCFIL CTF
            JOIN ESTABELECIMENTO  F
              ON CTF.CDFILIAL = F.CDFILIAL
        WHERE F.NRESTABELEC = P_SEQESTABELEC;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
           V_DTINICIOINT := NULL;
    END;
    
    IF V_DTINICIOINT IS NULL THEN
      BEGIN
         SELECT TRUNC(DTINICIOINT)
           INTO V_DTINICIOINT
           FROM CTRLDTFINCNC;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_DTINICIOINT := NULL;
      END;
    END IF;

   V_NRADQUIRENTEVD := -1;
   V_RESULT := 'S';
   FOR C_DADOS IN
      (SELECT DISTINCT R.NRADQUIRENTE, P.NRPRODUTOADQ, A.CDCLIENTE, E.CDEMPRESA, E.CDFILIAL, A.NMADQUIRENTE
         FROM RETVENDAADQ R, PRODUTOADQ P, ADQUIRENTE A, ESTABELECIMENTO E
        WHERE R.NRESTABELEC = P_SEQESTABELEC
          AND R.DTVENDA BETWEEN P_DTINICIAL AND P_DTFINAL
          AND NVL(R.DTVENDA, V_DTINICIOINT) >= V_DTINICIOINT
          AND R.NRPRODUTOADQ = P.NRPRODUTOADQ
          AND R.NRADQUIRENTE = A.NRADQUIRENTE
          AND R.NRESTABELEC = E.NRESTABELEC
          AND P.CDTIPORECE IS NOT NULL
        UNION
       SELECT DISTINCT RF.NRADQUIRENTE, P.NRPRODUTOADQ, A.CDCLIENTE, E.CDEMPRESA, E.CDFILIAL, A.NMADQUIRENTE
         FROM RETFINANCADQ RF, PRODUTOADQ P, ADQUIRENTE A, ESTABELECIMENTO E
        WHERE RF.NRESTABELEC = P_SEQESTABELEC
          AND RF.DTCREDITO BETWEEN P_DTINICIAL AND P_DTFINAL
          AND NVL(RF.DTVENDA, V_DTINICIOINT) >= V_DTINICIOINT
          AND RF.IDSTATUSVENDA NOT IN ('C', 'P', 'E')
          AND RF.NRPRODUTOADQ = P.NRPRODUTOADQ
          AND RF.NRADQUIRENTE = A.NRADQUIRENTE
          AND RF.NRESTABELEC = E.NRESTABELEC
          AND P.CDTIPORECE IS NOT NULL
        ORDER BY 1, 2) LOOP

      /* VERIFICA SE A CONTA CONTBIL DO TIPO DE CONTA EST PARAMETRIZADA E SE NAO  DO TIPO FORNECEDOR */
      V_CHAVE := BUSCA_PARAMETRO_CNC(P_SEQESTABELEC, C_DADOS.NRADQUIRENTE, C_DADOS.NRPRODUTOADQ, 'TIPOCONTA', 'S', P_DTINICIAL, P_DTFINAL);
      V_CTBTIPOCONTA := 'N';
      BEGIN
         SELECT IDCTBLCTREC
           INTO V_CTBTIPOCONTA
           FROM TIPOCTRECEBER
          WHERE CDTPCTRECEB = V_CHAVE;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CTBTIPOCONTA := 'N';
      END;
      IF V_CTBTIPOCONTA = 'S' THEN
         PERIODO_CTB;
         V_CDCONTCTBL := NULL;
         V_IDTIPOCOME := NULL;
         BEGIN
            SELECT T.CDCONTCTBLCNC, C.IDTIPOCOME
              INTO V_CDCONTCTBL, V_IDTIPOCOME
              FROM TIPOCTRECEBER T, CONTCTBL C
             WHERE T.CDCONTCTBL = C.CDCONTCTBL
               AND T.CDTPCTRECEB = V_CHAVE;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDCONTCTBL := NULL;
               V_IDTIPOCOME := NULL;
         END;
         IF V_CDCONTCTBL IS NULL THEN
            V_RESULT := 'N';
            GRAVAERROCTBCNC(P_SEQESTABELEC,
                            P_DTINICIAL,
                            P_DTFINAL,
                            'CONTA CONTBIL NAO INFORMADA PARA O TIPO DE CONTA. TIPO DE CONTA: '||V_CHAVE,
                            'O TIPO DE CONTA A RECEBER DEVE TER CONTA CONTBIL PARA O CONCILIADOR PARAMETRIZADA.',
                            'S',
                            V_NRORG);
         ELSE
            /* VERIFICA SE A CONTA CONTBIL DO CLIENTE  A MESMA DO TIPO DE CONTA A RECEBER */
            IF V_NRADQUIRENTEVD <> C_DADOS.NRADQUIRENTE THEN
               V_NRADQUIRENTEVD := C_DADOS.NRADQUIRENTE;
               V_CDCONTACLIENTE := CTB_CCCLIENTE(C_DADOS.CDCLIENTE, C_DADOS.CDFILIAL, C_DADOS.CDEMPRESA);
               IF V_CDCONTACLIENTE = V_CDCONTCTBL THEN
                  V_RESULT := 'N';
                  GRAVAERROCTBCNC(P_SEQESTABELEC,
                                  P_DTINICIAL,
                                  P_DTFINAL,
                                  'CONTA CONTBIL '||FORMATA_CDCONTCTBL(V_CDCONTCTBL)||' DO TIPO DE CONTA '||V_CHAVE||'  A MESMA DO CLIENTE PARAMETRIZADO PARA A ADQUIRENTE '||C_DADOS.NMADQUIRENTE||'.',
                                  'AS CONTAS DEVEM SER DIFERENTES',
                                  'S',
                                  V_NRORG);
               END IF;
            END IF;
            IF V_IDTIPOCOME = 'F' THEN
               V_RESULT := 'N';
               GRAVAERROCTBCNC(P_SEQESTABELEC,
                               P_DTINICIAL,
                               P_DTFINAL,
                               'CONTA CONTBIL '||FORMATA_CDCONTCTBL(V_CDCONTCTBL)||
                               ' DO TIPO DE CONTA  DO TIPO COMERCIAL FORNECEDOR. TIPO DE CONTA: '||V_CDTPCTRECEB,
                               'O TIPO DEVER SER ALTERADO PARA UM TIPO DIFERENTE.',
                               'S',
                               V_NRORG);
            END IF;
         END IF;
      END IF;
   END LOOP;

   V_NRADQUIRENTEVD := -1;
   FOR AJUSTES IN
      (SELECT DISTINCT A.NRADQUIRENTE, A.NMADQUIRENTE, RF.NRPRODUTOADQ, P.NMPRODUTOADQ, RF.IDSTATUSVENDA
         FROM ADQUIRENTE A, RETFINANCADQ RF LEFT JOIN PRODUTOADQ P
                                                   ON RF.NRPRODUTOADQ = P.NRPRODUTOADQ
        WHERE RF.NRESTABELEC = P_SEQESTABELEC
          AND RF.DTCREDITO BETWEEN P_DTINICIAL AND P_DTFINAL
          AND NVL(RF.DTVENDA, V_DTINICIOINT) >= V_DTINICIOINT
          AND RF.IDSTATUSVENDA IN ('C', 'P', 'E') /* CANCELAMENTO, CRDITO OU ESTORNO */
          AND RF.NRADQUIRENTE = P_SEQESTABELEC
          AND RF.NRADQUIRENTE = A.NRADQUIRENTE
        ORDER BY 1) LOOP
      V_IDCONTABILIZA := 'N';
      IF AJUSTES.IDSTATUSVENDA = 'C' THEN
         V_CDTPDEBIBANC := BUSCA_PARAMETRO_CNC(P_SEQESTABELEC, AJUSTES.NRADQUIRENTE, AJUSTES.NRPRODUTOADQ, 'TIPODEB', 'S', P_DTINICIAL, P_DTFINAL);
         IF V_CDTPDEBIBANC IS NOT NULL THEN
            V_IDCONTABILIZA := 'N';
            BEGIN
               SELECT IDCTBLDBBANC
                 INTO V_IDCONTABILIZA
                 FROM TPDEBIBANC
                WHERE CDTPDEBIBANC = V_CDTPDEBIBANC;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_IDCONTABILIZA := 'N';
            END;

            IF V_IDCONTABILIZA = 'S' THEN
               /* VERIFICA SE A CONTA CONTABIL DO TIPO DE DEBITO PARA CANCELAMENTOS  ESTA PARAMETRIZADA E NAO E DO TIPO COMERCIAL FORNECEDOR. */
               V_CDCONTCTBL := NULL;
               V_IDTIPOCOME := NULL;
               BEGIN
                  SELECT C.CDCONTCTBL, C.IDTIPOCOME
                    INTO V_CDCONTCTBL, V_IDTIPOCOME
                    FROM TPDEBIBANC T, CONTCTBL C
                   WHERE T.CDCONTCTBL = C.CDCONTCTBL
                     AND T.CDTPDEBIBANC = V_CDTPDEBIBANC;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_CDCONTCTBL := NULL;
                     V_IDTIPOCOME := NULL;
               END;
               IF V_CDCONTCTBL IS NULL THEN
                  V_RESULT := 'N';
                  GRAVAERROCTBCNC(P_SEQESTABELEC,
                                  P_DTINICIAL,
                                  P_DTFINAL,
                                  'CONTA CONTABIL NAO INFORMADA PARA O TIPO DE DEBITO BANCARIO '||V_CDTPDEBIBANC,
                                  'O TIPO DE DEBITO BANCARIO DEVE TER CONTA CONTABIL PARAMETRIZADA.',
                                  'S',
                                  V_NRORG);
               ELSE
                  IF V_IDTIPOCOME = 'F' THEN
                     V_RESULT := 'N';
                     GRAVAERROCTBCNC(P_SEQESTABELEC,
                                     P_DTINICIAL,
                                     P_DTFINAL,
                                     'CONTA CONTABIL '||FORMATA_CDCONTCTBL(V_CDCONTCTBL)||
                                     ' DO TIPO DE DEBITO BANCARIO '||V_CDTPDEBIBANC||' E DO TIPO COMERCIAL FORNECEDOR.',
                                     'O TIPO DEVERA SER ALTERADO PARA UM TIPO DIFERENTE.',
                                     'S',
                                     V_NRORG);
                  END IF;
                  
                  V_CHAVE := BUSCA_PARAMETRO_CNC(P_SEQESTABELEC, AJUSTES.NRADQUIRENTE, AJUSTES.NRPRODUTOADQ, 'CONTCORR', 'S', P_DTINICIAL, P_DTFINAL);
                  V_CONTACTBLCONTCORR := NULL;
                  V_IDTIPOCOMECONTCORR := NULL;
                  BEGIN
                     SELECT C.CDCONTCTBL, C.IDTIPOCOME
                       INTO V_CONTACTBLCONTCORR, V_IDTIPOCOMECONTCORR
                       FROM CONTCORR CC, CONTCTBL C
                      WHERE CC.CDCONTCTBL = C.CDCONTCTBL
                        AND CC.CDREDUCONT = V_CHAVE;
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN
                        V_CONTACTBLCONTCORR := NULL;
                        V_IDTIPOCOMECONTCORR := NULL;
                  END;
                  IF V_CONTACTBLCONTCORR IS NULL THEN
                     V_RESULT := 'N';
                     GRAVAERROCTBCNC(P_SEQESTABELEC,
                                     P_DTINICIAL,
                                     P_DTFINAL,
                                     'CONTA CONTBIL NAO INFORMADA PARA A CONTA CORRENTE. CDIGO REDUZIDO: '||V_CHAVE,
                                     'A CONTA CORRENTE DEVE TER CONTA CONTBIL PARAMETRIZADA.',
                                     'S',
                                     V_NRORG);
                  ELSE
                     IF V_IDTIPOCOMECONTCORR = 'F' THEN
                        V_RESULT := 'N';
                        GRAVAERROCTBCNC(P_SEQESTABELEC,
                                        P_DTINICIAL,
                                        P_DTFINAL,
                                        'CONTA CONTBIL '||FORMATA_CDCONTCTBL(V_CDCONTCTBL)||
                                        ' DA CONTA CORRENTE  DO TIPO COMERCIAL FORNECEDOR. CDIGO REDUZIDO: '||V_CHAVE,
                                        'O TIPO DEVER SER ALTERADO PARA UM TIPO DIFERENTE.',
                                        'S',
                                        V_NRORG);
                     END IF;
                  END IF;
                  
                  IF V_CDCONTCTBL = V_CONTACTBLCONTCORR THEN
                     V_RESULT := 'N';
                     GRAVAERROCTBCNC(P_SEQESTABELEC,
                                     P_DTINICIAL,
                                     P_DTFINAL,
                                     'CONTA CONTABIL '||FORMATA_CDCONTCTBL(V_CONTACTBLCONTCORR)||
                                     ' DA CONTA CORRENTE, COD. REDUZIDO: '||V_CDREDUCONT||', E A MESMA DO TIPO DE DEBITO BANCARIO: '||V_CDTPDEBIBANC,
                                     'AS CONTAS DEVEM SER DIFERENTES.',
                                     'S',
                                     V_NRORG);
                  END IF;
               END IF;

               /* VERIFICA SE A CONTA CONTBIL DA CONTA CORRENTE EST PARAMETRIZADA */
               V_CONTACTBLCONTCORR := NULL;
               V_IDTIPOCOMECONTCORR := NULL;
               V_CDREDUCONT := BUSCA_PARAMETRO_CNC(P_SEQESTABELEC, AJUSTES.NRADQUIRENTE, AJUSTES.NRPRODUTOADQ, 'CONTCORR', 'N', NULL, NULL);
               BEGIN
                  SELECT C.CDCONTCTBL, C.IDTIPOCOME
                    INTO V_CONTACTBLCONTCORR, V_IDTIPOCOMECONTCORR
                    FROM CONTCORR CC, CONTCTBL C
                   WHERE CC.CDCONTCTBL = C.CDCONTCTBL
                     AND CC.CDREDUCONT = V_CDREDUCONT;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_CONTACTBLCONTCORR := NULL;
                     V_IDTIPOCOMECONTCORR := NULL;
               END;
               IF V_CONTACTBLCONTCORR IS NULL THEN
                  V_RESULT := 'N';
                  GRAVAERROCTBCNC(P_SEQESTABELEC,
                                  P_DTINICIAL,
                                  P_DTFINAL,
                                  'CONTA CONTBIL NAO INFORMADA PARA A CONTA CORRENTE. CDIGO REDUZIDO: '||V_CDREDUCONT,
                                  'A CONTA CORRENTE DEVE TER CONTA CONTBIL PARAMETRIZADA.',
                                  'S',
                                  V_NRORG);
               ELSE
                  IF V_IDTIPOCOMECONTCORR = 'F' THEN
                     V_RESULT := 'N';
                     GRAVAERROCTBCNC(P_SEQESTABELEC,
                                     P_DTINICIAL,
                                     P_DTFINAL,
                                     'CONTA CONTBIL '||FORMATA_CDCONTCTBL(V_CDCONTCTBL)||
                                     ' DA CONTA CORRENTE  DO TIPO COMERCIAL FORNECEDOR. CDIGO REDUZIDO: '||V_CDREDUCONT,
                                     'O TIPO DEVER SER ALTERADO PARA UM TIPO DIFERENTE.',
                                     'S',
                                     V_NRORG);
                  END IF;
               END IF;

            END IF;
         END IF;
      ELSE
         V_CDTPCREDBANC := BUSCA_PARAMETRO_CNC(P_SEQESTABELEC, AJUSTES.NRADQUIRENTE, AJUSTES.NRPRODUTOADQ, 'TIPOCRED', 'S', P_DTINICIAL, P_DTFINAL);
         IF V_CDTPDEBIBANC IS NOT NULL THEN
            V_IDCONTABILIZA := 'N';
            BEGIN
               SELECT IDCTBLCRBANC
                 INTO V_IDCONTABILIZA
                 FROM TPCREDBANC
                WHERE CDTPCREDBANC = V_CDTPDEBIBANC;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_IDCONTABILIZA := 'N';
            END;

            IF V_IDCONTABILIZA = 'S' THEN
               /* VERIFICA SE O TIPO DE CONTA DO TIPO DE CRDITO EST PARAMETRIZADO E NAO  DO TIPO FORNECEDOR */
               V_CDCONTCTBL := NULL;
               V_IDTIPOCOME := NULL;
               BEGIN
                  SELECT C.CDCONTCTBL, C.IDTIPOCOME
                    INTO V_CDCONTCTBL, V_IDTIPOCOME
                    FROM TPCREDBANC T, CONTCTBL C
                   WHERE T.CDCONTCTBL = C.CDCONTCTBL
                     AND T.CDTPCREDBANC = V_CDTPCREDBANC;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_CDCONTCTBL := NULL;
                     V_IDTIPOCOME := NULL;
               END;
               IF V_CDCONTCTBL IS NULL THEN
                  V_RESULT := 'N';
                  GRAVAERROCTBCNC(P_SEQESTABELEC,
                                  P_DTINICIAL,
                                  P_DTFINAL,
                                  'CONTA CONTBIL NAO INFORMADA PARA O TIPO DE CRDITO BANCRIO. TIPO DE CRDITO: '||V_CDTPCREDBANC,
                                  'O TIPO DE CRDITO BANCRIO DEVE TER CONTA CONTBIL PARAMETRIZADA.',
                                  'S',
                                  V_NRORG);
               ELSE
                  IF V_IDTIPOCOME = 'F' THEN
                     V_RESULT := 'N';
                     GRAVAERROCTBCNC(P_SEQESTABELEC,
                                     P_DTINICIAL,
                                     P_DTFINAL,
                                     'CONTA CONTBIL '||FORMATA_CDCONTCTBL(V_CDCONTCTBL)||
                                     ' DO TIPO DE CRDITO BANCRIO  DO TIPO COMERCIAL FORNECEDOR. TIPO DE CRDITO: '||V_CDTPCREDBANC,
                                     'O TIPO DEVER SER ALTERADO PARA UM TIPO DIFERENTE.',
                                     'S',
                                     V_NRORG);
                  ELSE
                     V_CHAVE := BUSCA_PARAMETRO_CNC(P_SEQESTABELEC, AJUSTES.NRADQUIRENTE, AJUSTES.NRPRODUTOADQ, 'CONTCORR', 'S', P_DTINICIAL, P_DTFINAL);
                     V_CONTACTBLCONTCORR := NULL;
                     V_IDTIPOCOMECONTCORR := NULL;
                     BEGIN
                        SELECT C.CDCONTCTBL, C.IDTIPOCOME
                          INTO V_CONTACTBLCONTCORR, V_IDTIPOCOMECONTCORR
                          FROM CONTCORR CC, CONTCTBL C
                         WHERE CC.CDCONTCTBL = C.CDCONTCTBL
                           AND CC.CDREDUCONT = V_CHAVE;
                     EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                           V_CONTACTBLCONTCORR := NULL;
                           V_IDTIPOCOMECONTCORR := NULL;
                     END;
                     IF V_CONTACTBLCONTCORR IS NULL THEN
                        V_RESULT := 'N';
                        GRAVAERROCTBCNC(P_SEQESTABELEC,
                                        P_DTINICIAL,
                                        P_DTFINAL,
                                        'CONTA CONTBIL NAO INFORMADA PARA A CONTA CORRENTE. CDIGO REDUZIDO: '||V_CHAVE,
                                        'A CONTA CORRENTE DEVE TER CONTA CONTBIL PARAMETRIZADA.',
                                        'S',
                                        V_NRORG);
                     ELSE
                        IF V_IDTIPOCOMECONTCORR = 'F' THEN
                           V_RESULT := 'N';
                           GRAVAERROCTBCNC(P_SEQESTABELEC,
                                           P_DTINICIAL,
                                           P_DTFINAL,
                                           'CONTA CONTBIL '||FORMATA_CDCONTCTBL(V_CDCONTCTBL)||
                                           ' DA CONTA CORRENTE  DO TIPO COMERCIAL FORNECEDOR. CDIGO REDUZIDO: '||V_CHAVE,
                                           'O TIPO DEVER SER ALTERADO PARA UM TIPO DIFERENTE.',
                                           'S',
                                           V_NRORG);
                        END IF;
                     END IF;
                     IF V_CDCONTCTBL = V_CONTACTBLCONTCORR THEN
                        V_RESULT := 'N';
                        GRAVAERROCTBCNC(P_SEQESTABELEC,
                                        P_DTINICIAL,
                                        P_DTFINAL,
                                        'CONTA CONTBIL '||FORMATA_CDCONTCTBL(V_CONTACTBLCONTCORR)||
                                        ' DA CONTA CORRENTE, CD. REDUZIDO: '||V_CDREDUCONT||',  A MESMA DO TIPO DE CRDITO BANCRIO: '||V_CDTPCREDBANC,
                                        'AS CONTAS DEVEM SER DIFERENTES.',
                                        'S',
                                        V_NRORG);
                     END IF;
                  END IF;
               END IF;
            END IF;
         END IF;
      END IF;
   END LOOP;
   RETURN V_RESULT;
END;
/