DROP TYPE VERIFICA_INCONS_TABLE
/

DROP TYPE VERIFICA_INCONS_TYPE
/

CREATE TYPE VERIFICA_INCONS_TYPE AS
OBJECT( CDFILSOLI     VARCHAR2(4),
        NMFILIAL      VARCHAR2(30),
        CDFILLAN      VARCHAR2(4),
        NRSOLICMP     VARCHAR2(10),
        DTPROGENTR    DATE,
        QTSOLIPROD    FLOAT(126),
        CDPRODUTO     VARCHAR2(10),
        CDARVPROD     VARCHAR2(20),
        NMPRODUTO     VARCHAR2(50),
        SGUNIDADE     VARCHAR2(10),
        CDFILIOPELOG  VARCHAR2(4),
        NRSEQUCONSOL  VARCHAR2(10),
        IDPEDIDOOL    VARCHAR2(1),
        IDSOLIAPROV   VARCHAR2(1),
        IDITMCONS     VARCHAR2(1),
        COD_ERROR     VARCHAR2(20))
/

CREATE TYPE VERIFICA_INCONS_TABLE AS TABLE OF VERIFICA_INCONS_TYPE
/

CREATE OR REPLACE FUNCTION VERIFICA_INCONS_ITEMPEDEXOL (P_DTINICIAL    IN DATE,
                                                        P_DTFINAL      IN DATE,
                                                        P_PRODINI      IN PRODUTO.CDARVPROD%TYPE,
                                                        P_PRODFIN      IN PRODUTO.CDARVPROD%TYPE,
                                                        P_CDFILLANC    IN FILIAL.CDFILIAL%TYPE,
                                                        P_CDREGIAO     IN VARCHAR2,
                                                        P_CDGRUPFILI   IN VARCHAR2,
                                                        P_CDOPERADOR   IN OPERADOR.CDOPERADOR%TYPE,
                                                        P_CDGRUPPROD   IN PRSUBGRPROD.CDGRUPPROD%TYPE,
                                                        P_CDSUBGRPROD  IN VARCHAR2,
                                                        P_LISTA_FILIAL IN VARCHAR2,
                                                        P_EXTRA        IN VARCHAR2 DEFAULT 'T') RETURN VERIFICA_INCONS_TABLE PIPELINED
IS
   V_CDFILCENTCMP VARCHAR2(4);
   V_CDGRUPPROD   VARCHAR2(10);
   V_CDSUBGRARVOR VARCHAR2(10);
   V_COD_ERROR    VARCHAR2(20);
   V_PRODINI      VARCHAR2(30);
   V_PRODFIN      VARCHAR2(30);
   V_COUNT        INT;
   V_IDUTAPROVSOL CHAR(1);
   V_TREGIAO      CHAR(1);
   V_TGRUPFILI    CHAR(1);
   V_TPRODUTO     CHAR(1);

   OUT_RECORD VERIFICA_INCONS_TYPE := VERIFICA_INCONS_TYPE (NULL, NULL, NULL,
                                                            NULL, NULL, NULL,
                                                            NULL, NULL, NULL,
                                                            NULL, NULL, NULL,
                                                            NULL, NULL, NULL,
                                                            NULL);
