CREATE OR REPLACE PROCEDURE ALTERA_MIGRACAO_OL(P_CDFILIOPERLOG    IN VARCHAR2,   /*CDFILIOPELOG*/
                                               P_NRSEQRUPTURAOL   IN VARCHAR2,   /*NRSEQRUPTURAOL*/
                                               P_CDPRODINI        IN VARCHAR2,   /*Produto Inicial*/
                                               P_CDPRODFIN        IN VARCHAR2,   /*Produto Final*/
                                               P_MENS             IN VARCHAR2,   /*Msg: 'Análise da Ruptura do OL'*/
                                               P_CDPRODRUP        IN VARCHAR2,   /*Código do produto novo*/
                                               P_CDMARCARUP       IN VARCHAR2,   /*Código da marca nova*/
                                               P_ESTOQ_DISPO      IN FLOAT,      /*campo da query RUPTURA_OL.ESTOQ_DISPO*/
                                               P_ERROS            OUT VARCHAR2)
IS
   V_COUNT            NUMERIC := 0;
   V_CDFORNOPELOG     FILIAL.CDFORNOPELOG%TYPE;
   V_CDPRODPREF       PRODPREFMED.CDPRODPREF%TYPE;
   V_VRPRECUNIITM     ITEMCOLE.VRPRECUNIITM%TYPE;
   V_CDFILCENTCMP     FILIAL.CDFILCENTCMP%TYPE;
   V_VRPESOUNID       PRODUTO.VRPESOUNID%TYPE;
   V_VRPESOUNIDRUP    PRODUTO.VRPESOUNID%TYPE;
   V_VRFATOCONVRUP    PRODUTO.VRFATOCONV%TYPE;
   V_VRARREDCMPRUP    PRODUTO.VRARREDCMP%TYPE;
   V_CDPRODESTORUP    PRODUTO.CDPRODESTO%TYPE;
   V_T_QTNOVAPROGAF   ITEMAUTF.QTNOVAPROGAF%TYPE;
   V_QTNOVAPROGAF     ITEMAUTF.QTNOVAPROGAF%TYPE;
   V_AJUSTUNI         PRODUTO.VRPESOUNID%TYPE;
