DROP TYPE RUPTURA_OL_TABLE
/

DROP TYPE RUPTURA_OL_TYPE
/

CREATE TYPE RUPTURA_OL_TYPE AS
   OBJECT(CDPRODUTO    VARCHAR2(10),
          CDARVPROD    VARCHAR2(20),
          NMPRODUTO    VARCHAR2(50),
          CDPRODARVOL  VARCHAR2(20),
          CDPRODOL     VARCHAR2(10),
          NMPRODOL     VARCHAR2(50),
          CDMARCA      VARCHAR2(5),
          NMMARCA      VARCHAR2(20),
          SGUNIDADE    VARCHAR2(10),
          CDPRODESTO   VARCHAR2(10),
          VRFATOCONV   FLOAT,
          VRPESOUNID   FLOAT,
          QTPROGENTAF  FLOAT,
          ESTOQ_DISPO  FLOAT)
/

CREATE TYPE RUPTURA_OL_TABLE AS TABLE OF RUPTURA_OL_TYPE
/

CREATE OR REPLACE FUNCTION RUPTURA_OL(P_CDFILIOPELOG  IN VARCHAR2,
                                      P_CDPRODUTO   IN VARCHAR2,
                                      P_CDMARCA   IN VARCHAR2,
                                      P_CDPRODNOVO  IN VARCHAR2,
                                      P_NRSEQRUPTURAOL     IN VARCHAR2) RETURN RUPTURA_OL_TABLE PIPELINED
IS
   V_TOTALSEPARADO     FLOAT;
   V_QTNOVAPROGAF      FLOAT;
   V_QTPROGENTAF       FLOAT;
   V_IDTROCAPRODDIFOL  VARCHAR2(1);

   OUT_RECORD RUPTURA_OL_TYPE := RUPTURA_OL_TYPE (NULL, NULL, NULL, NULL, NULL,
                                                  NULL, NULL, NULL, NULL, NULL,
                                                  0, 0, 0, 0);
