CREATE OR REPLACE PROCEDURE SPED_CONTABIL_LANCAMENTO (
   P_NRSEQARQMAG  IN ARQMAGNETICO.NRSEQARQMAG%TYPE,
   P_CDEMPRESA    IN EMPRESA.CDEMPRESA%TYPE,
   P_DTINICIAL    IN DATE,
   P_DTFINAL      IN DATE,
   P_NRINIORDENA  IN INTEGER,
   P_IDSPED       IN VARCHAR2, /* PARAMETRO QUE DEFINE SE SERA GERADO SPED OU FCONT */
   P_PERIODO      IN VARCHAR2,
   P_LIVRO        IN VARCHAR2,
   P_NRORDREGARQ  OUT INTEGER)
IS
   V_NRORDREGARQ INTEGER;
   V_AUXILIAR    VARCHAR2(200);
   V_CONTREFE    VARCHAR2(20);
   V_DATAINICIAL DATE;
   V_DATAFINAL DATE;
   V_PERIODO INT;
   V_QTTRIMESTE FLOAT;
   V_LIVRO VARCHAR2(01);
   V_RAZAO NUMBER;
   V_REGISTRO VARCHAR2(1000);
   V_CONTACAMPO NUMBER;
   V_ANO NUMBER;
   V_RETORNO VARCHAR2(100);
   V_COUNTQUEBRA NUMBER;

