CREATE OR REPLACE PROCEDURE CTB_DFS_RECEITAPROD(
   P_NRLANCTBTEMP LANCCONT.NRLANCCONT%TYPE,
   P_CDFILIAL FILIAL.CDFILIAL%TYPE,
   P_NRLANCTONF NOTAFISCAL.NRLANCTONF%TYPE,
   P_VRLANCTO LANCCONT.VRLANCAMENT%TYPE)
AS 
   V_IDCOME VARCHAR2(01);
   V_IDCCUS VARCHAR2(01);
   V_CONTCCUS VARCHAR2(01);
   V_VRLANCTO LANCCONT.VRLANCAMENT%TYPE;
   V_COUNT INT;
   V_NRSEQLANC LANCCONT.NRSEQLANC%TYPE;
   V_NUMPARTIDA INT;
   V_CDHISTPADR HISTPADR.CDHISTPADR%TYPE;
   V_DSHISTLANC LANCCONT.DSHISTLANC%TYPE;
   V_CDCENTCUST VARCHAR2(04);
   V_CDCOMERCIAL FORNECEDOR.CDFORNECED%TYPE;
   V_CDCOMERCIALAUX FORNECEDOR.CDFORNECED%TYPE;
   V_NRLANCTEMP LANCCONT.NRLANCCONT%TYPE;
   V_VRPARTIDAS NUMBER;
   V_CDARVPROD PRODUTO.CDARVPROD%TYPE;
   V_INPARTIDA NUMBER;
   V_CDCONTPROD CONTCTBL.CDCONTCTBL%TYPE;
   V_VRCONTITEM NUMBER;
   V_ISEMPTY VARCHAR2(01);
   V_INRATEIO NUMBER;
   V_VRRATEIO NUMBER;
   V_TOTRATEIO NUMBER;
   V_CONTADESCONTO CONTCTBL.CDCONTCTBL%TYPE;
   V_DIFERENCA NUMBER;
   V_IMPOSTOACRESCER NUMBER;
