DROP TYPE QUERY_IMPOSTO_CMP99000_TABLE
/

DROP TYPE QUERY_IMPOSTO_CMP99000_TYPE
/

CREATE TYPE QUERY_IMPOSTO_CMP99000_TYPE AS
OBJECT(CDIMPOSTO      VARCHAR2(4),
       NMIMPOSTO      VARCHAR2(50),
       VRIMPOSTO      FLOAT,
       VRALIQUOTA     FLOAT);
/

CREATE TYPE QUERY_IMPOSTO_CMP99000_TABLE AS TABLE OF QUERY_IMPOSTO_CMP99000_TYPE
/

CREATE OR REPLACE FUNCTION QUERY_IMPOSTO_CMP99000(P_NRSEQUENCIAL    IN VARCHAR2,   /*SEQUENCIAL DO ITEM NO GRID DE DETALHE*/
                                                  P_CDFILIAL        IN VARCHAR2,   /*FILIAL DESTINO DO ITEM NO GRID DE DELAHHE*/
                                                  P_CDARVPROD       IN VARCHAR2,   /*´CÓDIGO DE ARVORE DO PRODUTO NO GRID DE DETALHE*/
                                                  P_CDMARCA         IN VARCHAR2,   /*CÓDIGO DA MARCA DO ITEM NO GRID DE DETALHE*/
                                                  P_DTENTREGA       IN DATE,       /*ENTREGA DO ITEM NO GRID DE DETALHE*/
                                                  P_TIPO            IN VARCHAR2    /*AF OU  NF OU PE*/
                                                 ) RETURN QUERY_IMPOSTO_CMP99000_TABLE PIPELINED
IS
   OUT_RECORD QUERY_IMPOSTO_CMP99000_TYPE := QUERY_IMPOSTO_CMP99000_TYPE (NULL, NULL,
                                                                          0,0);
   TYPE CURTYPE        IS REF CURSOR;
   C_ITEM              CURTYPE;
   V_CDIMPOSTO         IMPOSTO.CDIMPOSTO%TYPE;
   V_NMIMPOSTO         IMPOSTO.NMIMPOSTO%TYPE;
   V_VRIMPOSTO         FLOAT;
   V_VRALIQUOTA        FLOAT;
BEGIN
   IF P_TIPO = 'AF' THEN
      OPEN C_ITEM FOR
         SELECT IMPOSTO.CDIMPOSTO, IMPOSTO.NMIMPOSTO, IMPITMAF.VRIMPITMAF, IMPITMAF.VRALIQITMAF
           FROM IMPITMAF, PRODUTO, IMPOSTO
          WHERE PRODUTO.CDPRODUTO    = IMPITMAF.CDPRODUTO
            AND IMPITMAF.CDFILDEST   = P_CDFILIAL
            AND IMPITMAF.CDIMPOSTO   = IMPOSTO.CDIMPOSTO
            AND PRODUTO.CDARVPROD    = P_CDARVPROD
            AND IMPITMAF.DTPROGENTAF = P_DTENTREGA
            AND IMPITMAF.CDMARCA     = P_CDMARCA
            AND IMPITMAF.CDFILLANC||'/'|| IMPITMAF.NRAUTOFORN = P_NRSEQUENCIAL;
   ELSIF P_TIPO = 'NF' THEN
      OPEN C_ITEM FOR
         SELECT IMPOSTO.CDIMPOSTO, IMPOSTO.NMIMPOSTO, ITEMPROIMPOS.VRIMPOSTOIT, ITEMPROIMPOS.VRALIQITEM
           FROM ITEMPROIMPOS, IMPOSTO, ITEMPRODUTO, PRODUTO
          WHERE ITEMPROIMPOS.CDFILIAL   = ITEMPRODUTO.CDFILIAL
            AND ITEMPROIMPOS.NRLANCTONF = ITEMPRODUTO.NRLANCTONF
            AND PRODUTO.CDARVPROD       = P_CDARVPROD
            AND ITEMPRODUTO.CDPRODUTO   = PRODUTO.CDPRODUTO
            AND ITEMPRODUTO.NRSEQITPROD = ITEMPROIMPOS.NRSEQITPROD
            AND ITEMPROIMPOS.CDIMPOSTO  = IMPOSTO.CDIMPOSTO
            AND ITEMPROIMPOS.CDFILIAL||'/'||ITEMPROIMPOS.NRLANCTONF = P_NRSEQUENCIAL;
   ELSE
      OPEN C_ITEM FOR
         SELECT IMPOSTO.CDIMPOSTO, IMPOSTO.NMIMPOSTO, IMPITEMPEDIDO.VRIMPOSTOITPED, IMPITEMPEDIDO.VRALIQITPED
           FROM IMPITEMPEDIDO, IMPOSTO, ITEMPEDIDO, PRODUTO
          WHERE IMPITEMPEDIDO.CDFILIAL  = ITEMPEDIDO.CDFILIAL
            AND IMPITEMPEDIDO.NRPEDIDO  = ITEMPEDIDO.NRPEDIDO
            AND PRODUTO.CDARVPROD       = P_CDARVPROD
            AND ITEMPEDIDO.CDPRODUTO    = PRODUTO.CDPRODUTO
            AND ITEMPEDIDO.NRITEMPED    = IMPITEMPEDIDO.NRITEMPED
            AND IMPITEMPEDIDO.CDIMPOSTO = IMPOSTO.CDIMPOSTO
            AND IMPITEMPEDIDO.CDFILIAL||'/'||IMPITEMPEDIDO.NRPEDIDO = P_NRSEQUENCIAL;
   END IF;
   LOOP
   FETCH C_ITEM INTO V_CDIMPOSTO, V_NMIMPOSTO, V_VRIMPOSTO, V_VRALIQUOTA;
   EXIT WHEN C_ITEM%NOTFOUND;
      OUT_RECORD.CDIMPOSTO      := V_CDIMPOSTO;
      OUT_RECORD.NMIMPOSTO      := V_NMIMPOSTO;
      OUT_RECORD.VRIMPOSTO      := V_VRIMPOSTO;
      OUT_RECORD.VRALIQUOTA     := V_VRALIQUOTA;
      PIPE ROW (OUT_RECORD);
   END LOOP;
   CLOSE C_ITEM;
END;
/