BEGIN
   SELECT MAX(CDFORNOPELOG), MAX(NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL))
     INTO V_CDFORNOPELOG, V_CDFILCENTCMP
     FROM FILIAL
    WHERE CDFILIAL = P_CDFILIOPERLOG;
   P_ERROS := '0000000000';
   FOR C_ITEM IN(SELECT *
                   FROM (SELECT I.DTPROGENTAF, I.CDPRODUTO, PRODUTO.CDARVPROD, PRODUTO.NMPRODUTO,
                                PRODUTO.SGUNIDADE, PRODUTO.VRFATOCONV, PRODUTO.CDPRODESTO,
                                I.CDFILDEST||' '||FILIAL.NMFILIAL CDFILIALDEST, I.CDFILDEST,
                                I.CDFILLANC, I.NRAUTOFORN, I.QTPROGENTAF, I.CDMARCA, MARCA.NMMARCA,
                                I.VRPREUNIAF, (I.QTPROGENTAF*I.VRPREUNIAF) AS TOTAL, I.IDTPGERARUP,
                                NVL(I.DTENTRITMSOL, I.DTPROGENTAF) DTENTRITMSOL,
                                NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL) CDFILCENTCMP,
                                A.CDOPERADOR, A.CDFORNECED, I.CDPRODRUP,
                                I.QTNOVAPROGAF, I.VRPREUNIRUP,
                                (SELECT MIN(NRPRIORIDADE) NRPRIORIDADE
                                   FROM PRIORIZAOLFILDEST
                                  WHERE PRIORIZAOLFILDEST.CDFILIOPELOG = A.CDFILIOPELOG
                                    AND PRIORIZAOLFILDEST.CDFILDEST    = A.CDFILDEST) NRPRIORIDADE
                           FROM ITEMAUTF I, AUTOFORNE A, PRODUTO , MARCA, FILIAL
                          WHERE I.CDFILDEST       = A.CDFILDEST
                            AND I.CDFILLANC      = A.CDFILLANC
                            AND I.NRAUTOFORN     = A.NRAUTOFORN
                            AND FILIAL.CDFILIAL  = I.CDFILDEST
                            AND I.CDPRODUTO      = PRODUTO.CDPRODUTO
                            AND I.CDMARCA        = MARCA.CDMARCA
                            AND I.NRSEQRUPTURAOL = P_NRSEQRUPTURAOL
                            AND A.CDFILIOPELOG   = P_CDFILIOPERLOG
                            AND I.IDITEMRUPTURA  = 'S'
                            AND I.QTATENDPEDOL   IS NULL
                            AND I.CDPRODRUP      = 'WWWWWWWWWW'
                            AND PRODUTO.CDARVPROD BETWEEN NVL(P_CDPRODINI, PRODUTO.CDARVPROD) AND RPAD(NVL(P_CDPRODFIN, PRODUTO.CDARVPROD), 20, 'Z'))
                  ORDER BY NRPRIORIDADE, QTPROGENTAF)
   LOOP
      SELECT NVL(MIN(ITEMCOLE.VRPRECUNIITM), 0)
        INTO V_VRPRECUNIITM
        FROM COLETAPR, ITEMCOLE, FILIAL
       WHERE FILIAL.CDFILIAL       = C_ITEM.CDFILDEST
         AND COLETAPR.CDFILIAL     = ITEMCOLE.CDFILIAL
         AND COLETAPR.NRCOLEPRECO  = ITEMCOLE.NRCOLEPRECO
         AND COLETAPR.CDFILIAL     = V_CDFILCENTCMP
         AND NVL(COLETAPR.IDSITUCOLETA, 'C') = 'C'
         AND ITEMCOLE.CDPRODUTO    = P_CDPRODRUP
         AND ITEMCOLE.CDMARCA      = P_CDMARCARUP
         AND ITEMCOLE.CDREGIAO     = FILIAL.CDREGIAO
         AND ITEMCOLE.CDFORNECED   = V_CDFORNOPELOG
         AND C_ITEM.DTPROGENTAF BETWEEN ITEMCOLE.DTINIVALITM AND ITEMCOLE.DTFINVALITM
         AND NVL(ITEMCOLE.VRPRECUNIITM, 0) > 0;
      IF V_VRPRECUNIITM = 0 THEN
         /*Item sem preço de cotação.*/
         P_ERROS := SUBSTR(P_ERROS, 1, 9)||'1'||SUBSTR(P_ERROS, 11);
         ROLLBACK;
         EXIT;
      ELSE
         P_ERROS := SUBSTR(P_ERROS, 1, 9)||'0'||SUBSTR(P_ERROS, 11);
      END IF;
      V_COUNT := V_COUNT+1;
      IF P_ERROS = '0000000000' THEN
         SELECT NVL(MAX(PRODUTO.VRARREDCMP), 1), NVL(MAX(PRODUTO.VRFATOCONV), 1),
                NVL(MAX(PRODESTORUP.VRPESOUNID), 1), NVL(MAX(PRODESTORUP.CDPRODESTO), 1)
           INTO V_VRARREDCMPRUP, V_VRFATOCONVRUP, V_VRPESOUNIDRUP, V_CDPRODESTORUP
           FROM PRODUTO, PRODUTO PRODESTORUP
          WHERE PRODUTO.CDPRODUTO  = P_CDPRODRUP
            AND PRODUTO.CDPRODESTO =  PRODESTORUP.CDPRODUTO;
         SELECT NVL(MAX(PRODUTO.VRPESOUNID), 1)
           INTO V_VRPESOUNID
           FROM PRODUTO
          WHERE PRODUTO.CDPRODUTO  = C_ITEM.CDPRODESTO;
         IF V_VRARREDCMPRUP = 0 THEN
            V_VRARREDCMPRUP := 1;
         END IF;
         V_QTNOVAPROGAF   := C_ITEM.QTNOVAPROGAF;
         V_AJUSTUNI       := (((C_ITEM.VRFATOCONV * V_VRPESOUNID)/(V_VRPESOUNIDRUP*V_VRPESOUNIDRUP)) - 1)* 100;
         IF ((V_CDPRODESTORUP <> C_ITEM.CDPRODESTO) AND (V_VRPESOUNIDRUP <> V_VRPESOUNID)) THEN
            V_QTNOVAPROGAF := (C_ITEM.QTNOVAPROGAF + ((V_AJUSTUNI / 100) * C_ITEM.QTNOVAPROGAF));
            IF (V_VRARREDCMPRUP > 1) AND (MOD(V_QTNOVAPROGAF, V_VRARREDCMPRUP) <> 0) THEN
               V_QTNOVAPROGAF   := CEIL(V_QTNOVAPROGAF / V_VRARREDCMPRUP) * V_VRARREDCMPRUP;
            ELSE
               V_QTNOVAPROGAF   := ROUND(V_QTNOVAPROGAF, 3);
            END IF;
            V_T_QTNOVAPROGAF    := V_T_QTNOVAPROGAF + V_QTNOVAPROGAF;
            IF P_ESTOQ_DISPO    >= V_T_QTNOVAPROGAF THEN
               P_ERROS          := SUBSTR(P_ERROS, 1, 10)||'0'||SUBSTR(P_ERROS, 12);
            ELSE
               ROLLBACK;
               /*Operação bloqueada porque pode gerar insuficiência de V_T_QTNOVAPROGAF unidade do item em estoque.*/
               V_T_QTNOVAPROGAF := ABS(P_ESTOQ_DISPO-V_T_QTNOVAPROGAF);
               P_ERROS          := SUBSTR(P_ERROS, 1, 10)||'1'||SUBSTR(P_ERROS, 12)||'_'||V_T_QTNOVAPROGAF;
            END IF;
         ELSE
            V_T_QTNOVAPROGAF    := V_T_QTNOVAPROGAF + V_QTNOVAPROGAF;
            IF P_ESTOQ_DISPO    >= V_T_QTNOVAPROGAF THEN
               P_ERROS          := SUBSTR(P_ERROS, 1, 10)||'0'||SUBSTR(P_ERROS, 12);
            ELSE
               ROLLBACK;
               /*Operação bloqueada porque pode gerar insuficiência de V_T_QTNOVAPROGAF unidade do item em estoque.*/
               V_T_QTNOVAPROGAF := ABS(P_ESTOQ_DISPO-V_T_QTNOVAPROGAF);
               P_ERROS          := SUBSTR(P_ERROS, 1, 10)||'1'||SUBSTR(P_ERROS, 12)||'_'||V_T_QTNOVAPROGAF;
            END IF;
         END IF;
         IF P_ERROS = '0000000000' THEN
            UPDATE ITEMAUTF
               SET QTNOVAPROGAF = V_QTNOVAPROGAF,
                   DSJUSTITMAF  = P_MENS,
                   CDPRODRUP    = P_CDPRODRUP,
                   CDMARCARUP   = P_CDMARCARUP,
                   VRPREUNIRUP  = V_VRPRECUNIITM,
                   IDTIPOLANITM = 'M',
                   IDTPGERARUP  = 'A'
             WHERE CDFILDEST    = C_ITEM.CDFILDEST
               AND CDFILLANC    = C_ITEM.CDFILLANC
               AND NRAUTOFORN   = C_ITEM.NRAUTOFORN
               AND CDMARCA      = C_ITEM.CDMARCA
               AND CDPRODUTO    = C_ITEM.CDPRODUTO
               AND DTPROGENTAF  = C_ITEM.DTPROGENTAF;
         END IF;
      END IF;
  END LOOP;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('ALTERA_MIGRACAO_OL','6.45.XXX'); END;
/