BEGIN
   SELECT NVL(MAX(IDTROCAPRODDIFOL), 'N')
     INTO V_IDTROCAPRODDIFOL
     FROM PARASUPRI, FILIAL
    WHERE PARASUPRI.CDFILIAL = NVL(FILIAL.CDFILCENTCMP, FILIAL.CDFILIAL)
      AND FILIAL.CDFILIAL = P_CDFILIOPELOG;
      FOR C_PRODUTO IN (SELECT DTPOSESTCON, CDPRODUTO,   CDARVPROD, NMPRODUTO, SGUNIDADE, CDPRODESTO, VRFATOCONV, VRPESOUNID,
                            CDPRODARVOL, CDPRODOL,  NMPRODOL,
                            CDMARCA,     NMMARCA,
                            NVL(CALC_ESTOQ_CONS(P_CDFILIOPELOG, CDPRODARVOL, DTPOSESTCON + 1), 0) ESTOQ_DISPO
                      FROM (
                          SELECT P.CDPRODUTO,   P.CDARVPROD, P.NMPRODUTO, P.SGUNIDADE, P.CDPRODESTO, NVL(P.VRFATOCONV, 1) VRFATOCONV, NVL(P.VRPESOUNID, 1) VRPESOUNID,
                                 P.CDPRODARVOL, P.CDPRODOL,  P.NMPRODOL,
                                 P.CDMARCA,     P.NMMARCA,   NVL(MAX(E.DTPOSESTCON), MAX(TRUNC(SYSDATE))) AS DTPOSESTCON
                            FROM (
                                   SELECT P.CDPRODUTO, P.CDARVPROD, P.NMPRODUTO, P.SGUNIDADE, P.CDPRODESTO, NVL(P.VRFATOCONV, 1) VRFATOCONV, NVL(PE.VRPESOUNID, 1) VRPESOUNID,
                                          R.CDPRODARVOL, PL.CDARVPROD CDPRODOL, PL.NMPRODUTO NMPRODOL,
                                          R.CDMARCA, M.NMMARCA
                                     FROM PRODUTO P, RELACPRODOL R, PRODUTO PL, MARCA M, PRODUTO PE, FILIAL, PARASUPRI
                                    WHERE P.CDPRODUTO         = R.CDPRARVORIG
                                      AND PL.CDPRODUTO        = R.CDPRODARVOL
                                      AND R.CDMARCA           = M.CDMARCA
                                      AND P.CDPRODUTO||R.CDMARCA <> P_CDPRODUTO||P_CDMARCA
                                      AND PE.CDPRODUTO        = CASE
                                                                   WHEN V_IDTROCAPRODDIFOL = 'S'
                                                                   THEN PE.CDPRODUTO
                                                                   ELSE P_CDPRODUTO
                                                                END
                                      AND PE.CDPRODESTO       = CASE
                                                                   WHEN V_IDTROCAPRODDIFOL = 'S'
                                                                   THEN PE.CDPRODUTO
                                                                   ELSE PE.CDPRODESTO
                                                                END
                                      AND PE.CDPRODESTO       = P.CDPRODESTO
                                      AND PE.CDPRODESTO IS NOT NULL
                                      AND FILIAL.CDFILIAL     = P_CDFILIOPELOG
                                      AND FILIAL.CDFILCENTCMP = PARASUPRI.CDFILIAL
                                      AND (
                                            ((PARASUPRI.IDUTLPROCMPAF = 'S') AND (P.CDPRODUTO <> P.CDPRODESTO)) OR
                                             (PARASUPRI.IDUTLPROCMPAF = 'N')
                                          )

                                 ) P, POSESTCONS E
                           WHERE E.CDFILIAL(+)  = P_CDFILIOPELOG
                             AND E.CDPRODUTO(+) = P.CDPRODARVOL
                             AND ((P.CDARVPROD  = P_CDPRODNOVO) OR (P_CDPRODNOVO = 'T'))
                           GROUP BY P.CDPRODARVOL, P.CDPRODUTO,   P.CDARVPROD, P.NMPRODUTO, P.SGUNIDADE, P.CDPRODESTO, VRFATOCONV, VRPESOUNID,
                                  P.CDPRODOL,  P.NMPRODOL,
                                 P.CDMARCA,     P.NMMARCA
                           ))
   LOOP
      IF C_PRODUTO.ESTOQ_DISPO > 0 THEN
        V_TOTALSEPARADO := 0;
        V_QTNOVAPROGAF  := 0;
        /* 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_PRODUTO.CDPRODUTO
            AND I.CDMARCA   = C_PRODUTO.CDMARCA
            AND NVL(I.IDITMSEPARADO, 'N') = 'S'
            AND I.DTPROGENTAF >= TO_CHAR(SYSDATE, 'DD/MM/YYYY')
            AND A.CDFILIOPELOG = P_CDFILIOPELOG;*/

         SELECT NVL(SUM(ITEMAUTF.QTNOVAPROGAF), 0)
           INTO V_QTNOVAPROGAF
           FROM ITEMAUTF
          WHERE ITEMAUTF.CDPRODRUP       = C_PRODUTO.CDPRODUTO
            AND ITEMAUTF.NRSEQRUPTURAOL  = P_NRSEQRUPTURAOL
            AND ITEMAUTF.CDMARCARUP      = C_PRODUTO.CDMARCA
            AND NVL(ITEMAUTF.IDTPGERARUP, 'B') = 'A'
            AND ITEMAUTF.QTNOVAPROGAF IS NOT NULL;

         SELECT NVL(SUM(NVL(QTATENDPEDOL, QTPROGENTAF)), 0) QTPROGENTAF
           INTO V_QTPROGENTAF
           FROM ITEMAUTF, AUTOFORNE, RELACPRODOL
          WHERE AUTOFORNE.CDFILDEST  = ITEMAUTF.CDFILDEST
            AND AUTOFORNE.CDFILLANC   = ITEMAUTF.CDFILLANC
            AND AUTOFORNE.NRAUTOFORN  = ITEMAUTF.NRAUTOFORN
            AND ITEMAUTF.DTPROGENTAF  >= TRUNC(SYSDATE)
            AND RELACPRODOL.CDPRARVORIG = ITEMAUTF.CDPRODUTO
            AND RELACPRODOL.CDMARCA     = ITEMAUTF.CDMARCA
            AND ITEMAUTF.IDBAIXITAFS IS NULL
            --AND ITEMAUTF.IDBAIXITMAF IS NULL
            AND NVL(AUTOFORNE.IDBAIXAAF,'1') NOT IN ('2','3','4','5','6')
            AND NVL(AUTOFORNE.IDAFEXPIRADA,'N') = 'N'
            AND AUTOFORNE.IDAFOPERLOG = '2'
            AND ITEMAUTF.NRSEQRUPTURAOL IS NOT NULL
            --AND ITEMAUTF.QTATENDPEDOL IS NULL
            AND NVL(ITEMAUTF.IDITEMRUPTURA, 'S') <> 'S'
            AND ITEMAUTF.IDTPGERARUP IS NULL
            AND NVL(ITEMAUTF.IDITMSEPARADO, 'N') = 'S'
            AND ITEMAUTF.CDPRODUTO = C_PRODUTO.CDPRODUTO
            AND ITEMAUTF.CDMARCA   = C_PRODUTO.CDMARCA
            AND AUTOFORNE.CDFILIOPELOG = P_CDFILIOPELOG;

         OUT_RECORD.CDPRODUTO   := C_PRODUTO.CDPRODUTO;
         OUT_RECORD.CDARVPROD   := C_PRODUTO.CDARVPROD;
         OUT_RECORD.NMPRODUTO   := C_PRODUTO.NMPRODUTO;
         OUT_RECORD.CDPRODARVOL := C_PRODUTO.CDPRODARVOL;
         OUT_RECORD.CDPRODOL    := C_PRODUTO.CDPRODOL;
         OUT_RECORD.NMPRODOL    := C_PRODUTO.NMPRODOL;
         OUT_RECORD.CDMARCA     := C_PRODUTO.CDMARCA;
         OUT_RECORD.NMMARCA     := C_PRODUTO.NMMARCA;
         OUT_RECORD.SGUNIDADE   := C_PRODUTO.SGUNIDADE;
         OUT_RECORD.CDPRODESTO  := C_PRODUTO.CDPRODESTO;
         OUT_RECORD.VRFATOCONV  := C_PRODUTO.VRFATOCONV;
         OUT_RECORD.VRPESOUNID  := C_PRODUTO.VRPESOUNID;
         OUT_RECORD.QTPROGENTAF := V_QTNOVAPROGAF+V_QTPROGENTAF;
         IF (C_PRODUTO.ESTOQ_DISPO - (V_TOTALSEPARADO+V_QTNOVAPROGAF+V_QTPROGENTAF) > 0) THEN
            OUT_RECORD.ESTOQ_DISPO := C_PRODUTO.ESTOQ_DISPO - (V_TOTALSEPARADO+V_QTNOVAPROGAF+V_QTPROGENTAF);
         ELSE
            OUT_RECORD.ESTOQ_DISPO := 0;
         END IF;
         PIPE ROW (OUT_RECORD);
      END IF;
   END LOOP;
END;
/