CREATE OR REPLACE FUNCTION VERIFICA_OPERACOES_CNC_FIN(P_SEQESTABELEC IN NUMBER,
                                                      P_DTINICIAL IN DATE,
                                                      P_DTFINAL IN DATE) RETURN VARCHAR
AS
   V_PARAMVALIDO VARCHAR2(01);
   V_VRBAIXAFORMATADO VARCHAR2(100);
   V_NRORG NUMBER;
   V_DTINICIOINT DATE;
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_PARAMVALIDO := 'S';
   /* Verifica se algum produto de uma venda a ter sua conta gerada NAO possui tipo de recebimento relacionado. */
   FOR C_PROD_TIPORECE IN
      (SELECT DISTINCT P.NMPRODUTOADQ, P.CDTIPORECE
         FROM RETVENDAADQ R, PRODUTOADQ P
        WHERE R.NRESTABELEC = P_SEQESTABELEC
          AND ((R.DTVENDA BETWEEN P_DTINICIAL AND P_DTFINAL) OR (R.DTCREDITO BETWEEN P_DTINICIAL AND P_DTFINAL))
          AND NVL(R.DTVENDA, V_DTINICIOINT) >= V_DTINICIOINT
          AND R.NRPRODUTOADQ = P.NRPRODUTOADQ
          AND R.CDNSU IS NOT NULL
          AND NOT EXISTS (SELECT 1
                            FROM TPRECEPRODADQ T
                           WHERE T.NRPRODUTOADQ = P.NRPRODUTOADQ)
        UNION
        SELECT DISTINCT P.NMPRODUTOADQ, P.CDTIPORECE
           FROM RETFINANCADQ RF, PRODUTOADQ P
          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.CDNSU IS NOT NULL
            AND NOT EXISTS (SELECT 1
                              FROM TPRECEPRODADQ T
                             WHERE T.NRPRODUTOADQ = P.NRPRODUTOADQ)
          ORDER BY 2) LOOP
      V_PARAMVALIDO := 'N';
      GRAVAERROCTBCNC(P_SEQESTABELEC,
                      P_DTINICIAL,
                      P_DTFINAL,
                      'O PRODUTO '||C_PROD_TIPORECE.NMPRODUTOADQ||' NAO POSSUI TIPO DE RECEBIMENTO RELACIONADO.',
                      'O PRODUTO DEVE TER UM TIPO DE RECEBIMENTO PARAMETRIZADO NA TELA "PRODUTOS POR ADQUIRENTE" PARA UMA CORRETA GERAO DE BOLETO NO FINANCEIRO.',
                      'S',
                      V_NRORG);
   END LOOP;

   FOR C_CONTAS_DESC IN
      (SELECT DISTINCT C.DTATUAVENREC, C.VRATUAREC, NF.NRNOTAFISC,
              FORMATA_PESSOA(IDTPIJURCLIE, CL.NRINSJURCLIE) NRCLIENTE,
              CL.NMRAZSOCCLIE
         FROM NOTAFISCAL NF, RETVENDAADQ R, CONTARECEBER C, CLIENTE CL
        WHERE NF.CDFILIAL = R.CDFILIAL
          AND NF.NRLANCTONF = R.NRLANCTONF
          AND R.NRESTABELEC = P_SEQESTABELEC
          AND R.DTVENDA BETWEEN P_DTINICIAL AND P_DTFINAL
          AND NVL(R.DTVENDA, V_DTINICIOINT) >= V_DTINICIOINT
          AND NF.CDFILIAL = C.CDFILIAL
          AND NF.NRLANCTONF = C.NRLANCTONF
          AND C.IDSTATREC = 'D'
          AND NF.CDCLIENTE = CL.CDCLIENTE
        ORDER BY CL.NMRAZSOCCLIE, NF.NRNOTAFISC) LOOP
      V_PARAMVALIDO := 'N';
      GRAVAERROCTBCNC(P_SEQESTABELEC,
                      P_DTINICIAL,
                      P_DTFINAL,
                      'DOCUMENTO '||C_CONTAS_DESC.NRNOTAFISC||' DO CLIENTE '||
                      C_CONTAS_DESC.NMRAZSOCCLIE||' ('||REPLACE(C_CONTAS_DESC.NRCLIENTE, ' ', '')||') FOI DESCONTADO.',
                      'O DOCUMENTO DEVE TER SEU DESCONTO DO BOLETO CANCELADO.',
                      'S',
                      V_NRORG);
   END LOOP;
   RETURN V_PARAMVALIDO;
END;
/