CREATE OR REPLACE PROCEDURE GRAVA_RELAC_XML_AF(
   P_NRACESSONFE  IN NOTAFISCAL.NRACESSONFE%TYPE,
   P_FILIDEST     IN NOTAFISCAL.CDFILIAL%TYPE,
   P_NRSEQITPROD  IN VARCHAR2,
   P_CDPRODUTO    IN VARCHAR2,
   P_QTITEMPROD   IN FLOAT,
   P_RETORNO      OUT VARCHAR2
   )
AS
   V_IDFUNCAOFILI   VARCHAR2(01);
   V_IDCONSVRMENOR  VARCHAR2(01);
   V_TOLPERMITIDA   NUMBER;
   V_QTITEMPRODAF   NUMBER;
   V_CDPRODUTOAF    VARCHAR2(20);

BEGIN
   BEGIN
      SELECT NVL(MAX(IDFUNCAOFILI), 'F') AS IDFUNCAOFILI
        INTO V_IDFUNCAOFILI
        FROM FILIAL
       WHERE CDFILIAL = P_FILIDEST;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_IDFUNCAOFILI := 'F';
   END;

   IF (P_NRSEQITPROD = 'N') THEN  /*Relacionamento para todos os itens do arquivo XML*/

      /*Exclui os produtos do arquivo XML da tabela de relacionamento com as AF's que ja estavam relacionados*/
      DELETE
        FROM INTG_ITEMAF
       WHERE NRACESSONFE = P_NRACESSONFE;

      /*Retorna apenas produtos que ja possuem relacionamento (Relacionamento de Produto x Produto XML)
         Ordenando pela quantidade para tentar relacionar os produtos de acordo com a quantidade considerando o fator de conversao considerando a quantidade do produto do XML igual da AF*/

      FOR C_PRODRELACESTO IN(SELECT PF.CDPRODUTOXML, PF.CDPRODUTO AS CDPRODUTORELAC,
                                    IP.VRUNITITEM, IP.QTITEMPROD, PF.CDMARCAREL, PR.VRFATOCONV AS VRFATOCONVNF,
                                    (IP.VRUNITITEM / PR.VRFATOCONV) AS VRUNITCONV, PR.CDPRODESTO,
                                    IP.NRSEQITPROD
                               FROM INTG_ITEMPRODUTO IP, PRODFORNXML PF, INTG_NOTAFISCAL NF, PRODUTO PR
                              WHERE IP.NRACESSONFE  = P_NRACESSONFE
                                AND PF.CDPRODUTOXML = IP.CDPRODUTO
                                AND PF.CDFORNECED   = NF.CDFORNECED
                                AND NF.NRACESSONFE  = IP.NRACESSONFE
                                AND PR.CDPRODUTO    = PF.CDPRODUTO
                                AND V_IDFUNCAOFILI <> 'O'
                                AND NOT EXISTS(SELECT 1
                                                 FROM INTG_ITEMAF II
                                                WHERE NRACESSONFE     = P_NRACESSONFE
                                                  AND II.CDPRODUTOXML = IP.CDPRODUTO
                                                  AND II.NRACESSONFE  = IP.NRACESSONFE
                                                  AND II.NRSEQITPROD  = IP.NRSEQITPROD)
                              UNION ALL
                             SELECT PF.CDPRODUTOXML, PF.CDPRODUTO AS CDPRODUTORELAC,
                                    IP.VRUNITITEM, IP.QTITEMPROD, PF.CDMARCAREL, PR.VRFATOCONV AS VRFATOCONVNF,
                                    (IP.VRUNITITEM / PR.VRFATOCONV) AS VRUNITCONV, PR.CDPRODESTO,
                                    IP.NRSEQITPROD
                               FROM INTG_ITEMPRODUTO IP, PRODFORNXML PF, INTG_NOTAFISCAL NF, PRODUTO PR,
                                    RELACPRODOL R
                              WHERE IP.NRACESSONFE  = P_NRACESSONFE
                                AND PF.CDPRODUTOXML = IP.CDPRODUTO
                                AND PF.CDFORNECED   = NF.CDFORNECED
                                AND R.CDPRARVORIG   = PF.CDPRODUTO
                                AND R.CDPRODARVOL   = PR.CDPRODUTO
                                AND NF.NRACESSONFE  = IP.NRACESSONFE
                                AND V_IDFUNCAOFILI = 'O'
                                AND NOT EXISTS(SELECT 1
                                                 FROM INTG_ITEMAF II
                                                WHERE NRACESSONFE     = P_NRACESSONFE
                                                  AND II.CDPRODUTOXML = IP.CDPRODUTO
                                                  AND II.NRACESSONFE  = IP.NRACESSONFE
                                                  AND II.NRSEQITPROD  = IP.NRSEQITPROD)
                              ORDER BY QTITEMPROD, CDPRODUTORELAC, NRSEQITPROD
      ) LOOP
         /*Af's selecionadas para relacionamento aos itens do XML*/
         FOR C_AFS_SELCIONADAS IN (SELECT LPAD(NRAUTOFORN, 10 ,'0') AS NRAUTOFORN
                                     FROM RELACXMLAF
                                    WHERE NRACESSONFE = P_NRACESSONFE
                                    ORDER BY NRAUTOFORN)

         LOOP
            /*Verifica tolerancia permitida}*/
            SELECT NVL(MAX(PG.IDCONSVLRMENAF), 'N') AS IDCONSVALORMENOR,
                   NVL(MAX(PF.VRPTOLVRITAF), NVL(MAX(PG.VRPETOLEVRAF), 0.00)) AS TOLERPERMITIDA
              INTO V_IDCONSVRMENOR, V_TOLPERMITIDA
              FROM PARAMGERAL PG LEFT JOIN PRODFILI PF ON PF.CDPRODUTO = C_PRODRELACESTO.CDPRODUTORELAC
                                                      AND PF.CDFILIAL  = P_FILIDEST;

            /*Verifica se existe o mesmo produto de estoque relacionado na AF selecionada*/
            BEGIN
               SELECT MIN((QTPROGENTAF - NVL(QTEFETENTRAF, 0)))  AS QTITEMPRODAF, MIN(IT.CDPRODUTO) AS CDPRODUTO
                 INTO V_QTITEMPRODAF, V_CDPRODUTOAF
                 FROM ITEMAUTF IT, PRODUTO PR
                WHERE NRAUTOFORN    = C_AFS_SELCIONADAS.NRAUTOFORN
                  AND IT.CDPRODUTO  = PR.CDPRODUTO
                  AND PR.CDPRODESTO = C_PRODRELACESTO.CDPRODESTO
                  AND (ROUND(C_PRODRELACESTO.VRUNITITEM,5)   <= (ROUND(((VRPREUNIAF/PR.VRFATOCONV) * C_PRODRELACESTO.VRFATOCONVNF),5) +
                                                  ((ROUND(((VRPREUNIAF/PR.VRFATOCONV) * C_PRODRELACESTO.VRFATOCONVNF),5) * V_TOLPERMITIDA)/100)))
                  AND (((ROUND(C_PRODRELACESTO.VRUNITITEM,5) >= (ROUND(((VRPREUNIAF/PR.VRFATOCONV) * C_PRODRELACESTO.VRFATOCONVNF),5) -
                                                   ((ROUND(((VRPREUNIAF/PR.VRFATOCONV) * C_PRODRELACESTO.VRFATOCONVNF),5) * V_TOLPERMITIDA)/100))) AND
                                                   (V_IDCONSVRMENOR = 'N')) OR (V_IDCONSVRMENOR <> 'N'))
                  AND CDMARCA    = NVL(C_PRODRELACESTO.CDMARCAREL, CDMARCA)
                  AND (QTPROGENTAF - NVL(QTEFETENTRAF, 0)) > 0
                  AND ((QTPROGENTAF - NVL(QTEFETENTRAF, 0)) = ((C_PRODRELACESTO.QTITEMPROD * C_PRODRELACESTO.VRFATOCONVNF)/PR.VRFATOCONV))
                  AND (NOT EXISTS(SELECT 1
                                   FROM INTG_ITEMAF II
                                  WHERE NRACESSONFE    = P_NRACESSONFE
                                    AND II.CDPRODUTOAF = IT.CDPRODUTO
                                    AND II.NRAUTOFORNE = IT.NRAUTOFORN
                       )OR
                       EXISTS(SELECT 1
                                FROM INTG_ITEMAF II
                               WHERE NRACESSONFE    = P_NRACESSONFE
                                 AND II.CDPRODUTOAF = IT.CDPRODUTO
                                 AND II.NRAUTOFORNE = IT.NRAUTOFORN
                                 AND II.QTITEMPRODAF > (SELECT SUM(QTITEMPRODXML * NVL(VRFATOCONVXML, 1))/NVL(PR.VRFATOCONV, 1)
                                                         FROM INTG_ITEMAF I2
                                                        WHERE I2.NRAUTOFORNE = II.NRAUTOFORNE
                                                          AND I2.CDPRODUTOAF = II.CDPRODUTOAF
                                                        )
                             )
                      )
                ORDER BY QTITEMPRODAF, IT.CDPRODUTO;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_QTITEMPRODAF := NULL; V_CDPRODUTOAF := NULL;
            END;
            IF (V_QTITEMPRODAF IS NOT NULL) THEN
               /*Se existir o produto com mesmo produto de estoque com com marca/valor igual, insere relacionamento*/
               INSERT INTO
                 INTG_ITEMAF (NRACESSONFE,   NRSEQITPROD,   NRAUTOFORNE, CDPRODUTOXML,
                              QTITEMPRODXML, QTPRODBAIXADA, CDPRODUTOAF, QTITEMPRODAF,
                              VRFATOCONVXML)
                     VALUES  (P_NRACESSONFE,   C_PRODRELACESTO.NRSEQITPROD, C_AFS_SELCIONADAS.NRAUTOFORN, C_PRODRELACESTO.CDPRODUTOXML,
                              C_PRODRELACESTO.QTITEMPROD,    0,             V_CDPRODUTOAF, V_QTITEMPRODAF,
                              C_PRODRELACESTO.VRFATOCONVNF);

               UPDATE INTG_ITEMPRODUTO
                  SET NRAUTOFORN  = C_AFS_SELCIONADAS.NRAUTOFORN
                WHERE NRACESSONFE = P_NRACESSONFE
                  AND NRSEQITPROD = C_PRODRELACESTO.NRSEQITPROD;
            END IF;
         END LOOP;
      END LOOP;

      /*Retorna apenas produtos que ja possuem relacionamento (Relacionamento de Produto x Produto XML)
         Ordenando pela quantidade para tentar relacionar os produtos de acordo com a quantidade considerando o fator de conversao sem considerar a quantidade do produto do XML igual da AF*/
      FOR C_PRODRELACESTO IN(SELECT PF.CDPRODUTOXML, PF.CDPRODUTO AS CDPRODUTORELAC,
                                    IP.VRUNITITEM, IP.QTITEMPROD, PF.CDMARCAREL, PR.VRFATOCONV AS VRFATOCONVNF,
                                    (IP.VRUNITITEM / PR.VRFATOCONV) AS VRUNITCONV, PR.CDPRODESTO,
                                    IP.NRSEQITPROD
                               FROM INTG_ITEMPRODUTO IP, PRODFORNXML PF, INTG_NOTAFISCAL NF, PRODUTO PR
                              WHERE IP.NRACESSONFE  = P_NRACESSONFE
                                AND PF.CDPRODUTOXML = IP.CDPRODUTO
                                AND PF.CDFORNECED   = NF.CDFORNECED
                                AND NF.NRACESSONFE  = IP.NRACESSONFE
                                AND PR.CDPRODUTO    = PF.CDPRODUTO
                                AND V_IDFUNCAOFILI <> 'O'
                                AND NOT EXISTS(SELECT 1
                                                 FROM INTG_ITEMAF II
                                                WHERE NRACESSONFE     = P_NRACESSONFE
                                                  AND II.CDPRODUTOXML = IP.CDPRODUTO
                                                  AND II.NRACESSONFE  = IP.NRACESSONFE
                                                  AND II.NRSEQITPROD  = IP.NRSEQITPROD)
                              UNION ALL
                             SELECT PF.CDPRODUTOXML, PF.CDPRODUTO AS CDPRODUTORELAC,
                                    IP.VRUNITITEM, IP.QTITEMPROD, PF.CDMARCAREL, PR.VRFATOCONV AS VRFATOCONVNF,
                                    (IP.VRUNITITEM / PR.VRFATOCONV) AS VRUNITCONV, PR.CDPRODESTO,
                                    IP.NRSEQITPROD
                               FROM INTG_ITEMPRODUTO IP, PRODFORNXML PF, INTG_NOTAFISCAL NF, PRODUTO PR,
                                    RELACPRODOL R
                              WHERE IP.NRACESSONFE  = P_NRACESSONFE
                                AND PF.CDPRODUTOXML = IP.CDPRODUTO
                                AND PF.CDFORNECED   = NF.CDFORNECED
                                AND R.CDPRARVORIG   = PF.CDPRODUTO
                                AND R.CDPRODARVOL   = PR.CDPRODUTO
                                AND NF.NRACESSONFE  = IP.NRACESSONFE
                                AND V_IDFUNCAOFILI = 'O'
                                AND NOT EXISTS(SELECT 1
                                                 FROM INTG_ITEMAF II
                                                WHERE NRACESSONFE     = P_NRACESSONFE
                                                  AND II.CDPRODUTOXML = IP.CDPRODUTO
                                                  AND II.NRACESSONFE  = IP.NRACESSONFE
                                                  AND II.NRSEQITPROD  = IP.NRSEQITPROD)
                              ORDER BY QTITEMPROD, CDPRODUTORELAC, NRSEQITPROD
      ) LOOP
         /*Af's selecionadas para relacionamento aos itens do XML*/
         FOR C_AFS_SELCIONADAS IN (SELECT LPAD(NRAUTOFORN, 10 ,'0') AS NRAUTOFORN
                                     FROM RELACXMLAF
                                    WHERE NRACESSONFE = P_NRACESSONFE
                                    ORDER BY NRAUTOFORN)

         LOOP
            /*Verifica tolerancia permitida}*/
            SELECT NVL(MAX(PG.IDCONSVLRMENAF), 'N') AS IDCONSVALORMENOR,
                   NVL(MAX(PF.VRPTOLVRITAF), NVL(MAX(PG.VRPETOLEVRAF), 0.00)) AS TOLERPERMITIDA
              INTO V_IDCONSVRMENOR, V_TOLPERMITIDA
              FROM PARAMGERAL PG LEFT JOIN PRODFILI PF ON PF.CDPRODUTO = C_PRODRELACESTO.CDPRODUTORELAC
                                                      AND PF.CDFILIAL  = P_FILIDEST;

            /*Verifica se existe o mesmo produto de estoque relacionado na AF selecionada*/
            BEGIN
               SELECT MIN((QTPROGENTAF - NVL(QTEFETENTRAF, 0)))  AS QTITEMPRODAF, MIN(IT.CDPRODUTO) AS CDPRODUTO
                 INTO V_QTITEMPRODAF, V_CDPRODUTOAF
                 FROM ITEMAUTF IT, PRODUTO PR
                WHERE NRAUTOFORN    = C_AFS_SELCIONADAS.NRAUTOFORN
                  AND IT.CDPRODUTO  = PR.CDPRODUTO
                  AND PR.CDPRODESTO = C_PRODRELACESTO.CDPRODESTO
                  AND (ROUND(C_PRODRELACESTO.VRUNITITEM,5)   <= (ROUND(((VRPREUNIAF/PR.VRFATOCONV) * C_PRODRELACESTO.VRFATOCONVNF),5) +
                                                  ((ROUND(((VRPREUNIAF/PR.VRFATOCONV) * C_PRODRELACESTO.VRFATOCONVNF),5) * V_TOLPERMITIDA)/100)))
                  AND (((ROUND(C_PRODRELACESTO.VRUNITITEM,5) >= (ROUND(((VRPREUNIAF/PR.VRFATOCONV) * C_PRODRELACESTO.VRFATOCONVNF),5) -
                                                   ((ROUND(((VRPREUNIAF/PR.VRFATOCONV) * C_PRODRELACESTO.VRFATOCONVNF),5) * V_TOLPERMITIDA)/100))) AND
                                                   (V_IDCONSVRMENOR = 'N')) OR (V_IDCONSVRMENOR <> 'N'))
                  AND CDMARCA    = NVL(C_PRODRELACESTO.CDMARCAREL, CDMARCA)
                  AND (QTPROGENTAF - NVL(QTEFETENTRAF, 0)) > 0
                  AND (NOT EXISTS(SELECT 1
                                   FROM INTG_ITEMAF II
                                  WHERE NRACESSONFE    = P_NRACESSONFE
                                    AND II.CDPRODUTOAF = IT.CDPRODUTO
                                    AND II.NRAUTOFORNE = IT.NRAUTOFORN
                       )OR
                       EXISTS(SELECT 1
                                FROM INTG_ITEMAF II
                               WHERE NRACESSONFE    = P_NRACESSONFE
                                 AND II.CDPRODUTOAF = IT.CDPRODUTO
                                 AND II.NRAUTOFORNE = IT.NRAUTOFORN
                                 AND II.QTITEMPRODAF > (SELECT SUM(QTITEMPRODXML * NVL(VRFATOCONVXML, 1))/NVL(PR.VRFATOCONV, 1)
                                                         FROM INTG_ITEMAF I2
                                                        WHERE I2.NRAUTOFORNE = II.NRAUTOFORNE
                                                          AND I2.CDPRODUTOAF = II.CDPRODUTOAF
                                                        )
                             )
                      )
                ORDER BY QTITEMPRODAF, IT.CDPRODUTO;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_QTITEMPRODAF := NULL; V_CDPRODUTOAF := NULL;
            END;
            IF (V_QTITEMPRODAF IS NOT NULL) THEN
               /*Se existir o produto com mesmo produto de estoque com com marca/valor igual, insere relacionamento*/
               INSERT INTO
                 INTG_ITEMAF (NRACESSONFE,   NRSEQITPROD,   NRAUTOFORNE, CDPRODUTOXML,
                              QTITEMPRODXML, QTPRODBAIXADA, CDPRODUTOAF, QTITEMPRODAF,
                              VRFATOCONVXML)
                     VALUES  (P_NRACESSONFE,   C_PRODRELACESTO.NRSEQITPROD, C_AFS_SELCIONADAS.NRAUTOFORN, C_PRODRELACESTO.CDPRODUTOXML,
                              C_PRODRELACESTO.QTITEMPROD,    0,             V_CDPRODUTOAF, V_QTITEMPRODAF,
                              C_PRODRELACESTO.VRFATOCONVNF);

               UPDATE INTG_ITEMPRODUTO
                  SET NRAUTOFORN  = C_AFS_SELCIONADAS.NRAUTOFORN
                WHERE NRACESSONFE = P_NRACESSONFE
                  AND NRSEQITPROD = C_PRODRELACESTO.NRSEQITPROD;
            END IF;
         END LOOP;
      END LOOP;

      /*Retorna apenas produtos que ja possuem relacionamento (Relacionamento de Produto x Produto XML*/
      FOR C_PRODRELACAF IN (SELECT PF.CDPRODUTOXML, PF.CDPRODUTO AS CDPRODUTORELAC,
                                   IP.VRUNITITEM, IP.QTITEMPROD, PF.CDMARCAREL, PR.VRFATOCONV,
                                   (IP.VRUNITITEM / PR.VRFATOCONV) AS VRUNITCONV, IP.NRSEQITPROD
                              FROM INTG_ITEMPRODUTO IP, PRODFORNXML PF, INTG_NOTAFISCAL NF, PRODUTO PR
                             WHERE IP.NRACESSONFE  = P_NRACESSONFE
                               AND PF.CDPRODUTOXML = IP.CDPRODUTO
                               AND PF.CDFORNECED   = NF.CDFORNECED
                               AND NF.NRACESSONFE  = IP.NRACESSONFE
                               AND PR.CDPRODUTO    = PF.CDPRODUTO
                               AND V_IDFUNCAOFILI  <> 'O'
                               AND NOT EXISTS(SELECT 1
                                                FROM INTG_ITEMAF II
                                               WHERE NRACESSONFE     = P_NRACESSONFE
                                                 AND II.CDPRODUTOXML = IP.CDPRODUTO
                                                 AND II.NRACESSONFE  = IP.NRACESSONFE
                                                 AND II.NRSEQITPROD  = IP.NRSEQITPROD)

                             UNION ALL
                            SELECT PF.CDPRODUTOXML, PR.CDPRODUTO AS CDPRODUTORELAC,
                                   IP.VRUNITITEM, IP.QTITEMPROD, PF.CDMARCAREL, PR.VRFATOCONV,
                                   (IP.VRUNITITEM / PR.VRFATOCONV) AS VRUNITCONV, IP.NRSEQITPROD
                              FROM INTG_ITEMPRODUTO IP, PRODFORNXML PF, INTG_NOTAFISCAL NF, PRODUTO PR,
                                   RELACPRODOL R
                             WHERE IP.NRACESSONFE  = P_NRACESSONFE
                               AND PF.CDPRODUTOXML = IP.CDPRODUTO
                               AND R.CDPRARVORIG   = PF.CDPRODUTO
                               AND R.CDPRODARVOL   = PR.CDPRODUTO
                               AND PF.CDFORNECED   = NF.CDFORNECED
                               AND NF.NRACESSONFE  = IP.NRACESSONFE
                               AND V_IDFUNCAOFILI  = 'O'
                               AND NOT EXISTS(SELECT 1
                                                FROM INTG_ITEMAF II
                                               WHERE NRACESSONFE     = P_NRACESSONFE
                                                 AND II.CDPRODUTOXML = IP.CDPRODUTO
                                                 AND II.NRACESSONFE  = IP.NRACESSONFE
                                                 AND II.NRSEQITPROD  = IP.NRSEQITPROD)
                             ORDER BY NRSEQITPROD
      ) LOOP
         /*Af's selecionadas para relacionamento aos itens do XML*/
         FOR C_AFS_SELCIONADAS IN (SELECT LPAD(NRAUTOFORN, 10 ,'0') AS NRAUTOFORN
                                     FROM RELACXMLAF
                                    WHERE NRACESSONFE = P_NRACESSONFE
                                    ORDER BY NRAUTOFORN)

         LOOP
            /*Verifica tolerancia permitida}*/
            SELECT NVL(MAX(PG.IDCONSVLRMENAF), 'N') AS IDCONSVALORMENOR,
                   NVL(MAX(PF.VRPTOLVRITAF), NVL(MAX(PG.VRPETOLEVRAF), 0.00)) AS TOLERPERMITIDA
              INTO V_IDCONSVRMENOR, V_TOLPERMITIDA
              FROM PARAMGERAL PG LEFT JOIN PRODFILI PF ON PF.CDPRODUTO = C_PRODRELACAF.CDPRODUTORELAC
                                                      AND PF.CDFILIAL  = P_FILIDEST;

            /*Verifica se existe o  mesmo produto relacionado na AF selecionada}*/
            BEGIN
               SELECT (II.QTPROGENTAF - NVL(II.QTEFETENTRAF, 0)) AS QTITEMPRODAF
                 INTO V_QTITEMPRODAF
                 FROM ITEMAUTF II, PRODUTO PR
                WHERE II.NRAUTOFORN = C_AFS_SELCIONADAS.NRAUTOFORN
                  AND II.CDPRODUTO  = C_PRODRELACAF.CDPRODUTORELAC
                  AND II.CDPRODUTO  = PR.CDPRODUTO
                  AND (ROUND(C_PRODRELACAF.VRUNITITEM,5) <= (ROUND(II.VRPREUNIAF,5) + ((ROUND(II.VRPREUNIAF,5) * V_TOLPERMITIDA)/100)))
                  AND (((ROUND(C_PRODRELACAF.VRUNITITEM,5) >= (ROUND(II.VRPREUNIAF,5) - ((ROUND(II.VRPREUNIAF,5) * V_TOLPERMITIDA)/100))) AND
                      (V_IDCONSVRMENOR = 'N')) OR (V_IDCONSVRMENOR <> 'N'))
                  AND II.CDMARCA    = NVL(C_PRODRELACAF.CDMARCAREL, II.CDMARCA)
                  AND (II.QTPROGENTAF - NVL(II.QTEFETENTRAF, 0)) > 0
                  AND (NOT EXISTS(SELECT 1
                                   FROM INTG_ITEMAF IT
                                  WHERE NRACESSONFE    = P_NRACESSONFE
                                    AND IT.CDPRODUTOAF = II.CDPRODUTO
                                    AND IT.NRAUTOFORNE = II.NRAUTOFORN
                       )OR
                       EXISTS(SELECT 1
                                FROM INTG_ITEMAF IT
                               WHERE NRACESSONFE    = P_NRACESSONFE
                                 AND IT.CDPRODUTOAF = II.CDPRODUTO
                                 AND IT.NRAUTOFORNE = II.NRAUTOFORN
                                 AND IT.QTITEMPRODAF > (SELECT SUM(QTITEMPRODXML * NVL(VRFATOCONVXML, 1))/NVL(PR.VRFATOCONV, 1)
                                                         FROM INTG_ITEMAF I2
                                                        WHERE I2.NRAUTOFORNE = IT.NRAUTOFORNE
                                                          AND I2.CDPRODUTOAF = IT.CDPRODUTOAF
                                                        )
                             )
                      );
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_QTITEMPRODAF := NULL;
            END;

            IF (V_QTITEMPRODAF IS NOT NULL) THEN
               /*Se existir o mesmo produto com marca/valor igual, insere relacionamento*/
               INSERT INTO
                 INTG_ITEMAF (NRACESSONFE,   NRSEQITPROD,   NRAUTOFORNE, CDPRODUTOXML,
                              QTITEMPRODXML, QTPRODBAIXADA, CDPRODUTOAF, QTITEMPRODAF,
                              VRFATOCONVXML)
                     VALUES  (P_NRACESSONFE,   C_PRODRELACAF.NRSEQITPROD, C_AFS_SELCIONADAS.NRAUTOFORN, C_PRODRELACAF.CDPRODUTOXML,
                              C_PRODRELACAF.QTITEMPROD,    0,              C_PRODRELACAF.CDPRODUTORELAC, V_QTITEMPRODAF,
                              C_PRODRELACAF.VRFATOCONV);

               UPDATE INTG_ITEMPRODUTO
                  SET NRAUTOFORN  = C_AFS_SELCIONADAS.NRAUTOFORN
                WHERE NRACESSONFE = P_NRACESSONFE
                  AND NRSEQITPROD = C_PRODRELACAF.NRSEQITPROD;
            END IF;
         END LOOP;
      END LOOP;

      /*Retorna apenas produtos que ja possuem relacionamento (Relacionamento de Produto x Produto XML)
         e que ainda nao foram relacionados a nenhuma AF*/
      FOR C_PRODRELACESTO IN(SELECT PF.CDPRODUTOXML, PF.CDPRODUTO AS CDPRODUTORELAC,
                                    IP.VRUNITITEM, IP.QTITEMPROD, PF.CDMARCAREL, PR.VRFATOCONV AS VRFATOCONVNF,
                                    (IP.VRUNITITEM / PR.VRFATOCONV) AS VRUNITCONV, PR.CDPRODESTO,
                                    IP.NRSEQITPROD
                               FROM INTG_ITEMPRODUTO IP, PRODFORNXML PF, INTG_NOTAFISCAL NF, PRODUTO PR
                              WHERE IP.NRACESSONFE  = P_NRACESSONFE
                                AND PF.CDPRODUTOXML = IP.CDPRODUTO
                                AND PF.CDFORNECED   = NF.CDFORNECED
                                AND NF.NRACESSONFE  = IP.NRACESSONFE
                                AND PR.CDPRODUTO    = PF.CDPRODUTO
                                AND V_IDFUNCAOFILI <> 'O'
                                AND NOT EXISTS(SELECT 1
                                                 FROM INTG_ITEMAF II
                                                WHERE NRACESSONFE     = P_NRACESSONFE
                                                  AND II.CDPRODUTOXML = IP.CDPRODUTO
                                                  AND II.NRACESSONFE  = IP.NRACESSONFE
                                                  AND II.NRSEQITPROD  = IP.NRSEQITPROD)
                              UNION ALL
                             SELECT PF.CDPRODUTOXML, PF.CDPRODUTO AS CDPRODUTORELAC,
                                    IP.VRUNITITEM, IP.QTITEMPROD, PF.CDMARCAREL, PR.VRFATOCONV AS VRFATOCONVNF,
                                    (IP.VRUNITITEM / PR.VRFATOCONV) AS VRUNITCONV, PR.CDPRODESTO,
                                    IP.NRSEQITPROD
                               FROM INTG_ITEMPRODUTO IP, PRODFORNXML PF, INTG_NOTAFISCAL NF, PRODUTO PR,
                                    RELACPRODOL R
                              WHERE IP.NRACESSONFE  = P_NRACESSONFE
                                AND PF.CDPRODUTOXML = IP.CDPRODUTO
                                AND PF.CDFORNECED   = NF.CDFORNECED
                                AND R.CDPRARVORIG   = PF.CDPRODUTO
                                AND R.CDPRODARVOL   = PR.CDPRODUTO
                                AND NF.NRACESSONFE  = IP.NRACESSONFE
                                AND V_IDFUNCAOFILI = 'O'
                                AND NOT EXISTS(SELECT 1
                                                 FROM INTG_ITEMAF II
                                                WHERE NRACESSONFE     = P_NRACESSONFE
                                                  AND II.CDPRODUTOXML = IP.CDPRODUTO
                                                  AND II.NRACESSONFE  = IP.NRACESSONFE
                                                  AND II.NRSEQITPROD  = IP.NRSEQITPROD)
                              ORDER BY NRSEQITPROD
      ) LOOP
         /*Af's selecionadas para relacionamento aos itens do XML*/
         FOR C_AFS_SELCIONADAS IN (SELECT LPAD(NRAUTOFORN, 10 ,'0') AS NRAUTOFORN
                                     FROM RELACXMLAF
                                    WHERE NRACESSONFE = P_NRACESSONFE
                                    ORDER BY NRAUTOFORN)

         LOOP
            /*Verifica tolerancia permitida}*/
            SELECT NVL(MAX(PG.IDCONSVLRMENAF), 'N') AS IDCONSVALORMENOR,
                   NVL(MAX(PF.VRPTOLVRITAF), NVL(MAX(PG.VRPETOLEVRAF), 0.00)) AS TOLERPERMITIDA
              INTO V_IDCONSVRMENOR, V_TOLPERMITIDA
              FROM PARAMGERAL PG LEFT JOIN PRODFILI PF ON PF.CDPRODUTO = C_PRODRELACESTO.CDPRODUTORELAC
                                                      AND PF.CDFILIAL  = P_FILIDEST;

            /*Verifica se existe o mesmo produto de estoque relacionado na AF selecionada*/
            BEGIN
               SELECT (QTPROGENTAF - NVL(QTEFETENTRAF, 0))  AS QTITEMPRODAF, IT.CDPRODUTO
                 INTO V_QTITEMPRODAF, V_CDPRODUTOAF
                 FROM ITEMAUTF IT, PRODUTO PR
                WHERE NRAUTOFORN    = C_AFS_SELCIONADAS.NRAUTOFORN
                  AND IT.CDPRODUTO  = PR.CDPRODUTO
                  AND PR.CDPRODESTO = C_PRODRELACESTO.CDPRODESTO
                  AND (ROUND(C_PRODRELACESTO.VRUNITITEM,5)   <= (ROUND(((VRPREUNIAF/PR.VRFATOCONV) * C_PRODRELACESTO.VRFATOCONVNF),5) +
                                                  ((ROUND(((VRPREUNIAF/PR.VRFATOCONV) * C_PRODRELACESTO.VRFATOCONVNF),5) * V_TOLPERMITIDA)/100)))
                  AND (((ROUND(C_PRODRELACESTO.VRUNITITEM,5) >= (ROUND(((VRPREUNIAF/PR.VRFATOCONV) * C_PRODRELACESTO.VRFATOCONVNF),5) -
                                                   ((ROUND(((VRPREUNIAF/PR.VRFATOCONV) * C_PRODRELACESTO.VRFATOCONVNF),5) * V_TOLPERMITIDA)/100))) AND
                                                   (V_IDCONSVRMENOR = 'N')) OR (V_IDCONSVRMENOR <> 'N'))
                  AND CDMARCA    = NVL(C_PRODRELACESTO.CDMARCAREL, CDMARCA)
                  AND (QTPROGENTAF - NVL(QTEFETENTRAF, 0)) > 0
                  AND (NOT EXISTS(SELECT 1
                                   FROM INTG_ITEMAF II
                                  WHERE NRACESSONFE    = P_NRACESSONFE
                                    AND II.CDPRODUTOAF = IT.CDPRODUTO
                                    AND II.NRAUTOFORNE = IT.NRAUTOFORN
                       )OR
                       EXISTS(SELECT 1
                                FROM INTG_ITEMAF II
                               WHERE NRACESSONFE    = P_NRACESSONFE
                                 AND II.CDPRODUTOAF = IT.CDPRODUTO
                                 AND II.NRAUTOFORNE = IT.NRAUTOFORN
                                 AND II.QTITEMPRODAF > (SELECT SUM(QTITEMPRODXML * NVL(VRFATOCONVXML, 1))/NVL(PR.VRFATOCONV, 1)
                                                         FROM INTG_ITEMAF I2
                                                        WHERE I2.NRAUTOFORNE = II.NRAUTOFORNE
                                                          AND I2.CDPRODUTOAF = II.CDPRODUTOAF
                                                        )
                             )
                      );
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_QTITEMPRODAF := NULL; V_CDPRODUTOAF := NULL;
            END;
            IF (V_QTITEMPRODAF IS NOT NULL) THEN
               /*Se existir o produto com mesmo produto de estoque com com marca/valor igual, insere relacionamento*/
               INSERT INTO
                 INTG_ITEMAF (NRACESSONFE,   NRSEQITPROD,   NRAUTOFORNE, CDPRODUTOXML,
                              QTITEMPRODXML, QTPRODBAIXADA, CDPRODUTOAF, QTITEMPRODAF,
                              VRFATOCONVXML)
                     VALUES  (P_NRACESSONFE,   C_PRODRELACESTO.NRSEQITPROD, C_AFS_SELCIONADAS.NRAUTOFORN, C_PRODRELACESTO.CDPRODUTOXML,
                              C_PRODRELACESTO.QTITEMPROD,    0,             V_CDPRODUTOAF, V_QTITEMPRODAF,
                              C_PRODRELACESTO.VRFATOCONVNF);

               UPDATE INTG_ITEMPRODUTO
                  SET NRAUTOFORN  = C_AFS_SELCIONADAS.NRAUTOFORN
                WHERE NRACESSONFE = P_NRACESSONFE
                  AND NRSEQITPROD = C_PRODRELACESTO.NRSEQITPROD;
            END IF;
         END LOOP;
      END LOOP;

      /*Se ainda existir produto sem relacionar pq nao tem o mesmo valor, relaciona considerando apenas o codigo do produto */
      FOR C_PRODRELACAFDIF IN (SELECT PF.CDPRODUTOXML, PF.CDPRODUTO AS CDPRODUTORELAC,
                                      IP.VRUNITITEM, IP.QTITEMPROD, PF.CDMARCAREL, PR.VRFATOCONV,
                                      (IP.VRUNITITEM / PR.VRFATOCONV) AS VRUNITCONV, IP.NRSEQITPROD
                                 FROM INTG_ITEMPRODUTO IP, PRODFORNXML PF, INTG_NOTAFISCAL NF, PRODUTO PR
                                WHERE IP.NRACESSONFE  = P_NRACESSONFE
                                  AND PF.CDPRODUTOXML = IP.CDPRODUTO
                                  AND PF.CDFORNECED   = NF.CDFORNECED
                                  AND NF.NRACESSONFE  = IP.NRACESSONFE
                                  AND PR.CDPRODUTO    = PF.CDPRODUTO
                                  AND V_IDFUNCAOFILI  <> 'O'
                                  AND NOT EXISTS(SELECT 1
                                                   FROM INTG_ITEMAF II
                                                  WHERE NRACESSONFE     = P_NRACESSONFE
                                                    AND II.CDPRODUTOXML = IP.CDPRODUTO
                                                    AND II.NRACESSONFE  = IP.NRACESSONFE
                                                    AND II.NRSEQITPROD  = IP.NRSEQITPROD)

                                UNION ALL
                               SELECT PF.CDPRODUTOXML, PR.CDPRODUTO AS CDPRODUTORELAC,
                                      IP.VRUNITITEM, IP.QTITEMPROD, PF.CDMARCAREL, PR.VRFATOCONV,
                                      (IP.VRUNITITEM / PR.VRFATOCONV) AS VRUNITCONV, IP.NRSEQITPROD
                                 FROM INTG_ITEMPRODUTO IP, PRODFORNXML PF, INTG_NOTAFISCAL NF, PRODUTO PR,
                                      RELACPRODOL R
                                WHERE IP.NRACESSONFE  = P_NRACESSONFE
                                  AND PF.CDPRODUTOXML = IP.CDPRODUTO
                                  AND R.CDPRARVORIG   = PF.CDPRODUTO
                                  AND R.CDPRODARVOL   = PR.CDPRODUTO
                                  AND PF.CDFORNECED   = NF.CDFORNECED
                                  AND NF.NRACESSONFE  = IP.NRACESSONFE
                                  AND V_IDFUNCAOFILI  = 'O'
                                  AND NOT EXISTS(SELECT 1
                                                   FROM INTG_ITEMAF II
                                                  WHERE NRACESSONFE     = P_NRACESSONFE
                                                    AND II.CDPRODUTOXML = IP.CDPRODUTO
                                                    AND II.NRACESSONFE  = IP.NRACESSONFE
                                                    AND II.NRSEQITPROD  = IP.NRSEQITPROD)
                                ORDER BY NRSEQITPROD
      ) LOOP
         /*Af's selecionadas para relacionamento aos itens do XML*/
         FOR C_AFS_SELCIONADAS IN (SELECT LPAD(NRAUTOFORN, 10 ,'0') AS NRAUTOFORN
                                     FROM RELACXMLAF
                                    WHERE NRACESSONFE = P_NRACESSONFE
                                    ORDER BY NRAUTOFORN)

         LOOP
            /*Verifica tolerancia permitida}*/
            SELECT NVL(MAX(PG.IDCONSVLRMENAF), 'N') AS IDCONSVALORMENOR,
                   NVL(MAX(PF.VRPTOLVRITAF), NVL(MAX(PG.VRPETOLEVRAF), 0.00)) AS TOLERPERMITIDA
              INTO V_IDCONSVRMENOR, V_TOLPERMITIDA
              FROM PARAMGERAL PG LEFT JOIN PRODFILI PF ON PF.CDPRODUTO = C_PRODRELACAFDIF.CDPRODUTORELAC
                                                      AND PF.CDFILIAL  = P_FILIDEST;

            /*Verifica se existe o  mesmo produto relacionado na AF selecionada}*/
            BEGIN
               SELECT (QTPROGENTAF - NVL(QTEFETENTRAF, 0)) AS QTITEMPRODAF
                 INTO V_QTITEMPRODAF
                 FROM ITEMAUTF
                WHERE NRAUTOFORN = C_AFS_SELCIONADAS.NRAUTOFORN
                  AND CDPRODUTO  = C_PRODRELACAFDIF.CDPRODUTORELAC
                  AND CDMARCA    = NVL(C_PRODRELACAFDIF.CDMARCAREL, CDMARCA)
                  AND (QTPROGENTAF - NVL(QTEFETENTRAF, 0)) > 0 ;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_QTITEMPRODAF := NULL;
            END;

            IF (V_QTITEMPRODAF IS NOT NULL) THEN
               /*Se existir o mesmo produto com marca/ mas valor diferente, insere relacionamento (Neste caso, insere relacionamento pq nao
                  encontrou mesmo produto com valor igual)*/
               INSERT INTO
                 INTG_ITEMAF (NRACESSONFE,   NRSEQITPROD,   NRAUTOFORNE, CDPRODUTOXML,
                              QTITEMPRODXML, QTPRODBAIXADA, CDPRODUTOAF, QTITEMPRODAF,
                              VRFATOCONVXML)
                     VALUES  (P_NRACESSONFE,   C_PRODRELACAFDIF.NRSEQITPROD, C_AFS_SELCIONADAS.NRAUTOFORN, C_PRODRELACAFDIF.CDPRODUTOXML,
                              C_PRODRELACAFDIF.QTITEMPROD,    0,              C_PRODRELACAFDIF.CDPRODUTORELAC, V_QTITEMPRODAF,
                              C_PRODRELACAFDIF.VRFATOCONV);

               UPDATE INTG_ITEMPRODUTO
                  SET NRAUTOFORN  = C_AFS_SELCIONADAS.NRAUTOFORN
                WHERE NRACESSONFE = P_NRACESSONFE
                  AND NRSEQITPROD = C_PRODRELACAFDIF.NRSEQITPROD;
            END IF;
         END LOOP;
      END LOOP;

      /*Se continuar com produto sem relacionar pq nao tem o mesmo valor, nem o mesmo produto,  relaciona considerando apenas o
           codigo do produto de estoque(Embalagens diferentes*/
      FOR C_PRODRELACESTODIF IN(SELECT PF.CDPRODUTOXML, PF.CDPRODUTO AS CDPRODUTORELAC,
                                       IP.VRUNITITEM, IP.QTITEMPROD, PF.CDMARCAREL, PR.VRFATOCONV AS VRFATOCONVNF,
                                       (IP.VRUNITITEM / PR.VRFATOCONV) AS VRUNITCONV, PR.CDPRODESTO,
                                       IP.NRSEQITPROD
                                  FROM INTG_ITEMPRODUTO IP, PRODFORNXML PF, INTG_NOTAFISCAL NF, PRODUTO PR
                                 WHERE IP.NRACESSONFE  = P_NRACESSONFE
                                   AND PF.CDPRODUTOXML = IP.CDPRODUTO
                                   AND PF.CDFORNECED   = NF.CDFORNECED
                                   AND NF.NRACESSONFE  = IP.NRACESSONFE
                                   AND PR.CDPRODUTO    = PF.CDPRODUTO
                                   AND V_IDFUNCAOFILI <> 'O'
                                   AND NOT EXISTS(SELECT 1
                                                    FROM INTG_ITEMAF II
                                                   WHERE NRACESSONFE     = P_NRACESSONFE
                                                     AND II.CDPRODUTOXML = IP.CDPRODUTO
                                                     AND II.NRACESSONFE  = IP.NRACESSONFE
                                                     AND II.NRSEQITPROD  = IP.NRSEQITPROD)
                                 UNION ALL
                                SELECT PF.CDPRODUTOXML, PF.CDPRODUTO AS CDPRODUTORELAC,
                                       IP.VRUNITITEM, IP.QTITEMPROD, PF.CDMARCAREL, PR.VRFATOCONV AS VRFATOCONVNF,
                                       (IP.VRUNITITEM / PR.VRFATOCONV) AS VRUNITCONV, PR.CDPRODESTO,
                                       IP.NRSEQITPROD
                                  FROM INTG_ITEMPRODUTO IP, PRODFORNXML PF, INTG_NOTAFISCAL NF, PRODUTO PR,
                                       RELACPRODOL R
                                 WHERE IP.NRACESSONFE  = P_NRACESSONFE
                                   AND PF.CDPRODUTOXML = IP.CDPRODUTO
                                   AND PF.CDFORNECED   = NF.CDFORNECED
                                   AND R.CDPRARVORIG   = PF.CDPRODUTO
                                   AND R.CDPRODARVOL   = PR.CDPRODUTO
                                   AND NF.NRACESSONFE  = IP.NRACESSONFE
                                   AND V_IDFUNCAOFILI = 'O'
                                   AND NOT EXISTS(SELECT 1
                                                    FROM INTG_ITEMAF II
                                                   WHERE NRACESSONFE     = P_NRACESSONFE
                                                     AND II.CDPRODUTOXML = IP.CDPRODUTO
                                                     AND II.NRACESSONFE  = IP.NRACESSONFE
                                                     AND II.NRSEQITPROD  = IP.NRSEQITPROD)
                                 ORDER BY NRSEQITPROD
      ) LOOP
         /*Af's selecionadas para relacionamento aos itens do XML*/
         FOR C_AFS_SELCIONADAS IN (SELECT LPAD(NRAUTOFORN, 10 ,'0') AS NRAUTOFORN
                                     FROM RELACXMLAF
                                    WHERE NRACESSONFE = P_NRACESSONFE
                                    ORDER BY NRAUTOFORN)

         LOOP
            /*Verifica tolerancia permitida}*/
            SELECT NVL(MAX(PG.IDCONSVLRMENAF), 'N') AS IDCONSVALORMENOR,
                   NVL(MAX(PF.VRPTOLVRITAF), NVL(MAX(PG.VRPETOLEVRAF), 0.00)) AS TOLERPERMITIDA
              INTO V_IDCONSVRMENOR, V_TOLPERMITIDA
              FROM PARAMGERAL PG LEFT JOIN PRODFILI PF ON PF.CDPRODUTO = C_PRODRELACESTODIF.CDPRODUTORELAC
                                                      AND PF.CDFILIAL  = P_FILIDEST;

            /*Verifica se existe o mesmo produto de estoque relacionado na AF selecionada*/
            BEGIN
               SELECT (QTPROGENTAF - NVL(QTEFETENTRAF, 0)) AS QTITEMPRODAF, --* PR.VRFATOCONV)/:P_VRFATOCONVNF) 
                      IT.CDPRODUTO
                 INTO V_QTITEMPRODAF, V_CDPRODUTOAF
                 FROM ITEMAUTF IT, PRODUTO PR
                WHERE NRAUTOFORN    = C_AFS_SELCIONADAS.NRAUTOFORN
                  AND IT.CDPRODUTO  = PR.CDPRODUTO
                  AND PR.CDPRODESTO = C_PRODRELACESTODIF.CDPRODESTO
                  AND CDMARCA    = NVL(C_PRODRELACESTODIF.CDMARCAREL, CDMARCA)
                  AND (QTPROGENTAF - NVL(QTEFETENTRAF, 0)) > 0
                  AND (NOT EXISTS(SELECT 1
                                   FROM INTG_ITEMAF II
                                  WHERE NRACESSONFE    = P_NRACESSONFE
                                    AND II.CDPRODUTOAF = IT.CDPRODUTO
                                    AND II.NRAUTOFORNE = IT.NRAUTOFORN
                       )OR
                       EXISTS(SELECT 1
                                FROM INTG_ITEMAF II
                               WHERE NRACESSONFE    = P_NRACESSONFE
                                 AND II.CDPRODUTOAF = IT.CDPRODUTO
                                 AND II.NRAUTOFORNE = IT.NRAUTOFORN
                                 AND II.QTITEMPRODAF > (SELECT SUM(QTITEMPRODXML * NVL(VRFATOCONVXML, 1))/NVL(PR.VRFATOCONV, 1)
                                                         FROM INTG_ITEMAF I2
                                                        WHERE I2.NRAUTOFORNE = II.NRAUTOFORNE
                                                          AND I2.CDPRODUTOAF = II.CDPRODUTOAF
                                                        )
                             )
                      );

            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_QTITEMPRODAF := NULL; V_CDPRODUTOAF := NULL;
            END;
            IF (V_QTITEMPRODAF IS NOT NULL) THEN
               /*Se existir o produto com mesmo produto de estoque com com marca/valor igual, insere relacionamento*/
               INSERT INTO
                 INTG_ITEMAF (NRACESSONFE,   NRSEQITPROD,   NRAUTOFORNE, CDPRODUTOXML,
                              QTITEMPRODXML, QTPRODBAIXADA, CDPRODUTOAF, QTITEMPRODAF,
                              VRFATOCONVXML)
                     VALUES  (P_NRACESSONFE,   C_PRODRELACESTODIF.NRSEQITPROD, C_AFS_SELCIONADAS.NRAUTOFORN, C_PRODRELACESTODIF.CDPRODUTOXML,
                              C_PRODRELACESTODIF.QTITEMPROD,    0,             V_CDPRODUTOAF, V_QTITEMPRODAF,
                              C_PRODRELACESTODIF.VRFATOCONVNF);

               UPDATE INTG_ITEMPRODUTO
                  SET NRAUTOFORN  = C_AFS_SELCIONADAS.NRAUTOFORN
                WHERE NRACESSONFE = P_NRACESSONFE
                  AND NRSEQITPROD = C_PRODRELACESTODIF.NRSEQITPROD;
            END IF;
         END LOOP;
      END LOOP;
   ELSE
   /* Relacionamento por item */
      FOR C_ITEMRELAC IN (SELECT PF.CDPRODUTOXML, PF.CDPRODUTO AS CDPRODUTORELAC, PR.CDPRODESTO,
                                 IP.VRUNITITEM, IP.QTITEMPROD, PF.CDMARCAREL, PR.VRFATOCONV,
                                 (IP.VRUNITITEM / PR.VRFATOCONV) AS VRUNITCONV, IP.NRSEQITPROD
                            FROM INTG_ITEMPRODUTO IP, PRODFORNXML PF, INTG_NOTAFISCAL NF, PRODUTO PR
                           WHERE IP.NRACESSONFE  = P_NRACESSONFE
                             AND IP.NRSEQITPROD  = P_NRSEQITPROD
                             AND PF.CDPRODUTOXML = IP.CDPRODUTO
                             AND PF.CDFORNECED   = NF.CDFORNECED
                             AND NF.NRACESSONFE  = IP.NRACESSONFE
                             AND PR.CDPRODUTO    = PF.CDPRODUTO
                             AND V_IDFUNCAOFILI <> 'O'
                           UNION ALL
                          SELECT PF.CDPRODUTOXML, PF.CDPRODUTO AS CDPRODUTORELAC, PR.CDPRODESTO,
                                 IP.VRUNITITEM, IP.QTITEMPROD, PF.CDMARCAREL, PR.VRFATOCONV,
                                 (IP.VRUNITITEM / PR.VRFATOCONV) AS VRUNITCONV, IP.NRSEQITPROD
                            FROM INTG_ITEMPRODUTO IP, PRODFORNXML PF, INTG_NOTAFISCAL NF, PRODUTO PR,
                                 RELACPRODOL R
                           WHERE IP.NRACESSONFE  = P_NRACESSONFE
                             AND IP.NRSEQITPROD  = P_NRSEQITPROD
                             AND PF.CDPRODUTOXML = IP.CDPRODUTO
                             AND PF.CDFORNECED   = NF.CDFORNECED
                             AND NF.NRACESSONFE  = IP.NRACESSONFE
                             AND R.CDPRARVORIG   = PF.CDPRODUTO
                             AND R.CDPRODARVOL   = PR.CDPRODUTO
                             AND V_IDFUNCAOFILI = 'O')
      LOOP
         /*Af's selecionadas para relacionamento aos itens do XML*/
         FOR C_AFS_SELCIONADAS IN (SELECT LPAD(NRAUTOFORN, 10 ,'0') AS NRAUTOFORN
                                     FROM RELACXMLAF
                                    WHERE NRACESSONFE = P_NRACESSONFE
                                    ORDER BY NRAUTOFORN)

         LOOP
            DELETE
              FROM INTG_ITEMAF
             WHERE NRACESSONFE  = P_NRACESSONFE
               AND NRSEQITPROD  = P_NRSEQITPROD
               AND NRAUTOFORNE  = C_AFS_SELCIONADAS.NRAUTOFORN
               AND CDPRODUTOXML = P_CDPRODUTO;

            /*Verifica se existe o  mesmo produto relacionado na AF selecionada}*/
            BEGIN
               SELECT (QTPROGENTAF - NVL(QTEFETENTRAF, 0)) AS QTITEMPRODAF
                 INTO V_QTITEMPRODAF
                 FROM ITEMAUTF
                WHERE NRAUTOFORN = C_AFS_SELCIONADAS.NRAUTOFORN
                  AND CDPRODUTO  = C_ITEMRELAC.CDPRODUTORELAC
                  AND CDMARCA    = NVL(C_ITEMRELAC.CDMARCAREL, CDMARCA)
                  AND (QTPROGENTAF - NVL(QTEFETENTRAF, 0)) > 0;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_QTITEMPRODAF := NULL;
            END;

            /*Se existir o mesmo produto, insere relacionamento*/
            IF (V_QTITEMPRODAF IS NOT NULL) THEN
               INSERT INTO
                 INTG_ITEMAF (NRACESSONFE,   NRSEQITPROD,   NRAUTOFORNE, CDPRODUTOXML,
                              QTITEMPRODXML, QTPRODBAIXADA, CDPRODUTOAF, QTITEMPRODAF,
                              VRFATOCONVXML)
                     VALUES  (P_NRACESSONFE,   P_NRSEQITPROD, C_AFS_SELCIONADAS.NRAUTOFORN, P_CDPRODUTO,
                              P_QTITEMPROD,    0,             C_ITEMRELAC.CDPRODUTORELAC,   V_QTITEMPRODAF,
                              C_ITEMRELAC.VRFATOCONV);

               UPDATE INTG_ITEMPRODUTO
                  SET NRAUTOFORN  = C_AFS_SELCIONADAS.NRAUTOFORN
                WHERE NRACESSONFE = P_NRACESSONFE
                  AND NRSEQITPROD = P_NRSEQITPROD;
            ELSE
               /*Verifica se existe o mesmo produto de estoque relacionado na AF selecionada*/
               BEGIN
                  SELECT (QTPROGENTAF - NVL(QTEFETENTRAF, 0)) AS QTITEMPRODAF,
                         IT.CDPRODUTO
                    INTO V_QTITEMPRODAF, V_CDPRODUTOAF
                    FROM ITEMAUTF IT, PRODUTO PR
                   WHERE NRAUTOFORN    = C_AFS_SELCIONADAS.NRAUTOFORN
                     AND IT.CDPRODUTO  = PR.CDPRODUTO
                     AND PR.CDPRODESTO = C_ITEMRELAC.CDPRODESTO
                     AND CDMARCA    = NVL(C_ITEMRELAC.CDMARCAREL, CDMARCA)
                     AND (QTPROGENTAF - NVL(QTEFETENTRAF, 0)) > 0
                     AND (NOT EXISTS(SELECT 1
                                      FROM INTG_ITEMAF II
                                     WHERE NRACESSONFE    = P_NRACESSONFE
                                       AND II.CDPRODUTOAF = IT.CDPRODUTO
                                       AND II.NRAUTOFORNE = IT.NRAUTOFORN
                          )OR
                          EXISTS(SELECT 1
                                   FROM INTG_ITEMAF II
                                  WHERE NRACESSONFE    = P_NRACESSONFE
                                    AND II.CDPRODUTOAF = IT.CDPRODUTO
                                    AND II.NRAUTOFORNE = IT.NRAUTOFORN
                                    AND II.QTITEMPRODAF > (SELECT SUM(QTITEMPRODXML * NVL(VRFATOCONVXML, 1))/NVL(PR.VRFATOCONV, 1)
                                                            FROM INTG_ITEMAF I2
                                                           WHERE I2.NRAUTOFORNE = II.NRAUTOFORNE
                                                             AND I2.CDPRODUTOAF = II.CDPRODUTOAF
                                                           )
                                )
                         );
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN
                        V_QTITEMPRODAF := NULL; V_CDPRODUTOAF := NULL;
                  END;
                  /*Se existir o mesmo produto de estoque, insere relacionamento*/
                  IF (V_QTITEMPRODAF IS NOT NULL) THEN
                     INSERT INTO
                       INTG_ITEMAF (NRACESSONFE,   NRSEQITPROD,   NRAUTOFORNE, CDPRODUTOXML,
                                    QTITEMPRODXML, QTPRODBAIXADA, CDPRODUTOAF, QTITEMPRODAF,
                                    VRFATOCONVXML)
                           VALUES  (P_NRACESSONFE,   P_NRSEQITPROD, C_AFS_SELCIONADAS.NRAUTOFORN, P_CDPRODUTO,
                                    P_QTITEMPROD,    0,             V_CDPRODUTOAF, V_QTITEMPRODAF,
                                    C_ITEMRELAC.VRFATOCONV);

                     UPDATE INTG_ITEMPRODUTO
                        SET NRAUTOFORN  = C_AFS_SELCIONADAS.NRAUTOFORN
                      WHERE NRACESSONFE = P_NRACESSONFE
                        AND NRSEQITPROD = P_NRSEQITPROD;
                  ELSE
                     /*Se nao existir o mesmo produto relaiconado nem mesmo de estoque, apenas updata a AF na tabela intg_itemproduto sem inserir relacionamento*/
                     UPDATE INTG_ITEMPRODUTO
                        SET NRAUTOFORN  = C_AFS_SELCIONADAS.NRAUTOFORN
                      WHERE NRACESSONFE = P_NRACESSONFE
                        AND NRSEQITPROD = P_NRSEQITPROD;
                  END IF;
            END IF;
         END LOOP;
      END LOOP;   
   END IF;
   /* Grava Filial da AF informada na tabela INTG_NOTAFISCAL */
   UPDATE INTG_NOTAFISCAL
      SET CDFILIRECE  = P_FILIDEST
    WHERE NRACESSONFE = P_NRACESSONFE;
END;
/