CREATE OR REPLACE PROCEDURE CTB_DFE_PRODUTO(
   P_NRLANCTBTEMP IN LANCCONT.NRLANCCONT%TYPE,
   P_CDFILIAL IN FILIAL.CDFILIAL%TYPE,
   P_NRLANCTONF IN NOTAFISCAL.NRLANCTONF%TYPE,
   P_FATOR IN INT,
   P_VRLANCTO IN OUT LANCCONT.VRLANCAMENT%TYPE,
   P_VRINDUSTRIA IN LANCCONT.VRLANCAMENT%TYPE)
AS
   V_COUNT INT;
   V_NRSEQLANC LANCCONT.NRSEQLANC%TYPE;
   V_CDHISTPADR HISTPADR.CDHISTPADR%TYPE;
   V_DSHISTLANC LANCCONT.DSHISTLANC%TYPE;
   V_NUMPARTIDA INT;
   V_IDCOME VARCHAR2(01);
   V_IDCCUS VARCHAR2(01);
   V_CDCOMERCIAL FORNECEDOR.CDFORNECED%TYPE;
   V_CDCENTCUST CENTCUST.CDCENTCUST%TYPE;
   V_CDCCUSTRATEIO CENTCUST.CDCENTCUST%TYPE;
   V_CDFILIAL FILIAL.CDFILIAL%TYPE;
   V_CDFILIRATEIO FILIAL.CDFILIAL%TYPE;
   V_CONTCCUS VARCHAR2(01);
   V_CCUSTPROD CENTCUST.CDCENTCUST%TYPE;
   V_INPARTIDAS INT;
   V_CDCONTPROD CONTCTBL.CDCONTCTBL%TYPE;
   V_BORATEIONF BOOLEAN;
   V_CDARVPROD PRODUTO.CDARVPROD%TYPE;
   V_VRCONTITEM LANCCONT.VRLANCAMENT%TYPE;
   V_VRPARTIDAS LANCCONT.VRLANCAMENT%TYPE;
   V_VRPARTRATEIO LANCCONT.VRLANCAMENT%TYPE;
   V_INRATEIO INT;
   V_PARTRATEIO LANCCONT.VRLANCAMENT%TYPE;
   V_VRRATEIO LANCCONT.VRLANCAMENT%TYPE;
   V_VRDIFERENCA LANCCONT.VRLANCAMENT%TYPE;
   V_ITEMPRODUTOREC INT;
   V_CDRATFIL FILIAL.CDFILIAL%TYPE;
   V_CONTACLIFORN CONTCTBL.CDCONTCTBL%TYPE;

   V_VRDESCONTO LANCCONT.VRLANCAMENT%TYPE;
   V_ISEMPTY VARCHAR2(01);

   V_CDHISTINDUSTRIA HISTPADR.CDHISTPADR%TYPE;
   V_DSHISTINDUSTRIA LANCCONT.DSHISTLANC%TYPE;
