DROP TYPE ITMAPURPRECIMPO_TABLE
/

DROP TYPE ITMAPURPRECIMPO_TYPE
/

CREATE TYPE ITMAPURPRECIMPO_TYPE AS OBJECT (
  CDCENTITMAP  VARCHAR2(4),
  NRCOLEITMAP  VARCHAR2(10),
  CDREGITMAP   VARCHAR2(3),
  NRSEQITMAP   VARCHAR2(10),
  CDFILIAL     VARCHAR2(4),
  NMFILIAL     VARCHAR2(30),
  CDPRODITMAP  VARCHAR2(10),
  CDMARCITMAP  VARCHAR2(5),
  IDITMSELAPUR VARCHAR2(1),
  CDFORNITMAP  VARCHAR2(21),
  VRPRECUNIAP  FLOAT(126),
  VRCOTACAO    FLOAT(126),
  QTSOLICMP    FLOAT(126),
  VRIMPOSTO    FLOAT(126),
  QTSOLAPUR    FLOAT(126),
  VRTOTAL      FLOAT(126),
  VRVENDA      FLOAT(126))
/

CREATE TYPE ITMAPURPRECIMPO_TABLE AS TABLE OF ITMAPURPRECIMPO_TYPE
/

CREATE OR REPLACE FUNCTION GETITMAPURPRECIMPO(P_CDCENTITMAP IN VARCHAR2,
                                              P_NRSEQITMAP  IN VARCHAR2,
                                              P_NRCOLEITMAP IN VARCHAR2)
  RETURN ITMAPURPRECIMPO_TABLE PIPELINED AS L_ITMAPURPRECIMPO_TYPE ITMAPURPRECIMPO_TYPE;
  V_IDTIPOAPUR   PARASUPRI.IDTIPOAPUR%TYPE;
  V_CDFILIAL     FILIAL.CDFILIAL%TYPE;
  V_NMFILIAL     FILIAL.NMFILIAL%TYPE;
  V_VRPRECUNIAP  FLOAT(126);
  V_QTSOLICMP    FLOAT(126);
  V_VRIMPOSTO    FLOAT(126);
  V_VRVENDA      FLOAT(126);
  V_VRTOTAL      FLOAT(126);
