CREATE OR REPLACE FUNCTION SPED_BLOCOG(
   P_CDEMPRESA   IN EMPRESA.CDEMPRESA%TYPE,
   P_CDINSCESTA  IN INSCRESTAD.CDINSCESTA%TYPE,
   P_DTINICIAL   IN MAPAAPURAC.DTINIPERIODO%TYPE,
   P_DTFINAL     IN MAPAAPURAC.DTINIPERIODO%TYPE,
   P_CDIMPOSTO   IN IMPOSTO.CDIMPOSTO%TYPE,
   P_TOTALIZA    IN NUMBER,
   P_NRSEQARQMAG IN ARQMAGNETICO.NRSEQARQMAG%TYPE,
   P_VERSAO      IN VARCHAR2) RETURN VARCHAR
AS

   V_REGISTRO       VARCHAR2(500);
   V_TPMOV          VARCHAR2(2);
   V_COD_PAR        VARCHAR2(100);
   V_PRODUTO        VARCHAR2(100);
   V_COD_BEM        VARCHAR(100);
   V_COD_CENCUS     VARCHAR(100);
   V_UNID           VARCHAR(100);
   V_CONTREGG       NUMBER;
   V_ULTIMAPARCELA  NUMBER;
   V_QUANTBAIXA     NUMBER;
   V_SEQUPROD       NUMBER;
   DTCAPAOPEBEM     DATE;
   V_PARTICIPANTE   VARCHAR2(50);
   V_UNIDADE        VARCHAR2(100);