BEGIN
   V_VRLANCTO := P_VRLANCTO;
   V_NRLANCTEMP := P_NRLANCTBTEMP;
   V_VRPARTIDAS := 0;
   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
         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
      /* CONTROLA SE GERA OS RATEIOS */
      SELECT IDCONTGERE
        INTO V_CONTCCUS
        FROM CONTOPECTBL
       WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA;

      V_INPARTIDA := 1;
      V_CDCONTPROD := NULL;

      /* V_VRCONTITEM - E O VALOR QUE O PRODUTO TEM QUE SER CONTABILIZADO */
      V_VRCONTITEM := 0;

      /* V_VRPARTIDAS - E O TOTAL DE VALOR ACUMULADO SOMANDO TODAS AS PARTIDAS DO LANCAMENTO CONTABIL */
      V_VRPARTIDAS := 0;

      /* V_ISEMPTY - VARIAVEL DE CONTROLE PARA SABER SE ENTROU OU NAO EM ALGUM LOOP */
      V_ISEMPTY := 'S';

      /* PROCEDURE RESPONSAVEL POR MONTAR O HISTORICO DO LANCAMENTO CONTABIL */
      CTB_DFE_HISTORICO(P_CDFILIAL, P_NRLANCTONF, V_CDHISTPADR, V_DSHISTLANC);

      /* SELECT UTILIZADO PARA BUSCAR A CONTA DE DESCONTO CASO A NOTA POSSUA ALGUM PRODUTO COM DESCONTO */
      BEGIN
         SELECT CDCTBLSAIDEN
           INTO V_CONTADESCONTO
           FROM ITEMPRODUTO I, (SELECT CDCONTDITEN AS CDCTBLENTREN,
                                       CDCONTDITSA AS CDCTBLSAIDEN
                                  FROM PARAMCTBL
                                 WHERE DECODE(C_NOTAFISCAL.IDENTRSAIDOP, 'E', CDCONTDITEN, CDCONTDITSA) IS NOT NULL) E
          WHERE I.CDFILIAL   = C_NOTAFISCAL.CDFILIAL
            AND I.NRLANCTONF = C_NOTAFISCAL.NRLANCTONF
          GROUP BY CDCTBLENTREN, CDCTBLSAIDEN
          HAVING ROUND(SUM(VRDESCITEM),2) > 0;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_CONTADESCONTO := NULL;
      END;

      /* VARIAVEL QUE CONTROLA OS SEQUENCIAIS DAS PARTIDAS NO LANCAMENTO CONTABIL */
      V_NUMPARTIDA := NULL;

      /* LOOP DOS PRODUTOS DA NOTA, REFERENTE AO ANTIGO adqItemProduto DA LIB 10100 */
      FOR C_PRODUTORECEITA IN
         (SELECT IT.NRSEQITPROD, IT.CDPRODUTO,
                 ROUND(IT.VRCONTITEM,2) AS VRCONTITEM,
                 CONTCTBL_PRODUTO(P.CDPRODUTO, 'E', C_NOTAFISCAL.CDFILIEMIT) AS CDCTBLENTRPR,
                 CONTCTBL_PRODUTO(P.CDPRODUTO, 'S', C_NOTAFISCAL.CDFILIEMIT) AS CDCTBLSAIDPR,
                 ROUND(IT.VRDESCITEM,2) AS VRDESCITEM, COUNT(*) OVER (PARTITION BY IT.CDFILIAL, IT.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)
           ORDER BY IT.NRSEQITPROD) LOOP

         /* NO PRIMEIRO PRODUTO E BUSCADO O MAIOR SEQUENCIAL DO LANCAMENTO CONTABIL */
         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;

            /* 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;
             V_CDCOMERCIALAUX := V_CDCOMERCIAL;
         END IF;

         /* BUSCA A CHAVE DA TABELA PRODUTO, DE ACORDO COM O CDPRODUTO DA TABELA ITEMPRODUTO */
         SELECT P.CDARVPROD
           INTO V_CDARVPROD
           FROM PRODUTO P
          WHERE P.CDPRODUTO = C_PRODUTORECEITA.CDPRODUTO;
         BEGIN
            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;
         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;
         IF V_CDCONTPROD IS NULL THEN
            BEGIN
               SELECT MAX(CDCTBLENTRPF) AS CDCTBLENTRPF
                 INTO V_CDCONTPROD
                 FROM PRODFILI PF, PRODUTO P
                WHERE CDFILIAL      = C_NOTAFISCAL.CDFILIEMIT
                  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_PRODUTORECEITA.CDCTBLSAIDPR;
         END IF;
         IF V_CDCONTPROD IS NULL THEN
            INSERT INTO ERROCTBTEMP
               (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDERROTEMP)
            VALUES
               (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, '', '014|' || V_CDARVPROD);
         END IF;
         BUSCA_TPCOMERCIAL(V_CDCONTPROD, V_IDCOME, V_IDCCUS);
         IF NVL(V_IDCOME, 'N') = 'N' THEN
            V_CDCOMERCIAL := NULL;
         ELSE
            V_CDCOMERCIAL := V_CDCOMERCIALAUX;
         END IF;

         /* CASO O VALOR DO PRODUTO A SER CONTABILIZADO SEJA MAIOR QUE 0, E FEITA A
            ROTINA DE CONTABILIZACAO */
         IF C_PRODUTORECEITA.VRCONTITEM > 0 THEN

            /* VARIAVEL UTILIZADA PARA ARMAZENAR O VALOR A SER CONTABILIZADO */
            V_VRCONTITEM := C_PRODUTORECEITA.VRCONTITEM;

            /* VARIAVEL USADA PARA SOMAR AS PARTIDAS JA FEITAS DOS PRODUTOS */
            V_VRPARTIDAS := V_VRPARTIDAS + V_VRCONTITEM;

            /* CASO SEJA O ULTIMO PRODUTO, VERIFICA SE E NECESSARIO ARREDONDAR A PARTIDA */
            IF V_INPARTIDA = C_PRODUTORECEITA.RECORDCOUNT THEN
               /* CASO O VALOR TODAL DAS PARTIDAS MENOS O VALOR JA CONTABILIZADO DE UMA
                  DIFERENCA MENOR QUE R$0,10, E FEITO O ARREDONDAMENTO */
               IF (ABS(ROUND(ABS(V_VRPARTIDAS), 2) - ROUND(ABS(V_VRLANCTO),2)) <= 0.1) AND
                      (ROUND(ABS(V_VRPARTIDAS), 2) <> ROUND(ABS(V_VRLANCTO),2)) THEN
                  V_IMPOSTOACRESCER := 0;
                  BEGIN
                     SELECT NVL(SUM(ROUND(IMP.VRIMPOSTONF, 2)), 0)
                       INTO V_IMPOSTOACRESCER
                       FROM IMPOSTONF IMP, NOTAFISCAL NF, IMPOSTO I, PARAMFILIAL PF,
                            (SELECT DISTINCT CDIMPOSTO,
                                             CONTCTBL_IMPOSTO(I.CDIMPOSTO, 'A', 'S', NF.CDTIPOOPER, NF.IDTPIJURNF) AS CDCONTATIV,
                                             CONTCTBL_IMPOSTO(I.CDIMPOSTO, 'P', 'S', NF.CDTIPOOPER, NF.IDTPIJURNF) AS CDCONTPASS,
                                             CONTCTBL_IMPOSTO(I.CDIMPOSTO, 'D', 'S', NF.CDTIPOOPER, NF.IDTPIJURNF) AS CDCONTDESP
                               FROM IMPOSTONF I, NOTAFISCAL NF
                              WHERE I.CDFILIAL   = NF.CDFILIAL
                                AND I.NRLANCTONF = NF.NRLANCTONF
                                AND I.CDFILIAL   = C_NOTAFISCAL.CDFILIAL
                                AND I.NRLANCTONF = C_NOTAFISCAL.NRLANCTONF) CT
                      WHERE IMP.VRIMPOSTONF > 0          AND
                            IMP.CDIMPOSTO = CT.CDIMPOSTO AND
                            IMP.CDIMPOSTO = I.CDIMPOSTO  AND
                            ((IMP.IDIMPOSTONF IN ('1','4')) OR (IMP.IDIMPOSTONF IS NULL)) AND
                            I.IDTIPCONTAB  = 'D'         AND
                            ((((I.IDIMPORECUP  = 'S'  AND IMP.CDFISCALNF = '1' AND PF.IDCARACFIS  = 'C') OR (PF.IDCARACFIS = 'A')) AND (CT.CDCONTPASS IS NOT NULL))
                             OR
                             ((I.IDIMPORECUP <> 'S') AND (CT.CDCONTPASS IS NOT NULL)))     AND
                            NF.CDFILIAL   = C_NOTAFISCAL.CDFILIAL AND
                            NF.NRLANCTONF = C_NOTAFISCAL.NRLANCTONF  AND
                            NF.CDFILIEMIT   = PF.CDFILIAL    AND
                            NF.CDFILIAL     = IMP.CDFILIAL   AND
                            NF.NRLANCTONF   = IMP.NRLANCTONF AND
                            I.IDTRATIMPO = 'A';
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN
                        V_IMPOSTOACRESCER := 0;
                  END;
                  V_DIFERENCA := ABS(ROUND(ABS(NVL(V_VRPARTIDAS, 0)), 2) - ABS(ROUND(V_VRLANCTO, 2)));
                  IF ROUND(V_IMPOSTOACRESCER, 2) <> ROUND(V_DIFERENCA, 2) THEN
                     IF ROUND(ABS(V_VRPARTIDAS),2) >  ROUND(ABS(V_VRLANCTO), 2) THEN
                        V_VRCONTITEM := V_VRCONTITEM - V_DIFERENCA;
                     ELSE
                        V_VRCONTITEM := V_VRCONTITEM + V_DIFERENCA;
                     END IF;
                  END IF;
               END IF;
            END IF;

            IF ABS(V_VRCONTITEM)  > 0 THEN
               /* E VERIFICADO SE JA EXISTE UMA PARTIDA PARA A CONTA CONTABIL
                  E CODIGO COMERCIAL A SER CONTABILIZADO. CASO HAJA NAO E INSERIDO UMA NOVA PARTIDA. */
               V_COUNT := 0;
               IF V_CDCONTPROD IS NOT NULL THEN
                  BEGIN
                     SELECT COUNT(*), NRSEQCTBTEMP
                       INTO V_COUNT, V_NRSEQLANC
                       FROM LANCCTBTEMP
                      WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                        AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                        AND CDCONTCTBL = V_CDCONTPROD
                      GROUP BY NRSEQCTBTEMP;
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN
                        V_COUNT := 0;
                        V_NRSEQLANC := NULL;
                  END;
               ELSE
                  BEGIN
                     SELECT COUNT(*), NRSEQCTBTEMP
                       INTO V_COUNT, V_NRSEQLANC
                       FROM LANCCTBTEMP
                      WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                        AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                        AND CDCONTCTBL IS NULL
                      GROUP BY NRSEQCTBTEMP;
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN
                        V_COUNT := 0;
                        V_NRSEQLANC := NULL;
                  END;
               END IF;
               IF V_COUNT = 0 THEN
                  V_NUMPARTIDA := V_NUMPARTIDA + 1;
                  V_NRSEQLANC := LPAD(TO_CHAR(V_NUMPARTIDA),5,'0');
                  INSERT INTO LANCCTBTEMP
                     (CDEMPRESA, NRLANCCTBTEMP, CDDOCUTEMP, NRSEQCTBTEMP,
                      CDCONTCTBL, CDHISTPADR,    DSHISTCTB, DTLANCCTBTEMP,
                      VRLANCCTBTEMP, IDLANCCTBCOME, CDLANCCTBCOME, IDSISTEMA)
                  VALUES
                     (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, C_NOTAFISCAL.NRNOTAFISC, V_NRSEQLANC,
                      V_CDCONTPROD, V_CDHISTPADR, V_DSHISTLANC, C_NOTAFISCAL.DTEMISSAO, V_VRCONTITEM, V_IDCOME, V_CDCOMERCIAL, 'DFS');
               ELSE
                  /* CASO JA EXISTA UMA PARTIDA PARA A CONTA CONTABIL DO PRODUTO E PARA O CODIGO COMERCIAL
                     A SER CONTABILIZADO, O VALOR DA PARTIDA E ATUALIZADO. */
                  UPDATE LANCCTBTEMP
                     SET VRLANCCTBTEMP = VRLANCCTBTEMP + V_VRCONTITEM
                   WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                     AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                     AND NRSEQCTBTEMP = V_NRSEQLANC;
               END IF;

               /* CASO A EMPRESA CONTROLE A CONTABILIDADE GERENCIAL, E VERIFICADO SE A CONTA E DIFERENTE
                  DE SO OFICIAL */
               IF V_CONTCCUS <> 'N' THEN
                  IF V_IDCCUS <> 'O' THEN
                     V_ISEMPTY := 'S';
                     V_INRATEIO := 1;

                     V_TOTRATEIO := 0;

                     FOR C_RATEIONF IN
                        (SELECT NRSEQITPROD, CDFILICCUST, CDCENTCUSNF, ROUND(VRRATENF,2) AS VRRATENF,
                                COUNT(*) OVER (PARTITION BY CDFILIAL, NRLANCTONF) RECORDCOUNT
                           FROM RATEIONF RN
                          WHERE RN.CDFILIAL    = C_NOTAFISCAL.CDFILIAL   AND
                                RN.NRLANCTONF  = C_NOTAFISCAL.NRLANCTONF AND
                                RN.NRSEQITPROD = C_PRODUTORECEITA.NRSEQITPROD
                          GROUP BY NRSEQITPROD, CDFILICCUST, CDCENTCUSNF, ROUND(VRRATENF,2), CDFILIAL, NRLANCTONF
                          ORDER BY NRSEQITPROD, CDFILICCUST) LOOP

                        /* CASO EXISTA RATEIO PARA O PRODUTO, A VARIAVEL V_ISEMPTY E SETADA PARA N, PARA POSTERIORMENTE
                           NAO RELIZAR O RATEIO PADRAO */
                        V_ISEMPTY := 'N';

                        /* VALOR A SER INSERIDO COMO RATIEO */
                        V_VRRATEIO := C_RATEIONF.VRRATENF;

                        /* TOTAL DOS VALROES RATEADOS PARA O PRODUTO */
                        V_TOTRATEIO := V_TOTRATEIO + V_VRRATEIO;

                        /* VERIFICA SE E O ULTIMO RATEIO PARA O PRODUTO. CASO SEJA, E VERIFICADO A NECESSIDADE
                           DE FAZER O ARREDONDAMENTO */
                        IF V_INRATEIO = C_RATEIONF.RECORDCOUNT THEN
                           IF (ABS(ROUND(ABS(V_TOTRATEIO),2) - ROUND(ABS(V_VRCONTITEM), 2)) <= 0.1) AND
                              (ROUND(ABS(V_TOTRATEIO), 2) <> ROUND(ABS(V_VRCONTITEM), 2)) THEN
                              V_VRRATEIO := V_VRRATEIO - (V_TOTRATEIO - V_VRCONTITEM);
                           END IF;
                           IF V_INPARTIDA = C_PRODUTORECEITA.RECORDCOUNT THEN
                              V_VRRATEIO := V_VRCONTITEM;
                           END IF;
                        END IF;

                        /* VERIFICACAO SE JA EXISTE O RATEIO PARA CONTA CONTABIL, FILIAL E CENTRO DE CUSTO
                           A SER RATEADO */
                        V_COUNT := 0;
                        IF V_CDCONTPROD IS NOT NULL THEN
                           BEGIN
                              SELECT COUNT(*), L.NRSEQCTBTEMP
                                INTO V_COUNT, V_NRSEQLANC
                                FROM LANCCTBTEMP L, RATECTBTEMP R
                               WHERE L.NRLANCCTBTEMP = P_NRLANCTBTEMP
                                 AND L.CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                                 AND L.CDCONTCTBL = V_CDCONTPROD
                                 AND L.NRSEQCTBTEMP = R.NRSEQCTBTEMP
                                 AND L.NRLANCCTBTEMP = R.NRLANCCTBTEMP
                                 AND L.CDEMPRESA = R.CDEMPRESA
                                 AND R.CDFILIAL = C_RATEIONF.CDFILICCUST
                                 AND R.CDCENTCUST = C_RATEIONF.CDCENTCUSNF
                               GROUP BY L.NRSEQCTBTEMP;
                           EXCEPTION
                              WHEN NO_DATA_FOUND THEN
                                 V_COUNT := 0;
                                 V_NRSEQLANC := NULL;
                           END;
                        ELSE
                           BEGIN
                              SELECT COUNT(*), L.NRSEQCTBTEMP
                                INTO V_COUNT, V_NRSEQLANC
                                FROM LANCCTBTEMP L, RATECTBTEMP R
                               WHERE L.NRLANCCTBTEMP = P_NRLANCTBTEMP
                                 AND L.CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                                 AND L.CDCONTCTBL IS NULL
                                 AND L.NRSEQCTBTEMP = R.NRSEQCTBTEMP
                                 AND L.NRLANCCTBTEMP = R.NRLANCCTBTEMP
                                 AND L.CDEMPRESA = R.CDEMPRESA
                                 AND R.CDFILIAL = C_RATEIONF.CDFILICCUST
                                 AND R.CDCENTCUST = C_RATEIONF.CDCENTCUSNF
                               GROUP BY L.NRSEQCTBTEMP;
                           EXCEPTION
                              WHEN NO_DATA_FOUND THEN
                                 V_COUNT := 0;
                                 V_NRSEQLANC := NULL;
                           END;
                        END IF;
                        IF V_COUNT = 0 THEN
                           IF V_CDCONTPROD IS NULL THEN
                              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;
                           ELSE
                              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;
                           END IF;

                           INSERT INTO RATECTBTEMP
                              (CDEMPRESA, NRLANCCTBTEMP, NRSEQCTBTEMP, CDFILIAL,
                               CDCENTCUST, VRRATECTBTEMP, DTCOMPCTBTEMP, NRSEQRATTEMP)
                           VALUES
                              (C_NOTAFISCAL.CDEMPRESA, P_NRLANCTBTEMP, LPAD(TO_CHAR(V_NRSEQLANC),5,'0'), C_RATEIONF.CDFILICCUST,
                               C_RATEIONF.CDCENTCUSNF, V_VRRATEIO, C_NOTAFISCAL.DTEMISSAO, '00001');
                        ELSE
                           UPDATE RATECTBTEMP
                              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;

                     /* CASO NAO TENHA RATEIO NA TABELA RATEIONF, E FEITO O RATEIO PADRAO */
                     IF V_ISEMPTY = 'S' THEN
                        V_CDCENTCUST := BUSCA_CCUSTO(C_NOTAFISCAL.CDFILIEMIT, C_NOTAFISCAL.CDEMPRESA);
                        V_NRSEQLANC  := LPAD(TO_CHAR(V_NUMPARTIDA),5,'0');
                        V_VRRATEIO   := V_VRCONTITEM;
                        BEGIN
                           SELECT COUNT(*)
                             INTO V_COUNT
                             FROM RATECTBTEMP R
                            WHERE R.NRLANCCTBTEMP = P_NRLANCTBTEMP
                              AND R.NRSEQCTBTEMP  = V_NRSEQLANC
                              AND R.CDEMPRESA     = C_NOTAFISCAL.CDEMPRESA
                              AND R.CDFILIAL      = C_NOTAFISCAL.CDFILIEMIT
                              AND R.CDCENTCUST    = V_CDCENTCUST;
                        EXCEPTION
                           WHEN NO_DATA_FOUND THEN
                              V_COUNT := 0;
                        END;

                        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.CDFILIEMIT,
                               V_CDCENTCUST, V_VRRATEIO, C_NOTAFISCAL.DTEMISSAO, '00001');
                        ELSE
                           UPDATE RATECTBTEMP
                              SET VRRATECTBTEMP = VRRATECTBTEMP + V_VRRATEIO
                            WHERE CDEMPRESA     = C_NOTAFISCAL.CDEMPRESA
                              AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                              AND NRSEQCTBTEMP  = V_NRSEQLANC
                              AND CDFILIAL      = C_NOTAFISCAL.CDFILIEMIT
                              AND CDCENTCUST    = V_CDCENTCUST;
                        END IF;
                     END IF;
                  END IF;
               END IF;
            END IF;
         END IF;
         IF ((V_CONTADESCONTO IS NOT NULL) AND (C_PRODUTORECEITA.VRDESCITEM > 0)) THEN
            BEGIN
               SELECT COUNT(*), NRSEQCTBTEMP
                 INTO V_COUNT, V_NRSEQLANC
                 FROM LANCCTBTEMP
                WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                  AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                  AND CDCONTCTBL = V_CDCONTPROD
                GROUP BY NRSEQCTBTEMP;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_COUNT := 0;
                  V_NRSEQLANC := NULL;
            END;

            IF V_COUNT = 0 THEN
               V_NRSEQLANC := V_NRSEQLANC + 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_NRSEQLANC),5,'0'),
                   V_CDCONTPROD, V_CDHISTPADR, V_DSHISTLANC, C_NOTAFISCAL.DTEMISSAO, C_PRODUTORECEITA.VRDESCITEM, V_IDCOME, V_CDCOMERCIAL, 'DFS');
            ELSE
               UPDATE LANCCTBTEMP
                  SET VRLANCCTBTEMP = VRLANCCTBTEMP + C_PRODUTORECEITA.VRDESCITEM
                WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                  AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                  AND CDCONTCTBL = V_CDCONTPROD
                  AND NRSEQCTBTEMP = V_NRSEQLANC;
            END IF;

            IF V_CONTCCUS <> 'N' THEN
               BUSCA_TPCOMERCIAL(V_CDCONTPROD, V_IDCOME, V_IDCCUS);
               IF V_IDCCUS <> 'O' THEN
                  V_CDCENTCUST := BUSCA_CCUSTO(C_NOTAFISCAL.CDFILIEMIT, C_NOTAFISCAL.CDEMPRESA);
                  BEGIN
                     SELECT COUNT(*), L.NRSEQCTBTEMP
                       INTO V_COUNT, V_NRSEQLANC
                       FROM LANCCTBTEMP L, RATECTBTEMP R
                      WHERE L.NRLANCCTBTEMP = P_NRLANCTBTEMP
                        AND L.CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                        AND L.CDCONTCTBL = V_CDCONTPROD
                        AND L.NRSEQCTBTEMP = R.NRSEQCTBTEMP
                        AND L.NRLANCCTBTEMP = R.NRLANCCTBTEMP
                        AND L.CDEMPRESA = R.CDEMPRESA
                        AND R.CDFILIAL = C_NOTAFISCAL.CDFILIEMIT
                        AND R.CDCENTCUST = V_CDCENTCUST
                      GROUP BY L.NRSEQCTBTEMP;
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN
                        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_NRSEQLANC), 5, '0'), C_NOTAFISCAL.CDFILIEMIT,
                         V_CDCENTCUST, C_PRODUTORECEITA.VRDESCITEM, C_NOTAFISCAL.DTEMISSAO, '00001');
                   ELSE
                      UPDATE RATECTBTEMP
                         SET VRRATECTBTEMP = VRRATECTBTEMP + C_PRODUTORECEITA.VRDESCITEM
                       WHERE CDEMPRESA = C_NOTAFISCAL.CDEMPRESA
                         AND NRLANCCTBTEMP = P_NRLANCTBTEMP
                         AND NRSEQCTBTEMP = V_NRSEQLANC
                         AND CDFILIAL = C_NOTAFISCAL.CDFILIEMIT
                         AND CDCENTCUST = V_CDCENTCUST;
                  END IF;
               END IF;
            END IF;
         END IF;
         V_INPARTIDA := V_INPARTIDA + 1;
         V_CDCONTPROD := '';
      END LOOP;
   END LOOP;
END;
/