BEGIN
   IF P_CDREGIAO IS NULL THEN
      V_TREGIAO := 'T';
   END IF;
   IF P_CDGRUPFILI IS NULL THEN
      V_TGRUPFILI := 'T';
   END IF;
   IF (P_PRODINI IS NULL) AND (P_PRODFIN IS NULL) THEN
      V_TPRODUTO := 'T';
   ELSE
      IF P_PRODINI > P_PRODFIN THEN
         V_PRODINI := P_PRODINI || 'ZZZZZZZZZZ';
         V_PRODFIN := P_PRODFIN;
      ELSE
         V_PRODFIN := P_PRODFIN || 'ZZZZZZZZZZ';
         V_PRODINI := P_PRODINI;
      END IF;
   END IF;

   FOR C_ITEMSOLI IN (SELECT ITEMSOLI.CDFILSOLI,    FILIAL.NMFILIAL,       ITEMSOLI.CDFILLAN,     ITEMSOLI.NRSOLICMP,
                             ITEMSOLI.DTPROGENTR,   ITEMSOLI.QTSOLIPROD,   ITEMSOLI.CDFILIOPELOG,
                             ITEMSOLI.NRSEQUCONSOL, ITEMSOLI.IDPEDIDOOL,   NVL(ITEMSOLI.IDSOLIAPROV, 'N') IDSOLIAPROV,
                             ITEMSOLI.IDITMCONS,    PRODESTO.SGUNIDADE,
                             PRODESTO.CDPRODUTO,    PRODESTO.CDARVPROD,    PRODESTO.NMPRODUTO
                        FROM ITEMSOLI INNER JOIN PRODUTO          ON ITEMSOLI.CDPRODUTO = PRODUTO.CDPRODUTO
                                      INNER JOIN PRODUTO PRODESTO ON PRODUTO.CDPRODESTO = PRODESTO.CDPRODUTO
                                      INNER JOIN FILIAL           ON ITEMSOLI.CDFILSOLI = FILIAL.CDFILIAL
                       WHERE ITEMSOLI.DTPROGENTR BETWEEN P_DTINICIAL AND P_DTFINAL
                         AND ((PRODESTO.CDARVPROD  BETWEEN V_PRODINI AND V_PRODFIN) OR (V_TPRODUTO = 'T'))
                         AND NVL(ITEMSOLI.CDFILIOPELOG, 'X') <> ITEMSOLI.CDFILSOLI
                         AND ((NVL(ITEMSOLI.IDITMSOLEXTRA, 'N') = NVL(P_EXTRA, 'T'))  OR (NVL(P_EXTRA, 'T') = 'T'))
                         AND EXISTS (SELECT 1
                              			FROM FILIAL, LISTA
                                      WHERE LISTA.NRLISTA   = P_LISTA_FILIAL
                                        AND LISTA.CDLISTA   = FILIAL.CDFILIAL
                                        AND FILIAL.CDFILIAL = ITEMSOLI.CDFILSOLI
                                        AND ((INSTR(P_CDREGIAO, FILIAL.CDREGIAO) > 0) OR V_TREGIAO = 'T'))
                         AND (P_CDSUBGRPROD IS NULL OR EXISTS (SELECT 1
                                                                 FROM PRSUBGRPROD
                                                                WHERE PRSUBGRPROD.CDGRUPPROD = P_CDGRUPPROD
                                                                  AND INSTR(P_CDSUBGRPROD, PRSUBGRPROD.CDSUBGRPROD) > 0
                                                                  AND PRSUBGRPROD.CDPRODUTO  = PRODUTO.CDPRODUTO)))
   LOOP
      V_COD_ERROR := '';
      SELECT NVL(CDFILCENTCMP, CDFILIAL)
        INTO V_CDFILCENTCMP
        FROM FILIAL
       WHERE CDFILIAL = C_ITEMSOLI.CDFILSOLI;
      SELECT CDGRUPPROD, CDSUBGRARVOR
        INTO V_CDGRUPPROD, V_CDSUBGRARVOR
        FROM PARASUPRI
       WHERE CDFILIAL = V_CDFILCENTCMP;

      IF V_CDGRUPPROD IS NULL THEN
         V_COD_ERROR := V_COD_ERROR || '01';
      END IF;
      IF V_CDSUBGRARVOR IS NULL THEN
         V_COD_ERROR := V_COD_ERROR || '02';
      END IF;

      IF (V_CDGRUPPROD IS NOT NULL) AND (V_CDSUBGRARVOR IS NOT NULL) THEN
         /*IF P_CDSUBGRPROD IS NULL THEN
            SELECT COUNT(1)
              INTO V_COUNT
              FROM PRSUBGRPROD
             WHERE CDGRUPPROD  = V_CDGRUPPROD
               AND CDPRODUTO   = C_ITEMSOLI.CDPRODUTO
               AND CDSUBGRPROD <> V_CDSUBGRARVOR;
            IF V_COUNT = 0 THEN
               V_COD_ERROR := V_COD_ERROR || '03';
            END IF;
         END IF;*/
         IF P_CDSUBGRPROD IS NOT NULL THEN
            SELECT COUNT(1)
              INTO V_COUNT
              FROM PRSUBGRPROD
             WHERE CDGRUPPROD  = V_CDGRUPPROD
               AND CDPRODUTO   = C_ITEMSOLI.CDPRODUTO
               AND INSTR(P_CDSUBGRPROD, CDSUBGRPROD) > 0
               AND CDSUBGRPROD <> V_CDSUBGRARVOR;
            /*IF V_COUNT = 0 THEN
               V_COD_ERROR := V_COD_ERROR || '03';
            END IF;*/
            IF V_COUNT > 1 THEN
               V_COD_ERROR := V_COD_ERROR || '04';
            END IF;
         END IF;
      END IF;

      IF C_ITEMSOLI.CDFILIOPELOG IS NULL THEN
         V_COD_ERROR := V_COD_ERROR || '05'; /*Entrega Direta*/
      ELSE
         IF C_ITEMSOLI.IDPEDIDOOL = 'S' THEN
            V_COD_ERROR := V_COD_ERROR || '06';
         ELSE
            /*SELECT IDUTAPROVSOL
              INTO V_IDUTAPROVSOL
              FROM PARCMPSUP
             WHERE CDFILIAL = C_ITEMSOLI.CDFILSOLI;
            IF V_IDUTAPROVSOL = 'S' THEN
               IF C_ITEMSOLI.IDSOLIAPROV = 'N' THEN
                  V_COD_ERROR := V_COD_ERROR || '07';
               END IF;
            END IF;*/

            IF C_ITEMSOLI.IDITMCONS = 'S' THEN
               V_COD_ERROR := V_COD_ERROR || '08';
            ELSE
               IF C_ITEMSOLI.NRSEQUCONSOL IS NULL THEN
                  V_COD_ERROR := V_COD_ERROR || '09';
               END IF;
            END IF;
         END IF;
      END IF;

      IF V_COD_ERROR IS NOT NULL THEN
         WHILE V_COD_ERROR IS NOT NULL LOOP
            OUT_RECORD.CDFILSOLI    := C_ITEMSOLI.CDFILSOLI;
            OUT_RECORD.NMFILIAL     := C_ITEMSOLI.NMFILIAL;
            OUT_RECORD.CDFILLAN     := C_ITEMSOLI.CDFILLAN;
            OUT_RECORD.NRSOLICMP    := C_ITEMSOLI.NRSOLICMP;
            OUT_RECORD.DTPROGENTR   := C_ITEMSOLI.DTPROGENTR;
            OUT_RECORD.QTSOLIPROD   := C_ITEMSOLI.QTSOLIPROD;
            OUT_RECORD.CDPRODUTO    := C_ITEMSOLI.CDPRODUTO;
            OUT_RECORD.CDARVPROD    := C_ITEMSOLI.CDARVPROD;
            OUT_RECORD.NMPRODUTO    := C_ITEMSOLI.NMPRODUTO;
            OUT_RECORD.SGUNIDADE    := C_ITEMSOLI.SGUNIDADE;
            OUT_RECORD.CDFILIOPELOG := C_ITEMSOLI.CDFILIOPELOG;
            OUT_RECORD.NRSEQUCONSOL := C_ITEMSOLI.NRSEQUCONSOL;
            OUT_RECORD.IDPEDIDOOL   := C_ITEMSOLI.IDPEDIDOOL;
            OUT_RECORD.IDSOLIAPROV  := C_ITEMSOLI.IDSOLIAPROV;
            OUT_RECORD.IDITMCONS    := C_ITEMSOLI.IDITMCONS;
            OUT_RECORD.COD_ERROR    := SUBSTR(V_COD_ERROR, 0, 2);
            PIPE ROW (OUT_RECORD);
            V_COD_ERROR := SUBSTR(V_COD_ERROR, 3);
         END LOOP;
      END IF;
   END LOOP;
END;
/