BEGIN
   V_SEQUPROD := NVL(P_TOTALIZA,0);

   /*Como o Bloco G trata de aquisicao para o ativo permanente, o valor do FECP sera sempre considerado,
     independente do parametro, por ser entrada, sendo assim nao e necessaria a validacao*/

   /*REGISTRO G110*/
   FOR C_REGG110 IN(SELECT '|G110'                                                                   ||'|'||--01 REG
                           TO_CHAR(P_DTINICIAL,'DDMMYYYY')                                           ||'|'||--02 DT_INI
                           TO_CHAR(P_DTFINAL,'DDMMYYYY')                                             ||'|'||--03 DT_FIN
                           LTRIM(REPLACE(TO_CHAR(SUM(SALDOINI),'9999999999990.00'),'.',','))         ||'|'||--04 SALDO_IN_ICMS
                           LTRIM(REPLACE(TO_CHAR(SUM(VRPARCELACIAP),'9999999999990.00'),'.',','))    ||'|'||--05 SOM_PARC
                           LTRIM(REPLACE(TO_CHAR(SUM(VRSAIDATRIBCIAP),'9999999999990.00'),'.',','))  ||'|'||--06 VL_TRIB_EXP
                           LTRIM(REPLACE(TO_CHAR(SUM(VRSAIDACIAP),'9999999999990.00'),'.',','))      ||'|'||--07 VL_TOTAL
                           LTRIM(REPLACE(TO_CHAR(SUM(ROUND(VRCOEFICIAP,8)),'990.00000000'),'.',',')) ||'|'||--08 IND_PER_SAI ***Verificar > (Campo 06 dividido pelo campo 07)
                           LTRIM(REPLACE(TO_CHAR(ROUND(SUM(VRPARCELACIAP*ROUND(VRCOEFICIAP,8) ),2),'9999999999990.00'),'.',','))  ||'|'||--09 ICMS_APROP ***Verificar > multiplicacao do campo 05 pelo campo 08
                           '0,00'                                                                    ||'|' --10 SOM_ICMS_OC ***Verificar > somatorio do campo 09 do registro G126
                           AS DSARQUMAG
                      FROM (SELECT SUM(SALDOINI) AS SALDOINI, SUM(VRPARCELACIAP) AS VRPARCELACIAP, SUM(VRSAIDATRIBCIAP) AS VRSAIDATRIBCIAP,
                            SUM(VRSAIDACIAP) AS VRSAIDACIAP, SUM(VRCOEFICIAP) AS VRCOEFICIAP, SUM(VRCREDAPROPCIAP) AS VRCREDAPROPCIAP
                              FROM (SELECT 0 AS SALDOINI, PB.VRPARCELACIAP AS VRPARCELACIAP, 0 VRSAIDATRIBCIAP, 0 VRSAIDACIAP, 0 VRCOEFICIAP, 0 VRCREDAPROPCIAP
                           FROM FILIAL F, BEMATIVO BA, PARCELACIAPBEM PB, IMPOSTO IM
                          WHERE F.CDFILIAL      = BA.CDFILIAL
                            AND F.CDEMPRESA     = BA.CDEMPRESA
                            AND BA.CDEMPRESA    = P_CDEMPRESA
                            AND F.CDINSCESTA    = P_CDINSCESTA
                            AND BA.CDEMPRESA    = PB.CDEMPRESA
                            AND BA.CDBEMATIVO   = PB.CDBEMATIVO
                            AND PB.CDIMPOSTO    = IM.CDIMPOSTO
                            AND IM.CDIMPOSTONFE = P_CDIMPOSTO
                            AND TO_CHAR(PB.DTCOMPPARCCIAP,'MMYYYY') = TO_CHAR(P_DTINICIAL,'MMYYYY') 
                         UNION ALL
                         SELECT DISTINCT  0 AS SALDOINI, 0 AS VRPARCELACIAP , CC.VRSAIDATRIBCIAP, CC.VRSAIDACIAP, VRCOEFICIAP,VRCREDAPROPCIAP
                           FROM BEMCONTROLECIAP BC, CONTROLECIAP CC, FILIAL F, BEMATIVO BA
                          WHERE CC.CDEMPRESA       = BC.CDEMPRESA
                            AND CC.CDIMPOSTO       = BC.CDIMPOSTO
                            AND CC.DTCOMPETECIAP   = BC.DTCOMPETECIAP
                            AND CC.IDSITCOMPETCIAP = 'A'
                            AND F.CDFILIAL         = BA.CDFILIAL
                            AND F.CDINSCESTA       = P_CDINSCESTA
                            AND F.CDEMPRESA        = BA.CDEMPRESA         
                            AND BA.CDBEMATIVO      = BC.CDBEMATIVO
                            AND TO_CHAR(CC.DTCOMPETECIAP,'MMYYYY') = TO_CHAR(P_DTINICIAL,'MMYYYY')
                         UNION  ALL
                         /*Saldo inicial para Valor do ICMS de Operacao Propria*/
                         SELECT PC.VRPARCELACIAP AS SALDOINI, 0 AS VRPARCELACIAP, 0 VRSAIDATRIBCIAP,
                                0 VRSAIDACIAP, 0 VRCOEFICIAP, 0 VRCREDAPROPCIAP
                           FROM  PARCELACIAPBEM PC, BEMATIVO BA, BEMCONTROLECIAP CC, IMPOSTO IM , FILIAL F
                          WHERE PC.CDBEMATIVO   = BA.CDBEMATIVO
                            AND PC.CDIMPOSTO    = IM.CDIMPOSTO
                            AND IM.CDIMPOSTONFE = P_CDIMPOSTO
                            AND PC.CDEMPRESA    = P_CDEMPRESA
                            AND BA.DTAQUIBEMATIVO < P_DTINICIAL
                            AND BA.CDBEMATIVO   = CC.CDBEMATIVO
                            AND F.CDFILIAL      = BA.CDFILIAL
                            AND F.CDINSCESTA    = P_CDINSCESTA
                            AND F.CDEMPRESA     = BA.CDEMPRESA
                            AND CC.CDIMPOSTO    = PC.CDIMPOSTO
                            AND CC.CDEMPRESA    = PC.CDEMPRESA
                            AND TO_CHAR(CC.DTCOMPETECIAP,'MMYYYY') = TO_CHAR(P_DTINICIAL,'MMYYYY')
                          UNION ALL
                          /*Saldo inicial para Valor do ICMS de Sub. Tributaria*/
                          SELECT SUM(IT.VRIMPOSTOIT + NVL(IT.VRADICFECP,0)) AS SALDOINI, 0 AS VRPARCELACIAP, 0 VRSAIDATRIBCIAP,
                                 0 VRSAIDACIAP, 0 VRCOEFICIAP, 0 VRCREDAPROPCIAP
                            FROM ITEMPROIMPOS IT, IMPOSTO IM, ITEMPRODUTO I, BEMATIVO BA, PARCELACIAPBEM PB , FILIAL F
                           WHERE I.NRLANCTONF    = IT.NRLANCTONF
                             AND I.CDFILIAL      = IT.CDFILIAL
                             AND I.NRSEQITPROD   = IT.NRSEQITPROD
                             AND IT.CDIMPOSTO    = IM.CDIMPOSTO
                             AND IM.CDIMPOSTONFE = '80'
                             AND NVL(IT.NRITPROIMPOS,1) <> 3
                             AND I.CDPRODUTO(+)  = BA.CDPRODUTO
                             AND I.NRLANCTONF(+) = BA.NRLANCTONF
                             AND I.CDFILIAL(+)   = BA.CDFILIAL
                             AND BA.CDEMPRESA    = PB.CDEMPRESA
                             AND BA.CDBEMATIVO   = PB.CDBEMATIVO
                             AND PB.CDIMPOSTO    = IM.CDIMPOSTO
                             AND PB.CDEMPRESA    = P_CDEMPRESA
                             AND F.CDFILIAL      = BA.CDFILIAL
                             AND F.CDINSCESTA    = P_CDINSCESTA
                             AND F.CDEMPRESA     = BA.CDEMPRESA
                             AND TO_CHAR(PB.DTCOMPPARCCIAP,'MMYYYY') = TO_CHAR(P_DTINICIAL,'MMYYYY')
                             AND BA.DTAQUIBEMATIVO < P_DTINICIAL
                          UNION ALL
                          /*Saldo inicial para Valor do ICMS diferencial de aliquota*/
                          SELECT SUM(IT.VRIMPOSTOIT + NVL(IT.VRADICFECP,0)) AS SALDOINI, 0 AS VRPARCELACIAP, 0 VRSAIDATRIBCIAP,
                                  0 VRSAIDACIAP, 0 VRCOEFICIAP, 0 VRCREDAPROPCIAP
                            FROM ITEMPROIMPOS IT, ITEMPRODUTO I, BEMATIVO BA, PARCELACIAPBEM PB, IMPOSTO IM, FILIAL F
                           WHERE I.NRLANCTONF    = IT.NRLANCTONF
                             AND I.CDFILIAL      = IT.CDFILIAL
                             AND I.NRSEQITPROD   = IT.NRSEQITPROD
                             AND IT.CDIMPOSTO    = IM.CDIMPOSTO
                             AND IM.CDIMPOSTONFE = P_CDIMPOSTO
                             AND NVL(IT.NRITPROIMPOS,1) = 3
                             AND I.CDPRODUTO(+)  = BA.CDPRODUTO
                             AND I.NRLANCTONF(+) = BA.NRLANCTONF
                             AND I.CDFILIAL(+)   = BA.CDFILIAL
                             AND BA.CDEMPRESA    = PB.CDEMPRESA
                             AND BA.CDBEMATIVO   = PB.CDBEMATIVO
                             AND PB.CDIMPOSTO    = IM.CDIMPOSTO
                             AND PB.CDEMPRESA    = P_CDEMPRESA
                             AND F.CDFILIAL      = BA.CDFILIAL
                             AND F.CDINSCESTA    = P_CDINSCESTA
                             AND F.CDEMPRESA     = BA.CDEMPRESA
                             AND TO_CHAR(PB.DTCOMPPARCCIAP,'MMYYYY') = TO_CHAR(P_DTINICIAL,'MMYYYY')
                             AND BA.DTAQUIBEMATIVO < P_DTINICIAL))
                    WHERE  VRPARCELACIAP > 0
                 GROUP BY  TO_CHAR(P_DTINICIAL,'DDMMYYYY'), TO_CHAR(P_DTFINAL,'DDMMYYYY'),'0,00')LOOP

      V_CONTREGG :=  NVL(V_CONTREGG,0) + 1;
      INSERT INTO ARQMAGNETICO
        (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
      VALUES
        ('63'||LPAD(RTRIM(V_CONTREGG), 8, '0'), C_REGG110.DSARQUMAG, P_NRSEQARQMAG);
   END LOOP;

   /*REGISTRO G125*/
   FOR REGG125 IN (SELECT '|G125'                                                                  ||'|'||--01 REG
                          SUBSTR(CDBEMATIVO,1,60)                                                  ||'|'||--02 COD_IND_BEM
                          TO_CHAR(DTMOVIMENTACAO,'DDMMYYYY')                                       ||'|'||--03 DT_MOV
                          TIPO_MOV                                                                 ||'|'||--04 TIPO_MOV
                          LTRIM(REPLACE(TO_CHAR(SUM(NVL(VRIMPOSTPAGOBEM,0)),'9999999999990.00'),'.',',')) ||'|'||--05 VL_IMOB_ICMS_OP /*VALOR DO ICMS NA AQUISICAO CAMPO05*/
                          LTRIM(REPLACE(TO_CHAR(SUM(VRIMPOSTRIB),'9999999999990.00'),'.',','))     ||'|'||--06 VL_IMOB_ICMS_ST /*VALOR DO ICMS ST NA ENTRADA*/
                          LTRIM(REPLACE(TO_CHAR(SUM(ICMS_FRETE),'9999999999990.00'),'.',','))      ||'|'||--07 VL_IMOB_ICMS_FRT
                          LTRIM(REPLACE(TO_CHAR(SUM(VRDIFALIQ),'9999999999990.00'),'.',','))       ||'|'||--08 VL_IMOB_ICMS_DIF
                          LPAD(NRPARCELA,3,'0')                                                    ||'|'||--09 NUM_PARC
                          LTRIM(REPLACE(TO_CHAR(SUM(VRPARCELACIAP),'9999999999990.00'),'.',','))   ||'|'  --10 VL_PARC_PASS
                          AS DSARQUMAG,
                          CDBEMATIVO, NRPARCELA, NRLANCTONF, CDFILIAL, TIPO_MOV, CDPRODUTO,CDCENTCUST, CDFILIALNF
                     FROM (SELECT BA.CDBEMATIVO, 'SI' AS TIPO_MOV, TO_NUMBER(SUBSTR(NRPARCELACIAP,1,INSTR(NRPARCELACIAP,'/')-1)) AS NRPARCELA,
                           PB.VRPARCELACIAP, 0 AS ICMS_FRETE, TO_DATE(P_DTINICIAL) AS DTMOVIMENTACAO, IP.CDFILIAL, BA.NRLANCTONF, BA.CDPRODUTO, BA.CDCENTCUST,BA.CDFILIALNF,
                           (SELECT SUM(PC.VRPARCELACIAP)
                              FROM  PARCELACIAPBEM PC, IMPOSTO IM , FILIAL F
                             WHERE PC.CDBEMATIVO   = BA.CDBEMATIVO
                               AND PC.CDIMPOSTO    = IM.CDIMPOSTO
                               AND IM.CDIMPOSTONFE = P_CDIMPOSTO
                               AND PC.CDEMPRESA    = P_CDEMPRESA
                               AND F.CDFILIAL      = BA.CDFILIAL
                               AND F.CDINSCESTA    = P_CDINSCESTA
                               AND F.CDEMPRESA     = BA.CDEMPRESA
                               AND BA.DTAQUIBEMATIVO < P_DTINICIAL)  AS VRIMPOSTPAGOBEM,
                           (SELECT COUNT(ICP.CDBEMATIVO)
                              FROM CAPAOPERABEM CP, ITCAPAOPERABEM ICP
                             WHERE CP.IDIDENTCAPAOPER IN ('03','04','05')
                               AND CP.IDSIMULFECHABEM   = 'R'
                               AND ICP.CDEMPRESA        = CP.CDEMPRESA
                               AND ICP.NRSEQCAPAOPEBEM  = CP.NRSEQCAPAOPEBEM
                               AND ICP.CDBEMATIVO       = BA.CDBEMATIVO
                               AND DTCAPAOPEBEM         < P_DTINICIAL) AS NRQUANTBAIXA,
                           (SELECT SUM(IT.VRIMPOSTOIT + NVL(IT.VRADICFECP,0))
                              FROM ITEMPROIMPOS IT, IMPOSTO IM, ITEMPRODUTO I, FILIAL F
                             WHERE I.NRLANCTONF    = IT.NRLANCTONF
                               AND I.CDFILIAL      = IT.CDFILIAL
                               AND I.NRSEQITPROD   = IT.NRSEQITPROD
                               AND IT.CDIMPOSTO    = IM.CDIMPOSTO
                               AND IM.CDIMPOSTONFE = '80'
                               AND I.CDPRODUTO(+)  = BA.CDPRODUTO
                               AND I.NRLANCTONF(+) = BA.NRLANCTONF
                               AND I.CDFILIAL(+)   = BA.CDFILIAL
                               AND F.CDFILIAL      = BA.CDFILIAL
                               AND F.CDINSCESTA    = P_CDINSCESTA
                               AND F.CDEMPRESA     = BA.CDEMPRESA
                               AND NVL(IT.NRITPROIMPOS,1) <> 3) AS VRIMPOSTRIB,
                           (SELECT SUM(IT.VRIMPOSTOIT + NVL(IT.VRADICFECP,0))
                              FROM ITEMPROIMPOS IT, IMPOSTO IM, ITEMPRODUTO I , FILIAL F
                             WHERE I.NRLANCTONF    = IT.NRLANCTONF
                               AND I.CDFILIAL      = IT.CDFILIAL
                               AND I.NRSEQITPROD   = IT.NRSEQITPROD
                               AND IT.CDIMPOSTO    = IM.CDIMPOSTO
                               AND IM.CDIMPOSTONFE = '00'
                               AND I.CDPRODUTO(+)  = BA.CDPRODUTO
                               AND I.NRLANCTONF(+) = BA.NRLANCTONF
                               AND I.CDFILIAL(+)   = BA.CDFILIAL
                               AND F.CDFILIAL      = BA.CDFILIAL
                               AND F.CDINSCESTA    = P_CDINSCESTA
                               AND F.CDEMPRESA     = BA.CDEMPRESA
                               AND NVL(IT.NRITPROIMPOS,1) = 3) AS VRDIFALIQ
                           FROM FILIAL F, BEMATIVO BA, PARCELACIAPBEM PB, BEMCONTROLECIAP BC, CONTROLECIAP CC,
                                (SELECT CDPRODUTO,NRLANCTONF,CDFILIAL,MAX(NRSEQITPROD) AS NRSEQITPROD
                                   FROM ITEMPRODUTO
                                  GROUP BY CDPRODUTO, NRLANCTONF, CDFILIAL)IP, IMPOSTO IM
                          WHERE F.CDFILIAL         = BA.CDFILIAL
                            AND F.CDEMPRESA        = BA.CDEMPRESA
                            AND F.CDINSCESTA       = P_CDINSCESTA
                            AND BA.CDEMPRESA       = PB.CDEMPRESA
                            AND BA.CDBEMATIVO      = PB.CDBEMATIVO
                            AND PB.CDIMPOSTO       = IM.CDIMPOSTO
                            AND IM.CDIMPOSTONFE    = P_CDIMPOSTO
                            AND TO_CHAR(PB.DTCOMPPARCCIAP,'MMYYYY') = TO_CHAR(P_DTINICIAL,'MMYYYY')
                            AND BA.DTAQUIBEMATIVO  < P_DTINICIAL
                            AND PB.CDEMPRESA       = CC.CDEMPRESA
                            AND PB.CDIMPOSTO       = CC.CDIMPOSTO
                            AND PB.DTCOMPPARCCIAP  = CC.DTCOMPETECIAP
                            AND CC.IDSITCOMPETCIAP = 'A'
                            AND CC.CDIMPOSTO       = BC.CDIMPOSTO
                            AND BA.CDEMPRESA       = BC.CDEMPRESA
                            AND BA.CDBEMATIVO      = BC.CDBEMATIVO
                            AND BC.DTCOMPETECIAP   = CC.DTCOMPETECIAP
                            AND IP.CDPRODUTO(+)    = BA.CDPRODUTO
                            AND IP.NRLANCTONF(+)   = BA.NRLANCTONF
                            AND IP.CDFILIAL(+)     = BA.CDFILIAL
                            AND PB.VRPARCELACIAP > 0
                    UNION ALL
                    SELECT BA.CDBEMATIVO, 'IM' AS TIPO_MOV, TO_NUMBER(SUBSTR(NRPARCELACIAP,1,INSTR(NRPARCELACIAP,'/')-1)) AS NRPARCELA,
                           PB.VRPARCELACIAP, 0 AS ICMS_FRETE, DTAQUIBEMATIVO AS DTMOVIMENTACAO, IP.CDFILIAL, BA.NRLANCTONF,BA.CDPRODUTO,BA.CDCENTCUST,BA.CDFILIALNF,
                           (SELECT SUM(PC.VRPARCELACIAP)
                              FROM PARCELACIAPBEM PC , FILIAL F
                             WHERE PC.CDBEMATIVO = PB.CDBEMATIVO
                               AND PC.CDBEMATIVO = BA.CDBEMATIVO
                               AND PC.CDIMPOSTO  = PB.CDIMPOSTO
                               AND PC.CDEMPRESA  = PB.CDEMPRESA
                               AND F.CDFILIAL      = BA.CDFILIAL
                               AND F.CDEMPRESA     = BA.CDEMPRESA
                               AND F.CDINSCESTA    = P_CDINSCESTA
                               AND TO_CHAR(BA.DTAQUIBEMATIVO,'MMYYYY') = TO_CHAR(P_DTINICIAL,'MMYYYY'))  AS VRIMPOSTPAGOBEM,
                           (SELECT COUNT(ICP.CDBEMATIVO)
                              FROM CAPAOPERABEM CP, ITCAPAOPERABEM ICP
                             WHERE CP.IDIDENTCAPAOPER IN ('03','04','05')
                               AND CP.IDSIMULFECHABEM   = 'R'
                               AND ICP.CDEMPRESA        = CP.CDEMPRESA
                               AND ICP.NRSEQCAPAOPEBEM  = CP.NRSEQCAPAOPEBEM
                               AND ICP.CDBEMATIVO       = BA.CDBEMATIVO
                               AND DTCAPAOPEBEM         < P_DTINICIAL) AS NRQUANTBAIXA,
                           (SELECT SUM(IT.VRIMPOSTOIT + NVL(IT.VRADICFECP,0))
                              FROM ITEMPROIMPOS IT, IMPOSTO IM, ITEMPRODUTO I , FILIAL F
                             WHERE I.NRLANCTONF    = IT.NRLANCTONF
                               AND I.CDFILIAL      = IT.CDFILIAL
                               AND I.NRSEQITPROD   = IT.NRSEQITPROD
                               AND IT.CDIMPOSTO    = IM.CDIMPOSTO
                               AND IM.CDIMPOSTONFE = '80'
                               AND IT.CDFISCALIT   = '1'
                               AND I.CDPRODUTO(+)  = BA.CDPRODUTO
                               AND I.NRLANCTONF(+) = BA.NRLANCTONF
                               AND I.CDFILIAL (+)  = BA.CDFILIAL
                               AND F.CDFILIAL      = BA.CDFILIAL
                               AND F.CDINSCESTA    = P_CDINSCESTA
                               AND F.CDEMPRESA     = BA.CDEMPRESA
                               AND NVL(IT.NRITPROIMPOS,'1') <> '3') AS VRIMPOSTRIB,
                           (SELECT SUM(IT.VRIMPOSTOIT + NVL(IT.VRADICFECP,0))
                              FROM ITEMPROIMPOS IT, IMPOSTO IM, ITEMPRODUTO I, FILIAL F
                             WHERE I.NRLANCTONF    = IT.NRLANCTONF
                               AND I.CDFILIAL      = IT.CDFILIAL
                               AND I.NRSEQITPROD   = IT.NRSEQITPROD
                               AND IT.CDIMPOSTO    = IM.CDIMPOSTO
                               AND IM.CDIMPOSTO    = '00'
                               AND IT.CDFISCALIT   = '1'
                               AND I.CDPRODUTO(+)  = BA.CDPRODUTO
                               AND I.NRLANCTONF(+) = BA.NRLANCTONF
                               AND I.CDFILIAL (+)  = BA.CDFILIAL
                               AND F.CDFILIAL      = BA.CDFILIAL
                               AND F.CDEMPRESA     = BA.CDEMPRESA
                               AND F.CDINSCESTA    = P_CDINSCESTA
                               AND NVL(IT.NRITPROIMPOS,'1') = '3') AS VRDIFALIQ
                           FROM FILIAL F, BEMATIVO BA, PARCELACIAPBEM PB, BEMCONTROLECIAP BC, CONTROLECIAP CC,
                                (SELECT CDPRODUTO,NRLANCTONF,CDFILIAL,MAX(NRSEQITPROD) AS NRSEQITPROD
                                   FROM ITEMPRODUTO
                                  GROUP BY CDPRODUTO, NRLANCTONF, CDFILIAL)IP, IMPOSTO IM
                          WHERE F.CDFILIAL            = BA.CDFILIAL
                            AND F.CDINSCESTA          = P_CDINSCESTA
                            AND F.CDEMPRESA           = BA.CDEMPRESA
                            AND BA.CDEMPRESA          = PB.CDEMPRESA
                            AND BA.CDBEMATIVO         = PB.CDBEMATIVO
                            AND PB.CDIMPOSTO          = IM.CDIMPOSTO
                            AND IM.CDIMPOSTONFE       = P_CDIMPOSTO
                            AND TO_CHAR(PB.DTCOMPPARCCIAP,'MMYYYY') = TO_CHAR(P_DTINICIAL,'MMYYYY')
                            AND TO_CHAR(BA.DTAQUIBEMATIVO,'MMYYYY') = TO_CHAR(P_DTINICIAL,'MMYYYY')
                            AND PB.CDEMPRESA          = CC.CDEMPRESA
                            AND PB.CDIMPOSTO          = CC.CDIMPOSTO
                            AND PB.DTCOMPPARCCIAP     = CC.DTCOMPETECIAP
                            AND CC.IDSITCOMPETCIAP    = 'A'
                            AND CC.CDIMPOSTO          = BC.CDIMPOSTO
                            AND BA.CDEMPRESA          = BC.CDEMPRESA
                            AND BA.CDBEMATIVO         = BC.CDBEMATIVO
                            AND BC.DTCOMPETECIAP      = CC.DTCOMPETECIAP
                            AND IP.CDPRODUTO(+)       = BA.CDPRODUTO
                            AND IP.NRLANCTONF(+)      = BA.NRLANCTONF
                            AND IP.CDFILIAL (+)       = BA.CDFILIAL
                            AND TO_CHAR(BA.DTAQUIBEMATIVO,'MMYYYY') = TO_CHAR(P_DTINICIAL,'MMYYYY'))B
                   WHERE NVL(NRQUANTBAIXA,0) = 0
                    GROUP BY CDBEMATIVO,DTMOVIMENTACAO,TIPO_MOV, NRPARCELA,NRLANCTONF, CDFILIAL, CDPRODUTO,CDCENTCUST,CDFILIALNF)LOOP
      V_CONTREGG :=  NVL(V_CONTREGG,0) + 1;
      INSERT INTO ARQMAGNETICO
        (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
      VALUES
        ('64'||LPAD(RTRIM(V_CONTREGG), 8, '0'), REGG125.DSARQUMAG, P_NRSEQARQMAG);

     /*PREENCHE O REGISTRO G125 PARA O TIPO BAIXA - BA NO CASO DE SER A ULTIMA PARCELA A SER APROPRIADA*/
      BEGIN
         SELECT MAX(TO_NUMBER(SUBSTR(NRPARCELACIAP,1,INSTR(NRPARCELACIAP,'/')-1))) AS NRPARCELA
           INTO V_ULTIMAPARCELA
           FROM PARCELACIAPBEM
          WHERE CDBEMATIVO = REGG125.CDBEMATIVO;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_ULTIMAPARCELA:= 0;
      END;
      V_REGISTRO:= NULL;
      IF  REGG125.NRPARCELA = V_ULTIMAPARCELA THEN
         V_REGISTRO:= '|G125'                        ||'|'||
                      SUBSTR(REGG125.CDBEMATIVO,1,60)||'|'||
                      TO_CHAR(P_DTINICIAL,'DDMMYYYY')||'|'||
                      'BA'                           ||'|'||
                      ''                             ||'|'||/*VALOR DO ICMS NA AQUISICAO CAMPO 05*/
                      ''                             ||'|'||/*VALOR DO ICMS ST NA ENTRADA*/
                      ''                             ||'|'||
                      ''                             ||'|'||
                      ''                             ||'|'||
                      ''                             ||'|';
         V_CONTREGG :=  NVL(V_CONTREGG,0) + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           ('64'||LPAD(RTRIM(V_CONTREGG), 8, '0'), V_REGISTRO, P_NRSEQARQMAG);
      END IF;

      /*PREENCHE O REGISTRO G125 PARA O TIPO AT - NO CASO DE TRANSFERENCIA OU ALIENACAO*/
      V_REGISTRO:= NULL;
      BEGIN
         SELECT MAX(QUANTBAIXA), MAX(DTCAPAOPEBEM)
           INTO V_QUANTBAIXA, DTCAPAOPEBEM
           FROM (SELECT COUNT(ICP.CDBEMATIVO)AS QUANTBAIXA, DTCAPAOPEBEM
           FROM CAPAOPERABEM CP, ITCAPAOPERABEM ICP
          WHERE (CP.IDIDENTCAPAOPER  = '03' OR CP.IDIDENTCAPAOPER = '04')
            AND CP.IDSIMULFECHABEM   = 'R'
            AND ICP.CDEMPRESA        = CP.CDEMPRESA
            AND ICP.NRSEQCAPAOPEBEM  = CP.NRSEQCAPAOPEBEM
            AND ICP.CDBEMATIVO       = REGG125.CDBEMATIVO
            AND TO_CHAR(DTCAPAOPEBEM,'MMYYYY') = TO_CHAR(P_DTINICIAL,'MMYYYY')
          GROUP BY DTCAPAOPEBEM);
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_QUANTBAIXA:=0;
            DTCAPAOPEBEM:= NULL;
      END;
      V_TPMOV := NULL;
      IF  V_QUANTBAIXA > 0 THEN
         V_REGISTRO:= '|G125'                         ||'|'||
                      SUBSTR(REGG125.CDBEMATIVO,1,60) ||'|'||
                      TO_CHAR(DTCAPAOPEBEM,'DDMMYYYY')||'|'||
                      'AT'                            ||'|'||
                      ''                              ||'|'||/*VALOR DO ICMS NA AQUISICAO CAMPO 05*/
                      ''                              ||'|'||/*VALOR DO ICMS ST NA ENTRADA*/
                      ''                              ||'|'||
                      ''                              ||'|'||
                      ''                              ||'|'||
                      ''                              ||'|';
         V_TPMOV := 'AT';
         V_CONTREGG :=  NVL(V_CONTREGG,0) + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           ('64'||LPAD(RTRIM(V_CONTREGG), 8, '0'), V_REGISTRO, P_NRSEQARQMAG);
      END IF;
      V_QUANTBAIXA:= NULL;
      DTCAPAOPEBEM:= NULL;
      /*PREENCHE O REGISTRO G125 PARA O TIPO OT - OUTRAS SAIDAS DO IMOBILIZADO*/
      BEGIN
         SELECT MAX(QUANTBAIXA), MAX(DTCAPAOPEBEM)
           INTO V_QUANTBAIXA, DTCAPAOPEBEM
           FROM (SELECT COUNT(ICP.CDBEMATIVO) AS QUANTBAIXA, DTCAPAOPEBEM
           FROM CAPAOPERABEM CP, ITCAPAOPERABEM ICP
          WHERE CP.IDIDENTCAPAOPER   = '05'
            AND CP.IDSIMULFECHABEM   = 'R'
            AND ICP.CDEMPRESA        = CP.CDEMPRESA
            AND ICP.NRSEQCAPAOPEBEM  = CP.NRSEQCAPAOPEBEM
            AND ICP.CDBEMATIVO       = REGG125.CDBEMATIVO
            AND TO_CHAR(DTCAPAOPEBEM,'MMYYYY') = TO_CHAR(P_DTINICIAL,'MMYYYY')
          GROUP BY DTCAPAOPEBEM);
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_QUANTBAIXA:=0;
            DTCAPAOPEBEM:= NULL;
      END;
      IF V_QUANTBAIXA > 0 THEN
         V_REGISTRO:= '|G125'                         ||'|'||
                      SUBSTR(REGG125.CDBEMATIVO,1,60) ||'|'||
                      TO_CHAR(DTCAPAOPEBEM,'DDMMYYYY')||'|'||
                      'OT'                            ||'|'||
                      ''                              ||'|'||/*VALOR DO ICMS NA AQUISICAO CAMPO 05*/
                      ''                              ||'|'||/*VALOR DO ICMS ST NA ENTRADA*/
                      ''                              ||'|'||
                      ''                              ||'|'||
                      ''                              ||'|'||
                      ''                              ||'|';
         V_CONTREGG:=  NVL(V_CONTREGG,0) + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           ('64'||LPAD(RTRIM(V_CONTREGG), 8, '0'), V_REGISTRO, P_NRSEQARQMAG);
         V_TPMOV:= 'OT';
      END IF;

      /* CODIGO DO BEM 0300 */
      SELECT MAX(CDCHAVEREG)
        INTO V_COD_BEM
        FROM TMP_REGDADOSSPED
       WHERE CDCHAVEREG = REGG125.CDBEMATIVO
         AND CDREGISTRO = '0300';

      IF (V_COD_BEM IS NULL) AND (REGG125.CDBEMATIVO IS NOT NULL) THEN
         V_SEQUPROD := NVL(V_SEQUPROD,0) + 1;
         INSERT INTO TMP_REGDADOSSPED
            (CDREGISTRO, CDCONTREGI, CDCHAVEREG, CDCAMPO1,CDCAMPO2,CDCAMPO3)
         VALUES
           ('0300', V_SEQUPROD, REGG125.CDBEMATIVO, P_CDIMPOSTO, REGG125.CDPRODUTO,REGG125.CDCENTCUST);
      END IF;

      /* CODIGO DO CENTRO DE CUSTO 0600 */
      SELECT MAX(CDCHAVEREG)
        INTO V_COD_CENCUS
        FROM TMP_REGDADOSSPED
       WHERE CDCHAVEREG = REGG125.CDCENTCUST
         AND CDREGISTRO = '0600';

      IF (V_COD_CENCUS IS NULL) AND (REGG125.CDCENTCUST IS NOT NULL) THEN
         V_SEQUPROD := NVL(V_SEQUPROD,0) + 1;
         INSERT INTO TMP_REGDADOSSPED
            (CDREGISTRO, CDCONTREGI, CDCHAVEREG)
         VALUES
           ('0600', V_SEQUPROD, REGG125.CDCENTCUST);
      END IF;

      /*REGISTRO G130 PARA O TIPO DE MOVIMENTACAO - NOTA FISCAL DA MOVIMENTACAO*/
      FOR C_REGG130 IN (SELECT '|G130'      ||'|'||--01 REG
                               IND_EMIT     ||'|' AS PARTE_1, --02 IND_EMIT
                               --REPLACE(REPLACE(REPLACE(REPLACE(COD_PART,'.'),'-'),'/'),' ') ||'|'||--03 COD_PART Calculado depois
                               CDMODDOCFISC ||'|'||--04 COD_MOD
                               SERIE        ||'|'||--05 SERIE
                               NRNOTAFISC   ||'|'||--06 NUM_DOC
                               NRACESSONFE  ||'|'||--07 CHV_NFE_CTE
                               TO_CHAR(DTEMISSAO,'DDMMYYYY')||'|'||--08 DT_DOC
                               CASE WHEN P_VERSAO >= '014' THEN NRDOCARRECAD ||'|' ELSE '' END --09 NUM_DA
                               AS DSARQUMAG, NRLANCTONF, CDFILIAL, COD_PART
                        FROM (SELECT DECODE(N.IDENTRSAIDOP,'E','1','0') AS IND_EMIT,
                                DECODE(NVL(N.IDORIGDESTNF,DECODE(N.IDENTRSAIDOP,'E','F','C')),'C','C'||N.CDCLIENTE,'F','F'||N.CDFORNECED,'L',DECODE(N.IDENTRSAIDOP,'E','L'||N.CDFILIEMIT,'L'||N.CDFILIRECE)) AS COD_PART,
                                N.CDMODDOCFISC, DECODE(N.IDENTRSAIDOP,'E',NVL(SE.CDSERIEENTRNFE,N.CDSERIEENTR), NVL(SS.CDSERIENFE,N.CDSERIE)) AS SERIE, SUBSTR(LPAD(N.NRNOTAFISC,10,'0'),5,6) AS NRNOTAFISC,
                                DECODE(N.IDENTRSAIDOP,'S',N.NRACESSONFE,'') AS NRACESSONFE, N.DTEMISSAO, N.NRLANCTONF, N.CDFILIAL, N.NRDOCARRECAD
                           FROM NOTAFISCAL N,SERIEENTR SE, SERIENF SS
                          WHERE N.NRLANCTONF = REGG125.NRLANCTONF
                            AND SE.CDSERIEENTR(+) = N.CDSERIEENTR
                            AND SS.CDEMPRESA(+)   = N.CDEMPRESA
                            AND SS.CDINSCESTA(+)  = N.CDINSCESTA
                            AND SS.CDINSCMUNI(+)  = N.CDINSCMUNI
                            AND SS.CDSERIE(+)     = N.CDSERIE
                            AND REGG125.TIPO_MOV = 'IM'
                          UNION
                          SELECT DECODE(N.IDENTRSAIDOP,'E','1','0') AS IND_EMIT,
                                 DECODE(NVL(N.IDORIGDESTNF,DECODE(N.IDENTRSAIDOP,'E','F','C')),'C','C'||N.CDCLIENTE,'F','F'||N.CDFORNECED,'L',DECODE(N.IDENTRSAIDOP,'E','L'||N.CDFILIEMIT,'L'||N.CDFILIRECE)) AS COD_PART,
                                 N.CDMODDOCFISC, DECODE(N.IDENTRSAIDOP,'E',NVL(SE.CDSERIEENTRNFE,N.CDSERIEENTR), NVL(SS.CDSERIENFE,N.CDSERIE)) AS SERIE, SUBSTR(LPAD(N.NRNOTAFISC,10,'0'),5,6) AS NRNOTAFISC,
                                 DECODE(N.IDENTRSAIDOP,'S',N.NRACESSONFE,'') AS NRACESSONFE, N.DTEMISSAO, N.NRLANCTONF, N.CDFILIAL, N.NRDOCARRECAD
                            FROM CAPAOPERABEM CP, ITCAPAOPERABEM ICP, NOTAFISCAL N, SERIEENTR SE, SERIENF SS
                           WHERE (CP.IDIDENTCAPAOPER = '03' OR CP.IDIDENTCAPAOPER = '04')
                             AND CP.IDSIMULFECHABEM  = 'R'
                             AND SE.CDSERIEENTR(+) = N.CDSERIEENTR
                             AND SS.CDEMPRESA(+)   = N.CDEMPRESA
                             AND SS.CDINSCESTA(+)  = N.CDINSCESTA
                             AND SS.CDINSCMUNI(+)  = N.CDINSCMUNI
                             AND SS.CDSERIE(+)     = N.CDSERIE
                             AND ICP.CDEMPRESA       = CP.CDEMPRESA
                             AND ICP.NRSEQCAPAOPEBEM = CP.NRSEQCAPAOPEBEM
                             AND ICP.CDBEMATIVO      = REGG125.CDBEMATIVO
                             AND ICP.NRLANCTONF      = N.NRLANCTONF
                             AND ICP.CDFILIALNF      = N.CDFILIAL
                             AND TO_CHAR(DTCAPAOPEBEM,'MMYYYY') = TO_CHAR(P_DTINICIAL,'MMYYYY')
                             AND NVL(V_TPMOV,'IM')   =  'AT'))LOOP

        V_COD_PAR:= NULL;
        V_PARTICIPANTE := '';
        /* CODIGO DO PARTICIPANTE */
        SELECT MAX(CDCHAVEREG)
          INTO V_COD_PAR
          FROM TMP_REGDADOSSPED
         WHERE CDCHAVEREG = C_REGG130.COD_PART
           AND CDREGISTRO = '0150';

         IF (V_COD_PAR IS NULL) AND (C_REGG130.COD_PART IS NOT NULL) THEN
            V_PARTICIPANTE := RETORNA_PARTICIPANTE_SPED(C_REGG130.COD_PART);
            IF V_PARTICIPANTE IS NULL THEN
               V_SEQUPROD := NVL(V_SEQUPROD,0) + 1;
               INSERT INTO TMP_REGDADOSSPED
                 (CDREGISTRO, CDCONTREGI, CDCHAVEREG)
               VALUES
                 ('0150', V_SEQUPROD, C_REGG130.COD_PART);
            END IF;
         END IF;

         V_PARTICIPANTE := REPLACE(REPLACE(REPLACE(REPLACE(NVL(V_PARTICIPANTE,C_REGG130.COD_PART),'.'),'-'),'/'),' ')||'|';

         V_CONTREGG:=  NVL(V_CONTREGG,0) + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           ('64'||LPAD(RTRIM(V_CONTREGG), 8, '0'), C_REGG130.PARTE_1||V_PARTICIPANTE||C_REGG130.DSARQUMAG, P_NRSEQARQMAG);

         /*REGISTRO G140 - ITEM DO DOCUMENTO FISCAL*/
         FOR C_REGG140 IN (SELECT '|G140'                     ||'|'||--01 REG
                                  SUBSTR(IP.NRSEQITPROD,2,3)  ||'|'||--02 NUM_ITEM
                                  PR.CDARVPROD                ||'|'||--03 COD_ITEM
                                  CASE WHEN P_VERSAO >= '014' THEN
                                     REPLACE(LTRIM(TO_CHAR(ROUND(IP.QTITEMPROD,3), '999999999990.000')), '.', ',') ||'|'
                                  ELSE '' END --04 QTDE
                                    AS PARTE1,
                                    --05 UNID  calculado abaixo a partir de versao 014
                                  REPLACE(LTRIM(TO_CHAR(ROUND(VALOR_IMPOSTO_ITEM_NFE(IP.CDFILIAL, IP.NRLANCTONF, IP.NRSEQITPROD, '00', 'I','1'),2), '999999999990.00')), '.', ',') ||'|'||--06 VL_ICMS_OP_APLICADO
                                  REPLACE(LTRIM(TO_CHAR(ROUND(VALOR_IMPOSTO_ITEM_NFE(IP.CDFILIAL, IP.NRLANCTONF, IP.NRSEQITPROD, '80', 'I','1'),2), '999999999990.00')), '.', ',') ||'|'||--07 VL_ICMS_ST_APLICADO
                                  '0,00' ||'|'||--08 VL_ICMS_FRT_APLICADO
                                  REPLACE(LTRIM(TO_CHAR(ROUND(VALOR_IMPOSTO_ITEM_NFE(IP.CDFILIAL, IP.NRLANCTONF, IP.NRSEQITPROD, '00', 'I','','3'),2), '999999999990.00')), '.', ',') ||'|'--09 VL_ICMS_DIF_APLICADO
                                  AS DSARQUMAG,
                                  PR.CDPRODUTO, PR.SGUNIDADE,
                                  IP.CDPRODNCMTRANS AS CDCLASFISC, PR.VRFATOCONV
                             FROM ITEMPRODUTO IP, PRODUTO PR
                            WHERE IP.NRLANCTONF = C_REGG130.NRLANCTONF
                              AND IP.CDFILIAL   = C_REGG130.CDFILIAL
                              AND IP.CDPRODUTO  = PR.CDPRODUTO
                              AND PR.CDPRODUTO  = REGG125.CDPRODUTO
                            ORDER BY IP.NRSEQITPROD)LOOP

            /* UNIDADE DE MEDIDA */
            V_UNIDADE := C_REGG140.SGUNIDADE;

            /* UNIDADE DE MEDIDA */
            SELECT MAX(CDCHAVEREG)
              INTO V_UNID
              FROM TMP_REGDADOSSPED
             WHERE CDCHAVEREG = V_UNIDADE
               AND CDREGISTRO = '0190';

            IF (V_UNID IS NULL) AND (V_UNIDADE IS NOT NULL) THEN
               V_SEQUPROD := NVL(V_SEQUPROD,0) + 1;
               INSERT INTO TMP_REGDADOSSPED
                 (CDREGISTRO, CDCONTREGI, CDCAMPO1, CDCAMPO2, CDCAMPO3, CDCHAVEREG)
               VALUES
                 ('0190', V_SEQUPROD, C_REGG140.SGUNIDADE, C_REGG140.VRFATOCONV, SUBSTR(V_UNIDADE,LENGTH(C_REGG140.SGUNIDADE)+1,LENGTH(V_UNIDADE)), V_UNIDADE);
            END IF;
            V_UNID := NULL;

            V_CONTREGG:=  NVL(V_CONTREGG,0) + 1;
            INSERT INTO ARQMAGNETICO
              (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
            VALUES
              ('64'||LPAD(RTRIM(V_CONTREGG), 8, '0'), C_REGG140.PARTE1||CASE WHEN P_VERSAO >= '014' THEN V_UNIDADE||'|'||C_REGG140.DSARQUMAG ELSE '' END, P_NRSEQARQMAG);

            /* CODIGO DO PRODUTO */
            SELECT MAX(CDCHAVEREG)
              INTO V_PRODUTO
             FROM TMP_REGDADOSSPED
            WHERE CDCHAVEREG = C_REGG140.CDPRODUTO
              AND CDREGISTRO = '0200';
            IF (V_PRODUTO IS NULL) AND (C_REGG140.CDPRODUTO IS NOT NULL) THEN
               V_SEQUPROD := NVL(V_SEQUPROD,0) + 1;
               INSERT INTO TMP_REGDADOSSPED
                  (CDREGISTRO, CDCONTREGI, CDCHAVEREG, CDCAMPO3)
               VALUES
                  ('0200', V_SEQUPROD, C_REGG140.CDPRODUTO, C_REGG140.CDCLASFISC);
            END IF;
         END LOOP;
      END LOOP;
   END LOOP;

   /*ABERTURA DO BLOCO G*/
   IF NVL(V_CONTREGG,0) > 0 THEN
      V_REGISTRO:= '|G001|0|';
   ELSE
      V_REGISTRO:= '|G001|1|';
   END IF;
   V_CONTREGG:=  NVL(V_CONTREGG,0) + 1;
   INSERT INTO ARQMAGNETICO
     (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
   VALUES
     ('62'||LPAD(RTRIM(V_CONTREGG), 8, '0'), V_REGISTRO, P_NRSEQARQMAG);

   /*ENCERRAMENTO DO BLOCO G*/
   V_CONTREGG:=  NVL(V_CONTREGG,0) + 1;
   INSERT INTO ARQMAGNETICO
     (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
   VALUES
     ('69'||LPAD(RTRIM(V_CONTREGG), 8, '0'), '|G990|'||TO_CHAR(V_CONTREGG)||'|', P_NRSEQARQMAG);

   RETURN(LPAD(TO_CHAR(NVL(V_CONTREGG,0)),10, '0')||LPAD(TO_CHAR(NVL(V_SEQUPROD,0)),10, '0'));
END;
/