DROP TYPE VERIFICA_INCONS_ITAF_OL_TABLE
/

DROP TYPE VERIFICA_INCONS_ITAF_OL_TYPE
/

CREATE TYPE VERIFICA_INCONS_ITAF_OL_TYPE AS
OBJECT(CDFILDEST    VARCHAR2(4),
       CDFILLANC    VARCHAR2(4),
       NRAUTOFORN   VARCHAR2(10),
       CDPRODUTO    VARCHAR2(10),
       NMPRODUTO    VARCHAR2(50),
       CDMARCA      VARCHAR2(5),
       CDFILIOPELOG VARCHAR2(4),
       NMFILIAL     VARCHAR2(30),
       NMFILDEST    VARCHAR2(30),
       SGUNIDADE    VARCHAR2(10),
       CDARVPROD    VARCHAR2(20),
       DTPROGENTAF  DATE,
       DTNOVAENTRAF DATE,
       CDERRO       VARCHAR2(10),
       QTPROGENTAF  FLOAT,
       QTNOVAPROGAF FLOAT,
       NRPRIORIDADE FLOAT,
       QTESTOQ      FLOAT);
/

CREATE TYPE VERIFICA_INCONS_ITAF_OL_TABLE AS TABLE OF VERIFICA_INCONS_ITAF_OL_TYPE
/

CREATE OR REPLACE FUNCTION VERIFICA_INCONS_ITAF_OL (P_CDPRODINI      IN VARCHAR2,
                                                    P_CDPRODFIN      IN VARCHAR2,
                                                    P_TPRODUTO       IN VARCHAR2,
                                                    P_CDFILIOL       IN VARCHAR2,
                                                    P_TCDFILIOL      IN VARCHAR2,
                                                    P_CDFILIAL       IN VARCHAR2,
                                                    P_TCDFILIAL      IN VARCHAR2,
                                                    P_SUBGRUPO       IN VARCHAR2,
                                                    P_CDGRUPPROD     IN VARCHAR2,
                                                    P_CDOPERADOR     IN VARCHAR2,
                                                    P_TROTA          IN VARCHAR2,
                                                    P_ROTA           IN VARCHAR2,
                                                    P_IDPEDEXTRA     IN VARCHAR2,
                                                    P_TDTENTR        IN VARCHAR2,
                                                    P_DTENTRINI      IN DATE,
                                                    P_DTENTRFIN      IN DATE) RETURN VERIFICA_INCONS_ITAF_OL_TABLE PIPELINED
IS
   OUT_RECORD VERIFICA_INCONS_ITAF_OL_TYPE := VERIFICA_INCONS_ITAF_OL_TYPE (NULL, NULL, NULL,
                                                                            NULL, NULL, NULL,
                                                                            NULL, NULL, NULL,
                                                                            NULL, NULL, NULL,
                                                                            NULL, NULL, 0, 0,
                                                                            0, 0);
   V_COD_ERROR       VARCHAR2(20);
   V_CHAVE           VARCHAR2(20) := '_';
   V_CNVPRODUNEST    CNVPRODUNEST.CDPRODUTO%TYPE;
   V_CDPRODARVOL     RELACPRODOL.CDPRODARVOL%TYPE;
   V_DTPOSIESTQ      POSESTDIA.DTPOSIESTQ%TYPE;
   V_ESTOQ_DISPO     FLOAT;
   V_ESTOQ           FLOAT;
   V_QTPROGENTAF     FLOAT;
   V_TOTALSEPARADO   FLOAT;

