CREATE OR REPLACE
PROCEDURE GERA_SOLICITA_OL
  (P_CDFILIOPELOG IN FILIAL.CDFILIAL%TYPE,
   P_NRSEQUCONSOL IN TRABNECECOMP.NRNECECOMP%TYPE,
   P_CDFILLANC    IN FILIAL.CDFILIAL%TYPE,
   P_CDOPERLANC   IN OPERADOR.CDOPERADOR%TYPE,
   P_ROWSAFFECT   OUT VARCHAR2)
IS
   V_PRXSOLICMP   VARCHAR2(20);
   V_CDFILCENT    VARCHAR2(4);
   V_QTDEITEMSOLI    FLOAT;
   V_MARCA      VARCHAR2(15);
   V_IDUTAPROVSOL CHAR(1);
   V_IDSOLIAPROV  CHAR(1);
   V_IDPERALTSAPR CHAR(1);
   W_A            CHAR(1) := 'A';
   W_S            CHAR(1) := 'S';
   W_N            CHAR(1) := 'N';
   W_C            CHAR(1) := 'C';
   W_ZERO         INT     := 0;
   W_UM           INT     := 1;
   W_ONZE         INT     := 11;
   W_DEZ          INT     := 10;
   W_TRES         INT     := 3;
   V_IDUTLMARPREFOL     PARASUPRI.IDUTLMARPREFOL%TYPE;
   V_NRSOLICMP    VARCHAR2(20);
   V_DTPROCESS    DATE;
   V_CDMARCA      VARCHAR2(5) := NULL;
   V_CDMARCA_PADRAO  VARCHAR2(5);
   V_CONTADOR     INT     := 0;
   V_CONTADORITEM INT     := 0;
   V_SOLICITACAO  VARCHAR2(2000);
   V_SOLICITACAO1  VARCHAR2(2000);