BEGIN
   V_NUMPARTIDA := NULL;

   /* BUSCA O HISTORICO PARA O LANCAMENTO */
   CTB_DFE_HISTORICO(P_CDFILIAL, P_NRLANCTONF, V_CDHISTPADR, V_DSHISTLANC);

   FOR C_NOTAFISCAL IN
      (SELECT NF.CDFILIAL,      NF.NRLANCTONF,    NF.CDEMPRESA,
              NF.IDDOCFINANC,   NF.NRNOTAFISC,    NF.CDCLIENTE,
              NF.CDFORNECED,    NF.NRLANCTBDOC,   NF.VRNOTAFISC,
              NF.CDFILIEMIT,    NF.CDTIPOOPER,    TP.IDCONTABOPER,
              TP.IDOPERDEVONF,  NF.IDORIGDESTNF,  NF.VRPRODUTOS,
              NF.CDFILIRECE,    NF.DTENTRSAID,    NF.CDINSCESTA,
              NF.DTEMISSAO,     C.IDPRIPUBCLIE,   NF.IDENTRSAIDOP,
              NVL(FI.CDCENTCUST, EP.CDCENTCUST) AS CDCENTCUST,
              TP.CDTPCTPAGAR AS CDTPCTPAGOP, TP.CDTPCTRECEB AS CDTPCTRECOP,
              TC.CDCLASSFINA AS CDCLAFINOP, FO.DTINIVRPDESC, NF.CDSERIEENTR,
              NF.CDSERIE, NF.IDTPIJURNF, NF.NRINSJURNF, TP.IDDTCONTAB,
              TP.IDCOAVRIMPVRPROD, TP.IDNFRETIND,
              DECODE(NF.IDENTRSAIDOP,'E', NF.CDFILIRECE, NF.CDFILIEMIT) AS FILIRAT
         FROM NOTAFISCAL NF, FILIAL FI, EMPRESA EP,
              TIPOOPERAC TP, TIPOCTPAGAR TC, FORNECEDOR FO, CLIENTE C
        WHERE NF.CDFILIAL     = P_CDFILIAL        AND
              NF.NRLANCTONF   = P_NRLANCTONF      AND
              NF.CDEMPRESA    = EP.CDEMPRESA      AND
              NF.IDENTRSAIDOP = TP.IDENTRSAIDOP   AND
              NF.CDTIPOOPER   = TP.CDTIPOOPER     AND
              TP.CDTPCTPAGAR  = TC.CDTPCTPAGAR(+) AND
              DECODE(NF.IDENTRSAIDOP,'E', NF.CDFILIRECE, NF.CDFILIEMIT) = FI.CDFILIAL AND
              NF.CDFORNECED   = FO.CDFORNECED(+)  AND
              NF.CDCLIENTE    = C.CDCLIENTE(+))LOOP

      /* PEGA O SEQUENCIAL DA ULTIMA PARTIDA DO LANCAMNENTO, O IF FOI UTILIZADO PARA NAO REALIZAR
         O SELECT NA TABELA DE LANCAMENTO CONTABIL VARIAS VEZES. USADO SOMENTE PARA PEGAR O ULTIMO NUMERO
         DA PARTIDA DO LANCAMENTO CONTABIL, IDENTIFICADOR SE CONTROLA OS RATEIOS */
      IF V_NUMPARTIDA IS NULL THEN
         /* NUMERO DA PARTIDA */
         BEGIN
            SELECT NVL(TO_NUMBER(MAX(NRSEQCTBTEMP)), 0)
              INTO V_NUMPARTIDA
              FROM LANCCTBTEMP
             WHERE NRLANCCTBTEMP = P_NRLANCTBTEMP
               AND CDEMPRESA = C_NOTAFISCAL.CDEMPRESA;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_NUMPARTIDA := 0;
         END;

         /* CONTROLA SE GERA OS RATEIOS */
         SELECT IDCONTGERE
           INTO V_CONTCCUS
           FROM CONTOPECTBL
          WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA;

         /* BUSCA O CODIGO COMERCIAL */
         BEGIN
            SELECT DECODE(C_NOTAFISCAL.IDORIGDESTNF, 'F', C_NOTAFISCAL.CDFORNECED, DECODE(C_NOTAFISCAL.IDORIGDESTNF, 'C', C_NOTAFISCAL.CDCLIENTE, NULL))
              INTO V_CDCOMERCIAL
              FROM DUAL;
          EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDCOMERCIAL := NULL;
          END;
      END IF;

      V_INPARTIDAS := 1;
      V_CDCONTPROD := NULL;
      V_VRCONTITEM := 0;
      V_VRPARTIDAS := 0;
      V_ISEMPTY := 'S';

      /* CONTABILIZACAO DOS PRODUTOS DE RETORNO DE INDUSTRIALIZACAO */

      IF ((C_NOTAFISCAL.IDNFRETIND = 'S') and (C_NOTAFISCAL.IDOPERDEVONF = 'S')) THEN
         /* BUSCA A CONTA DO CLIENTE QUE FOI FEITO O LANCAMENTO CONTABIL DA NOTA DE SAIDA */
         FOR NOTAORIGEM IN
            (SELECT NF.CDEMPRESA, NF.CDFILIAL, NF.NRLANCTONF,
                    NF.CDCLIENTE, NF.CDTIPOOPER, NF.IDENTRSAIDOP, NF.CDFILIEMIT
               FROM NOTAFISCAL NF, ITEMNOTAFISC IT
              WHERE NF.CDFILIAL = IT.CDFILIALIT
                AND NF.NRLANCTONF = IT.NRLANCTONFIT
                AND IT.CDFILIAL = P_CDFILIAL
                AND IT.NRLANCTONF = P_NRLANCTONF) LOOP
            V_CONTACLIFORN := NULL;
            BEGIN
               SELECT CDCONTFORCLI AS CONTA
                 INTO V_CONTACLIFORN
                 FROM TIPOOPERAC T
                WHERE CDTIPOOPER   = NOTAORIGEM.CDTIPOOPER
                  AND IDENTRSAIDOP = 'S';
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_CONTACLIFORN := NULL;
            END;

            IF V_CONTACLIFORN IS NULL THEN
               BEGIN
                  SELECT CTB_CCCLIENTE(NOTAORIGEM.CDCLIENTE, NOTAORIGEM.CDFILIEMIT, C_NOTAFISCAL.CDEMPRESA) CONTA
                    INTO V_CONTACLIFORN
                    FROM DUAL;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_CONTACLIFORN := NULL;
               END;
            END IF;
         END LOOP;

         /* APOS BUSCAR A CONTA CONTABIL DO CLIENTE QUE FOI USADA NSA SAIDA, A ROTINA INSERE AS PARTIDAS DOS
            PRODUTOS QUE ESTAO TENDO O RETORNO DA INDUSTRIALIZACAO */
         FOR ITEMINDUSTRIA IN
            (SELECT I.NRSEQITPROD, I.CDPRODUTO,
                    ROUND(I.VRCONTITEM,2) AS VRCONTITEM
               FROM ITEMPRODUTO I, PRODUTO P
              WHERE (I.CDFILIAL     = P_CDFILIAL)
                AND (I.NRLANCTONF   = P_NRLANCTONF)
                AND (I.VRCONTITEM   > 0)
                AND (I.CDPRODUTO = P.CDPRODUTO)
                AND (I.IDITEMORIGEM = 'S')
              ORDER BY I.NRSEQITPROD) LOOP
            V_CDHISTINDUSTRIA := NULL;
            BEGIN
               SELECT CDHISTPADR
                 INTO V_CDHISTINDUSTRIA 
                 FROM PRODUTO
                WHERE CDPRODUTO = (SELECT MAX(CDPRODUTO)
                                     FROM PRODUTO
                                    WHERE CDHISTPADR IS NOT NULL
                                      AND ITEMINDUSTRIA.CDPRODUTO LIKE  CDPRODUTO || '%');
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_CDHISTINDUSTRIA := NULL;
            END;
            V_DSHISTINDUSTRIA := V_DSHISTLANC;
            IF V_CDHISTINDUSTRIA IS NOT NULL THEN
               CTB_DFE_HISTORICO(P_CDFILIAL, P_NRLANCTONF, V_CDHISTINDUSTRIA, V_DSHISTINDUSTRIA);
            END IF;

            /* COUNT PARA VERIFICAR SE JA EXISTE UMA PARTIDA PARA AQUELA CONTA CONTABIL */
            BEGIN
               SELECT COUNT(*)
                 INTO V_COUNT
                 FROM LANCCTBTEMP
                WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                  AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                  AND CDCONTCTBL = V_CONTACLIFORN;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_COUNT := 0;
            END;

            /* SE NAO HAVER PARTIDA PARA A CONTA CONTABIL DO CLIENTE, E INSERIDA */
            BUSCA_TPCOMERCIAL(V_CONTACLIFORN, V_IDCOME, V_IDCCUS);
            IF V_COUNT = 0 THEN
               V_NUMPARTIDA := V_NUMPARTIDA + 1;
               IF NVL(V_IDCOME, 'N') = 'N' THEN
                  V_CDCOMERCIAL := NULL;
               END IF;
               INSERT INTO LANCCTBTEMP
                  (CDEMPRESA, NRLANCCTBTEMP, CDDOCUTEMP, NRSEQCTBTEMP,
                   CDCONTCTBL, CDHISTPADR,    DSHISTCTB, DTLANCCTBTEMP,
                   VRLANCCTBTEMP, IDLANCCTBCOME, CDLANCCTBCOME, IDSISTEMA)
               VALUES
                  (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, C_NOTAFISCAL.NRNOTAFISC, LPAD(TO_CHAR(V_NUMPARTIDA),5,'0'),
                   V_CONTACLIFORN, V_CDHISTINDUSTRIA, V_DSHISTINDUSTRIA, C_NOTAFISCAL.DTENTRSAID, V_VRCONTITEM, V_IDCOME, V_CDCOMERCIAL, 'DFE');

               IF V_CONTCCUS <> 'N' THEN
                  IF V_IDCCUS <> 'O' THEN
                     INSERT INTO RATECTBTEMP
                        (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL,
                         CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                     VALUES
                        (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, LPAD(TO_CHAR(V_NUMPARTIDA),5,'0'), C_NOTAFISCAL.CDFILIRECE,
                         V_CCUSTPROD, ITEMINDUSTRIA.VRCONTITEM, C_NOTAFISCAL.DTENTRSAID, '00001');
                  END IF;
               END IF;
            ELSE
               /* CASO EXISTA UMA PARTIDA PARA A CONTA CONTABIL DO PRODUTO, O VALOR DA PARTIDA E ATUALIZADO
                  ASSIM COMO SEU RATEIO. */
               UPDATE LANCCTBTEMP
                  SET VRLANCCTBTEMP = VRLANCCTBTEMP + ITEMINDUSTRIA.VRCONTITEM
                WHERE NRLANCCTBTEMP = P_NRLANCTBTEMP
                  AND CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                  AND CDCONTCTBL = V_CONTACLIFORN;

               /* CASO A EMPRESA CONTROLAR A CONTABILIDADE GERENCIAL, E VERIFICADO SE EXISTE RATEIO NO LANCAMENTO
                  PARA A FILIAL E CENTRO DE CUSTO DA PARTIDA DA MESMA CONTA CONTABIL */
               IF V_CONTCCUS <> 'N' THEN
                  IF V_IDCCUS <> 'O' THEN
                     BEGIN
                        SELECT COUNT(*), L.NRSEQCTBTEMP
                          INTO V_COUNT, V_NRSEQLANC
                          FROM LANCCTBTEMP L, RATECTBTEMP R
                         WHERE L.CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                           AND L.NRLANCCTBTEMP = P_NRLANCTBTEMP
                           AND L.CDCONTCTBL = V_CONTACLIFORN
                           AND R.CDFILIAL = C_NOTAFISCAL.CDFILIRECE
                           AND R.CDCENTCUST = V_CCUSTPROD
                           AND L.NRLANCCTBTEMP = R.NRLANCCTBTEMP
                           AND L.CDEMPRESA = R.CDEMPRESA
                         GROUP BY L.NRSEQCTBTEMP;
                     EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                           V_COUNT := 0;
                           V_NRSEQLANC := NULL;
                     END;

                     /* SE NAO EXISTIR UM RATEIO PARA AQUELA CONTA CONTABIL PARA AQUELA FILIAL E PARA AQUELE CENTRO
                        DE CUSTO, E INSERIDO UM NOVO RATEIO. */
                     IF V_COUNT = 0 THEN
                        INSERT INTO RATECTBTEMP
                           (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL,
                            CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                        VALUES
                           (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, V_NRSEQLANC, C_NOTAFISCAL.CDFILIRECE,
                            V_CCUSTPROD, ITEMINDUSTRIA.VRCONTITEM, C_NOTAFISCAL.DTENTRSAID, '00001');

                     /* CASO EXISTA, O VALOR DO RATEIO E ATUALIZADO */
                     ELSE
                        UPDATE RATECTBTEMP
                           SET VRRATECTBTEMP = VRRATECTBTEMP + ITEMINDUSTRIA.VRCONTITEM
                         WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                           AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                           AND NRSEQCTBTEMP = V_NRSEQLANC
                           AND CDFILIAL = C_NOTAFISCAL.CDFILIRECE
                           AND CDCENTCUST = V_CCUSTPROD;
                     END IF;
                  END IF;
               END IF;
            END IF;
         END LOOP;
      END IF;
      /* FIM DA CONTABILIZACAO DOS PRODUTOS DE RETORNO DE INDUSTRIALIZACAO */

      /* ROTINA DE CONTABILIZACAO DOS PRODUTOS DA NOTA FISCAL */
      FOR C_ITEMPRODUTO IN
         (SELECT IT.NRSEQITPROD, IT.CDPRODUTO,
                 ROUND(IT.VRCONTITEM,2) AS VRCONTITEM,
                 CONTCTBL_PRODUTO(P.CDPRODUTO, 'E', C_NOTAFISCAL.CDFILIRECE) AS CDCTBLENTRPR,
                 CONTCTBL_PRODUTO(P.CDPRODUTO, 'S', C_NOTAFISCAL.CDFILIRECE) AS CDCTBLSAIDPR,
                 ROUND(IT.VRDESCITEM,2) AS VRDESCITEM, COUNT(*) OVER(PARTITION BY CDFILIAL, NRLANCTONF) RECORDCOUNT
            FROM ITEMPRODUTO IT, PRODUTO P
           WHERE (IT.CDFILIAL     = P_CDFILIAL)
             AND (IT.NRLANCTONF   = P_NRLANCTONF)
             AND (IT.VRCONTITEM   > 0)
             AND (IT.CDPRODUTO = P.CDPRODUTO)
           GROUP BY IT.NRSEQITPROD, IT.CDPRODUTO, ROUND(IT.VRCONTITEM,2),
                    CONTCTBL_PRODUTO(P.CDPRODUTO, 'E', C_NOTAFISCAL.CDFILIRECE),
                    CONTCTBL_PRODUTO(P.CDPRODUTO, 'S', C_NOTAFISCAL.CDFILIRECE),
                    ROUND(IT.VRDESCITEM,2), CDFILIAL, NRLANCTONF
           ORDER BY IT.NRSEQITPROD)LOOP
         V_ISEMPTY := 'N';
         V_ITEMPRODUTOREC := C_ITEMPRODUTO.RECORDCOUNT;
         /* BUSCA O CDARVPROD DO PRODUTO E O CENTRO DE CUSTO DO PRODUTO*/
         BEGIN
            SELECT P.CDARVPROD, NVL(NVL(NVL(PR.CDCCUSTENTRF,P.CDCCUSTENTR),F.CDCENTCUST),E.CDCENTCUST) CDCENTCUST
              INTO V_CDARVPROD, V_CCUSTPROD
              FROM FILIAL F, NOTAFISCAL N, EMPRESA E,
                   PRODUTO P, PRODFILI PR
             WHERE (P.CDPRODUTO     = C_ITEMPRODUTO.CDPRODUTO)  AND
                   (PR.CDPRODUTO(+) =  P.CDPRODUTO)  AND
                   (PR.CDFILIAL(+)  = C_NOTAFISCAL.CDFILIRECE) AND
                   (F.CDFILIAL      = C_NOTAFISCAL.CDFILIRECE) AND
                   (N.CDFILIAL      = P_CDFILIAL  ) AND
                   (N.NRLANCTONF    = P_NRLANCTONF) AND
                   (N.CDEMPRESA     = C_NOTAFISCAL.CDEMPRESA)   AND
                   (N.CDEMPRESA     = E.CDEMPRESA);
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDARVPROD := NULL;
               V_CCUSTPROD := NULL;
         END;

         /* PEGA A CONTA DE DE PRODUTO POR TIPO DE OPERACAO */
         BEGIN
            /* BUSCA A CONTA CONTABIL DO PRODUTO POR TIPO DE OPERACAO */
            SELECT C.CDCTBLPRODTO
              INTO V_CDCONTPROD
              FROM CTBPRDTPOPER C,
                 (SELECT MAX(P.CDARVPROD) CDARVPROD
                  FROM CTBPRDTPOPER A, PRODUTO P
                  WHERE IDENTRSAIDOP = C_NOTAFISCAL.IDENTRSAIDOP AND
                        CDTIPOOPER   = C_NOTAFISCAL.CDTIPOOPER   AND
                        P.CDPRODUTO  =  A.CDPRODUTO    AND
                        (INSTR(V_CDARVPROD, RTRIM(P.CDARVPROD)) = 1) AND
                        A.CDCTBLPRODTO IS NOT NULL) PR,
                  PRODUTO P
              WHERE IDENTRSAIDOP = C_NOTAFISCAL.IDENTRSAIDOP AND
                    CDTIPOOPER   = C_NOTAFISCAL.CDTIPOOPER   AND
                    C.CDPRODUTO  = P.CDPRODUTO     AND
                     P.CDARVPROD = PR.CDARVPROD;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDCONTPROD := NULL;
         END;

         /* PEGA A CONTA DO PRODUTO NO TIPO DE OPERACAO */
         IF V_CDCONTPROD IS NULL THEN
            BEGIN
               SELECT CDCONTPROD
                 INTO V_CDCONTPROD
                 FROM TIPOOPERAC T
                WHERE CDTIPOOPER   = C_NOTAFISCAL.CDTIPOOPER
                  AND IDENTRSAIDOP = C_NOTAFISCAL.IDENTRSAIDOP;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_CDCONTPROD := NULL;
            END;
         END IF;

         V_BORATEIONF := FALSE;
         BEGIN
            SELECT COUNT(*)
              INTO V_COUNT
              FROM RATEIONF RN
             WHERE RN.CDFILIAL    = P_CDFILIAL   AND
                   RN.NRLANCTONF  = P_NRLANCTONF AND
                   RN.NRSEQITPROD = C_ITEMPRODUTO.NRSEQITPROD
             ORDER BY NRSEQITPROD, CDFILICCUST;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_COUNT := 0;
         END;
         IF V_COUNT <> 0 THEN
            V_BORATEIONF := TRUE;
         END IF;

         /* SE NAO EXISTIR RATEIO PARA O PRODUTO CORRENTE */
         IF V_BORATEIONF = FALSE THEN
            /* CASO A CONTA DO PRODUTO ESTEJA NULA, OU SEJA, NAO POSSUI PARAMETRIZACAO
               NO TIPO DE OPERACAO OU NA ABA PRODUTO POR TIPO DE OPERACAO, E BUSCADO A
               CONTA CONTABIL NA ABA PRODUTO POR FILIAL */
            IF V_CDCONTPROD IS NULL THEN
               BEGIN
                  SELECT MAX(CDCTBLENTRPF) AS CDCTBLENTRPF
                    INTO V_CDCONTPROD
                    FROM PRODFILI PF, PRODUTO P
                   WHERE CDFILIAL      = C_NOTAFISCAL.CDFILIRECE
                     AND PF.CDPRODUTO  = V_CDARVPROD
                     AND (P.CDPRODUTO IN (SELECT MAX(CDPRODUTO)
                                             FROM PRODUTO C
                                            WHERE (INSTR(PF.CDPRODUTO,RTRIM(C.CDPRODUTO)) = 1)
                                              AND NOT CDCTBLENTRPF IS NULL)
                       OR PF.CDPRODUTO = P.CDPRODUTO);
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_CDCONTPROD := NULL;
               END;
            END IF;

            IF V_CDCONTPROD IS NULL THEN
               V_CDCONTPROD := C_ITEMPRODUTO.CDCTBLENTRPR;
            END IF;

            /* REALIZA AS PARTIDAS PARA CADA PRODUTO DA NOTA FISCAL */
            IF C_ITEMPRODUTO.VRCONTITEM > 0 THEN
               IF V_CDCONTPROD IS NULL THEN
                  INSERT INTO ERROCTBTEMP
                     (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDERROTEMP)
                  VALUES
                     (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, '', '014|' || V_CDARVPROD);
               END IF;

               V_VRCONTITEM := - ROUND((C_ITEMPRODUTO.VRCONTITEM * P_FATOR), 2);
               V_VRPARTIDAS := V_VRPARTIDAS + (C_ITEMPRODUTO.VRCONTITEM * P_FATOR);
               IF V_INPARTIDAS = C_ITEMPRODUTO.RECORDCOUNT THEN
                  IF ROUND(ABS(V_VRPARTIDAS), 2) <> ROUND(ABS(P_VRLANCTO + NVL(P_VRINDUSTRIA, 0)), 2) THEN
                     V_VRCONTITEM := V_VRCONTITEM - ((P_VRLANCTO + NVL(P_VRINDUSTRIA, 0)) - V_VRPARTIDAS);
                     V_VRPARTIDAS := V_VRPARTIDAS + ((P_VRLANCTO + NVL(P_VRINDUSTRIA, 0)) - V_VRPARTIDAS);
                  END IF;
               END IF;

               BUSCA_TPCOMERCIAL(V_CDCONTPROD, V_IDCOME, V_IDCCUS);

               /* COUNT PARA VERIFICAR SE JA EXISTE UMA PARTIDA PARA AQUELA CONTA CONTABIL */
               BEGIN
                  SELECT COUNT(*)
                    INTO V_COUNT
                    FROM LANCCTBTEMP
                   WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                     AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                     AND CDCONTCTBL = V_CDCONTPROD;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_COUNT := 0;
               END;

               /* SE NAO HAVER PARTIDA PARA A CONTA CONTABIL DO PRODUTO, E INSERIDA */
               IF V_COUNT = 0 THEN
                  V_NUMPARTIDA := V_NUMPARTIDA + 1;
                  IF NVL(V_IDCOME, 'N') = 'N' THEN
                     V_CDCOMERCIAL := NULL;
                  END IF;
                  INSERT INTO LANCCTBTEMP
                     (CDEMPRESA, NRLANCCTBTEMP, CDDOCUTEMP, NRSEQCTBTEMP,
                      CDCONTCTBL, CDHISTPADR,    DSHISTCTB, DTLANCCTBTEMP,
                      VRLANCCTBTEMP, IDLANCCTBCOME, CDLANCCTBCOME, IDSISTEMA)
                  VALUES
                     (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, C_NOTAFISCAL.NRNOTAFISC, LPAD(TO_CHAR(V_NUMPARTIDA),5,'0'),
                      V_CDCONTPROD, V_CDHISTPADR, V_DSHISTLANC, C_NOTAFISCAL.DTENTRSAID, V_VRCONTITEM, V_IDCOME, V_CDCOMERCIAL, 'DFE');

                  IF V_CONTCCUS <> 'N' THEN
                     IF V_IDCCUS <> 'O' THEN
                        INSERT INTO RATECTBTEMP
                           (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL,
                            CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                        VALUES
                           (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, LPAD(TO_CHAR(V_NUMPARTIDA),5,'0'), C_NOTAFISCAL.CDFILIRECE,
                            V_CCUSTPROD, V_VRCONTITEM, C_NOTAFISCAL.DTENTRSAID, '00001');
                     END IF;
                  END IF;
               ELSE
                  /* CASO EXISTA UMA PARTIDA PARA A CONTA CONTABIL DO PRODUTO, O VALOR DA PARTIDA E ATUALIZADO
                     ASSIM COMO SEU RATEIO. */
                  UPDATE LANCCTBTEMP
                     SET VRLANCCTBTEMP = VRLANCCTBTEMP + V_VRCONTITEM
                   WHERE NRLANCCTBTEMP = P_NRLANCTBTEMP
                     AND CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                     AND CDCONTCTBL = V_CDCONTPROD;


                  /* CASO A EMPRESA CONTROLAR A CONTABILIDADE GERENCIAL, E VERIFICADO SE EXISTE RATEIO NO LANCAMENTO
                     PARA A FILIAL E CENTRO DE CUSTO DA PARTIDA DA MESMA CONTA CONTABIL */
                  IF V_CONTCCUS <> 'N' THEN
                     IF V_IDCCUS <> 'O' THEN
                        BEGIN
                           SELECT COUNT(*), L.NRSEQCTBTEMP
                             INTO V_COUNT, V_NRSEQLANC
                             FROM LANCCTBTEMP L, RATECTBTEMP R
                            WHERE L.CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                              AND L.NRLANCCTBTEMP = P_NRLANCTBTEMP
                              AND L.CDCONTCTBL = V_CDCONTPROD
                              AND R.CDFILIAL = C_NOTAFISCAL.CDFILIRECE
                              AND R.CDCENTCUST = V_CCUSTPROD
                              AND L.NRLANCCTBTEMP = R.NRLANCCTBTEMP
                              AND L.CDEMPRESA = R.CDEMPRESA
                            GROUP BY L.NRSEQCTBTEMP;
                        EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                              V_COUNT := 0;
                              V_NRSEQLANC := NULL;
                        END;

                        /* SE NAO EXISTIR UM RATEIO PARA AQUELA CONTA CONTABIL PARA AQUELA FILIAL E PARA AQUELE CENTRO
                           DE CUSTO, E INSERIDO UM NOVO RATEIO. */
                        IF V_COUNT = 0 THEN
                           INSERT INTO RATECTBTEMP
                              (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL,
                               CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                           VALUES
                              (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, V_NRSEQLANC, C_NOTAFISCAL.CDFILIRECE,
                               V_CCUSTPROD, V_VRCONTITEM, C_NOTAFISCAL.DTENTRSAID, '00001');

                        /* CASO EXISTA, O VALOR DO RATEIO E ATUALIZADO */
                        ELSE
                           UPDATE RATECTBTEMP
                              SET VRRATECTBTEMP = VRRATECTBTEMP + V_VRCONTITEM
                            WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                              AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                              AND NRSEQCTBTEMP = V_NRSEQLANC
                              AND CDFILIAL = C_NOTAFISCAL.CDFILIRECE
                              AND CDCENTCUST = V_CCUSTPROD;
                        END IF;
                     END IF;
                  END IF;
               END IF;

               /* CONTABILIZA OS DESCONTOS DE CADA PRODUTO DA NOTA */
               IF C_ITEMPRODUTO.VRDESCITEM > 0 THEN
                  /* VERIFICA SE EXISTE CONTA CONTABIL PARA DESCONTO PARAMETRIZADA */
                  FOR C_DESC IN
                     (SELECT CDCONTDITEN AS CDCTBLENTREN
                        FROM PARAMCTBL
                       WHERE CDCONTDITEN IS NOT NULL) LOOP

                     /* VERIFICA SE JA EXISTE PARTIDA PARA A CONTA CONTABIL DE DESCONTO, NO CASO, A CONTA DE PRODUTO */
                     BEGIN
                        SELECT COUNT(*), NRSEQCTBTEMP
                          INTO V_COUNT, V_NRSEQLANC
                          FROM LANCCTBTEMP
                         WHERE NRLANCCTBTEMP = P_NRLANCTBTEMP
                           AND CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                           AND CDCONTCTBL = V_CDCONTPROD
                         GROUP BY NRSEQCTBTEMP;
                     EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                           V_COUNT := 0;
                     END;

                     IF V_COUNT = 0 THEN
                        /* SE NAO EXISTIR PARTIDA, E FEITA UMA PARA ESTA CONTA CONTABIL PARAMETRIZADA */
                        V_NUMPARTIDA := V_NUMPARTIDA + 1;
                        IF NVL(V_IDCOME, 'N') = 'N' THEN
                           V_CDCOMERCIAL := NULL;
                        END IF;
                        INSERT INTO LANCCTBTEMP
                           (CDEMPRESA, NRLANCCTBTEMP, CDDOCUTEMP, NRSEQCTBTEMP,
                            CDCONTCTBL, CDHISTPADR,    DSHISTCTB, DTLANCCTBTEMP,
                            VRLANCCTBTEMP, IDLANCCTBCOME, CDLANCCTBCOME, IDSISTEMA)
                        VALUES
                           (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, C_NOTAFISCAL.NRNOTAFISC, LPAD(TO_CHAR(V_NUMPARTIDA),5,'0'),
                            V_CDCONTPROD, V_CDHISTPADR, V_DSHISTLANC, C_NOTAFISCAL.DTENTRSAID, - C_ITEMPRODUTO.VRDESCITEM, V_IDCOME, V_CDCOMERCIAL, 'DFE');
                        IF V_CONTCCUS <> 'N' THEN
                           IF V_IDCCUS <> 'O' THEN
                              V_CDCENTCUST := BUSCA_CCUSTO(C_NOTAFISCAL.FILIRAT, C_NOTAFISCAL.CDEMPRESA);
                              INSERT INTO RATECTBTEMP
                                 (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL,
                                  CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                              VALUES
                                 (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, LPAD(TO_CHAR(V_NUMPARTIDA),5,'0'), C_NOTAFISCAL.CDFILIRECE,
                                  V_CDCENTCUST, - C_ITEMPRODUTO.VRDESCITEM, C_NOTAFISCAL.DTENTRSAID, '00001');
                           END IF;
                        END IF;
                     ELSE
                        /* SE EXISTIR, OS VALORES DA PARTIDA E DO RATEIO SAO ATUALIZADOS. */
                        UPDATE LANCCTBTEMP
                           SET VRLANCCTBTEMP = VRLANCCTBTEMP + (- C_ITEMPRODUTO.VRDESCITEM)
                         WHERE NRLANCCTBTEMP = P_NRLANCTBTEMP
                           AND CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                           AND NRSEQCTBTEMP = V_NRSEQLANC;

                        IF V_CONTCCUS <> 'N' THEN
                           IF V_IDCCUS <> 'O' THEN
                              V_CDCENTCUST := BUSCA_CCUSTO(C_NOTAFISCAL.FILIRAT, C_NOTAFISCAL.CDEMPRESA);
                              BEGIN
                                 SELECT COUNT(*)
                                   INTO V_COUNT
                                   FROM RATECTBTEMP
                                  WHERE NRLANCCTBTEMP = P_NRLANCTBTEMP
                                    AND CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                                    AND NRSEQCTBTEMP = V_NRSEQLANC
                                    AND CDFILIAL = C_NOTAFISCAL.CDFILIRECE
                                    AND CDCENTCUST = V_CDCENTCUST;
                              EXCEPTION
                                 WHEN NO_DATA_FOUND THEN
                                    V_COUNT := 0;
                              END;

                              /* SE AINDA NAO EXISTIR RATEIO PARA ESTA CONTA CONTABIL, E FEITO UM NOVO RATEIO */
                              IF V_COUNT = 0 THEN
                                 INSERT INTO RATECTBTEMP
                                    (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL, CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                                 VALUES
                                    (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, V_NRSEQLANC, C_NOTAFISCAL.CDFILIRECE,
                                    V_CDCENTCUST, - C_ITEMPRODUTO.VRDESCITEM, C_NOTAFISCAL.DTENTRSAID, '00001');
                              ELSE
                              /*CASO EXISTA, O VALOR DO RATEIO E ATUALIZADO. */
                                 UPDATE RATECTBTEMP
                                    SET VRRATECTBTEMP = VRRATECTBTEMP + (- C_ITEMPRODUTO.VRDESCITEM)
                                  WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                                    AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                                    AND NRSEQCTBTEMP = V_NRSEQLANC
                                    AND CDFILIAL = C_NOTAFISCAL.CDFILIRECE
                                    AND CDCENTCUST = V_CDCENTCUST;
                              END IF;
                           END IF;
                        END IF;
                     END IF;
                  END LOOP;
               END IF;
            END IF;
            V_CDCCUSTRATEIO := BUSCA_CCUSTO(C_NOTAFISCAL.CDFILIRECE, C_NOTAFISCAL.CDEMPRESA);
            V_CDFILIRATEIO := C_NOTAFISCAL.CDFILIRECE;
            /* FIM DA ROTINA QUANDO NAO EXISTE RATEIO DO PRODUTO NA RATEIONF */
         ELSE
            /* INICIIO DA ROTINA PARA PEGAR AS CONTAS CONTABEIS POR FILIAIS DA TABELA RATEIONF

            O sistema ira verificar se existe alguma conta contabil de produto por tipo de operacao
            parametrizada, caso nao exista, o sistema ira buscar a conta contabil parametrizada para o
            produto por filial(is), esta(s) filial(is) sao as informadas na tela de rateio de NF */
            IF V_CDCONTPROD IS NOT NULL THEN
               BUSCA_TPCOMERCIAL(V_CDCONTPROD, V_IDCOME, V_IDCCUS);

               V_VRCONTITEM := - (C_ITEMPRODUTO.VRCONTITEM * P_FATOR);

               /* SOMA OS VALORES DAS PARTIDAS PARA REALIZAR O ARREDONDANEMNTO CASO NECESSARIO */
               V_VRPARTIDAS := V_VRPARTIDAS + (C_ITEMPRODUTO.VRCONTITEM * P_FATOR);
               IF V_INPARTIDAS = C_ITEMPRODUTO.RECORDCOUNT THEN
                  IF ((ROUND(ABS(V_VRPARTIDAS), 2) <> ROUND(ABS(P_VRLANCTO + NVL(P_VRINDUSTRIA, 0)), 2)) AND
                      (ABS(ROUND(ABS(V_VRPARTIDAS), 2) - ROUND(ABS(P_VRLANCTO + NVL(P_VRINDUSTRIA, 0)), 2)) < 0.1))THEN
                     V_VRCONTITEM := V_VRCONTITEM - ((P_VRLANCTO + NVL(P_VRINDUSTRIA, 0)) - V_VRPARTIDAS);
                     V_VRPARTIDAS := V_VRPARTIDAS + ((P_VRLANCTO + NVL(P_VRINDUSTRIA, 0)) - V_VRPARTIDAS);
                  END IF;
               END IF;

               /* VERIFICA SE EXISTE PARTIDA PARA A CONTA CONTABIL DO PRODUTO
                  PARAMETRIZADA POR TIPO DE OPERACAO OU PRODUTO POR TIPO DE OPERACAO */
               BEGIN
                  SELECT COUNT(*)
                    INTO V_COUNT
                    FROM LANCCTBTEMP
                   WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                     AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                     AND CDCONTCTBL = V_CDCONTPROD;
               EXCEPTION
                  WHEN NO_DATA_FOUND THEN
                     V_COUNT := 0;
               END;
               IF V_COUNT = 0 THEN
                  IF NVL(V_IDCOME, 'N') = 'N' THEN
                     V_CDCOMERCIAL := NULL;
                  END IF;
                  /* SE FOR UMA PARTIDA PARA UMA CONTA CONTABIL NOVA NO LANCAMENTO,
                     E FEITA UMA NOVA PARTIDA */
                  V_NUMPARTIDA := V_NUMPARTIDA + 1;
                  INSERT INTO LANCCTBTEMP
                     (CDEMPRESA, NRLANCCTBTEMP, CDDOCUTEMP, NRSEQCTBTEMP,
                      CDCONTCTBL, CDHISTPADR,    DSHISTCTB, DTLANCCTBTEMP,
                      VRLANCCTBTEMP, IDLANCCTBCOME, CDLANCCTBCOME, IDSISTEMA)
                  VALUES
                     (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, C_NOTAFISCAL.NRNOTAFISC, LPAD(TO_CHAR(V_NUMPARTIDA),5,'0'),
                      V_CDCONTPROD, V_CDHISTPADR, V_DSHISTLANC, C_NOTAFISCAL.DTENTRSAID, V_VRCONTITEM, V_IDCOME, V_CDCOMERCIAL, 'DFE');

                   IF V_CONTCCUS <> 'N' THEN
                      IF V_IDCCUS <> 'O' THEN
                         V_VRPARTRATEIO := 0; /* TOTAL DAS PARTIDAS DO RATEIO */
                         V_INRATEIO := 1;
                         FOR C_RATEIONF IN
                            (SELECT NRSEQITPROD, CDFILICCUST, CDCENTCUSNF, ROUND(VRRATENF,2) AS VRRATENF, COUNT(*) RECORDCOUNT
                               FROM RATEIONF RN
                              WHERE RN.CDFILIAL    = C_NOTAFISCAL.CDFILIAL
                                AND RN.NRLANCTONF  = C_NOTAFISCAL.NRLANCTONF
                                AND RN.NRSEQITPROD = C_ITEMPRODUTO.NRSEQITPROD
                                AND ROUND(RN.VRRATENF,2) <> 0
                              GROUP BY NRSEQITPROD, CDFILICCUST, CDCENTCUSNF, ROUND(VRRATENF,2)
                              ORDER BY NRSEQITPROD, CDFILICCUST) LOOP
                            V_VRRATEIO := - (C_RATEIONF.VRRATENF * P_FATOR);
                            V_VRPARTRATEIO := V_VRPARTRATEIO + V_VRRATEIO;
                            IF V_INRATEIO = C_RATEIONF.RECORDCOUNT THEN
                               IF ROUND(ABS(V_VRPARTRATEIO),2) <> ROUND(ABS(V_VRCONTITEM), 2) THEN
                                  V_VRRATEIO := V_VRRATEIO + (V_VRPARTRATEIO + V_VRCONTITEM);
                               END IF;
                            END IF;

                            INSERT INTO RATECTBTEMP
                               (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL,
                                CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                            VALUES
                               (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, LPAD(TO_CHAR(V_NUMPARTIDA),5,'0'),C_RATEIONF.CDFILICCUST,
                                 C_RATEIONF.CDCENTCUSNF, V_VRRATEIO, C_NOTAFISCAL.DTENTRSAID, '00001');
                            V_INRATEIO := V_INRATEIO + 1;
                            V_CDFILIRATEIO := C_RATEIONF.CDFILICCUST;
                            V_CDCCUSTRATEIO := C_RATEIONF.CDCENTCUSNF;
                         END LOOP;
                      END IF;
                   END IF;
               ELSE
                  /* CASO JA EXISTA ALGUM LANCAMENTO COM ESSA CONTA CONTABIL, O VALOR E ACUMULADO */
                  UPDATE LANCCTBTEMP
                     SET VRLANCCTBTEMP = VRLANCCTBTEMP + V_VRCONTITEM
                   WHERE NRLANCCTBTEMP = P_NRLANCTBTEMP
                     AND CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                     AND CDCONTCTBL = V_CDCONTPROD;
                  IF V_CONTCCUS <> 'N' THEN
                     IF V_IDCCUS <> 'O' THEN
                        FOR C_RATEIONF IN
                           (SELECT NRSEQITPROD, CDFILICCUST, CDCENTCUSNF, ROUND(VRRATENF,2) AS VRRATENF, COUNT(*) RECORDCOUNT
                              FROM RATEIONF RN
                             WHERE RN.CDFILIAL    = C_NOTAFISCAL.CDFILIAL
                               AND RN.NRLANCTONF  = C_NOTAFISCAL.NRLANCTONF
                               AND RN.NRSEQITPROD = C_ITEMPRODUTO.NRSEQITPROD
                               AND ROUND(RN.VRRATENF,2) <> 0
                             GROUP BY NRSEQITPROD, CDFILICCUST, CDCENTCUSNF, ROUND(VRRATENF,2)
                             ORDER BY NRSEQITPROD, CDFILICCUST) LOOP
                           /* VERIFICA SE PARA A CONTA CONTABIL, JA EXISTA O RATEIO PARA A FILIAL E PARA O CENTRO DE CUSTO */
                           BEGIN
                              SELECT COUNT(*), L.NRSEQCTBTEMP
                                INTO V_COUNT, V_NRSEQLANC
                                FROM LANCCTBTEMP L, RATECTBTEMP R
                               WHERE L.CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                                 AND L.NRLANCCTBTEMP = P_NRLANCTBTEMP
                                 AND L.CDCONTCTBL = V_CDCONTPROD
                                 AND R.CDFILIAL = C_RATEIONF.CDFILICCUST
                                 AND R.CDCENTCUST =  C_RATEIONF.CDCENTCUSNF
                                 AND L.NRLANCCTBTEMP = R.NRLANCCTBTEMP
                                 AND L.CDEMPRESA = R.CDEMPRESA
                               GROUP BY L.NRSEQCTBTEMP;
                           EXCEPTION
                              WHEN NO_DATA_FOUND THEN
                                 V_COUNT := 0;
                                 V_NRSEQLANC := NULL;
                           END;
                           V_VRRATEIO := - (C_RATEIONF.VRRATENF * P_FATOR);
                           IF V_COUNT = 0 THEN
                              /* CASO NAO TENHA, E FEITO O RATEIO */
                              INSERT INTO RATECTBTEMP
                                 (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL,
                                  CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                              VALUES
                                 (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, V_NRSEQLANC, C_RATEIONF.CDFILICCUST,
                                  C_RATEIONF.CDCENTCUSNF, V_VRRATEIO, C_NOTAFISCAL.DTENTRSAID, '00001');
                           ELSE
                              /* CASO EXISTA, E ATUALIZADO O VALOR DO RATIEO */
                              UPDATE RATECTBTEMP R
                                 SET VRRATECTBTEMP = VRRATECTBTEMP + V_VRRATEIO
                               WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                                 AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                                 AND NRSEQCTBTEMP = V_NRSEQLANC
                                 AND CDFILIAL = C_RATEIONF.CDFILICCUST
                                 AND CDCENTCUST =  C_RATEIONF.CDCENTCUSNF;
                           END IF;
                        END LOOP;
                     END IF;
                  END IF;
               END IF;
              /* FIM DO IF DE QUANDO EXISTE CONTA CONTABIL PARAMETRIZADA POR TIPO DE OPERACAO
                 E EXISTE RATEIO NA RATEIONF */
            ELSE
              /*---------------------------------------------------------------------------------*/
              /* QUANDO NAO HA CONTA CONTABIL PARAMETRIZADA POR TIPO DE OPERACAO OU              */
              /* PRODUTO POR TIPO DE OPERACAO E EXISTE RATEIO NA RATEIONF,                       */
              /* SAO BUSCADAS AS CONTAS CONTABEIS DE ACORDO COM AS FILIAIS NO RATEIO DO PRODUTO  */
              /*---------------------------------------------------------------------------------*/

              /* FILAIS DOS RATEIOS DO PRODUTO */
               FOR C_RATFIL IN
                  (SELECT CONTCTBL_PRODUTO(I.CDPRODUTO, 'E', CDFILICCUST) AS CONTA,
                         CDFILICCUST CDFILIALCC, SUM(ROUND(VRRATENF,2)) AS VRRATENF, RN.CDFILIAL
                      FROM RATEIONF RN, ITEMPRODUTO I
                     WHERE RN.CDFILIAL    = C_NOTAFISCAL.CDFILIAL    AND
                           RN.NRLANCTONF  = C_NOTAFISCAL.NRLANCTONF  AND
                           RN.NRSEQITPROD = C_ITEMPRODUTO.NRSEQITPROD AND
                           RN.NRLANCTONF  = I.NRLANCTONF   AND
                           RN.CDFILIAL    = I.CDFILIAL     AND
                           RN.NRSEQITPROD = I.NRSEQITPROD
                     GROUP BY I.CDPRODUTO,
                              CDFILICCUST, RN.CDFILIAL
                     ORDER BY CDFILICCUST)LOOP

                  /* PEGA A CONTA CONTABIL DO PRODUTO DA FILIAL DE RATEIO */
                  V_CDCONTPROD := C_RATFIL.CONTA;

                  /* CASO NAO ENCONTRE A CONTA CONTABIL PARA O PRODUTO,
                     E GRAVADO UM ERRO INFORMANDO QUE A CONTA CONTABIL PARA O PRODUTO X
                     NAO ESTA PARAMETRIZADA. */
                  IF V_CDCONTPROD IS NULL THEN
                     INSERT INTO ERROCTBTEMP
                        (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDERROTEMP)
                     VALUES
                        (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, '', '014|' || V_CDARVPROD);
                  END IF;

                  V_VRCONTITEM := - (C_RATFIL.VRRATENF * P_FATOR);
                  V_VRPARTIDAS := V_VRPARTIDAS + (C_RATFIL.VRRATENF * P_FATOR);
                  BUSCA_TPCOMERCIAL(V_CDCONTPROD, V_IDCOME, V_IDCCUS);

                  BEGIN
                     SELECT COUNT(*)
                       INTO V_COUNT
                       FROM LANCCTBTEMP
                      WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                        AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                        AND CDCONTCTBL = V_CDCONTPROD;
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN
                        V_COUNT := 0;
                  END;
                  IF V_COUNT = 0 THEN
                     V_NUMPARTIDA := V_NUMPARTIDA + 1;
                     IF NVL(V_IDCOME, 'N') = 'N' THEN
                        V_CDCOMERCIAL := NULL;
                     END IF;
                     INSERT INTO LANCCTBTEMP
                        (CDEMPRESA, NRLANCCTBTEMP, CDDOCUTEMP, NRSEQCTBTEMP,
                         CDCONTCTBL, CDHISTPADR,    DSHISTCTB, DTLANCCTBTEMP,
                         VRLANCCTBTEMP, IDLANCCTBCOME, CDLANCCTBCOME, IDSISTEMA)
                     VALUES
                        (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, C_NOTAFISCAL.NRNOTAFISC, LPAD(TO_CHAR(V_NUMPARTIDA),5,'0'),
                         V_CDCONTPROD, V_CDHISTPADR, V_DSHISTLANC, C_NOTAFISCAL.DTENTRSAID, V_VRCONTITEM, V_IDCOME, V_CDCOMERCIAL, 'DFE');
                  ELSE
                     UPDATE LANCCTBTEMP
                        SET VRLANCCTBTEMP = VRLANCCTBTEMP + V_VRCONTITEM
                      WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                        AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                        AND CDCONTCTBL = V_CDCONTPROD;
                  END IF;

                  IF V_CONTCCUS <> 'N' THEN
                     IF V_IDCCUS <> 'O' THEN
                        IF V_COUNT = 0 THEN
                           /* SAO BUSCADOS OS CENTROS DE CUSTO PARA A FILIAL DE RATEIO DO PRODUTO SELECIONADA NO CURSOR */
                           V_PARTRATEIO := 0;
                           FOR C_RATCENTCUST IN
                              (SELECT CDCENTCUSNF, ROUND(VRRATENF,2) AS VRRATENF, COUNT(*) RECORDCOUNT
                                 FROM RATEIONF RN
                                WHERE RN.CDFILICCUST = C_RATFIL.CDFILIALCC
                                  AND RN.NRLANCTONF  = C_NOTAFISCAL.NRLANCTONF
                                  AND RN.NRSEQITPROD = C_ITEMPRODUTO.NRSEQITPROD
                                  AND RN.CDFILIAL    = C_NOTAFISCAL.CDFILIAL
                                  AND ROUND(RN.VRRATENF,2) <> 0
                                GROUP BY CDCENTCUSNF, ROUND(VRRATENF,2))LOOP

                              /* O VALOR DO RATEIO E COLOCADO COM " - " PARA FICAR COM O MESMO SINAL DO VRCONTITEM */
                              V_VRRATEIO := -(C_RATCENTCUST.VRRATENF * P_FATOR);
                              V_PARTRATEIO := V_PARTRATEIO + V_VRRATEIO;
                              INSERT INTO RATECTBTEMP
                                (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL,
                                 CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                              VALUES
                                (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, LPAD(TO_CHAR(V_NUMPARTIDA),5,'0'), C_RATFIL.CDFILIALCC,
                                 C_RATCENTCUST.CDCENTCUSNF, V_VRRATEIO, C_NOTAFISCAL.DTENTRSAID, '00001');
                              V_CDCENTCUST := C_RATCENTCUST.CDCENTCUSNF;
                           END LOOP;
                        ELSE
                           V_PARTRATEIO := 0;
                           FOR C_RATCENTCUST IN
                              (SELECT CDCENTCUSNF, ROUND(VRRATENF,2) AS VRRATENF, COUNT(*) RECORDCOUNT
                                 FROM RATEIONF RN
                                WHERE RN.CDFILICCUST = C_RATFIL.CDFILIALCC
                                  AND RN.NRLANCTONF  = C_NOTAFISCAL.NRLANCTONF
                                  AND RN.NRSEQITPROD = C_ITEMPRODUTO.NRSEQITPROD
                                  AND RN.CDFILIAL    = C_NOTAFISCAL.CDFILIAL
                                  AND ROUND(RN.VRRATENF,2) <> 0
                                GROUP BY CDCENTCUSNF, ROUND(VRRATENF,2))LOOP

                              /* O VALOR DO RATEIO E COLOCADO COM " - " PARA FICAR COM O MESMO SINAL DO VRCONTITEM */
                              V_VRRATEIO := -(C_RATCENTCUST.VRRATENF * P_FATOR);
                              V_PARTRATEIO := V_PARTRATEIO + V_VRRATEIO;

                              /* E FEITA A VERIFICACAO SE JA EXISTE PARA A CONTA CONTABIL RATEIO COM O MESMO
                                 CENTRO DE CUSTO E FILIAL. */
                              BEGIN
                                 SELECT COUNT(*), L.NRSEQCTBTEMP
                                   INTO V_COUNT, V_NRSEQLANC
                                   FROM LANCCTBTEMP L, RATECTBTEMP R
                                  WHERE L.NRSEQCTBTEMP = R.NRSEQCTBTEMP
                                    AND L.NRLANCCTBTEMP = R.NRLANCCTBTEMP
                                    AND R.CDFILIAL = C_RATFIL.CDFILIALCC
                                    AND R.CDCENTCUST = C_RATCENTCUST.CDCENTCUSNF
                                    AND L.CDEMPRESA = R.CDEMPRESA
                                    AND L.NRLANCCTBTEMP = P_NRLANCTBTEMP
                                    AND L.CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                                    AND L.CDCONTCTBL = V_CDCONTPROD
                                  GROUP BY L.NRSEQCTBTEMP;
                              EXCEPTION
                                 WHEN NO_DATA_FOUND THEN
                                    V_COUNT := 0;
                                    V_NRSEQLANC := NULL;
                              END;
                              IF V_COUNT = 0 THEN
                                 BEGIN
                                    SELECT L.NRSEQCTBTEMP
                                      INTO V_NRSEQLANC
                                      FROM LANCCTBTEMP L
                                     WHERE L.NRLANCCTBTEMP = P_NRLANCTBTEMP
                                       AND L.CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                                       AND L.CDCONTCTBL = V_CDCONTPROD
                                     GROUP BY L.NRSEQCTBTEMP;
                                 EXCEPTION
                                    WHEN NO_DATA_FOUND THEN
                                       V_NRSEQLANC := NULL;
                                 END;
                                 INSERT INTO RATECTBTEMP
                                   (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL,
                                    CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                                 VALUES
                                   (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, V_NRSEQLANC, C_RATFIL.CDFILIALCC,
                                    C_RATCENTCUST.CDCENTCUSNF, V_VRRATEIO, C_NOTAFISCAL.DTENTRSAID, '00001');
                              ELSE
                                 UPDATE RATECTBTEMP
                                    SET VRRATECTBTEMP = VRRATECTBTEMP + (V_VRRATEIO)
                                  WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                                    AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                                    AND CDFILIAL = C_RATFIL.CDFILIALCC
                                    AND CDCENTCUST = C_RATCENTCUST.CDCENTCUSNF
                                    AND NRSEQCTBTEMP = V_NRSEQLANC;
                              END IF;
                              V_CDCENTCUST := C_RATCENTCUST.CDCENTCUSNF;
                           END LOOP;
                        END IF;
                     END IF;
                  END IF;

                  IF C_ITEMPRODUTO.VRDESCITEM > 0 THEN
                     FOR C_DESC IN
                        (SELECT CDCONTDITEN AS CDCTBLENTREN
                           FROM PARAMCTBL
                          WHERE CDCONTDITEN IS NOT NULL) LOOP
                            /* -- Contabilizacao dos Descontos dos Itens --
                              Foi necessario criar a rotina de contabilizacao de desconto item por item,
                              pois como a conta contabil que o desconto e jogado e a conta contabil do produto,
                              e preciso que sempre que seja alterado a conta contabil de um produto por filial,
                              seja atualizada a conta do produto para contabilizar o desconto. */

                        /* O VALOR DO DESCONTO E PEGO POR PERCENTUAL, POIS PODEM HAVER VARIAS FILIAIS COM
                           CONTAS CONTABEIS DIFERENTES, O VALOR DO DESCONTO DEVE SER DISTRIBUIDO DE ACORDO
                           COM A PORCENTAGEM DO RATEIO DA FILIAL SOBRE O VRCONTITEM DO ITEM */
                        V_VRDESCONTO := ROUND((ABS(V_VRCONTITEM) * 100) / C_ITEMPRODUTO.VRCONTITEM, 2);
                        V_VRDESCONTO := - (V_VRDESCONTO * C_ITEMPRODUTO.VRDESCITEM) / 100;
                        V_VRDESCONTO := ROUND(V_VRDESCONTO, 2);

                        BEGIN
                           SELECT COUNT(*)
                             INTO V_COUNT
                             FROM LANCCTBTEMP
                            WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                              AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                              AND CDCONTCTBL = V_CDCONTPROD;
                        EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                              V_COUNT := 0;
                        END;

                        IF V_COUNT = 0 THEN
                           V_NUMPARTIDA := V_NUMPARTIDA + 1;
                           IF NVL(V_IDCOME, 'N') = 'N' THEN
                              V_CDCOMERCIAL := NULL;
                           END IF;
                           INSERT INTO LANCCTBTEMP
                              (CDEMPRESA, NRLANCCTBTEMP, CDDOCUTEMP, NRSEQCTBTEMP,
                               CDCONTCTBL, CDHISTPADR,    DSHISTCTB, DTLANCCTBTEMP,
                               VRLANCCTBTEMP, IDLANCCTBCOME, CDLANCCTBCOME, IDSISTEMA)
                           VALUES
                              (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, C_NOTAFISCAL.NRNOTAFISC, LPAD(TO_CHAR(V_NUMPARTIDA),5,'0'),
                               V_CDCONTPROD, V_CDHISTPADR, V_DSHISTLANC, C_NOTAFISCAL.DTENTRSAID, V_VRDESCONTO, V_IDCOME, V_CDCOMERCIAL, 'DFE');
                        ELSE
                           UPDATE LANCCTBTEMP
                              SET VRLANCCTBTEMP = VRLANCCTBTEMP + V_VRDESCONTO
                            WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                              AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                              AND CDCONTCTBL = V_CDCONTPROD;
                        END IF;
                        IF V_CONTCCUS <> 'N' THEN
                           IF V_IDCCUS <> 'O' THEN
                              V_PARTRATEIO := 0;
                              V_INRATEIO := 1;
                              /* CASO A CONTA CONTABIL GERAR RATEIO, E PEGO O VALOR TOTAL DOS RATEIOS DA FILIAL
                                 E CALCULADO A PORCENTAGEM DOS CENTROS DE CUSTO EM CIMA DO VALOR DA FILIAL. */
                              FOR C_RATEIODESCONTO IN
                                 (SELECT CDCENTCUSNF, ((VRRATENF * 100) / A.TOTALITEM) AS PORCENTAGEM, COUNT(*) RECORDCOUNT
                                    FROM RATEIONF RN, ITEMPRODUTO I, (SELECT SUM(VRRATENF) TOTALITEM
                                                                        FROM RATEIONF
                                                                       WHERE CDFILICCUST = C_RATFIL.CDFILIALCC
                                                                         AND NRSEQITPROD = C_ITEMPRODUTO.NRSEQITPROD
                                                                         AND NRLANCTONF  = C_NOTAFISCAL.NRLANCTONF
                                                                         AND CDFILIAL    = C_RATFIL.CDFILIAL) A
                                    WHERE RN.CDFILICCUST = C_RATFIL.CDFILIALCC
                                      AND RN.NRLANCTONF  = C_NOTAFISCAL.NRLANCTONF
                                      AND RN.NRSEQITPROD = C_ITEMPRODUTO.NRSEQITPROD
                                      AND RN.CDFILIAL    = I.CDFILIAL
                                      AND RN.NRLANCTONF  = I.NRLANCTONF
                                      AND RN.NRSEQITPROD = I.NRSEQITPROD
                                      AND RN.CDFILIAL    = C_RATFIL.CDFILIAL
                                      AND ROUND(RN.VRRATENF,2) <> 0
                                    GROUP BY CDCENTCUSNF, ((VRRATENF * 100) / A.TOTALITEM)) LOOP

                                 /* O VALOR DE DESCONTO DA FILIAL, E CALCULADO POR CENTRO DE CUSTO; */
                                 V_VRRATEIO := - (ROUND(ABS(V_VRDESCONTO), 2) * C_RATEIODESCONTO.PORCENTAGEM) / 100;
                                 V_PARTRATEIO := V_PARTRATEIO + ABS(V_VRRATEIO);

                                 /* E FEITA A VERIFICACAO SE JA EXISTE PARA A CONTA CONTABIL, RATEIO COM O MESMO
                                    CENTRO DE CUSTO E FILIAL. */
                                 BEGIN
                                    SELECT COUNT(*), L.NRSEQCTBTEMP
                                      INTO V_COUNT, V_NRSEQLANC
                                      FROM LANCCTBTEMP L, RATECTBTEMP R
                                     WHERE L.NRSEQCTBTEMP = R.NRSEQCTBTEMP
                                       AND L.NRLANCCTBTEMP = R.NRLANCCTBTEMP
                                       AND R.CDFILIAL = C_RATFIL.CDFILIALCC
                                       AND R.CDCENTCUST = C_RATEIODESCONTO.CDCENTCUSNF
                                       AND L.CDEMPRESA = R.CDEMPRESA
                                       AND L.NRLANCCTBTEMP = P_NRLANCTBTEMP
                                       AND L.CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                                       AND L.CDCONTCTBL = V_CDCONTPROD
                                     GROUP BY L.NRSEQCTBTEMP;
                                 EXCEPTION
                                    WHEN NO_DATA_FOUND THEN
                                       V_COUNT := 0;
                                       V_NRSEQLANC := NULL;
                                 END;

                                 IF V_COUNT = 0 THEN
                                    INSERT INTO RATECTBTEMP
                                      (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL,
                                       CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                                    VALUES
                                      (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, LPAD(TO_CHAR(V_NUMPARTIDA),5,'0'), C_RATFIL.CDFILIALCC,
                                       C_RATEIODESCONTO.CDCENTCUSNF, V_VRRATEIO * P_FATOR, C_NOTAFISCAL.DTENTRSAID, '00001');
                                 ELSE
                                    UPDATE RATECTBTEMP
                                       SET VRRATECTBTEMP = VRRATECTBTEMP + (V_VRRATEIO * P_FATOR)
                                     WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                                       AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                                       AND CDFILIAL = C_RATFIL.CDFILIALCC
                                       AND CDCENTCUST = C_RATEIODESCONTO.CDCENTCUSNF
                                       AND NRSEQCTBTEMP = V_NRSEQLANC;
                                 END IF;

                                 /* E VERIFICADO SE HA DIFERENCAS ENTRE O VRCONTITEM E OS VALORES RATEADOS,
                                    CASO EXISTA DIFERENCA, O VALOR E ARREDONDADO. */
                                 IF V_INRATEIO = C_RATEIODESCONTO.RECORDCOUNT THEN
                                    IF ABS(V_PARTRATEIO) <> ABS(V_VRDESCONTO) THEN
                                       V_VRRATEIO := ROUND(ABS(V_VRCONTITEM), 2) - ROUND(ABS(V_PARTRATEIO), 2);
                                       V_VRRATEIO := - V_VRRATEIO;
                                       UPDATE RATECTBTEMP
                                          SET VRRATECTBTEMP = VRRATECTBTEMP + V_VRRATEIO
                                        WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                                          AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                                          AND NRSEQCTBTEMP = V_NRSEQLANC
                                          AND CDFILIAL =  C_RATFIL.CDFILIALCC
                                          AND CDCENTCUST = C_RATEIODESCONTO.CDCENTCUSNF;
                                    END IF;
                                 END IF;
                                 V_INRATEIO := V_INRATEIO + 1;
                                 V_CDCENTCUST := C_RATEIODESCONTO.CDCENTCUSNF;
                              END LOOP;
                           END IF;
                        END IF;
                     END LOOP;
                  END IF;
                  V_CDRATFIL := C_RATFIL.CDFILIALCC;
               END LOOP;
               /* AQUI E VERIFICADO SE O TOTAL DAS PARTIDAS CONTABILIZADAS ESTA CORRETO,
                  CASO NAO ESTEJA, O VALOR E AJUSTADO. */
               IF V_INPARTIDAS = C_ITEMPRODUTO.RECORDCOUNT THEN
                  IF ROUND(ABS(V_VRPARTIDAS), 2) <> ROUND(ABS(P_VRLANCTO + NVL(P_VRINDUSTRIA, 0)), 2)  THEN
                     V_VRDIFERENCA :=  -(P_VRLANCTO - V_VRPARTIDAS);
                     UPDATE LANCCTBTEMP
                        SET VRLANCCTBTEMP = VRLANCCTBTEMP + V_VRDIFERENCA
                      WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                        AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                        AND CDCONTCTBL = V_CDCONTPROD;
                     IF V_CONTCCUS <> 'N' THEN
                        IF V_IDCCUS <> 'O' THEN
                           V_CDFILIRATEIO := V_CDRATFIL;
                           BEGIN
                              SELECT L.NRSEQCTBTEMP
                                INTO V_NRSEQLANC
                                FROM LANCCTBTEMP L, RATECTBTEMP R
                               WHERE L.CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                                 AND L.NRLANCCTBTEMP = P_NRLANCTBTEMP
                                 AND L.NRLANCCTBTEMP = R.NRLANCCTBTEMP
                                 AND L.NRSEQCTBTEMP = R.NRSEQCTBTEMP
                                 AND L.CDEMPRESA = R.CDEMPRESA
                                 AND L.CDCONTCTBL = V_CDCONTPROD
                                 AND R.CDFILIAL = V_CDFILIRATEIO
                                 AND R.CDCENTCUST = V_CDCENTCUST;
                           EXCEPTION
                              WHEN NO_DATA_FOUND THEN
                                 V_NRSEQLANC := NULL;
                           END;

                           UPDATE RATECTBTEMP
                              SET VRRATECTBTEMP = VRRATECTBTEMP + V_VRDIFERENCA
                            WHERE NRLANCCTBTEMP = P_NRLANCTBTEMP
                              AND CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                              AND NRSEQCTBTEMP = V_NRSEQLANC
                              AND CDFILIAL = V_CDFILIRATEIO
                              AND CDCENTCUST = V_CDCENTCUST;
                           V_CDCCUSTRATEIO := V_CDCENTCUST;
                        END IF;
                     END IF;
                     V_VRPARTIDAS := V_VRPARTIDAS - V_VRDIFERENCA;
                  END IF;
               END IF;
            END IF;
         END IF;
         V_INPARTIDAS := V_INPARTIDAS + 1;
      END LOOP;

      IF V_ISEMPTY = 'S' THEN
         BEGIN
            SELECT CDCONTPROD
              INTO V_CDCONTPROD
              FROM TIPOOPERAC
             WHERE CDTIPOOPER = C_NOTAFISCAL.CDTIPOOPER
               AND IDENTRSAIDOP = C_NOTAFISCAL.IDENTRSAIDOP;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDCONTPROD := NULL;
         END;

         IF V_CDCONTPROD IS NOT NULL THEN
            V_NUMPARTIDA := V_NUMPARTIDA + 1;
            BUSCA_TPCOMERCIAL(V_CDCONTPROD, V_IDCOME, V_IDCCUS);
            IF NVL(V_IDCOME, 'N') = 'N' THEN
               V_CDCOMERCIAL := NULL;
            END IF;
            INSERT INTO LANCCTBTEMP
               (CDEMPRESA, NRLANCCTBTEMP, CDDOCUTEMP, NRSEQCTBTEMP,
                CDCONTCTBL, CDHISTPADR,    DSHISTCTB, DTLANCCTBTEMP,
                VRLANCCTBTEMP, IDLANCCTBCOME, CDLANCCTBCOME, IDSISTEMA)
            VALUES
               (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, C_NOTAFISCAL.NRNOTAFISC, LPAD(TO_CHAR(V_NUMPARTIDA),5,'0'),
                V_CDCONTPROD, V_CDHISTPADR, V_DSHISTLANC, C_NOTAFISCAL.DTENTRSAID, - P_VRLANCTO, V_IDCOME, V_CDCOMERCIAL, 'DFE');

            IF V_CONTCCUS <> 'N' THEN
               IF V_IDCCUS <> 'O' THEN
                  INSERT INTO RATECTBTEMP
                     (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL,
                      CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                  VALUES
                     (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, LPAD(TO_CHAR(V_NUMPARTIDA),5,'0'), C_NOTAFISCAL.CDFILIRECE,
                      V_CCUSTPROD, - P_VRLANCTO, C_NOTAFISCAL.DTENTRSAID, '00001');

               END IF;
            END IF;
         END IF;
      END IF;

      IF V_INPARTIDAS -1 = V_ITEMPRODUTOREC THEN
         IF (ROUND(ABS(V_VRPARTIDAS), 2) <> ROUND(ABS(P_VRLANCTO + NVL(P_VRINDUSTRIA, 0)), 2)) THEN
            V_VRDIFERENCA := - ((P_VRLANCTO) - (V_VRPARTIDAS));
            IF V_VRDIFERENCA <> 0 THEN
               IF V_CDCONTPROD IS NOT NULL THEN
                  UPDATE LANCCTBTEMP
                     SET VRLANCCTBTEMP = VRLANCCTBTEMP + V_VRDIFERENCA
                   WHERE CDCONTCTBL = V_CDCONTPROD
                     AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                     AND CDEMPRESA = C_NOTAFISCAL.CDEMPRESA;
                  BUSCA_TPCOMERCIAL(V_CDCONTPROD, V_IDCOME, V_IDCCUS);
                  IF V_CONTCCUS <> 'N' THEN
                     IF V_IDCCUS <> 'O' THEN
                        BEGIN
                           SELECT MAX(NRSEQCTBTEMP)
                             INTO V_NRSEQLANC
                             FROM LANCCTBTEMP
                            WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                              AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                              AND CDCONTCTBL = V_CDCONTPROD;
                        EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                              V_NRSEQLANC  := NULL;
                        END;

                        UPDATE RATECTBTEMP
                           SET VRRATECTBTEMP = VRRATECTBTEMP + V_VRDIFERENCA
                         WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                           AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                           AND NRSEQCTBTEMP = V_NRSEQLANC
                           AND CDFILIAL = V_CDFILIRATEIO
                           AND CDCENTCUST = V_CDCCUSTRATEIO;
                     END IF;
                  END IF;
               ELSE
                  BEGIN
                     SELECT MAX(NRSEQCTBTEMP)
                       INTO V_NRSEQLANC
                       FROM LANCCTBTEMP
                      WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                        AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                        AND CDCONTCTBL IS NULL;
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN
                        V_NRSEQLANC  := NULL;
                  END;

                  UPDATE LANCCTBTEMP
                     SET VRLANCCTBTEMP = VRLANCCTBTEMP + V_VRDIFERENCA
                   WHERE CDCONTCTBL = V_NRSEQLANC
                     AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                     AND CDEMPRESA = C_NOTAFISCAL.CDEMPRESA;

                  UPDATE RATECTBTEMP
                     SET VRRATECTBTEMP = VRRATECTBTEMP + V_VRDIFERENCA
                   WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                     AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                     AND NRSEQCTBTEMP = V_NRSEQLANC
                     AND CDFILIAL = V_CDFILIRATEIO
                     AND CDCENTCUST = V_CDCCUSTRATEIO;
               END IF;
            END IF;
         END IF;
      END IF;
   END LOOP;
END;
/