CREATE OR REPLACE PROCEDURE GERA_CONTARECEBER_PREVISTA
                     (P_CDFILIAL  PEDIDO.CDFILIAL%TYPE,
                      P_NRPEDIDO  PEDIDO.NRPEDIDO%TYPE,
                      P_IDOPERACAO IN VARCHAR2)
IS
   V_RESULTADO    NUMBER;
   V_CDEMPRESA    EMPRESA.CDEMPRESA%TYPE;
   V_CDINSCESTA   INSCRESTAD.CDINSCESTA%TYPE;
   V_CDINSCMUNI   INSCRMUNICIP.CDINSCMUNI%TYPE;
   V_CDTIPOOPER   PARCMPSUP.CDTIPOOPER%TYPE;
   V_NOVOCODIGO   NOVOCODIGO.NRSEQUENCIAL%TYPE;
   V_IDGERCONTPGT PARAMPEDIDO.IDGERCONTPREV%TYPE;
   V_CDCLIENTE   CLIENTE.CDCLIENTE%TYPE;
   V_CDCLASSFINA  TIPOCTRECEBER.CDCLASSFINA%TYPE;
   V_CDTPCTRECEB  TIPOCTRECEBER.CDTPCTRECEB%TYPE;
   V_CDTPCTRECEBCLI  TIPOCTRECEBER.CDTPCTRECEB%TYPE;
   NRINSJURCLIE CLIENTE.NRINSJURCLIE%TYPE;
   V_VRORIGREC    CONTARECEBER.VRORIGREC%TYPE;
   V_CONTA        NUMBER;
   V_DTENTRSAID   NOTAFISCAL.DTENTRSAID%TYPE;
   V_CDFILIAL     FILIAL.CDFILIAL%TYPE;
   V_NRLANCTONF   NOTAFISCAL.NRLANCTONF%TYPE;
   V_BOGERCONTA   BOOLEAN;

CURSOR C_TP_CONTA_PROD_REC(P_CDFILIAL VARCHAR2,
                              P_NRPEDIDO VARCHAR2)
  IS
        SELECT PROD.CDTPCTRECEB AS CDTPCTRECEB, TP.CDCLASSFINA
			 FROM TIPOCTRECEBER TP,
					(SELECT P3.CDPRODUTO, P4.CDARVPROD, P4.CDTPCTRECEB
					   FROM ITEMPEDIDO I, PRODUTO P3, PRODUTO P4
					  WHERE I.CDFILIAL = P_CDFILIAL
					 	 AND I.NRPEDIDO = P_NRPEDIDO
						 AND I.CDPRODUTO = P3.CDPRODUTO
						 AND (INSTR(P3.CDARVPROD,NVL(RTRIM(P4.CDARVPROD),P3.CDARVPROD)) = 1)
						 AND P4.CDTPCTRECEB IS NOT NULL
						 AND P4.CDARVPROD = (SELECT MAX(P1.CDARVPROD)
													  FROM ITEMPEDIDO IT,  PRODUTO P, PRODUTO P1
													 WHERE IT.CDFILIAL = I.CDFILIAL
													   AND IT.NRPEDIDO = I.NRPEDIDO
													   AND IT.CDPRODUTO = I.CDPRODUTO
													   AND IT.CDPRODUTO = P.CDPRODUTO
													  AND (INSTR(P.CDARVPROD,NVL(RTRIM(P1.CDARVPROD),P.CDARVPROD)) = 1)
													   AND P1.CDTPCTRECEB IS NOT NULL)
					   ORDER BY P3.CDARVPROD) PROD
			WHERE PROD.CDTPCTRECEB = TP.CDTPCTRECEB
			GROUP BY PROD.CDTPCTRECEB, TP.CDCLASSFINA;
   RECORD_TPCONTAPRODREC C_TP_CONTA_PROD_REC%ROWTYPE;

