create or replace FUNCTION ARQUIVO_DMA_ESTOQUE (
   P_CDIMPOSTO    IN IMPOSTO.CDIMPOSTO%TYPE,
   P_CDEMPRESA    IN EMPRESA.CDEMPRESA%TYPE, 
   P_CDINSCESTA   IN EMPRESA.CDINSCESTA%TYPE, 
   P_DTINICIAL    IN NOTAFISCAL.DTENTRSAID%TYPE, 
   P_DTFINAL      IN NOTAFISCAL.DTENTRSAID%TYPE, 
   P_GRUPPROD     IN PRSUBGRPROD.CDGRUPPROD%TYPE, 
   P_NRSEQARQMAG  IN ARQMAGNETICO.NRSEQARQMAG%TYPE) RETURN NUMBER 
AS 
   V_CONTADOR              NUMBER;
   V_VRGRUPTRIBUTI         NUMBER;
   V_VRGRUPISENTOI         NUMBER;
   V_VRGRUPOUTROSI         NUMBER;
   V_VRGRUPTOTALI          NUMBER;
   V_VRTOTTRIBUTI          NUMBER;
   V_VRTOTISENTOI          NUMBER;
   V_VRTOTOUTROSI          NUMBER;
   V_VRTOTALINICIAL        NUMBER;
   V_VRGRUPTRIBUTF         NUMBER;
   V_VRGRUPISENTOF         NUMBER;
   V_VRGRUPOUTROSF         NUMBER;
   V_VRGRUPTOTALF          NUMBER;
   V_VRTOTTRIBUTF          NUMBER;
   V_VRTOTISENTOF          NUMBER;
   V_VRTOTOUTROSF          NUMBER;
   V_VRTOTALFINAL          NUMBER;
   V_REGESTOQUE            VARCHAR2(4000);
   V_REGESTOQUEFIM         VARCHAR2(4000);
