create or replace FUNCTION VERIFICA_PARAMETROS_CNC(P_SEQESTABELEC IN NUMBER,
                                                   P_DTINICIAL IN DATE,
                                                   P_DTFINAL IN DATE) RETURN VARCHAR
AS
   V_PARAMVALIDO VARCHAR2(01);
   V_CHAVE VARCHAR2(100);
   V_NRORG NUMBER;
   V_CDREDUCONT VARCHAR2(100);
   V_CDTPDEBIBANC VARCHAR2(100);
   V_CDTPCREDBANC VARCHAR2(100);
   V_CDTPCTRECEB VARCHAR2(100);
   V_CDCLASSFINA VARCHAR2(100);
   V_CDAJUCTREC VARCHAR2(100);
   V_CDTIPOOPER VARCHAR2(100);
   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';
   FOR C_EST IN
      (SELECT NMESTABELEC, CDSERIE, CDEMPRESA, CDFILIAL
         FROM ESTABELECIMENTO
        WHERE NRESTABELEC = P_SEQESTABELEC) LOOP
      IF C_EST.CDSERIE IS NULL THEN
         V_PARAMVALIDO := 'N';
         GRAVAERROCTBCNC(P_SEQESTABELEC,
                         P_DTINICIAL,
                         P_DTFINAL,
                         'O ESTABELECIMENTO '||C_EST.NMESTABELEC||' NAO POSSUI SERIE PARAMETRIZADA.',
                         'A SERIE DEVE SER PARAMETRIZADA NA TELA "SERIE POR ESTABELECIMENTO".',
                         'S',
                         V_NRORG);
      END IF;

      /* VERIFICA SE A FILIAL EST� PARAMETRIZADA. A EMPRESA � SEMPRE PARAMETRIZADA COM A EMPRESA DA FILIAL */
      IF C_EST.CDEMPRESA IS NULL OR C_EST.CDFILIAL IS NULL THEN
         GRAVAERROCTBCNC(P_SEQESTABELEC,
                         P_DTINICIAL,
                         P_DTFINAL,
                         'FILIAL NAO PARAMETRIZADA PARA O ESTABELECIMENTO '||C_EST.NMESTABELEC|| '.',
                         'UMA FILIAL DEVE SER RELACIONADA AO ESTABELECIMENTO PARA QUE SEJA POSSIVEL BUSCAR AS VENDAS NO SISTEMA E GERAR CORRETAMENTE O FINANCEIRO.',
                         'S',
                         V_NRORG);
      END IF;
   END LOOP;

   /* VERIFICA SE AS ADQUIRENTES POSSUEM CLIENTE RELACIONADO */
   FOR C_ADQ IN
      (SELECT DISTINCT A.NRADQUIRENTE, A.NMADQUIRENTE
         FROM RETVENDAADQ R, ADQUIRENTE A
        WHERE R.NRESTABELEC = P_SEQESTABELEC
          AND R.DTVENDA BETWEEN P_DTINICIAL AND P_DTFINAL
          AND R.NRADQUIRENTE = A.NRADQUIRENTE
          AND A.IDGERAFINANC = 'S'
          AND NVL(R.DTVENDA, V_DTINICIOINT) >= V_DTINICIOINT
          AND A.CDCLIENTE IS NULL
        UNION
       SELECT DISTINCT A.NRADQUIRENTE, A.NMADQUIRENTE
         FROM RETFINANCADQ RF, ADQUIRENTE A
        WHERE RF.NRESTABELEC = P_SEQESTABELEC
          AND RF.DTCREDITO BETWEEN P_DTINICIAL AND P_DTFINAL
          AND RF.NRADQUIRENTE = A.NRADQUIRENTE
          AND A.IDGERAFINANC = 'S'
          AND NVL(RF.DTVENDA, V_DTINICIOINT) >= V_DTINICIOINT
          AND A.CDCLIENTE IS NULL
        ORDER BY 1, 2) LOOP
      GRAVAERROCTBCNC(P_SEQESTABELEC,
                      P_DTINICIAL,
                      P_DTFINAL,
                      'A ADQUIRENTE '||C_ADQ.NMADQUIRENTE||' NAO POSSUI CLIENTE RELACIONADO.',
                      'O CLIENTE DEVE SER RELACIONADO PARA A ADQUIRENTE NA TELA "PARAMERIZACAO DOS PRODUTOS".',
                      'S',
                      V_NRORG);

   END LOOP;

   /* VERIFICA SE AS ADQUIRENTES POSSUEM CLIENTE RELACIONADO */
   FOR C_EST_TXSERV IN
      (SELECT DISTINCT  E.CDESTABELEC, E.NMESTABELEC
         FROM RETVENDAADQ R, 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.NRADQUIRENTE = A.NRADQUIRENTE
          AND A.IDGERAFINANC = 'S'
          AND R.NRESTABELEC = E.NRESTABELEC
          AND E.IDCTRLTXSERV = 'S'
          AND ((E.CDTPAJUCTTXSRV IS NULL) OR (E.CDTPAJUCTTXADM IS NULL))
        UNION
       SELECT DISTINCT E.CDESTABELEC, E.NMESTABELEC
         FROM RETFINANCADQ RF, 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.NRADQUIRENTE = A.NRADQUIRENTE
          AND A.IDGERAFINANC = 'S'
          AND RF.NRESTABELEC = E.NRESTABELEC
          AND E.IDCTRLTXSERV = 'S'
          AND ((E.CDTPAJUCTTXSRV IS NULL) OR (E.CDTPAJUCTTXADM IS NULL))
        ORDER BY 1, 2) LOOP
      GRAVAERROCTBCNC(P_SEQESTABELEC,
                      P_DTINICIAL,
                      P_DTFINAL,
                      'O ESTABELECIMENTO '||C_EST_TXSERV.CDESTABELEC||' - '||C_EST_TXSERV.NMESTABELEC||' CONTROLA TAXA DE SERVICO '||
                      'MAS OS TIPOS DE AJUSTE DO FINANCEIRO NAO ESTAO PARAMETRIZADOS.',
                      'OS TIPOS DE AJUSTE DEVEM SER PARAMETRIZADOS NA TELA "TAXA DE SERVICO POR ESTABELECIMENTO", NO SUBMENU DE "INTEGRACAO FINANCEIRO".',
                      'S',
                      V_NRORG);

   END LOOP;

   /**************************************************************************
       VERIFICA SE EXISTE AJUSTE DIFERENTE DE CANCELAMENTO PARA VERIFICAR A PARAMETRIZA��O
   ***************************************************************************/
   FOR AJUSTES_GENERICOS IN
      (SELECT DISTINCT A.NMADQUIRENTE
        FROM RETFINANCADQ RF, ADQUIRENTE A
       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 = 'D' /* D�BITO QUALQUER */
         AND RF.NRADQUIRENTE = A.NRADQUIRENTE
         AND A.IDGERAFINANC = 'S'
         AND A.CDTPDBDEBGER IS NULL) LOOP
      GRAVAERROCTBCNC(P_SEQESTABELEC,
                      P_DTINICIAL,
                      P_DTFINAL,
                      'A ADQUIRENTE '||AJUSTES_GENERICOS.NMADQUIRENTE||' POSSUI AJUSTES DIFERENTES DE CANCELAMENTO '||
                      'E NAO POSSUI UM TIPO DE DEBITO GENERICO PARAMETRIZADO.',
                      'O TIPO DE DEBITO GENERICO DEVE SER PARAMETRIZADO NA TELA "PARAMETRIZACAO DOS PRODUTOS" '||
                      'PARA QUE SEJA POSSIVEL ENVIAR O AJUSTE PARA O CONTROLE BANCARIO.',
                      'S',
                      V_NRORG);
   END LOOP;

   FOR AJUSTES IN
      (SELECT DISTINCT A.NMADQUIRENTE, RF.NRPRODUTOADQ, P.NMPRODUTOADQ, RF.IDSTATUSVENDA, A.NRADQUIRENTE
         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', 'E') /* CANCELAMENTO OU ESTORNO */
          AND A.IDGERAFINANC = 'S'
          AND RF.NRADQUIRENTE = A.NRADQUIRENTE) LOOP
      /* VERIFICA SE EXISTE CONTA CORRENTE PARAMETRIZADA. A MESMA SER� USADA PARA REALIZAR OS LAN�AMENTOS NO BCO */
      V_CDREDUCONT := BUSCA_PARAMETRO_CNC(P_SEQESTABELEC, AJUSTES.NRADQUIRENTE, AJUSTES.NRPRODUTOADQ, 'CONTCORR', 'S', P_DTINICIAL, P_DTFINAL);
      IF V_CDREDUCONT IS NULL THEN
         V_PARAMVALIDO := 'N';
         GRAVAERROCTBCNC(P_SEQESTABELEC,
                         P_DTINICIAL,
                         P_DTFINAL,
                         'A ADQUIRENTE '||AJUSTES.NMADQUIRENTE||' NAO POSSUI PARAMETRIZACAO DE CONTA CORRENTE PARA O PRODUTO '||AJUSTES.NMPRODUTOADQ||'.',
                         'A CONTA CORRENTE DEVE SER PARAMETRIZADA NA TELA "CONTA CORRENTE POR ESTABELECIMENTO" NO SUBMENU "INTEGRACAO FINANCEIRO".',
                         'S',
                         V_NRORG);
      END IF;

      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 NULL THEN
            V_PARAMVALIDO := 'N';
            GRAVAERROCTBCNC(P_SEQESTABELEC,
                            P_DTINICIAL,
                            P_DTFINAL,
                            'A ADQUIRENTE '||AJUSTES.NMADQUIRENTE||' POSSUI CANCELAMENTOS PARA O PRODUTO '||AJUSTES.NMPRODUTOADQ||' '||
                            'E NAO POSSUI UM TIPO DE DEBITO PARA CANCELAMENTO PARAMETRIZADO.',
                            'O TIPO DE DEBITO PARA CANCELAMENTO DEVE SER PARAMETRIZADO NA TELA "PARAMETRIZACAO DOS PRODUTOS" '||
                            'PARA QUE SEJA POSSIVEL ENVIAR O CANCELAMENTO PARA O CONTROLE BANCARIO.',
                            'S',
                            V_NRORG);
         END IF;
      ELSE
         V_CDTPCREDBANC := BUSCA_PARAMETRO_CNC(P_SEQESTABELEC, AJUSTES.NRADQUIRENTE, AJUSTES.NRPRODUTOADQ, 'TIPOCRED', 'S', P_DTINICIAL, P_DTFINAL);
         IF V_CDTPCREDBANC IS NULL THEN
            V_PARAMVALIDO := 'N';
            GRAVAERROCTBCNC(P_SEQESTABELEC,
                            P_DTINICIAL,
                            P_DTFINAL,
                            'A ADQUIRENTE '||AJUSTES.NMADQUIRENTE||' POSSUI AJUSTES POSITIVOS '||
                            'E NAO POSSUI UM TIPO DE CREDITO PARAMETRIZADO.',
                            'O TIPO DE CREDITO SER PARAMETRIZADO NA TELA "PARAMETRIZACAO DOS PRODUTOS" '||
                            'PARA QUE SEJA POSSIVEL ENVIAR O CANCELAMENTO PARA O CONTROLE BANCARIO.',
                            'S',
                            V_NRORG);
         END IF;
      END IF;
   END LOOP;

   /* CURSOR RESPONSAVEL POR TRAZER OS DADOS QUE S�O REFERENTES �S VENDAS. OS DADOS TRAZIDOS
      SER�O USADOS PARA VERIFICAR A PARRAMETRIZA��O DE:
      -TIPO DE CONTA;
      -TIPO DE OPERACAO;
      -TIPO DE AJUSTE A RECEBER; */
   FOR C_VENDAS IN
      (SELECT DISTINCT A.NRADQUIRENTE, P.NRPRODUTOADQ, A.NMADQUIRENTE, P.NMPRODUTOADQ
         FROM ADQUIRENTE A, 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.NRADQUIRENTE = A.NRADQUIRENTE
          AND RF.NRPRODUTOADQ = P.NRPRODUTOADQ
          AND A.IDGERAFINANC = 'S'
          AND RF.IDSTATUSVENDA = 'L' /* LIQUIDADA */
        UNION
       SELECT DISTINCT A.NRADQUIRENTE, P.NRPRODUTOADQ, A.NMADQUIRENTE, P.NMPRODUTOADQ
         FROM ADQUIRENTE A, RETVENDAADQ RF, PRODUTOADQ P
        WHERE RF.NRESTABELEC = P_SEQESTABELEC
          AND (RF.DTVENDA BETWEEN P_DTINICIAL AND P_DTFINAL OR RF.DTCREDITO BETWEEN P_DTINICIAL AND P_DTFINAL)
          AND NVL(RF.DTVENDA, V_DTINICIOINT) >= V_DTINICIOINT
          AND RF.NRADQUIRENTE = A.NRADQUIRENTE
          AND A.IDGERAFINANC = 'S'
          AND RF.NRPRODUTOADQ = P.NRPRODUTOADQ
        ORDER BY 1, 2) LOOP
      V_CDTPCTRECEB := BUSCA_PARAMETRO_CNC(P_SEQESTABELEC, C_VENDAS.NRADQUIRENTE, C_VENDAS.NRPRODUTOADQ, 'TIPOCONTA', 'S', P_DTINICIAL, P_DTFINAL);
      IF V_CDTPCTRECEB IS NOT NULL THEN
         V_CDCLASSFINA := NULL;
         BEGIN
            SELECT CDCLASSFINA
              INTO V_CDCLASSFINA
              FROM TIPOCTRECEBER
             WHERE CDTPCTRECEB = V_CDTPCTRECEB;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDCLASSFINA := NULL;
         END;
         IF V_CDCLASSFINA IS NULL THEN
            /* VERIFICA SE O TIPO DE CONTA A RECEBER EST� PARAMETRIZADO */
           GRAVAERROCTBCNC(P_SEQESTABELEC,
                            P_DTINICIAL,
                            P_DTFINAL,
                            'O TIPO DE CONTA '||V_CDTPCTRECEB||' NAO TEM CLASSIFICACAO FINANCEIRA PARAMETRIZADA.',
                            'PARAMETRIZAR A CLASSIFICACAO FINANCEIRA NA TELA DE TIPO DE CONTA A RECEBER, DENTRO DO SISTEMA CONTAS A RECEBER.',
                            'S',
                            V_NRORG);
         END IF;
      END IF;
      IF V_CDTPCTRECEB IS NULL THEN
         V_PARAMVALIDO := 'N';
         GRAVAERROCTBCNC(P_SEQESTABELEC,
                         P_DTINICIAL,
                         P_DTFINAL,
                         'A ADQUIRENTE '||C_VENDAS.NMADQUIRENTE||' POSSUI VENDAS PARA O PRODUTO '||C_VENDAS.NMPRODUTOADQ||' '||
                         'E O MESMO NAO POSSUI TIPO DE CONTA RELACIONADO.',
                         'O TIPO DE CONTA DEVE SER RELACIONADO NA TELA "PARAMETRIZACAO DOS PRODUTOS" '||
                         'PARA QUE SEJA POSSIVEL ENVIAR A VENDA PARA O CONTAS A RECEBER.',
                         'S',
                         V_NRORG);
      END IF;

      V_CDAJUCTREC := BUSCA_PARAMETRO_CNC(P_SEQESTABELEC, C_VENDAS.NRADQUIRENTE, C_VENDAS.NRPRODUTOADQ, 'TIPOAJUSTE', 'S', P_DTINICIAL, P_DTFINAL);
      IF V_CDAJUCTREC IS NULL THEN
         V_PARAMVALIDO := 'N';
         GRAVAERROCTBCNC(P_SEQESTABELEC,
                         P_DTINICIAL,
                         P_DTFINAL,
                         'A ADQUIRENTE '||C_VENDAS.NMADQUIRENTE||' POSSUI VENDAS PARA O PRODUTO '||C_VENDAS.NMPRODUTOADQ||' '||
                         'E O MESMO NAO POSSUI TIPO DE AJUSTE PARA TAXAS PARAMETRIZADO.',
                         'O TIPO DE AJUSTE DEVE SER RELACIONADO NA TELA "PARAMETRIZACAO DOS PRODUTOS" '||
                         'PARA QUE SEJA POSSIVEL INSERIR O VAOR DA TAXA NA CONTA A RECEBER.',
                         'S',
                         V_NRORG);
      END IF;

      V_CDTIPOOPER := BUSCA_PARAMETRO_CNC(P_SEQESTABELEC, C_VENDAS.NRADQUIRENTE, C_VENDAS.NRPRODUTOADQ, 'TIPOOPER', 'S', P_DTINICIAL, P_DTFINAL);
      IF V_CDTIPOOPER IS NULL THEN
         V_PARAMVALIDO := 'N';
         GRAVAERROCTBCNC(P_SEQESTABELEC,
                         P_DTINICIAL,
                         P_DTFINAL,
                         'A ADQUIRENTE '||C_VENDAS.NMADQUIRENTE||' POSSUI VENDAS PARA O PRODUTO '||C_VENDAS.NMPRODUTOADQ||' '||
                         'E O MESMO NAO POSSUI TIPO DE OPERACAO PARAMETRIZADO.',
                         'O TIPO DE OPERACAO DEVE SER RELACIONADO NA TELA "PARAMETRIZACAO DOS PRODUTOS" '||
                         'PARA QUE SEJA POSSIVEL GERAR A CONTA A RECEBER CORRETAMENTE.',
                         'S',
                         V_NRORG);
      END IF;
   END LOOP;

   FOR C_EST_GORJ IN
      (SELECT E.CDESTABELEC, E.NMESTABELEC
         FROM ESTABELECIMENTO E
        WHERE E.NRESTABELEC = P_SEQESTABELEC
          AND E.IDCTRLTXSERV = 'S'
          AND (E.CDTPAJUCTTXSRV IS NULL OR
               E.CDTPAJUCTTXADM IS NULL OR
               E.VRPERCTXADMSERV IS NULL)) LOOP
      V_PARAMVALIDO := 'N';
      GRAVAERROCTBCNC(P_SEQESTABELEC,
                      P_DTINICIAL,
                      P_DTFINAL,
                      'O ESTABELECIMENTO '||C_EST_GORJ.NMESTABELEC||' ('||C_EST_GORJ.CDESTABELEC||') ESTA PARAMETRIZADO PARA ENVIAR AS TAXAS DE '||
                      'SERVICO SEPARADAS PARA O FINANCEIRO MAS O MESMO NAO POSSUI A PARAMETRIZACAO RELACIONADA FEITA.',
                      'OS TIPOS DE AJUSTE DEVEM SER INFORMADOS NA TELA "TAXA DE SERVICO" NO SUBMENU "INTEGRACAO FINANCEIRO".',
                      'S',
                      V_NRORG);
   END LOOP;

   FOR C_IM IN
      (SELECT CDESTABELEC, NMESTABELEC, E.CDSERIE, F.CDINSCMUNI, F.CDFILIAL
         FROM ESTABELECIMENTO E, FILIAL F
        WHERE E.CDFILIAL = F.CDFILIAL
          AND E.CDINSCMUNI <> F.CDINSCMUNI
          AND NOT EXISTS (SELECT 1
                            FROM SERIENF S
                           WHERE F.CDEMPRESA = S.CDEMPRESA
                             AND F.CDINSCESTA = S.CDINSCESTA
                             AND F.CDINSCMUNI = S.CDINSCMUNI
                             AND S.CDSERIE = E.CDSERIE)) LOOP
      V_PARAMVALIDO := 'N';
      GRAVAERROCTBCNC(P_SEQESTABELEC,
                      P_DTINICIAL,
                      P_DTFINAL,
                      'O ESTABELECIMENTO '||C_IM.NMESTABELEC||' ('||C_IM.CDESTABELEC||') POSSUI UMA SERIE RELACIONADA ('|| C_IM.CDSERIE ||') NAO CADASTRADA NA INSCRICAO '||
                      'MUNICIPAL DA FILIAL RELACIONADA (FIL: '||C_IM.CDFILIAL||' - IM: '||C_IM.CDINSCMUNI||').',
                      'A SERIE '||C_IM.CDSERIE||' DEVE SER CADASTRADA NA INSC. MUNICIPAL '||C_IM.CDINSCMUNI|| ' DA FILIAL '||C_IM.CDFILIAL||'.',
                      'S',
                      V_NRORG);
   END LOOP;
   RETURN V_PARAMVALIDO;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('VERIFICA_PARAMETROS_CNC','6.35.021'); END;
/
