create or replace PROCEDURE GRUPOS_INCOMPATIVEIS(P_CDFILIAL      IN PEDIDO.CDFILIAL%TYPE,
                                                 P_TCDFILIAL     IN VARCHAR2,
                                                 P_INTERVALOINI  IN PEDIDO.NRPEDIDO%TYPE,
                                                 P_INTERVALOFIN  IN PEDIDO.NRPEDIDO%TYPE,
                                                 P_TPED1         IN VARCHAR2,
                                                 P_NRPEDIDOLISTA IN VARCHAR2,
                                                 P_TPED2         IN VARCHAR2
                                                 ) IS

   V_STGRUPOPROD      VARCHAR2(200);
   V_STGRUPOPRODATUAL VARCHAR2(200);
   V_QTDE    FLOAT;
   V_IDGRUPO VARCHAR2(1);

   FUNCTION RETORNA_GRUPO (x in varchar2)
      return varchar2 is
   BEGIN
      CASE x
         WHEN 'A' THEN
            RETURN 'B';
         WHEN 'B' THEN
            RETURN 'C';
         WHEN 'C' THEN
            RETURN 'D';
         WHEN 'D' THEN
            RETURN 'E';
         WHEN 'E' THEN
            RETURN 'F';
         WHEN 'F' THEN
            RETURN 'G';
         WHEN 'G' THEN
            RETURN 'H';
         WHEN 'H' THEN
            RETURN 'I';
         WHEN 'I' THEN
            RETURN 'J';
         WHEN 'J' THEN
            RETURN 'K';
         WHEN 'K' THEN
            RETURN 'L';
         WHEN 'L' THEN
            RETURN 'M';
         WHEN 'M' THEN
            RETURN 'N';
         WHEN 'N' THEN
            RETURN 'O';
         WHEN 'O' THEN
            RETURN 'P';
         WHEN 'P' THEN
            RETURN 'Q';
         WHEN 'Q' THEN
            RETURN 'R';
         WHEN 'R' THEN
            RETURN 'S';
         WHEN 'S' THEN
            RETURN 'T';
         WHEN 'T' THEN
            RETURN 'U';
         WHEN 'U' THEN
            RETURN 'V';
         WHEN 'V' THEN
            RETURN 'W';
         WHEN 'W' THEN
            RETURN 'Y';
         WHEN 'Y' THEN
            RETURN 'X';
         WHEN 'X' THEN
            RETURN 'Z';
         ELSE
            RETURN 'Z';
      END CASE;
   END;

