CREATE OR REPLACE PROCEDURE APURA_DIFERENCA_ICMS_ST(
   P_NRSEQUMAPAPU IN MAPAAPURAC.NRSEQUMAPAPU%TYPE)
AS
   V_DTINICIAL     DATE;
   V_DTFINAL       DATE;
   V_CDEMPRESA     VARCHAR2(02);
   V_CDINSCESTA    VARCHAR2(16);
   V_BOACHOUENTR   BOOLEAN;
   V_CDPRODUTO     VARCHAR2(20);
   V_VRFATCONV     FLOAT;
   V_ALIQINTERNA   FLOAT;

BEGIN

   DELETE FROM ENTRADAREF
    WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU;

   COMMIT;

   SELECT DTINIPERIODO, DTFIMPERIODO, CDEMPRESA, CDINSCESTA
     INTO V_DTINICIAL, V_DTFINAL, V_CDEMPRESA, V_CDINSCESTA
     FROM MAPAAPURAC
    WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU;

   FOR C_PROD IN (SELECT FI.CDFILIAL, PR.CDPRODESTO, PR.CDPRODUTO, VE.DTENTRVENDA AS DATA
                    FROM ITVENDAIMPOS II, ITEMVENDA IT, VENDA VE, FILIAL FI, PRODUTO PR
                   WHERE II.CDFILIAL     = IT.CDFILIAL
                     AND II.CDCAIXA      = IT.CDCAIXA
                     AND II.NRSEQVENDA   = IT.NRSEQVENDA
                     AND II.NRSEQUITVEND = IT.NRSEQUITVEND
                     AND II.CDFILIAL     = VE.CDFILIAL
                     AND II.CDCAIXA      = VE.CDCAIXA
                     AND II.NRSEQVENDA   = VE.NRSEQVENDA
                     AND VE.NRCUPOMFIS   IS NOT NULL
                     AND VE.IDSITUVENDA  = 'O'
                     AND FI.CDEMPRESA    = V_CDEMPRESA
                     AND FI.CDINSCESTA   = V_CDINSCESTA
                     AND VE.CDFILIAL     = FI.CDFILIAL
                     AND VE.DTENTRVENDA  BETWEEN V_DTINICIAL AND V_DTFINAL
                     AND II.CDCFOPPROD   = '5405'
                     AND NVL(VE.IDTPEMISVEND,'E') = 'E'
                     AND IT.CDPRODUTO    = PR.CDPRODUTO
                   UNION
                  SELECT VE.CDFILIAL, PR.CDPRODESTO, PR.CDPRODUTO, TRUNC(VE.DTEMISSAONFCE) AS DATA
                    FROM ITVENDAIMPOS II, ITEMVENDA IT,  VENDA VE, FILIAL FI, PRODUTO PR
                   WHERE FI.CDEMPRESA       = V_CDEMPRESA
                     AND FI.CDINSCESTA      = V_CDINSCESTA
                     AND FI.CDEMPRESA       = VE.CDEMPRESA
                     AND FI.CDFILIAL        = VE.CDFILIAL
                     AND TRUNC(VE.DTEMISSAONFCE) BETWEEN V_DTINICIAL AND V_DTFINAL
                     AND VE.IDSITUVENDA     = 'O'
                     AND VE.IDTPAMBNFCE     = '1'
                     AND VE.IDSTATUSNFCE    = 'A'
                     AND VE.CDFILIAL        = IT.CDFILIAL
                     AND VE.NRSEQVENDA      = IT.NRSEQVENDA
                     AND VE.CDCAIXA         = IT.CDCAIXA
                     AND IT.CDFILIAL        = II.CDFILIAL
                     AND IT.CDCAIXA         = II.CDCAIXA
                     AND IT.NRSEQUITVEND    = II.NRSEQUITVEND
                     AND IT.NRSEQVENDA      = II.NRSEQVENDA
                     AND II.CDCFOPPROD      = '5405'
                     AND VE.IDAPROVACAONFCE = 'A'
                     AND VE.IDTPEMISVEND    = 'N'
                     AND IT.CDPRODUTO       = PR.CDPRODUTO) LOOP

      V_BOACHOUENTR := FALSE;

      V_CDPRODUTO   := NULL;
      FOR C_ENTR IN (SELECT MAX(CHAVE) AS CHAVE, CDPRODUTO
                       FROM PROD_ENTR_REF
                      WHERE CDPRODUTO  = C_PROD.CDPRODESTO
                        AND CDFILIRECE = C_PROD.CDFILIAL
                        AND DTENTRSAID = (SELECT MAX(DTENTRSAID)
                                            FROM PROD_ENTR_REF
                                           WHERE CDPRODUTO  = C_PROD.CDPRODESTO
                                             AND CDFILIRECE = C_PROD.CDFILIAL
                                             AND DTENTRSAID < V_DTFINAL)
                      GROUP BY CDPRODUTO) LOOP

         INSERT INTO ENTRADAREF
            (NRSEQUMAPAPU, CHAVE, CDFILIAL, NRLANCTONF, CDPRODUTO, CDPRODESTO, QTITEMPROD, VRFATCONV, VRCONTITEM, VRST, CDFILIRECE,
             CDMODDOCFISC, CDSERIEENTR, NRNOTAFISC, DTENTRSAID, CDARVPROD, DTVENDA, NRACESSONFE)
         (SELECT P_NRSEQUMAPAPU, CHAVE, CDFILIAL, NRLANCTONF, C_PROD.CDPRODUTO, CDPRODUTO, QTITEMPROD, 1, VRCONTITEM, VRST, CDFILIRECE,
                 CDMODDOCFISC, CDSERIEENTR, NRNOTAFISC, DTENTRSAID, CDARVPROD, C_PROD.DATA, NRACESSONFE
            FROM PROD_ENTR_REF
           WHERE CHAVE     = C_ENTR.CHAVE
             AND CDPRODUTO = C_PROD.CDPRODESTO);
         V_BOACHOUENTR := TRUE;
      END LOOP;

      /*SE NAO ENCONTROU ENTRADA PARA O PRODUTO DE ESTOQUE DA SAIDA CORRESPONDENTE, VERIFICA SE UTILIZA ITEM DE COMPOSICAO*/
      IF NOT V_BOACHOUENTR THEN
         /*BUSCA A COMPOSICAO POR FILIAL*/
         BEGIN
            SELECT P.CDPRODESTO, R.QTSUBPRODLOC
              INTO V_CDPRODUTO, V_VRFATCONV
              FROM ROTFABLOCAL R, PRODUTO P,(SELECT COUNT(*) AS NRCOMPPROD, MAX(CDPRODUTO) AS CDPRODUTO
                                               FROM ROTFABLOCAL
                                              WHERE CDFILIAL  = C_PROD.CDFILIAL
                                                AND CDPRODUTO = C_PROD.CDPRODUTO) F
            WHERE R.CDFILIAL     = C_PROD.CDFILIAL
              AND R.CDPRODUTO    = C_PROD.CDPRODUTO
              AND R.CDSUBPRODLOC = P.CDPRODUTO
              AND R.CDPRODUTO    = F.CDPRODUTO;
            --AND F.NRCOMPPROD   = 1;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_CDPRODUTO := NULL;
         END;
         /*BUSCA A COMPOSICAO GERAL*/
         IF V_CDPRODUTO IS NULL THEN
            BEGIN
               SELECT P.CDPRODESTO, R.QTSUBPRODROT
                 INTO V_CDPRODUTO, V_VRFATCONV
                 FROM ROTFABRICA R, PRODUTO P, (SELECT COUNT(*) AS NRCOMPPROD, MAX(CDSUBPRODUTO) AS CDPRODUTO
                                                  FROM ROTFABRICA
                                                 WHERE CDPRODUTO = C_PROD.CDPRODUTO) F
                WHERE R.CDPRODUTO    = C_PROD.CDPRODUTO
                  AND R.CDSUBPRODUTO = P.CDPRODUTO
                  AND R.CDSUBPRODUTO = F.CDPRODUTO;
               -- AND F.NRCOMPPROD   = 1;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_CDPRODUTO := NULL;
            END;
         END IF;

         IF V_CDPRODUTO IS NOT NULL THEN
            FOR C_ENTR IN (SELECT MAX(CHAVE) AS CHAVE, CDPRODUTO
                             FROM PROD_ENTR_REF
                            WHERE CDPRODUTO  = V_CDPRODUTO
                              AND CDFILIRECE = C_PROD.CDFILIAL
                              AND DTENTRSAID = (SELECT MAX(DTENTRSAID)
                                                  FROM PROD_ENTR_REF
                                                 WHERE CDPRODUTO  = V_CDPRODUTO
                                                   AND CDFILIRECE = C_PROD.CDFILIAL
                                                   AND DTENTRSAID < V_DTFINAL)
                            GROUP BY CDPRODUTO) LOOP

               INSERT INTO ENTRADAREF
                  (NRSEQUMAPAPU, CHAVE, CDFILIAL, NRLANCTONF, CDPRODUTO, CDPRODESTO, QTITEMPROD, VRFATCONV, VRCONTITEM, VRST, CDFILIRECE,
                   CDMODDOCFISC, CDSERIEENTR, NRNOTAFISC, DTENTRSAID, CDARVPROD, DTVENDA, NRACESSONFE)
               (SELECT P_NRSEQUMAPAPU, CHAVE, CDFILIAL, NRLANCTONF, C_PROD.CDPRODUTO, CDPRODUTO, QTITEMPROD, V_VRFATCONV, VRCONTITEM, VRST, CDFILIRECE,
                       CDMODDOCFISC, CDSERIEENTR, NRNOTAFISC, DTENTRSAID, CDARVPROD, C_PROD.DATA, NRACESSONFE
                  FROM PROD_ENTR_REF
                 WHERE CHAVE     = C_ENTR.CHAVE
                   AND CDPRODUTO = V_CDPRODUTO
                   AND NOT EXISTS (SELECT *
                                     FROM ENTRADAREF
                                    WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU
                                      AND CHAVE        = C_ENTR.CHAVE
                                      AND CDPRODUTO    = V_CDPRODUTO
                                      AND DTVENDA      = C_PROD.DATA));

               V_BOACHOUENTR := TRUE;
            END LOOP;
         END IF;
      END IF;
      /*SE NAO ENCONTROU ENTRADA PARA O ITEM DE COMPOSICAO, VERIFICA SE O PRODUTO FOI UTILIZADO EM UM MES ANTERIOR*/
      IF NOT V_BOACHOUENTR THEN
	      FOR C_ENTR IN (SELECT CHAVE, CDPRODUTO, MAX(DTVENDA) AS DTVENDA
                          FROM ENTRADAREF
                         WHERE CDPRODUTO  = C_PROD.CDPRODESTO
                           AND CDFILIRECE = C_PROD.CDFILIAL
                           AND DTENTRSAID = (SELECT MAX(DTENTRSAID)
                                              FROM ENTRADAREF
                                              WHERE CDPRODUTO  = C_PROD.CDPRODESTO
                                                AND CDFILIRECE = C_PROD.CDFILIAL
                                                AND DTENTRSAID < V_DTINICIAL)
                         GROUP BY CHAVE, CDPRODUTO) LOOP

            INSERT INTO ENTRADAREF
               (NRSEQUMAPAPU, CHAVE, CDFILIAL, NRLANCTONF, CDPRODUTO, CDPRODESTO, QTITEMPROD, VRFATCONV, VRCONTITEM, VRST, CDFILIRECE,
                CDMODDOCFISC, CDSERIEENTR, NRNOTAFISC, DTENTRSAID, CDARVPROD, DTVENDA, NRACESSONFE)
            (SELECT P_NRSEQUMAPAPU, CHAVE, CDFILIAL, NRLANCTONF, C_PROD.CDPRODUTO, CDPRODUTO, QTITEMPROD, NVL(V_VRFATCONV,1), VRCONTITEM, VRST, CDFILIRECE,
                    CDMODDOCFISC, CDSERIEENTR, NRNOTAFISC, DTENTRSAID, CDARVPROD, C_PROD.DATA, NRACESSONFE
               FROM ENTRADAREF
              WHERE CHAVE     = C_ENTR.CHAVE
                AND CDPRODUTO = C_ENTR.CDPRODUTO
                AND DTVENDA   = C_ENTR.DTVENDA
                AND NOT EXISTS (SELECT *
                                  FROM ENTRADAREF
                                 WHERE NRSEQUMAPAPU = P_NRSEQUMAPAPU
                                   AND CHAVE        = C_ENTR.CHAVE
                                   AND CDPRODUTO    = C_ENTR.CDPRODUTO
                                   AND DTVENDA      = C_PROD.DATA));
         END LOOP;
      END IF;
   END LOOP;

   SELECT VRALIQINTERNA
     INTO V_ALIQINTERNA
     FROM PARAMESTSPED
    WHERE CDEMPRESA  = V_CDEMPRESA
      AND CDINSCESTA = V_CDINSCESTA;

   CONFERE_DIF_APUR_ICMS_ST (P_NRSEQUMAPAPU, V_CDEMPRESA, V_CDINSCESTA, V_DTINICIAL, V_DTFINAL, V_ALIQINTERNA );
END;
/