CREATE OR REPLACE
PROCEDURE CALC_ESTOQ_SEGURA_OL (
    P_CDFILIAL                IN  VARCHAR2,
    P_CDPRODINI               IN  PRODUTO.CDARVPROD%TYPE,
    P_CDPRODFIN               IN  PRODUTO.CDARVPROD%TYPE)
IS
    V_CDPRODINI               VARCHAR2(40);
    V_CDPRODFIN               VARCHAR2(40);
    V_DTPROCESS               DATE;
    V_IDUTILDTPROC            CHAR(1);
    V_QTDIAS                  FLOAT := 0;
    V_QTESTOSEGU              FLOAT := 0;
BEGIN
   SELECT NVL(MAX(IDUTILDTPROC), 'N')
     INTO V_IDUTILDTPROC
     FROM PARAMGERAL;
   SELECT MIN(PRODUTO.CDARVPROD)
     INTO V_CDPRODINI
     FROM RELACPRODOL, PRODUTO PRODUTOOL, PRODUTO
    WHERE RELACPRODOL.CDPRODARVOL = PRODUTOOL.CDPRODUTO
      AND RELACPRODOL.CDPRARVORIG = PRODUTO.CDPRODUTO
      AND PRODUTOOL.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODINI, 20, 'Z');

   SELECT MAX(PRODUTO.CDARVPROD)
     INTO V_CDPRODFIN
     FROM RELACPRODOL, PRODUTO PRODUTOOL, PRODUTO
    WHERE RELACPRODOL.CDPRODARVOL = PRODUTOOL.CDPRODUTO
      AND RELACPRODOL.CDPRARVORIG = PRODUTO.CDPRODUTO
      AND PRODUTOOL.CDARVPROD BETWEEN P_CDPRODINI AND RPAD(P_CDPRODFIN, 20, 'Z'); 

   SELECT CASE V_IDUTILDTPROC
             WHEN 'S'
             THEN NVL(DTPROCESSA, TRUNC(SYSDATE))
             ELSE TRUNC(SYSDATE)
          END
     INTO V_DTPROCESS
     FROM PARAMFILIAL
    WHERE CDFILIAL = P_CDFILIAL;
   FOR C_DATAS IN (SELECT CASE TRUNC(TO_NUMBER(TO_CHAR(DTDATA-1, 'DD'))/15)
                             WHEN 1
                             THEN TO_DATE('16/'||TO_CHAR(ADD_MONTHS(DTDATA, -1), 'MM')||'/'||TO_CHAR(ADD_MONTHS(DTDATA, -1), 'YYYY'), 'DD/MM/YYYY')
                             ELSE TO_DATE('01/'||TO_CHAR(ADD_MONTHS(DTDATA, -1), 'MM')||'/'||TO_CHAR(ADD_MONTHS(DTDATA, -1), 'YYYY'), 'DD/MM/YYYY')
                          END PRIMEIRA_QUINZENA_INICIAL,
                          CASE TRUNC(TO_NUMBER(TO_CHAR(DTDATA-1, 'DD'))/15)
                             WHEN 1
                             THEN TO_DATE(LAST_DAY(ADD_MONTHS(DTDATA, -1)), 'DD/MM/YYYY')
                             ELSE TO_DATE('01/'||TO_CHAR(ADD_MONTHS(DTDATA, -1), 'MM')||'/'||TO_CHAR(ADD_MONTHS(DTDATA, -1), 'YYYY'), 'DD/MM/YYYY')+14
                          END PRIMEIRA_QUINZENA_FINAL,
                          CASE TRUNC(TO_NUMBER(TO_CHAR(DTDATA-1, 'DD'))/15)
                             WHEN 1
                             THEN TO_DATE(LAST_DAY(ADD_MONTHS(DTDATA, -1)), 'DD/MM/YYYY')+1
                             ELSE TO_DATE('01/'||TO_CHAR(ADD_MONTHS(DTDATA, -1), 'MM')||'/'||TO_CHAR(ADD_MONTHS(DTDATA, -1), 'YYYY'), 'DD/MM/YYYY')+15
                          END SEGUNDA_QUINZENA_INICIAL,
                          CASE TRUNC(TO_NUMBER(TO_CHAR(DTDATA-1, 'DD'))/15)
                             WHEN 1
                             THEN TO_DATE('15/'||TO_CHAR(DTDATA, 'MM')||'/'||TO_CHAR(DTDATA, 'YYYY'), 'DD/MM/YYYY')
                             ELSE TO_DATE(LAST_DAY(ADD_MONTHS(DTDATA, -1)), 'DD/MM/YYYY')
                          END SEGUNDA_QUINZENA_FINAL
                     FROM DATA
                    WHERE DTDATA = V_DTPROCESS)
   LOOP
      FOR C_ESTOSEGU IN (SELECT PRODUTO.CDPRODESTO, SUM(PRODUTO.VRFATOCONV*NVL(ITEMAUTF.QTATENDPEDOL, ITEMAUTF.QTPROGENTAF)) QTPROGENTAF, TO_NUMBER(ESTOSEGU.NRDIACALCESTSEGOL) NRDIACALCESTSEGOL,
                                MAX(ITEMAUTF.DTPROGENTAF) MAX_DATA, MIN(ITEMAUTF.DTPROGENTAF) MIN_DATA
                           FROM AUTOFORNE, ITEMAUTF, PRODUTO, ESTOSEGU
                          WHERE AUTOFORNE.CDFILDEST  = ITEMAUTF.CDFILDEST
                            AND AUTOFORNE.CDFILLANC  = ITEMAUTF.CDFILLANC
                            AND AUTOFORNE.NRAUTOFORN = ITEMAUTF.NRAUTOFORN
                            AND AUTOFORNE.CDFILIOPELOG = P_CDFILIAL
                            --AND NVL(ITEMAUTF.IDBAIXITAFS, '0') IN ('1', '2')
                            --AND NVL(ITEMAUTF.IDBAIXITMAF, '0') IN ('1', '2')
                            AND ITEMAUTF.CDPRODUTO = PRODUTO.CDPRODUTO
                            AND PRODUTO.CDPRODESTO = ESTOSEGU.CDPRODESTO
                            AND PRODUTO.CDARVPROD  BETWEEN V_CDPRODINI AND RPAD(V_CDPRODFIN, 20, 'Z')
                            AND AUTOFORNE.CDFILIOPELOG = ESTOSEGU.CDFILIAL
                            AND ESTOSEGU.NRDIACALCESTSEGOL IS NOT NULL
                            AND NVL(ITEMAUTF.QTATENDPEDOL, ITEMAUTF.QTPROGENTAF) > 0
                            AND TO_DATE(ITEMAUTF.DTPROGENTAF, 'DD/MM/YYYY') BETWEEN TO_DATE(C_DATAS.PRIMEIRA_QUINZENA_INICIAL, 'DD/MM/YYYY') AND TO_DATE(C_DATAS.SEGUNDA_QUINZENA_FINAL, 'DD/MM/YYYY')
                        GROUP BY PRODUTO.CDPRODESTO, TO_NUMBER(ESTOSEGU.NRDIACALCESTSEGOL))
      LOOP
         V_QTDIAS := 0;
         IF TO_DATE(C_ESTOSEGU.MIN_DATA, 'DD/MM/YYYY') >= TO_DATE(C_DATAS.PRIMEIRA_QUINZENA_INICIAL, 'DD/MM/YYYY') AND
            TO_DATE(C_ESTOSEGU.MIN_DATA, 'DD/MM/YYYY') <= TO_DATE(C_DATAS.PRIMEIRA_QUINZENA_FINAL, 'DD/MM/YYYY') THEN
            V_QTDIAS := 15;
         END IF;
         IF TO_DATE(C_ESTOSEGU.MAX_DATA, 'DD/MM/YYYY') >= TO_DATE(C_DATAS.SEGUNDA_QUINZENA_INICIAL, 'DD/MM/YYYY') AND
            TO_DATE(C_ESTOSEGU.MAX_DATA, 'DD/MM/YYYY') <= TO_DATE(C_DATAS.SEGUNDA_QUINZENA_FINAL, 'DD/MM/YYYY') THEN
            V_QTDIAS := V_QTDIAS+15;
         END IF;
         V_QTESTOSEGU := (C_ESTOSEGU.QTPROGENTAF/V_QTDIAS)*C_ESTOSEGU.NRDIACALCESTSEGOL;
         IF V_QTESTOSEGU > 0 THEN
             UPDATE ESTOSEGU
                SET QTESTOSEGU  = V_QTESTOSEGU
              WHERE CDFILIAL    = P_CDFILIAL
                AND CDPRODESTO  = C_ESTOSEGU.CDPRODESTO;
         END IF;
      END LOOP;
   END LOOP;
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('CALC_ESTOQ_SEGURA_OL','5.85.xxx'); END;
/