BEGIN
   FOR C_ITEMAUTF IN (SELECT ITEMAUTF.CDFILDEST, ITEMAUTF.CDFILLANC, ITEMAUTF.NRAUTOFORN, ITEMAUTF.CDPRODUTO,
                             PRODUTO.NMPRODUTO, ITEMAUTF.CDMARCA, ITEMAUTF.DTPROGENTAF, ITEMAUTF.QTPROGENTAF,
                             AUTOFORNE.CDFILIOPELOG, FILIAL.NMFILIAL, FILDEST.NMFILIAL NMFILDEST, PRODUTO.SGUNIDADE,
                             PRODUTO.CDARVPROD, ITEMAUTF.DTNOVAENTRAF, ITEMAUTF.QTNOVAPROGAF,
                            (SELECT MIN(NRPRIORIDADE) NRPRIORIDADE
                               FROM PRIORIZAOLFILDEST
                              WHERE PRIORIZAOLFILDEST.CDFILIOPELOG = AUTOFORNE.CDFILIOPELOG
                                AND PRIORIZAOLFILDEST.CDFILDEST    = AUTOFORNE.CDFILDEST) NRPRIORIDADE
                        FROM PRODUTO, AUTOFORNE, ITEMAUTF, FILIAL, FILIAL FILDEST
                       WHERE ITEMAUTF.CDFILDEST     = AUTOFORNE.CDFILDEST
                         AND ITEMAUTF.CDFILLANC     = AUTOFORNE.CDFILLANC
                         AND ITEMAUTF.NRAUTOFORN    = AUTOFORNE.NRAUTOFORN
                         AND ITEMAUTF.CDPRODUTO     = PRODUTO.CDPRODUTO
                         AND ITEMAUTF.CDFILDEST     = FILDEST.CDFILIAL
                         AND ITEMAUTF.IDBAIXITAFS   IS NULL
                         AND AUTOFORNE.CDFILIOPELOG = FILIAL.CDFILIAL
                         AND NVL(ITEMAUTF.IDITMSEPARADO, 'N') = 'N'
                         AND NVL(AUTOFORNE.IDBAIXAAF,'1') NOT IN ('2','3','4','5','6')
                         AND AUTOFORNE.IDAFOPERLOG = '2'
                         AND NVL(AUTOFORNE.IDAFEXPIRADA,'N') = 'N'
                         AND ITEMAUTF.IDBAIXITMAF IS NULL

                         AND ((P_CDOPERADOR = 'T') OR
                              EXISTS (SELECT 1
                                        FROM FILIOPER
                                       WHERE FILIOPER.CDOPERADOR = P_CDOPERADOR
                                         AND FILIOPER.CDFILIAL   = ITEMAUTF.CDFILDEST)
                              )
                         AND ((PRODUTO.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIN, 20, 'Z')) OR (P_TPRODUTO = 'T'))
                         AND (INSTR(P_CDFILIOL, AUTOFORNE.CDFILIOPELOG) <> 0 OR P_TCDFILIOL = 'T')
                         AND (INSTR(P_CDFILIAL, ITEMAUTF.CDFILDEST) <> 0 OR P_TCDFILIAL = 'T')
                         AND ((P_SUBGRUPO = 'N') OR
                              (EXISTS(SELECT 1
                                        FROM PRSUBGRPROD
                                       WHERE PRSUBGRPROD.CDGRUPPROD = P_CDGRUPPROD
                                         AND PRSUBGRPROD.CDPRODUTO  = ITEMAUTF.CDPRODUTO
                                         AND INSTR(P_SUBGRUPO, PRSUBGRPROD.CDSUBGRPROD) > 0
                                      )
                              )
                             )
                         AND ((P_TROTA = 'T') OR
                              EXISTS (SELECT 1
                                        FROM FILIALROTA
                                       WHERE FILIALROTA.CDFILIROTA = ITEMAUTF.CDFILDEST
                                         AND INSTR(P_ROTA, FILIALROTA.CDROTATRANS) > 0)
                              )
                         AND ((ITEMAUTF.DTPROGENTAF BETWEEN P_DTENTRINI AND P_DTENTRFIN) OR (P_TDTENTR = 'T'))
                         AND ((AUTOFORNE.IDAUTOFORNEX = P_IDPEDEXTRA)  OR (P_IDPEDEXTRA   = 'T'))
                         AND ITEMAUTF.QTATENDPEDOL IS NULL
                         ORDER BY AUTOFORNE.CDFILIOPELOG, PRODUTO.CDARVPROD, ITEMAUTF.CDMARCA, NRPRIORIDADE, ITEMAUTF.QTPROGENTAF,
                                  ITEMAUTF.DTPROGENTAF,ITEMAUTF.CDFILLANC,ITEMAUTF.CDFILDEST,ITEMAUTF.NRAUTOFORN)
   LOOP
      V_COD_ERROR := '';
      IF V_CHAVE = C_ITEMAUTF.CDPRODUTO||C_ITEMAUTF.CDMARCA  THEN
         V_CHAVE := C_ITEMAUTF.CDPRODUTO||C_ITEMAUTF.CDMARCA;
         SELECT MAX(CDPRODARVOL)
           INTO V_CDPRODARVOL
           FROM RELACPRODOL
          WHERE CDPRARVORIG = C_ITEMAUTF.CDPRODUTO
            AND CDMARCA     = C_ITEMAUTF.CDMARCA;
         IF V_CDPRODARVOL IS NOT NULL THEN
            SELECT MAX(CNVPRODUNEST.CDPRODUTO)
              INTO V_CNVPRODUNEST
              FROM CNVPRODUNEST
             WHERE CNVPRODUNEST.CDPRODUTO     = V_CDPRODARVOL
               AND NVL(CNVPRODUNEST.VRFATUNEST, 1) > 0;

            SELECT MAX(POSESTDIA.DTPOSIESTQ)
              INTO V_DTPOSIESTQ
              FROM POSESTDIA
             WHERE POSESTDIA.CDFILIAL      = C_ITEMAUTF.CDFILIOPELOG
               --AND POSESTDIA.CDALMOXARIFE  = ' '
               --AND POSESTDIA.CDLOCALESTOQ  = ' '
               AND POSESTDIA.CDPRODUTO     = V_CDPRODARVOL
               --AND POSESTDIA.NRLOTEESTQ    = ' '
               --AND POSESTDIA.NRSUBLOTE     = ' '
               AND POSESTDIA.DTPOSIESTQ    <= TO_DATE(SYSDATE+999);

            SELECT NVL(CALC_ESTOQ_CONS(C_ITEMAUTF.CDFILIOPELOG, V_CDPRODARVOL, TRUNC(V_DTPOSIESTQ) + 1), 0)
              INTO V_ESTOQ_DISPO
              FROM DUAL;
            V_ESTOQ := V_ESTOQ_DISPO;
            IF V_ESTOQ_DISPO > 0 THEN
               SELECT NVL(SUM(QTPROGENTAF), 0)
                 INTO V_TOTALSEPARADO
                 FROM ITEMAUTF I, AUTOFORNE A
                WHERE I.CDFILDEST = A.CDFILDEST
                  AND I.CDFILLANC = A.CDFILLANC
                  AND I.NRAUTOFORN = A.NRAUTOFORN
                  AND NVL(A.IDAFOPERLOG, '1') = '2'
                  AND I.IDBAIXITAFS IS NULL
                  AND I.IDBAIXITMAF IS NULL
                  AND I.CDPRODUTO = C_ITEMAUTF.CDPRODUTO
                  AND I.CDMARCA   = C_ITEMAUTF.CDMARCA
                  AND NVL(I.IDITMSEPARADO, 'N') = 'S'
                  AND I.DTPROGENTAF >= TO_CHAR(SYSDATE, 'DD/MM/YYYY')
                  AND A.CDFILIOPELOG = C_ITEMAUTF.CDFILIOPELOG;
            END IF;
            V_QTPROGENTAF := C_ITEMAUTF.QTPROGENTAF;
         END IF;
      ELSE
         V_QTPROGENTAF := V_QTPROGENTAF + C_ITEMAUTF.QTPROGENTAF;
      END IF;
      /*Produto do OL sem relacionamento.*/
      IF V_CDPRODARVOL IS NULL THEN
         V_COD_ERROR := V_COD_ERROR||'_01';
      END IF;
      /*Produto do OL sem Quantidade em Estoque.*/
      IF V_ESTOQ_DISPO  <= 0 THEN
         V_COD_ERROR := V_COD_ERROR||'_02';
      END IF;
      /*Produto do OL sem Saldo em Estoque considerando Qtde. Separada.*/
      IF V_ESTOQ_DISPO - (V_TOTALSEPARADO +  V_QTPROGENTAF) < 0 THEN
         V_COD_ERROR := V_COD_ERROR||'_03';
      END IF;
      /*Produto do OL sem conversão para a unidade de estoque*/
      IF V_CNVPRODUNEST IS  NULL THEN
         V_COD_ERROR := V_COD_ERROR||'_04';
      END IF;
      /*Item pendente de aprovação de alteração de AF.*/
      IF  ((LENGTH(C_ITEMAUTF.DTNOVAENTRAF) > 0) OR (LENGTH(C_ITEMAUTF.QTNOVAPROGAF) > 0)) THEN
         V_COD_ERROR := V_COD_ERROR||'_05';
      END IF;
      OUT_RECORD.CDFILDEST        :=  C_ITEMAUTF.CDFILDEST;
      OUT_RECORD.CDFILLANC        :=  C_ITEMAUTF.CDFILLANC;
      OUT_RECORD.NRAUTOFORN       :=  C_ITEMAUTF.NRAUTOFORN;
      OUT_RECORD.CDPRODUTO        :=  C_ITEMAUTF.CDPRODUTO;
      OUT_RECORD.NMPRODUTO        :=  C_ITEMAUTF.NMPRODUTO;
      OUT_RECORD.CDMARCA          :=  C_ITEMAUTF.CDMARCA;
      OUT_RECORD.CDFILIOPELOG     :=  C_ITEMAUTF.CDFILIOPELOG;
      OUT_RECORD.NMFILIAL         :=  C_ITEMAUTF.NMFILIAL;
      OUT_RECORD.NMFILDEST        :=  C_ITEMAUTF.NMFILDEST;
      OUT_RECORD.SGUNIDADE        :=  C_ITEMAUTF.SGUNIDADE;
      OUT_RECORD.CDARVPROD        :=  C_ITEMAUTF.CDARVPROD;
      OUT_RECORD.DTPROGENTAF      :=  C_ITEMAUTF.DTPROGENTAF;
      OUT_RECORD.DTNOVAENTRAF     :=  C_ITEMAUTF.DTNOVAENTRAF;
      OUT_RECORD.QTPROGENTAF      :=  C_ITEMAUTF.QTPROGENTAF;
      OUT_RECORD.QTNOVAPROGAF     :=  C_ITEMAUTF.QTNOVAPROGAF;
      OUT_RECORD.NRPRIORIDADE     :=  C_ITEMAUTF.NRPRIORIDADE;
      OUT_RECORD.QTESTOQ          :=  V_ESTOQ;
      OUT_RECORD.CDERRO           :=  V_COD_ERROR;
      PIPE ROW (OUT_RECORD);
   END LOOP;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('VERIFICA_INCONS_ITAF_OL','6.39.016'); END;
/