CREATE OR REPLACE
PROCEDURE GRAVA_IMP_FEDERAIS_VND_CAIXA(
   P_CDFILIAL      IN FILIAL.CDFILIAL%TYPE,
   P_CDCLIENTE     IN CLIENTE.CDCLIENTE%TYPE,
   P_TIPOOPER      IN TIPOOPERAC.CDTIPOOPER%TYPE,
   P_CDCAIXA       IN VARCHAR,
   P_TCDCAIXA      IN VARCHAR,
   P_IDORIGEMREDZ  IN VARCHAR2,
   P_DTINICIAL     IN NOTAFISCAL.DTEMISSAO%TYPE,
   P_DTFINAL       IN NOTAFISCAL.DTEMISSAO%TYPE,
   P_CDFILIALNFFIN IN FILIAL.CDFILIAL%TYPE,
   P_LANCTONFFIN   IN NOTAFISCAL.NRLANCTONF%TYPE)
AS
   V_GRUPOFISC         VARCHAR(10);
   V_CDEMPRESA         VARCHAR(2);
   V_CDINSCESTA        VARCHAR(30);
   V_VRALIQIMP         NUMBER;
   V_CSTNFE            VARCHAR(5);
   V_IDMODBCNFE        VARCHAR(5);
   V_IDMODBCSTNFE      VARCHAR(5);
   V_CDTPCRPICOSTNFE   VARCHAR(10);
   V_CDNATUBCPCSTNFE   VARCHAR(10);
   V_IDMOTIDESSTNFE    VARCHAR(10);
   V_IDUTUFORIG        VARCHAR(1);
   V_IDUTUFDEST        VARCHAR(1);
   V_SGESTORIG         VARCHAR(5);
   V_SGESTDEST         VARCHAR(5);
   V_PAISORIG          VARCHAR(5);
   V_PAISDEST          VARCHAR(5);
   V_ESTAORIG        VARCHAR2(02);
   V_ESTADEST        VARCHAR2(02);
   V_IDENDEMIS       VARCHAR2(01);
   V_IDINTEREST      VARCHAR2(01);
   V_IDINTERNA       VARCHAR2(01);
   V_CDSITUCRT       VARCHAR2(01);
   V_CDFISCALIT        VARCHAR(1);
   V_CDFISCOPERSN      ITEMPRODUTO.CDFISCOPERSN%TYPE;
   V_CDIMPPIS          VARCHAR(2);
   V_CDIMPCOFINS       VARCHAR(2);
   V_CDPRODUTO         VARCHAR2(12);
   V_VRPRODUTO         NUMBER;
   V_VRPROPORPRODUT    NUMBER;
   V_VRNOTA            NUMBER;
   V_VRVENDA           NUMBER;
   V_SEQITVENCX        NUMBER;
   V_CONTADOR          NUMBER;
   V_VRTOTPROD         NUMBER;
   V_MUNIORIG        VARCHAR2(04);
   V_CDCLIENTE       CLIENTE.CDCLIENTE%TYPE;
   V_CDNATUREC       VARCHAR2(10); 
