CREATE OR REPLACE PROCEDURE CONCLUI_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,   /*Mensagem de Migracao de Ruptura*/
                                                P_CDOPERADOR       IN VARCHAR2,   /*Codigo do Operador Locado no sistema*/
                                                P_ERROS            OUT VARCHAR2)
IS
   V_CONTADOR        FLOAT          := 0;
   V_CONTAREGISTRO   FLOAT          := 0;
   V_ERROS           VARCHAR2(2000);
   V_NRSOLICMP       ITEMSOLI.NRSOLICMP%TYPE;
   V_CDPRODUTO       PRODUTO.CDPRODUTO%TYPE;
   V_VRFATOCONV      PRODUTO.VRFATOCONV%TYPE;
   V_VRFATOCONVRUP   PRODUTO.VRFATOCONV%TYPE;
   V_QTSOLIPROD      FLOAT;
   V_QTSOLIPRODRUP   FLOAT;
   V_CDPRODESTORUP   PRODUTO.CDPRODESTO%TYPE;
   V_CDMARCARUP      ITEMAUTF.CDMARCARUP%TYPE;
   V_CHAVEFILDEST    ITEMAUTF.CDFILDEST%TYPE := '_';
   V_CODIGO          VARCHAR2(20);
BEGIN
   P_ERROS := 'N';
   IF ((P_CDPRODINI IS NULL) OR (P_CDPRODFIN IS NULL)) THEN
      FOR C_ITEM IN(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.CDMARCARUP,
                           I.QTNOVAPROGAF, I.VRPREUNIRUP
                      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
                     ORDER BY I.CDFILDEST, I.IDTPGERARUP)
      LOOP
         IF C_ITEM.IDTPGERARUP = 'A' THEN
            /*Identifica a solicitacao do item original*/
            SELECT NVL(MAX(ITEMSOLI.NRSOLICMP), 'W')
              INTO V_NRSOLICMP
              FROM ITEMSOLI, PRODUTO, SOLICITA
             WHERE SOLICITA.CDFILSOLI            = ITEMSOLI.CDFILSOLI
               AND SOLICITA.CDFILLANCA           = ITEMSOLI.CDFILLAN
               AND SOLICITA.NRSOLICMP            = ITEMSOLI.NRSOLICMP
               AND NVL(SOLICITA.IDSOLEXTRA, 'N') = 'N'
               AND ITEMSOLI.CDPRODUTO            = PRODUTO.CDPRODUTO
               AND ITEMSOLI.CDFILSOLI            = C_ITEM.CDFILDEST
               AND ITEMSOLI.CDFILLAN             = C_ITEM.CDFILLANC
               AND ITEMSOLI.DTPROGENTR           = C_ITEM.DTENTRITMSOL
               AND PRODUTO.CDPRODESTO            = C_ITEM.CDPRODESTO;
            IF V_NRSOLICMP = 'W' THEN
               /*Identifica a solicitacao do item original*/
               SELECT NVL(MAX(ITEMSOLI.NRSOLICMP), 'W')
                 INTO V_NRSOLICMP
                 FROM ITEMSOLI, PRODUTO, SOLICITA
                WHERE SOLICITA.CDFILSOLI            = ITEMSOLI.CDFILSOLI
                  AND SOLICITA.CDFILLANCA           = ITEMSOLI.CDFILLAN
                  AND SOLICITA.NRSOLICMP            = ITEMSOLI.NRSOLICMP
                  AND NVL(SOLICITA.IDSOLEXTRA, 'N') = 'N'
                  AND ITEMSOLI.CDPRODUTO            = PRODUTO.CDPRODUTO
                  AND ITEMSOLI.CDFILSOLI            = C_ITEM.CDFILDEST
                  AND ITEMSOLI.CDFILLAN             = C_ITEM.CDFILLANC;
            END IF;
            /*Verifica se existe solicitacao para o novo item*/

            SELECT NVL(MAX(VRFATOCONV), 1), MAX(CDPRODESTO)
              INTO V_VRFATOCONVRUP, V_CDPRODESTORUP
              FROM PRODUTO
             WHERE CDPRODUTO = C_ITEM.CDPRODRUP;

            SELECT NVL(MAX(ITEMSOLI.CDPRODUTO), 'W'),  NVL(MAX(ITEMSOLI.QTSOLIPROD), 0)
              INTO V_CDPRODUTO, V_QTSOLIPROD
              FROM ITEMSOLI, SOLICITA
             WHERE SOLICITA.CDFILSOLI            = ITEMSOLI.CDFILSOLI
               AND SOLICITA.CDFILLANCA           = ITEMSOLI.CDFILLAN
               AND SOLICITA.NRSOLICMP            = ITEMSOLI.NRSOLICMP
               AND NVL(SOLICITA.IDSOLEXTRA, 'N') = 'N'
               AND ITEMSOLI.CDFILSOLI            = C_ITEM.CDFILDEST
               AND ITEMSOLI.CDFILLAN             = C_ITEM.CDFILLANC
               AND ITEMSOLI.NRSOLICMP            = V_NRSOLICMP
               AND ITEMSOLI.CDPRODUTO            = V_CDPRODESTORUP
               AND ITEMSOLI.DTPROGENTR           = C_ITEM.DTENTRITMSOL;

            V_QTSOLIPRODRUP := V_VRFATOCONVRUP*V_QTSOLIPRODRUP;

            IF V_CDPRODUTO = 'W' THEN
               /*INSERT
                 INTO ITEMSOLI(CDFILSOLI, CDFILLAN, NRSOLICMP, CDPRODUTO, DTPROGENTR, QTSOLIPROD)
               VALUES (C_ITEM.CDFILDEST, C_ITEM.CDFILLANC, V_NRSOLICMP, V_CDPRODESTORUP, C_ITEM.DTENTRITMSOL, V_QTSOLIPRODRUP);  */

               INSERT
                 INTO ITEMSOLI (CDFILSOLI, CDFILLAN, NRSOLICMP, CDPRODUTO, DTPROGENTR,
                                QTSOLIPROD, DTUTILIZA, IDITMCONS, TXOBSITMSOL, IDBAIXITMSOL,
                                QTTRANSFSOL, NRLOTEESTQ, NRSUBLOTE, CDPRODPROD, CDFILLANCONS,
                                CDFILSOLCONS, NRSOLCMPCONS, CDPRODUTCONS, DTPROGENCONS, CDMARCA, CDRASTRITM)
               SELECT CDFILSOLI, CDFILLAN, NRSOLICMP, V_CDPRODESTORUP, DTPROGENTR,
                      V_QTSOLIPRODRUP, DTUTILIZA, IDITMCONS, TXOBSITMSOL, IDBAIXITMSOL,
                      QTTRANSFSOL, NRLOTEESTQ, NRSUBLOTE, CDPRODPROD, CDFILLANCONS,
                      CDFILSOLCONS, NRSOLCMPCONS, CDPRODUTCONS, DTPROGENCONS, CDMARCA, CDRASTRITM
                 FROM ITEMSOLI
                WHERE CDFILSOLI  = C_ITEM.CDFILDEST
                  AND CDFILLAN   = C_ITEM.CDFILLANC
                  AND NRSOLICMP  = V_NRSOLICMP
                  AND CDPRODUTO  = C_ITEM.CDPRODESTO
                  AND DTPROGENTR = V_CDPRODESTORUP;

            ELSE
               UPDATE ITEMSOLI
                  SET QTSOLIPROD            = QTSOLIPROD + V_QTSOLIPRODRUP
                WHERE ITEMSOLI.CDFILSOLI    = C_ITEM.CDFILDEST
                  AND ITEMSOLI.CDFILLAN     = C_ITEM.CDFILLANC
                  AND ITEMSOLI.NRSOLICMP    = V_NRSOLICMP
                  AND ITEMSOLI.CDPRODUTO    = V_CDPRODESTORUP
                  AND ITEMSOLI.DTPROGENTR   = C_ITEM.DTENTRITMSOL;
            END IF;
            INSERT
              INTO MOVOPSOL (CDFILSOLMOV, CDFILLANMOV, NRSOLIMOV, CDPRODUTO, DTENTROPER,
                             DTOPERSOL, CDOPERADOR, QTANTOPER, QTDEPOPER, DSJUSTOPER)
            VALUES (C_ITEM.CDFILDEST, C_ITEM.CDFILLANC, V_NRSOLICMP, V_CDPRODESTORUP, C_ITEM.DTENTRITMSOL,
                    SYSDATE, P_CDOPERADOR, V_QTSOLIPROD, V_QTSOLIPROD+V_QTSOLIPRODRUP, P_MENS);

            IF V_CDPRODESTORUP <> C_ITEM.CDPRODESTO THEN
               UPDATE ITEMSOLI
                  SET ITEMSOLI.CDFILIOPELOG   = P_CDFILIOPERLOG
                WHERE ITEMSOLI.CDFILSOLI      = C_ITEM.CDFILDEST
                  AND ITEMSOLI.CDFILLAN       = C_ITEM.CDFILLANC
                  AND ITEMSOLI.DTPROGENTR     = C_ITEM.DTENTRITMSOL
                  AND ITEMSOLI.CDPRODUTO      IN (SELECT PRODUTO.CDPRODUTO FROM PRODUTO WHERE PRODUTO.CDPRODESTO = C_ITEM.CDPRODESTO);
            END IF;

            /*FOR C_DELTETA_ITEMSOLI IN (SELECT ITEMSOLI.CDFILSOLI, ITEMSOLI.CDFILLAN, ITEMSOLI.NRSOLICMP,
                                              ITEMSOLI.CDPRODUTO, ITEMSOLI.DTPROGENTR,
                                              ITEMSOLI.QTSOLIPROD
                                         FROM ITEMSOLI, PRODUTO PRODSOLI, PRODUTO, SOLICITA
                                        WHERE ITEMSOLI.CDPRODUTO   = PRODSOLI.CDPRODUTO
                                          AND ITEMSOLI.CDFILSOLI   = SOLICITA.CDFILSOLI
                                          AND ITEMSOLI.CDFILLAN    = SOLICITA.CDFILLANCA
                                          AND ITEMSOLI.NRSOLICMP   = SOLICITA.NRSOLICMP
                                          AND NVL(SOLICITA.IDSOLEXTRA, 'N') =  'N'
                                          AND ITEMSOLI.CDFILSOLI   = C_ITEM.CDFILDEST
                                          AND ITEMSOLI.CDFILLAN    = C_ITEM.CDFILLANC
                                          AND PRODUTO.CDPRODUTO    = C_ITEM.CDPRODUTO
                                          AND ITEMSOLI.DTPROGENTR  = C_ITEM.DTENTRITMSOL
                                          AND PRODSOLI.CDPRODESTO  = PRODUTO.CDPRODESTO) LOOP

               DELETE
                 FROM ITEMSOLI
                WHERE ITEMSOLI.CDFILSOLI    = C_DELTETA_ITEMSOLI.CDFILSOLI
                  AND ITEMSOLI.CDFILLAN     = C_DELTETA_ITEMSOLI.CDFILLAN
                  AND ITEMSOLI.NRSOLICMP    = C_DELTETA_ITEMSOLI.NRSOLICMP
                  AND ITEMSOLI.CDPRODUTO    = C_DELTETA_ITEMSOLI.CDPRODUTO
                  AND ITEMSOLI.DTPROGENTR   = C_DELTETA_ITEMSOLI.DTPROGENTR;
               INSERT
                 INTO MOVOPSOL (CDFILSOLMOV, CDFILLANMOV, NRSOLIMOV, CDPRODUTO, DTENTROPER,
                                DTOPERSOL, CDOPERADOR, QTANTOPER, QTDEPOPER, DSJUSTOPER)
               VALUES (C_DELTETA_ITEMSOLI.CDFILSOLI, C_DELTETA_ITEMSOLI.CDFILLAN, C_DELTETA_ITEMSOLI.NRSOLICMP,
                       C_DELTETA_ITEMSOLI.CDPRODUTO, C_DELTETA_ITEMSOLI.DTPROGENTR,
                       SYSDATE, P_CDOPERADOR, C_DELTETA_ITEMSOLI.QTSOLIPROD, 0, P_MENS);
            END LOOP;*/

            /*REALIZAR TROCA DO ITEM MIGRADO*/
            SELECT NVL(MAX(CDMARCA), 'W')
              INTO V_CDMARCARUP
              FROM ITEMAUTF
             WHERE CDFILDEST   = C_ITEM.CDFILDEST
               AND CDFILLANC   = C_ITEM.CDFILLANC
               AND NRAUTOFORN  = C_ITEM.NRAUTOFORN
               AND CDPRODUTO   = C_ITEM.CDPRODRUP
               AND CDMARCA     = C_ITEM.CDMARCARUP
               AND DTPROGENTAF = C_ITEM.DTPROGENTAF;
            IF V_CDMARCARUP = 'W' THEN
               INSERT
                 INTO ITEMAUTF(CDFILDEST, CDFILLANC, NRAUTOFORN, CDMARCA, CDPRODUTO, DTPROGENTAF,
                               CDSEGMARCA, NRPARCITMAF, QTPROGENTAF, VRPREUNIAF, VRPERDESAF,
                               VRDESCITMAF, TXOBSITMAF, DTENTRITMSOL, NRSEQRUPTURAOL, CDRASTRITM)
               SELECT CDFILDEST, CDFILLANC, NRAUTOFORN, C_ITEM.CDMARCARUP, C_ITEM.CDPRODRUP, DTPROGENTAF,
                      CDSEGMARCA, '00', C_ITEM.QTNOVAPROGAF, C_ITEM.VRPREUNIRUP, VRPERDESAF,
                      VRDESCITMAF, TXOBSITMAF, DTENTRITMSOL, NRSEQRUPTURAOL, CDRASTRITM
                 FROM ITEMAUTF
                WHERE CDFILDEST   = C_ITEM.CDFILDEST
                  AND CDFILLANC   = C_ITEM.CDFILLANC
                  AND NRAUTOFORN  = C_ITEM.NRAUTOFORN
                  AND CDPRODUTO   = C_ITEM.CDPRODUTO
                  AND CDMARCA     = C_ITEM.CDMARCA
                  AND DTPROGENTAF = C_ITEM.DTPROGENTAF;
            ELSE
               UPDATE ITEMAUTF
                  SET QTPROGENTAF = QTPROGENTAF+C_ITEM.QTNOVAPROGAF
                WHERE CDFILDEST   = C_ITEM.CDFILDEST
                  AND CDFILLANC   = C_ITEM.CDFILLANC
                  AND NRAUTOFORN  = C_ITEM.NRAUTOFORN
                  AND CDPRODUTO   = C_ITEM.CDPRODRUP
                  AND CDMARCA     = C_ITEM.CDMARCARUP
                  AND DTPROGENTAF = C_ITEM.DTPROGENTAF;
            END IF;
            DELETE
              FROM ITEMAUTF
             WHERE CDFILDEST   = C_ITEM.CDFILDEST
               AND CDFILLANC   = C_ITEM.CDFILLANC
               AND NRAUTOFORN  = C_ITEM.NRAUTOFORN
               AND CDPRODUTO   = C_ITEM.CDPRODUTO
               AND CDMARCA     = C_ITEM.CDMARCA
               AND DTPROGENTAF = C_ITEM.DTPROGENTAF;
         ELSIF C_ITEM.IDTPGERARUP = 'S' THEN
            IF V_CHAVEFILDEST <> C_ITEM.CDFILDEST THEN
               V_CHAVEFILDEST := C_ITEM.CDFILDEST;
               NOVO_CODIGO_NT('SOLICOMP'||C_ITEM.CDFILDEST||C_ITEM.CDFILLANC, V_CODIGO);
               INSERT
                 INTO SOLICITA (CDFILLANCA, CDFILSOLI, NRSOLICMP, DTSOLCMP, IDTIPLAN,
                                CDFILCENT, CDOPERLANC, IDSOLEXTRA)
               VALUES (C_ITEM.CDFILLANC, C_ITEM.CDFILDEST, SUBSTR(V_CODIGO, 1, 10), TO_DATE(TRUNC(SYSDATE)), 'M',
                       C_ITEM.CDFILCENTCMP, P_CDOPERADOR, 'S');
               INSERT
                 INTO MOVSOLEXT (CDFILSOLEXT, CDFILLANCEXT, NRSOLIMOVEXT,
                                 DTMOVSOLEXT, CDOPERADOR, DSJUSTSOLEXT)
               VALUES (C_ITEM.CDFILDEST, C_ITEM.CDFILLANC, SUBSTR(V_CODIGO, 1, 10),
                       TO_DATE(TRUNC(SYSDATE)), P_CDOPERADOR, P_MENS);
            END IF;
            SELECT NVL(MAX(VRFATOCONV), 1), MAX(CDPRODESTO)
              INTO V_VRFATOCONVRUP, V_CDPRODESTORUP
              FROM PRODUTO
             WHERE CDPRODUTO = C_ITEM.CDPRODRUP;
            V_QTSOLIPRODRUP := V_VRFATOCONVRUP*C_ITEM.QTPROGENTAF;
            UPDATE ITEMSOLI
               SET QTSOLIPROD            = QTSOLIPROD + V_QTSOLIPRODRUP
             WHERE ITEMSOLI.CDFILSOLI    = C_ITEM.CDFILDEST
               AND ITEMSOLI.CDFILLAN     = C_ITEM.CDFILLANC
               AND ITEMSOLI.NRSOLICMP    = SUBSTR(V_CODIGO, 1, 10)
               AND ITEMSOLI.CDPRODUTO    = V_CDPRODESTORUP
               AND ITEMSOLI.DTPROGENTR   = C_ITEM.DTENTRITMSOL
               AND ITEMSOLI.IDITMSOLEXTRA = 'S';
            IF SQL%NOTFOUND THEN
               INSERT
                 INTO ITEMSOLI(CDFILSOLI, CDFILLAN, NRSOLICMP,
                               CDPRODUTO, DTPROGENTR, QTSOLIPROD, IDITMSOLEXTRA)
               VALUES (C_ITEM.CDFILDEST, C_ITEM.CDFILLANC, SUBSTR(V_CODIGO, 1, 10),
                       V_CDPRODESTORUP, C_ITEM.DTENTRITMSOL, V_QTSOLIPRODRUP, 'S');
            END IF;
         ELSIF C_ITEM.IDTPGERARUP = 'T' THEN
            UPDATE ITEMAUTF
               SET IDTPGERARUP   = 'T',
                   QTATENDPEDOL  = 0,
                   IDITMSEPARADO = 'N'
             WHERE CDFILDEST     = C_ITEM.CDFILDEST
               AND CDFILLANC     = C_ITEM.CDFILLANC
               AND NRAUTOFORN    = C_ITEM.NRAUTOFORN
               AND CDPRODUTO     = C_ITEM.CDPRODUTO
               AND CDMARCA       = C_ITEM.CDMARCA
               AND DTPROGENTAF   = C_ITEM.DTPROGENTAF;
         ELSIF C_ITEM.IDTPGERARUP = 'P' THEN
            UPDATE ITEMAUTF
               SET IDTPGERARUP    = 'P',
                   QTATENDPEDOL   = 0,
                   IDITMSEPARADO  = 'N',
                   IDBAIXITMAF    = '3',
                   QTPROGENTAF    = 0,
                   QTNOVAPROGAF   = C_ITEM.QTPROGENTAF
             WHERE CDFILDEST      = C_ITEM.CDFILDEST
               AND CDFILLANC      = C_ITEM.CDFILLANC
               AND NRAUTOFORN     = C_ITEM.NRAUTOFORN
               AND CDPRODUTO      = C_ITEM.CDPRODUTO
               AND CDMARCA        = C_ITEM.CDMARCA
               AND DTPROGENTAF    = C_ITEM.DTPROGENTAF;
            UPDATE ITEMSOLI
               SET IDITEMRUPTURA   = 'P'
             WHERE ITEMSOLI.CDFILSOLI      = C_ITEM.CDFILDEST
               AND ITEMSOLI.DTPROGENTR     = C_ITEM.DTENTRITMSOL
               AND ITEMSOLI.CDPRODUTO      IN (SELECT PRODUTO.CDPRODUTO FROM PRODUTO WHERE PRODUTO.CDPRODESTO = C_ITEM.CDPRODESTO);
         ELSE
            ROLLBACK;
            P_ERROS := 'ERRO_CONCLUSAO';
            EXIT;
         END IF;
      END LOOP;
      UPDATE RUPTURAOL
         SET IDSITUACAO     = 'C'
       WHERE CDFILIAL       = P_CDFILIOPERLOG
         AND NRSEQRUPTURAOL = P_NRSEQRUPTURAOL;
      COMMIT;
      FOR C_AUTOFORNE IN(SELECT DISTINCT I.CDFILDEST, I.CDFILLANC, I.NRAUTOFORN
                      FROM ITEMAUTF I, AUTOFORNE A
                     WHERE I.CDFILDEST      = A.CDFILDEST
                       AND I.CDFILLANC      = A.CDFILLANC
                       AND I.NRAUTOFORN     = A.NRAUTOFORN
                       AND I.NRSEQRUPTURAOL = P_NRSEQRUPTURAOL
                       AND A.CDFILIOPELOG   = P_CDFILIOPERLOG
                       AND I.IDITEMRUPTURA  = 'S'
                       AND I.IDTPGERARUP    = 'A'
                       AND I.QTATENDPEDOL   IS NULL)
      LOOP
        FECHAMENTO_AF(C_AUTOFORNE.CDFILDEST, C_AUTOFORNE.CDFILLANC, C_AUTOFORNE.NRAUTOFORN);
        COMMIT;
      END LOOP;
   ELSE
      P_ERROS := 'ERRO_PRODUTO';
   END IF;
END;
/