CREATE OR REPLACE PROCEDURE ATUALIZA_QTRELAC_ITNFORIGEM(
   P_CDFILIAL    IN NOTAFISCAL.CDFILIAL%TYPE,
   P_NRLANCTONF  IN NOTAFISCAL.NRLANCTONF%TYPE,
   P_NRSEQITPROD IN ITEMPRODUTO.NRSEQITPROD%TYPE,
   P_VRDIFERENCA IN ITEMPRODUTO.QTITEMPROD%TYPE,
   P_IDSTATUS    IN NOTAFISCAL.IDTPIJURNF%TYPE,
   P_DELETANF    IN VARCHAR2 DEFAULT 'N')
AS
   V_IDOPERDEVONF   CHAR(1);
   w_S              CHAR(1) := 'S';
   w_N              CHAR(1) := 'N';
   V_QTLANCPRODNF   FLOAT;
   V_QTJADEVOLVIDA  FLOAT;
   V_IDNFESTCANC    CHAR(1);
BEGIN
   BEGIN
      SELECT IDOPERDEVONF, IDNFESTCANC
      INTO V_IDOPERDEVONF, V_IDNFESTCANC
      FROM TIPOOPERAC T, NOTAFISCAL N
      WHERE
         (N.CDFILIAL     = P_CDFILIAL)      AND
         (N.NRLANCTONF   = P_NRLANCTONF)    AND
         (T.IDENTRSAIDOP = N.IDENTRSAIDOP)  AND
         (T.CDTIPOOPER   = N.CDTIPOOPER);
   EXCEPTION
      WHEN No_Data_Found THEN
          V_IDOPERDEVONF := w_N;
   END;

   /* Se utiliza Documento Origem */
   IF V_IDOPERDEVONF = w_S THEN

      IF P_IDSTATUS <> 'E' THEN
         /* Verifica os itens da nota fiscal */
         FOR C_NF IN
            (SELECT CDPRODUTO, VRUNITITEM, CDPRODEMIS, DSPRODEMIS,
                    SUM(QTITEMPROD) AS QTITPRODSUBS,
                    NVL(NRLOTEESTQ, ' ') AS NRLOTE,
                    NVL(NRSUBLOTE, ' ') AS NRSUBLOTE
             FROM ITEMPRODUTO
             WHERE
                (CDFILIAL    = P_CDFILIAL)    AND
                (NRLANCTONF  = P_NRLANCTONF)  AND
                (NRSEQITPROD = P_NRSEQITPROD)
             GROUP BY CDPRODUTO, VRUNITITEM, CDPRODEMIS, DSPRODEMIS, NVL(NRLOTEESTQ, ' '), NVL(NRSUBLOTE, ' ')
             )
         LOOP
            /* Se estiver incluindo produto na NF de Substituicao */
            IF P_IDSTATUS = 'I' THEN

               V_QTLANCPRODNF := C_NF.QTITPRODSUBS;

               /* Verifica a qtde do produto das notas fiscais de origem referente ao estorno */
               IF V_IDNFESTCANC = 'S' THEN
                  FOR C_NFORIG IN (SELECT I.CDFILIAL, I.NRLANCTONF
                                     FROM ITEMNOTAFISC N, ITEMNOTAFISC I
                                    WHERE N.CDFILIAL   = P_CDFILIAL
                                      AND N.NRLANCTONF = P_NRLANCTONF
                                      AND I.CDFILIAL   = N.CDFILIALIT
                                      AND I.NRLANCTONF = N.NRLANCTONFIT)
                  LOOP
                     FOR C_NFRELAC IN (SELECT N.CDFILIALIT, N.NRLANCTONFIT, N.NRSEQUITNOTA, I.CDPRODUTO,
                                              I.VRUNITITEM, I.CDPRODEMIS, I.DSPRODEMIS, SUM(I.QTITEMPROD) AS QTITEMPROD,
                                              NVL(SUM(I.QTITRELACNFSUBS),0) AS QTITRELACNFSUBS
                                         FROM ITEMNOTAFISC N, ITEMPRODUTO I
                                        WHERE
                                            (N.CDFILIAL   = C_NFORIG.CDFILIAL)   AND
                                            (N.NRLANCTONF = C_NFORIG.NRLANCTONF) AND
                                            (I.CDFILIAL   = N.CDFILIALIT)        AND
                                            (I.NRLANCTONF = N.NRLANCTONFIT)      AND
                                            (I.CDPRODUTO  = C_NF.CDPRODUTO)      AND
                                            (I.VRUNITITEM = C_NF.VRUNITITEM)
                                        GROUP BY
                                            N.CDFILIALIT, N.NRLANCTONFIT, N.NRSEQUITNOTA, I.CDPRODUTO,
                                            I.VRUNITITEM, I.CDPRODEMIS, I.DSPRODEMIS
                                         ORDER BY N.NRSEQUITNOTA)
                     LOOP
                        /* Se a qtde. do produto da nota fiscal de origem for maior que o saldo referente a qtde. do produto na nf */
                        IF C_NFRELAC.QTITRELACNFSUBS >= V_QTLANCPRODNF THEN
                            UPDATE ITEMPRODUTO
                            SET QTITRELACNFSUBS = C_NFRELAC.QTITRELACNFSUBS - V_QTLANCPRODNF
                            WHERE
                               (CDFILIAL   = C_NFRELAC.CDFILIALIT)   AND
                               (NRLANCTONF = C_NFRELAC.NRLANCTONFIT) AND
                               (CDPRODUTO  = C_NFRELAC.CDPRODUTO)    AND
                               (VRUNITITEM = C_NFRELAC.VRUNITITEM)   AND
                               (CDPRODEMIS = C_NFRELAC.CDPRODEMIS)   AND
                               (DSPRODEMIS = C_NFRELAC.DSPRODEMIS);

                            V_QTLANCPRODNF := 0;
                        ELSE
                            UPDATE ITEMPRODUTO
                            SET QTITRELACNFSUBS = 0
                            WHERE
                               (CDFILIAL   = C_NFRELAC.CDFILIALIT)   AND
                               (NRLANCTONF = C_NFRELAC.NRLANCTONFIT) AND
                               (CDPRODUTO  = C_NFRELAC.CDPRODUTO)    AND
                               (VRUNITITEM = C_NFRELAC.VRUNITITEM)   AND
                               (CDPRODEMIS = C_NFRELAC.CDPRODEMIS)   AND
                               (DSPRODEMIS = C_NFRELAC.DSPRODEMIS);

                            V_QTLANCPRODNF := V_QTLANCPRODNF - C_NFRELAC.QTITRELACNFSUBS;
                        END IF;
                     END LOOP;
                  END LOOP;
               ELSE
                  /* Verifica a qtde do produto nas notas fiscais de origem */
                  FOR C_NFRELAC IN
                      (SELECT N.CDFILIALIT, N.NRLANCTONFIT, N.NRSEQUITNOTA, I.CDPRODUTO,
                              I.VRUNITITEM, I.CDPRODEMIS, I.DSPRODEMIS, SUM(I.QTITEMPROD) AS QTITEMPROD,
                              NVL(SUM(I.QTITRELACNFSUBS),0) AS QTITRELACNFSUBS,
                              NVL(I.NRLOTEESTQ, ' ') AS NRLOTE,
                              NVL(I.NRSUBLOTE, ' ') AS NRSUBLOTE
                       FROM ITEMNOTAFISC N, ITEMPRODUTO I
                       WHERE
                          (N.CDFILIAL   = P_CDFILIAL)      AND
                          (N.NRLANCTONF = P_NRLANCTONF)    AND
                          (I.CDFILIAL   = N.CDFILIALIT)    AND
                          (I.NRLANCTONF = N.NRLANCTONFIT)  AND
                          (I.CDPRODUTO  = C_NF.CDPRODUTO)  AND
                          (I.VRUNITITEM = C_NF.VRUNITITEM) AND
                          (I.CDPRODEMIS = C_NF.CDPRODEMIS) AND
                          (I.DSPRODEMIS = C_NF.DSPRODEMIS) AND
                          (NVL(I.NRLOTEESTQ, ' ') = C_NF.NRLOTE)   AND
                          (NVL(I.NRSUBLOTE, ' ')  = C_NF.NRSUBLOTE)
                       GROUP BY
                          N.CDFILIALIT, N.NRLANCTONFIT, N.NRSEQUITNOTA, I.CDPRODUTO,
                          I.VRUNITITEM, I.CDPRODEMIS, I.DSPRODEMIS, NVL(I.NRLOTEESTQ, ' '), NVL(I.NRSUBLOTE, ' ')
                       ORDER BY N.NRSEQUITNOTA)
                  LOOP
                     /* Se a qtde. do produto da nota fiscal de origem for maior que o saldo referente a qtde. do produto na nf */
                     IF (C_NFRELAC.QTITEMPROD >= (V_QTLANCPRODNF + C_NFRELAC.QTITRELACNFSUBS)) THEN
                        UPDATE ITEMPRODUTO
                        SET QTITRELACNFSUBS = (V_QTLANCPRODNF + C_NFRELAC.QTITRELACNFSUBS)
                        WHERE
                           (CDFILIAL   = C_NFRELAC.CDFILIALIT)   AND
                           (NRLANCTONF = C_NFRELAC.NRLANCTONFIT) AND
                           (CDPRODUTO  = C_NFRELAC.CDPRODUTO)    AND
                           (VRUNITITEM = C_NFRELAC.VRUNITITEM)   AND
                           (CDPRODEMIS = C_NFRELAC.CDPRODEMIS)   AND
                           (DSPRODEMIS = C_NFRELAC.DSPRODEMIS)   AND
                           (NVL(NRLOTEESTQ, ' ') = C_NFRELAC.NRLOTE) AND
                           (NVL(NRSUBLOTE, ' ')  = C_NFRELAC.NRSUBLOTE);

                        V_QTLANCPRODNF := (V_QTLANCPRODNF - (V_QTLANCPRODNF + C_NFRELAC.QTITRELACNFSUBS));
                     ELSE
                        UPDATE ITEMPRODUTO
                        SET QTITRELACNFSUBS = QTITEMPROD
                        WHERE
                           (CDFILIAL   = C_NFRELAC.CDFILIALIT)   AND
                           (NRLANCTONF = C_NFRELAC.NRLANCTONFIT) AND
                           (CDPRODUTO  = C_NFRELAC.CDPRODUTO)    AND
                           (VRUNITITEM = C_NFRELAC.VRUNITITEM)   AND
                           (CDPRODEMIS = C_NFRELAC.CDPRODEMIS)   AND
                           (DSPRODEMIS = C_NFRELAC.DSPRODEMIS)   AND
                           (NVL(NRLOTEESTQ, ' ') = C_NFRELAC.NRLOTE)   AND
                           (NVL(NRSUBLOTE, ' ')  = C_NFRELAC.NRSUBLOTE);

                        IF V_QTLANCPRODNF >= V_QTLANCPRODNF - C_NFRELAC.QTITEMPROD THEN
                           V_QTLANCPRODNF := V_QTLANCPRODNF - C_NFRELAC.QTITEMPROD;
                        END IF;
                     END IF;
                  END LOOP;
               END IF;
            ELSE
               /* Se estiver alterando produto na NF de Substituicao */
               IF P_IDSTATUS = 'A' THEN
                  /* Somente para nota fiscais que nao sao de estorno */
                  IF V_IDNFESTCANC <> 'S' THEN
                     IF P_VRDIFERENCA <> 0 THEN
                        V_QTLANCPRODNF := P_VRDIFERENCA;

                        /*Verifica a qtde do produto nas notas de devolucao ja relacionadas a mesma origem*/
                        SELECT NVL(SUM(IT.QTITEMPROD),0) QTITEMPROD
                          INTO V_QTJADEVOLVIDA
                          FROM ITEMNOTAFISC I, ITEMNOTAFISC II, ITEMPRODUTO IT
                         WHERE I.CDFILIAL = P_CDFILIAL
                           AND I.NRLANCTONF = P_NRLANCTONF
                           AND I.CDFILIALIT = II.CDFILIALIT
                           AND I.NRLANCTONFIT = II.NRLANCTONFIT
                           AND II.CDFILIAL||II.NRLANCTONF <> P_CDFILIAL||P_NRLANCTONF
                           AND II.CDFILIAL = IT.CDFILIAL
                           AND II.NRLANCTONF = IT.NRLANCTONF
                           AND IT.CDPRODUTO = C_NF.CDPRODUTO
                           AND IT.VRUNITITEM = C_NF.VRUNITITEM
                           AND IT.CDPRODEMIS = C_NF.CDPRODEMIS
                           AND IT.DSPRODEMIS = C_NF.DSPRODEMIS
                           AND (NVL(IT.NRLOTEESTQ, ' ') = C_NF.NRLOTE)
                           AND (NVL(IT.NRSUBLOTE, ' ')  = C_NF.NRSUBLOTE);

                        FOR C_NFRELAC IN
                            (SELECT N.CDFILIALIT, N.NRLANCTONFIT, N.NRSEQUITNOTA, I.CDPRODUTO,
                                    I.VRUNITITEM, I.CDPRODEMIS, I.DSPRODEMIS, SUM(I.QTITEMPROD) AS QTITEMPROD,
                                    NVL(SUM(I.QTITRELACNFSUBS),0) AS QTITRELACNFSUBS,
                                    NVL(I.NRLOTEESTQ, ' ') AS NRLOTE,
                                    NVL(I.NRSUBLOTE, ' ') AS NRSUBLOTE
                             FROM ITEMNOTAFISC N, ITEMPRODUTO I
                             WHERE
                                (N.CDFILIAL   = P_CDFILIAL)      AND
                                (N.NRLANCTONF = P_NRLANCTONF)    AND
                                (I.CDFILIAL   = N.CDFILIALIT)    AND
                                (I.NRLANCTONF = N.NRLANCTONFIT)  AND
                                (I.CDPRODUTO  = C_NF.CDPRODUTO)  AND
                                (I.VRUNITITEM = C_NF.VRUNITITEM) AND
                                (I.CDPRODEMIS = C_NF.CDPRODEMIS) AND
                                (I.DSPRODEMIS = C_NF.DSPRODEMIS) AND
                                (NVL(I.NRLOTEESTQ, ' ') = C_NF.NRLOTE) AND
                                (NVL(I.NRSUBLOTE, ' ')  = C_NF.NRSUBLOTE)
                             GROUP BY
                                N.CDFILIALIT, N.NRLANCTONFIT, N.NRSEQUITNOTA, I.CDPRODUTO,
                                I.VRUNITITEM, I.CDPRODEMIS, I.DSPRODEMIS,
                                NVL(I.NRLOTEESTQ, ' '), NVL(I.NRSUBLOTE, ' ')
                             ORDER BY N.NRSEQUITNOTA)
                        LOOP

                            /* Se a qtde. do produto da nota fiscal de origem for maior que o saldo referente a qtde. do produto na nf */

                           IF (C_NFRELAC.QTITEMPROD >= (V_QTLANCPRODNF+ C_NFRELAC.QTITRELACNFSUBS)) THEN
                              IF V_QTLANCPRODNF > 0 THEN

                                 UPDATE ITEMPRODUTO
                                 SET QTITRELACNFSUBS = V_QTLANCPRODNF + C_NFRELAC.QTITRELACNFSUBS
                                 WHERE
                                    (CDFILIAL   = C_NFRELAC.CDFILIALIT)   AND
                                    (NRLANCTONF = C_NFRELAC.NRLANCTONFIT) AND
                                    (CDPRODUTO  = C_NFRELAC.CDPRODUTO)    AND
                                    (VRUNITITEM = C_NFRELAC.VRUNITITEM)   AND
                                    (CDPRODEMIS = C_NFRELAC.CDPRODEMIS)   AND
                                    (DSPRODEMIS = C_NFRELAC.DSPRODEMIS)   AND
                                    (NVL(NRLOTEESTQ, ' ') = C_NFRELAC.NRLOTE)  AND
                                    (NVL(NRSUBLOTE, ' ')  = C_NFRELAC.NRSUBLOTE);

                                 V_QTLANCPRODNF :=  (ABS(V_QTLANCPRODNF) - (V_QTJADEVOLVIDA + C_NFRELAC.QTITRELACNFSUBS+ V_QTLANCPRODNF));
                              ELSE
                                 UPDATE ITEMPRODUTO
                                 SET QTITRELACNFSUBS = QTITRELACNFSUBS + V_QTLANCPRODNF
                                 WHERE
                                    (CDFILIAL   = C_NFRELAC.CDFILIALIT)   AND
                                    (NRLANCTONF = C_NFRELAC.NRLANCTONFIT) AND
                                    (CDPRODUTO  = C_NFRELAC.CDPRODUTO)    AND
                                    (VRUNITITEM = C_NFRELAC.VRUNITITEM)   AND
                                    (CDPRODEMIS = C_NFRELAC.CDPRODEMIS)   AND
                                    (DSPRODEMIS = C_NFRELAC.DSPRODEMIS)   AND
                                    (NVL(NRLOTEESTQ, ' ') = C_NFRELAC.NRLOTE)  AND
                                    (NVL(NRSUBLOTE, ' ')  = C_NFRELAC.NRSUBLOTE);

                                 IF V_QTLANCPRODNF >= V_QTLANCPRODNF - C_NFRELAC.QTITEMPROD THEN
                                    V_QTLANCPRODNF := V_QTLANCPRODNF - C_NFRELAC.QTITEMPROD;
                                 END IF;
                              END IF;
                           ELSE
                              IF V_QTLANCPRODNF < 0 THEN

                                 UPDATE ITEMPRODUTO
                                    SET QTITRELACNFSUBS = QTITRELACNFSUBS + V_QTLANCPRODNF
                                  WHERE
                                       (CDFILIAL   = C_NFRELAC.CDFILIALIT)    AND
                                       (NRLANCTONF = C_NFRELAC.NRLANCTONFIT)  AND
                                       (CDPRODUTO  = C_NFRELAC.CDPRODUTO)     AND
                                       (VRUNITITEM = C_NFRELAC.VRUNITITEM)    AND
                                       (CDPRODEMIS = C_NFRELAC.CDPRODEMIS)    AND
                                       (DSPRODEMIS = C_NFRELAC.DSPRODEMIS)    AND
                                       (NVL(NRLOTEESTQ, ' ') = C_NFRELAC.NRLOTE) AND
                                       (NVL(NRSUBLOTE, ' ')  = C_NFRELAC.NRSUBLOTE);

                                  V_QTLANCPRODNF := V_QTLANCPRODNF - V_QTLANCPRODNF;
                              END IF;
                           END IF;
                        END LOOP;
                     END IF;
                  END IF;
               END IF;
            END IF;
         END LOOP;
      ELSE
        FOR C_NF IN
           (SELECT CDPRODUTO, VRUNITITEM, CDPRODEMIS, DSPRODEMIS, SUM(QTITEMPROD) AS QTITPRODSUBS,
                    NVL(NRLOTEESTQ, ' ') AS NRLOTE,
                    NVL(NRSUBLOTE, ' ') AS NRSUBLOTE
              FROM ITEMPRODUTO
             WHERE
               (CDFILIAL    = P_CDFILIAL)   AND
               (NRLANCTONF  = P_NRLANCTONF) AND
               (((NRSEQITPROD = P_NRSEQITPROD) AND (P_DELETANF = 'N')) OR (P_DELETANF = 'S'))
            GROUP BY CDPRODUTO, VRUNITITEM, CDPRODEMIS, DSPRODEMIS, NVL(NRLOTEESTQ, ' '), NVL(NRSUBLOTE, ' ')
            ORDER BY CDPRODUTO)
        LOOP
           /* Se estiver excluindo produto na NF de Substituicao */
           V_QTLANCPRODNF := C_NF.QTITPRODSUBS;

           /* Verifica a qtde do produto das notas fiscais de origem referente ao estorno */
           IF V_IDNFESTCANC = 'S' THEN
              FOR C_NFORIG IN (SELECT I.CDFILIAL, I.NRLANCTONF
                                 FROM ITEMNOTAFISC N, ITEMNOTAFISC I
                                WHERE N.CDFILIAL   = P_CDFILIAL
                                  AND N.NRLANCTONF = P_NRLANCTONF
                                  AND I.CDFILIAL   = N.CDFILIALIT
                                  AND I.NRLANCTONF = N.NRLANCTONFIT)
              LOOP
                 FOR C_NFRELAC IN
                   (SELECT N.CDFILIALIT, N.NRLANCTONFIT, N.NRSEQUITNOTA, I.CDPRODUTO,
                           I.VRUNITITEM, I.CDPRODEMIS, I.DSPRODEMIS, SUM(I.QTITEMPROD) AS QTITEMPROD,
                           NVL(SUM(I.QTITRELACNFSUBS),0) AS QTITRELACNFSUBS
                    FROM ITEMNOTAFISC N, ITEMPRODUTO I
                    WHERE
                       (N.CDFILIAL   = C_NFORIG.CDFILIAL)   AND
                       (N.NRLANCTONF = C_NFORIG.NRLANCTONF) AND
                       (I.CDFILIAL   = N.CDFILIALIT)        AND
                       (I.NRLANCTONF = N.NRLANCTONFIT)      AND
                       (I.CDPRODUTO  = C_NF.CDPRODUTO)      AND
                       (I.VRUNITITEM = C_NF.VRUNITITEM)    
                    GROUP BY
                       N.CDFILIALIT, N.NRLANCTONFIT, N.NRSEQUITNOTA, I.CDPRODUTO,
                       I.VRUNITITEM, I.CDPRODEMIS, I.DSPRODEMIS
                    ORDER BY N.NRSEQUITNOTA DESC)
                 LOOP
                    IF (C_NFRELAC.QTITEMPROD >= (V_QTLANCPRODNF + C_NFRELAC.QTITRELACNFSUBS)) THEN
                       UPDATE ITEMPRODUTO
                       SET QTITRELACNFSUBS = (V_QTLANCPRODNF + C_NFRELAC.QTITRELACNFSUBS)
                       WHERE
                          (CDFILIAL   = C_NFRELAC.CDFILIALIT)   AND
                          (NRLANCTONF = C_NFRELAC.NRLANCTONFIT) AND
                          (CDPRODUTO  = C_NFRELAC.CDPRODUTO)    AND
                          (VRUNITITEM = C_NFRELAC.VRUNITITEM)   AND
                          (CDPRODEMIS = C_NFRELAC.CDPRODEMIS)   AND
                          (DSPRODEMIS = C_NFRELAC.DSPRODEMIS);

                       V_QTLANCPRODNF := (V_QTLANCPRODNF - (V_QTLANCPRODNF + C_NFRELAC.QTITRELACNFSUBS));
                    ELSE
                       UPDATE ITEMPRODUTO
                       SET QTITRELACNFSUBS = QTITEMPROD
                       WHERE
                          (CDFILIAL   = C_NFRELAC.CDFILIALIT)   AND
                          (NRLANCTONF = C_NFRELAC.NRLANCTONFIT) AND
                          (CDPRODUTO  = C_NFRELAC.CDPRODUTO)    AND
                          (VRUNITITEM = C_NFRELAC.VRUNITITEM)   AND
                          (CDPRODEMIS = C_NFRELAC.CDPRODEMIS)   AND
                          (DSPRODEMIS = C_NFRELAC.DSPRODEMIS);

                       IF V_QTLANCPRODNF >= V_QTLANCPRODNF - C_NFRELAC.QTITEMPROD THEN
                          V_QTLANCPRODNF := V_QTLANCPRODNF - C_NFRELAC.QTITEMPROD;
                       END IF;
                    END IF;
                 END LOOP;
              END LOOP;
           ELSE
              FOR C_NFRELAC IN/* LUCAS PRIMO*/
                (SELECT N.CDFILIALIT, N.NRLANCTONFIT, N.NRSEQUITNOTA, I.CDPRODUTO,
                        I.VRUNITITEM, I.CDPRODEMIS, I.DSPRODEMIS, SUM(I.QTITEMPROD) AS QTITEMPROD,
                        NVL(SUM(I.QTITRELACNFSUBS),0) AS QTITRELACNFSUBS,
                        NVL(I.NRLOTEESTQ, ' ') AS NRLOTE,
                        NVL(I.NRSUBLOTE, ' ') AS NRSUBLOTE
                 FROM ITEMNOTAFISC N, ITEMPRODUTO I
                 WHERE
                    (N.CDFILIAL   = P_CDFILIAL)      AND
                    (N.NRLANCTONF = P_NRLANCTONF)    AND
                    (I.CDFILIAL   = N.CDFILIALIT)    AND
                    (I.NRLANCTONF = N.NRLANCTONFIT)  AND
                    (I.CDPRODUTO  = C_NF.CDPRODUTO)  AND
                    (I.VRUNITITEM = C_NF.VRUNITITEM) AND
                    (I.CDPRODEMIS = C_NF.CDPRODEMIS) AND
                    (I.DSPRODEMIS = C_NF.DSPRODEMIS) AND
                    (NVL(I.NRLOTEESTQ, ' ') = C_NF.NRLOTE) AND
                    (NVL(I.NRSUBLOTE, ' ')  = C_NF.NRSUBLOTE)
                 GROUP BY
                    N.CDFILIALIT, N.NRLANCTONFIT, N.NRSEQUITNOTA, I.CDPRODUTO,
                    I.VRUNITITEM, I.CDPRODEMIS, I.DSPRODEMIS,
                    NVL(I.NRLOTEESTQ, ' '), NVL(I.NRSUBLOTE, ' ')
                 ORDER BY N.NRSEQUITNOTA DESC)
              LOOP
                 IF C_NFRELAC.QTITRELACNFSUBS >= V_QTLANCPRODNF THEN
                     UPDATE ITEMPRODUTO
                     SET QTITRELACNFSUBS = C_NFRELAC.QTITRELACNFSUBS - V_QTLANCPRODNF
                     WHERE
                        (CDFILIAL   = C_NFRELAC.CDFILIALIT)   AND
                        (NRLANCTONF = C_NFRELAC.NRLANCTONFIT) AND
                        (CDPRODUTO  = C_NFRELAC.CDPRODUTO)    AND
                        (VRUNITITEM = C_NFRELAC.VRUNITITEM)   AND
                        (CDPRODEMIS = C_NFRELAC.CDPRODEMIS)   AND
                        (DSPRODEMIS = C_NFRELAC.DSPRODEMIS)   AND
                        (NVL(NRLOTEESTQ, ' ') = C_NFRELAC.NRLOTE)  AND
                        (NVL(NRSUBLOTE, ' ')  = C_NFRELAC.NRSUBLOTE);

                     V_QTLANCPRODNF := 0;
                 ELSE
                     UPDATE ITEMPRODUTO
                     SET QTITRELACNFSUBS = 0
                     WHERE
                        (CDFILIAL   = C_NFRELAC.CDFILIALIT)   AND
                        (NRLANCTONF = C_NFRELAC.NRLANCTONFIT) AND
                        (CDPRODUTO  = C_NFRELAC.CDPRODUTO)    AND
                        (VRUNITITEM = C_NFRELAC.VRUNITITEM)   AND
                        (CDPRODEMIS = C_NFRELAC.CDPRODEMIS)   AND
                        (DSPRODEMIS = C_NFRELAC.DSPRODEMIS)   AND
                        (NVL(NRLOTEESTQ, ' ') = C_NFRELAC.NRLOTE)  AND
                        (NVL(NRSUBLOTE, ' ')  = C_NFRELAC.NRSUBLOTE);

                     V_QTLANCPRODNF := V_QTLANCPRODNF - C_NFRELAC.QTITRELACNFSUBS;
                 END IF;
              END LOOP;
           END IF;
        END LOOP;
      END IF;
   END IF;
END;
/