BEGIN
   V_LIVRO := P_LIVRO;
   V_ANO := TO_NUMBER(TO_CHAR(P_DTFINAL, 'YYYY'));
   V_NRORDREGARQ := P_NRINIORDENA;

   IF (P_IDSPED = 'S') THEN
      IF V_LIVRO <> 'Z' THEN
         V_DATAINICIAL := P_DTINICIAL;
         V_PERIODO := 0;
         IF P_PERIODO = 'T' THEN
            V_DATAFINAL := LAST_DAY(ADD_MONTHS(V_DATAINICIAL, 2));
         ELSE
            V_DATAFINAL := P_DTFINAL;
         END IF;
         BEGIN
         SELECT MONTHS_BETWEEN(TO_DATE(P_DTFINAL), TO_DATE(P_DTINICIAL)-1)/3
           INTO V_QTTRIMESTE
           FROM DUAL;
         EXCEPTION
              WHEN NO_DATA_FOUND THEN
              V_QTTRIMESTE := 0;
         END;
         WHILE V_PERIODO < V_QTTRIMESTE LOOP
            IF V_ANO <= 2017 THEN
               FOR C_I200 IN (
                  SELECT DSLINHA
                    FROM (SELECT L.NRLANCCONT,
                                 '0000' AS NRSEQLANC,
                                 '|I200|'||
                                 L.NRLANCCONT||'|'||
                                 TO_CHAR(L.DTLANCCONT,'DDMMYYYY')||'|'||
                                 REPLACE(LTRIM(TO_CHAR(NVL(SUM(ROUND(L.VRLANCAMENT,2)),0), '9999999999990.00')),'.',',')||'|'||
                                 'N|' AS DSLINHA
                            FROM LANCCONT L, CONTCTBL C
                           WHERE (L.CDEMPRESA = P_CDEMPRESA)
                             AND (L.DTLANCCONT BETWEEN V_DATAINICIAL AND V_DATAFINAL)
                             AND (L.VRLANCAMENT > 0)
                             AND (C.CDCONTCTBL = L.CDCONTCTBL)
                             AND (C.IDCONTCCUS <> 'R')
                             AND NOT EXISTS (SELECT 1
                                               FROM LANCCONT LC
                                              WHERE L.NRLANCCONT = LC.NRLANCCONT
                                                AND L.CDEMPRESA = LC.CDEMPRESA
                                                AND LC.DTLANCCONT = V_DATAFINAL
                                                AND LC.IDLANCINTE IN ('T', 'F'))
                           GROUP BY NRLANCCONT, DTLANCCONT
                          UNION ALL
                          SELECT NRLANCCONT,
                                 NRSEQLANC,
                                 '|I250|'||
                                 L.CDCONTCTBL||'||'||
                                 REPLACE(LTRIM(TO_CHAR(NVL(ABS(ROUND(VRLANCAMENT,2)),0), '9999999999990.00')),'.',',')||'|'||
                                 DECODE(VRLANCAMENT, ABS(VRLANCAMENT), 'C', 'D')||'||'||
                                 '|'||
                                 RETIRA_CARACTER_ESPECIAL(DSHISTLANC,'S')||'||' AS DSLINHA
                            FROM LANCCONT L, CONTCTBL C
                           WHERE L.CDEMPRESA = P_CDEMPRESA
                             AND (L.DTLANCCONT BETWEEN V_DATAINICIAL AND V_DATAFINAL)
                             AND (C.CDCONTCTBL = L.CDCONTCTBL)
                             AND (C.IDCONTCCUS <> 'R')
                             AND NOT EXISTS (SELECT 1
                                               FROM LANCCONT LC
                                              WHERE L.NRLANCCONT = LC.NRLANCCONT
                                                AND L.CDEMPRESA = LC.CDEMPRESA
                                                AND LC.DTLANCCONT = V_DATAFINAL
                                                AND LC.IDLANCINTE IN ('T', 'F'))) L
                  ORDER BY L.NRLANCCONT, L.NRSEQLANC) LOOP
                  V_NRORDREGARQ := V_NRORDREGARQ + 1;
                  INSERT INTO ARQMAGNETICO
                    (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
                  VALUES
                    (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_I200.DSLINHA, P_NRSEQARQMAG);

               END LOOP;

               FOR C_I200_ENCERRAMENTO IN (
                  SELECT DSLINHA
                    FROM (SELECT L.NRLANCCONT,
                                 '0000' AS NRSEQLANC,
                                 '|I200|'||
                                 L.NRLANCCONT||'|'||
                                 TO_CHAR(L.DTLANCCONT,'DDMMYYYY')||'|'||
                                 REPLACE(LTRIM(TO_CHAR(NVL(SUM(ROUND(L.VRLANCAMENT,2)),0), '9999999999990.00')),'.',',')||'|'||
                                 'E|' AS DSLINHA
                            FROM LANCCONT L, CONTCTBL C
                           WHERE (L.CDEMPRESA = P_CDEMPRESA)
                             AND (L.VRLANCAMENT > 0)
                             AND (C.CDCONTCTBL = L.CDCONTCTBL)
                             AND (C.IDCONTCCUS <> 'R')
                             AND L.DTLANCCONT = V_DATAFINAL
                             AND L.IDLANCINTE IN ('T', 'F')
                           GROUP BY NRLANCCONT, DTLANCCONT
                          UNION ALL
                          SELECT NRLANCCONT,
                                 NRSEQLANC,
                                 '|I250|'||
                                 L.CDCONTCTBL||'||'||
                                 REPLACE(LTRIM(TO_CHAR(NVL(ABS(ROUND(VRLANCAMENT,2)),0), '9999999999990.00')),'.',',')||'|'||
                                 DECODE(VRLANCAMENT, ABS(VRLANCAMENT), 'C', 'D')||'||'||
                                 '|'||
                                 RETIRA_CARACTER_ESPECIAL(DSHISTLANC,'S')||'||' AS DSLINHA
                            FROM LANCCONT L, CONTCTBL C
                           WHERE L.CDEMPRESA = P_CDEMPRESA
                             AND (C.CDCONTCTBL = L.CDCONTCTBL)
                             AND (C.IDCONTCCUS <> 'R')
                             AND L.DTLANCCONT = V_DATAFINAL
                             AND L.IDLANCINTE IN ('T', 'F')) L
                  ORDER BY L.NRLANCCONT, L.NRSEQLANC) LOOP
                  V_NRORDREGARQ := V_NRORDREGARQ + 1;
                  INSERT INTO ARQMAGNETICO
                    (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
                  VALUES
                    (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_I200_ENCERRAMENTO.DSLINHA, P_NRSEQARQMAG);
               END LOOP;

            ELSE
               FOR C_I200 IN (
                  SELECT DSLINHA
                    FROM (SELECT L.NRLANCCONT,
                                 '0000' AS NRSEQLANC,
                                 '|I200|'||
                                 L.NRLANCCONT||'|'||
                                 TO_CHAR(L.DTLANCCONT,'DDMMYYYY')||'|'||
                                 REPLACE(LTRIM(TO_CHAR(NVL(SUM(ROUND(L.VRLANCAMENT,2)),0), '9999999999990.00')),'.',',')||'|'||
                                 'N||' AS DSLINHA
                            FROM LANCCONT L, CONTCTBL C
                           WHERE (L.CDEMPRESA = P_CDEMPRESA)
                             AND (L.DTLANCCONT BETWEEN V_DATAINICIAL AND V_DATAFINAL)
                             AND (L.VRLANCAMENT > 0)
                             AND (C.CDCONTCTBL = L.CDCONTCTBL)
                             AND (C.IDCONTCCUS <> 'R')
                             AND NOT EXISTS (SELECT 1
                                               FROM LANCCONT LC
                                              WHERE L.NRLANCCONT = LC.NRLANCCONT
                                                AND L.CDEMPRESA = LC.CDEMPRESA
                                                AND LC.DTLANCCONT = V_DATAFINAL
                                                AND LC.IDLANCINTE IN ('T', 'F'))
                           GROUP BY NRLANCCONT, DTLANCCONT
                          UNION ALL
                          SELECT NRLANCCONT,
                                 NRSEQLANC,
                                 '|I250|'||
                                 L.CDCONTCTBL||'||'||
                                 REPLACE(LTRIM(TO_CHAR(NVL(ABS(ROUND(VRLANCAMENT,2)),0), '9999999999990.00')),'.',',')||'|'||
                                 DECODE(VRLANCAMENT, ABS(VRLANCAMENT), 'C', 'D')||'||'||
                                 '|'||
                                 RETIRA_CARACTER_ESPECIAL(DSHISTLANC,'S')||'||' AS DSLINHA
                            FROM LANCCONT L, CONTCTBL C
                           WHERE L.CDEMPRESA = P_CDEMPRESA
                             AND (L.DTLANCCONT BETWEEN V_DATAINICIAL AND V_DATAFINAL)
                             AND (C.CDCONTCTBL = L.CDCONTCTBL)
                             AND (C.IDCONTCCUS <> 'R')
                             AND NOT EXISTS (SELECT 1
                                               FROM LANCCONT LC
                                              WHERE L.NRLANCCONT = LC.NRLANCCONT
                                                AND L.CDEMPRESA = LC.CDEMPRESA
                                                AND LC.DTLANCCONT = V_DATAFINAL
                                                AND LC.IDLANCINTE IN ('T', 'F'))) L
                  ORDER BY L.NRLANCCONT, L.NRSEQLANC) LOOP
                  V_NRORDREGARQ := V_NRORDREGARQ + 1;
                  INSERT INTO ARQMAGNETICO
                    (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
                  VALUES
                    (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_I200.DSLINHA, P_NRSEQARQMAG);

               END LOOP;

               FOR C_I200_ENCERRAMENTO IN (
                  SELECT DSLINHA
                    FROM (SELECT L.NRLANCCONT,
                                 '0000' AS NRSEQLANC,
                                 '|I200|'||
                                 L.NRLANCCONT||'|'||
                                 TO_CHAR(L.DTLANCCONT,'DDMMYYYY')||'|'||
                                 REPLACE(LTRIM(TO_CHAR(NVL(SUM(ROUND(L.VRLANCAMENT,2)),0), '9999999999990.00')),'.',',')||'|'||
                                 'E||' AS DSLINHA
                            FROM LANCCONT L, CONTCTBL C
                           WHERE (L.CDEMPRESA = P_CDEMPRESA)
                             AND (L.VRLANCAMENT > 0)
                             AND (C.CDCONTCTBL = L.CDCONTCTBL)
                             AND (C.IDCONTCCUS <> 'R')
                             AND L.DTLANCCONT = V_DATAFINAL
                             AND L.IDLANCINTE IN ('T', 'F')
                           GROUP BY NRLANCCONT, DTLANCCONT
                          UNION ALL
                          SELECT NRLANCCONT,
                                 NRSEQLANC,
                                 '|I250|'||
                                 L.CDCONTCTBL||'||'||
                                 REPLACE(LTRIM(TO_CHAR(NVL(ABS(ROUND(VRLANCAMENT,2)),0), '9999999999990.00')),'.',',')||'|'||
                                 DECODE(VRLANCAMENT, ABS(VRLANCAMENT), 'C', 'D')||'||'||
                                 '|'||
                                 RETIRA_CARACTER_ESPECIAL(DSHISTLANC,'S')||'||' AS DSLINHA
                            FROM LANCCONT L, CONTCTBL C
                           WHERE L.CDEMPRESA = P_CDEMPRESA
                             AND (C.CDCONTCTBL = L.CDCONTCTBL)
                             AND (C.IDCONTCCUS <> 'R')
                             AND L.DTLANCCONT = V_DATAFINAL
                             AND L.IDLANCINTE IN ('T', 'F')) L
                  ORDER BY L.NRLANCCONT, L.NRSEQLANC) LOOP
                  V_NRORDREGARQ := V_NRORDREGARQ + 1;
                  INSERT INTO ARQMAGNETICO
                    (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
                  VALUES
                    (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_I200_ENCERRAMENTO.DSLINHA, P_NRSEQARQMAG);
               END LOOP;
            END IF;
            /* CASO A FORMA DE ENCERRAMENTO SEJA ANUAL, E FEITO 4 LOOPS. UM PARA CADA TRIMESTRE. */
            IF P_PERIODO = 'T' THEN
               V_PERIODO := V_PERIODO + 1;
               V_DATAINICIAL := ADD_MONTHS(V_DATAINICIAL, 3);
               V_DATAFINAL := LAST_DAY(ADD_MONTHS(V_DATAFINAL, 3));
            ELSE
               /* SENAO E FEITO SOMENTE 1 LOOP. */
               V_PERIODO := 5;
            END IF;
         END LOOP;
      ELSE
         /* O BLOCO I500 DEVE SER GERADO EXCLUSIVAMENTE PARA O RAZAO AUXILIAR */
         /* Registro I500: Parametros de Impressao e Visualizacao do Livro Razao Auxiliar com Leiaute Parametrizavel */
         SELECT '|I500' ||'|'|| /* Registro */
                 '10'   ||'|'   /* Tamanho da fonte */
                 AS DSLINHA
          INTO V_AUXILIAR
          FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         /* OS REGISTROS I510 SAO PARA DEFINIR QUAIS CAMPOS APARECERAO NOS RAZOES AUXILIARES
            SEUS CAMPOS SAO OS SEGUINTES:

            01 REG         - Texto fixo contendo "I510".
            02 NM_CAMPO    - Nome do campo, sem espacos em branco ou caractere especial.
            03 DESC_CAMPO  - Descricao do campo (utilizada na visualizacao do Livro Auxiliar)
            04 TIPO_CAMPO  - Tipo do campo:
            05 TAM_CAMPO   - Tamanho do campo.
            06 DEC_CAMPO   - Quantidade de casas decimais para campos tipo "N".
            07 COL_CAMPO   - Largura da coluna no relatorio (em quantidade de caracteres). */
         SELECT '|I510|NAT_SUB_CNT|NATUREZA DA SUBCONTA CORRELATA|C|2||11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|COD_SUB_CNT|CODIGO DA SUBCONTA VINCULADA AO ITEM|C|20||11|'
         INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|COD_CCUS|CODIGO DO CENTRO DE CUSTOS VINCULADO AO ITEM|C|20||11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|CNPJ_INVTD|CNPJ DA INVESTIDA|N|14||11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|COD_PATR_ITEM|CODIGO DE IDENTIFICACAO DO ITEM|C|10||11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|QTD|QUANTIDADE|N|15|0|11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|IDENT_ITEM|IDENTIFICADOR DO ITEM|C|30||11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|DESCR_ITEM|DESCRICAO DO ITEM|C|50||11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|DATA_RECT_INI|DATA DO RECONHECIMENTO CONTABIL INICIAL DO ITEM|C|8||11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|SLD_ITEM_INI|SALDO INICIAL DA CONTA CONTABIL|N|19|2|11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|IND_SLD_ITEM_INI|INDICADOR DO SALDO INICIAL|C|1||11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|REAL_ITEM|PARCELA DE REALIZACAO DO ITEM|N|19|2|11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|IND_REAL_ITEM|INDICADOR DA PARCELA DE REALIZACAO|C|1||11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|SLD_ITEM_FIN|SALDO FINAL DA CONTA CONTABIL QUE REGISTRA O ITEM|N|19|2|11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|IND_SLD_ITEM_INI|INDICADOR DO SALDO FINAL|C|1||11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|SLD_SCNT_INI|SALDO INICIAL DA SUBCONTA REPRESENTATIVA DO ITEM|N|19|2|11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|IND_SLD_SCNT_INI|INDICADOR DO SALDO INICIAL|C|1||11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|DEB_SCNT|VALOR REGISTRADO A DEBITO NA SUBCONTA|N|19|2|11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|CRED_SCNT|VALOR REGISTRADO A CREDITO NA SUBCONTA|N|19|2|11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|SLD_SCNT_FIN|SALDO FINAL DA SUBCONTA REPRESENTATIVA DO ITEM|N|19|2|11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|IND_SLD_SCNT_FIN|INDICADOR DO SALDO FINAL|C|1||11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|DATA_LCTO|DATA DO LANCAMENTO CONTABIL|C|8||11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|NR_LCTO|IDENTIFICACAO DO LANCAMENTO|C|20||11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|VLR_LCTO|VALOR DO LANCAMENTO|N|19|2|11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|IND_VLR_LCTO|INDICADOR DO VALOR DO LANCAMENTO|C|1||11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         SELECT '|I510|IND_ADOC_INI|INDICADOR DA ADOCAOO INICIAL|C|1||11|'
           INTO V_AUXILIAR
           FROM DUAL;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

         FOR C_I550 IN
            (SELECT '|I550'         ||'|'|| /* REGISTRO */
                    N.CDNATUCONT    ||'|'|| /* Natureza da subconta correlata, conforme tabela do registro I053. */
                    CC.CDCONTACORRE ||'|'|| /* Codigo da subconta vinculada ao item. */
                                      '|'|| /* Codigo da subconta vinculada ao item. NAO UTILIZADO */
                    R.CNPJINVDET    ||'|'|| /* CNPJ da empresa investida detentora da subconta de AVJ,
                                               cujo reflexo e evidenciado pela declarante. */
                    R.CDPATRIMONIO  ||'|'|| /* Codigo definido pela pessoa juridica para identificar o item (ativo/passivo). */
                    R.NRQUANTIDADE  ||'|'|| /* Quantidade inicial do item, na mesma precisao utilizada pela metodologia contabil. */
                    R.IDITEM        ||'|'|| /* Conjunto de caracteres utilizado para individualizar o bem, conforme sua natureza. */
                    R.DSITEM        ||'|'|| /* Descricao resumida do item. */
                    TO_CHAR(R.DTRECONCTB, 'DDMMYYYY') ||'|'|| /* Data do reconhecimento contabil do item (ddmmaaaa). */
                    REPLACE(LTRIM(TO_CHAR(ABS(NVL(R.VRSALDINIITEM,0)),'9999999999990.00')), '.', ',') ||'|'||
                    /* Saldo inicial da conta contabil que registra o item (ativo/passivo) ao qual a subconta esteja vinculada. */

                    R.IDDBCRSALDINI ||'|'|| /* Indicador do saldo inicial da conta contabil */
                    REPLACE(LTRIM(TO_CHAR(ABS(NVL(R.VRPARCREALIZ,0)),'9999999999990.00')), '.', ',') ||'|'||
                    /*Parcela da realizacao do item registrado no patrimonio da investida/emitente ao qual a subconta esteja vinculada.*/

                    R.IDDBCRREALIZ  ||'|'|| /* Indicador da realizacao do item */
                    REPLACE(LTRIM(TO_CHAR(ABS(NVL(R.VRSALDFINITEM,0)),'9999999999990.00')), '.', ',') ||'|'||
                    /* Saldo final da conta contabil que registra a conta (ativo/passivo) ao qual a subconta esteja vinculada. */

                    R.IDDBCRSALDFIN ||'|'|| /* Indicador do saldo final da conta contabil */
                    REPLACE(LTRIM(TO_CHAR(ABS(NVL(R.VRSALDREPINI,0)),'9999999999990.00')), '.', ',') ||'|'||
                    /* Saldo inicial representativo do item na subconta antes do lancamento a ser demonstrado neste registro. */

                    R.IDDBSALDREPINI ||'|'|| /* Indicador do saldo inicial da subconta */
                    REPLACE(LTRIM(TO_CHAR(ABS(NVL(R.VRDBSUBCONTA,0)),'9999999999990.00')), '.', ',') ||'|'||
                    /* Valor registrado a debito na subconta correspondente apenas a participacao do item na composicao
                       de um lancamento resumido na ECD, que pode englobar varios eventos sobre itens distintos.*/

                    REPLACE(LTRIM(TO_CHAR(ABS(NVL(R.VRCRSUBCONTA,0)),'9999999999990.00')), '.', ',') ||'|'||
                    /* Valor registrado a credito na subconta correspondente apenas a participacao do item na
                       composicao de um lancamento resumido na ECD, que pode englobar varios eventos sobre itens distintos. */

                    REPLACE(LTRIM(TO_CHAR(ABS(NVL(R.VRSALDREPFIN,0)),'9999999999990.00')), '.', ',') ||'|'||
                    /* Saldo final representativo deste item na subconta apos o lancamento demonstrado neste registro. */

                    R.IDDBSALDREPFIN ||'|'|| /* Indicador do saldo final da subconta */
                    TO_CHAR(R.DTLANCCONT, 'DDMMYYYY') ||'|'|| /* Data do lancamento contabil consolidado na subconta. */
                    R.NRLANCCONT ||'|'|| /* Numero de identificacao unico do lancamento contabil consolidado na subconta. */
                    REPLACE(LTRIM(TO_CHAR(ABS(NVL(R.VRLANCAMENT,0)),'9999999999990.00')), '.', ',') ||'|'||
                    /* Valor do lancamento contabil consolidado na subconta. Representa o campo 4 do registro I250 (I250.VL_DC) correspondente a subconta. */

                    R.IDDBCRLANCCONT ||'|'|| /* Indicador do lancamento */
                    R.IDADOCAOINICIAL ||'|' /* Indicador de registro de relativo a adocao inicial. 1  Sim 2  Nao */
                    AS DSLINHA, R.NRORDEM
               FROM CAPARAZAOAUXECD CAPA JOIN RAZAOAUXECD R JOIN CONTCTBLCORRE CC JOIN CONTCTBL C
                                                                                    ON CC.CDCONTACORRE = C.CDCONTCTBL
                                                                                  JOIN NATUCONTCORRE N
                                                                                    ON CC.NRSEQNATU = N.NRSEQUENCIAL
                                                              ON R.NRSEQSUBCONTA = CC.NRSEQUENCIAL
                                           ON CAPA.NRSEQUENCIAL = R.NRSEQCAPARAZAO
              WHERE CAPA.CDEMPRESA = P_CDEMPRESA
                AND CAPA.DTECD BETWEEN P_DTINICIAL AND P_DTFINAL
              ORDER BY CAPA.NRSEQUENCIAL, R.NRORDEM) LOOP
            V_NRORDREGARQ := V_NRORDREGARQ + 1;
            INSERT INTO ARQMAGNETICO
               (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
            VALUES
               (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_I550.DSLINHA, P_NRSEQARQMAG);
         END LOOP;

         V_RAZAO := -1;
         V_COUNTQUEBRA := 0;
         FOR C_I555_AUX IN
            (SELECT NVL(CAMPOS.NRSEQCAPARAZAO, CAPA.NRSEQUENCIAL) NRSEQCAPARAZAO,
                    CAMPOS.NRSEQCAPACAMPO, CAMPOS.NRSEQCAMPO, CAMPOS.NMCAMPO,
                    CAMPOS.IDAGRUPA, CAMPOS.IDTOTALIZA, NVL(CAMPOS.IDEXIBE, 'N') IDEXIBE,
                    COUNT(*) OVER (PARTITION BY CAMPOS.NRSEQCAPARAZAO) NRQUEBRA
               FROM CAPARAZAOAUXECD CAPA, (SELECT C.NRSEQUENCIAL NRSEQCAMPO,
                                                  C.NMCAMPO,
                                                  NVL(CR.IDAGRUPA, 'N') IDAGRUPA,
                                                  NVL(CR.IDTOTALIZA, 'N')IDTOTALIZA,
                                                  NVL(CR.IDEXIBE, 'N') IDEXIBE,
                                                  CR.NRSEQCAPARAZAO,
                                                  CR.NRSEQUENCIAL NRSEQCAPACAMPO
                                             FROM CAMPOSRAZAOAUX C LEFT JOIN CAMPOSCAPARAZAO CR
                                                                          ON C.NRSEQUENCIAL = CR.NRSEQCAMPO) CAMPOS
              WHERE CDEMPRESA = P_CDEMPRESA
                AND DTECD BETWEEN P_DTINICIAL AND P_DTFINAL
             ORDER BY CAPA.NRSEQUENCIAL, CAMPOS.NRSEQCAMPO) LOOP
            V_COUNTQUEBRA := V_COUNTQUEBRA + 1;
            /* REFAZ O REGISTRO E REFAZ A STRING DO GROUP BY */
            IF V_RAZAO <> C_I555_AUX.NRSEQCAPARAZAO THEN
               V_RAZAO := C_I555_AUX.NRSEQCAPARAZAO;
               V_REGISTRO := '|I555|';
               V_CONTACAMPO := 1;
            END IF;
            V_CONTACAMPO := V_CONTACAMPO + 1;
            IF V_CONTACAMPO = 4 THEN
               /* CENTRO DE CUSTO */
               V_REGISTRO := V_REGISTRO || '|';
               V_CONTACAMPO := V_CONTACAMPO + 1;
            END IF;

            V_RETORNO := NULL;
            /* VERIICA SE O CAMPO SERA EXIBIDO NO RODAPE NO REGISTRO */
            IF C_I555_AUX.IDEXIBE = 'N' THEN
               V_REGISTRO := V_REGISTRO || '|';
            ELSE
               IF C_I555_AUX.IDAGRUPA = 'S' THEN
                  SELECT NVL(RETORNA_VRRAZAOAUX(C_I555_AUX.NRSEQCAPARAZAO, C_I555_AUX.NMCAMPO, 'A', V_CONTACAMPO), '')
                    INTO V_RETORNO
                    FROM DUAL;
                  V_REGISTRO := V_REGISTRO||V_RETORNO||'|';
               END IF;
               IF C_I555_AUX.IDTOTALIZA = 'S' THEN
                  SELECT NVL(RETORNA_VRRAZAOAUX(C_I555_AUX.NRSEQCAPARAZAO, C_I555_AUX.NMCAMPO, 'T', V_CONTACAMPO), '')
                    INTO V_RETORNO
                    FROM DUAL;
                  V_REGISTRO := V_REGISTRO||V_RETORNO||'|';
               END IF;
            END IF;

            IF V_RETORNO IS NULL THEN
               V_REGISTRO := V_REGISTRO || '|';
            END IF;

            /* VERIFICA OS CAMPOS QUE DEVEM SER SOMADOS + 1 POR TER O ID 'D' OU 'C' */
            IF C_I555_AUX.NMCAMPO IN ('NRSEQSUBCONTA', 'VRSALDINIITEM', 'VRSALDFINITEM',
                                      'VRPARCREALIZ', 'VRSALDREPINI', 'VRSALDREPFIN',
                                      'VRLANCAMENT') THEN
               V_CONTACAMPO := V_CONTACAMPO + 1;
               IF C_I555_AUX.NMCAMPO = 'VRSALDREPFIN' THEN
                  V_REGISTRO := V_REGISTRO || '||';
               END IF;
               IF C_I555_AUX.NMCAMPO = 'VRLANCAMENT' THEN
                  /* CONCATENA COM DATA LANC CONTABIL + NRLANCCONT + REGISTRO + ADOCAO INICIAL */
                  V_REGISTRO := V_REGISTRO||'|';
               END IF;
            END IF;

            /* INSERE O TOTALIZADOR PARA CADA RAZAO AUXILIAR */
            IF V_COUNTQUEBRA = C_I555_AUX.NRQUEBRA THEN
               V_COUNTQUEBRA := 0;
               V_NRORDREGARQ := V_NRORDREGARQ + 1;
               INSERT INTO ARQMAGNETICO
                  (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
               VALUES
                  (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_REGISTRO, P_NRSEQARQMAG);
            END IF;
         END LOOP;
      END IF;
      P_NRORDREGARQ := V_NRORDREGARQ;
   ELSIF (P_IDSPED = 'F') THEN
      BEGIN
         P_NRORDREGARQ := P_NRINIORDENA;
      END;
   END IF;
END;
/