DROP TYPE VD_AUTOFORNE_MOBILE_TABLE
/

DROP TYPE VD_AUTOFORNE_MOBILE_TYPE
/

CREATE TYPE VD_AUTOFORNE_MOBILE_TYPE AS
OBJECT(NRLINHA           NUMBER,
       POSICAO           NUMBER,
       TAMANHO           NUMBER,
       MENSERRO          VARCHAR2(50),
       VALOR             VARCHAR2(100))
/

CREATE TYPE VD_AUTOFORNE_MOBILE_TABLE AS TABLE OF VD_AUTOFORNE_MOBILE_TYPE
/

CREATE OR REPLACE FUNCTION VD_AUTOFORNE_MOBILE (P_NRAUTOFORNE_MOBILE IN NUMBER,
                                                P_CDFILDEST          IN VARCHAR2 DEFAULT NULL) RETURN VD_AUTOFORNE_MOBILE_TABLE PIPELINED
IS
   OUT_RECORD VD_AUTOFORNE_MOBILE_TYPE := VD_AUTOFORNE_MOBILE_TYPE (0, 0, 0, NULL, NULL);

   V_ERRO             NUMBER;
   V_QTESTOQUE        FLOAT;
   V_QTTOTALRESERVA   FLOAT;
   V_QTRESERVESTOL    FLOAT;
   V_QTEST_DISPO      FLOAT;
   V_DTPOSIESTQ       POSESTDIA.DTPOSIESTQ%TYPE;
   V_QTESTOQDIA       FLOAT;
   V_QTESTOQUE_CONVER FLOAT;
   V_CDMARCA          PARASUPRI.CDMARCA%TYPE;
   V_DTPROGENTAF      ITEMAUTF.DTPROGENTAF%TYPE;
   V_QTPROGENTAF      ITEMAUTF.QTPROGENTAF%TYPE;
   V_VRPREUNIAF       ITEMAUTF.VRPREUNIAF%TYPE;