BEGIN
   V_IDUTAPROVSOL := '';
   V_PRXSOLICMP   := '';
   V_CDFILCENT    := '';
   V_IDSOLIAPROV  := '';
   V_IDPERALTSAPR := '';
   SELECT
      MAX(CDMARCA)
   INTO
      V_CDMARCA_PADRAO
   FROM
      FILIAL, PARASUPRI
   WHERE PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL)
     AND FILIAL.CDFILIAL    = P_CDFILIOPELOG;
   SELECT
      MAX(IDUTAPROVSOL),
      MAX(SUBSTR(NVL(IDPERALTSAPR, W_N||W_N||W_N), W_TRES, W_UM))
   INTO
      V_IDUTAPROVSOL,
      V_IDPERALTSAPR
   FROM
      PARCMPSUP
   WHERE
      CDFILIAL = P_CDFILIOPELOG;
   SELECT
      DECODE(NVL(MAX(P.IDUTILDTPROC), W_N), W_S, NVL(MAX(PF.DTPROCESSA), TRUNC(SYSDATE)), TRUNC(SYSDATE)) DTPROCESS
   INTO
      V_DTPROCESS
   FROM
      PARAMFILIAL PF, PARAMGERAL P
   WHERE PF.CDFILIAL = P_CDFILIOPELOG;
   IF V_IDUTAPROVSOL = W_S THEN
      IF V_IDPERALTSAPR = W_S THEN
         V_IDSOLIAPROV := W_S;
      ELSE
         V_IDSOLIAPROV := W_N;
      END IF;
   ELSE
      V_IDSOLIAPROV := W_S;
   END IF;
   SELECT
      MAX(NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL))
   INTO
      V_CDFILCENT
   FROM
      FILIAL
   WHERE
      FILIAL.CDFILIAL = P_CDFILIOPELOG;
   V_MARCA  := '_';
   V_CONTADOR := 0;
   FOR C_ITEM IN
      (SELECT DISTINCT
          NVL(ITEMCONSSOLOL.QTDACOMPRAR, ITEMCONSSOLOL.QTENTRCONSOL) QTENTRCONSOL,
          ITEMCONSSOLOL.QTDACOMPRAR,
          CASE PRODCONSSOLOL.CDPRODUTO
            WHEN RELACPRODOL.CDPRODARVOL
            THEN RELACPRODOL.CDPRARVORIG
            ELSE PRODCONSSOLOL.CDPRODUTO
          END CDPRODUTO,
          PRODCONSSOLOL.QTESTUTILCONSOL,
          ITEMCONSSOLOL.DTENTRCONSOL,
          CASE NVL(PRODUTO.VRARREDCMP,0)
             WHEN 0
             THEN 1
             ELSE NVL(PRODUTO.VRARREDCMP,0)
          END VRARREDCMP,
          CASE PRODCONSSOLOL.CDPRODUTO
             WHEN RELACPRODOL.CDPRODARVOL
             THEN RELACPRODOL.CDMARCA
             ELSE V_CDMARCA_PADRAO
          END CDMARCA
       FROM
          PRODCONSSOLOL,
          ITEMCONSSOLOL,
          PRODUTO,
          (SELECT SUM(I.QTSOLIPROD) QTDE, I.CDFILSOLI, I.CDPRODUTO, I.DTPROGENTR, I.CDMARCA
           FROM ITEMSOLI I, CONSSOLOL
           WHERE I.CDFILSOLI   = P_CDFILIOPELOG
             AND I.DTPROGENTR >= (V_DTPROCESS - 90)
             AND I.NRSEQUCONSOL = CONSSOLOL.NRSEQUCONSOL
             AND NVL(CONSSOLOL.IDCONSPREVCONOL, 'N')  = 'S'
           GROUP BY I.CDFILSOLI, I.CDPRODUTO, I.DTPROGENTR, I.CDMARCA) JASOLICITA, RELACPRODOL
       WHERE PRODCONSSOLOL.NRSEQUCONSOL    = P_NRSEQUCONSOL
         AND PRODCONSSOLOL.CDPRODUTO       = PRODUTO.CDPRODUTO
         AND PRODCONSSOLOL.NRSEQUCONSOL    = ITEMCONSSOLOL.NRSEQUCONSOL
         AND PRODCONSSOLOL.CDFILSOLI       = ITEMCONSSOLOL.CDFILSOLI
         AND PRODCONSSOLOL.CDFILLAN        = ITEMCONSSOLOL.CDFILLAN
         AND PRODCONSSOLOL.CDPRODUTO       = ITEMCONSSOLOL.CDPRODUTO
         AND NVL(ITEMCONSSOLOL.IDENTREGAVIAOL, W_S) = W_S
         --AND NVL(PRODCONSSOLOL.QTESTUTILCONSOL, W_ZERO) > W_ZERO
         AND NVL(ITEMCONSSOLOL.QTDACOMPRAR, ITEMCONSSOLOL.QTENTRCONSOL) > 0
         AND JASOLICITA.CDFILSOLI(+)       = ITEMCONSSOLOL.CDFILSOLI
         AND JASOLICITA.CDPRODUTO(+)       = ITEMCONSSOLOL.CDPRODUTO
         AND JASOLICITA.DTPROGENTR(+)      = ITEMCONSSOLOL.DTENTRCONSOL
         AND (ITEMCONSSOLOL.QTENTRCONSOL   - NVL(JASOLICITA.QTDE, 0)) > 0
         AND PRODCONSSOLOL.CDPRODUTO       = CASE PRODCONSSOLOL.CDPRODUTO
                                                WHEN RELACPRODOL.CDPRODARVOL
                                                THEN PRODCONSSOLOL.CDPRODUTO
                                                ELSE RELACPRODOL.CDPRARVORIG
                                             END
         AND RELACPRODOL.CDMARCA           = CASE PRODCONSSOLOL.CDPRODUTO
                                               WHEN RELACPRODOL.CDPRODARVOL
                                               THEN RELACPRODOL.CDMARCA
                                               ELSE NVL(V_CDMARCA_PADRAO, RELACPRODOL.CDMARCA)
                                             END
       ORDER BY
          CDMARCA,
          CDPRODUTO,
          ITEMCONSSOLOL.DTENTRCONSOL
       )
   LOOP
      IF NVL(V_MARCA, 'W') <> NVL(C_ITEM.CDMARCA, 'W') THEN
         V_MARCA := C_ITEM.CDMARCA;
         NOVO_CODIGO_NT('SOLICOMP'||P_CDFILIOPELOG||P_CDFILLANC, V_NRSOLICMP);
         V_NRSOLICMP := SUBSTR(V_NRSOLICMP,W_ONZE,W_DEZ);
         V_SOLICITACAO := V_SOLICITACAO||', '||V_NRSOLICMP;
         INSERT
           INTO SOLICITA(CDFILSOLI, CDFILLANCA, NRSOLICMP,
                         DTSOLCMP, IDTIPLAN, CDFILCENT,  CDOPERLANC)
         VALUES (P_CDFILIOPELOG, P_CDFILLANC, V_NRSOLICMP,
                 TO_DATE(TRUNC(SYSDATE)), W_A, V_CDFILCENT, P_CDOPERLANC);
      END IF;
      V_QTDEITEMSOLI    := C_ITEM.QTENTRCONSOL;
      IF V_QTDEITEMSOLI > 0 THEN
         IF (MOD(V_QTDEITEMSOLI, C_ITEM.VRARREDCMP) <> W_ZERO) AND C_ITEM.VRARREDCMP > W_ZERO THEN
            V_QTDEITEMSOLI := CEIL(V_QTDEITEMSOLI / C_ITEM.VRARREDCMP) * C_ITEM.VRARREDCMP;
         END IF;
         V_CONTADORITEM := V_CONTADORITEM +1;
         BEGIN
            INSERT
              INTO ITEMSOLI (CDFILSOLI, CDFILLAN, NRSOLICMP, CDPRODUTO,
                   DTPROGENTR, QTSOLIPROD, IDSOLIAPROV, NRSEQUCONSOL, CDMARCA)
            VALUES (P_CDFILIOPELOG, P_CDFILLANC, V_NRSOLICMP, C_ITEM.CDPRODUTO,
                    C_ITEM.DTENTRCONSOL, V_QTDEITEMSOLI, V_IDSOLIAPROV, P_NRSEQUCONSOL,
                    CASE NVL(C_ITEM.CDMARCA, 'W')
                       WHEN NVL(V_CDMARCA_PADRAO, 'W')
                       THEN NULL
                       ELSE C_ITEM.CDMARCA
                    END);
         EXCEPTION
            WHEN OTHERS THEN BEGIN
               UPDATE ITEMSOLI
                  SET QTSOLIPROD = QTSOLIPROD+V_QTDEITEMSOLI
                WHERE CDFILSOLI  = P_CDFILIOPELOG
                  AND CDFILLAN   = P_CDFILLANC
                  AND NRSOLICMP  = V_NRSOLICMP
                  AND CDPRODUTO  = C_ITEM.CDPRODUTO
                  AND DTPROGENTR = C_ITEM.DTENTRCONSOL;
            END;
         END;
         IF NVL(C_ITEM.QTDACOMPRAR, 0) > 0 THEN
            INSERT INTO MOVOPSOL
               (CDFILSOLMOV, CDFILLANMOV, NRSOLIMOV, CDPRODUTO, DTENTROPER, DTOPERSOL,
                CDOPERADOR,  DSJUSTOPER,  QTANTOPER, QTDEPOPER, IDOPERAMOVS)
            SELECT P_CDFILIOPELOG, P_CDFILLANC, NVL(V_NRSOLICMP, V_NRSOLICMP), C_ITEM.CDPRODUTO, C_ITEM.DTENTRCONSOL,
                   DTJUSTCONSOL, CDOPERADOR, DSJUSTCONSOL, C_ITEM.QTENTRCONSOL,  V_QTDEITEMSOLI, W_A
            FROM
               JUSTCONSSOLOL
            WHERE NRSEQUCONSOL = P_NRSEQUCONSOL
              AND DTENTJUSTCON IS NULL
              AND CDPRODUTO    = C_ITEM.CDPRODUTO
              AND DTJUSTCONSOL = (SELECT MAX(J.DTJUSTCONSOL)
                                  FROM JUSTCONSSOLOL J
                                  WHERE J.NRSEQUCONSOL = P_NRSEQUCONSOL
                                    AND J.CDPRODUTO    = C_ITEM.CDPRODUTO
                                    AND J.DTENTJUSTCON IS NULL);
         END IF;
      END IF;
   END LOOP;
   UPDATE CONSSOLOL
      SET IDSITUCONSSOL  = W_C,
          DTCONCONSSOLOL = TO_DATE(TRUNC(SYSDATE))
   WHERE
      CONSSOLOL.NRSEQUCONSOL = P_NRSEQUCONSOL;
   
   IF V_CONTADORITEM = 0 THEN
      P_ROWSAFFECT := '';
   ELSE
      IF LENGTH(V_SOLICITACAO) < 15 THEN
         P_ROWSAFFECT := V_NRSOLICMP;
      ELSE
         V_SOLICITACAO1 := SUBSTR(V_SOLICITACAO, -10);
         V_SOLICITACAO  := SUBSTR(V_SOLICITACAO, 3, LENGTH(V_SOLICITACAO)-14)||' e '||V_SOLICITACAO1; 
         P_ROWSAFFECT   := V_SOLICITACAO;
      END IF;
   END IF;
   COMMIT;
END;
/