BEGIN
  BEGIN
    SELECT
      NVL(IDTIPOAPUR, '0')
    INTO
      V_IDTIPOAPUR
    FROM
      PARASUPRI
    WHERE
      PARASUPRI.CDFILIAL = P_CDCENTITMAP;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      V_IDTIPOAPUR := '0';
  END;
  FOR C_ITMAPURPREC IN  (
                          SELECT
                            CDCENTITMAP, NRCOLEITMAP,  CDREGITMAP,   CDFILIAP,     NRSEQITMAP,   CDPRODITMAP,
                            CDMARCITMAP, IDITMSELAPUR, CDFORNITMAP,  VRPRECUNIAP,  VRPRECECOAP,  VRPRECONPIAP,
                            QTSOLACOMP,  QTSOLAPUR,    VRCOTACAO,    QTSOLAPUR AS VRTOTAL
                          FROM
                            (
                              SELECT
                                CDCENTITMAP, NRCOLEITMAP,  CDREGITMAP,   CDFILIAP,
                                NRSEQITMAP,  CDPRODITMAP,  CDMARCITMAP,  IDITMSELAPUR,
                                CDFORNITMAP, VRPRECUNIAP,  VRPRECECOAP,  VRPRECONPIAP,
                                QTSOLACOMP,  QTSOLAPUR,
                                VRCOTACAO
                              FROM
                                (
                                  SELECT
                                    ITMAPURPREC.CDCENTITMAP, ITMAPURPREC.NRCOLEITMAP,
                                    ITMAPURPREC.CDREGITMAP,  ITMAPURPREC.CDFILIAP,
                                    ITMAPURPREC.NRSEQITMAP,  ITMAPURPREC.CDPRODITMAP,
                                    ITMAPURPREC.CDMARCITMAP, ITMAPURPREC.IDITMSELAPUR,
                                    ITMAPURPREC.CDFORNITMAP, NVL(ITMAPURPREC.VRPRECUNIAP, 0) VRPRECUNIAP,
                                    NVL(ITMAPURPREC.VRPRECECOAP, 0) VRPRECECOAP,
                                    NVL(ITMAPURPREC.VRPRECONPIAP, 0) VRPRECONPIAP,
                                    SUM(ITMAPURPREC.QTSOLACOMP) AS QTSOLACOMP,
                                    SUM(ITMAPURPREC.QTACOMP) AS QTSOLAPUR,
                                    NVL(ITMAPURPREC.VRPRECUNIAP, 0) VRCOTACAO
                                  FROM
                                    ITMAPURPREC
                                  WHERE
                                    ITMAPURPREC.CDCENTITMAP = P_CDCENTITMAP AND
                                    ITMAPURPREC.NRSEQITMAP  = P_NRSEQITMAP  AND
                                    P_NRCOLEITMAP = P_NRCOLEITMAP
                                  GROUP BY ITMAPURPREC.CDCENTITMAP,  ITMAPURPREC.NRCOLEITMAP,
                                    ITMAPURPREC.CDREGITMAP,      ITMAPURPREC.CDFILIAP,
                                    ITMAPURPREC.NRSEQITMAP,      ITMAPURPREC.CDPRODITMAP,
                                    ITMAPURPREC.CDMARCITMAP,     ITMAPURPREC.IDITMSELAPUR,
                                    ITMAPURPREC.CDFORNITMAP,     NVL(ITMAPURPREC.VRPRECUNIAP, 0),
                                    NVL(ITMAPURPREC.VRPRECECOAP, 0),
                                    NVL(ITMAPURPREC.VRPRECONPIAP, 0)
                                )
                            )
                        )
  LOOP
    SELECT
      FILIAL.CDFILIAL, FILIAL.NMFILIAL
    INTO
      V_CDFILIAL, V_NMFILIAL
    FROM
      FILIAL
    WHERE
      CDFILIAL = C_ITMAPURPREC.CDFILIAP;
    IF V_IDTIPOAPUR = '0' THEN
      V_VRPRECUNIAP := C_ITMAPURPREC.VRPRECUNIAP;
    ELSE
      IF V_IDTIPOAPUR = '1' THEN
        V_VRPRECUNIAP := C_ITMAPURPREC.VRPRECECOAP;
      ELSE
        V_VRPRECUNIAP := C_ITMAPURPREC.VRPRECONPIAP;
      END IF;
    END IF;
    BEGIN
      SELECT
        PRODUTO.VRFATOCONV * C_ITMAPURPREC.QTSOLAPUR
      INTO
        V_QTSOLICMP
      FROM
        PRODUTO
      WHERE
        PRODUTO.CDPRODUTO = C_ITMAPURPREC.CDPRODITMAP;
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        V_QTSOLICMP := 0;
    END;
    BEGIN
      SELECT
        NVL(SUM(CASE ITMAPURPRECIMPO.IDTRATAMENTO WHEN 'D' THEN ITMAPURPRECIMPO.VRIMPOSTO*-1 ELSE ITMAPURPRECIMPO.VRIMPOSTO END), 0)
      INTO
        V_VRIMPOSTO
      FROM
        ITMAPURPRECIMPO
      WHERE
        ITMAPURPRECIMPO.CDCENTITMAP = C_ITMAPURPREC.CDCENTITMAP AND
        ITMAPURPRECIMPO.NRCOLEITMAP = C_ITMAPURPREC.NRCOLEITMAP AND
        ITMAPURPRECIMPO.CDREGITMAP  = C_ITMAPURPREC.CDREGITMAP  AND
        ITMAPURPRECIMPO.NRSEQITMAP  = C_ITMAPURPREC.NRSEQITMAP  AND
        ITMAPURPRECIMPO.CDFILIAP    = C_ITMAPURPREC.CDFILIAP    AND
        ITMAPURPRECIMPO.CDPRODITMAP = C_ITMAPURPREC.CDPRODITMAP AND
        ITMAPURPRECIMPO.CDFORNITMAP = C_ITMAPURPREC.CDFORNITMAP AND
        ITMAPURPRECIMPO.IDTRATAMENTO IN ('A', 'D');
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        V_VRIMPOSTO := 0;
    END;
    BEGIN
       SELECT
         MIN(ITEMAUTF.VRPREUNIAF)
       INTO
          V_VRVENDA
       FROM
         ITEMAUTF, FILIAL
       WHERE
         ITEMAUTF.CDFILDEST   = FILIAL.CDFILIAL            AND
         ITEMAUTF.CDMARCA     = C_ITMAPURPREC.CDMARCITMAP  AND
         ITEMAUTF.CDPRODUTO   = C_ITMAPURPREC.CDPRODITMAP  AND
         FILIAL.CDREGIAO      = C_ITMAPURPREC.CDREGITMAP   AND
         NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL)   = C_ITMAPURPREC.CDCENTITMAP AND
         ITEMAUTF.DTPROGENTAF = (SELECT MAX(I.DTPROGENTAF)
                                   FROM ITEMAUTF I
                                  WHERE I.CDFILDEST     = ITEMAUTF.CDFILDEST         AND
                                        I.CDFILLANC     = ITEMAUTF.CDFILLANC         AND
                                        I.NRAUTOFORN    = ITEMAUTF.NRAUTOFORN        AND
                                        I.CDMARCA       = ITEMAUTF.CDMARCA           AND
                                        I.CDPRODUTO     = ITEMAUTF.CDPRODUTO         AND
                                        I.DTPROGENTAF   = ITEMAUTF.DTPROGENTAF       AND
                                        I.CDMARCA       = C_ITMAPURPREC.CDMARCITMAP  AND
                                        I.CDPRODUTO     = C_ITMAPURPREC.CDPRODITMAP  AND
                                        FILIAL.CDREGIAO = C_ITMAPURPREC.CDREGITMAP   AND
                                        I.DTPROGENTAF   <= SYSDATE+366);
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        V_VRVENDA := 0;
    END;
    V_VRTOTAL := C_ITMAPURPREC.QTSOLAPUR*(NVL(V_VRPRECUNIAP, 0));
    L_ITMAPURPRECIMPO_TYPE := ITMAPURPRECIMPO_TYPE
                                (
                                  C_ITMAPURPREC.CDCENTITMAP,  C_ITMAPURPREC.NRCOLEITMAP,  C_ITMAPURPREC.CDREGITMAP,
                                  C_ITMAPURPREC.NRSEQITMAP,   V_CDFILIAL,                 V_NMFILIAL,
                                  C_ITMAPURPREC.CDPRODITMAP,  C_ITMAPURPREC.CDMARCITMAP,  C_ITMAPURPREC.IDITMSELAPUR,
                                  C_ITMAPURPREC.CDFORNITMAP,  V_VRPRECUNIAP,              C_ITMAPURPREC.VRCOTACAO,
                                  V_QTSOLICMP,                V_VRIMPOSTO,                C_ITMAPURPREC.QTSOLAPUR,
                                  V_VRTOTAL,                  V_VRVENDA
                                );
    PIPE ROW (L_ITMAPURPRECIMPO_TYPE);
  END LOOP;
  RETURN;
END;
/