BEGIN
   V_CONTADOR        := 0;
   V_VRGRUPTRIBUTI   := 0;
   V_VRGRUPISENTOI   := 0;
   V_VRGRUPOUTROSI   := 0;
   V_VRGRUPTOTALI    := 0;
   V_VRTOTTRIBUTI    := 0;
   V_VRTOTISENTOI    := 0;
   V_VRTOTOUTROSI    := 0;
   V_VRTOTALINICIAL  := 0;
   V_VRGRUPTRIBUTF   := 0;
   V_VRGRUPISENTOF   := 0;
   V_VRGRUPOUTROSF   := 0;
   V_VRGRUPTOTALF    := 0;
   V_VRTOTTRIBUTF    := 0;
   V_VRTOTISENTOF    := 0;
   V_VRTOTOUTROSF    := 0;
   V_VRTOTALFINAL    := 0;

   FOR C_GRUPO_PROD IN (SELECT DISTINCT CDSUBGRPROD
                          FROM PRSUBGRPROD P
                         WHERE CDGRUPPROD = P_GRUPPROD) LOOP

       BEGIN
          SELECT ROUND(SUM(DECODE(CDFISCAL, '1', VRTOTINVFISC, 0)),2) AS VRTRIBUTADO,
                 ROUND(SUM(DECODE(CDFISCAL, '2', VRTOTINVFISC, 0)),2) AS VRISENTO,
                 ROUND(SUM(DECODE(CDFISCAL, '3', VRTOTINVFISC, 0)),2) AS VROUTROS
            INTO V_VRGRUPTRIBUTI, V_VRGRUPISENTOI, V_VRGRUPOUTROSI
            FROM (SELECT I.CDPRODUTO,
                         I.VRTOTINVFISC,
                         CODIGO_FISCAL_PRODUTO_NFE('E',P_CDEMPRESA,I.CDPRODUTO,P_CDINSCESTA,'01',P_CDIMPOSTO) AS CDFISCAL
                    FROM INVENTFISC I, PRSUBGRPROD G
                   WHERE I.CDINSCESTA   = P_CDINSCESTA
                     AND I.DTINVEFISCAL = (SELECT MAX(DTINVEFISCAL)
                                             FROM INVENTFISC IV
                                            WHERE IV.CDINSCESTA   = P_CDINSCESTA
                                              AND IV.DTINVEFISCAL < TO_DATE('01/01/'||(TO_CHAR(P_DTINICIAL,'YYYY')-1)))
                     AND I.CDPRODUTO   = G.CDPRODUTO
                     AND G.CDGRUPPROD  = P_GRUPPROD
                     AND G.CDSUBGRPROD = C_GRUPO_PROD.CDSUBGRPROD);
       EXCEPTION WHEN NO_DATA_FOUND THEN
           V_VRGRUPTRIBUTI := 0;
           V_VRGRUPISENTOI := 0;
           V_VRGRUPOUTROSI := 0;
       END;

       BEGIN
          SELECT ROUND(SUM(DECODE(CDFISCAL, '1', VRTOTINVFISC, 0)),2) AS VRTRIBUTADOFIM,
                 ROUND(SUM(DECODE(CDFISCAL, '2', VRTOTINVFISC, 0)),2) AS VRISENTOFIM,
                 ROUND(SUM(DECODE(CDFISCAL, '3', VRTOTINVFISC, 0)),2) AS VRISENTOUTROSFIM
            INTO V_VRGRUPTRIBUTF, V_VRGRUPISENTOF, V_VRGRUPOUTROSF
            FROM (SELECT I.CDPRODUTO,
                         I.VRTOTINVFISC,
                         CODIGO_FISCAL_PRODUTO_NFE('E',P_CDEMPRESA,I.CDPRODUTO,P_CDINSCESTA,'01',P_CDIMPOSTO) AS CDFISCAL
                    FROM INVENTFISC I, PRSUBGRPROD G
                   WHERE I.CDINSCESTA   = P_CDINSCESTA
                     AND I.DTINVEFISCAL = (SELECT MAX(DTINVEFISCAL)
                                             FROM INVENTFISC IV
                                            WHERE IV.CDINSCESTA   = P_CDINSCESTA
                                              AND IV.DTINVEFISCAL < TO_DATE('01/01'||TO_CHAR(P_DTFINAL,'YYYY')))
                     AND I.CDPRODUTO   = G.CDPRODUTO
                     AND G.CDGRUPPROD  = P_GRUPPROD
                     AND G.CDSUBGRPROD = C_GRUPO_PROD.CDSUBGRPROD);
       EXCEPTION WHEN NO_DATA_FOUND THEN
           V_VRGRUPTRIBUTF := 0;
           V_VRGRUPISENTOF := 0;
           V_VRGRUPOUTROSF := 0;
       END;

       V_VRGRUPTOTALI := NVL(V_VRGRUPTRIBUTI + V_VRGRUPISENTOI + V_VRGRUPOUTROSI, 0);
       V_VRGRUPTOTALF := NVL(V_VRGRUPTRIBUTF + V_VRGRUPISENTOF + V_VRGRUPOUTROSF, 0);

       V_VRTOTTRIBUTI   := V_VRTOTTRIBUTI   + NVL(V_VRGRUPTRIBUTI,0);
       V_VRTOTISENTOI   := V_VRTOTISENTOI   + NVL(V_VRGRUPISENTOI,0);
       V_VRTOTOUTROSI   := V_VRTOTOUTROSI   + NVL(V_VRGRUPOUTROSI,0);
       V_VRTOTTRIBUTF   := V_VRTOTTRIBUTF   + NVL(V_VRGRUPTRIBUTF,0);
       V_VRTOTISENTOF   := V_VRTOTISENTOF   + NVL(V_VRGRUPISENTOF,0);
       V_VRTOTOUTROSF   := V_VRTOTOUTROSF   + NVL(V_VRGRUPOUTROSF,0);

       V_REGESTOQUE := '12'
                       ||TO_CHAR(P_DTINICIAL, 'YYYYMM')
                       ||LPAD(NVL(P_CDINSCESTA,0), 9, '0')
                       ||'I'
                       ||SUBSTR(C_GRUPO_PROD.CDSUBGRPROD, 9, 2)
                       ||LPAD(LTRIM(REPLACE(TO_CHAR(ROUND(NVL(V_VRGRUPTRIBUTI, 0), 2), '9999999999.00'), '.', '')), 12, '0')
                       ||LPAD(LTRIM(REPLACE(TO_CHAR(ROUND(NVL(V_VRGRUPISENTOI, 0), 2), '9999999999.00'), '.', '')), 12, '0')
                       ||LPAD(LTRIM(REPLACE(TO_CHAR(ROUND(NVL(V_VRGRUPOUTROSI, 0), 2), '9999999999.00'), '.', '')), 12, '0')
                       ||LPAD(LTRIM(REPLACE(TO_CHAR(ROUND(NVL(V_VRGRUPTOTALI,  0), 2), '9999999999.00'), '.', '')), 12, '0');
       V_CONTADOR := NVL(V_CONTADOR, 0)+1;
       INSERT INTO ARQMAGNETICO
          (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
       VALUES
          (V_CONTADOR, V_REGESTOQUE, P_NRSEQARQMAG);
       V_REGESTOQUE := '';

       V_REGESTOQUE := '12'
                       ||TO_CHAR(P_DTINICIAL, 'YYYYMM')
                       ||LPAD(NVL(P_CDINSCESTA, 0), 9, '0')
                       ||'F'
                       ||SUBSTR(C_GRUPO_PROD.CDSUBGRPROD, 9, 2)
                       ||LPAD(LTRIM(REPLACE(TO_CHAR(ROUND(NVL(V_VRGRUPTRIBUTF, 0), 2), '9999999999.00'), '.', '')), 12, '0')
                       ||LPAD(LTRIM(REPLACE(TO_CHAR(ROUND(NVL(V_VRGRUPISENTOF, 0), 2), '9999999999.00'), '.', '')), 12, '0')
                       ||LPAD(LTRIM(REPLACE(TO_CHAR(ROUND(NVL(V_VRGRUPOUTROSF, 0), 2), '9999999999.00'), '.', '')), 12, '0')
                       ||LPAD(LTRIM(REPLACE(TO_CHAR(ROUND(NVL(V_VRGRUPTOTALF,  0), 2), '9999999999.00'), '.', '')), 12, '0');
       V_CONTADOR := NVL(V_CONTADOR, 0)+1;
       INSERT INTO ARQMAGNETICO
          (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
       VALUES
          (V_CONTADOR, V_REGESTOQUE, P_NRSEQARQMAG);
       V_REGESTOQUE := '';

       V_VRGRUPTRIBUTI := 0;
       V_VRGRUPISENTOI := 0;
       V_VRGRUPOUTROSI := 0;
       V_VRGRUPTRIBUTI := 0;
       V_VRGRUPISENTOI := 0;
       V_VRGRUPOUTROSI := 0;
   END LOOP;

   V_VRTOTALINICIAL := NVL(V_VRTOTTRIBUTI+V_VRTOTISENTOI+V_VRTOTOUTROSI,0);
   V_VRTOTALFINAL   := NVL(V_VRTOTTRIBUTF+V_VRTOTISENTOF+V_VRTOTOUTROSF,0);

   V_REGESTOQUE := '12'
                   ||TO_CHAR(P_DTINICIAL, 'YYYYMM')
                   ||LPAD(NVL(P_CDINSCESTA,0), 9, '0')
                   ||'I'
                   ||'99'
                   ||LPAD(LTRIM(REPLACE(TO_CHAR(ROUND(NVL(V_VRTOTTRIBUTI, 0), 2), '9999999999.00'), '.', '')), 12, '0')
                   ||LPAD(LTRIM(REPLACE(TO_CHAR(ROUND(NVL(V_VRTOTISENTOI, 0), 2), '9999999999.00'), '.', '')), 12, '0')
                   ||LPAD(LTRIM(REPLACE(TO_CHAR(ROUND(NVL(V_VRTOTOUTROSI, 0), 2), '9999999999.00'), '.', '')), 12, '0')
                   ||LPAD(LTRIM(REPLACE(TO_CHAR(ROUND(NVL(V_VRTOTALINICIAL,  0), 2), '9999999999.00'), '.', '')), 12, '0');
   V_CONTADOR := NVL(V_CONTADOR, 0)+1;
   INSERT INTO ARQMAGNETICO
      (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
   VALUES
      (V_CONTADOR, V_REGESTOQUE, P_NRSEQARQMAG);
   V_REGESTOQUE := '';

   V_REGESTOQUE := '12'
                   ||TO_CHAR(P_DTINICIAL, 'YYYYMM')
                   ||LPAD(NVL(P_CDINSCESTA, 0), 9, '0')
                   ||'F'
                   ||'99'
                   ||LPAD(LTRIM(REPLACE(TO_CHAR(ROUND(NVL(V_VRTOTTRIBUTF, 0), 2), '9999999999.00'), '.', '')), 12, '0')
                   ||LPAD(LTRIM(REPLACE(TO_CHAR(ROUND(NVL(V_VRTOTISENTOF, 0), 2), '9999999999.00'), '.', '')), 12, '0')
                   ||LPAD(LTRIM(REPLACE(TO_CHAR(ROUND(NVL(V_VRTOTOUTROSF, 0), 2), '9999999999.00'), '.', '')), 12, '0')
                   ||LPAD(LTRIM(REPLACE(TO_CHAR(ROUND(NVL(V_VRTOTALFINAL,  0), 2), '9999999999.00'), '.', '')), 12, '0');
   V_CONTADOR := NVL(V_CONTADOR, 0)+1;
   INSERT INTO ARQMAGNETICO
      (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
   VALUES
      (V_CONTADOR, V_REGESTOQUE, P_NRSEQARQMAG);

   RETURN (V_CONTADOR);
END;
/


-- VERSAO --
BEGIN ATUVEROBJ('ARQUIVO_DMA_ESTOQUE','5.30.000'); END;
/

