CREATE OR REPLACE
PROCEDURE EMPENHAR_AF
  (P_NRSEQAPUR    IN AUTOFORNE.NRSEQAPURAF%TYPE,
   P_CDFILLANC    IN AUTOFORNE.CDFILLANC%TYPE,
   P_CDFILCENTCMP IN FILIAL.CDFILIAL%TYPE,
   P_CDOPERADOR   IN OPERADOR.CDOPERADOR%TYPE)
IS
   V_IDCONSPRSOL  VARCHAR2(1);

   V_QTAEMPENHAR  FLOAT; /* QUANTIDADE NA UNIDADE DE ESTOQUE QUE ESTA SOBRANDO NAS AF'S POR PRODUTO/FILIAL */
   V_QTARETIRAR   FLOAT; /* QUANTIDADE QUE SERA RETIRADA DO(S) PROXIMO(S) ITEM DE SOLICITACAO */

   V_NRSOLCOMP    VARCHAR2(200);
   V_QTSOLIPROD   FLOAT; /* QUANTIDADE DA SOLICITACAO DE COMPRAS */
   V_VRFATOCONV   FLOAT; /* FATOR DE CONVERSAO DO ITEM SOLICITADO */
   V_VRARREDEMPE  FLOAT; /* ARREDONDAMENTO PARA EMPENHO NA AF */
   V_QTARRED      FLOAT; /* QUANTIDADE SOLICITADA ARREDONDADA PARA BAIXO */
   V_QTDISPONIVEL FLOAT; /* QUANTIDADE DISPONIVEL PARA REMANEJAMENTO */
   V_DTULTENTR    DATE;  /* ULTIMA ENTREGA NA APURACAO DO PRODUTO */

   V_LISTA_AFS    VARCHAR2(20);
   V_LISTA_AF_AUX NUMBER;

   V_EXTRA        VARCHAR2(1);

   V_REJEICAO     FLOAT; /* PORCENTAGEM DE REJEICAO*/
   V_QTDFINAL     FLOAT; /* RECEBE O RESTO INTEIRO DA DIVISAO, PARA CONFERIR COM A QUANTIDADE DA SOLICITACAO*/
   V_QTDINTDIV    FLOAT;
   V_PERCENTUAL   FLOAT;
   V_NRSOLCOMP_AUX VARCHAR2(200);
   V_COUNT        FLOAT := 0;
   V_DTPULTENTR    DATE;  /* PENULTIMA ENTREGA NA APURACAO DO PRODUTO */
   V_IDSISDOS     VARCHAR2(1);
   V_QTSOLIPRODF  FLOAT; /* QUANTIDADE DA SOLICITACAO DE COMPRAS FINAL*/
   V_QTPROGENTAF  FLOAT; /* QUANTIDADE NA UNIDADE DE ESTOQUE DO ULTIMO ITEM DE EMPENHO*/
   V_DTENTRITMSOL_MAX DATE; /*MAIOR ULTIMA DATA DE ENTREGA EXITENTE*/
   V_NRLOGCORTEOL NUMERIC; /*EMPENHAR PARA FILIAL OL GRSA*/