BEGIN
   V_VRPRODUTO := 0;
       DELETE FROM ITEMVENOUTIMPOSCX
        WHERE CDFILIALNF = P_CDFILIALNFFIN
          AND NRLANCTONF = P_LANCTONFFIN;
   /*BUSCA A EMPRESA DA FILIAL*/
   BEGIN
      SELECT CDEMPRESA, CDINSCESTA
        INTO V_CDEMPRESA, V_CDINSCESTA
        FROM FILIAL
       WHERE CDFILIAL = P_CDFILIAL;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_CDEMPRESA  := NULL;
         V_CDINSCESTA := NULL;
   END;
   IF P_IDORIGEMREDZ IN ('NFCE','SAT') THEN
      BEGIN
         SELECT MAX(DECODE(CDIMPOSTONFE,'50',CDIMPOSTO,'')) AS CDPIS,
                MAX(DECODE(CDIMPOSTONFE,'60',CDIMPOSTO,'')) AS CDCOFINS
           INTO V_CDIMPPIS, V_CDIMPCOFINS
           FROM IMPOSTO
          WHERE CDIMPOSTONFE IN ('50','60');
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CDIMPPIS    := NULL;
            V_CDIMPCOFINS := NULL;
      END;
      /*VERIFICA O VALOR DOS PRODUTOS CONFORME O RECEBIMENTO*/
      FOR C_ITVEN IN (SELECT IV.CDFILIAL, IV.CDCAIXA, TRUNC(VE.DTENTRVENDA) AS DTREDUCAOZ, TRUNC(VE.DTEMISSAONFCE) AS DTEMISSAONFCE, P.CDARVPROD,
                             P.CDPRODUTO, MAX(IT.CDCSTPRODPC) AS CDCSTPRODPC, MAX(IT.VRPERPIS) AS VRPERPIS,
                             MAX(IT.VRPERCOFINS) AS VRPERCOFINS, MAX(IT.CDCFOPPROD) AS CDCFOPPROD, VE.CDSERIESAT,
                             SUM(TRUNC(((VRUNITVEND+VRUNITVENDCL)*QTPRODVEND)+VRACRITVEND-VRDESITVEND,2)) AS VRPRODUTO,
                             VE.NRSEQVENDA
                        FROM VENDA VE, ITEMVENDA IV, ITVENDAIMPOS IT, PRODUTO P, (SELECT DISTINCT CDFILIAL, CDCAIXA, NRSEQVENDA
                                                                                    FROM MOVCAIXA
                                                                                   WHERE CDFILIALNF = P_CDFILIALNFFIN
                                                                                     AND NRLANCTONF = P_LANCTONFFIN
                                                                                     AND NRSEQVENDA IS NOT NULL)MV
                       WHERE VE.CDFILIAL      = IV.CDFILIAL
                         AND VE.CDCAIXA       = IV.CDCAIXA
                         AND VE.NRSEQVENDA    = IV.NRSEQVENDA
                         AND IV.CDPRODUTO     = P.CDPRODUTO
                         AND VE.CDFILIAL      = P_CDFILIAL
                         AND VE.IDSITUVENDA   = 'O'
                         AND IV.CDFILIAL      = IT.CDFILIAL
                         AND IV.CDCAIXA       = IT.CDCAIXA
                         AND IV.NRSEQVENDA    = IT.NRSEQVENDA
                         AND IV.NRSEQUITVEND  = IT.NRSEQUITVEND
                         AND MV.CDFILIAL      = VE.CDFILIAL
                         AND MV.CDCAIXA       = VE.CDCAIXA
                         AND MV.NRSEQVENDA    = VE.NRSEQVENDA
                         AND (INSTR(P_CDCAIXA, VE.CDCAIXA) > 0 OR P_TCDCAIXA = 'T')
                         AND VE.IDTPAMBNFCE   = '1'
                         AND VE.IDSTATUSNFCE  = 'A'
                         AND VE.IDTPEMISVEND  IN ('N','S')
                         AND P_IDORIGEMREDZ   = DECODE(VE.IDTPEMISVEND,'N','NFCE','SAT')
                         AND TRUNC(VE.DTENTRVENDA) BETWEEN P_DTINICIAL AND P_DTFINAL
                       GROUP BY IV.CDFILIAL, IV.CDCAIXA, TRUNC(VE.DTENTRVENDA), P.CDARVPROD,
                             P.CDPRODUTO, VE.CDSERIESAT, TRUNC(VE.DTEMISSAONFCE), VE.NRSEQVENDA) LOOP
         /*VERIFICA SE TEVE MAIS DE UM RECEBIMENTO PARA O MESMO SEQUENCIAL DE VENDA*/
         FOR C_MOVCAIXA IN (SELECT COUNT(NRSEQVENDA) AS CONT, CDFILIAL, CDCAIXA, DTABERCAIX, NRSEQVENDA
                              FROM MOVCAIXA
                             WHERE CDFILIAL = P_CDFILIAL
                               AND CDCAIXA = P_CDCAIXA
                               AND DTMOVIMCAIXA BETWEEN P_DTINICIAL AND P_DTFINAL
                               AND NRSEQVENDA = C_ITVEN.NRSEQVENDA
                             GROUP BY CDFILIAL, CDCAIXA,DTABERCAIX, NRSEQVENDA)LOOP
            /*SE HOUVER APENAS UM RECEBIMENTO PARA A VENDA O VALOR DO PRODUTO RECEBE O VALOR TOTAL*/
            IF C_MOVCAIXA.CONT = 1 THEN
               V_VRPRODUTO := C_ITVEN.VRPRODUTO;
            ELSE
            /*SE HOUVER MAIS DE UM RECEBIMENTO PARA A VENDA VERIFICA O VALOR DA VENDA PARA FAZER A PROPORÇÃO*/
               SELECT SUM(TRUNC(DECODE(IDTIPOMOVIVE, 'E',VRMOVIVEND, DECODE(IDTIPOMOVIVE, 'S',-VRMOVIVEND,0)),2)) AS VRVENDA
                 INTO V_VRVENDA
                 FROM MOVCAIXA MV, VENDA V
                WHERE MV.CDFILIAL   = C_ITVEN.CDFILIAL
                  AND MV.CDCAIXA    = C_ITVEN.CDCAIXA
                  AND MV.NRSEQVENDA = V.NRSEQVENDA
                  AND MV.CDFILIAL   = V.CDFILIAL
                  AND MV.CDCAIXA    = V.CDCAIXA
                  AND V.NRSEQVENDA  = C_ITVEN.NRSEQVENDA;
             /*VERIFICA O TOTAL DAQUELE RECEBIMENTO PARA AQUELA VENDA*/
               SELECT SUM(TRUNC(DECODE(MV.IDTIPOMOVIVE, 'E',VRMOVIVEND, DECODE(MV.IDTIPOMOVIVE, 'S',-VRMOVIVEND,0)),2)) AS VRTOVENDA
                 INTO V_VRNOTA 
                 FROM MOVCAIXA MV, NOTAFISCAL N
                WHERE MV.CDFILIAL = P_CDFILIAL
                  AND MV.CDCAIXA  = P_CDCAIXA
                  AND MV.CDFILIALNF = N.CDFILIAL
                  AND MV.NRLANCTONF = N.NRLANCTONF
                  AND MV.CDFILIALNF = P_CDFILIALNFFIN
                  AND MV.NRLANCTONF = P_LANCTONFFIN
                  AND MV.NRSEQVENDA = C_ITVEN.NRSEQVENDA; 
                 /*REALIZA A PROPORÇÃO PARA CALCULAR O VALOR DO PRODUTO DE ACORDO COM O RECEBIMENTOE A VENDA*/
                 V_VRPROPORPRODUT := (((V_VRNOTA * 100)/V_VRVENDA));
                 V_VRPRODUTO      := (C_ITVEN.VRPRODUTO*V_VRPROPORPRODUT)/100;
            END IF;
            IF V_CDIMPPIS IS NOT NULL THEN
               IF (C_ITVEN.VRPRODUTO > 0) AND (C_ITVEN.VRPERPIS > 0) THEN
                   V_CDFISCALIT := '1';
               ELSE
                  V_CDFISCALIT := '3';
               END IF;
                /*Busca a natureza da receita do Item para o livro padrão*/
               BEGIN
                  SELECT MAX(CDNATUREC)
                    INTO V_CDNATUREC
                    FROM RELACPRODITGEN R, LIVROMAGNETICO L, PRODUTO P
                   WHERE R.CDPRODUTO = P.CDPRODUTO
                     AND P.CDPRODUTO = C_ITVEN.CDPRODUTO
                     AND R.CDLIVROMAG = L.CDLIVROMAG
                     AND L.IDPADRAOLIVRO = 'S';
               EXCEPTION
                    WHEN NO_DATA_FOUND THEN
                    V_CDNATUREC := NULL;
               END;
               /*GERA O SEQUENCIAL CHAVE DA TABELA*/
               NOVO_CODIGO_NT('SEQITEMVENOUTCX', V_SEQITVENCX);
             INSERT INTO ITEMVENOUTIMPOSCX
               (NRSEQITEMVENOUTIMPOSCX, CDIMPOSTO, CDSITUTRIBNFE, CDPRODUTO, VRALIQIT, VRPRODUTO, CDFISCALIT,
                CDTPCRPICOSTNFE, CDNATUBCPCSTNFE, CDFISCOPERSN, CDFILIALNF, NRLANCTONF, CDNATUREC)
            VALUES
               (V_SEQITVENCX, V_CDIMPPIS, C_ITVEN.CDCSTPRODPC, C_ITVEN.CDPRODUTO, C_ITVEN.VRPERPIS, ROUND(V_VRPRODUTO,2), V_CDFISCALIT,
                V_CDTPCRPICOSTNFE, V_CDNATUBCPCSTNFE, C_ITVEN.CDCFOPPROD, P_CDFILIALNFFIN, P_LANCTONFFIN, V_CDNATUREC);
            END IF;
            IF V_CDIMPCOFINS IS NOT NULL THEN
               IF (C_ITVEN.VRPRODUTO > 0) AND (C_ITVEN.VRPERCOFINS > 0) THEN
                   V_CDFISCALIT := '1';
               ELSE
                  V_CDFISCALIT := '3';
               END IF;
               /*GERA O SEQUENCIAL CHAVE DA TABELA*/
               NOVO_CODIGO_NT('SEQITEMVENOUTCX', V_SEQITVENCX);
             INSERT INTO ITEMVENOUTIMPOSCX
               (NRSEQITEMVENOUTIMPOSCX, CDIMPOSTO, CDSITUTRIBNFE, CDPRODUTO, VRALIQIT, VRPRODUTO, CDFISCALIT,
                CDTPCRPICOSTNFE, CDNATUBCPCSTNFE, CDFISCOPERSN, CDFILIALNF, NRLANCTONF, CDNATUREC)
             VALUES
               (V_SEQITVENCX, V_CDIMPCOFINS, C_ITVEN.CDCSTPRODPC, C_ITVEN.CDPRODUTO, C_ITVEN.VRPERCOFINS, ROUND(V_VRPRODUTO,2), V_CDFISCALIT,
                V_CDTPCRPICOSTNFE, V_CDNATUBCPCSTNFE, C_ITVEN.CDCFOPPROD, P_CDFILIALNFFIN, P_LANCTONFFIN, V_CDNATUREC);
            END IF;
         END LOOP;
         V_GRUPOFISC := NULL;
         /*VERIFICA SE EXISTE GRUPO FISCAL DE IMPOSTO POR FILIAL*/
         BEGIN
             SELECT GR.CDGRUPOFISC
               INTO V_GRUPOFISC
               FROM GRUPOFISCIMPFIL GR, FILIAL F, IMPOSTO IM
              WHERE IM.CDIMPOSTONFE = '50'
                AND IM.CDIMPOSTO    = GR.CDIMPOSTO
                AND F.CDFILIAL      = P_CDFILIAL
                AND F.CDFILIAL      = GR.CDFILIAL;
          EXCEPTION
             WHEN NO_DATA_FOUND THEN
                V_GRUPOFISC := NULL;
          END;
          IF V_GRUPOFISC IS NULL THEN  /*VERIFICA SE EXISTE GRUPO FISCAL PARA IMPOSTO/IE SELECIONADA*/
             BEGIN
                SELECT GR.CDGRUPOFISC
                  INTO V_GRUPOFISC
                  FROM GRFISIMPIECLIE GR, FILIAL F, IMPOSTO IM
                 WHERE IM.CDIMPOSTONFE = '50'
                   AND IM.CDIMPOSTO    = GR.CDIMPOSTO
                   AND F.CDINSCESTA    = GR.CDINSCESTA
                   AND F.CDEMPRESA     = GR.CDEMPRESA
                   AND GR.CDCLIENTE    = P_CDCLIENTE
                   AND F.CDFILIAL      = P_CDFILIAL;
             EXCEPTION
                WHEN NO_DATA_FOUND THEN
                   V_GRUPOFISC := NULL;
             END;
          END IF;
          IF V_GRUPOFISC IS NULL THEN  /*VERIFICA SE HÁ GRUPO FISCAL  PARA A FILIAL*/
             BEGIN
                SELECT CDGRUPOFISC
                  INTO V_GRUPOFISC
                  FROM FILIAL
                 WHERE CDFILIAL = P_CDFILIAL;
             EXCEPTION
                WHEN NO_DATA_FOUND THEN
                   V_GRUPOFISC := NULL;
             END;
          END IF;
          IF V_GRUPOFISC IS NULL THEN  /*VERIFICA SE HÁ GRUPO FISCAL PARA CLIENTE*/
             BEGIN
                SELECT CDGRUPOFISC
                  INTO V_GRUPOFISC
                  FROM CLIENTE
                 WHERE CDCLIENTE = P_CDCLIENTE;
             EXCEPTION
                WHEN NO_DATA_FOUND THEN
                   V_GRUPOFISC := NULL;
             END;
          END IF;
         CONSULTA_CST_NFE('S', V_CDEMPRESA, C_ITVEN.CDARVPROD, V_CDINSCESTA, P_TIPOOPER, V_GRUPOFISC, '50', 'N', 'N', P_CDFILIAL, P_LANCTONFFIN, '', V_CSTNFE, V_IDMODBCNFE, V_IDMODBCSTNFE, V_CDTPCRPICOSTNFE, V_CDNATUBCPCSTNFE, V_IDMOTIDESSTNFE);
         /*O campo DTEMISSAONFCE foi preenchido com o SYSDATE para evitar erro de PK quando for necessário realizar a
           rotina de aprovação duas vezes no mesmo dia, caixa e filial. Ex.: Parte do dia Redução Z e outra parte NFCE. */
      END LOOP;
   ELSE
      BEGIN
         SELECT NVL(MAX(IDENDCFOPCLI),'P')
           INTO V_IDENDEMIS
           FROM CLIENTE
          WHERE CDCLIENTE = P_CDCLIENTE;
      EXCEPTION
           WHEN NO_DATA_FOUND THEN
             V_IDENDEMIS := 'P';
      END;
      BEGIN
         SELECT MAX(CDPAIS), MAX(SGESTADO), MAX(CDMUNICIPIO)
           INTO V_PAISORIG, V_ESTAORIG, V_MUNIORIG
           FROM INSCRESTAD
          WHERE CDEMPRESA  = V_CDEMPRESA
            AND CDINSCESTA = V_CDINSCESTA;
      EXCEPTION
           WHEN NO_DATA_FOUND THEN
             V_PAISORIG := '0055';
             V_ESTAORIG := '';
             V_MUNIORIG := '';
      END;
      BEGIN
         SELECT MAX(CDPAIS), MAX(SGESTADO)
           INTO V_PAISDEST, V_ESTADEST
           FROM ENDECLIE
          WHERE CDCLIENTE    = P_CDCLIENTE
            AND IDTPENDECLIE = V_IDENDEMIS;
      EXCEPTION
           WHEN NO_DATA_FOUND THEN
             V_PAISDEST := '0055';
             V_ESTADEST := '';
      END;
      V_IDINTEREST := 'N';
      V_IDINTERNA  := 'N';
      IF ((V_PAISDEST = V_PAISORIG) AND (V_ESTADEST <> V_ESTAORIG)) THEN
         V_IDINTEREST := 'S';
      ELSIF (V_PAISDEST <> V_PAISORIG) THEN
         V_IDINTERNA := 'S';
      END IF;
      BEGIN
         SELECT NVL(MAX(CDSITUCRT), '3') CDSITUCRT
           INTO V_CDSITUCRT
           FROM PARAMEMPRESA
          WHERE CDEMPRESA = V_CDEMPRESA;
      EXCEPTION
           WHEN NO_DATA_FOUND THEN
             V_CDSITUCRT := '';
      END;
      /*VERIFICA O VALOR DOS PRODUTOS CONFORME O RECEBIMENTO QUANDO NÃO FOR NFCE/SAT*/
      FOR C_ITVEN IN (SELECT IV.CDFILIAL, V.DTENTRVENDA, IV.CDCAIXA, P.CDARVPROD, P.CDPRODUTO,
                             SUM(TRUNC(((VRUNITVEND+VRUNITVENDCL)*QTPRODVEND)+VRACRITVEND-VRDESITVEND,2)) AS VRPRODUTO,
                             CFOP_ITEM('00' , V.CDEMPRESA, V_CDINSCESTA, V.CDFILIAL, V_CDCLIENTE, P_TIPOOPER, V.DTENTRVENDA, P.CDARVPROD, V_PAISORIG, V_ESTAORIG, V_PAISDEST, V_ESTADEST) AS CFOPITEM,
                             V.NRSEQVENDA
                        FROM VENDA V, ITEMVENDA IV, PRODUTO P, (SELECT DISTINCT CDFILIAL, CDCAIXA, NRSEQVENDA
                                                                  FROM MOVCAIXA
                                                                 WHERE CDFILIALNF = P_CDFILIALNFFIN
                                                                   AND NRLANCTONF = P_LANCTONFFIN
                                                                   AND NRSEQVENDA IS NOT NULL)MV
                       WHERE V.CDFILIAL   = IV.CDFILIAL
                         AND V.CDCAIXA    = IV.CDCAIXA
                         AND V.NRSEQVENDA = IV.NRSEQVENDA
                         AND IV.CDPRODUTO = P.CDPRODUTO
                         AND V.CDFILIAL   = P_CDFILIAL
                         AND MV.CDFILIAL  = V.CDFILIAL
                         AND MV.CDCAIXA   = V.CDCAIXA
                         AND MV.NRSEQVENDA = V.NRSEQVENDA
                         AND IDSITUVENDA  = 'O'
                         AND (V.IDTPEMISVEND NOT IN ('N','S') OR V.IDTPEMISVEND IS NULL)
                         AND (INSTR(P_CDCAIXA, V.CDCAIXA) > 0 OR P_TCDCAIXA = 'T')
                         AND TRUNC(V.DTENTRVENDA) BETWEEN P_DTINICIAL AND P_DTFINAL
                       GROUP BY IV.CDFILIAL, IV.CDCAIXA, P.CDPRODUTO, P.CDARVPROD, V.DTENTRVENDA,
                                CFOP_ITEM('00' , V.CDEMPRESA, V_CDINSCESTA, V.CDFILIAL, V_CDCLIENTE, P_TIPOOPER, V.DTENTRVENDA, P.CDARVPROD, V_PAISORIG, V_ESTAORIG, V_PAISDEST, V_ESTADEST),
                                V.NRSEQVENDA) LOOP
         /*VERIFICA SE TEVE MAIS DE UM RECEBIMENTO PARA O MESMO SEQUENCIAL DE VENDA*/
         FOR C_MOVCAIXA IN (SELECT COUNT(NRSEQVENDA) AS CONT, CDFILIAL, CDCAIXA, DTABERCAIX, NRSEQVENDA
                              FROM MOVCAIXA
                             WHERE CDFILIAL = P_CDFILIAL
                               AND CDCAIXA = P_CDCAIXA
                               AND DTMOVIMCAIXA BETWEEN P_DTINICIAL AND P_DTFINAL
                               AND NRSEQVENDA = C_ITVEN.NRSEQVENDA
                             GROUP BY CDFILIAL, CDCAIXA,DTABERCAIX, NRSEQVENDA)LOOP
            /*SE HOUVER APENAS UM RECEBIMENTO PARA A VENDA O VALOR DO PRODUTO RECEBE O VALOR TOTAL*/
            IF C_MOVCAIXA.CONT = 1 THEN
               V_VRPRODUTO := C_ITVEN.VRPRODUTO;
            ELSE
               /*SE HOUVER MAIS DE UM RECEBIMENTO PARA A VENDA VERIFICA O VALOR DA VENDA PARA FAZER A PROPORÇÃO*/
               SELECT SUM(TRUNC(DECODE(IDTIPOMOVIVE, 'E',VRMOVIVEND, DECODE(IDTIPOMOVIVE, 'S',-VRMOVIVEND,0)),2)) AS VRVENDA
                 INTO V_VRVENDA
                 FROM MOVCAIXA MV, VENDA V
                WHERE MV.CDFILIAL   = C_ITVEN.CDFILIAL
                  AND MV.CDCAIXA    = C_ITVEN.CDCAIXA
                  AND MV.NRSEQVENDA = V.NRSEQVENDA
                  AND MV.CDFILIAL   = V.CDFILIAL
                  AND MV.CDCAIXA    = V.CDCAIXA
                  AND V.NRSEQVENDA  = C_ITVEN.NRSEQVENDA;
               /*VERIFICA O TOTAL DAQUELE RECEBIMENTO PARA AQUELA VENDA*/
               SELECT SUM(TRUNC(DECODE(MV.IDTIPOMOVIVE, 'E',VRMOVIVEND, DECODE(MV.IDTIPOMOVIVE, 'S',-VRMOVIVEND,0)),2)) AS VRTOVENDA
                 INTO V_VRNOTA
                 FROM MOVCAIXA MV, NOTAFISCAL N
                WHERE MV.CDFILIAL = P_CDFILIAL
                  AND MV.CDCAIXA  = P_CDCAIXA
                  AND MV.CDFILIALNF = N.CDFILIAL
                  AND MV.NRLANCTONF = N.NRLANCTONF
                  AND MV.CDFILIALNF = P_CDFILIALNFFIN
                  AND MV.NRLANCTONF = P_LANCTONFFIN
                  AND MV.NRSEQVENDA = C_ITVEN.NRSEQVENDA;
               /*REALIZA A PROPORÇÃO PARA CALCULAR O VALOR DO PRODUTO DE ACORDO COM O RECEBIMENTO E A VENDA*/
               V_VRPROPORPRODUT := (((V_VRNOTA * 100)/V_VRVENDA));
               V_VRPRODUTO      := (C_ITVEN.VRPRODUTO*V_VRPROPORPRODUT)/100;
            END IF;
            FOR IMP IN(SELECT CDIMPOSTO
                         FROM IMPOSTO
                        WHERE IDORGARRECAD = 'F') LOOP
               V_GRUPOFISC := NULL;
               /*VERIFICA SE EXISTE GRUPO FISCAL DE IMPOSTO POR FILIAL*/
               BEGIN
                   SELECT GR.CDGRUPOFISC
                     INTO V_GRUPOFISC
                     FROM GRUPOFISCIMPFIL GR, FILIAL F
                    WHERE CDIMPOSTO  = IMP.CDIMPOSTO
                      AND F.CDFILIAL = P_CDFILIAL
                      AND F.CDFILIAL = GR.CDFILIAL;
                EXCEPTION
                   WHEN NO_DATA_FOUND THEN
                      V_GRUPOFISC := NULL;
                END;
                IF V_GRUPOFISC IS NULL THEN  /*VERIFICA SE EXISTE GRUPO FISCAL PARA IMPOSTO/IE SELECIONADA*/
                   BEGIN
                      SELECT GR.CDGRUPOFISC
                        INTO V_GRUPOFISC
                        FROM GRFISIMPIECLIE GR, FILIAL F
                       WHERE CDIMPOSTO    = IMP.CDIMPOSTO
                         AND F.CDINSCESTA = GR.CDINSCESTA
                         AND F.CDEMPRESA  = GR.CDEMPRESA
                         AND GR.CDCLIENTE = P_CDCLIENTE
                         AND F.CDFILIAL   = P_CDFILIAL;
                   EXCEPTION
                      WHEN NO_DATA_FOUND THEN
                         V_GRUPOFISC := NULL;
                   END;
                END IF;
                IF V_GRUPOFISC IS NULL THEN  /*VERIFICA SE HÁ GRUPO FISCAL  PARA A FILIAL*/
                   BEGIN
                      SELECT CDGRUPOFISC
                        INTO V_GRUPOFISC
                        FROM FILIAL
                       WHERE CDFILIAL = P_CDFILIAL;
                   EXCEPTION
                      WHEN NO_DATA_FOUND THEN
                         V_GRUPOFISC := NULL;
                   END;
                END IF;
                IF V_GRUPOFISC IS NULL THEN  /*VERIFICA SE HÁ GRUPO FISCAL PARA CLIENTE*/
                   BEGIN
                      SELECT CDGRUPOFISC
                        INTO V_GRUPOFISC
                        FROM CLIENTE
                       WHERE CDCLIENTE = P_CDCLIENTE;
                   EXCEPTION
                      WHEN NO_DATA_FOUND THEN
                         V_GRUPOFISC := NULL;
                   END;
                END IF;
                CONSULTA_INCIDENCIA('S', V_CDEMPRESA, C_ITVEN.CDARVPROD, V_CDINSCESTA, P_TIPOOPER, P_CDFILIAL, P_LANCTONFFIN, V_GRUPOFISC, '', '', 'VND');
                FOR CS IN(SELECT CDIMPOTEMP, CDFISCTEMP
                            FROM INCITEMP
                           WHERE NRINCITEMP = P_CDFILIAL||P_LANCTONFFIN
                             AND CDIMPOTEMP = IMP.CDIMPOSTO) LOOP
                   CONSULTA_CST_NFE('S', V_CDEMPRESA, C_ITVEN.CDARVPROD, V_CDINSCESTA, P_TIPOOPER, V_GRUPOFISC, CS.CDIMPOTEMP, 'N','N', P_CDFILIAL, P_LANCTONFFIN, '', V_CSTNFE, V_IDMODBCNFE, V_IDMODBCSTNFE, V_CDTPCRPICOSTNFE, V_CDNATUBCPCSTNFE, V_IDMOTIDESSTNFE);
                   /*VERIFICA CSOSN POR IMPOSTO*/
                   CONSULTA_CSOSN('S', V_CDEMPRESA, C_ITVEN.CDARVPROD, V_CDINSCESTA, P_TIPOOPER, P_CDFILIAL, P_LANCTONFFIN, V_GRUPOFISC, 'N', V_CDFISCOPERSN);
                   CONSULTA_ALIQUOTA(CS.CDIMPOTEMP, 'S', V_CDEMPRESA, C_ITVEN.CDARVPROD, V_CDINSCESTA, '', '', '', '', '', '', C_ITVEN.DTENTRVENDA, P_CDFILIAL, P_LANCTONFFIN, V_GRUPOFISC, P_TIPOOPER, 'VND');
                   V_VRALIQIMP := NULL;
                   SELECT MAX(VRALIQUTMP)
                     INTO V_VRALIQIMP
                     FROM ALIQTEMP
                    WHERE NRALIQTEMP = P_CDFILIAL||P_LANCTONFFIN;
                    /*Busca a natureza da receita do Item para o livro padrão*/
                   BEGIN
                      SELECT MAX(CDNATUREC)
                        INTO V_CDNATUREC
                        FROM RELACPRODITGEN R, LIVROMAGNETICO L, PRODUTO P
                       WHERE R.CDPRODUTO = P.CDPRODUTO
                         AND P.CDPRODUTO = C_ITVEN.CDPRODUTO
                         AND R.CDLIVROMAG = L.CDLIVROMAG
                         AND L.IDPADRAOLIVRO = 'S';
                   EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                        V_CDNATUREC := NULL;
                   END;
                 /*GERA O SEQUENCIAL CHAVE DA TABELA*/
                  NOVO_CODIGO_NT('SEQITEMVENOUTCX', V_SEQITVENCX);
                  INSERT INTO ITEMVENOUTIMPOSCX
                     (NRSEQITEMVENOUTIMPOSCX, CDIMPOSTO, CDPRODUTO, CDSITUTRIBNFE, VRALIQIT, VRPRODUTO, CDFISCALIT,
                      CDTPCRPICOSTNFE, CDNATUBCPCSTNFE, CDFISCOPERSN, CDFILIALNF, NRLANCTONF)
                  VALUES
                     (V_SEQITVENCX, CS.CDIMPOTEMP, C_ITVEN.CDPRODUTO, V_CSTNFE, NVL(V_VRALIQIMP,0), ROUND(V_VRPRODUTO,2), CS.CDFISCTEMP,
                      V_CDTPCRPICOSTNFE, V_CDNATUBCPCSTNFE, NVL(V_CDFISCOPERSN,C_ITVEN.CFOPITEM), P_CDFILIALNFFIN, P_LANCTONFFIN);
                   DELETE FROM ALIQTEMP
                    WHERE NRALIQTEMP = P_CDFILIAL||P_LANCTONFFIN;
                END LOOP;
                DELETE FROM INCITEMP
                 WHERE NRINCITEMP = P_CDFILIAL||P_LANCTONFFIN;
            END LOOP;
         END LOOP;
      END LOOP;
   END IF;
END;
/
ALTER PROCEDURE GERA_FINANCEIRO_ECF COMPILE