BEGIN
   V_BOGERCONTA := FALSE;
   SELECT MAX(P.CDCLIENTE), MAX(FI.CDEMPRESA) , MAX(CL.CDTPCTRECEB)
     INTO V_CDCLIENTE, V_CDEMPRESA, V_CDTPCTRECEBCLI
     FROM PEDIDO P, FILIAL FI, CLIENTE CL
    WHERE P.CDFILIAL   = P_CDFILIAL
      AND P.NRPEDIDO   = P_NRPEDIDO
      AND P.CDFILIAL = FI.CDFILIAL
      AND CL.CDCLIENTE = P.CDCLIENTE;

   SELECT MAX(IDGERCONTPREV)
     INTO V_IDGERCONTPGT
     FROM PARAMPEDIDO
    WHERE CDFILIAL = P_CDFILIAL;

   IF P_IDOPERACAO = 'A' THEN
      V_CDCLASSFINA := NULL;
      V_CDTPCTRECEB := NULL;
      V_CDTIPOOPER  := NULL;
      SELECT MAX(CDTIPOOPER)
        INTO V_CDTIPOOPER
        FROM PARAMPEDIDO
       WHERE CDFILIAL = P_CDFILIAL;
      IF V_CDTIPOOPER IS NULL THEN
         V_CDTIPOOPER := '01';
      END IF;
            V_CDINSCMUNI := NULL;
            V_CDINSCESTA := NULL;
            SELECT MAX(FILIAL.CDINSCESTA), MAX(FILIAL.CDINSCMUNI)
              INTO V_CDINSCESTA, V_CDINSCMUNI
              FROM FILIAL
             WHERE FILIAL.CDFILIAL  = P_CDFILIAL
               AND FILIAL.CDEMPRESA = V_CDEMPRESA;
            IF V_CDINSCESTA IS NULL THEN
               SELECT MAX(EF.CDINSCESTA), MAX(EF.CDINSCMUNI)
                 INTO V_CDINSCESTA, V_CDINSCMUNI
                 FROM EMPRCNTRFIL EF
                WHERE EF.CDEMPRESA = V_CDEMPRESA
                 AND EF.CDFILIAL  = P_CDFILIAL;
            END IF;
            SELECT ROUND(SUM(QTITEMPED*VRPREUNITPED),2), max(DTENTPED)
              INTO V_VRORIGREC, V_DTENTRSAID
              FROM ITEMPEDIDO IT, PEDIDO PE
             WHERE IT.CDFILIAL = PE.CDFILIAL
               AND IT.NRPEDIDO = PE.NRPEDIDO
               AND PE.NRPEDIDO = P_NRPEDIDO
               AND PE.CDFILIAL = P_CDFILIAL;
            IF V_CDEMPRESA IS NOT NULL THEN
                  NOVO_CODIGO_NT('LANCNF/FILIAL'||P_CDFILIAL, V_NOVOCODIGO);
                  V_NOVOCODIGO := SUBSTR(V_NOVOCODIGO,11,10);
                  INSERT INTO NOTAFISCAL
                     (CDFILIAL, NRLANCTONF, CDEMPRESA,
                      CDINSCESTA, CDINSCMUNI, CDCLIENTE, IDBLOQUEADO, VRPRODUTOS,
                      VRNOTAFISC, IDENTRSAIDOP, IDSTATUS, CDTIPOOPER, DTENTRSAID,
                      DTEMISSAO, IDSISTEMA, CDFILIEMIT, NRNOTAFISC)
                  VALUES
                     (P_CDFILIAL, V_NOVOCODIGO,
                      V_CDEMPRESA, V_CDINSCESTA, V_CDINSCMUNI, V_CDCLIENTE,
                      'S', V_VRORIGREC, V_VRORIGREC, 'S', 'P', V_CDTIPOOPER,
                      V_DTENTRSAID, V_DTENTRSAID, 'ITG', P_CDFILIAL, P_NRPEDIDO);

               UPDATE PEDIDO
                  SET NRLANCTONF  = V_NOVOCODIGO,
                      CDFILIALNF  =  P_CDFILIAL
                WHERE CDFILIAL    = P_CDFILIAL
                  AND NRPEDIDO    = P_NRPEDIDO;
            END IF;

         /*Busca NF geradas*/
         FOR C_NOTAFISCAL IN (SELECT DISTINCT NF.CDFILIAL,
                                     NF.NRLANCTONF,
                                     NF.DTENTRSAID,
                                     NF.CDEMPRESA,
                                     NF.VRPRODUTOS,
                                     NF.DTEMISSAO
                                FROM NOTAFISCAL NF, PEDIDO PE
                               WHERE NF.CDFILIAL   = PE.CDFILIALNF
                                 AND NF.NRLANCTONF = PE.NRLANCTONF
                                 AND PE.CDFILIAL   = P_CDFILIAL
                                 AND PE.NRPEDIDO   = P_NRPEDIDO)LOOP
                 CRIA_VENCIMENTO(C_NOTAFISCAL.CDFILIAL,
                                 C_NOTAFISCAL.NRLANCTONF,
                                 'P',
                                 C_NOTAFISCAL.VRPRODUTOS,
                                 C_NOTAFISCAL.DTEMISSAO,
                                 C_NOTAFISCAL.DTEMISSAO,
                                 V_CDCLIENTE,
                                 P_CDFILIAL,
                                 NULL,
                                 P_CDFILIAL,
                                 P_CDFILIAL,
                                 P_NRPEDIDO,
                                 NULL,
                                 NULL);
               /*INSERE A CONTA A PAGAR DE ACORDO COM OS VENCIMENTOS GERADOS*/
               /*TRAB_VENCIMENTO : TABELA TEMPOR?RIA PREENCHIDA PELA CRIA_VENCIMENTO*/
               FOR C_ITEMTRAB IN (SELECT DTVENCIMENTO, VRVENCIMENTO, QTDIASVENC, NRSEQVENC
                                   FROM TRAB_VENCIMENTO
                                  WHERE CDFILIALVENC = C_NOTAFISCAL.CDFILIAL
                                    AND NRLANCTONFVENC = C_NOTAFISCAL.NRLANCTONF
                                  ORDER BY NRSEQVENC) LOOP

                    OPEN C_TP_CONTA_PROD_REC(P_CDFILIAL, P_NRPEDIDO);
                    LOOP
                    FETCH C_TP_CONTA_PROD_REC INTO RECORD_TPCONTAPRODREC;
                    EXIT WHEN C_TP_CONTA_PROD_REC%NOTFOUND;
                     V_CDTPCTRECEB := RECORD_TPCONTAPRODREC.CDTPCTRECEB;
                     V_BOGERCONTA := TRUE;
                     SELECT CDCLASSFINA
                       INTO V_CDCLASSFINA
                       FROM TIPOCTRECEBER
                      WHERE CDTPCTRECEB = V_CDTPCTRECEB;
                      ATUALIZA_FLUXO_DE_CAIXA(V_CDEMPRESA,
                                              P_CDFILIAL,
                                              C_ITEMTRAB.DTVENCIMENTO,
                                              'P',
                                              V_CDCLASSFINA,
                                              C_ITEMTRAB.VRVENCIMENTO,
                                              0);

                       /*INSERE OS VENCIMENTOS GERADOS NA TABELA DE CONTAS A RECEBER*/
                        INSERT INTO CONTARECEBER (CDFILIAL, NRLANCTONF, CDMOTIPROR, CDMOTIPARC, CDTPCTRECEB, NRSEQVENREC,
                                                 NRPARCELAREC, QTDIASVENREC, DTORIGVENREC, VRORIGREC, DTATUAVENREC, VRATUAREC,
                                                 IDSTATREC, DSCONTAREC, CDFILIBOLREC, NRLANBOLREC,
                                                 CDCLASSFINA, CDEMPRESA, CDFIMOVFLREC, IDMOVFLUXO, DTMOVFLUXO)
                        VALUES (P_CDFILIAL,V_NOVOCODIGO , NULL, NULL, V_CDTPCTRECEB, SUBSTR(C_ITEMTRAB.NRSEQVENC, LENGTH(C_ITEMTRAB.NRSEQVENC) -1, 2), '00', C_ITEMTRAB.QTDIASVENC, C_ITEMTRAB.DTVENCIMENTO,
                                C_ITEMTRAB.VRVENCIMENTO, C_ITEMTRAB.DTVENCIMENTO, C_ITEMTRAB.VRVENCIMENTO, 'A', 'CONTA PREVISTA REFERENTE AO PEDIDO: '||P_CDFILIAL||'-'||P_NRPEDIDO, NULL, NULL,
                                V_CDCLASSFINA, V_CDEMPRESA, P_CDFILIAL, 'P', C_ITEMTRAB.DTVENCIMENTO);



                    END LOOP;
                    CLOSE C_TP_CONTA_PROD_REC;
               IF NOT(V_BOGERCONTA) THEN
                  IF V_CDTPCTRECEB IS NULL THEN
                     V_CDTPCTRECEB := V_CDTPCTRECEBCLI;
                     IF V_CDTPCTRECEB IS NULL  THEN                     /*TIPO DE CONTA PARAMETRIZADO NO TIPO DE OPERACAO*/
                         SELECT CDTPCTRECEB
                           INTO V_CDTPCTRECEB
                           FROM TIPOOPERAC
                          WHERE CDTIPOOPER = V_CDTIPOOPER
                            AND IDENTRSAIDOP = 'S';
                     END IF;
                  END IF;

                  SELECT CDCLASSFINA
                    INTO V_CDCLASSFINA
                    FROM TIPOCTRECEBER
                   WHERE CDTPCTRECEB = V_CDTPCTRECEB;
                   ATUALIZA_FLUXO_DE_CAIXA(V_CDEMPRESA,
                                           P_CDFILIAL,
                                           C_ITEMTRAB.DTVENCIMENTO,
                                           'P',
                                           V_CDCLASSFINA,
                                           C_ITEMTRAB.VRVENCIMENTO,
                                           0);

                    /*INSERE OS VENCIMENTOS GERADOS NA TABELA DE CONTAS A RECEBER*/
                     INSERT INTO CONTARECEBER (CDFILIAL, NRLANCTONF, CDMOTIPROR, CDMOTIPARC, CDTPCTRECEB, NRSEQVENREC,
                                              NRPARCELAREC, QTDIASVENREC, DTORIGVENREC, VRORIGREC, DTATUAVENREC, VRATUAREC,
                                              IDSTATREC, DSCONTAREC, CDFILIBOLREC, NRLANBOLREC,
                                              CDCLASSFINA, CDEMPRESA, CDFIMOVFLREC, IDMOVFLUXO, DTMOVFLUXO)
                     VALUES (P_CDFILIAL,V_NOVOCODIGO , NULL, NULL, V_CDTPCTRECEB, SUBSTR(C_ITEMTRAB.NRSEQVENC, LENGTH(C_ITEMTRAB.NRSEQVENC) -1, 2), '00', C_ITEMTRAB.QTDIASVENC, C_ITEMTRAB.DTVENCIMENTO,
                             C_ITEMTRAB.VRVENCIMENTO, C_ITEMTRAB.DTVENCIMENTO, C_ITEMTRAB.VRVENCIMENTO, 'A', 'CONTA PREVISTA REFERENTE AO PEDIDO: '||P_CDFILIAL||'-'||P_NRPEDIDO, NULL, NULL,
                             V_CDCLASSFINA, V_CDEMPRESA, P_CDFILIAL, 'P', C_ITEMTRAB.DTVENCIMENTO);



               END IF;
            END LOOP;
            UPDATE NOTAFISCAL
               SET IDSTATUS = 'V'
             WHERE CDFILIAL = C_NOTAFISCAL.CDFILIAL
               AND NRLANCTONF = C_NOTAFISCAL.NRLANCTONF;
         END LOOP;
   ELSE
     SELECT NRLANCTONF,   CDFILIALNF
       INTO V_NRLANCTONF, V_CDFILIAL
       FROM PEDIDO
      WHERE CDFILIAL = P_CDFILIAL
        AND NRPEDIDO = P_NRPEDIDO;
       FOR C_FLUXO_PREV IN (SELECT CDEMPRESA, CDFIMOVFLREC, VRORIGREC, CDCLASSFINA, DTMOVFLUXO, IDMOVFLUXO
                              FROM CONTARECEBER
                             WHERE CDFILIAL = V_CDFILIAL
                               AND NRLANCTONF = V_NRLANCTONF) LOOP

         ATUALIZA_FLUXO_DE_CAIXA(C_FLUXO_PREV.CDEMPRESA,
                                 C_FLUXO_PREV.CDFIMOVFLREC,
                                 C_FLUXO_PREV.DTMOVFLUXO,
                                 C_FLUXO_PREV.IDMOVFLUXO,
                                 C_FLUXO_PREV.CDCLASSFINA,
                                 C_FLUXO_PREV.VRORIGREC*-1,
                                 0);

       END LOOP;
     UPDATE PEDIDO
        SET NRLANCTONF = NULL,
            CDFILIALNF = NULL
      WHERE CDFILIAL = P_CDFILIAL
        AND NRPEDIDO = P_NRPEDIDO;
     DELETE FROM CONTARECEBER
     WHERE CDFILIAL = V_CDFILIAL
       AND NRLANCTONF = V_NRLANCTONF;
    
    DELETE FROM NOTAFISCAL
     WHERE CDFILIAL = V_CDFILIAL
       AND NRLANCTONF = V_NRLANCTONF;
   END IF;
END;
/