BEGIN

   SELECT
      NVL(MAX(IDCONSPRSOL), 'N')
   INTO
      V_IDCONSPRSOL
   FROM
      PARASUPRI
   WHERE
      (CDFILIAL = P_CDFILCENTCMP);

   SELECT MAX(IDCONSOLAPUEFET)
   INTO V_EXTRA
   FROM APURPRECO
   WHERE CDFILCENTCMP = P_CDFILCENTCMP
     AND NRAPURPREC = P_NRSEQAPUR;

   NOVO_CODIGO('LISTA', V_LISTA_AFS, 1);
   V_LISTA_AFS := SUBSTR(V_LISTA_AFS, 11, 10);
   SELECT NVL(MAX(IDSISDOS), '1')
     INTO V_IDSISDOS
     FROM PARAMGERAL;
   SELECT NVL(MAX(NRLOGCORTEOL), 0)
     INTO V_NRLOGCORTEOL
     FROM APURPRECO
    WHERE CDFILCENTCMP = P_CDFILCENTCMP
      AND NRAPURPREC   = P_NRSEQAPUR;
   IF ((V_IDCONSPRSOL = 'N') AND (V_NRLOGCORTEOL = 0))THEN
      FOR C_PRODAEMPENHAR IN /* RETORNA OS PRODUTOS QUE TEM AF COM QUANTIDADE MAIOR QUE A DA SOLICITACAO */
        (SELECT
            CDFILIAL,
            CDPRODESTO,
            SUM(QTDECOMP) AS QTAEMPENHAR
         FROM
            (SELECT
                ITEMAUTF.CDFILDEST AS CDFILIAL,
                PRODUTO.CDPRODESTO,
                ITEMAUTF.DTENTRITMSOL,
                SUM(ITEMAUTF.QTPROGENTAF*PRODUTO.VRFATOCONV)-
                SUM((SELECT
                        NVL(SUM(ITEMSOLI.QTSOLIPROD*P.VRFATOCONV), 0)
                     FROM
                        PRODUTO P,
                        ITEMSOLI
                     WHERE
                        (ITEMSOLI.CDFILSOLI  = ITEMAUTF.CDFILDEST)    AND
                        (PRODUTO.CDPRODESTO  = P.CDPRODESTO)          AND
                        ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                        (ITEMSOLI.DTPROGENTR = ITEMAUTF.DTENTRITMSOL) AND
                        (ITEMSOLI.IDITMCONS  = 'N')                   AND
                        ITEMSOLI.CDFILIOPELOG IS NULL                 AND
                        (ITEMSOLI.CDPRODUTO  = P.CDPRODUTO)           AND
                        (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')         AND
                        EXISTS (SELECT 1
                                  FROM ITEMSOLIRELACAF
                                 WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                   AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                   AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                   AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                   AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                   AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                   AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR))-
                    (SELECT
                        NVL(SUM(I.QTPROGENTAF*P.VRFATOCONV), 0)
                     FROM
                        PRODUTO P,
                        ITEMAUTF I,
                        AUTOFORNE A
                     WHERE
                        (A.CDFILDEST    = I.CDFILDEST)  AND
                        (A.CDFILLANC    = I.CDFILLANC)  AND
                        (A.NRAUTOFORN   = I.NRAUTOFORN) AND
                        (I.CDPRODUTO    = P.CDPRODUTO)   AND
                        (PRODUTO.CDPRODESTO  = P.CDPRODESTO)     AND
                        (I.CDFILDEST    = ITEMAUTF.CDFILDEST)    AND
                        (I.DTENTRITMSOL = ITEMAUTF.DTENTRITMSOL) AND
                        (I.CDMARCA      = ITEMAUTF.CDMARCA)      AND
                        ((A.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
                        (NVL(A.IDBAIXAAF,'0') <> '5')          AND
                        EXISTS (SELECT 1
                                  FROM ITEMSOLIRELACAF
                                 WHERE ITEMSOLIRELACAF.CDFILDEST    = I.CDFILDEST
                                   AND ITEMSOLIRELACAF.CDFILLANC    = I.CDFILLANC
                                   AND ITEMSOLIRELACAF.NRAUTOFORN   = I.NRAUTOFORN
                                   AND ITEMSOLIRELACAF.CDPRODUTOAF  = I.CDPRODUTO
                                   AND ITEMSOLIRELACAF.CDMARCAAF    = I.CDMARCA
                                   AND ITEMSOLIRELACAF.DTPROGENTAF  = I.DTPROGENTAF
                                   AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                   AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR)  AND
                        EXISTS ( SELECT 1
                           FROM PRODFORNCOMP
                          WHERE (CDFORNECED = A.CDFORNECED)
                            AND (CDPRODCOMPL = I.CDPRODUTO)
                            AND NVL(VRARREDEMPE, 0) > 0
                          UNION
                         SELECT 1
                           FROM MARCPROD
                          WHERE (MARCPROD.CDMARCA   = I.CDMARCA)
                            AND NVL(VRARREDEMPMAR, 0) > 0
                            AND (MARCPROD.CDPRODUTO IN (SELECT PR.CDPRODUTO
                                                          FROM PRODUTO PR
                                                         WHERE PR.CDPRODUTO = MARCPROD.CDPRODUTO
                                                           AND P.CDARVPROD LIKE PR.CDARVPROD || '%') ) )



                                   ) ) AS QTDECOMP
                 FROM
                    PRODUTO,
                    ITEMAUTF,
                    AUTOFORNE
                 WHERE
                    (AUTOFORNE.CDFILDEST    = ITEMAUTF.CDFILDEST)  AND
                    (AUTOFORNE.CDFILLANC    = ITEMAUTF.CDFILLANC)  AND
                    (AUTOFORNE.NRAUTOFORN   = ITEMAUTF.NRAUTOFORN) AND
                    (ITEMAUTF.CDPRODUTO     = PRODUTO.CDPRODUTO)   AND
                    ((AUTOFORNE.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
                    (NVL(AUTOFORNE.IDBAIXAAF,'0') <> '5')          AND
                    (AUTOFORNE.CDFILLANC    = P_CDFILLANC)      AND
                    (AUTOFORNE.NRSEQAPURAF  = P_NRSEQAPUR)      AND
                    EXISTS (SELECT 1
                              FROM ITEMSOLIRELACAF
                             WHERE ITEMSOLIRELACAF.CDFILDEST    = ITEMAUTF.CDFILDEST
                               AND ITEMSOLIRELACAF.CDFILLANC    = ITEMAUTF.CDFILLANC
                               AND ITEMSOLIRELACAF.NRAUTOFORN   = ITEMAUTF.NRAUTOFORN
                               AND ITEMSOLIRELACAF.CDPRODUTOAF  = ITEMAUTF.CDPRODUTO
                               AND ITEMSOLIRELACAF.CDMARCAAF    = ITEMAUTF.CDMARCA
                               AND ITEMSOLIRELACAF.DTPROGENTAF  = ITEMAUTF.DTPROGENTAF
                               AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                               AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR)  AND



                    EXISTS ( SELECT 1
                           FROM PRODFORNCOMP
                          WHERE (CDFORNECED = AUTOFORNE.CDFORNECED)
                            AND (CDPRODCOMPL = ITEMAUTF.CDPRODUTO)
                            AND NVL(VRARREDEMPE, 0) > 0
                          UNION
                         SELECT 1
                           FROM MARCPROD
                          WHERE (CDMARCA   = ITEMAUTF.CDMARCA)
                            AND NVL(VRARREDEMPMAR, 0) > 0
                            AND (MARCPROD.CDPRODUTO IN (SELECT P.CDPRODUTO
                                                          FROM PRODUTO P
                                                         WHERE P.CDPRODUTO = MARCPROD.CDPRODUTO
                                                           AND PRODUTO.CDARVPROD LIKE P.CDARVPROD || '%') ) )


                 GROUP BY
                    ITEMAUTF.CDFILDEST,
                    PRODUTO.CDPRODESTO,
                    ITEMAUTF.DTENTRITMSOL
                HAVING
                   SUM(ITEMAUTF.QTPROGENTAF*PRODUTO.VRFATOCONV) >
                   SUM((SELECT
                           NVL(SUM(ITEMSOLI.QTSOLIPROD*P.VRFATOCONV), 0)
                        FROM
                           PRODUTO P,
                           ITEMSOLI
                        WHERE
                           (ITEMSOLI.CDFILSOLI  = ITEMAUTF.CDFILDEST)    AND
                           (PRODUTO.CDPRODESTO  = P.CDPRODESTO)          AND
                           ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                           (ITEMSOLI.DTPROGENTR = ITEMAUTF.DTENTRITMSOL) AND
                           (ITEMSOLI.IDITMCONS  = 'N')                   AND
                           ITEMSOLI.CDFILIOPELOG IS NULL                 AND
                           (ITEMSOLI.CDPRODUTO  = P.CDPRODUTO)           AND
                           (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')         AND
                           EXISTS (SELECT 1
                                     FROM ITEMSOLIRELACAF
                                    WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                      AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                      AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                      AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                      AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                      AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                      AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR))-
                       (SELECT
                           NVL(SUM(I.QTPROGENTAF*P.VRFATOCONV), 0)
                        FROM
                           PRODUTO P,
                           ITEMAUTF I,
                           AUTOFORNE A
                        WHERE
                           (A.CDFILDEST    = I.CDFILDEST)  AND
                           (A.CDFILLANC    = I.CDFILLANC)  AND
                           (A.NRAUTOFORN   = I.NRAUTOFORN) AND
                           (I.CDPRODUTO     = P.CDPRODUTO)   AND
                           (PRODUTO.CDPRODESTO  = P.CDPRODESTO)          AND
                           (I.CDFILDEST    = ITEMAUTF.CDFILDEST)  AND
                           (I.DTENTRITMSOL = ITEMAUTF.DTENTRITMSOL) AND
                           (I.CDMARCA = ITEMAUTF.CDMARCA) AND
                           ((A.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
                           (NVL(A.IDBAIXAAF,'0') <> '5')          AND
                           EXISTS (SELECT 1
                                     FROM ITEMSOLIRELACAF
                                    WHERE ITEMSOLIRELACAF.CDFILDEST    = I.CDFILDEST
                                      AND ITEMSOLIRELACAF.CDFILLANC    = I.CDFILLANC
                                      AND ITEMSOLIRELACAF.NRAUTOFORN   = I.NRAUTOFORN
                                      AND ITEMSOLIRELACAF.CDPRODUTOAF  = I.CDPRODUTO
                                      AND ITEMSOLIRELACAF.CDMARCAAF    = I.CDMARCA
                                      AND ITEMSOLIRELACAF.DTPROGENTAF  = I.DTPROGENTAF
                                      AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                      AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR)  AND

                        EXISTS ( SELECT 1
                           FROM PRODFORNCOMP
                          WHERE (CDFORNECED = A.CDFORNECED)
                            AND (CDPRODCOMPL = I.CDPRODUTO)
                            AND NVL(VRARREDEMPE, 0) > 0
                          UNION
                         SELECT 1
                           FROM MARCPROD
                          WHERE (MARCPROD.CDMARCA   = I.CDMARCA)
                            AND NVL(VRARREDEMPMAR, 0) > 0
                            AND (MARCPROD.CDPRODUTO IN (SELECT PR.CDPRODUTO
                                                          FROM PRODUTO PR
                                                         WHERE PR.CDPRODUTO = MARCPROD.CDPRODUTO
                                                           AND P.CDARVPROD LIKE PR.CDARVPROD || '%') ) )

                                         ) ))
         GROUP BY
            CDFILIAL,
            CDPRODESTO)
      LOOP
         V_QTAEMPENHAR := C_PRODAEMPENHAR.QTAEMPENHAR;
         V_QTARETIRAR  := 0;
         FOR C_ITEMAUTF IN  /* RETORNA AS DATAS DE ENTREGA DOS PRODUTOS QUE TEM QUANTIDADE A COMPRAR */
           (SELECT
               AUTOFORNE.CDFORNECED,
               ITEMAUTF.NRAUTOFORN,
               ITEMAUTF.DTPROGENTAF,
               ITEMAUTF.DTENTRITMSOL,
               ITEMAUTF.CDPRODUTO,
               ITEMAUTF.CDMARCA,
               ITEMAUTF.QTPROGENTAF,
               NVL(PRODUTO.VRFATOCONV, 1) VRFATOCONV,
               CASE NVL(PRODUTO.VRARREDCMP, 0)
                  WHEN 0
                  THEN 1
                  ELSE NVL(PRODUTO.VRARREDCMP, 0)
               END VRARREDCMP,
               PRODUTO.CDARVPROD,
               MAX(ITEMAUTF.DTPROGENTAF)  OVER (PARTITION BY ITEMAUTF.CDPRODUTO) DTPROGENTAF_MAX,
               MIN(ITEMAUTF.DTENTRITMSOL) OVER (PARTITION BY ITEMAUTF.CDPRODUTO) DTENTRITMSOL_MIN,
               MAX(ITEMAUTF.DTENTRITMSOL) OVER (PARTITION BY ITEMAUTF.CDPRODUTO) DTENTRITMSOL_MAX
            FROM
               ITEMAUTF,
               AUTOFORNE,
               PRODUTO
            WHERE
               (AUTOFORNE.CDFILDEST    = ITEMAUTF.CDFILDEST)         AND
               (AUTOFORNE.CDFILLANC    = ITEMAUTF.CDFILLANC)         AND
               (AUTOFORNE.NRAUTOFORN   = ITEMAUTF.NRAUTOFORN)        AND
               (ITEMAUTF.CDFILDEST     = C_PRODAEMPENHAR.CDFILIAL)   AND
               (ITEMAUTF.CDPRODUTO     = PRODUTO.CDPRODUTO)          AND
               (PRODUTO.CDPRODESTO     = C_PRODAEMPENHAR.CDPRODESTO) AND
               ((AUTOFORNE.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
               --(AUTOFORNE.IDSITUATUAAF IS NULL)                      AND
               --(AUTOFORNE.IDAFFORALIM  = 'N')                        AND
               (NVL(AUTOFORNE.IDBAIXAAF,'0') <> '5')         AND
               (AUTOFORNE.CDFILLANC    = P_CDFILLANC)        AND
               (AUTOFORNE.NRSEQAPURAF  = P_NRSEQAPUR)        AND
               EXISTS (SELECT 1
                         FROM ITEMSOLIRELACAF
                        WHERE ITEMSOLIRELACAF.CDFILDEST    = ITEMAUTF.CDFILDEST
                          AND ITEMSOLIRELACAF.CDFILLANC    = ITEMAUTF.CDFILLANC
                          AND ITEMSOLIRELACAF.NRAUTOFORN   = ITEMAUTF.NRAUTOFORN
                          AND ITEMSOLIRELACAF.CDPRODUTOAF  = ITEMAUTF.CDPRODUTO
                          AND ITEMSOLIRELACAF.CDMARCAAF    = ITEMAUTF.CDMARCA
                          AND ITEMSOLIRELACAF.DTPROGENTAF  = ITEMAUTF.DTPROGENTAF
                          AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                          AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR) AND
                EXISTS ( SELECT 1
                           FROM PRODFORNCOMP
                          WHERE (CDFORNECED = AUTOFORNE.CDFORNECED)
                            AND (CDPRODCOMPL = ITEMAUTF.CDPRODUTO)
                            AND NVL(VRARREDEMPE, 0) > 0
                          UNION
                         SELECT 1
                           FROM MARCPROD
                          WHERE (CDMARCA   = ITEMAUTF.CDMARCA)
                            AND NVL(VRARREDEMPMAR, 0) > 0
                            AND (MARCPROD.CDPRODUTO IN (SELECT P.CDPRODUTO
                                                          FROM PRODUTO P
                                                         WHERE P.CDPRODUTO = MARCPROD.CDPRODUTO
                                                           AND PRODUTO.CDARVPROD LIKE P.CDARVPROD || '%') ) )
            ORDER BY
               AUTOFORNE.CDFORNECED, ITEMAUTF.DTPROGENTAF) /* ESTE "ORDER BY" E NECESSARIO */
         LOOP

            SELECT
               NVL(MAX(VRARREDEMPMAR), 0)
            INTO
               V_VRARREDEMPE /* Arredondamento Marca por Produto (Prioridade sobre o Fornecedor) */
            FROM
               MARCPROD
            WHERE
               (CDMARCA   = C_ITEMAUTF.CDMARCA) AND
               (CDPRODUTO IN (SELECT
                                 P.CDPRODUTO
                              FROM
                                 PRODUTO P
                              WHERE
                                 P.CDPRODUTO = MARCPROD.CDPRODUTO AND
                                 C_ITEMAUTF.CDARVPROD LIKE P.CDARVPROD || '%') );

            IF V_VRARREDEMPE = 0 THEN
               SELECT
                  NVL(MAX(VRARREDEMPE), 0)
               INTO
                  V_VRARREDEMPE
               FROM
                  PRODFORNCOMP
               WHERE
                  (CDFORNECED = C_ITEMAUTF.CDFORNECED) AND
                  (CDPRODCOMPL = C_ITEMAUTF.CDPRODUTO);
            END IF;

            SELECT NVL(MAX(VRMINEMPENHOAF), 0)
              INTO V_REJEICAO
              FROM PRODFILI
             WHERE CDFILIAL  = C_PRODAEMPENHAR.CDFILIAL
               AND CDPRODUTO = C_ITEMAUTF.CDPRODUTO;

            IF V_VRARREDEMPE > 0 THEN

               IF (V_QTARETIRAR > 0) AND (C_PRODAEMPENHAR.QTAEMPENHAR >= V_QTARETIRAR) THEN  /* SE ALGUM ITEM DE SOLICITACAO TEVE SUA QUANTIDADE AUMENTADA, ESTE "IF" IRA COMPLETAR O REMANEJAMENTO DIMINUINDO A QUANTIDADE */
                  SELECT
                     MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
                  FROM
                     ITEMSOLI,
                     PRODUTO
                  WHERE
                     (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)        AND
                     (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL) AND
                     (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)  AND
                     ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                     (PRODUTO.CDPRODESTO  = C_PRODAEMPENHAR.CDPRODESTO) AND
                     (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                  EXISTS (SELECT 1
                            FROM ITEMSOLIRELACAF
                           WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                             AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                             AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                             AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                             AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                             AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                             AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
                  /*Executa a consulta desconsiderando a implementacao da solicitacao 166404*/
                  IF V_NRSOLCOMP IS NULL THEN
                     SELECT
                           MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
                        FROM
                           ITEMSOLI,
                           PRODUTO
                        WHERE
                           (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)        AND
                           (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL) AND
                           (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)  AND
                           ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                           (PRODUTO.CDPRODESTO  = C_PRODAEMPENHAR.CDPRODESTO) AND
                           (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')  AND

                           ITEMSOLI.IDITMCONS  = 'N'              AND
                           ITEMSOLI.CDFILIOPELOG IS NULL;
                  END IF;

                  SELECT
                     NVL(SUM(ITEMSOLI.QTSOLIPROD * PRODUTO.VRFATOCONV), 0) INTO V_QTSOLIPROD
                  FROM
                     ITEMSOLI,
                     PRODUTO
                  WHERE
                     (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)        AND
                     (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL) AND
                     (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)  AND
                     ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                     (PRODUTO.CDPRODESTO  = C_PRODAEMPENHAR.CDPRODESTO)      AND
                     (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                  EXISTS (SELECT 1
                            FROM ITEMSOLIRELACAF
                           WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                             AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                             AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                             AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                             AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                             AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                             AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
                  IF V_QTSOLIPROD <= V_QTARETIRAR THEN /* O ITEM DA SOLICITACAO SERA EXCLUIDO CASO TENHA QUE RETIRAR UMA QUANTIDADE MAIOR QUE A SUA PROPRIA */
                     FOR C_ITEMSOLI IN( SELECT
                                           ITEMSOLI.NRSOLICMP, ITEMSOLI.CDFILLAN, ITEMSOLI.CDPRODUTO, ITEMSOLI.QTSOLIPROD
                                        FROM
                                           ITEMSOLI,
                                           PRODUTO
                                        WHERE
                                           (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)        AND
                                           (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL) AND
                                           (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)  AND
                                           ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                                           (PRODUTO.CDPRODESTO  = C_PRODAEMPENHAR.CDPRODESTO)      AND
                                           (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                                        EXISTS (SELECT 1
                                                  FROM ITEMSOLIRELACAF
                                                 WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                                   AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                                   AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                                   AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                                   AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                                   AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                                   AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR))
                     LOOP
                        /* Log de Alteracao */
                        INSERT INTO MOVOPSOL
                          (CDFILSOLMOV,
                           CDFILLANMOV,
                           NRSOLIMOV,
                           CDPRODUTO,
                           DTENTROPER,
                           DTOPERSOL,
                           CDOPERADOR,
                           QTANTOPER,
                           QTDEPOPER,
                           DSJUSTOPER)
                        VALUES
                          (C_PRODAEMPENHAR.CDFILIAL,
                           C_ITEMSOLI.CDFILLAN,
                           C_ITEMSOLI.NRSOLICMP,
                           C_ITEMSOLI.CDPRODUTO,
                           C_ITEMAUTF.DTENTRITMSOL,
                           SYSDATE,
                           P_CDOPERADOR,
                           C_ITEMSOLI.QTSOLIPROD,
                           0,
                           'Empenho de AF');

                        DELETE FROM ITEMSOLI
                        WHERE
                           (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                           (CDFILLAN   = C_ITEMSOLI.CDFILLAN)  AND
                           (NRSOLICMP  = C_ITEMSOLI.NRSOLICMP)  AND
                           (CDPRODUTO  = C_ITEMSOLI.CDPRODUTO) AND
                           (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                           (NVL(IDSOLIAPROV,'S') = 'S');
                     END LOOP;
                     DELETE FROM ITEMAUTF
                     WHERE
                        (CDFILDEST   = C_PRODAEMPENHAR.CDFILIAL) AND
                        (CDFILLANC   = P_CDFILLANC)              AND
                        (NRAUTOFORN  = C_ITEMAUTF.NRAUTOFORN)    AND
                        (CDPRODUTO   = C_ITEMAUTF.CDPRODUTO)     AND
                        (CDMARCA     = C_ITEMAUTF.CDMARCA)       AND
                        (DTPROGENTAF = C_ITEMAUTF.DTPROGENTAF);

                     V_LISTA_AF_AUX := 0;

                     SELECT
                        COUNT(*) INTO V_LISTA_AF_AUX
                     FROM
                        LISTA
                     WHERE
                        NRLISTA = V_LISTA_AFS AND
                        CDLISTA = C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN;

                     IF V_LISTA_AF_AUX = 0 THEN
                        INSERT INTO LISTA
                        (NRLISTA, CDLISTA)
                        VALUES
                        (V_LISTA_AFS, C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN);
                     END IF;

                     V_QTARETIRAR := V_QTARETIRAR - V_QTSOLIPROD;
                     V_QTAEMPENHAR := V_QTAEMPENHAR - ( (C_ITEMAUTF.QTPROGENTAF * C_ITEMAUTF.VRFATOCONV));
                  ELSE
                     FOR C_ITEMSOLI IN(SELECT
                                          ITEMSOLI.NRSOLICMP, ITEMSOLI.CDFILLAN, ITEMSOLI.CDPRODUTO,
                                          PRODUTO.VRFATOCONV, (ITEMSOLI.QTSOLIPROD*PRODUTO.VRFATOCONV) QTSOLIPROD
                                       FROM
                                          ITEMSOLI,
                                          PRODUTO
                                       WHERE
                                          (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)        AND
                                          (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL) AND
                                          (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)  AND
                                          ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                                          (PRODUTO.CDPRODESTO  = C_PRODAEMPENHAR.CDPRODESTO)      AND
                                          (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                                       EXISTS (SELECT 1
                                                 FROM ITEMSOLIRELACAF
                                                WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                                  AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                                  AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                                  AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                                  AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                                  AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                                  AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR)
                                       ORDER BY QTSOLIPROD)
                     LOOP
                        IF ((C_ITEMSOLI.QTSOLIPROD > V_QTARETIRAR) AND (V_QTARETIRAR > 0)) THEN
                           /* Log de Alteracao */
                           INSERT INTO MOVOPSOL
                             (CDFILSOLMOV,
                              CDFILLANMOV,
                              NRSOLIMOV,
                              CDPRODUTO,
                              DTENTROPER,
                              DTOPERSOL,
                              CDOPERADOR,
                              QTANTOPER,
                              QTDEPOPER,
                              DSJUSTOPER)
                           SELECT
                              ITEMSOLI.CDFILSOLI,
                              ITEMSOLI.CDFILLAN,
                              ITEMSOLI.NRSOLICMP,
                              ITEMSOLI.CDPRODUTO,
                              ITEMSOLI.DTPROGENTR,
                              SYSDATE,
                              P_CDOPERADOR,
                              ITEMSOLI.QTSOLIPROD,
                              ITEMSOLI.QTSOLIPROD - V_QTARETIRAR / C_ITEMSOLI.VRFATOCONV,
                              'Empenho de AF'
                           FROM
                              ITEMSOLI
                           WHERE
                              (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                              (ITEMSOLI.CDFILLAN   = C_ITEMSOLI.CDFILLAN)  AND
                              (ITEMSOLI.NRSOLICMP  = C_ITEMSOLI.NRSOLICMP)  AND
                              (ITEMSOLI.CDPRODUTO  = C_ITEMSOLI.CDPRODUTO) AND
                              (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                              (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');

                           UPDATE ITEMSOLI
                           SET QTSOLIPROD = QTSOLIPROD - V_QTARETIRAR/C_ITEMSOLI.VRFATOCONV
                           WHERE
                              (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                              (CDFILLAN   = C_ITEMSOLI.CDFILLAN)  AND
                              (NRSOLICMP  = C_ITEMSOLI.NRSOLICMP)  AND
                              (CDPRODUTO  = C_ITEMSOLI.CDPRODUTO) AND
                              (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                              (NVL(IDSOLIAPROV,'S') = 'S');

                           UPDATE ITEMSOLIRELACAF
                           SET QTSOLIPROD = QTSOLIPROD - V_QTARETIRAR/C_ITEMSOLI.VRFATOCONV
                           WHERE
                              (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)AND
                              (CDFILLAN   = C_ITEMSOLI.CDFILLAN)     AND
                              (NRSOLICMP  = C_ITEMSOLI.NRSOLICMP)    AND
                              (CDPRODUTO  = C_ITEMSOLI.CDPRODUTO)    AND
                              (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL) AND
                              CDCENTITMAP= P_CDFILCENTCMP            AND
                              NRSEQITMAP = P_NRSEQAPUR               AND
                              CDFILDEST  = C_PRODAEMPENHAR.CDFILIAL  AND
                              CDFILLANC  = P_CDFILLANC               AND
                              NRAUTOFORN = C_ITEMAUTF.NRAUTOFORN     AND
                              CDMARCAAF  = C_ITEMAUTF.CDMARCA        AND
                              CDPRODUTOAF= C_ITEMAUTF.CDPRODUTO      AND
                              DTPROGENTAF= C_ITEMAUTF.DTPROGENTAF;
                           V_QTARETIRAR := 0;
                           EXIT;
                        ELSE
                           /* Log de Alteracao */
                           INSERT INTO MOVOPSOL
                             (CDFILSOLMOV,
                              CDFILLANMOV,
                              NRSOLIMOV,
                              CDPRODUTO,
                              DTENTROPER,
                              DTOPERSOL,
                              CDOPERADOR,
                              QTANTOPER,
                              QTDEPOPER,
                              DSJUSTOPER)
                           VALUES
                             (C_PRODAEMPENHAR.CDFILIAL,
                              C_ITEMSOLI.CDFILLAN,
                              C_ITEMSOLI.NRSOLICMP,
                              C_ITEMSOLI.CDPRODUTO,
                              C_ITEMAUTF.DTENTRITMSOL,
                              SYSDATE,
                              P_CDOPERADOR,
                              C_ITEMSOLI.QTSOLIPROD/C_ITEMSOLI.VRFATOCONV,
                              0,
                              'Empenho de AF');

                           DELETE FROM ITEMSOLI
                           WHERE
                              (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                              (CDFILLAN   = C_ITEMSOLI.CDFILLAN)  AND
                              (NRSOLICMP  = C_ITEMSOLI.NRSOLICMP)  AND
                              (CDPRODUTO  = C_ITEMSOLI.CDPRODUTO) AND
                              (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                              (NVL(IDSOLIAPROV,'S') = 'S');
                           V_QTARETIRAR := V_QTARETIRAR-C_ITEMSOLI.QTSOLIPROD;
                        END IF;
                     END LOOP;
                     V_QTARETIRAR := 0;
                  END IF;
               END IF;

               IF V_QTARETIRAR = 0 THEN  /* SE O REMANEJAMENTO DAS ENTREGAS ANTERIORES FOI FINALIZADO NO "IF" ACIMA, ESTE "IF" IRA VERIFICAR SE SERA NECESSARIO FAZER OUTRO REMANEJAMENTO PUXANDO DE ENTREGAS FUTURAS */
                  SELECT
                     MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
                  FROM
                     ITEMSOLI,
                     PRODUTO
                  WHERE
                     (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)        AND
                     (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL) AND
                     (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)  AND
                     ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                     (PRODUTO.CDPRODESTO  = C_PRODAEMPENHAR.CDPRODESTO)      AND
                     (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                  EXISTS (SELECT 1
                            FROM ITEMSOLIRELACAF
                           WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                             AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                             AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                             AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                             AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                             AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                             AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
                  /*Executa a consulta desconsiderando a implementacao da solicitacao 166404*/
                  IF V_NRSOLCOMP IS NULL THEN
                     SELECT
                        MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
                     FROM
                        ITEMSOLI,
                        PRODUTO
                     WHERE
                        (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)        AND
                        (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL) AND
                        (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)  AND
                        ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                        (PRODUTO.CDPRODESTO  = C_PRODAEMPENHAR.CDPRODESTO)      AND
                        (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND

                        ITEMSOLI.IDITMCONS  = 'N'              AND
                        ITEMSOLI.CDFILIOPELOG IS NULL          AND
                        NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S';

                  END IF;
                  IF V_NRSOLCOMP IS NOT NULL THEN  /* SE AINDA EXITIR SOLICITACAO PARA ESTA ENTREGA... */
                     SELECT
                        NVL(SUM(ITEMSOLI.QTSOLIPROD * PRODUTO.VRFATOCONV), 0) INTO V_QTSOLIPROD
                     FROM
                        ITEMSOLI,
                        PRODUTO
                     WHERE
                        (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)        AND
                        (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL) AND
                        (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)  AND
                        ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                        (PRODUTO.CDPRODESTO  = C_PRODAEMPENHAR.CDPRODESTO)      AND
                        (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                     EXISTS (SELECT 1
                               FROM ITEMSOLIRELACAF
                              WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
                     V_QTARETIRAR := (C_ITEMAUTF.QTPROGENTAF * C_ITEMAUTF.VRFATOCONV) - V_QTSOLIPROD;

                     IF (V_QTARETIRAR > 0) AND (C_PRODAEMPENHAR.QTAEMPENHAR >= V_QTARETIRAR) THEN

   /*################################ AJUSTANDO V_QTARETIRAR PARA O VALOR QUE TEM DISPONIVEL PARA REMANEJAR ###############################*/
                        SELECT
                           MAX(ITEMAUTF.DTENTRITMSOL)
                        INTO
                           V_DTULTENTR
                        FROM
                           ITEMAUTF,
                           AUTOFORNE
                        WHERE
                           (AUTOFORNE.CDFILDEST = ITEMAUTF.CDFILDEST)      AND
                           (AUTOFORNE.CDFILLANC = ITEMAUTF.CDFILLANC)      AND
                           (AUTOFORNE.NRAUTOFORN = ITEMAUTF.NRAUTOFORN)    AND
                           (ITEMAUTF.CDPRODUTO = C_ITEMAUTF.CDPRODUTO)     AND
                           (ITEMAUTF.CDFILDEST = C_PRODAEMPENHAR.CDFILIAL) AND
                           ((AUTOFORNE.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
                           (AUTOFORNE.IDSITUATUAAF IS NULL)                AND
                           (AUTOFORNE.IDAFFORALIM = 'N')                   AND
                           (NVL(AUTOFORNE.IDBAIXAAF,'0') <> '5')           AND
                           (AUTOFORNE.CDFILLANC = P_CDFILLANC)             AND
                           (AUTOFORNE.NRSEQAPURAF = P_NRSEQAPUR);

                        SELECT
                           SUM(ITEMSOLI.QTSOLIPROD * PRODUTO.VRFATOCONV) INTO V_QTDISPONIVEL
                        FROM
                           ITEMSOLI,
                           PRODUTO
                        WHERE
                           (ITEMSOLI.CDFILSOLI  =  C_PRODAEMPENHAR.CDFILIAL)   AND
                           (PRODUTO.CDPRODESTO  =  C_PRODAEMPENHAR.CDPRODESTO) AND
                           (ITEMSOLI.DTPROGENTR >  C_ITEMAUTF.DTENTRITMSOL)    AND
                           (ITEMSOLI.DTPROGENTR <= V_DTULTENTR)                AND
                           ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                           (ITEMSOLI.CDPRODUTO  =  PRODUTO.CDPRODUTO)          AND
                           (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')    AND
                        EXISTS (SELECT 1
                                  FROM ITEMSOLIRELACAF
                                 WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                   AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                   AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                   AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                   AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                   AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                   AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
                        IF V_QTDISPONIVEL IS NULL THEN
                           SELECT
                              SUM(ITEMSOLI.QTSOLIPROD * PRODUTO.VRFATOCONV) INTO V_QTDISPONIVEL
                           FROM
                              ITEMSOLI,
                              PRODUTO
                           WHERE
                              (ITEMSOLI.CDFILSOLI  =  C_PRODAEMPENHAR.CDFILIAL)   AND
                              (PRODUTO.CDPRODESTO  =  C_PRODAEMPENHAR.CDPRODESTO) AND
                              (ITEMSOLI.DTPROGENTR >  C_ITEMAUTF.DTENTRITMSOL)    AND
                              (ITEMSOLI.DTPROGENTR <= V_DTULTENTR)                AND
                              ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                              (ITEMSOLI.CDPRODUTO  =  PRODUTO.CDPRODUTO)          AND
                              (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')         AND

                              (ITEMSOLI.IDITMCONS  = 'N')                   AND
                               ITEMSOLI.CDFILIOPELOG IS NULL;
                        END IF;
                        IF NVL(V_QTDISPONIVEL, 0) > 0 THEN
                           IF V_QTARETIRAR > NVL(V_QTDISPONIVEL, 0) THEN
                              V_QTARETIRAR := NVL(V_QTDISPONIVEL, 0);
                           END IF;
                        END IF;

                        V_QTARRED := V_QTARETIRAR/C_ITEMAUTF.VRFATOCONV;
                        IF C_ITEMAUTF.VRARREDCMP > 0 THEN
                           V_QTARRED := FLOOR(V_QTARRED / C_ITEMAUTF.VRARREDCMP) * C_ITEMAUTF.VRARREDCMP; /* TEM QUE ARREDONDAR PARA BAIXO PARA NAO TIRAR MAIS DO QUE DEVIA */
                        END IF;

                        IF V_VRARREDEMPE > 0 THEN
                           V_QTARRED := FLOOR(V_QTARRED / V_VRARREDEMPE) * V_VRARREDEMPE; /* TEM QUE ARREDONDAR PARA BAIXO PARA NAO TIRAR MAIS DO QUE DEVIA */
                        END IF;

                        IF V_QTARRED > 0 THEN
                           UPDATE ITEMAUTF
                           SET QTPROGENTAF = QTPROGENTAF - V_QTARRED
                           WHERE
                              (CDFILDEST   = C_PRODAEMPENHAR.CDFILIAL) AND
                              (CDFILLANC   = P_CDFILLANC)              AND
                              (NRAUTOFORN  = C_ITEMAUTF.NRAUTOFORN)    AND
                              (CDPRODUTO   = C_ITEMAUTF.CDPRODUTO)     AND
                              (CDMARCA     = C_ITEMAUTF.CDMARCA)       AND
                              (DTPROGENTAF = C_ITEMAUTF.DTPROGENTAF);

                        V_LISTA_AF_AUX := 0;

                        SELECT
                           COUNT(*) INTO V_LISTA_AF_AUX
                        FROM
                           LISTA
                        WHERE
                           NRLISTA = V_LISTA_AFS AND
                           CDLISTA = C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN;

                        IF V_LISTA_AF_AUX = 0 THEN
                           INSERT INTO LISTA
                           (NRLISTA, CDLISTA)
                           VALUES
                           (V_LISTA_AFS, C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN);
                        END IF;

                           V_QTAEMPENHAR := V_QTAEMPENHAR - (V_QTARRED * C_ITEMAUTF.VRFATOCONV);
                           V_QTARETIRAR  := V_QTARETIRAR - (V_QTARRED * C_ITEMAUTF.VRFATOCONV);
                        END IF;
                        IF ((V_IDSISDOS <> '3') AND (C_ITEMAUTF.DTENTRITMSOL_MAX = C_ITEMAUTF.DTENTRITMSOL)) THEN
                           V_QTARETIRAR  := 0;
                           V_QTAEMPENHAR := 0;
                        END IF;

                        IF (V_QTARETIRAR > 0) AND (C_PRODAEMPENHAR.QTAEMPENHAR >= V_QTARETIRAR)  THEN
                           IF V_QTARETIRAR <= V_QTAEMPENHAR THEN
                              SELECT
                                 MAX(PRODUTO.VRFATOCONV) INTO V_VRFATOCONV
                              FROM
                                 ITEMSOLI,
                                 PRODUTO
                              WHERE
                                 (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)           AND
                                 (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                                 (ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                                 (ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                                 (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                                 (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                                 (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');

                              /* Log de Alteracao */
                              INSERT INTO MOVOPSOL
                                (CDFILSOLMOV,
                                 CDFILLANMOV,
                                 NRSOLIMOV,
                                 CDPRODUTO,
                                 DTENTROPER,
                                 DTOPERSOL,
                                 CDOPERADOR,
                                 QTANTOPER,
                                 QTDEPOPER,
                                 DSJUSTOPER)
                              SELECT
                                 ITEMSOLI.CDFILSOLI,
                                 ITEMSOLI.CDFILLAN,
                                 ITEMSOLI.NRSOLICMP,
                                 ITEMSOLI.CDPRODUTO,
                                 ITEMSOLI.DTPROGENTR,
                                 SYSDATE,
                                 P_CDOPERADOR,
                                 ITEMSOLI.QTSOLIPROD,
                                 ITEMSOLI.QTSOLIPROD + V_QTARETIRAR / V_VRFATOCONV,
                                 'Empenho de AF'
                              FROM
                                 ITEMSOLI
                              WHERE
                                 (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                                 (ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                                 (ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                                 (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                                 (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                                 (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');
                              IF ((V_REJEICAO = 0) OR ((V_REJEICAO > 0) AND (C_ITEMAUTF.DTPROGENTAF_MAX <> C_ITEMAUTF.DTPROGENTAF))) THEN
                                 UPDATE ITEMSOLI
                                 SET QTSOLIPROD = QTSOLIPROD + V_QTARETIRAR/V_VRFATOCONV
                                 WHERE
                                    (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                                    (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                                    (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                                    (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                                    (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                                    (NVL(IDSOLIAPROV,'S') = 'S');

                                 UPDATE ITEMSOLIRELACAF
                                 SET QTSOLIPROD = QTSOLIPROD + V_QTARETIRAR/V_VRFATOCONV
                                 WHERE
                                    (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                                    (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                                    (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                                    (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                                    (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                                    CDCENTITMAP= P_CDFILCENTCMP            AND
                                    NRSEQITMAP = P_NRSEQAPUR               AND
                                    CDFILDEST  = C_PRODAEMPENHAR.CDFILIAL  AND
                                    CDFILLANC  = P_CDFILLANC               AND
                                    NRAUTOFORN = C_ITEMAUTF.NRAUTOFORN     AND
                                    CDMARCAAF  = C_ITEMAUTF.CDMARCA        AND
                                    CDPRODUTOAF= C_ITEMAUTF.CDPRODUTO      AND
                                    DTPROGENTAF= C_ITEMAUTF.DTPROGENTAF;

                              END IF;
                           END IF;
                        END IF;
                     END IF;
                  END IF;
               END IF;
               /* Inicio % de Rejeicao */
               IF V_NRSOLCOMP IS NOT NULL THEN
                  V_NRSOLCOMP_AUX := V_NRSOLCOMP;
               END IF;
               IF (C_ITEMAUTF.DTPROGENTAF = C_ITEMAUTF.DTPROGENTAF_MAX) THEN
                  V_NRSOLCOMP := V_NRSOLCOMP_AUX;
                  IF V_REJEICAO > 0 THEN
                     SELECT
                          COUNT(*)
                       INTO
                          V_COUNT
                       FROM
                          ITEMSOLI
                       WHERE
                          (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                          (ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                          (ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                          (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                          (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')               AND
                          (ITEMSOLI.DTPROGENTR BETWEEN C_ITEMAUTF.DTENTRITMSOL_MIN AND C_ITEMAUTF.DTENTRITMSOL_MAX);

                     IF ((V_COUNT > 1) OR ((V_QTSOLIPROD > C_ITEMAUTF.VRFATOCONV) AND (V_COUNT = 1))) THEN
                        SELECT MAX(ITEMSOLI.DTPROGENTR)
                          INTO V_DTPULTENTR
                          FROM ITEMSOLI
                         WHERE (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)
                           AND (ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))
                           AND (ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))
                           AND (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10))
                           AND (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')
                           AND (ITEMSOLI.DTPROGENTR BETWEEN C_ITEMAUTF.DTENTRITMSOL_MIN AND C_ITEMAUTF.DTENTRITMSOL_MAX);

                        SELECT NVL(MAX(MOD(ITEMSOLI.QTSOLIPROD, C_ITEMAUTF.VRFATOCONV)), 0),
                               NVL(MAX(ITEMSOLI.QTSOLIPROD), 0)
                          INTO V_QTDFINAL,
                               V_QTDINTDIV
                          FROM ITEMSOLI
                         WHERE (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                               (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                               (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                               (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                               (DTPROGENTR = V_DTPULTENTR)     AND
                               (NVL(IDSOLIAPROV,'S') = 'S');

                        V_PERCENTUAL := V_REJEICAO*C_ITEMAUTF.VRFATOCONV/100;
                        IF (V_QTDFINAL > 0) AND (V_QTDFINAL < (V_PERCENTUAL)) THEN
                           INSERT INTO MOVOPSOL
                                      (CDFILSOLMOV,
                                       CDFILLANMOV,
                                       NRSOLIMOV,
                                       CDPRODUTO,
                                       DTENTROPER,
                                       DTOPERSOL,
                                       CDOPERADOR,
                                       QTANTOPER,
                                       QTDEPOPER,
                                       DSJUSTOPER)
                                    SELECT
                                       ITEMSOLI.CDFILSOLI,
                                       ITEMSOLI.CDFILLAN,
                                       ITEMSOLI.NRSOLICMP,
                                       ITEMSOLI.CDPRODUTO,
                                       ITEMSOLI.DTPROGENTR,
                                       SYSDATE,
                                       P_CDOPERADOR,
                                       (ITEMSOLI.QTSOLIPROD),
                                       (ITEMSOLI.QTSOLIPROD - V_QTDFINAL),
                                       'Empenho de AF com % de rejeicao'
                                    FROM ITEMSOLI
                                    WHERE (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                                          (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                                          (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                                          (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                                          (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL);

                           UPDATE ITEMSOLI
                           SET QTSOLIPROD = QTSOLIPROD - V_QTDFINAL
                           WHERE (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)  AND
                               (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                               (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                               (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                               (DTPROGENTR = V_DTPULTENTR)     AND
                               (NVL(IDSOLIAPROV,'S') = 'S')               AND
                               (QTSOLIPROD - V_QTDFINAL) > 0;

                           UPDATE ITEMSOLIRELACAF
                           SET QTSOLIPROD = QTSOLIPROD - V_QTDFINAL
                           WHERE (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)  AND
                               (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                               (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                               (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                               (DTPROGENTR = V_DTPULTENTR)                AND
                               (QTSOLIPROD - V_QTDFINAL) > 0              AND
                               CDCENTITMAP= P_CDFILCENTCMP                AND
                               NRSEQITMAP = P_NRSEQAPUR                   AND
                               CDFILDEST  = C_PRODAEMPENHAR.CDFILIAL      AND
                               CDFILLANC  = P_CDFILLANC                   AND
                               NRAUTOFORN = C_ITEMAUTF.NRAUTOFORN         AND
                               CDMARCAAF  = C_ITEMAUTF.CDMARCA            AND
                               CDPRODUTOAF= C_ITEMAUTF.CDPRODUTO          AND
                               DTPROGENTAF= C_ITEMAUTF.DTPROGENTAF;
                               
                           IF SQL%NOTFOUND THEN
                              DELETE
                                FROM  ITEMSOLI
                              WHERE (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)  AND
                                  (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                                  (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                                  (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                                  (DTPROGENTR = V_DTPULTENTR)     AND
                                  (NVL(IDSOLIAPROV,'S') = 'S');
                           END IF;

                           UPDATE ITEMAUTF
                           SET QTPROGENTAF = QTPROGENTAF - 1
                           WHERE
                              (CDFILDEST   = C_PRODAEMPENHAR.CDFILIAL) AND
                              (CDFILLANC   = P_CDFILLANC)              AND
                              (NRAUTOFORN  = C_ITEMAUTF.NRAUTOFORN)    AND
                              (CDPRODUTO   = C_ITEMAUTF.CDPRODUTO)     AND
                              (CDMARCA     = C_ITEMAUTF.CDMARCA)       AND
                              (DTENTRITMSOL  = V_DTPULTENTR)   AND
                              (QTPROGENTAF > 1);
                           IF SQL%NOTFOUND THEN    /*Caso o update acima nao altere nada, sera excluido a AF, isso ocrre quando a quantidade da AF e igual ou menor que as qntidades ja empenhadas (16-03-2016 Alibras)*/
                              DELETE FROM ITEMAUTF
                              WHERE
                                 (CDFILDEST   = C_PRODAEMPENHAR.CDFILIAL) AND
                                 (CDFILLANC   = P_CDFILLANC)              AND
                                 (NRAUTOFORN  = C_ITEMAUTF.NRAUTOFORN)    AND
                                 (CDPRODUTO   = C_ITEMAUTF.CDPRODUTO)     AND
                                 (CDMARCA     = C_ITEMAUTF.CDMARCA)       AND
                                 (DTENTRITMSOL  = V_DTPULTENTR);
                           END IF;
                        END IF;
                     END IF;
                  END IF;
                  /*INICIO SOLICITACAO 182441 PARA AJUSTAR EMPENHO DA ULTIMA ENTREGA*/
                  IF ((V_IDSISDOS = '3') AND (C_ITEMAUTF.DTENTRITMSOL_MAX = C_ITEMAUTF.DTENTRITMSOL)) THEN
                     SELECT
                        MAX(ITEMSOLI.DTPROGENTR) INTO V_DTENTRITMSOL_MAX
                     FROM
                        ITEMSOLI,
                        PRODUTO
                     WHERE
                        (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                        (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                        (ITEMSOLI.DTPROGENTR <= C_ITEMAUTF.DTENTRITMSOL)    AND
                        (PRODUTO.CDPRODESTO  = C_PRODAEMPENHAR.CDPRODESTO)  AND
                        (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)           AND
                        (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')               AND
                     EXISTS (SELECT 1
                               FROM ITEMSOLIRELACAF
                              WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
                     SELECT
                        NVL(SUM(ITEMSOLI.QTSOLIPROD * PRODUTO.VRFATOCONV), 0) INTO V_QTSOLIPRODF
                     FROM
                        ITEMSOLI,
                        PRODUTO
                     WHERE
                        (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                        (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                        (ITEMSOLI.DTPROGENTR = V_DTENTRITMSOL_MAX)     AND
                        (PRODUTO.CDPRODESTO  = C_PRODAEMPENHAR.CDPRODESTO)  AND
                        (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)           AND
                        (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')               AND
                     EXISTS (SELECT 1
                               FROM ITEMSOLIRELACAF
                              WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);

                     SELECT SUM(ITEMAUTF.QTPROGENTAF*C_ITEMAUTF.VRFATOCONV)
                       INTO V_QTPROGENTAF
                       FROM ITEMAUTF, AUTOFORNE
                      WHERE
                         (AUTOFORNE.CDFILDEST    = ITEMAUTF.CDFILDEST)         AND
                         (AUTOFORNE.CDFILLANC    = ITEMAUTF.CDFILLANC)         AND
                         (AUTOFORNE.NRAUTOFORN   = ITEMAUTF.NRAUTOFORN)        AND
                         (AUTOFORNE.NRSEQAPURAF  = P_NRSEQAPUR)                AND
                         ((AUTOFORNE.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
                         (NVL(AUTOFORNE.IDBAIXAAF,'0') = '6')             AND
                         (ITEMAUTF.CDFILDEST   = C_PRODAEMPENHAR.CDFILIAL) AND
                         (ITEMAUTF.CDFILLANC   = P_CDFILLANC)              AND
                         (ITEMAUTF.CDPRODUTO   = C_ITEMAUTF.CDPRODUTO)     AND
                         (ITEMAUTF.CDMARCA     = C_ITEMAUTF.CDMARCA)       AND
                         (ITEMAUTF.DTENTRITMSOL  = V_DTENTRITMSOL_MAX)     AND
                         (ITEMAUTF.QTPROGENTAF > 1) AND
                      EXISTS (SELECT 1
                                FROM ITEMSOLIRELACAF
                               WHERE ITEMSOLIRELACAF.CDFILDEST    = ITEMAUTF.CDFILDEST
                                 AND ITEMSOLIRELACAF.CDFILLANC    = ITEMAUTF.CDFILLANC
                                 AND ITEMSOLIRELACAF.NRAUTOFORN   = ITEMAUTF.NRAUTOFORN
                                 AND ITEMSOLIRELACAF.CDPRODUTOAF  = ITEMAUTF.CDPRODUTO
                                 AND ITEMSOLIRELACAF.CDMARCAAF    = ITEMAUTF.CDMARCA
                                 AND ITEMSOLIRELACAF.DTPROGENTAF  = ITEMAUTF.DTPROGENTAF
                                 AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                 AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
                     IF (V_QTPROGENTAF - V_QTSOLIPRODF) > 0 THEN
                        SELECT
                           MAX(PRODUTO.VRFATOCONV) INTO V_VRFATOCONV
                        FROM
                           ITEMSOLI,
                           PRODUTO
                        WHERE
                           (ITEMSOLI.CDPRODUTO  = PRODUTO.CDPRODUTO)           AND
                           (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                           (ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                           (ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                           (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                           (ITEMSOLI.DTPROGENTR = V_DTENTRITMSOL_MAX)     AND
                           (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');
                        /* Log de Alterao */
                        INSERT INTO MOVOPSOL
                          (CDFILSOLMOV,
                           CDFILLANMOV,
                           NRSOLIMOV,
                           CDPRODUTO,
                           DTENTROPER,
                           DTOPERSOL,
                           CDOPERADOR,
                           QTANTOPER,
                           QTDEPOPER,
                           DSJUSTOPER)
                        SELECT
                           ITEMSOLI.CDFILSOLI,
                           ITEMSOLI.CDFILLAN,
                           ITEMSOLI.NRSOLICMP,
                           ITEMSOLI.CDPRODUTO,
                           ITEMSOLI.DTPROGENTR,
                           SYSDATE,
                           P_CDOPERADOR,
                           ITEMSOLI.QTSOLIPROD,
                           V_QTPROGENTAF / V_VRFATOCONV,
                           'Empenho de AF'
                        FROM
                           ITEMSOLI
                        WHERE
                           (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                           (ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                           (ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                           (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                           (ITEMSOLI.DTPROGENTR = V_DTENTRITMSOL_MAX)     AND
                           (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');
                        UPDATE ITEMSOLI
                        SET QTSOLIPROD = QTSOLIPROD+((V_QTPROGENTAF-V_QTSOLIPRODF)/ V_VRFATOCONV)
                        WHERE
                           (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                           (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                           (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                           (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                           (DTPROGENTR = V_DTENTRITMSOL_MAX)     AND
                           (NVL(IDSOLIAPROV,'S') = 'S');

                        UPDATE ITEMSOLIRELACAF
                        SET QTSOLIPROD = QTSOLIPROD+((V_QTPROGENTAF-V_QTSOLIPRODF)/ V_VRFATOCONV)
                        WHERE
                           (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                           (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                           (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                           (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                           (DTPROGENTR = V_DTENTRITMSOL_MAX)          AND
                           CDCENTITMAP= P_CDFILCENTCMP                AND
                           NRSEQITMAP = P_NRSEQAPUR                   AND
                           CDFILDEST  = C_PRODAEMPENHAR.CDFILIAL      AND
                           CDFILLANC  = P_CDFILLANC                   AND
                           NRAUTOFORN = C_ITEMAUTF.NRAUTOFORN         AND
                           CDMARCAAF  = C_ITEMAUTF.CDMARCA            AND
                           CDPRODUTOAF= C_ITEMAUTF.CDPRODUTO          AND
                           DTPROGENTAF= C_ITEMAUTF.DTPROGENTAF;
                     END IF;
                  END IF;
                  /*FIM SOLICITACAO 182441 PARA AJUSTAR EMPENHO DA ULTIMA ENTREGA*/
               END IF;
               /* Fim do % de Rejeicao*/
            END IF;
         END LOOP;
      END LOOP;
   END IF;
   IF ((V_IDCONSPRSOL = 'S') AND (V_NRLOGCORTEOL = 0))THEN
      FOR C_PRODAEMPENHAR IN /* RETORNA OS PRODUTOS QUE TEM AF COM QUANTIDADE MAIOR QUE A DA SOLICITACAO */
        (SELECT
            CDFILIAL,
            CDPRODUTO,
            SUM(QTDECOMP) AS QTAEMPENHAR
         FROM
            (SELECT
                ITEMAUTF.CDFILDEST AS CDFILIAL,
                ITEMAUTF.CDPRODUTO,
                ITEMAUTF.DTENTRITMSOL,
                SUM(ITEMAUTF.QTPROGENTAF) -
                (SELECT
                    SUM(ITEMSOLI.QTSOLIPROD)
                 FROM
                    ITEMSOLI
                 WHERE
                    (ITEMSOLI.CDFILSOLI  = ITEMAUTF.CDFILDEST)    AND
                    (ITEMSOLI.DTPROGENTR = ITEMAUTF.DTENTRITMSOL) AND
                    (ITEMSOLI.IDITMCONS  = 'N')                   AND
                    ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                    (ITEMSOLI.CDPRODUTO  = ITEMAUTF.CDPRODUTO)    AND
                    (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')         AND
                    EXISTS (SELECT 1
                         FROM ITEMSOLIRELACAF
                        WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                          AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                          AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                          AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                          AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                          AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                          AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR)) AS QTDECOMP
             FROM
                ITEMAUTF,
                AUTOFORNE
             WHERE
                (AUTOFORNE.CDFILDEST = ITEMAUTF.CDFILDEST)   AND
                (AUTOFORNE.CDFILLANC = ITEMAUTF.CDFILLANC)   AND
                (AUTOFORNE.NRAUTOFORN = ITEMAUTF.NRAUTOFORN) AND
                ((AUTOFORNE.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
                --(AUTOFORNE.IDSITUATUAAF IS NULL)             AND
                --(AUTOFORNE.IDAFFORALIM = 'N')                AND
                (NVL(AUTOFORNE.IDBAIXAAF,'0') <> '5')        AND
                (AUTOFORNE.CDFILLANC = P_CDFILLANC)          AND
                (AUTOFORNE.NRSEQAPURAF = P_NRSEQAPUR)
             GROUP BY
                ITEMAUTF.CDFILDEST,
                ITEMAUTF.CDPRODUTO,
                ITEMAUTF.DTENTRITMSOL
             HAVING
                SUM(ITEMAUTF.QTPROGENTAF) >
                (SELECT
                    SUM(ITEMSOLI.QTSOLIPROD)
                 FROM
                    ITEMSOLI
                 WHERE
                    (ITEMSOLI.CDFILSOLI  = ITEMAUTF.CDFILDEST)    AND
                    (ITEMSOLI.DTPROGENTR = ITEMAUTF.DTENTRITMSOL) AND
                    (ITEMSOLI.IDITMCONS  = 'N')                   AND
                    (ITEMSOLI.CDPRODUTO  = ITEMAUTF.CDPRODUTO)    AND
                    ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                    (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                    EXISTS (SELECT 1
                         FROM ITEMSOLIRELACAF
                        WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                          AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                          AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                          AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                          AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                          AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                          AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR)))
         GROUP BY
            CDFILIAL,
            CDPRODUTO)
      LOOP
         V_QTAEMPENHAR := C_PRODAEMPENHAR.QTAEMPENHAR;
         V_QTARETIRAR  := 0;
         FOR C_ITEMAUTF IN  /* RETORNA AS DATAS DE ENTREGA DOS PRODUTOS QUE TEM QUANTIDADE A COMPRAR */
           (SELECT
               AUTOFORNE.CDFORNECED,
               ITEMAUTF.NRAUTOFORN,
               ITEMAUTF.DTPROGENTAF,
               ITEMAUTF.DTENTRITMSOL,
               ITEMAUTF.CDPRODUTO,
               ITEMAUTF.CDMARCA,
               ITEMAUTF.QTPROGENTAF,
               CASE NVL(PRODUTO.VRARREDCMP, 0)
                  WHEN 0
                  THEN 1
                  ELSE NVL(PRODUTO.VRARREDCMP, 0)
               END VRARREDCMP,
               PRODUTO.CDARVPROD
            FROM
               ITEMAUTF,
               AUTOFORNE,
               PRODUTO
            WHERE
               (AUTOFORNE.CDFILDEST    = ITEMAUTF.CDFILDEST)        AND
               (AUTOFORNE.CDFILLANC    = ITEMAUTF.CDFILLANC)        AND
               (AUTOFORNE.NRAUTOFORN   = ITEMAUTF.NRAUTOFORN)       AND
               (AUTOFORNE.CDFILLANC    = P_CDFILLANC)               AND
               (AUTOFORNE.NRSEQAPURAF  = P_NRSEQAPUR)               AND
               (ITEMAUTF.CDFILDEST     = C_PRODAEMPENHAR.CDFILIAL)  AND
               (ITEMAUTF.CDPRODUTO     = PRODUTO.CDPRODUTO)         AND
               (PRODUTO.CDPRODUTO      = C_PRODAEMPENHAR.CDPRODUTO) AND
               ((AUTOFORNE.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
               --(AUTOFORNE.IDSITUATUAAF IS NULL)                     AND
               --(AUTOFORNE.IDAFFORALIM  = 'N')                       AND
               (NVL(AUTOFORNE.IDBAIXAAF,'0') <> '5')
            ORDER BY
               ITEMAUTF.DTPROGENTAF) /* ESTE "ORDER BY" E NECESSARIO */
         LOOP
            SELECT
               NVL(MAX(VRARREDEMPMAR), 0)
            INTO
               V_VRARREDEMPE /* Arredondamento Marca por Produto (Prioridade sobre o Fornecedor) */
            FROM
               MARCPROD
            WHERE
               (CDMARCA   = C_ITEMAUTF.CDMARCA) AND
               (CDPRODUTO IN (SELECT
                                 P.CDPRODUTO
                              FROM
                                 PRODUTO P
                              WHERE
                                 P.CDPRODUTO = MARCPROD.CDPRODUTO AND
                                 C_ITEMAUTF.CDARVPROD LIKE P.CDARVPROD || '%') );

            IF V_VRARREDEMPE = 0 THEN
               SELECT
                  NVL(MAX(VRARREDEMPE), 0)
               INTO
                  V_VRARREDEMPE
               FROM
                  PRODFORNCOMP
               WHERE
                  (CDFORNECED = C_ITEMAUTF.CDFORNECED) AND
                  (CDPRODCOMPL = C_ITEMAUTF.CDPRODUTO);
            END IF;

            IF V_VRARREDEMPE > 0 THEN

               IF (V_QTARETIRAR > 0) AND (C_PRODAEMPENHAR.QTAEMPENHAR >= V_QTARETIRAR) THEN  /* SE ALGUM ITEM DE SOLICITACAO TEVE SUA QUANTIDADE AUMENTADA, ESTE "IF" IRA COMPLETAR O REMANEJAMENTO DIMINUINDO A QUANTIDADE */
                  SELECT
                     MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
                  FROM
                     ITEMSOLI
                  WHERE
                     (ITEMSOLI.CDPRODUTO  = C_PRODAEMPENHAR.CDPRODUTO) AND
                     (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)  AND
                     ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                     (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)         AND
                     (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                  EXISTS (SELECT 1
                            FROM ITEMSOLIRELACAF
                           WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                             AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                             AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                             AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                             AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                             AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                             AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
                  /*Executa a consulta desconsiderando a implementacao da solicitacao 166404*/
                  IF V_NRSOLCOMP IS NULL THEN
                     SELECT
                        MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
                     FROM
                        ITEMSOLI
                     WHERE
                        (ITEMSOLI.CDPRODUTO  = C_PRODAEMPENHAR.CDPRODUTO) AND
                        (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)  AND
                        ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                        (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)         AND
                        (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND

                        ITEMSOLI.IDITMCONS  = 'N'              AND
                        ITEMSOLI.CDFILIOPELOG IS NULL;
                  END IF;

                  SELECT
                     NVL(SUM(ITEMSOLI.QTSOLIPROD), 0) INTO V_QTSOLIPROD
                  FROM
                     ITEMSOLI
                  WHERE
                     (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                     (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                     (ITEMSOLI.CDPRODUTO  = C_PRODAEMPENHAR.CDPRODUTO)   AND
                     (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')               AND
                  EXISTS (SELECT 1
                            FROM ITEMSOLIRELACAF
                           WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                             AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                             AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                             AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                             AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                             AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                             AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
                  IF V_QTSOLIPROD <= V_QTARETIRAR THEN /* O ITEM DA SOLICITACAO SERA EXCLUIDO CASO TENHA QUE RETIRAR UMA QUANTIDADE MAIOR QUE A SUA PROPRIA */
                     FOR C_ITEMSOLI IN( SELECT
                                           ITEMSOLI.NRSOLICMP, ITEMSOLI.CDFILLAN, ITEMSOLI.CDPRODUTO, ITEMSOLI.QTSOLIPROD
                                        FROM
                                           ITEMSOLI
                                        WHERE
                                           (ITEMSOLI.CDPRODUTO  = C_PRODAEMPENHAR.CDPRODUTO)        AND
                                           (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL) AND
                                           (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)  AND
                                           ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                                           (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                                        EXISTS (SELECT 1
                                                  FROM ITEMSOLIRELACAF
                                                 WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                                   AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                                   AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                                   AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                                   AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                                   AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                                   AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR))
                     LOOP
                        /* Log de Alteracao */
                        INSERT INTO MOVOPSOL
                          (CDFILSOLMOV,
                           CDFILLANMOV,
                           NRSOLIMOV,
                           CDPRODUTO,
                           DTENTROPER,
                           DTOPERSOL,
                           CDOPERADOR,
                           QTANTOPER,
                           QTDEPOPER,
                           DSJUSTOPER)
                        VALUES
                          (C_PRODAEMPENHAR.CDFILIAL,
                           C_ITEMSOLI.CDFILLAN,
                           C_ITEMSOLI.NRSOLICMP,
                           C_ITEMSOLI.CDPRODUTO,
                           C_ITEMAUTF.DTENTRITMSOL,
                           SYSDATE,
                           P_CDOPERADOR,
                           C_ITEMSOLI.QTSOLIPROD,
                           0,
                           'Empenho de AF');

                        DELETE FROM ITEMSOLI
                        WHERE
                           (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                           (CDFILLAN   = C_ITEMSOLI.CDFILLAN)  AND
                           (NRSOLICMP  = C_ITEMSOLI.NRSOLICMP)  AND
                           (CDPRODUTO  = C_ITEMSOLI.CDPRODUTO) AND
                           (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                           (NVL(IDSOLIAPROV,'S') = 'S');
                     END LOOP;
                     DELETE FROM ITEMAUTF
                     WHERE
                        (CDFILDEST   = C_PRODAEMPENHAR.CDFILIAL) AND
                        (CDFILLANC   = P_CDFILLANC)              AND
                        (NRAUTOFORN  = C_ITEMAUTF.NRAUTOFORN)    AND
                        (CDPRODUTO   = C_ITEMAUTF.CDPRODUTO)     AND
                        (CDMARCA     = C_ITEMAUTF.CDMARCA)       AND
                        (DTPROGENTAF = C_ITEMAUTF.DTPROGENTAF);


                     V_LISTA_AF_AUX := 0;

                     SELECT
                        COUNT(*) INTO V_LISTA_AF_AUX
                     FROM
                        LISTA
                     WHERE
                        NRLISTA = V_LISTA_AFS AND
                        CDLISTA = C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN;

                     IF V_LISTA_AF_AUX = 0 THEN
                        INSERT INTO LISTA
                        (NRLISTA, CDLISTA)
                        VALUES
                        (V_LISTA_AFS, C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN);
                     END IF;

                     V_QTARETIRAR := V_QTARETIRAR - V_QTSOLIPROD;
                     V_QTAEMPENHAR := V_QTAEMPENHAR - C_ITEMAUTF.QTPROGENTAF;
                  ELSE
                     FOR C_ITEMSOLI IN( SELECT
                                           ITEMSOLI.NRSOLICMP, ITEMSOLI.CDFILLAN, ITEMSOLI.CDPRODUTO, ITEMSOLI.QTSOLIPROD
                                        FROM
                                           ITEMSOLI
                                        WHERE
                                           (ITEMSOLI.CDPRODUTO  = C_PRODAEMPENHAR.CDPRODUTO)        AND
                                           (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL) AND
                                           (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)  AND
                                           ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                                           (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                                        EXISTS (SELECT 1
                                                  FROM ITEMSOLIRELACAF
                                                 WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                                   AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                                   AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                                   AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                                   AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                                   AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                                   AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR))
                     LOOP
                        IF ((C_ITEMSOLI.QTSOLIPROD > V_QTARETIRAR) AND (V_QTARETIRAR > 0)) THEN
                           /* Log de Alteracao */
                           INSERT INTO MOVOPSOL
                             (CDFILSOLMOV,
                              CDFILLANMOV,
                              NRSOLIMOV,
                              CDPRODUTO,
                              DTENTROPER,
                              DTOPERSOL,
                              CDOPERADOR,
                              QTANTOPER,
                              QTDEPOPER,
                              DSJUSTOPER)
                           SELECT
                              ITEMSOLI.CDFILSOLI,
                              ITEMSOLI.CDFILLAN,
                              ITEMSOLI.NRSOLICMP,
                              ITEMSOLI.CDPRODUTO,
                              ITEMSOLI.DTPROGENTR,
                              SYSDATE,
                              P_CDOPERADOR,
                              ITEMSOLI.QTSOLIPROD,
                              ITEMSOLI.QTSOLIPROD - V_QTARETIRAR,
                              'Empenho de AF'
                           FROM
                              ITEMSOLI
                           WHERE
                              (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                              (ITEMSOLI.CDFILLAN   = C_ITEMSOLI.CDFILLAN)  AND
                              (ITEMSOLI.NRSOLICMP  = C_ITEMSOLI.NRSOLICMP)  AND
                              (ITEMSOLI.CDPRODUTO  = C_ITEMSOLI.CDPRODUTO) AND
                              (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                              (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');

                           UPDATE ITEMSOLI
                           SET QTSOLIPROD = QTSOLIPROD - V_QTARETIRAR
                           WHERE
                              (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                              (CDFILLAN   = C_ITEMSOLI.CDFILLAN)  AND
                              (NRSOLICMP  = C_ITEMSOLI.NRSOLICMP)  AND
                              (CDPRODUTO  = C_ITEMSOLI.CDPRODUTO) AND
                              (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                              (NVL(IDSOLIAPROV,'S') = 'S');

                           UPDATE ITEMSOLIRELACAF
                           SET QTSOLIPROD = QTSOLIPROD - V_QTARETIRAR
                           WHERE
                              (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                              (CDFILLAN   = C_ITEMSOLI.CDFILLAN)  AND
                              (NRSOLICMP  = C_ITEMSOLI.NRSOLICMP)  AND
                              (CDPRODUTO  = C_ITEMSOLI.CDPRODUTO) AND
                              (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                              CDCENTITMAP= P_CDFILCENTCMP            AND
                              NRSEQITMAP = P_NRSEQAPUR               AND
                              CDFILDEST  = C_PRODAEMPENHAR.CDFILIAL  AND
                              CDFILLANC  = P_CDFILLANC               AND
                              NRAUTOFORN = C_ITEMAUTF.NRAUTOFORN     AND
                              CDMARCAAF  = C_ITEMAUTF.CDMARCA        AND
                              CDPRODUTOAF= C_ITEMAUTF.CDPRODUTO      AND
                              DTPROGENTAF= C_ITEMAUTF.DTPROGENTAF;

                           V_QTARETIRAR := 0;
                           EXIT;
                        ELSE
                           /* Log de Alteracao */
                           INSERT INTO MOVOPSOL
                             (CDFILSOLMOV,
                              CDFILLANMOV,
                              NRSOLIMOV,
                              CDPRODUTO,
                              DTENTROPER,
                              DTOPERSOL,
                              CDOPERADOR,
                              QTANTOPER,
                              QTDEPOPER,
                              DSJUSTOPER)
                           VALUES
                             (C_PRODAEMPENHAR.CDFILIAL,
                              C_ITEMSOLI.CDFILLAN,
                              C_ITEMSOLI.NRSOLICMP,
                              C_ITEMSOLI.CDPRODUTO,
                              C_ITEMAUTF.DTENTRITMSOL,
                              SYSDATE,
                              P_CDOPERADOR,
                              C_ITEMSOLI.QTSOLIPROD,
                              0,
                              'Empenho de AF');

                           DELETE FROM ITEMSOLI
                           WHERE
                              (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                              (CDFILLAN   = C_ITEMSOLI.CDFILLAN)  AND
                              (NRSOLICMP  = C_ITEMSOLI.NRSOLICMP)  AND
                              (CDPRODUTO  = C_ITEMSOLI.CDPRODUTO) AND
                              (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                              (NVL(IDSOLIAPROV,'S') = 'S');
                           V_QTARETIRAR := V_QTARETIRAR-C_ITEMSOLI.QTSOLIPROD;
                        END IF;
                     END LOOP;
                     V_QTARETIRAR := 0;
                  END IF;
               END IF;

               IF V_QTARETIRAR = 0 THEN  /* SE O REMANEJAMENTO DAS ENTREGAS ANTERIORES FOI FINALIZADO NO "IF" ACIMA, ESTE "IF" IRA VERIFICAR SE SERA NECESSARIO FAZER OUTRO REMANEJAMENTO PUXANDO DE ENTREGAS FUTURAS */
                  SELECT
                     MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
                  FROM
                     ITEMSOLI
                  WHERE
                     (ITEMSOLI.CDPRODUTO  = C_PRODAEMPENHAR.CDPRODUTO) AND
                     (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)  AND
                     ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                     (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)         AND
                     (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                  EXISTS (SELECT 1
                            FROM ITEMSOLIRELACAF
                           WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                             AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                             AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                             AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                             AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                             AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                             AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
                  /*Executa a consulta desconsiderando a implementacao da solicitacao 166404*/           
                  IF V_NRSOLCOMP IS NULL THEN
                     SELECT
                        MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
                     FROM
                        ITEMSOLI
                     WHERE
                        (ITEMSOLI.CDPRODUTO  = C_PRODAEMPENHAR.CDPRODUTO) AND
                        (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)  AND
                        ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                        (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)         AND
                        (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')  AND

                        ITEMSOLI.IDITMCONS  = 'N'              AND
                        ITEMSOLI.CDFILIOPELOG IS NULl;
                  END IF;

                  IF V_NRSOLCOMP IS NOT NULL THEN  /* SE AINDA EXITIR SOLICITACAO PARA ESTA ENTREGA... */
                     SELECT
                        SUM(ITEMSOLI.QTSOLIPROD) INTO V_QTSOLIPROD
                     FROM
                        ITEMSOLI
                     WHERE
                        (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                        (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                        (ITEMSOLI.CDPRODUTO  = C_PRODAEMPENHAR.CDPRODUTO)   AND
                        (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                     EXISTS (SELECT 1
                               FROM ITEMSOLIRELACAF
                              WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
                     V_QTARETIRAR := C_ITEMAUTF.QTPROGENTAF - V_QTSOLIPROD;

                     IF (V_QTARETIRAR > 0) AND (C_PRODAEMPENHAR.QTAEMPENHAR >= V_QTARETIRAR) THEN

   /*################################ AJUSTANDO V_QTARETIRAR PARA O VALOR QUE TEM DISPONIVEL PARA REMANEJAR ###############################*/
                        SELECT
                           MAX(ITEMAUTF.DTENTRITMSOL)
                        INTO
                           V_DTULTENTR
                        FROM
                           ITEMAUTF, AUTOFORNE
                        WHERE
                           (AUTOFORNE.CDFILDEST    = ITEMAUTF.CDFILDEST)       AND
                           (AUTOFORNE.CDFILLANC    = ITEMAUTF.CDFILLANC)       AND
                           (AUTOFORNE.NRAUTOFORN   = ITEMAUTF.NRAUTOFORN)      AND
                           (ITEMAUTF.CDPRODUTO     = C_ITEMAUTF.CDPRODUTO)     AND
                           (ITEMAUTF.CDFILDEST     = C_PRODAEMPENHAR.CDFILIAL) AND
                           ((AUTOFORNE.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
                           (AUTOFORNE.IDSITUATUAAF IS NULL)                    AND
                           (AUTOFORNE.IDAFFORALIM  = 'N')                      AND
                           (NVL(AUTOFORNE.IDBAIXAAF,'0') <> '5')               AND
                           (AUTOFORNE.CDFILLANC    = P_CDFILLANC)              AND
                           (AUTOFORNE.NRSEQAPURAF  = P_NRSEQAPUR);

                        SELECT
                           SUM(ITEMSOLI.QTSOLIPROD) INTO V_QTDISPONIVEL
                        FROM
                           ITEMSOLI
                        WHERE
                           (ITEMSOLI.CDFILSOLI  =  C_PRODAEMPENHAR.CDFILIAL) AND
                           (ITEMSOLI.DTPROGENTR >  C_ITEMAUTF.DTENTRITMSOL)  AND
                           (ITEMSOLI.DTPROGENTR <= V_DTULTENTR)              AND
                           ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                           (ITEMSOLI.CDPRODUTO  =  C_PRODAEMPENHAR.CDPRODUTO)AND
                           (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                        EXISTS (SELECT 1
                                  FROM ITEMSOLIRELACAF
                                 WHERE ITEMSOLIRELACAF.CDFILSOLI    = ITEMSOLI.CDFILSOLI
                                   AND ITEMSOLIRELACAF.CDFILLAN     = ITEMSOLI.CDFILLAN
                                   AND ITEMSOLIRELACAF.NRSOLICMP    = ITEMSOLI.NRSOLICMP
                                   AND ITEMSOLIRELACAF.CDPRODUTO    = ITEMSOLI.CDPRODUTO
                                   AND ITEMSOLIRELACAF.DTPROGENTR   = ITEMSOLI.DTPROGENTR
                                   AND ITEMSOLIRELACAF.CDCENTITMAP  = P_CDFILCENTCMP
                                   AND ITEMSOLIRELACAF.NRSEQITMAP   = P_NRSEQAPUR);
                        IF V_QTDISPONIVEL IS NULL THEN
                           SELECT
                              SUM(ITEMSOLI.QTSOLIPROD) INTO V_QTDISPONIVEL
                           FROM
                              ITEMSOLI
                           WHERE
                              (ITEMSOLI.CDFILSOLI  =  C_PRODAEMPENHAR.CDFILIAL) AND
                              (ITEMSOLI.DTPROGENTR >  C_ITEMAUTF.DTENTRITMSOL)  AND
                              (ITEMSOLI.DTPROGENTR <= V_DTULTENTR)              AND
                              ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                              (ITEMSOLI.CDPRODUTO  =  C_PRODAEMPENHAR.CDPRODUTO)AND
                              (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S') AND
                              ITEMSOLI.IDITMCONS  = 'N'  AND
                              ITEMSOLI.CDFILIOPELOG IS NULL;
                        END IF;
                        IF NVL(V_QTDISPONIVEL, 0) > 0 THEN
                           IF V_QTARETIRAR > NVL(V_QTDISPONIVEL, 0) THEN
                              V_QTARETIRAR := NVL(V_QTDISPONIVEL, 0);
                           END IF;
                        END IF;

                        V_QTARRED := V_QTARETIRAR;
                        IF C_ITEMAUTF.VRARREDCMP > 0 THEN
                           V_QTARRED := FLOOR(V_QTARRED / C_ITEMAUTF.VRARREDCMP) * C_ITEMAUTF.VRARREDCMP; /* TEM QUE ARREDONDAR PARA BAIXO PARA NAO TIRAR MAIS DO QUE DEVIA */
                        END IF;

                        IF V_VRARREDEMPE > 0 THEN
                           V_QTARRED := FLOOR(V_QTARRED / V_VRARREDEMPE) * V_VRARREDEMPE; /* TEM QUE ARREDONDAR PARA BAIXO PARA NAO TIRAR MAIS DO QUE DEVIA */
                        END IF;

                        IF V_QTARRED > 0 THEN
                           UPDATE ITEMAUTF
                           SET QTPROGENTAF = QTPROGENTAF - V_QTARRED
                           WHERE
                              (CDFILDEST   = C_PRODAEMPENHAR.CDFILIAL) AND
                              (CDFILLANC   = P_CDFILLANC)              AND
                              (NRAUTOFORN  = C_ITEMAUTF.NRAUTOFORN)    AND
                              (CDPRODUTO   = C_ITEMAUTF.CDPRODUTO)     AND
                              (CDMARCA     = C_ITEMAUTF.CDMARCA)       AND
                              (DTPROGENTAF = C_ITEMAUTF.DTPROGENTAF);

                           V_LISTA_AF_AUX := 0;

                           SELECT
                              COUNT(*) INTO V_LISTA_AF_AUX
                           FROM
                              LISTA
                           WHERE
                              NRLISTA = V_LISTA_AFS AND
                              CDLISTA = C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN;

                           IF V_LISTA_AF_AUX = 0 THEN
                              INSERT INTO LISTA
                              (NRLISTA, CDLISTA)
                              VALUES
                              (V_LISTA_AFS, C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN);
                           END IF;

                           V_QTAEMPENHAR := V_QTAEMPENHAR - (V_QTARRED);
                           V_QTARETIRAR := V_QTARETIRAR - (V_QTARRED);
                        END IF;

                        IF (V_QTARETIRAR > 0) AND (C_PRODAEMPENHAR.QTAEMPENHAR >= V_QTARETIRAR) THEN
                           IF V_QTARETIRAR <= V_QTAEMPENHAR THEN
                              /* Log de Alteracao */
                              INSERT INTO MOVOPSOL
                                (CDFILSOLMOV,
                                 CDFILLANMOV,
                                 NRSOLIMOV,
                                 CDPRODUTO,
                                 DTENTROPER,
                                 DTOPERSOL,
                                 CDOPERADOR,
                                 QTANTOPER,
                                 QTDEPOPER,
                                 DSJUSTOPER)
                              SELECT
                                 ITEMSOLI.CDFILSOLI,
                                 ITEMSOLI.CDFILLAN,
                                 ITEMSOLI.NRSOLICMP,
                                 ITEMSOLI.CDPRODUTO,
                                 ITEMSOLI.DTPROGENTR,
                                 SYSDATE,
                                 P_CDOPERADOR,
                                 ITEMSOLI.QTSOLIPROD,
                                 ITEMSOLI.QTSOLIPROD + V_QTARETIRAR,
                                 'Empenho de AF'
                              FROM
                                 ITEMSOLI
                              WHERE
                                 (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                                 (ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                                 (ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                                 (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                                 (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                                 (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');

                              UPDATE ITEMSOLI
                              SET QTSOLIPROD = QTSOLIPROD + V_QTARETIRAR
                              WHERE
                                 (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                                 (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                                 (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                                 (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                                 (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                                 (NVL(IDSOLIAPROV,'S') = 'S');

                              UPDATE ITEMSOLIRELACAF
                              SET QTSOLIPROD = QTSOLIPROD + V_QTARETIRAR
                              WHERE
                                 (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                                 (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                                 (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                                 (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                                 (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                                 CDCENTITMAP= P_CDFILCENTCMP                AND
                                 NRSEQITMAP = P_NRSEQAPUR                   AND
                                 CDFILDEST  = C_PRODAEMPENHAR.CDFILIAL      AND
                                 CDFILLANC  = P_CDFILLANC                   AND
                                 NRAUTOFORN = C_ITEMAUTF.NRAUTOFORN         AND
                                 CDMARCAAF  = C_ITEMAUTF.CDMARCA            AND
                                 CDPRODUTOAF= C_ITEMAUTF.CDPRODUTO          AND
                                 DTPROGENTAF= C_ITEMAUTF.DTPROGENTAF;
                           END IF;
                        END IF;
                     END IF;
                  END IF;
               END IF;
            END IF;
         END LOOP;
      END LOOP;
   END IF;
   IF (V_NRLOGCORTEOL > 0) THEN
      FOR C_PRODAEMPENHAR IN /* RETORNA OS PRODUTOS QUE TEM AF COM QUANTIDADE MAIOR QUE A DA SOLICITACAO */
        (SELECT
            CDFILIAL,
            CDPRODUTO,
            SUM(QTDECOMP) AS QTAEMPENHAR
         FROM
            (SELECT
                ITEMAUTF.CDFILDEST AS CDFILIAL,
                RELACPRODOL.CDPRARVORIG CDPRODUTO,
                ITEMAUTF.DTENTRITMSOL,
                SUM(ITEMAUTF.QTPROGENTAF) -
                (SELECT
                    SUM(ITEMSOLI.QTSOLIPROD)
                 FROM
                    ITEMSOLI
                 WHERE
                    (ITEMSOLI.CDFILSOLI  = ITEMAUTF.CDFILDEST)    AND
                    (ITEMSOLI.DTPROGENTR = ITEMAUTF.DTENTRITMSOL) AND
                    (ITEMSOLI.IDITMCONS  = 'N')                   AND
                    ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                    (ITEMSOLI.CDPRODUTO  = RELACPRODOL.CDPRARVORIG)   AND
                    (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')) AS QTDECOMP
             FROM
                ITEMAUTF,
                AUTOFORNE,
                RELACPRODOL
             WHERE
                (AUTOFORNE.CDFILDEST = ITEMAUTF.CDFILDEST)   AND
                (AUTOFORNE.CDFILLANC = ITEMAUTF.CDFILLANC)   AND
                (AUTOFORNE.NRAUTOFORN = ITEMAUTF.NRAUTOFORN) AND
                ((AUTOFORNE.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
                --(AUTOFORNE.IDSITUATUAAF IS NULL)             AND
                --(AUTOFORNE.IDAFFORALIM = 'N')                AND
                (NVL(AUTOFORNE.IDBAIXAAF,'0') <> '5')        AND
                (AUTOFORNE.CDFILLANC = P_CDFILLANC)          AND
                (AUTOFORNE.NRSEQAPURAF = P_NRSEQAPUR)   AND
                RELACPRODOL.CDPRODARVOL = ITEMAUTF.CDPRODUTO
             GROUP BY
                ITEMAUTF.CDFILDEST,
                RELACPRODOL.CDPRARVORIG,
                ITEMAUTF.DTENTRITMSOL
             HAVING
                SUM(ITEMAUTF.QTPROGENTAF) >
                (SELECT
                    SUM(ITEMSOLI.QTSOLIPROD)
                 FROM
                    ITEMSOLI
                 WHERE
                    (ITEMSOLI.CDFILSOLI  = ITEMAUTF.CDFILDEST)    AND
                    (ITEMSOLI.DTPROGENTR = ITEMAUTF.DTENTRITMSOL) AND
                    (ITEMSOLI.IDITMCONS  = 'N')                   AND
                    (ITEMSOLI.CDPRODUTO  = RELACPRODOL.CDPRARVORIG)    AND
                    ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                    (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S')))
         GROUP BY
            CDFILIAL,
            CDPRODUTO)
      LOOP
         V_QTAEMPENHAR := C_PRODAEMPENHAR.QTAEMPENHAR;
         V_QTARETIRAR  := 0;
         FOR C_ITEMAUTF IN  /* RETORNA AS DATAS DE ENTREGA DOS PRODUTOS QUE TEM QUANTIDADE A COMPRAR */
           (SELECT
               AUTOFORNE.CDFORNECED,
               ITEMAUTF.NRAUTOFORN,
               ITEMAUTF.DTPROGENTAF,
               ITEMAUTF.DTENTRITMSOL,
               ITEMAUTF.CDPRODUTO,
               ITEMAUTF.CDMARCA,
               ITEMAUTF.QTPROGENTAF,
               CASE NVL(PRODUTO.VRARREDCMP, 0)
                  WHEN 0
                  THEN 1
                  ELSE NVL(PRODUTO.VRARREDCMP, 0)
               END VRARREDCMP,
               PRODUTO.CDARVPROD
            FROM
               ITEMAUTF,
               AUTOFORNE,
               PRODUTO,
               RELACPRODOL
            WHERE
               (AUTOFORNE.CDFILDEST    = ITEMAUTF.CDFILDEST)        AND
               (AUTOFORNE.CDFILLANC    = ITEMAUTF.CDFILLANC)        AND
               (AUTOFORNE.NRAUTOFORN   = ITEMAUTF.NRAUTOFORN)       AND
               (AUTOFORNE.CDFILLANC    = P_CDFILLANC)               AND
               (AUTOFORNE.NRSEQAPURAF  = P_NRSEQAPUR)               AND
               (ITEMAUTF.CDFILDEST     = C_PRODAEMPENHAR.CDFILIAL)  AND
               (ITEMAUTF.CDPRODUTO     = PRODUTO.CDPRODUTO)         AND
               --(PRODUTO.CDPRODUTO      = C_PRODAEMPENHAR.CDPRODUTO) AND
                (ITEMAUTF.CDPRODUTO     = RELACPRODOL.CDPRODARVOL)         AND
               RELACPRODOL.CDPRARVORIG = C_PRODAEMPENHAR.CDPRODUTO  AND
               ((AUTOFORNE.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
               --(AUTOFORNE.IDSITUATUAAF IS NULL)                     AND
               --(AUTOFORNE.IDAFFORALIM  = 'N')                       AND
               (NVL(AUTOFORNE.IDBAIXAAF,'0') <> '5')
            ORDER BY
               ITEMAUTF.DTPROGENTAF) /* ESTE "ORDER BY" E NECESSARIO */
         LOOP
            SELECT
               NVL(MAX(VRARREDEMPMAR), 0)
            INTO
               V_VRARREDEMPE /* Arredondamento Marca por Produto (Prioridade sobre o Fornecedor) */
            FROM
               MARCPROD
            WHERE
               (CDMARCA   = C_ITEMAUTF.CDMARCA) AND
               (CDPRODUTO IN (SELECT
                                 P.CDPRODUTO
                              FROM
                                 PRODUTO P
                              WHERE
                                 P.CDPRODUTO = MARCPROD.CDPRODUTO AND
                                 C_ITEMAUTF.CDARVPROD LIKE P.CDARVPROD || '%') );

            IF V_VRARREDEMPE = 0 THEN
               SELECT
                  NVL(MAX(VRARREDEMPE), 0)
               INTO
                  V_VRARREDEMPE
               FROM
                  PRODFORNCOMP
               WHERE
                  (CDFORNECED = C_ITEMAUTF.CDFORNECED) AND
                  (CDPRODCOMPL = C_ITEMAUTF.CDPRODUTO);
            END IF;

            IF V_VRARREDEMPE > 0 THEN

               IF (V_QTARETIRAR > 0) AND (C_PRODAEMPENHAR.QTAEMPENHAR >= V_QTARETIRAR) THEN  /* SE ALGUM ITEM DE SOLICITACAO TEVE SUA QUANTIDADE AUMENTADA, ESTE "IF" IRA COMPLETAR O REMANEJAMENTO DIMINUINDO A QUANTIDADE */
                  SELECT
                     MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
                  FROM
                     ITEMSOLI
                  WHERE
                     (ITEMSOLI.CDPRODUTO  = C_PRODAEMPENHAR.CDPRODUTO) AND
                     (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)  AND
                     ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                     (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)         AND
                     (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');

                  SELECT
                     MAX(ITEMSOLI.QTSOLIPROD) INTO V_QTSOLIPROD
                  FROM
                     ITEMSOLI
                  WHERE
                     (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                     (ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                     (ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                     (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                     (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                     (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');

                  IF V_QTSOLIPROD <= V_QTARETIRAR THEN /* O ITEM DA SOLICITACAO SERA EXCLUIDO CASO TENHA QUE RETIRAR UMA QUANTIDADE MAIOR QUE A SUA PROPRIA */
                     /* Log de Alteracao */
                     INSERT INTO MOVOPSOL
                       (CDFILSOLMOV,
                        CDFILLANMOV,
                        NRSOLIMOV,
                        CDPRODUTO,
                        DTENTROPER,
                        DTOPERSOL,
                        CDOPERADOR,
                        QTANTOPER,
                        QTDEPOPER,
                        DSJUSTOPER)
                     VALUES
                       (C_PRODAEMPENHAR.CDFILIAL,
                        SUBSTR(V_NRSOLCOMP, 11, 4),
                        SUBSTR(V_NRSOLCOMP, 1, 10),
                        SUBSTR(V_NRSOLCOMP, 15, 10),
                        C_ITEMAUTF.DTENTRITMSOL,
                        SYSDATE,
                        P_CDOPERADOR,
                        V_QTSOLIPROD,
                        0,
                        'Empenho de AF');

                     DELETE FROM ITEMSOLI
                     WHERE
                        (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                        (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                        (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                        (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                        (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                        (NVL(IDSOLIAPROV,'S') = 'S');

                     DELETE FROM ITEMAUTF
                     WHERE
                        (CDFILDEST   = C_PRODAEMPENHAR.CDFILIAL) AND
                        (CDFILLANC   = P_CDFILLANC)              AND
                        (NRAUTOFORN  = C_ITEMAUTF.NRAUTOFORN)    AND
                        (CDPRODUTO   = C_ITEMAUTF.CDPRODUTO)     AND
                        (CDMARCA     = C_ITEMAUTF.CDMARCA)       AND
                        (DTPROGENTAF = C_ITEMAUTF.DTPROGENTAF);


                     V_LISTA_AF_AUX := 0;

                     SELECT
                        COUNT(*) INTO V_LISTA_AF_AUX
                     FROM
                        LISTA
                     WHERE
                        NRLISTA = V_LISTA_AFS AND
                        CDLISTA = C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN;

                     IF V_LISTA_AF_AUX = 0 THEN
                        INSERT INTO LISTA
                        (NRLISTA, CDLISTA)
                        VALUES
                        (V_LISTA_AFS, C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN);
                     END IF;

                     V_QTARETIRAR := V_QTARETIRAR - V_QTSOLIPROD;
                     V_QTAEMPENHAR := V_QTAEMPENHAR - C_ITEMAUTF.QTPROGENTAF;
                  ELSE
                     /* Log de Alteracao */
                     INSERT INTO MOVOPSOL
                       (CDFILSOLMOV,
                        CDFILLANMOV,
                        NRSOLIMOV,
                        CDPRODUTO,
                        DTENTROPER,
                        DTOPERSOL,
                        CDOPERADOR,
                        QTANTOPER,
                        QTDEPOPER,
                        DSJUSTOPER)
                     SELECT
                        ITEMSOLI.CDFILSOLI,
                        ITEMSOLI.CDFILLAN,
                        ITEMSOLI.NRSOLICMP,
                        ITEMSOLI.CDPRODUTO,
                        ITEMSOLI.DTPROGENTR,
                        SYSDATE,
                        P_CDOPERADOR,
                        ITEMSOLI.QTSOLIPROD,
                        ITEMSOLI.QTSOLIPROD - V_QTARETIRAR,
                        'Empenho de AF'
                     FROM
                        ITEMSOLI
                     WHERE
                        (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                        (ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                        (ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                        (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                        (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                        (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');

                     UPDATE ITEMSOLI
                     SET QTSOLIPROD = QTSOLIPROD - V_QTARETIRAR
                     WHERE
                        (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                        (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                        (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                        (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                        (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                        (NVL(IDSOLIAPROV,'S') = 'S');

                     V_QTARETIRAR := 0;
                  END IF;
               END IF;

               IF V_QTARETIRAR = 0 THEN  /* SE O REMANEJAMENTO DAS ENTREGAS ANTERIORES FOI FINALIZADO NO "IF" ACIMA, ESTE "IF" IRA VERIFICAR SE SERA NECESSARIO FAZER OUTRO REMANEJAMENTO PUXANDO DE ENTREGAS FUTURAS */
                  SELECT
                     MAX(ITEMSOLI.NRSOLICMP||ITEMSOLI.CDFILLAN||ITEMSOLI.CDPRODUTO) INTO V_NRSOLCOMP
                  FROM
                     ITEMSOLI
                  WHERE
                     (ITEMSOLI.CDPRODUTO  = C_PRODAEMPENHAR.CDPRODUTO) AND
                     (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)  AND
                     ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                     (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)         AND
                     (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');

                  IF V_NRSOLCOMP IS NOT NULL THEN  /* SE AINDA EXITIR SOLICITACAO PARA ESTA ENTREGA... */
                     SELECT
                        MAX(ITEMSOLI.QTSOLIPROD) INTO V_QTSOLIPROD
                     FROM
                        ITEMSOLI
                     WHERE
                        (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                        (ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                        (ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                        (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                        (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                        (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');

                     V_QTARETIRAR := C_ITEMAUTF.QTPROGENTAF - V_QTSOLIPROD;

                     IF (V_QTARETIRAR > 0) AND (C_PRODAEMPENHAR.QTAEMPENHAR >= V_QTARETIRAR) THEN

   /*################################ AJUSTANDO V_QTARETIRAR PARA O VALOR QUE TEM DISPONIVEL PARA REMANEJAR ###############################*/
                        SELECT
                           MAX(ITEMAUTF.DTENTRITMSOL)
                        INTO
                           V_DTULTENTR
                        FROM
                           ITEMAUTF, AUTOFORNE
                        WHERE
                           (AUTOFORNE.CDFILDEST    = ITEMAUTF.CDFILDEST)       AND
                           (AUTOFORNE.CDFILLANC    = ITEMAUTF.CDFILLANC)       AND
                           (AUTOFORNE.NRAUTOFORN   = ITEMAUTF.NRAUTOFORN)      AND
                           (ITEMAUTF.CDPRODUTO     = C_ITEMAUTF.CDPRODUTO)     AND
                           (ITEMAUTF.CDFILDEST     = C_PRODAEMPENHAR.CDFILIAL) AND
                           ((AUTOFORNE.IDAUTOFORNEX = V_EXTRA) OR (V_EXTRA = 'X')) AND
                           (AUTOFORNE.IDSITUATUAAF IS NULL)                    AND
                           (AUTOFORNE.IDAFFORALIM  = 'N')                      AND
                           (NVL(AUTOFORNE.IDBAIXAAF,'0') <> '5')               AND
                           (AUTOFORNE.CDFILLANC    = P_CDFILLANC)              AND
                           (AUTOFORNE.NRSEQAPURAF  = P_NRSEQAPUR);

                        SELECT
                           SUM(ITEMSOLI.QTSOLIPROD) INTO V_QTDISPONIVEL
                        FROM
                           ITEMSOLI
                        WHERE
                           (ITEMSOLI.CDFILSOLI  =  C_PRODAEMPENHAR.CDFILIAL) AND
                           (ITEMSOLI.DTPROGENTR >  C_ITEMAUTF.DTENTRITMSOL)  AND
                           (ITEMSOLI.DTPROGENTR <= V_DTULTENTR)              AND
                           ((ITEMSOLI.IDITMSOLEXTRA = V_EXTRA) OR (V_EXTRA = 'X')) AND
                           (ITEMSOLI.CDPRODUTO  =  C_PRODAEMPENHAR.CDPRODUTO)AND
                           (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');

                        IF NVL(V_QTDISPONIVEL, 0) > 0 THEN
                           IF V_QTARETIRAR > NVL(V_QTDISPONIVEL, 0) THEN
                              V_QTARETIRAR := NVL(V_QTDISPONIVEL, 0);
                           END IF;
                        END IF;

                        V_QTARRED := V_QTARETIRAR;
                        IF C_ITEMAUTF.VRARREDCMP > 0 THEN
                           V_QTARRED := FLOOR(V_QTARRED / C_ITEMAUTF.VRARREDCMP) * C_ITEMAUTF.VRARREDCMP; /* TEM QUE ARREDONDAR PARA BAIXO PARA NAO TIRAR MAIS DO QUE DEVIA */
                        END IF;

                        IF V_VRARREDEMPE > 0 THEN
                           V_QTARRED := FLOOR(V_QTARRED / V_VRARREDEMPE) * V_VRARREDEMPE; /* TEM QUE ARREDONDAR PARA BAIXO PARA NAO TIRAR MAIS DO QUE DEVIA */
                        END IF;

                        IF V_QTARRED > 0 THEN
                           UPDATE ITEMAUTF
                           SET QTPROGENTAF = QTPROGENTAF - V_QTARRED
                           WHERE
                              (CDFILDEST   = C_PRODAEMPENHAR.CDFILIAL) AND
                              (CDFILLANC   = P_CDFILLANC)              AND
                              (NRAUTOFORN  = C_ITEMAUTF.NRAUTOFORN)    AND
                              (CDPRODUTO   = C_ITEMAUTF.CDPRODUTO)     AND
                              (CDMARCA     = C_ITEMAUTF.CDMARCA)       AND
                              (DTPROGENTAF = C_ITEMAUTF.DTPROGENTAF);

                           V_LISTA_AF_AUX := 0;

                           SELECT
                              COUNT(*) INTO V_LISTA_AF_AUX
                           FROM
                              LISTA
                           WHERE
                              NRLISTA = V_LISTA_AFS AND
                              CDLISTA = C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN;

                           IF V_LISTA_AF_AUX = 0 THEN
                              INSERT INTO LISTA
                              (NRLISTA, CDLISTA)
                              VALUES
                              (V_LISTA_AFS, C_PRODAEMPENHAR.CDFILIAL || C_ITEMAUTF.NRAUTOFORN);
                           END IF;

                           V_QTAEMPENHAR := V_QTAEMPENHAR - (V_QTARRED);
                           V_QTARETIRAR := V_QTARETIRAR - (V_QTARRED);
                        END IF;

                        IF (V_QTARETIRAR > 0) AND (C_PRODAEMPENHAR.QTAEMPENHAR >= V_QTARETIRAR) THEN
                           IF V_QTARETIRAR <= V_QTAEMPENHAR THEN
                              /* Log de Alteracao */
                              INSERT INTO MOVOPSOL
                                (CDFILSOLMOV,
                                 CDFILLANMOV,
                                 NRSOLIMOV,
                                 CDPRODUTO,
                                 DTENTROPER,
                                 DTOPERSOL,
                                 CDOPERADOR,
                                 QTANTOPER,
                                 QTDEPOPER,
                                 DSJUSTOPER)
                              SELECT
                                 ITEMSOLI.CDFILSOLI,
                                 ITEMSOLI.CDFILLAN,
                                 ITEMSOLI.NRSOLICMP,
                                 ITEMSOLI.CDPRODUTO,
                                 ITEMSOLI.DTPROGENTR,
                                 SYSDATE,
                                 P_CDOPERADOR,
                                 ITEMSOLI.QTSOLIPROD,
                                 ITEMSOLI.QTSOLIPROD + V_QTARETIRAR,
                                 'Empenho de AF'
                              FROM
                                 ITEMSOLI
                              WHERE
                                 (ITEMSOLI.CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                                 (ITEMSOLI.CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                                 (ITEMSOLI.NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                                 (ITEMSOLI.CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                                 (ITEMSOLI.DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                                 (NVL(ITEMSOLI.IDSOLIAPROV,'S') = 'S');

                              UPDATE ITEMSOLI
                              SET QTSOLIPROD = QTSOLIPROD + V_QTARETIRAR
                              WHERE
                                 (CDFILSOLI  = C_PRODAEMPENHAR.CDFILIAL)    AND
                                 (CDFILLAN   = SUBSTR(V_NRSOLCOMP, 11, 4))  AND
                                 (NRSOLICMP  = SUBSTR(V_NRSOLCOMP, 1, 10))  AND
                                 (CDPRODUTO  = SUBSTR(V_NRSOLCOMP, 15, 10)) AND
                                 (DTPROGENTR = C_ITEMAUTF.DTENTRITMSOL)     AND
                                 (NVL(IDSOLIAPROV,'S') = 'S');
                           END IF;
                        END IF;
                     END IF;
                  END IF;
               END IF;
            END IF;
         END LOOP;
      END LOOP;
   END IF;
   /* #################### FECHAMENTO DAS AF'S ALTERADAS #####################*/
   DELETE FROM AUTOFORNE
   WHERE
      (CDFILLANC   = P_CDFILLANC) AND
      (NRSEQAPURAF = P_NRSEQAPUR) AND
      (NOT EXISTS (SELECT
                      ITEMAUTF.CDFILDEST
                   FROM
                      ITEMAUTF
                   WHERE
                      (AUTOFORNE.CDFILDEST  = ITEMAUTF.CDFILDEST) AND
                      (AUTOFORNE.CDFILLANC  = ITEMAUTF.CDFILLANC) AND
                      (AUTOFORNE.NRAUTOFORN = ITEMAUTF.NRAUTOFORN)));


   FOR C_AUTOFORNE IN
     (SELECT
         CDFILDEST,
         NRAUTOFORN
      FROM
         AUTOFORNE,
         LISTA
      WHERE
         (CDFILLANC = P_CDFILLANC) AND
         (NRLISTA = V_LISTA_AFS)   AND
         (CDLISTA = CDFILDEST || NRAUTOFORN) )
   LOOP
      FECHAMENTO_AF(C_AUTOFORNE.CDFILDEST, P_CDFILLANC, C_AUTOFORNE.NRAUTOFORN);
   END LOOP;

   DELETE FROM LISTA WHERE NRLISTA = V_LISTA_AFS;
   COMMIT;
END;
/