CREATE OR REPLACE
PROCEDURE APURA_MELHOR_COTACAO
          (P_CDCENTCMP  IN ITMAPURPREC.CDCENTITMAP%TYPE,
           P_NRSEQAPUR  IN ITMAPURPREC.NRSEQITMAP%TYPE,
           P_SISTEMA    VARCHAR,
           P_TIPO       VARCHAR)
IS
  V_IDTIPOAPUR       PARASUPRI.IDTIPOAPUR%TYPE;
  V_IDUTQTDISPGERAL  PARASUPRI.IDUTQTDISPGERAL%TYPE;
  V_IDCONSPRSOL      PARASUPRI.IDCONSPRSOL%TYPE;
  V_IDUTILCONSSOLIOL PARASUPRI.IDUTILCONSSOLIOL%TYPE;
  V_NRPEDIDOCOL      PEDCOLGERAL.NRPEDIDOCOL%TYPE;
  V_QTSOLACOMP       ITMAPURPREC.QTACOMP%TYPE; /*Qtde. em produto de compra*/
  V_QTRESTANTE       ITMAPURPREC.QTACOMP%TYPE; /*Qtde. em produto de estoque*/
  V_AUX              ITMAPURPREC.QTACOMP%TYPE;
  V_IDCONSOLAPUEFET  APURPRECO.IDCONSOLAPUEFET%TYPE;
  V_IDUTLMARPREFOL   PARASUPRI.IDUTLMARPREFOL%TYPE;
  V_CDMARCA_PADRAO   PARASUPRI.CDMARCA%TYPE;
  TYPE T_INDICE IS TABLE OF FLOAT INDEX BY VARCHAR(29);
  V_QTDEDISPONIVEL T_INDICE;
  V_CDFORNOPELOG       VARCHAR2(20);
  V_IDUTLPRARVOLCMP    PARASUPRI.IDUTLPRARVOLCMP%TYPE;
  V_NRLOGCORTEOL       NUMBER;
  V_IDUTLPRCMPATIVO    PARASUPRI.IDUTLPRCMPATIVO%TYPE;
  V_IDCONSARREDCMPAPUR PARASUPRI.IDCONSARREDCMPAPUR%TYPE;

