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 GERA��O DE BOLETO NO FINANCEIRO.',
                      'S',
                      V_NRORG);
   END LOOP;

   /* VERIFICA SE EXISTE ALGUMA EM ABERTO MAS POSSUI OUTRA CONTA BAIXADA COM O MESMO TIPO DE RECEBIMENTO */
   /*FOR C_CONTAS_BAIXADAS IN
      (SELECT DISTINCT DTBAIXAREC DTORDEM, TO_CHAR(B.DTBAIXAREC, 'DD/MM/YYYY') DTBAIXAREC,
              B.VRBAIXAREC, B.CDEMPRESA, B.CDREDUCONT, P.NMPRODUTOADQ, TO_CHAR(R.DTCREDITO, 'DD/MM/YYYY') DTCREDITO
         FROM PRODUTOADQ P, RETVENDAADQ R, CONTARECEBER C, BAIXARECEBIDA B, BOLETRECEBER BO
        WHERE R.NRESTABELEC = P_SEQESTABELEC
          AND R.DTCREDITO BETWEEN P_DTINICIAL AND P_DTFINAL
          AND NVL(R.DTVENDA, V_DTINICIOINT) >= V_DTINICIOINT
          AND R.CDFILIAL = C.CDFILIAL
          AND R.NRLANCTONF = C.NRLANCTONF
          AND C.IDSTATREC = 'B'
          AND C.CDFILIBOLREC = BO.CDFILIAL
          AND C.NRLANBOLREC = BO.NRLANBOLREC
          AND BO.CDFILIBAIREC = B.CDFILIAL
          AND BO.NRBAIXAREC = B.NRBAIXAREC
          AND R.NRPRODUTOADQ = P.NRPRODUTOADQ
          AND EXISTS (SELECT 1
                        FROM RETVENDAADQ RV, NOTAFISCAL NF
                       WHERE RV.NRPRODUTOADQ = R.NRPRODUTOADQ
                         AND RV.NRADQUIRENTE = R.NRADQUIRENTE
                         AND RV.NRESTABELEC = R.NRESTABELEC
                         AND RV.DTCREDITO = R.DTCREDITO
                         AND RV.CDFILIAL = NF.CDFILIAL
                         AND RV.NRLANCTONF = NF.NRLANCTONF
                         AND NF.IDSTATUS IN ('A', 'E'))
        ORDER BY 1, B.VRBAIXAREC) LOOP
      V_PARAMVALIDO := 'N';
      V_VRBAIXAFORMATADO := REPLACE(LTRIM(TO_CHAR(NVL(ROUND(C_CONTAS_BAIXADAS.VRBAIXAREC, 2),0), '9999999999990.00')),'.',',');
      GRAVAERROCTBCNC(P_SEQESTABELEC,
                      P_DTINICIAL,
                      P_DTFINAL,
                      'EXISTEM CONTAS EM ABERTO DO PRODUTO '||C_CONTAS_BAIXADAS.NMPRODUTOADQ||' COM VENCIMENTO '||C_CONTAS_BAIXADAS.DTCREDITO||
                      ' QUE DEVERIAM ESTAR NA BAIXA DO DIA '||C_CONTAS_BAIXADAS.DTBAIXAREC||' (R$ '||V_VRBAIXAFORMATADO||') '||
                      ' DA CONTA CORRENTE '||C_CONTAS_BAIXADAS.CDREDUCONT||' MAS NAO SE ENCONTRAM NA MESMA.',
                      'A BAIXA DEVE SER EXCLU�DA E A ROTINA DE RECONCILIACAO DEVE SER NOVAMENTE EXECUTADA NA TELA "RECONCILIACAO AUTOMATICA"'||
                      ' NO DIA DO VENCIMENTO DOS BOLETOS DA BAIXA.',
                      'S',
                      V_NRORG);
   END LOOP;*/

   /* VERIFICA SE EXISTE ALGUMA CONTA DESCONTADA  */
   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;
/

-- VERSAO --
BEGIN ATUVEROBJ('VERIFICA_OPERACOES_CNC_FIN','6.05.xxx'); END;
/