BEGIN
   SELECT MAX(CDMARCA)
     INTO V_CDMARCA
     FROM PARASUPRI, FILIAL
    WHERE PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL)
      AND FILIAL.CDFILIAL    = NVL(P_CDFILDEST, FILIAL.CDFILCENTCMP);
   FOR C_ITEM IN (SELECT AUTOFORNE_MOBILE.NRLINHA, AUTOFORNE_MOBILE.CDOPERADOR, AUTOFORNE_MOBILE.CDFORNECED, AUTOFORNE_MOBILE.CDFILDEST,
                         AUTOFORNE_MOBILE.CDPRODUTO, AUTOFORNE_MOBILE.CDMARCA, AUTOFORNE_MOBILE.DTPROGENTAF, AUTOFORNE_MOBILE.QTPROGENTAF,
                         AUTOFORNE_MOBILE.VRPREUNIAF, AUTOFORNE_MOBILE.USR_NRAUTOFORN
                    FROM AUTOFORNE_MOBILE
                   WHERE AUTOFORNE_MOBILE.NRAUTOFORNE_MOBILE = P_NRAUTOFORNE_MOBILE)
   LOOP
      /*Comprador nao cadastrdo*/
      SELECT COUNT(1)
        INTO V_ERRO
        FROM COMPRADOR
       WHERE CDOPERADOR = C_ITEM.CDOPERADOR;
      IF V_ERRO = 0 THEN
         OUT_RECORD.NRLINHA      := C_ITEM.NRLINHA;
         OUT_RECORD.POSICAO      := 2;
         OUT_RECORD.TAMANHO      := 12;
         OUT_RECORD.MENSERRO     := 'ERRO_COMPRADOR';
         OUT_RECORD.VALOR        := C_ITEM.CDOPERADOR;
         PIPE ROW (OUT_RECORD);
      END IF;
      /*Fornecedor nao cadastrdo*/
      SELECT COUNT(1)
        INTO V_ERRO
        FROM FORNECEDOR
       WHERE FORNECEDOR.NRINSJURFORN = C_ITEM.CDFORNECED;
      IF V_ERRO = 0 THEN
         OUT_RECORD.NRLINHA      := C_ITEM.NRLINHA;
         OUT_RECORD.POSICAO      := 14;
         OUT_RECORD.TAMANHO      := 20;
         OUT_RECORD.MENSERRO     := 'ERRO_FORNECEDOR';
         OUT_RECORD.VALOR        := C_ITEM.CDFORNECED;
         PIPE ROW (OUT_RECORD);
      END IF;
      /*Unidade do arquivo difere da Unidade Informada*/
      IF C_ITEM.CDFILDEST <> NVL(P_CDFILDEST, C_ITEM.CDFILDEST) THEN
         OUT_RECORD.NRLINHA      := C_ITEM.NRLINHA;
         OUT_RECORD.POSICAO      := 34;
         OUT_RECORD.TAMANHO      := 4;
         OUT_RECORD.MENSERRO     := 'ERRO_FILIARQ';
         OUT_RECORD.VALOR        := C_ITEM.CDFILDEST;
         PIPE ROW (OUT_RECORD);
      END IF;

      SELECT COUNT(1)
        INTO V_ERRO
        FROM FILIAL
       WHERE FILIAL.CDFILIAL             = C_ITEM.CDFILDEST
         AND NVL(FILIAL.IDCNTRRESC, 'N') = 'S';
      /*Unidade Inativa*/
      IF V_ERRO > 0 THEN
         OUT_RECORD.NRLINHA      := C_ITEM.NRLINHA;
         OUT_RECORD.POSICAO      := 34;
         OUT_RECORD.TAMANHO      := 4;
         OUT_RECORD.MENSERRO     := 'ERRO_FILI_INATIVA';
         OUT_RECORD.VALOR        := C_ITEM.CDFILDEST;
         PIPE ROW (OUT_RECORD);
      END IF;

      SELECT COUNT(1)
        INTO V_ERRO
        FROM AUTOFORNE
       WHERE NVL(USR_NRAUTOFORN, 'Y') = NVL(C_ITEM.USR_NRAUTOFORN, 'W');
      /*AF externa ja existe no sistema Teknisa*/
      IF V_ERRO <> 0 THEN
         OUT_RECORD.NRLINHA      := C_ITEM.NRLINHA;
         OUT_RECORD.POSICAO      := 38;
         OUT_RECORD.TAMANHO      := 10;
         OUT_RECORD.MENSERRO     := 'ERRO_EXISTE_AF';
         OUT_RECORD.VALOR        := C_ITEM.USR_NRAUTOFORN;
         PIPE ROW (OUT_RECORD);
      END IF;

      SELECT COUNT(1)
        INTO V_ERRO
        FROM (SELECT DISTINCT USR_NRAUTOFORN, CDOPERADOR, CDFORNECED, CDFILDEST
                FROM AUTOFORNE
               WHERE AUTOFORNE.USR_NRAUTOFORN IS NOT NULL
                 AND AUTOFORNE.USR_NRAUTOFORN = C_ITEM.USR_NRAUTOFORN
                 AND AUTOFORNE.CDOPERADOR     = C_ITEM.CDOPERADOR
                 AND AUTOFORNE.CDFORNECED     = C_ITEM.CDFORNECED
                 AND AUTOFORNE.CDFILDEST      = C_ITEM.CDFILDEST);
      IF V_ERRO <> 0 THEN
         OUT_RECORD.NRLINHA      := C_ITEM.NRLINHA;
         OUT_RECORD.POSICAO      := 38;
         OUT_RECORD.TAMANHO      := 10;
         OUT_RECORD.MENSERRO     := 'ERRO_ARQ_AF_DUPLICADA';
         OUT_RECORD.VALOR        := C_ITEM.USR_NRAUTOFORN||'/'||C_ITEM.CDOPERADOR||'/'||C_ITEM.CDFORNECED;
         PIPE ROW (OUT_RECORD);
      END IF;
      /*Fornecedor nao Atende a Unidade*/
      SELECT COUNT(1)
        INTO V_ERRO
        FROM REFORFIL, FORNECEDOR
       WHERE REFORFIL.CDFORNECED     = FORNECEDOR.CDFORNECED
         AND FORNECEDOR.NRINSJURFORN = C_ITEM.CDFORNECED
         AND REFORFIL.CDFILIAL       = C_ITEM.CDFILDEST
         AND REFORFIL.CDPERIENTR IS NULL;
      IF V_ERRO <> 0 THEN
         OUT_RECORD.NRLINHA      := C_ITEM.NRLINHA;
         OUT_RECORD.POSICAO      := 14;
         OUT_RECORD.TAMANHO      := 20;
         OUT_RECORD.MENSERRO     := 'ERRO_FORNE_FILI';
         OUT_RECORD.VALOR        := C_ITEM.CDFORNECED||'/'||C_ITEM.CDFILDEST;
         PIPE ROW (OUT_RECORD);
      END IF;
      /*Fornecedor nao Atende a Regiao da Unidade*/
      SELECT COUNT(1)
        INTO V_ERRO
        FROM REFOREG, FORNECEDOR, FILIAL
       WHERE REFOREG.CDFORNECED         = FORNECEDOR.CDFORNECED
         AND NVL(REFOREG.CDREGIAO, 'Y') = NVL(FILIAL.CDREGIAO, 'X')
         AND FORNECEDOR.NRINSJURFORN    = C_ITEM.CDFORNECED
         AND FILIAL.CDFILIAL            = C_ITEM.CDFILDEST
         AND REFOREG.CDPERIENTR IS NULL;
      IF V_ERRO <> 0 THEN
         OUT_RECORD.NRLINHA      := C_ITEM.NRLINHA;
         OUT_RECORD.POSICAO      := 14;
         OUT_RECORD.TAMANHO      := 20;
         OUT_RECORD.MENSERRO     := 'ERRO_FORNE_REG';
         OUT_RECORD.VALOR        := C_ITEM.CDFORNECED||'/'||C_ITEM.CDFILDEST;
         PIPE ROW (OUT_RECORD);
      END IF;

      SELECT COUNT(1)
        INTO V_ERRO
        FROM PRODUTO
       WHERE CDARVPROD = C_ITEM.CDPRODUTO;
      /*Produto nao Cadastrado*/
      IF V_ERRO = 0 THEN
         RAISE_APPLICATION_ERROR(-20501, C_ITEM.CDPRODUTO);
         OUT_RECORD.NRLINHA      := C_ITEM.NRLINHA;
         OUT_RECORD.POSICAO      := 2;
         OUT_RECORD.TAMANHO      := 20;
         OUT_RECORD.MENSERRO     := 'ERRO_PRODUTO';
         OUT_RECORD.VALOR        := C_ITEM.CDPRODUTO;
         PIPE ROW (OUT_RECORD);
      END IF;

      SELECT COUNT(1)
        INTO V_ERRO
        FROM PRODUTO
       WHERE CDARVPROD = C_ITEM.CDPRODUTO
         AND NVL(IDPRODATIVPR, 'N') = 'N';
      /*Produto Inativo*/
      IF V_ERRO <> 0 THEN
         OUT_RECORD.NRLINHA      := C_ITEM.NRLINHA;
         OUT_RECORD.POSICAO      := 2;
         OUT_RECORD.TAMANHO      := 20;
         OUT_RECORD.MENSERRO     := 'ERRO_PRODUTO_INATIVO';
         OUT_RECORD.VALOR        := C_ITEM.CDPRODUTO;
         PIPE ROW (OUT_RECORD);
      END IF;

      SELECT COUNT(1)
        INTO V_ERRO
        FROM PRODFILI, PRODUTO
       WHERE PRODFILI.CDFILIAL    = C_ITEM.CDFILDEST
         AND PRODFILI.CDPRODUTO   = PRODUTO.CDPRODUTO
         AND PRODFILI.IDPRODATIV  <> 'A'
         AND PRODUTO.CDARVPROD    = C_ITEM.CDPRODUTO;
      /*Produto Inativo para a Unidade*/
      IF V_ERRO <> 0 THEN
         OUT_RECORD.NRLINHA      := C_ITEM.NRLINHA;
         OUT_RECORD.POSICAO      := 2;
         OUT_RECORD.TAMANHO      := 20;
         OUT_RECORD.MENSERRO     := 'ERRO_PROD_INATIVO_FIL';
         OUT_RECORD.VALOR        := C_ITEM.CDPRODUTO||'/'||C_ITEM.CDFILDEST;
         PIPE ROW (OUT_RECORD);
      END IF;
      /*Marca nao cadastrada*/
      SELECT COUNT(1)
        INTO V_ERRO
        FROM MARCA
       WHERE CDMARCA = C_ITEM.CDMARCA;
      IF V_ERRO = 0 THEN
         OUT_RECORD.NRLINHA      := C_ITEM.NRLINHA;
         OUT_RECORD.POSICAO      := 52;
         OUT_RECORD.TAMANHO      := 5;
         OUT_RECORD.MENSERRO     := 'ERRO_MARCA';
         OUT_RECORD.VALOR        := C_ITEM.CDMARCA;
         PIPE ROW (OUT_RECORD);
      ELSE
         /*Marca nao cadastrada para o produto de nivel completo*/
         SELECT COUNT(1)
           INTO V_ERRO
             FROM MARCPRODCOMP, PRODUTO
            WHERE MARCPRODCOMP.CDPRMARCOMPL = PRODUTO.CDPRODUTO
              AND PRODUTO.CDARVPROD         = C_ITEM.CDPRODUTO
              AND MARCPRODCOMP.CDMARCA      = C_ITEM.CDMARCA;
         IF V_ERRO = 0 THEN
            OUT_RECORD.NRLINHA      := C_ITEM.NRLINHA;
            OUT_RECORD.POSICAO      := 52;
            OUT_RECORD.TAMANHO      := 5;
            OUT_RECORD.MENSERRO     := 'ERRO_MARCPROD';
            OUT_RECORD.VALOR        := C_ITEM.CDMARCA||'/'||C_ITEM.CDPRODUTO;
            PIPE ROW (OUT_RECORD);
         END IF;
      END IF;

      SELECT COUNT(1)
        INTO V_ERRO
        FROM FILIAL
       WHERE FILIAL.CDFILIAL = C_ITEM.CDFILDEST
         AND NVL(FILIAL.IDFUNCAOFILI, 'W') = 'O';
      IF V_ERRO > 0 THEN
         SELECT COUNT(1)
           INTO V_ERRO
           FROM RELACPRODOL, PRODUTO
          WHERE RELACPRODOL.CDPRODARVOL = PRODUTO.CDPRODUTO
            AND PRODUTO.CDARVPROD       = C_ITEM.CDPRODUTO
            AND RELACPRODOL.CDMARCA     = C_ITEM.CDMARCA;
         IF V_ERRO = 0 THEN
            SELECT COUNT(1)
              INTO V_ERRO
              FROM RELACPRODOL, PRODUTO
             WHERE RELACPRODOL.CDPRODARVOL = PRODUTO.CDPRODUTO
               AND PRODUTO.CDARVPROD       = C_ITEM.CDPRODUTO
               AND RELACPRODOL.CDMARCA     = V_CDMARCA;
            /*Produto sem relacionamento de produto do OL*/
            IF V_ERRO = 0 THEN
               OUT_RECORD.NRLINHA      := C_ITEM.NRLINHA;
               OUT_RECORD.POSICAO      := 52;
               OUT_RECORD.TAMANHO      := 5;
               OUT_RECORD.MENSERRO     := 'ERRO_RELACPRODOL';
               OUT_RECORD.VALOR        := C_ITEM.CDPRODUTO||'/'||C_ITEM.CDMARCA;
               PIPE ROW (OUT_RECORD);
            END IF;
         END IF;
      END IF;
      /*Fornecedor nao cadastrado*/
      SELECT COUNT(1)
        INTO V_ERRO
        FROM PRODFORNCOMP, PRODUTO, FORNECEDOR
       WHERE PRODFORNCOMP.CDPRODCOMPL = PRODUTO.CDPRODUTO
         AND PRODFORNCOMP.CDFORNECED  = FORNECEDOR.CDFORNECED
         AND PRODUTO.CDARVPROD        = C_ITEM.CDPRODUTO
         AND FORNECEDOR.NRINSJURFORN  = C_ITEM.CDFORNECED;
      IF V_ERRO = 0 THEN
         OUT_RECORD.NRLINHA      := C_ITEM.NRLINHA;
         OUT_RECORD.POSICAO      := 2;
         OUT_RECORD.TAMANHO      := 20;
         OUT_RECORD.MENSERRO     := 'ERRO_FORNEPROD';
         OUT_RECORD.VALOR        := C_ITEM.CDPRODUTO||'/'||C_ITEM.CDFORNECED;
         PIPE ROW (OUT_RECORD);
      END IF;
      /*Produto de nivel completo nao cadastrado para o Fornecedor*/
      SELECT COUNT(1)
        INTO V_ERRO
        FROM PRODCOMP, PRODUTO P
       WHERE P.CDPRODUTO = PRODCOMP.CDPRODUTO
         AND INSTR(C_ITEM.CDPRODUTO, P.CDARVPROD) = 1
         AND PRODCOMP.CDOPERADOR = C_ITEM.CDOPERADOR;
      IF V_ERRO = 0 THEN
         OUT_RECORD.NRLINHA      := C_ITEM.NRLINHA;
         OUT_RECORD.POSICAO      := 2;
         OUT_RECORD.TAMANHO      := 20;
         OUT_RECORD.MENSERRO     := 'ERRO_PROD_COMPR';
         OUT_RECORD.VALOR        := C_ITEM.CDOPERADOR||'/'||C_ITEM.CDPRODUTO;
         PIPE ROW (OUT_RECORD);
      END IF;
      /*Data invalida*/
      BEGIN
         V_DTPROGENTAF := TO_DATE(C_ITEM.DTPROGENTAF, 'DD/MM/YYYY');
      EXCEPTION
         WHEN OTHERS THEN BEGIN
            OUT_RECORD.NRLINHA      := C_ITEM.NRLINHA;
            OUT_RECORD.POSICAO      := 57;
            OUT_RECORD.TAMANHO      := 10;
            OUT_RECORD.MENSERRO     := 'ERRO_DTINV';
            OUT_RECORD.VALOR        := C_ITEM.DTPROGENTAF;
            PIPE ROW (OUT_RECORD);
         END;
      END;
      /*Quantidade invalida*/
      BEGIN
         V_QTPROGENTAF := (TO_NUMBER(C_ITEM.QTPROGENTAF)/1000);
      EXCEPTION
         WHEN OTHERS THEN BEGIN
            OUT_RECORD.NRLINHA      := C_ITEM.NRLINHA;
            OUT_RECORD.POSICAO      := 22;
            OUT_RECORD.TAMANHO      := 15;
            OUT_RECORD.MENSERRO     := 'ERRO_QUANT';
            OUT_RECORD.VALOR        := C_ITEM.QTPROGENTAF;
            PIPE ROW (OUT_RECORD);
         END;
      END;
      /*Preco invalidO*/
      BEGIN
         V_VRPREUNIAF := (TO_NUMBER(C_ITEM.VRPREUNIAF)/1000);
      EXCEPTION
         WHEN OTHERS THEN BEGIN
            OUT_RECORD.NRLINHA      := C_ITEM.NRLINHA;
            OUT_RECORD.POSICAO      := 37;
            OUT_RECORD.TAMANHO      := 15;
            OUT_RECORD.MENSERRO     := 'ERRO_VRUNI';
            OUT_RECORD.VALOR        := C_ITEM.VRPREUNIAF;
            PIPE ROW (OUT_RECORD);
         END;
      END;
   END LOOP;
END;
/