BEGIN
  UPDATE ITMAPURPREC
  SET IDITMSELAPUR = 'N', /* Desmarcando as apuracoes ja feitas - APURA_MELHOR_COTACAO */
      IDMOTIVPRESC = '0000000000',
      QTACOMP      = QTSOLACOMP
  WHERE
    ITMAPURPREC.CDCENTITMAP = P_CDCENTCMP AND
    ITMAPURPREC.NRSEQITMAP  = P_NRSEQAPUR;
  COMMIT;

  SELECT MAX(IDCONSOLAPUEFET), MAX(NRLOGCORTEOL)
    INTO V_IDCONSOLAPUEFET, V_NRLOGCORTEOL
    FROM APURPRECO
   WHERE CDFILCENTCMP = P_CDCENTCMP
     AND NRAPURPREC   = P_NRSEQAPUR;

  SELECT
    MAX(IDTIPOAPUR),
    NVL(MAX(IDCONSPRSOL), 'N'),
    NVL(MAX(IDUTILCONSSOLIOL), 'N'),
    NVL(MAX(IDUTQTDISPGERAL), 'N'),
    NVL(MAX(IDUTLMARPREFOL), 'N'),
    NVL(MAX(IDUTLPRARVOLCMP), 'N'),
    NVL(MAX(IDUTLPRCMPATIVO), 'N'),
    NVL(MAX(IDCONSARREDCMPAPUR), 'N'),
    NVL(MAX(CDMARCA), '')
  INTO
    V_IDTIPOAPUR,   /* 3 APURA_MELHOR_COTACAO */
    V_IDCONSPRSOL, /* Considerar somente Produto Solicitado para Cotacao e AF Automatica (S/N) */
    V_IDUTILCONSSOLIOL, /*Utiliza consolidacao de solicitacoes de compras para o OL*/
    V_IDUTQTDISPGERAL, /*Utiliza quantidade disponivel na escolha do melhor preco*/
    V_IDUTLMARPREFOL,  /*Utiliza Marca Preferencial no Lancamento de Pedidos OL*/
    V_IDUTLPRARVOLCMP, /*Permite apurar produto de compra na arvore do OL*/
    V_IDUTLPRCMPATIVO,  /*Desconsidera embalagem utilizada para compra no OL*/
    V_IDCONSARREDCMPAPUR,
    V_CDMARCA_PADRAO
  FROM
    PARASUPRI
  WHERE
    CDFILIAL = P_CDCENTCMP;

  /*IF V_NRLOGCORTEOL IS NOT NULL THEN
     V_IDUTLMARPREFOL   := 'S';
     V_IDUTILCONSSOLIOL := 'S';
  END IF;*/

  IF NVL(V_IDCONSPRSOL, 'N') = 'N' THEN
     FOR C_REGIAO IN
       (SELECT /* Agrupa por regiao - APURA_MELHOR_COTACAO */
          DISTINCT
          ITMAPURPREC.CDREGITMAP,
          PRODUTO.CDPRODESTO,
          ITMAPURPREC.CDFILIAP,
          NVL(FILIAL.IDFUNCAOFILI, 'NULL') IDFUNCAOFILI,
          ITMAPURPREC.DTENTRAPUT,
          ENDEFILI.CDPAIS,
          ENDEFILI.SGESTADO,
          ENDEFILI.CDMUNICIPIO
        FROM
          PRODUTO,
          FILIAL,
          ENDEFILI,
          ITMAPURPREC
        WHERE
          ITMAPURPREC.CDCENTITMAP = P_CDCENTCMP        AND
          ITMAPURPREC.CDFILIAP    = FILIAL.CDFILIAL    AND
          ITMAPURPREC.NRSEQITMAP  = P_NRSEQAPUR        AND
          ITMAPURPREC.CDPRODITMAP = PRODUTO.CDPRODUTO  AND
          ENDEFILI.CDFILIAL       = FILIAL.CDFILIAL    AND
          ENDEFILI.IDTPENDEFILI   = 'P' )
     LOOP
       V_QTSOLACOMP     := 0;
       IF V_IDUTILCONSSOLIOL = 'N' THEN
          SELECT MAX(F.CDFORNOPELOG) INTO V_CDFORNOPELOG
            FROM PARAMPRODSUP P, FILIAL F
           WHERE P.CDFILIAL     = C_REGIAO.CDFILIAP
             AND P.CDFILIOPELOG = F.CDFILIAL
             AND P.CDFILIOPELOG IS NOT NULL;
       END IF;
       IF ((C_REGIAO.IDFUNCAOFILI <> 'O') OR (V_IDUTILCONSSOLIOL = 'N')) THEN
          FOR C_ITMAPURPREC IN /* O primeiro registro tem o melhor preco  - APURA_MELHOR_COTACAO */
           (SELECT
              ITMAPURPREC.CDCENTITMAP,
              ITMAPURPREC.NRSEQITMAP,
              ITMAPURPREC.CDREGITMAP,
              ITMAPURPREC.CDFORNITMAP,
              FORNECEDOR.IDUTQTDISPFORN,
              ITMAPURPREC.NRCOLEITMAP,
              ITMAPURPREC.DTENTRAPUT,
              ITMAPURPREC.CDFILIAP,
              ITMAPURPREC.CDPRODITMAP,
              ITMAPURPREC.CDMARCITMAP,
              PRODUTO.VRFATOCONV,
              PRODUTO.VRARREDCMP,
              ITMAPURPREC.QTSOLACOMP,
              DECODE(PRODPREFMED.CDPRODPREF, NULL, '0', '1')   ||
              DECODE(PPMF.CDTIPPART, NULL, '0',  PPMF.CDTIPPART)||
              DECODE(PPF.CDTIPPART,
                     NULL, '0',
                     DECODE(PPF.CDTIPPART,
                            '4', DECODE(PPF.CDGRUPPROD||PPF.CDSUBGRPROD,
                                        NULL, '4',
                                        'A'),
                             PPF.CDTIPPART)) ||
              DECODE(PPM.CDTIPPART,  NULL, '0', PPM.CDTIPPART) ||
              DECODE(ITMAPURPREC.IDITMLISPRAP, 'S', '1', '2')    ||
              DECODE(V_IDCONSOLAPUEFET, 'X', '0', 'S', DECODE(FORNECMPEXTRA.CDFORNECED, NULL, '1', '2'), '3') || '0000' AS IDMOTIVPRESC
            FROM
              FORNECEDOR,
              FORNECMPEXTRA,
              PRODUTO,
              PRODPREFMED,
              PARTFILI PPM,
              PARTFILI PPF,
              PARTFILI PPMF,
              ITMAPURPREC,
              PRODFORNCOMP
            WHERE
              ITMAPURPREC.CDCENTITMAP  = P_CDCENTCMP                  AND
              ITMAPURPREC.NRSEQITMAP   = P_NRSEQAPUR                  AND
              ITMAPURPREC.CDREGITMAP   = C_REGIAO.CDREGITMAP          AND
              ITMAPURPREC.DTENTRAPUT   = C_REGIAO.DTENTRAPUT          AND
              ITMAPURPREC.CDFILIAP     = C_REGIAO.CDFILIAP            AND
              ITMAPURPREC.CDPRODITMAP  = PRODUTO.CDPRODUTO            AND
              ITMAPURPREC.CDFORNITMAP  = FORNECEDOR.CDFORNECED        AND
              FORNECEDOR.CDFORNECED    = FORNECMPEXTRA.CDFORNECED(+)  AND
              C_REGIAO.CDPAIS          = FORNECMPEXTRA.CDPAIS(+)      AND
              C_REGIAO.SGESTADO        = FORNECMPEXTRA.SGESTADO(+)    AND
              C_REGIAO.CDMUNICIPIO     = FORNECMPEXTRA.CDMUNICIPIO(+) AND
              PRODUTO.CDPRODESTO       = C_REGIAO.CDPRODESTO          AND
              ITMAPURPREC.CDFILIAP     = PRODPREFMED.CDFILIAL  (+)    AND
              C_REGIAO.CDPRODESTO      = PRODPREFMED.CDPRODUTO (+)    AND
              ITMAPURPREC.CDPRODITMAP  = PRODPREFMED.CDPRODPREF(+)    AND

              ITMAPURPREC.CDFILIAP     = PPM.CDFILIAL   (+)   AND
              ITMAPURPREC.CDPRODITMAP  = PPM.CDPRODUTO  (+)   AND
              ITMAPURPREC.CDMARCITMAP  = PPM.CDMARCA    (+)   AND

              ITMAPURPREC.CDFILIAP     = PPF.CDFILIAL    (+)  AND
              ITMAPURPREC.CDPRODITMAP  = PPF.CDPRODUTO   (+)  AND
              ITMAPURPREC.CDFORNITMAP  = PPF.CDFORNECED  (+)  AND
              ITMAPURPREC.NRCOLEITMAP  = NVL(PPF.NRCOLEPRECO(+), ITMAPURPREC.NRCOLEITMAP)  AND

              ITMAPURPREC.CDFILIAP     = PPMF.CDFILIAL   (+)  AND
              ITMAPURPREC.CDPRODITMAP  = PPMF.CDPRODUTO  (+)  AND
              ITMAPURPREC.CDMARCITMAP  = PPMF.CDMARCA    (+)  AND
              ITMAPURPREC.CDFORNITMAP  = PPMF.CDFORNECED (+)  AND

              ITMAPURPREC.CDPRODITMAP  = PRODFORNCOMP.CDPRODCOMPL(+)  AND
              ITMAPURPREC.CDFORNITMAP  = PRODFORNCOMP.CDFORNECED (+)
            ORDER BY
              /* Estabelecendo prioridades - O primeiro registro retornado sera o escolhido */
              DECODE(V_IDCONSOLAPUEFET, 'S', DECODE(ITMAPURPREC.CDFORNITMAP,
                                                    V_CDFORNOPELOG, -10,
                                                     -11),
                    0),



              DECODE(PRODPREFMED.CDPRODPREF,
                     NULL, -1,
                     -10),

              DECODE(PPMF.CDTIPPART,
                     '7', -9,
                     '8', -8,
                     '9', 1,
                     0),

              DECODE(PPF.CDTIPPART,
                     '4', DECODE(PPF.NRCOLEPRECO, NULL, -9, 0),
                     '5', -8,
                     '6', 1,
                     0),

              DECODE(PPF.NRCOLEPRECO,
                     ITMAPURPREC.NRCOLEITMAP, -9,
                     0),

              DECODE(PPM.CDTIPPART,
                     '1', -9,
                     '2', -8,
                     '3', 1,
                     0),

              DECODE(V_IDCONSOLAPUEFET, 'S', DECODE(FORNECMPEXTRA.CDFORNECED,
                                                    ITMAPURPREC.CDFORNITMAP, -9,
                                                    0),
                     0),

              DECODE(PPF.CDTIPPART||PPF.NRCOLEPRECO,
                     '4'||ITMAPURPREC.NRCOLEITMAP, CASE CASE NVL(TO_CHAR(PRODFORNCOMP.VRARREDEMPE), 'N')
                                                           WHEN 'N'
                                                           THEN 'N'
                                                           ELSE V_IDCONSARREDCMPAPUR
                                                        END
                                                      WHEN 'N'
                                                      THEN QTACOMP
                                                      ELSE CASE MOD(QTACOMP, CASE NVL(PRODFORNCOMP.VRARREDEMPE, 0)
                                                                                WHEN 0
                                                                                THEN 1
                                                                                ELSE NVL(PRODFORNCOMP.VRARREDEMPE, 0)
                                                                             END)
                                                              WHEN 0
                                                              THEN QTACOMP
                                                              ELSE CEIL(QTACOMP / CASE NVL(PRODFORNCOMP.VRARREDEMPE, 0)
                                                                                     WHEN 0
                                                                                     THEN 1
                                                                                     ELSE NVL(PRODFORNCOMP.VRARREDEMPE, 0)
                                                                                   END) * CASE NVL(PRODFORNCOMP.VRARREDEMPE, 0)
                                                                                             WHEN 0
                                                                                             THEN 1
                                                                                             ELSE NVL(PRODFORNCOMP.VRARREDEMPE, 0)
                                                                                           END
                                                           END
                                                   END * DECODE (V_IDTIPOAPUR,
                                                                 NULL, VRPRECUNIAP,
                                                                 '1', VRPRECECOAP,
                                                                 VRPRECONPIAP),
                     DECODE(V_IDCONSOLAPUEFET, 'S', DECODE(FORNECMPEXTRA.CDFORNECED,
                                                           ITMAPURPREC.CDFORNITMAP, CASE CASE NVL(TO_CHAR(PRODFORNCOMP.VRARREDEMPE), 'N')
                                                                                            WHEN 'N'
                                                                                            THEN 'N'
                                                                                            ELSE V_IDCONSARREDCMPAPUR
                                                                                         END
                                                                                       WHEN 'N'
                                                                                       THEN QTACOMP
                                                                                       ELSE CASE MOD(QTACOMP, CASE NVL(PRODFORNCOMP.VRARREDEMPE, 0)
                                                                                                                 WHEN 0
                                                                                                                 THEN 1
                                                                                                                 ELSE NVL(PRODFORNCOMP.VRARREDEMPE, 0)
                                                                                                              END)
                                                                                               WHEN 0
                                                                                               THEN QTACOMP
                                                                                               ELSE CEIL(QTACOMP / CASE NVL(PRODFORNCOMP.VRARREDEMPE, 0)
                                                                                                                      WHEN 0
                                                                                                                      THEN 1
                                                                                                                      ELSE NVL(PRODFORNCOMP.VRARREDEMPE, 0)
                                                                                                                    END) * CASE NVL(PRODFORNCOMP.VRARREDEMPE, 0)
                                                                                                                              WHEN 0
                                                                                                                              THEN 1
                                                                                                                              ELSE NVL(PRODFORNCOMP.VRARREDEMPE, 0)
                                                                                                                            END
                                                                                            END
                                                                                    END * DECODE (V_IDTIPOAPUR,
                                                                                                  NULL, VRPRECUNIAP,
                                                                                                  '1', VRPRECECOAP,
                                                                                                  VRPRECONPIAP),
                                                           DECODE(ITMAPURPREC.IDITMLISPRAP,
                                                                  'S', -6, -5
                                                                  )
                                                           ),
                            DECODE(ITMAPURPREC.IDITMLISPRAP,
                                   'S', -6, -5
                                   )
                            )
                     ), CASE CASE NVL(TO_CHAR(PRODFORNCOMP.VRARREDEMPE), 'N')
                                WHEN 'N'
                                THEN 'N'
                                ELSE V_IDCONSARREDCMPAPUR
                             END
                           WHEN 'N'
                           THEN QTACOMP
                           ELSE CASE MOD(QTACOMP, CASE NVL(PRODFORNCOMP.VRARREDEMPE, 0)
                                                     WHEN 0
                                                     THEN 1
                                                     ELSE NVL(PRODFORNCOMP.VRARREDEMPE, 0)
                                                  END)
                                   WHEN 0
                                   THEN QTACOMP
                                   ELSE CEIL(QTACOMP / CASE NVL(PRODFORNCOMP.VRARREDEMPE, 0)
                                                          WHEN 0
                                                          THEN 1
                                                          ELSE NVL(PRODFORNCOMP.VRARREDEMPE, 0)
                                                        END) * CASE NVL(PRODFORNCOMP.VRARREDEMPE, 0)
                                                                  WHEN 0
                                                                  THEN 1
                                                                  ELSE NVL(PRODFORNCOMP.VRARREDEMPE, 0)
                                                                END
                                END
                        END * DECODE (V_IDTIPOAPUR,
                                NULL, VRPRECUNIAP,
                                '1', VRPRECECOAP,
                                VRPRECONPIAP),

              ITMAPURPREC.CDMARCITMAP)
          LOOP
            IF (V_IDUTQTDISPGERAL = 'S' AND C_ITMAPURPREC.IDUTQTDISPFORN = 'S') THEN
               IF V_QTSOLACOMP = 0 THEN
                  V_QTSOLACOMP := C_ITMAPURPREC.QTSOLACOMP;
                  V_QTRESTANTE := C_ITMAPURPREC.QTSOLACOMP;
               ELSE
                  IF V_QTRESTANTE > 0 THEN
                     V_QTSOLACOMP := (V_QTRESTANTE/C_ITMAPURPREC.VRFATOCONV);
                     IF (MOD(V_QTSOLACOMP, C_ITMAPURPREC.VRARREDCMP) <> 0) AND C_ITMAPURPREC.VRARREDCMP > 0 THEN
                        V_QTSOLACOMP := CEIL(V_QTSOLACOMP / C_ITMAPURPREC.VRARREDCMP) * C_ITMAPURPREC.VRARREDCMP;
                     END IF;
                  END IF;
               END IF;

               V_NRPEDIDOCOL := NULL;
               SELECT MAX(NRPEDIDOCOL)
               INTO V_NRPEDIDOCOL
               FROM ITEMCOLE
               WHERE ITEMCOLE.CDFILIAL    = C_ITMAPURPREC.CDCENTITMAP
                 AND ITEMCOLE.NRCOLEPRECO = C_ITMAPURPREC.NRCOLEITMAP
                 AND ITEMCOLE.CDREGIAO    = C_ITMAPURPREC.CDREGITMAP
                 AND ITEMCOLE.CDFORNECED  = C_ITMAPURPREC.CDFORNITMAP
                 AND ITEMCOLE.CDPRODUTO   = C_ITMAPURPREC.CDPRODITMAP
                 AND ITEMCOLE.CDMARCA     = C_ITMAPURPREC.CDMARCITMAP;

               IF V_NRPEDIDOCOL IS NOT NULL THEN
                  BEGIN
                     V_AUX := V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP);
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN BEGIN
                        SELECT MAX(QTDISPPRODMARC)
                        INTO V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP)
                        FROM PRMARCPEDCOL
                        WHERE PRMARCPEDCOL.CDFILIAL    = C_ITMAPURPREC.CDCENTITMAP
                          AND PRMARCPEDCOL.NRPEDIDOCOL = V_NRPEDIDOCOL
                          AND PRMARCPEDCOL.CDPRODUTO   = C_ITMAPURPREC.CDPRODITMAP
                          AND PRMARCPEDCOL.CDMARCA     = C_ITMAPURPREC.CDMARCITMAP;
                     END;
                  END;
                  IF V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP) IS NOT NULL THEN
                     IF V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP) >= V_QTSOLACOMP THEN
                        V_QTRESTANTE := 0;
                        V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP) := V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP) - V_QTSOLACOMP;
                     ELSE
                        V_QTRESTANTE := (V_QTSOLACOMP - V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP))*(C_ITMAPURPREC.VRFATOCONV);
                        V_QTSOLACOMP := V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP);
                        V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP) := 0;
                        IF (MOD(V_QTSOLACOMP, C_ITMAPURPREC.VRARREDCMP) <> 0) AND C_ITMAPURPREC.VRARREDCMP > 0 THEN
                           V_QTSOLACOMP := CEIL(V_QTSOLACOMP / C_ITMAPURPREC.VRARREDCMP) * C_ITMAPURPREC.VRARREDCMP;
                        END IF;
                     END IF;
                  ELSE
                     V_QTRESTANTE := 0;
                  END IF;
               ELSE
                  V_QTRESTANTE := 0;
               END IF;
               IF V_QTSOLACOMP > 0 THEN
                  UPDATE ITMAPURPREC /* Escolhendo primeiro registro - APURA_MELHOR_COTACAO */
                  SET IDITMSELAPUR = 'S',
                      QTACOMP = V_QTSOLACOMP,
                      IDMOTIVPRESC = C_ITMAPURPREC.IDMOTIVPRESC
                  WHERE
                    CDCENTITMAP = C_ITMAPURPREC.CDCENTITMAP AND
                    NRSEQITMAP  = C_ITMAPURPREC.NRSEQITMAP  AND
                    CDREGITMAP  = C_ITMAPURPREC.CDREGITMAP  AND
                    CDFORNITMAP = C_ITMAPURPREC.CDFORNITMAP AND
                    NRCOLEITMAP = C_ITMAPURPREC.NRCOLEITMAP AND
                    DTENTRAPUT  = C_ITMAPURPREC.DTENTRAPUT  AND
                    CDFILIAP    = C_ITMAPURPREC.CDFILIAP    AND
                    CDPRODITMAP = C_ITMAPURPREC.CDPRODITMAP AND
                    CDMARCITMAP = C_ITMAPURPREC.CDMARCITMAP;
               END IF;
               IF V_QTRESTANTE = 0 THEN
                 EXIT; /* Sai do Loop */
               END IF;
            ELSE
               UPDATE ITMAPURPREC /* Escolhendo primeiro registro - APURA_MELHOR_COTACAO */
               SET IDITMSELAPUR = 'S',
                   QTACOMP      = QTSOLACOMP,
                   IDMOTIVPRESC = C_ITMAPURPREC.IDMOTIVPRESC
               WHERE
                 CDCENTITMAP = C_ITMAPURPREC.CDCENTITMAP AND
                 NRSEQITMAP  = C_ITMAPURPREC.NRSEQITMAP  AND
                 CDREGITMAP  = C_ITMAPURPREC.CDREGITMAP  AND
                 CDFORNITMAP = C_ITMAPURPREC.CDFORNITMAP AND
                 NRCOLEITMAP = C_ITMAPURPREC.NRCOLEITMAP AND
                 DTENTRAPUT  = C_ITMAPURPREC.DTENTRAPUT  AND
                 CDFILIAP    = C_ITMAPURPREC.CDFILIAP    AND
                 CDPRODITMAP = C_ITMAPURPREC.CDPRODITMAP AND
                 CDMARCITMAP = C_ITMAPURPREC.CDMARCITMAP;
               EXIT; /* Sai do Loop */
            END IF;
          END LOOP;
       END IF;
     END LOOP;
  ELSE
     FOR C_REGIAO IN
       (SELECT /* Agrupa por regiao - APURA_MELHOR_COTACAO */
          DISTINCT
          ITMAPURPREC.CDREGITMAP,
          ITMAPURPREC.CDPRODITMAP,
          PRODUTO.CDPRODESTO,
          ITMAPURPREC.CDFILIAP,
          NVL(FILIAL.IDFUNCAOFILI, 'NULL') IDFUNCAOFILI,
          ITMAPURPREC.DTENTRAPUT,
          ENDEFILI.CDPAIS,
          ENDEFILI.SGESTADO,
          ENDEFILI.CDMUNICIPIO
        FROM
          ITMAPURPREC,
          FILIAL,
          ENDEFILI,
          PRODUTO
        WHERE
          ITMAPURPREC.CDPRODITMAP = PRODUTO.CDPRODUTO AND
          ITMAPURPREC.CDFILIAP    = FILIAL.CDFILIAL   AND
          ITMAPURPREC.CDCENTITMAP = P_CDCENTCMP       AND
          ITMAPURPREC.NRSEQITMAP  = P_NRSEQAPUR       AND
          ENDEFILI.CDFILIAL       = FILIAL.CDFILIAL   AND
          ENDEFILI.IDTPENDEFILI   = 'P')
     LOOP
       V_QTSOLACOMP := 0;
       IF V_IDUTILCONSSOLIOL = 'N' THEN
          SELECT MAX(F.CDFORNOPELOG) INTO V_CDFORNOPELOG
            FROM PARAMPRODSUP P, FILIAL F
           WHERE P.CDFILIAL     = C_REGIAO.CDFILIAP
             AND P.CDFILIOPELOG = F.CDFILIAL
             AND P.CDFILIOPELOG IS NOT NULL;
       END IF;
       IF ((C_REGIAO.IDFUNCAOFILI <> 'O') OR (V_IDUTILCONSSOLIOL = 'N')) THEN
          FOR C_ITMAPURPREC IN /* O primeiro registro tem o melhor preco  - APURA_MELHOR_COTACAO */
           (SELECT
              ITMAPURPREC.CDCENTITMAP,
              ITMAPURPREC.NRSEQITMAP,
              ITMAPURPREC.CDREGITMAP,
              ITMAPURPREC.CDFORNITMAP,
              FORNECEDOR.IDUTQTDISPFORN,
              ITMAPURPREC.NRCOLEITMAP,
              ITMAPURPREC.DTENTRAPUT,
              ITMAPURPREC.CDFILIAP,
              ITMAPURPREC.CDPRODITMAP,
              PRODUTO.VRFATOCONV,
              PRODUTO.VRARREDCMP,
              ITMAPURPREC.QTSOLACOMP,
              ITMAPURPREC.CDMARCITMAP,
              DECODE(PRODPREFMED.CDPRODPREF, NULL, '0', '1')   ||
              DECODE(PPMF.CDTIPPART, NULL, '0',  PPMF.CDTIPPART)||
              DECODE(PPF.CDTIPPART,
                     NULL, '0',
                     DECODE(PPF.CDTIPPART,
                            '4', DECODE(PPF.CDGRUPPROD||PPF.CDSUBGRPROD,
                                        NULL, '4',
                                        'A'),
                             PPF.CDTIPPART)) ||
              DECODE(PPM.CDTIPPART,  NULL, '0', PPM.CDTIPPART) ||
              DECODE(ITMAPURPREC.IDITMLISPRAP, 'S', '1', '2')    ||
              DECODE(V_IDCONSOLAPUEFET, 'X', '0', 'S', DECODE(FORNECMPEXTRA.CDFORNECED, NULL, '1', '2'), '3') || '0000' AS IDMOTIVPRESC
            FROM
              FORNECEDOR,
              FORNECMPEXTRA,
              PRODPREFMED,
              PRODUTO,
              PARTFILI PPM,
              PARTFILI PPF,
              PARTFILI PPMF,
              ITMAPURPREC
            WHERE
              ITMAPURPREC.CDCENTITMAP  = P_CDCENTCMP                  AND
              ITMAPURPREC.NRSEQITMAP   = P_NRSEQAPUR                  AND
              ITMAPURPREC.CDREGITMAP   = C_REGIAO.CDREGITMAP          AND
              ITMAPURPREC.DTENTRAPUT   = C_REGIAO.DTENTRAPUT          AND
              ITMAPURPREC.CDFILIAP     = C_REGIAO.CDFILIAP            AND
              ITMAPURPREC.CDPRODITMAP  = C_REGIAO.CDPRODITMAP         AND
              FORNECEDOR.CDFORNECED    = FORNECMPEXTRA.CDFORNECED(+)  AND
              C_REGIAO.CDPAIS          = FORNECMPEXTRA.CDPAIS(+)      AND
              C_REGIAO.SGESTADO        = FORNECMPEXTRA.SGESTADO(+)    AND
              C_REGIAO.CDMUNICIPIO     = FORNECMPEXTRA.CDMUNICIPIO(+) AND
              ITMAPURPREC.CDFILIAP     = PRODPREFMED.CDFILIAL  (+)    AND
              ITMAPURPREC.CDPRODITMAP  = C_REGIAO.CDPRODITMAP         AND
              ITMAPURPREC.CDFORNITMAP  = FORNECEDOR.CDFORNECED        AND
              C_REGIAO.CDPRODESTO      = PRODPREFMED.CDPRODUTO (+)    AND
              ITMAPURPREC.CDPRODITMAP  = PRODPREFMED.CDPRODPREF(+)    AND
              ITMAPURPREC.CDPRODITMAP  = PRODUTO.CDPRODUTO            AND
              ITMAPURPREC.CDFILIAP     = PPM.CDFILIAL   (+)           AND
              ITMAPURPREC.CDPRODITMAP  = PPM.CDPRODUTO  (+)           AND
              ITMAPURPREC.CDMARCITMAP  = PPM.CDMARCA    (+)           AND

              ITMAPURPREC.CDFILIAP     = PPF.CDFILIAL   (+)           AND
              ITMAPURPREC.CDPRODITMAP  = PPF.CDPRODUTO  (+)           AND
              ITMAPURPREC.CDFORNITMAP  = PPF.CDFORNECED (+)           AND
              ITMAPURPREC.NRCOLEITMAP  = NVL(PPF.NRCOLEPRECO(+), ITMAPURPREC.NRCOLEITMAP) AND 

              ITMAPURPREC.CDFILIAP     = PPMF.CDFILIAL   (+)          AND
              ITMAPURPREC.CDPRODITMAP  = PPMF.CDPRODUTO  (+)          AND
              ITMAPURPREC.CDMARCITMAP  = PPMF.CDMARCA    (+)          AND
              ITMAPURPREC.CDFORNITMAP  = PPMF.CDFORNECED (+)
            ORDER BY
              /* Estabelecendo prioridades - O primeiro registro retornado sera o escolhido */
              DECODE(V_IDCONSOLAPUEFET, 'S', DECODE(ITMAPURPREC.CDFORNITMAP,
                                                    V_CDFORNOPELOG, -10,
                                                     -11),
                    0),


              DECODE(PRODPREFMED.CDPRODPREF,
                     NULL, -1,
                     -10),

              DECODE(PPMF.CDTIPPART,
                     '7', -9,
                     '8', -8,
                     '9', 1,
                     0),

              DECODE(PPF.CDTIPPART,
                     '4', DECODE(PPF.NRCOLEPRECO, NULL, -9, 0),
                     '5', -8,
                     '6', 1,
                     0),

              DECODE(PPF.NRCOLEPRECO,
                     ITMAPURPREC.NRCOLEITMAP, -9,
                     0),

              DECODE(PPM.CDTIPPART,
                     '1', -9,
                     '2', -8,
                     '3', 1,
                     0),

              DECODE(V_IDCONSOLAPUEFET, 'S', DECODE(FORNECMPEXTRA.CDFORNECED,
                                                    ITMAPURPREC.CDFORNITMAP, -9,
                                                    0),
                     0),

              DECODE(PPF.CDTIPPART||PPF.NRCOLEPRECO,
                     '4'||ITMAPURPREC.NRCOLEITMAP, QTACOMP * DECODE (V_IDTIPOAPUR,
                                                                     NULL, VRPRECUNIAP,
                                                                     '1', VRPRECECOAP,
                                                                     VRPRECONPIAP),
                     DECODE(V_IDCONSOLAPUEFET, 'S', DECODE(FORNECMPEXTRA.CDFORNECED,
                                                           ITMAPURPREC.CDFORNITMAP, QTACOMP * DECODE (V_IDTIPOAPUR,
                                                                                                      NULL, VRPRECUNIAP,
                                                                                                      '1', VRPRECECOAP,
                                                                                                      VRPRECONPIAP),
                                                           DECODE(ITMAPURPREC.IDITMLISPRAP,
                                                                  'S', -6, -5
                                                                  )
                                                           ),
                            DECODE(ITMAPURPREC.IDITMLISPRAP,
                                   'S', -6, -5
                                   )
                            )
                     ),

              QTACOMP * DECODE (V_IDTIPOAPUR,
                                NULL, VRPRECUNIAP,
                                '1', VRPRECECOAP,
                                VRPRECONPIAP),

              ITMAPURPREC.CDMARCITMAP)
          LOOP
            IF (V_IDUTQTDISPGERAL = 'S' AND C_ITMAPURPREC.IDUTQTDISPFORN = 'S') THEN
               IF V_QTSOLACOMP = 0 THEN
                  V_QTSOLACOMP := C_ITMAPURPREC.QTSOLACOMP;
                  V_QTRESTANTE := C_ITMAPURPREC.QTSOLACOMP;
               ELSE
                  IF V_QTRESTANTE > 0 THEN
                     V_QTSOLACOMP := (V_QTRESTANTE/C_ITMAPURPREC.VRFATOCONV);
                     IF (MOD(V_QTSOLACOMP, C_ITMAPURPREC.VRARREDCMP) <> 0) AND C_ITMAPURPREC.VRARREDCMP > 0 THEN
                        V_QTSOLACOMP := CEIL(V_QTSOLACOMP / C_ITMAPURPREC.VRARREDCMP) * C_ITMAPURPREC.VRARREDCMP;
                     END IF;
                  END IF;
               END IF;

               V_NRPEDIDOCOL := NULL;
               SELECT MAX(NRPEDIDOCOL)
               INTO V_NRPEDIDOCOL
               FROM ITEMCOLE
               WHERE ITEMCOLE.CDFILIAL    = C_ITMAPURPREC.CDCENTITMAP
                 AND ITEMCOLE.NRCOLEPRECO = C_ITMAPURPREC.NRCOLEITMAP
                 AND ITEMCOLE.CDREGIAO    = C_ITMAPURPREC.CDREGITMAP
                 AND ITEMCOLE.CDFORNECED  = C_ITMAPURPREC.CDFORNITMAP
                 AND ITEMCOLE.CDPRODUTO   = C_ITMAPURPREC.CDPRODITMAP
                 AND ITEMCOLE.CDMARCA     = C_ITMAPURPREC.CDMARCITMAP;

               IF V_NRPEDIDOCOL IS NOT NULL THEN
                  BEGIN
                     V_AUX := V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP);
                  EXCEPTION
                     WHEN NO_DATA_FOUND THEN BEGIN
                        SELECT MAX(QTDISPPRODMARC)
                        INTO V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP)
                        FROM PRMARCPEDCOL
                        WHERE PRMARCPEDCOL.CDFILIAL    = C_ITMAPURPREC.CDCENTITMAP
                          AND PRMARCPEDCOL.NRPEDIDOCOL = V_NRPEDIDOCOL
                          AND PRMARCPEDCOL.CDPRODUTO   = C_ITMAPURPREC.CDPRODITMAP
                          AND PRMARCPEDCOL.CDMARCA     = C_ITMAPURPREC.CDMARCITMAP;
                     END;
                  END;
                  IF V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP) IS NOT NULL THEN
                     IF V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP) >= V_QTSOLACOMP THEN
                        V_QTRESTANTE := 0;
                        V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP) := V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP) - V_QTSOLACOMP;
                     ELSE
                        V_QTRESTANTE := (V_QTSOLACOMP - V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP))*(C_ITMAPURPREC.VRFATOCONV);
                        V_QTSOLACOMP := V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP);
                        V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP) := 0;
                        IF (MOD(V_QTSOLACOMP, C_ITMAPURPREC.VRARREDCMP) <> 0) AND C_ITMAPURPREC.VRARREDCMP > 0 THEN
                           V_QTSOLACOMP := CEIL(V_QTSOLACOMP / C_ITMAPURPREC.VRARREDCMP) * C_ITMAPURPREC.VRARREDCMP;
                        END IF;
                     END IF;
                  ELSE
                     V_QTRESTANTE := 0;
                  END IF;
               ELSE
                  V_QTRESTANTE := 0;
               END IF;
               IF V_QTSOLACOMP > 0 THEN
                  UPDATE ITMAPURPREC /* Escolhendo primeiro registro - APURA_MELHOR_COTACAO */
                  SET IDITMSELAPUR = 'S',
                      QTACOMP = V_QTSOLACOMP,
                      IDMOTIVPRESC = C_ITMAPURPREC.IDMOTIVPRESC
                  WHERE
                    CDCENTITMAP = C_ITMAPURPREC.CDCENTITMAP AND
                    NRSEQITMAP  = C_ITMAPURPREC.NRSEQITMAP  AND
                    CDREGITMAP  = C_ITMAPURPREC.CDREGITMAP  AND
                    CDFORNITMAP = C_ITMAPURPREC.CDFORNITMAP AND
                    NRCOLEITMAP = C_ITMAPURPREC.NRCOLEITMAP AND
                    DTENTRAPUT  = C_ITMAPURPREC.DTENTRAPUT  AND
                    CDFILIAP    = C_ITMAPURPREC.CDFILIAP    AND
                    CDPRODITMAP = C_ITMAPURPREC.CDPRODITMAP AND
                    CDMARCITMAP = C_ITMAPURPREC.CDMARCITMAP;
               END IF;
               IF V_QTRESTANTE = 0 THEN
                  EXIT; /* Sai do Loop */
               END IF;
            ELSE
               UPDATE ITMAPURPREC /* Escolhendo primeiro registro - APURA_MELHOR_COTACAO */
               SET IDITMSELAPUR = 'S',
                   QTACOMP      = QTSOLACOMP,
                   IDMOTIVPRESC = C_ITMAPURPREC.IDMOTIVPRESC
               WHERE
                 CDCENTITMAP = C_ITMAPURPREC.CDCENTITMAP AND
                 NRSEQITMAP  = C_ITMAPURPREC.NRSEQITMAP  AND
                 CDREGITMAP  = C_ITMAPURPREC.CDREGITMAP  AND
                 CDFORNITMAP = C_ITMAPURPREC.CDFORNITMAP AND
                 NRCOLEITMAP = C_ITMAPURPREC.NRCOLEITMAP AND
                 DTENTRAPUT  = C_ITMAPURPREC.DTENTRAPUT  AND
                 CDFILIAP    = C_ITMAPURPREC.CDFILIAP    AND
                 CDPRODITMAP = C_ITMAPURPREC.CDPRODITMAP AND
                 CDMARCITMAP = C_ITMAPURPREC.CDMARCITMAP;

               EXIT; /* Sai do Loop */
            END IF;
          END LOOP;
       END IF;
     END LOOP;
  END IF;

  /* Escolha do melhor preco para o OL quando e utilizada a consolidacao de solicitacao
     de compras para o operador logistico */

  IF V_IDUTILCONSSOLIOL = 'S' THEN
     IF V_IDUTLPRCMPATIVO = 'S' THEN
        V_IDUTLPRARVOLCMP := 'S';
     END IF;
     FOR C_REGIAO IN
        (SELECT /* Agrupa por regiao - APURA_MELHOR_COTACAO */
           DISTINCT
           ITMAPURPREC.CDREGITMAP,
           CASE 
              WHEN V_IDUTLPRARVOLCMP = 'S'
              THEN PRODUTO.CDPRODESTO      -- INCLUSAO PARA ALISERVICE 190231
              ELSE ITMAPURPREC.CDPRODITMAP
           END CDPRODITMAP,
           PRODUTO.CDPRODESTO,
           ITMAPURPREC.CDFILIAP,
           ITMAPURPREC.DTENTRAPUT,
           ENDEFILI.CDPAIS,
           ENDEFILI.SGESTADO,
           ENDEFILI.CDMUNICIPIO,
           ITEMSOLI.CDMARCA/*,
           
           ITMAPURPREC.QTSOLACOMP*PRODUTO.VRFATOCONV QTSOLACOMP*/
         FROM
           ITMAPURPREC,
           FILIAL,
           ENDEFILI,
           PRODUTO,
           PRODUTO PRODESTOOL,
           (SELECT ITEMSOLI.CDMARCA, ITEMSOLI.CDFILSOLI, ITEMSOLI.DTPROGENTR, P.CDPRODUTO
              FROM ITEMSOLI, PRODUTO, PRODUTO P
             WHERE ITEMSOLI.CDPRODUTO = PRODUTO.CDPRODUTO
               AND PRODUTO.CDPRODESTO = P.CDPRODESTO) ITEMSOLI
         WHERE
           ITMAPURPREC.CDPRODITMAP = PRODUTO.CDPRODUTO   AND
           ITMAPURPREC.CDFILIAP    = FILIAL.CDFILIAL     AND
           ITMAPURPREC.CDFILIAP    = ITEMSOLI.CDFILSOLI(+)  AND
           ITMAPURPREC.DTENTRAPUT  = ITEMSOLI.DTPROGENTR(+) AND
           ITMAPURPREC.CDPRODITMAP = ITEMSOLI.CDPRODUTO(+)  AND
           FILIAL.IDFUNCAOFILI     = 'O'                 AND
           ITMAPURPREC.CDCENTITMAP = P_CDCENTCMP         AND
           ITMAPURPREC.NRSEQITMAP  = P_NRSEQAPUR         AND
           ENDEFILI.CDFILIAL       = FILIAL.CDFILIAL     AND
           ENDEFILI.IDTPENDEFILI   = 'P'                 AND
           ( (V_IDUTLPRARVOLCMP = 'N') OR
             (EXISTS ( SELECT 1
                         FROM PRODUTO, RELACPRODOL RELACPRODORIG, RELACPRODOL, PRODUTO PRODUTOOL
                        WHERE RELACPRODORIG.CDPRODARVOL = PRODUTO.CDPRODUTO
                          AND PRODUTO.CDPRODESTO        = PRODUTOOL.CDPRODESTO
                          AND RELACPRODOL.CDPRODARVOL   = PRODUTOOL.CDPRODUTO
                          AND RELACPRODOL.CDPRARVORIG   = ITMAPURPREC.CDPRODITMAP
                          AND V_IDUTLPRARVOLCMP = 'S'))
          ))
      LOOP
         V_QTSOLACOMP := 0;
         FOR C_ITMAPURPREC IN /* O primeiro registro tem o melhor preco  - APURA_MELHOR_COTACAO */
          (SELECT
             ITMAPURPREC.CDCENTITMAP,
             ITMAPURPREC.NRSEQITMAP,
             ITMAPURPREC.CDREGITMAP,
             ITMAPURPREC.CDFORNITMAP,
             FORNECEDOR.IDUTQTDISPFORN,
             ITMAPURPREC.NRCOLEITMAP,
             ITMAPURPREC.DTENTRAPUT,
             ITMAPURPREC.CDFILIAP,
             ITMAPURPREC.CDPRODITMAP,
             ITMAPURPREC.CDMARCITMAP,
             PRODUTO.VRFATOCONV,
             PRODUTO.VRARREDCMP,
             ITMAPURPREC.QTSOLACOMP,
             DECODE(PRODPREFMED.CDPRODPREF, NULL, '0', '1')   ||
             DECODE(PPMF.CDTIPPART, NULL, '0',  PPMF.CDTIPPART)||
             DECODE(PPF.CDTIPPART,
                    NULL, '0',
                    DECODE(PPF.CDTIPPART,
                           '4', DECODE(PPF.CDGRUPPROD||PPF.CDSUBGRPROD,
                                       NULL, '4',
                                       'A'),
                            PPF.CDTIPPART)) ||
             DECODE(PPM.CDTIPPART,  NULL, '0', PPM.CDTIPPART) ||
             DECODE(ITMAPURPREC.IDITMLISPRAP, 'S', '1', '2')    ||
             DECODE(V_IDCONSOLAPUEFET, 'X', '0', 'S', DECODE(FORNECMPEXTRA.CDFORNECED, NULL, '1', '2'), '3') || '0000' AS IDMOTIVPRESC
           FROM
             FORNECEDOR,
             FORNECMPEXTRA,
             PRODPREFMED,
             PRODUTO,
             PARTFILI PPM,
             PARTFILI PPF,
             PARTFILI PPMF,
             ITMAPURPREC
           WHERE
             ITMAPURPREC.CDCENTITMAP  = P_CDCENTCMP                  AND
             ITMAPURPREC.NRSEQITMAP   = P_NRSEQAPUR                  AND
             ITMAPURPREC.CDREGITMAP   = C_REGIAO.CDREGITMAP          AND
             ITMAPURPREC.DTENTRAPUT   = C_REGIAO.DTENTRAPUT          AND
             ITMAPURPREC.CDFILIAP     = C_REGIAO.CDFILIAP            AND
             ITMAPURPREC.CDMARCITMAP  = NVL(C_REGIAO.CDMARCA, ITMAPURPREC.CDMARCITMAP) AND
             /* RETIRADO PARA ALISERVICE 190231
                (ITMAPURPREC.QTSOLACOMP*PRODUTO.VRFATOCONV)  = NVL(C_REGIAO.QTSOLACOMP, (ITMAPURPREC.QTSOLACOMP*PRODUTO.VRFATOCONV)) AND
             */
             FORNECEDOR.CDFORNECED    = FORNECMPEXTRA.CDFORNECED(+)  AND
             C_REGIAO.CDPAIS          = FORNECMPEXTRA.CDPAIS(+)      AND
             C_REGIAO.SGESTADO        = FORNECMPEXTRA.SGESTADO(+)    AND
             C_REGIAO.CDMUNICIPIO     = FORNECMPEXTRA.CDMUNICIPIO(+) AND
             ITMAPURPREC.CDFILIAP     = PRODPREFMED.CDFILIAL  (+)    AND
             ITMAPURPREC.CDFORNITMAP  = FORNECEDOR.CDFORNECED        AND
             C_REGIAO.CDPRODESTO      = PRODPREFMED.CDPRODUTO (+)    AND
             ITMAPURPREC.CDPRODITMAP  = PRODPREFMED.CDPRODPREF(+)    AND
             ITMAPURPREC.CDPRODITMAP  = PRODUTO.CDPRODUTO            AND
             ITMAPURPREC.CDFILIAP     = PPM.CDFILIAL   (+)           AND
             ITMAPURPREC.CDPRODITMAP  = PPM.CDPRODUTO  (+)           AND
             ITMAPURPREC.CDMARCITMAP  = PPM.CDMARCA    (+)           AND

             ITMAPURPREC.CDFILIAP     = PPF.CDFILIAL   (+)           AND
             ITMAPURPREC.CDPRODITMAP  = PPF.CDPRODUTO  (+)           AND
             ITMAPURPREC.CDFORNITMAP  = PPF.CDFORNECED (+)           AND
             ITMAPURPREC.NRCOLEITMAP  = NVL(PPF.NRCOLEPRECO(+), ITMAPURPREC.NRCOLEITMAP) AND 

             ITMAPURPREC.CDFILIAP     = PPMF.CDFILIAL   (+)          AND
             ITMAPURPREC.CDPRODITMAP  = PPMF.CDPRODUTO  (+)          AND
             ITMAPURPREC.CDMARCITMAP  = PPMF.CDMARCA    (+)          AND
             ITMAPURPREC.CDFORNITMAP  = PPMF.CDFORNECED (+)          AND
             (((V_IDUTLPRARVOLCMP = 'N') AND (ITMAPURPREC.CDPRODITMAP  = C_REGIAO.CDPRODITMAP)) OR
             (EXISTS (SELECT 1
                        FROM PRODUTO, RELACPRODOL RELACPRODORIG, RELACPRODOL, PRODUTO PRODUTOOL,
                             PRODUTO PRODUTOORIG
                       WHERE RELACPRODORIG.CDPRODARVOL = PRODUTO.CDPRODUTO
                         AND PRODUTO.CDPRODESTO        = PRODUTOOL.CDPRODESTO
                         AND RELACPRODOL.CDPRODARVOL   = PRODUTOOL.CDPRODUTO
                         AND RELACPRODOL.CDPRARVORIG   = ITMAPURPREC.CDPRODITMAP
                         AND RELACPRODORIG.CDPRARVORIG = PRODUTOORIG.CDPRODUTO
                         AND PRODUTOORIG.CDPRODESTO    = C_REGIAO.CDPRODESTO
                         AND V_IDUTLPRARVOLCMP = 'S')))
           ORDER BY
             /* Estabelecendo prioridades - O primeiro registro retornado sera o escolhido */
             DECODE(PRODPREFMED.CDPRODPREF,
                    NULL, -1,
                    -10),

             DECODE(PPMF.CDTIPPART,
                    '7', -9,
                    '8', -8,
                    '9', 1,
                    0),

              DECODE(PPF.CDTIPPART,
                     '4', DECODE(PPF.NRCOLEPRECO, NULL, -9, 0),
                     '5', -8,
                     '6', 1,
                     0),

             DECODE(PPF.NRCOLEPRECO,
                    ITMAPURPREC.NRCOLEITMAP, -9,
                    0),

             DECODE(PPM.CDTIPPART,
                    '1', -9,
                    '2', -8,
                    '3', 1,
                    0),

              DECODE(V_IDCONSOLAPUEFET, 'S', DECODE(FORNECMPEXTRA.CDFORNECED,
                                                    ITMAPURPREC.CDFORNITMAP, -9,
                                                    0),
                     0),

              DECODE(PPF.CDTIPPART||PPF.NRCOLEPRECO,
                     '4'||ITMAPURPREC.NRCOLEITMAP, QTACOMP * DECODE (V_IDTIPOAPUR,
                                                                     NULL, VRPRECUNIAP,
                                                                     '1', VRPRECECOAP,
                                                                     VRPRECONPIAP),
                     DECODE(V_IDCONSOLAPUEFET, 'S', DECODE(FORNECMPEXTRA.CDFORNECED,
                                                           ITMAPURPREC.CDFORNITMAP, QTACOMP * DECODE (V_IDTIPOAPUR,
                                                                                                      NULL, VRPRECUNIAP,
                                                                                                      '1', VRPRECECOAP,
                                                                                                      VRPRECONPIAP),
                                                           DECODE(ITMAPURPREC.IDITMLISPRAP,
                                                                  'S', -6, -5
                                                                  )
                                                           ),
                            DECODE(ITMAPURPREC.IDITMLISPRAP,
                                   'S', -6, -5
                                   )
                            )
                     ),

             QTACOMP * DECODE (V_IDTIPOAPUR,
                               NULL, VRPRECUNIAP,
                               '1', VRPRECECOAP,
                               VRPRECONPIAP),

             ITMAPURPREC.CDMARCITMAP)
         LOOP
         IF (V_IDUTQTDISPGERAL = 'S' AND C_ITMAPURPREC.IDUTQTDISPFORN = 'S') THEN
            IF V_QTSOLACOMP = 0 THEN
               V_QTSOLACOMP := C_ITMAPURPREC.QTSOLACOMP;
               V_QTRESTANTE := C_ITMAPURPREC.QTSOLACOMP;
            ELSE
               IF V_QTRESTANTE > 0 THEN
                  V_QTSOLACOMP := (V_QTRESTANTE/C_ITMAPURPREC.VRFATOCONV);
                  IF (MOD(V_QTSOLACOMP, C_ITMAPURPREC.VRARREDCMP) <> 0) AND C_ITMAPURPREC.VRARREDCMP > 0 THEN
                     V_QTSOLACOMP := CEIL(V_QTSOLACOMP / C_ITMAPURPREC.VRARREDCMP) * C_ITMAPURPREC.VRARREDCMP;
                  END IF;
               END IF;
            END IF;

              V_NRPEDIDOCOL := NULL;
              SELECT MAX(NRPEDIDOCOL)
              INTO V_NRPEDIDOCOL
              FROM ITEMCOLE
              WHERE ITEMCOLE.CDFILIAL    = C_ITMAPURPREC.CDCENTITMAP
                AND ITEMCOLE.NRCOLEPRECO = C_ITMAPURPREC.NRCOLEITMAP
                AND ITEMCOLE.CDREGIAO    = C_ITMAPURPREC.CDREGITMAP
                AND ITEMCOLE.CDFORNECED  = C_ITMAPURPREC.CDFORNITMAP
                AND ITEMCOLE.CDPRODUTO   = C_ITMAPURPREC.CDPRODITMAP
                AND ITEMCOLE.CDMARCA     = C_ITMAPURPREC.CDMARCITMAP;

              IF V_NRPEDIDOCOL IS NOT NULL THEN
                 BEGIN
                    V_AUX := V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP);
                 EXCEPTION
                    WHEN NO_DATA_FOUND THEN BEGIN
                       SELECT MAX(QTDISPPRODMARC)
                       INTO V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP)
                       FROM PRMARCPEDCOL
                       WHERE PRMARCPEDCOL.CDFILIAL    = C_ITMAPURPREC.CDCENTITMAP
                         AND PRMARCPEDCOL.NRPEDIDOCOL = V_NRPEDIDOCOL
                         AND PRMARCPEDCOL.CDPRODUTO   = C_ITMAPURPREC.CDPRODITMAP
                         AND PRMARCPEDCOL.CDMARCA     = C_ITMAPURPREC.CDMARCITMAP;
                    END;
                 END;
                 IF V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP) IS NOT NULL THEN
                    IF V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP) >= V_QTSOLACOMP THEN
                       V_QTRESTANTE := 0;
                       V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP) := V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP) - V_QTSOLACOMP;
                    ELSE
                       V_QTRESTANTE := (V_QTSOLACOMP - V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP))*(C_ITMAPURPREC.VRFATOCONV);
                       V_QTSOLACOMP := V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP);
                       V_QTDEDISPONIVEL(C_ITMAPURPREC.CDCENTITMAP||V_NRPEDIDOCOL||C_ITMAPURPREC.CDPRODITMAP||C_ITMAPURPREC.CDMARCITMAP) := 0;
                       IF (MOD(V_QTSOLACOMP, C_ITMAPURPREC.VRARREDCMP) <> 0) AND C_ITMAPURPREC.VRARREDCMP > 0 THEN
                          V_QTSOLACOMP := CEIL(V_QTSOLACOMP / C_ITMAPURPREC.VRARREDCMP) * C_ITMAPURPREC.VRARREDCMP;
                       END IF;
                    END IF;
                 ELSE
                    V_QTRESTANTE := 0;
                 END IF;
              ELSE
                 V_QTRESTANTE := 0;
              END IF;

              IF V_QTSOLACOMP > 0 THEN
                 UPDATE ITMAPURPREC /* Escolhendo primeiro registro - APURA_MELHOR_COTACAO */
                 SET IDITMSELAPUR = 'S',
                     QTACOMP = V_QTSOLACOMP,
                     IDMOTIVPRESC = C_ITMAPURPREC.IDMOTIVPRESC
                 WHERE
                   CDCENTITMAP = C_ITMAPURPREC.CDCENTITMAP AND
                   NRSEQITMAP  = C_ITMAPURPREC.NRSEQITMAP  AND
                   CDREGITMAP  = C_ITMAPURPREC.CDREGITMAP  AND
                   CDFORNITMAP = C_ITMAPURPREC.CDFORNITMAP AND
                   NRCOLEITMAP = C_ITMAPURPREC.NRCOLEITMAP AND
                   DTENTRAPUT  = C_ITMAPURPREC.DTENTRAPUT  AND
                   CDFILIAP    = C_ITMAPURPREC.CDFILIAP    AND
                   CDPRODITMAP = C_ITMAPURPREC.CDPRODITMAP AND
                   CDMARCITMAP = C_ITMAPURPREC.CDMARCITMAP;
              END IF;
              IF V_QTRESTANTE = 0 THEN
                EXIT; /* Sai do Loop */
              END IF;
           ELSE
              UPDATE ITMAPURPREC /* Escolhendo primeiro registro - APURA_MELHOR_COTACAO */
              SET IDITMSELAPUR = 'S',
                  QTACOMP      = QTSOLACOMP,
                  IDMOTIVPRESC = C_ITMAPURPREC.IDMOTIVPRESC
              WHERE
                CDCENTITMAP = C_ITMAPURPREC.CDCENTITMAP AND
                NRSEQITMAP  = C_ITMAPURPREC.NRSEQITMAP  AND
                CDREGITMAP  = C_ITMAPURPREC.CDREGITMAP  AND
                CDFORNITMAP = C_ITMAPURPREC.CDFORNITMAP AND
                NRCOLEITMAP = C_ITMAPURPREC.NRCOLEITMAP AND
                DTENTRAPUT  = C_ITMAPURPREC.DTENTRAPUT  AND
                CDFILIAP    = C_ITMAPURPREC.CDFILIAP    AND
                CDPRODITMAP = C_ITMAPURPREC.CDPRODITMAP AND
                CDMARCITMAP = C_ITMAPURPREC.CDMARCITMAP;

              /* Comentado para Organizacoes Nutri(Alibraz) Solicitacao 0000183231
              V_CDMARCA_PADRAO := C_ITMAPURPREC.CDMARCITMAP;

              IF V_IDUTLMARPREFOL = 'S' THEN
                 FOR C_ITEMSOLI IN (SELECT NVL(CDMARCA, V_CDMARCA_PADRAO) CDMARCA
                                      FROM ITEMSOLI
                                     WHERE CDFILSOLI  = C_ITMAPURPREC.CDFILIAP
                                       AND CDPRODUTO  = C_ITMAPURPREC.CDPRODITMAP
                                       AND DTPROGENTR = C_ITMAPURPREC.DTENTRAPUT
                                       AND NVL(CDMARCA, V_CDMARCA_PADRAO) <>  V_CDMARCA_PADRAO)

                 LOOP

                    UPDATE ITMAPURPREC -- Escolhendo primeiro registro - APURA_MELHOR_COTACAO
                    SET IDITMSELAPUR = 'S',
                        QTACOMP      = QTSOLACOMP,
                        IDMOTIVPRESC = C_ITMAPURPREC.IDMOTIVPRESC
                    WHERE
                      CDCENTITMAP = C_ITMAPURPREC.CDCENTITMAP AND
                      NRSEQITMAP  = C_ITMAPURPREC.NRSEQITMAP  AND
                      CDREGITMAP  = C_ITMAPURPREC.CDREGITMAP  AND
                      CDFORNITMAP = C_ITMAPURPREC.CDFORNITMAP AND
                      NRCOLEITMAP = C_ITMAPURPREC.NRCOLEITMAP AND
                      DTENTRAPUT  = C_ITMAPURPREC.DTENTRAPUT  AND
                      CDFILIAP    = C_ITMAPURPREC.CDFILIAP    AND
                      CDPRODITMAP = C_ITMAPURPREC.CDPRODITMAP AND
                      CDMARCITMAP = C_ITEMSOLI.CDMARCA;

                 END LOOP;
              END IF; */
              EXIT; /* Sai do Loop */
           END IF;
         END LOOP;
     END LOOP;
  END IF;
END;
/