BEGIN
   V_IDGRUPO := 'A';
   V_STGRUPOPROD := '';
   V_STGRUPOPRODATUAL := '';

   DELETE FROM PEDSEPARACAO;

   FOR C_ITENS IN (
      SELECT A.CDFILIAL, A.NRPEDIDO, A.NRITEMPED,
             A.CDARVPROD, A.NMPRODUTO, A.SGUNIDADE,
             NVL(A.NRLOTEESTQ, ' ') NRLOTEESTQ,
             NVL(A.NRSUBLOTE, ' ') NRSUBLOTE, DECODE(A.QTRESPRODPED, 0, A.QTITEMPED, A.QTRESPRODPED) QTDE,
             A.QTRESPRODPED, A.QTITEMPED,
             A.CDPRODUTO,
             A.CDALMOXPRCLI, A.DSALMOXARIFE,
             A.CDLOCALPRCLI, A.DSLOCALESTOQ,
             A.IDCTPRODINCOMP, A.CDGRUPO, IDGRUPO
        FROM(
      SELECT I.IDSITITEMPED, I.NRITEMPED, P.CDARVPROD, P.NMPRODUTO, P.SGUNIDADE,
             I.NRPEDIDO, RE.NRLOTEESTQ, RE.NRSUBLOTE, NVL(I.QTITEMPED, 0) QTITEMPED, I.VRPREUNITPED,
             I.VRPESOITPED, NVL(RE.QTRESPRODPED, 0) QTRESPRODPED, P.VRFATOCONV, I.DSFORMULADESC,
             I.CDPRODUTO, I.CDFILIAL,
             CASE WHEN I.QTITEMPED <> NVL(RE.QTRESPRODPED, I.QTITEMPED)
                  THEN (NVL(RE.QTRESPRODPED * ROUND(I.VRPREUNITPED, 2), 0) * ((NVL(ROUND(I.VRDESITPED, 2), 0) * 100)/NVL(I.QTITEMPED * ROUND(I.VRPREUNITPED, 2), 1)))/100
                  ELSE I.VRDESITPED END AS VRDESITPED,
             NVL(PF.CDALMOXPRCLI, PF.CDALMOXPRACA) CDALMOXPRCLI, A.DSALMOXARIFE,
             NVL(PF.CDLOCALPRCLI, PF.CDLOCALPRACA) CDLOCALPRCLI, LE.DSLOCALESTOQ,
             PE.IDCTPRODINCOMP, GP.CDGRUPO, NVL(I.IDGRUPO, 'A') IDGRUPO
        FROM ITEMPEDIDO I, PRODUTO P, RESERPRODPED RE, PRODFILI PF,
             PAREXPEDICAO PE, GRUPOPROD GP,
             ALMOXARIFADO A, LOCALESTOQUE LE
       WHERE ((I.NRPEDIDO BETWEEN P_INTERVALOINI AND P_INTERVALOFIN) OR (P_TPED1 = 'T'))
         AND ((INSTR(P_NRPEDIDOLISTA, I.NRPEDIDO  ) > 0) OR (P_TPED2 = 'T'))
         AND ((INSTR(P_CDFILIAL, I.CDFILIAL) > 0  ) OR P_TCDFILIAL = 'T')
         AND (I.CDPRODUTO     = P.CDPRODUTO       )
         AND (I.CDFILIAL      = RE.CDFILIAL    (+))
         AND (I.NRPEDIDO      = RE.NRPEDIDO    (+))
         AND (I.NRITEMPED     = RE.NRITEMPED   (+))
         AND (I.CDFILIAL      = PF.CDFILIAL    (+))
         AND (I.CDPRODUTO     = PF.CDPRODUTO   (+))
         AND (PF.CDFILIAL     = A.CDFILIAL     (+))
         AND (NVL(PF.CDALMOXPRCLI, PF.CDALMOXPRACA) = A.CDALMOXARIFE(+))
         AND (PF.CDFILIAL     = LE.CDFILIAL    (+))
         AND (NVL(PF.CDALMOXPRCLI, PF.CDALMOXPRACA) = LE.CDALMOXARIFE(+))
         AND (NVL(PF.CDLOCALPRCLI, PF.CDLOCALPRACA) = LE.CDLOCALESTOQ(+))
         AND (I.CDFILIAL      = PE.CDFILIAL(+))
         AND (I.CDPRODUTO     = GP.CDPRODUTO(+))
      ) A
       ORDER BY A.CDFILIAL, A.NRPEDIDO,
                (CASE WHEN A.IDCTPRODINCOMP = 'S' THEN A.CDGRUPO
                 ELSE A.NRITEMPED END)               
                 
   )LOOP
      V_QTDE := 0;

      -- Verifica grupo de produtos (?)
      FOR C_GRUPO_PROD IN(SELECT I.CDPRODUTO, G.CDGRUPO
                             FROM ITEMPEDIDO I, GRUPOPROD G
                            WHERE I.CDFILIAL  = C_ITENS.CDFILIAL
                              AND I.NRPEDIDO  = C_ITENS.NRPEDIDO
                              AND I.CDPRODUTO = C_ITENS.CDPRODUTO
                              AND I.CDPRODUTO = G.CDPRODUTO
                             ORDER BY CDGRUPO
      ) LOOP

        IF (V_STGRUPOPROD IS NULL) THEN
           V_STGRUPOPROD := C_GRUPO_PROD.CDGRUPO;          
        ELSE
           V_STGRUPOPROD := V_STGRUPOPROD || '_' || C_GRUPO_PROD.CDGRUPO;
        END IF;
        
        V_STGRUPOPRODATUAL := C_GRUPO_PROD.CDGRUPO; 

     END LOOP;

     BEGIN
        SELECT COUNT(*) QTDE
           INTO V_QTDE
           FROM ITEMPEDIDO I, GRUPOPROD G, GRUPOINCOMPROD GI
          WHERE I.CDFILIAL  = C_ITENS.CDFILIAL
            AND I.NRPEDIDO  = C_ITENS.NRPEDIDO
            AND I.CDPRODUTO = C_ITENS.CDPRODUTO
            AND I.CDPRODUTO = G.CDPRODUTO
            AND GI.CDGRUPO  = G.CDGRUPO
            AND (INSTR(V_STGRUPOPROD, GI.CDGRUPOINCOMP) > 0 );
     EXCEPTION
        WHEN NO_DATA_FOUND THEN
           V_QTDE := 0;
     END;

     -- RETORNA O GRUPO
     IF (V_QTDE > 0) THEN
        V_STGRUPOPROD := V_STGRUPOPRODATUAL;
        V_IDGRUPO := RETORNA_GRUPO(V_IDGRUPO);   
     END IF;
          

      -- INSERE NA TABELA TEMPORARIA
      INSERT INTO PEDSEPARACAO(
         CDFILIAL, NRPEDIDO, NRITEMPED, CDARVPROD, NMPRODUTO,
         SGUNIDADE, NRLOTEESTQ, NRSUBLOTE, QTITEMRESERV,
         QTITEMPED, CDPRODUTO, CDALMOXPRCLI,
         DSALMOXARIFE, CDLOCALPRCLI, DSLOCALESTOQ, IDGRUPO)
      VALUES
         (C_ITENS.CDFILIAL,    C_ITENS.NRPEDIDO,     C_ITENS.NRITEMPED,    C_ITENS.CDARVPROD, C_ITENS.NMPRODUTO,
         C_ITENS.SGUNIDADE,    C_ITENS.NRLOTEESTQ,   C_ITENS.NRSUBLOTE,    C_ITENS.QTDE,
         C_ITENS.QTITEMPED,    C_ITENS.CDPRODUTO,    C_ITENS.CDALMOXPRCLI,
         C_ITENS.DSALMOXARIFE, C_ITENS.CDLOCALPRCLI, C_ITENS.DSLOCALESTOQ, V_IDGRUPO);

      -- Salva/Altera o grupo na tabela de itempedido
   UPDATE ITEMPEDIDO
        SET IDGRUPO = V_IDGRUPO
       WHERE CDFILIAL  = C_ITENS.CDFILIAL
         AND NRPEDIDO  = C_ITENS.NRPEDIDO
         AND NRITEMPED = C_ITENS.NRITEMPED;
   END LOOP;

   COMMIT;
END;
/