create or replace PROCEDURE ETL_INFLACAO
  (P_DTINI            IN DATE,
   P_DTFINA           IN DATE)
IS
   V_DTFIM            DATE;
   V_DTINI            DATE;
   V_MES              VARCHAR2(02);
   V_ANO              VARCHAR2(04);
   V_MESANT           VARCHAR2(02);
   V_ANOANT           VARCHAR2(04);
   V_CONT             NUMBER := 0;
   V_COUNTER          NUMBER :=0;
   V_TIPOCUSTO        VARCHAR2(02);
   V_DTINIANT         DATE;
   V_VRMES            FLOAT;
   VALOR_PRIMEIRO_MES FLOAT;
   VALOR_SEGUNDO_MES  FLOAT;
   VR_INFLACAO        FLOAT;
BEGIN
   V_MES  :=  TO_CHAR(P_DTINI,'MM');
   V_ANO  :=  TO_CHAR(P_DTINI,'YYYY');
   EXECUTE IMMEDIATE   'DELETE FROM DM_INFLACAO WHERE TO_DATE(''01/''||CDMESBI||''/''||CDANOBI,''DD/MM/YYYY'')>='''||P_DTINI||'''';
   
   V_DTINI := ADD_MONTHS(LAST_DAY(P_DTINI) + 1, -1);
   WHILE (V_DTINI  <=  P_DTFINA)
   LOOP
      V_DTFIM   :=   LAST_DAY( V_DTINI);
      V_MES     :=   TO_CHAR(V_DTFIM,'MM');
      V_ANO     :=   TO_CHAR(V_DTFIM,'YYYY');
      
      FOR C_ETL IN (SELECT F.CDFILIAL, F.CDAREAGERE, F.CDSEGMER,
                           F.CDEMPRESA, F.CDSUPERVISOR, NVL(F.DTINICIALBI, TO_DATE('01/01/2023','DD/MM/YYYY')) DTINICIALBI,
                           F.CDGOPERAC, P.DTPROCESSA, P.IDUTILALMOX,
                           P.CDALMOXARIFE, F.NMFILIAL ,P.CDTIPCUSTEST
                      FROM
                           FILIAL F, PARAMFILIAL P
                     WHERE P.CDFILIAL = F.CDFILIAL
                       AND F.IDFUNCAOFILI IS NULL
                      -- AND F.DTINICIALBI IS NOT NULL
      )LOOP
         FOR C_EST IN (SELECT CDFILIAL, NMFILIAL,CDFILIMOVI, SGUNIDADE,CDPRODMOVI, NMPRODUTO, VANO,
                              VMES,QTLANCTOEST,VRCUSATUAL,VRCUSTINIC, DECODE(VRCUSTINIC,0,0,((VRCUSATUAL - VRCUSTINIC)/ DECODE(VRCUSTINIC,0,1,VRCUSTINIC) * 100)) AS VRINFLACAO
                              
                         FROM (SELECT CDFILIAL, NMFILIAL, CDFILIMOVI, SGUNIDADE, CDPRODMOVI, NMPRODUTO, VANO, VMES,
                                      SUM(QTLANCTOEST) AS QTLANCTOEST,
                                      CUSTO_PRODUTO(CDFILIMOVI, CDPRODMOVI,C_ETL.CDTIPCUSTEST, V_DTFIM, C_ETL.DTPROCESSA) AS VRCUSATUAL,
                                      CUSTO_PRODUTO(CDFILIMOVI, CDPRODMOVI, C_ETL.CDTIPCUSTEST, ADD_MONTHS(V_DTINI,-1),C_ETL.DTPROCESSA) AS VRCUSTINIC
                                      
                                 FROM (SELECT I.CDFILIAL, F.NMFILIAL, I.CDFILIMOVI, P.NMPRODUTO, P.SGUNIDADE, I.CDPRODMOVI,
                                              TO_CHAR(I.DTLANCMOVI, 'YYYY') VANO,
                                              TO_CHAR(I.DTLANCMOVI, 'MM' )  VMES,
                                              SUM(I.QTLANCTOEST) QTLANCTOEST
                                              
                                         FROM ITLANCTOEST I, FILIAL F, LANCTOESTOQ L, PRODUTO P, NOTAFISCAL N
                                        WHERE I.CDFILIMOVI   = C_ETL.CDFILIAL AND
                                              I.CDPRODMOVI   = P.CDPRODUTO    AND
                                              F.CDFILIAL     = I.CDFILIAL     AND
                                              L.CDFILIAL     = I.CDFILIAL     AND
                                              L.NRLANCESTQ   = I.NRLANCESTQ   AND
                                              N.CDFILIAL     = L.CDFILIAL     AND
                                              N.NRLANCTONF   = L.NRLANCTONF   AND
                                              N.IDENTRSAIDOP = 'E'            AND
                                              I.DTLANCMOVI   BETWEEN V_DTINI  AND V_DTFIM
                                     GROUP BY I.CDFILIAL, F.NMFILIAL, I.CDFILIMOVI, P.NMPRODUTO, P.SGUNIDADE, I.CDPRODMOVI, TO_CHAR(I.DTLANCMOVI, 'YYYY'), TO_CHAR(I.DTLANCMOVI, 'MM' )
                                     ORDER BY TO_CHAR(I.DTLANCMOVI, 'YYYY'), TO_CHAR(I.DTLANCMOVI, 'MM' )
                                      ) A
                     GROUP BY CDFILIAL, NMFILIAL, CDFILIMOVI, SGUNIDADE, CDPRODMOVI, NMPRODUTO, VANO, VMES,QTLANCTOEST
                     ORDER BY VANO,VMES )
         )LOOP
            INSERT INTO DM_INFLACAO
                  ( CDSUPERVISOR,   --> SUPERVISOR
                    CDGOPERAC,      --> GERENTE OPERACIONAL
                    CDEMPRESA,      --> EMPRESA
                    CDFILIAL,       --> FILIAL
                    NMFILIAL,       --> NOME DA FILIAL
                    CDAREAGERE,     --> REGIONAL
                    CDSEGMER,       --> SEGMENTO DE MERCADO
                    CDPRODUTO,      --> PRODUTO
                    NMPRODUTO,      --> NOME PRODUTO
                    NMUNID,         --> DESCRI��O DA UNIDADE
                    CDANOBI,        --> ANO
                    CDMESBI,        --> MES
                    QTESTOQUE,      --> QUATIDADE EM ESTOQUE
                    VRMESATUAL,     --> VALOR MES ATUAL
                    VRINFLACAO,      --> VALOR DA INFLACAO
                    DTULTAPURAC     --> DATA DA �LTIMA APURA��O DA PROCEDURE ETL_INFLA��O
                  )
            VALUES
                 ( C_ETL.CDSUPERVISOR,    --> SUPERVISOR
                   C_ETL.CDGOPERAC,       --> GERENTE OPERACIONAL
                   C_ETL.CDEMPRESA,       --> EMPRESA
                   C_ETL.CDFILIAL,        --> FILIAL
                   C_ETL.NMFILIAL,        --> NOME FILIAL
                   C_ETL.CDAREAGERE,      --> REGIONAL
                   C_ETL.CDSEGMER,        --> SEGMENTO DE MERCADO
                   C_EST.CDPRODMOVI,      --> PRODUTO
                   C_EST.NMPRODUTO,       --> NOME PRODUTO
                   C_EST.SGUNIDADE,       --> UNIDADE DO PRODUTO
                   V_ANO,                 --> ANO
                   V_MES,                 --> MES
                   C_EST.QTLANCTOEST,     --> QUATIDADE EM ESTOQUE
                   C_EST.VRCUSTINIC * C_EST.QTLANCTOEST,     -->  CUSTO TOTAL ATUAL
                   C_EST.VRINFLACAO,     
                   P_DTFINA               --> DATA DA �LTIMA APURA��O DA PROCEDURE ETL_INFLA��O
                  );
            V_CONT := V_CONT + 1;
            IF V_CONT >= 500 THEN
               COMMIT;
               V_CONT := 0;
            END IF;
         END LOOP;   --> fim loop de produtos
      END LOOP; --> fim de loop de filiais
      COMMIT;
      V_DTINI := ADD_MONTHS(V_DTINI,1);
   END LOOP;   
END;
/

-- VERSAO --
BEGIN ATUVEROBJ('ETL_INFLACAO','0.00.000'); END;
/
