/*Registros J005, J100, J150, J200, J210, J215, J900, J930, J935, J990 */
CREATE OR REPLACE PROCEDURE SPED_CONTABIL_DEMONSTRACOES (
   P_NRSEQARQMAG  IN ARQMAGNETICO.NRSEQARQMAG%TYPE,
   P_CDEMPRESA    IN EMPRESA.CDEMPRESA%TYPE,
   P_DTINICIAL    IN DATE,
   P_DTFINAL      IN DATE,
   P_DSNATUREZA   IN VARCHAR2,
   P_NRINIORDENA  IN INTEGER,
   P_IDSPED       IN VARCHAR2,
   P_PERIODO      IN VARCHAR2,
   P_PORTE        IN VARCHAR2,
   P_LIVRO        IN VARCHAR2,
   P_NRORDREGARQ  OUT INTEGER)
IS
   V_NRLIVROESCRITU VARCHAR2(10);
   V_NRORDREGARQ INTEGER;
   V_AUXILIAR    VARCHAR2(200);
   V_VRITEMSTRU  NUMBER;
   V_VRINICIALBALANCO NUMBER;
   V_DATAINICIAL DATE;
   V_DATAFINAL DATE;
   V_TRIMESTRE INT;
   V_QTTRIMESTE INT;
   V_SEQUENCIALCRP VARCHAR2(50);
   V_IDDLPADMPL VARCHAR2(01);
   V_PRIMSALDO VARCHAR2(01);
   V_VRANTERIOR NUMBER;
   V_ANO NUMBER;

   V_VRINICIALDRE NUMBER;
   V_LIVRO VARCHAR2(01);
   V_CDAGLUTINA VARCHAR2(20);
   V_NRORDEM    NUMBER;
BEGIN
   V_NRORDREGARQ := P_NRINIORDENA;
   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;
   V_NRORDEM := 1;
   V_ANO := TO_NUMBER(TO_CHAR(P_DTFINAL, 'YYYY'));
   V_LIVRO := P_LIVRO;
   SELECT '|I990|'||
          TO_CHAR(COUNT(*) + 1)||'|' AS DSLINHA
   INTO V_AUXILIAR
   FROM ARQMAGNETICO
   WHERE NRSEQARQMAG = P_NRSEQARQMAG
     AND SUBSTR(DSREGARQMAG,2,1) = 'I';
   V_NRORDREGARQ := V_NRORDREGARQ + 1;
   INSERT INTO ARQMAGNETICO
     (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
   VALUES
     (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);
   V_AUXILIAR := '|J001|0|';
   V_NRORDREGARQ := V_NRORDREGARQ + 1;
   INSERT INTO ARQMAGNETICO
     (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
   VALUES
     (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

   IF V_LIVRO <> 'Z' THEN
      V_TRIMESTRE := 0;
      V_DATAINICIAL := P_DTINICIAL;

      IF P_PERIODO = 'A' THEN /* ENCERRAMENTO ANUAL */
         V_DATAFINAL := P_DTFINAL;
      ELSE /* Encerramento trimestral */
         V_DATAFINAL := LAST_DAY(ADD_MONTHS(V_DATAINICIAL, 2));
      END IF;

      WHILE V_TRIMESTRE < V_QTTRIMESTE LOOP
         V_AUXILIAR := '|J005|'||
                       TO_CHAR(V_DATAINICIAL,'DDMMYYYY')||'|'||
                       TO_CHAR(V_DATAFINAL, 'DDMMYYYY')||'|'||
                       '1||';
         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_AUX IN (
         SELECT I.CDTIPODEMO, I.CDITEMSTRU,
                I.NMITEMSTRU, I.IDNATUITEM,
                I.IDORIGVALOR, I.IDTIPOVALOR,
                I.IDOPERACAO, I.VRVALORCALC
         FROM ITEMDEMOF I, TIPODEMO T
         WHERE I.CDTIPODEMO = T.CDTIPODEMO
           AND T.IDREFESPED = 'B'
           AND T.IDTIPODEMO = 'O'
           AND I.IDORIGVALOR <> 'T'
         ORDER BY I.CDTIPODEMO, I.CDITEMSTRU
         ) LOOP
            IF C_AUX.IDORIGVALOR = 'A' THEN
               SELECT SUM(VRSALDOITEM), SUM(VRSALDOITEMINICIAL)
               INTO V_VRITEMSTRU, V_VRINICIALBALANCO
               FROM (SELECT NVL(SUM(ROUND(S.VRSALDEMPR, 2)),0) AS VRSALDOITEM,
                            NVL(SUM(ROUND(SALDOINICIAL.VRSALDEMPR, 2)),0) AS VRSALDOITEMINICIAL
                      FROM CONTCTBL C LEFT JOIN SALDEMPR S
                                             ON S.CDCONTCTBL = C.CDCONTCTBL
                                            AND S.CDEMPRESA  = P_CDEMPRESA
                                            AND S.DTSALDEMPR = V_DATAFINAL

                                      LEFT JOIN SALDEMPR SALDOINICIAL
                                             ON SALDOINICIAL.CDCONTCTBL = C.CDCONTCTBL
                                            AND SALDOINICIAL.CDEMPRESA  = P_CDEMPRESA
                                            AND SALDOINICIAL.DTSALDEMPR = (V_DATAINICIAL -1)

                                           JOIN ITEMAPUCTB I
                                             ON I.CDORIGDEMO = C.CDCONTCTBL
                                            AND I.IDTIPOORIG = 'S'
                                            AND I.CDTIPODEMO = C_AUX.CDTIPODEMO
                                            AND I.CDITEMSTRU = C_AUX.CDITEMSTRU
                     UNION ALL
                     SELECT NVL(SUM(ROUND(S.VRITAPSPED, 2)), 0) AS VRSALDOITEM,
                            NVL(SUM(ROUND(S.VRITAPSPEDINI, 2)), 0) AS VRSALDOITEMINICIAL
                     FROM SALDITAPSPED S, ITEMAPUCTB I
                     WHERE S.NRITAPSPED = P_NRSEQARQMAG
                       AND I.CDTIPODEMO = C_AUX.CDTIPODEMO
                       AND I.CDITEMSTRU = C_AUX.CDITEMSTRU
                       AND S.CDDEMOSPED = SUBSTR(I.CDORIGDEMO, 1, 2)
                       AND S.CDITAPSPED = SUBSTR(I.CDORIGDEMO, 3, 4)
                       AND I.IDTIPOORIG = 'V');
               INSERT INTO SALDITAPSPED
                  (NRITAPSPED, CDDEMOSPED, CDITAPSPED, VRITAPSPED, VRITAPSPEDINI)
               VALUES
                  (P_NRSEQARQMAG, C_AUX.CDTIPODEMO, C_AUX.CDITEMSTRU, V_VRITEMSTRU, V_VRINICIALBALANCO);
            END IF;
         END LOOP;
         IF V_ANO <= 2017 THEN
            FOR C_J100 IN (

            /* J100 - REGISTRO REFERENTE AO BALANCO PATRIMONIAL */

            SELECT '|J100|'|| /* TEXTO FIXO */
                   T.IDREFESPED||I.IDGRUPOBALSPED||I.CDITEMSTRU|| '|'|| /* CODIGO DE AGLUTINACAO */
                   I.CDNIVELITDEMOF||               '|'||               /* NIVEL DO ITEM NO ITEM DE ESTRUTURA */
                   I.IDGRUPOBALSPED||               '|'||               /* INDICADOR DOS GRUPOS DE BALANCO PAT.
                                                                           1 - 1  Ativo;
                                                                           2  Passivo e Patrimonio.
                                                                        -- Para o DRE, este campo fica como 0, dentro do sistema. */

                   I.NMITEMSTRU||                   '|'|| /* Nome do Item do Demonstrativo */
                   REPLACE(LTRIM(TO_CHAR(NVL(ABS(S.VRITAPSPED),0), '9999999999990.00')),'.',',')||  '|'|| /* Valor do Item do Balanco Patrimonial */
                   DECODE(S.VRITAPSPED, ABS(S.VRITAPSPED), 'C', 'D')||                              '|'|| /* Identificador de valor Credito ou Debito */

                   /* Campos novos do registro J100 a partir da versao 2.0 do leiaute */
                   REPLACE(LTRIM(TO_CHAR(NVL(ABS(S.VRITAPSPEDINI),0), '9999999999990.00')),'.',',')||  '|'|| /* Valor do inicial Item do Balanco Patrimonial */
                   DECODE(S.VRITAPSPEDINI, ABS(S.VRITAPSPEDINI), 'C', 'D') || '|' /* Identificador de valor Credito ou Debito */

                    AS DSLINHA
            FROM ITEMDEMOF I, TIPODEMO T, SALDITAPSPED S
            WHERE I.CDTIPODEMO = T.CDTIPODEMO
              AND T.IDREFESPED = 'B'
              AND T.IDTIPODEMO = 'O'
              AND I.IDORIGVALOR <> 'T'
              AND I.CDTIPODEMO = S.CDDEMOSPED
              AND I.CDITEMSTRU = S.CDITAPSPED
              AND S.NRITAPSPED = P_NRSEQARQMAG
            ORDER BY I.CDTIPODEMO, I.CDITEMSTRU
            ) LOOP
               V_NRORDREGARQ := V_NRORDREGARQ + 1;
               INSERT INTO ARQMAGNETICO
                 (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
               VALUES
                 (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_J100.DSLINHA, P_NRSEQARQMAG);
            END LOOP;
         ELSE
            FOR C_J100 IN (
            /* J100 - REGISTRO REFERENTE AO BALANCO PATRIMONIAL */
            SELECT '|J100'||                                                                           '|'|| /* TEXTO FIXO */
                   T.IDREFESPED||I.IDGRUPOBALSPED||I.CDITEMSTRU||                                      '|'|| /* CODIGO DE AGLUTINACAO */
                   CASE WHEN I.IDSTSALDOITSPED IN ('P','N') THEN 'T' ELSE 'D' END||                    '|'|| /*IND_COD_AGL*/
                   I.CDNIVELITDEMOF||                                                                  '|' AS PARTE1, /* NIVEL DO ITEM NO ITEM DE ESTRUTURA */   /*NIVEL_AGL*/

                   DECODE(I.IDGRUPOBALSPED,'1','A','P')||                                                                  '|'|| /* INDICADOR DOS GRUPOS DE BALANCO PAT.
                                                                                                               1 - 1  Ativo;
                                                                                                               2  Passivo e Patrimonio.
                                                                                                            -- Para o DRE, este campo fica como 0, dentro do sistema. */

                   I.NMITEMSTRU||                                                                      '|'|| /* Nome do Item do Demonstrativo */
                   /* Campos novos do registro J100 a partir da versao 7.0 do leiaute */
                   REPLACE(LTRIM(TO_CHAR(NVL(ABS(S.VRITAPSPEDINI),0), '9999999999990.00')),'.',',')||  '|'|| /* Valor do inicial Item do Balanco Patrimonial */
                   DECODE(S.VRITAPSPEDINI, ABS(S.VRITAPSPEDINI), 'C', 'D') || '|'   ||                         /* Identificador de valor Credito ou Debito */
                   REPLACE(LTRIM(TO_CHAR(NVL(ABS(S.VRITAPSPED),0), '9999999999990.00')),'.',',')||     '|'|| /* Valor do Item do Balanco Patrimonial */
                   DECODE(S.VRITAPSPED, ABS(S.VRITAPSPED), 'C', 'D')||                                 '|'|| /* Identificador de valor Credito ou Debito */
                   CASE WHEN DSNOTAEXPITEM IS NULL THEN '' ELSE I.CDITEMSTRU END||                     '|' /*NOTA_EXP_REF   */
                   AS DSLINHA,
                   I.CDNIVELITDEMOF,
                   I.CDTIPODEMO, I.CDITEMSTRU,
                   CASE WHEN I.IDSTSALDOITSPED IN ('P','N') THEN 'T' ELSE 'D' END AS ID
            FROM ITEMDEMOF I, TIPODEMO T, SALDITAPSPED S
            WHERE I.CDTIPODEMO = T.CDTIPODEMO
              AND T.IDREFESPED = 'B'
              AND T.IDTIPODEMO = 'O'
              AND I.IDORIGVALOR <> 'T'
              AND I.CDTIPODEMO = S.CDDEMOSPED
              AND I.CDITEMSTRU = S.CDITAPSPED
              AND S.NRITAPSPED = P_NRSEQARQMAG
            ORDER BY I.CDTIPODEMO, I.CDITEMSTRU

            ) LOOP

                V_CDAGLUTINA := RETORNA_AGLU_ANT(C_J100.CDTIPODEMO,C_J100.CDITEMSTRU);

              IF C_J100.CDNIVELITDEMOF <> '1' THEN
                 V_NRORDREGARQ := V_NRORDREGARQ + 1;
                 INSERT INTO ARQMAGNETICO
                   (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
                 VALUES
                   (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_J100.PARTE1||V_CDAGLUTINA||'|'||C_J100.DSLINHA, P_NRSEQARQMAG);
              ELSE
                 V_NRORDREGARQ := V_NRORDREGARQ + 1;
                 INSERT INTO ARQMAGNETICO
                   (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
                 VALUES
                   (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_J100.PARTE1||'|'||C_J100.DSLINHA, P_NRSEQARQMAG);
              END IF;

            END LOOP;
         END IF;
         FOR C_AUX IN (
         SELECT I.CDTIPODEMO, I.CDITEMSTRU,
                I.NMITEMSTRU, I.IDNATUITEM,
                I.IDORIGVALOR, I.IDTIPOVALOR,
                I.IDOPERACAO, I.VRVALORCALC
         FROM ITEMDEMOF I, TIPODEMO T
         WHERE I.CDTIPODEMO = T.CDTIPODEMO
           AND T.IDREFESPED = 'D'
           AND T.IDTIPODEMO = 'O'
           AND I.IDORIGVALOR <> 'T'
         ORDER BY I.CDTIPODEMO, I.CDITEMSTRU
         ) LOOP
            IF C_AUX.IDORIGVALOR = 'A' THEN
               SELECT SUM(VRSALDOITEM), SUM(VRSALDOITEMINICIAL)
               INTO V_VRITEMSTRU, V_VRINICIALDRE
               FROM (SELECT NVL(SUM(ROUND(S.VRSALDOTRANSF, 2)),0) AS VRSALDOITEM,
                            NVL(SUM(ROUND(SALDOINICIAL.VRSALDOTRANSF, 2)),0) AS VRSALDOITEMINICIAL
                      FROM CONTCTBL C LEFT JOIN SALDOTRANSF S
                                             ON S.CDCONTCTBL = C.CDCONTCTBL
                                            AND S.CDEMPRESA  = P_CDEMPRESA
                                            AND S.DTSALDOTRANSF = V_DATAFINAL

                                      LEFT JOIN SALDOTRANSF SALDOINICIAL
                                             ON SALDOINICIAL.CDCONTCTBL = C.CDCONTCTBL
                                            AND SALDOINICIAL.CDEMPRESA  = P_CDEMPRESA
                                            AND SALDOINICIAL.DTSALDOTRANSF = (V_DATAINICIAL -1)

                                           JOIN ITEMAPUCTB I
                                             ON I.CDORIGDEMO = C.CDCONTCTBL
                                            AND I.IDTIPOORIG = 'S'
                                            AND I.CDTIPODEMO = C_AUX.CDTIPODEMO
                                            AND I.CDITEMSTRU = C_AUX.CDITEMSTRU
                     UNION ALL
                     SELECT NVL(SUM(ROUND(S.VRITAPSPED, 2)), 0) AS VRSALDOITEM,
                            NVL(SUM(ROUND(S.VRITAPSPEDINI, 2)), 0) AS VRSALDOITEMINICIAL
                     FROM SALDITAPSPED S, ITEMAPUCTB I
                     WHERE S.NRITAPSPED = P_NRSEQARQMAG
                       AND I.CDTIPODEMO = C_AUX.CDTIPODEMO
                       AND I.CDITEMSTRU = C_AUX.CDITEMSTRU
                       AND S.CDDEMOSPED = SUBSTR(I.CDORIGDEMO, 1, 2)
                       AND S.CDITAPSPED = SUBSTR(I.CDORIGDEMO, 3, 4)
                       AND I.IDTIPOORIG = 'V');
               INSERT INTO SALDITAPSPED
                  (NRITAPSPED, CDDEMOSPED, CDITAPSPED, VRITAPSPED, VRITAPSPEDINI)
               VALUES
                  (P_NRSEQARQMAG, C_AUX.CDTIPODEMO, C_AUX.CDITEMSTRU, V_VRITEMSTRU, V_VRINICIALDRE);
            END IF;
         END LOOP;

         IF V_ANO <= 2014 THEN /* LEIAUTE 3.0 PARA BAIXO */
            FOR C_J150 IN (
            SELECT '|J150|'||
                   T.IDREFESPED||I.IDGRUPOBALSPED||I.CDITEMSTRU||'|'||
                   I.CDNIVELITDEMOF||'|'||
                   I.NMITEMSTRU||'|'||
                   REPLACE(LTRIM(TO_CHAR(NVL(ABS(S.VRITAPSPED),0), '9999999999990.00')),'.',',')||'|'||
                   DECODE(I.IDSTSALDOITSPED, 'N', DECODE(S.VRITAPSPED, ABS(S.VRITAPSPED), 'P', 'N'),
                   DECODE(I.IDSTSALDOITSPED, 'P', DECODE(S.VRITAPSPED, ABS(S.VRITAPSPED), 'P', 'N'), I.IDSTSALDOITSPED))||'|' AS DSLINHA
            FROM ITEMDEMOF I, TIPODEMO T, SALDITAPSPED S
            WHERE I.CDTIPODEMO = T.CDTIPODEMO
              AND T.IDREFESPED = 'D'
              AND T.IDTIPODEMO = 'O'
              AND I.IDORIGVALOR <> 'T'
              AND I.CDTIPODEMO = S.CDDEMOSPED
              AND I.CDITEMSTRU = S.CDITAPSPED
              AND NVL(I.IDSTSALDOITSPED,'I') <> 'I'
              AND S.NRITAPSPED = P_NRSEQARQMAG
            ORDER BY I.CDTIPODEMO, I.CDITEMSTRU
            ) LOOP
               V_NRORDREGARQ := V_NRORDREGARQ + 1;
               INSERT INTO ARQMAGNETICO
                 (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
               VALUES
                 (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_J150.DSLINHA, P_NRSEQARQMAG);
            END LOOP;
         ELSIF ((V_ANO >= 2015) AND (V_ANO <= 2017)) THEN /* LEIAUTE 4.0 e 5.0*/
            FOR C_J150 IN (
            SELECT '|J150|'||
                   T.IDREFESPED||I.IDGRUPOBALSPED||I.CDITEMSTRU||'|'||
                   I.CDNIVELITDEMOF||'|'||
                   I.NMITEMSTRU||'|'||
                   REPLACE(LTRIM(TO_CHAR(NVL(ABS(S.VRITAPSPED),0), '9999999999990.00')),'.',',')||'|'||
                   DECODE(I.IDSTSALDOITSPED, 'N', DECODE(S.VRITAPSPED, ABS(S.VRITAPSPED), 'P', 'N'),
                   DECODE(I.IDSTSALDOITSPED, 'P', DECODE(S.VRITAPSPED, ABS(S.VRITAPSPED), 'P', 'N'), I.IDSTSALDOITSPED))||'|'||

                   /* Campos novos do registro J150 a partir da versao 4.0 do leiaute */
                   REPLACE(LTRIM(TO_CHAR(NVL(ABS(S.VRITAPSPEDINI),0), '9999999999990.00')),'.',',')||  '|'|| /* Valor do inicial Item do DRE */
                   DECODE(S.VRITAPSPEDINI, ABS(S.VRITAPSPEDINI), 'P', 'N') || '|' /* Identificador de valor Credito ou Debito */ AS DSLINHA
            FROM ITEMDEMOF I, TIPODEMO T, SALDITAPSPED S
            WHERE I.CDTIPODEMO = T.CDTIPODEMO
              AND T.IDREFESPED = 'D'
              AND T.IDTIPODEMO = 'O'
              AND I.IDORIGVALOR <> 'T'
              AND I.CDTIPODEMO = S.CDDEMOSPED
              AND I.CDITEMSTRU = S.CDITAPSPED
              AND NVL(I.IDSTSALDOITSPED,'I') <> 'I'
              AND S.NRITAPSPED = P_NRSEQARQMAG
            ORDER BY I.CDTIPODEMO, I.CDITEMSTRU
            ) LOOP
               V_NRORDREGARQ := V_NRORDREGARQ + 1;
               INSERT INTO ARQMAGNETICO
                 (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
               VALUES
                 (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_J150.DSLINHA, P_NRSEQARQMAG);
            END LOOP;
         ELSIF V_ANO = 2018 THEN/*LAYOUT 7.00*/
            V_CDAGLUTINA := '';
            FOR C_J150 IN (
            SELECT '|J150|'||
                   T.IDREFESPED||I.IDGRUPOBALSPED||I.CDITEMSTRU||'|'||
                   CASE WHEN I.IDSTSALDOITSPED IN ('P','N') THEN 'T' ELSE 'D' END||                      '|'|| /*IND_COD_AGL*/
                   I.CDNIVELITDEMOF||'|' AS PARTE1,
                   I.NMITEMSTRU||'|'||
                   REPLACE(LTRIM(TO_CHAR(NVL(ABS(S.VRITAPSPED),0), '9999999999990.00')),'.',',')||'|'||
                   DECODE(S.VRITAPSPED, ABS(S.VRITAPSPED), 'C', 'D') || '|'|| /*IND_DC_CTA*/
                   CASE WHEN I.IDSTSALDOITSPED IN ('D','N') THEN 'D' ELSE 'R' END ||'|'||
                   CASE WHEN DSNOTAEXPITEM IS NULL THEN '' ELSE I.CDITEMSTRU END||                     '|' /*NOTA_EXP_REF   */
                   AS DSLINHA,
                   I.CDNIVELITDEMOF,
                   I.CDTIPODEMO, I.CDITEMSTRU
            FROM ITEMDEMOF I, TIPODEMO T, SALDITAPSPED S
            WHERE I.CDTIPODEMO = T.CDTIPODEMO
              AND T.IDREFESPED = 'D'
              AND T.IDTIPODEMO = 'O'
              AND I.IDORIGVALOR <> 'T'
              AND I.CDTIPODEMO = S.CDDEMOSPED
              AND I.CDITEMSTRU = S.CDITAPSPED
              AND NVL(I.IDSTSALDOITSPED,'I') <> 'I'
              AND S.NRITAPSPED = P_NRSEQARQMAG
            ORDER BY I.CDTIPODEMO, I.CDITEMSTRU
            ) LOOP
              V_CDAGLUTINA := RETORNA_AGLU_ANT(C_J150.CDTIPODEMO,C_J150.CDITEMSTRU);
              IF C_J150.CDNIVELITDEMOF <> '1' THEN
                V_NRORDREGARQ := V_NRORDREGARQ + 1;
                INSERT INTO ARQMAGNETICO
                  (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
                VALUES
                  (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_J150.PARTE1||V_CDAGLUTINA||'|'||C_J150.DSLINHA, P_NRSEQARQMAG);
              ELSE
                  V_NRORDREGARQ := V_NRORDREGARQ + 1;
                INSERT INTO ARQMAGNETICO
                  (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
                VALUES
                  (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_J150.PARTE1||'|'||C_J150.DSLINHA, P_NRSEQARQMAG);
              END IF;
            END LOOP;
         ELSE   /*LAYOUT 8.00*/
            V_CDAGLUTINA := '';
            FOR C_J150 IN (
            SELECT '|J150|'||
                   ROWNUM||'|'|| /*NUMERO DE ORDEM*/
                   T.IDREFESPED||I.IDGRUPOBALSPED||I.CDITEMSTRU||'|'||
                   CASE WHEN I.IDSTSALDOITSPED IN ('P','N') THEN 'T' ELSE 'D' END||                      '|'|| /*IND_COD_AGL*/
                   I.CDNIVELITDEMOF||'|' AS PARTE1,
                   I.NMITEMSTRU||'|'||
                   REPLACE(LTRIM(TO_CHAR(NVL(ABS(S.VRITAPSPEDINI),0), '9999999999990.00')),'.',',')||'|'||  /*VL_CTA_INI*/
                   DECODE(S.VRITAPSPEDINI, ABS(S.VRITAPSPEDINI), 'C', 'D') || '|'||                            /*IND_DC_CTA_INI*/
                   REPLACE(LTRIM(TO_CHAR(NVL(ABS(S.VRITAPSPED),0), '9999999999990.00')),'.',',')||'|'||     /*VL_CTA*/
                   DECODE(S.VRITAPSPED, ABS(S.VRITAPSPED), 'C', 'D') || '|'||                               /*IND_DC_CTA*/
                   CASE WHEN I.IDSTSALDOITSPED IN ('D','N') THEN 'D' ELSE 'R' END ||'|'||
                   CASE WHEN DSNOTAEXPITEM IS NULL THEN '' ELSE I.CDITEMSTRU END||                     '|' /*NOTA_EXP_REF   */
                   AS DSLINHA,
                   I.CDNIVELITDEMOF,
                   I.CDTIPODEMO, I.CDITEMSTRU
            FROM ITEMDEMOF I, TIPODEMO T, SALDITAPSPED S
            WHERE I.CDTIPODEMO = T.CDTIPODEMO
              AND T.IDREFESPED = 'D'
              AND T.IDTIPODEMO = 'O'
              AND I.IDORIGVALOR <> 'T'
              AND I.CDTIPODEMO = S.CDDEMOSPED
              AND I.CDITEMSTRU = S.CDITAPSPED
              AND NVL(I.IDSTSALDOITSPED,'I') <> 'I'
              AND S.NRITAPSPED = P_NRSEQARQMAG
            ORDER BY I.CDTIPODEMO, I.CDITEMSTRU
            ) LOOP
              V_NRORDEM := V_NRORDEM + 1;
              V_CDAGLUTINA := RETORNA_AGLU_ANT(C_J150.CDTIPODEMO,C_J150.CDITEMSTRU);
              IF C_J150.CDNIVELITDEMOF <> '1' THEN
                V_NRORDREGARQ := V_NRORDREGARQ + 1;
                INSERT INTO ARQMAGNETICO
                  (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
                VALUES
                  (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_J150.PARTE1||V_CDAGLUTINA||'|'||C_J150.DSLINHA, P_NRSEQARQMAG);
              ELSE
                  V_NRORDREGARQ := V_NRORDREGARQ + 1;
                INSERT INTO ARQMAGNETICO
                  (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
                VALUES
                  (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_J150.PARTE1||'|'||C_J150.DSLINHA, P_NRSEQARQMAG);
              END IF;
            END LOOP;
         END IF;

         IF P_IDSPED = 'S' THEN
               /* ROTINA DE GERACAO DOS DEMONSTRATIVOS DLPA E DMPL
                  O PRIMEIRO A SER GERADO SERA O DLPA, ID = L */
               FOR C_HIST IN
                  (SELECT DISTINCT '|J200|'||H.CDHISTPADR||'|'||H.DSHISTPADR ||'|' AS DSLINHA, H.CDHISTPADR
                     FROM LANCCONT L, HISTPADR H, ITEMAPUCTB IT, TIPODEMO T, ITEMDEMOF I
                    WHERE L.DTLANCCONT BETWEEN V_DATAINICIAL AND V_DATAFINAL
                      AND L.CDEMPRESA = P_CDEMPRESA
                      AND L.CDHISTPADR = H.CDHISTPADR
                      AND I.CDTIPODEMO = IT.CDTIPODEMO
                      AND I.CDITEMSTRU = IT.CDITEMSTRU
                      AND L.CDCONTCTBL LIKE IT.CDORIGDEMO ||'%'
                      AND T.IDTIPODEMO = 'O'
                      AND T.IDREFESPED IN ('L', 'M')
                      AND T.CDTIPODEMO = I.CDTIPODEMO
                      AND I.IDORIGVALOR = 'A'
                      AND I.CDTIPODEMO = IT.CDTIPODEMO
                      AND I.CDITEMSTRU = IT.CDITEMSTRU
                      AND IT.IDTIPOORIG = 'S'
                    ORDER BY H.CDHISTPADR) LOOP
                  IF V_ANO <= 2017 THEN
                      V_NRORDREGARQ := V_NRORDREGARQ + 1;
                    INSERT INTO ARQMAGNETICO
                      (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
                    VALUES
                      (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_HIST.DSLINHA, P_NRSEQARQMAG);
                  END IF;
               END LOOP;
               FOR C_AUX IN
                  (SELECT I.CDTIPODEMO, I.CDITEMSTRU,
                          I.NMITEMSTRU, I.IDNATUITEM,
                          I.IDORIGVALOR, I.IDTIPOVALOR,
                          I.IDOPERACAO, I.VRVALORCALC, T.IDREFESPED
                     FROM ITEMDEMOF I, TIPODEMO T
                    WHERE I.CDTIPODEMO = T.CDTIPODEMO
                      AND T.IDREFESPED IN ('L', 'M')
                      AND T.IDTIPODEMO = 'O'
                      AND I.IDORIGVALOR = 'A'
                    ORDER BY I.CDTIPODEMO, I.CDITEMSTRU) LOOP

                  /* 0 - DLPA, 1 - DMPL */
                  IF C_AUX.IDREFESPED = 'L' THEN
                     V_IDDLPADMPL := '0';
                  ELSE
                     V_IDDLPADMPL := '1';
                  END IF;

                  FOR C_TEMP IN
                     (SELECT I.CDTIPODEMO, I.CDITEMSTRU,
                             I.NMITEMSTRU, I.IDNATUITEM,
                             I.IDORIGVALOR, I.IDTIPOVALOR,
                             I.IDOPERACAO, I.VRVALORCALC
                        FROM ITEMDEMOF I, TIPODEMO T
                       WHERE I.CDTIPODEMO = T.CDTIPODEMO
                         AND T.CDTIPODEMO = C_AUX.CDTIPODEMO
                         AND I.CDITEMSTRU = C_AUX.CDITEMSTRU
                         AND I.IDORIGVALOR = 'A'
                       ORDER BY I.CDTIPODEMO, I.CDITEMSTRU) LOOP

                     SELECT NVL(SUM(VRSALDOITEM), 0) VRSALDOITEM, NVL(SUM(VRSALDOITEMINICIAL), 0) VRSALDOITEMINICIAL
                       INTO V_VRITEMSTRU, V_VRINICIALBALANCO
                       FROM (SELECT SUM(L.VRLANCAMENT) VRSALDOITEM, VRSALDOITEMINICIAL
                               FROM LANCCONT L, (SELECT NVL(SUM(ROUND(SALDINI.VRSALDEMPR, 2)),0) AS VRSALDOITEMINICIAL
                                                   FROM ITEMAPUCTB I, SALDEMPR SALDINI, CONTCTBL C
                                                  WHERE SALDINI.CDEMPRESA  = P_CDEMPRESA
                                                    AND SALDINI.DTSALDEMPR(+) = (V_DATAINICIAL -1)
                                                    AND I.CDTIPODEMO = C_TEMP.CDTIPODEMO
                                                    AND I.CDITEMSTRU = C_TEMP.CDITEMSTRU
                                                    AND I.IDTIPOORIG = 'S'
                                                    AND SALDINI.CDCONTCTBL LIKE I.CDORIGDEMO||'%'
                                                    AND SALDINI.CDCONTCTBL = C.CDCONTCTBL
                                                    AND C.IDTIPOCONT = 'A') X,
                                    ITEMAPUCTB I
                              WHERE L.CDEMPRESA(+) = P_CDEMPRESA
                                AND L.DTLANCCONT(+) BETWEEN V_DATAINICIAL AND V_DATAFINAL
                                AND L.CDCONTCTBL(+) LIKE I.CDORIGDEMO||'%'
                                AND I.CDTIPODEMO(+) = C_TEMP.CDTIPODEMO
                                AND I.CDITEMSTRU = C_TEMP.CDITEMSTRU
                                AND I.IDTIPOORIG = 'S'
                              GROUP BY VRSALDOITEMINICIAL
                            UNION ALL
                            SELECT NVL(SUM(ROUND(S.VRITAPSPED, 2)), 0) AS VRSALDOITEM,
                                   NVL(SUM(ROUND(S.VRITAPSPEDINI, 2)), 0) AS VRSALDOITEMINICIAL
                            FROM SALDITAPSPED S, ITEMAPUCTB I
                            WHERE S.NRITAPSPED = P_NRSEQARQMAG
                              AND I.CDTIPODEMO = C_TEMP.CDTIPODEMO
                              AND I.CDITEMSTRU = C_TEMP.CDITEMSTRU
                              AND S.CDDEMOSPED = SUBSTR(I.CDORIGDEMO, 1, 2)
                              AND S.CDITAPSPED = SUBSTR(I.CDORIGDEMO, 3, 4)
                              AND I.IDTIPOORIG = 'V');
                     INSERT INTO SALDITAPSPED
                        (NRITAPSPED, CDDEMOSPED, CDITAPSPED, VRITAPSPED, VRITAPSPEDINI)
                     VALUES
                        (P_NRSEQARQMAG, C_TEMP.CDTIPODEMO, C_TEMP.CDITEMSTRU, V_VRITEMSTRU, V_VRINICIALBALANCO);
                  END LOOP;
                  IF V_ANO <= 2017 THEN
                     FOR C_J210 IN
                        (SELECT '|J210|'         ||
                                V_IDDLPADMPL     ||'|'||
                                T.IDREFESPED||I.IDGRUPOBALSPED||I.CDITEMSTRU||'|'|| /* Codigo de Aglutinacao */
                                I.NMITEMSTRU||'|'|| /* Nome do item */
                                REPLACE(LTRIM(TO_CHAR(NVL(ABS(S.VRITAPSPED + S.VRITAPSPEDINI),0), '9999999999990.00')),'.',',')||  '|'|| /* Valor do Item no final do periodo do J005 */
                                DECODE(NVL(S.VRITAPSPED, 0) + NVL(S.VRITAPSPEDINI, 0), ABS(NVL(S.VRITAPSPED, 0) + NVL(S.VRITAPSPEDINI, 0)), 'C', 'D')||                               '|'|| /* Identificador de valor Credito ou Debito */
                                REPLACE(LTRIM(TO_CHAR(NVL(ABS(S.VRITAPSPEDINI),0), '9999999999990.00')),'.',',')||  '|'|| /* Valor do inicial Item  */
                                DECODE(S.VRITAPSPEDINI, ABS(S.VRITAPSPEDINI), 'C', 'D') || '|' /* Identificador de valor Credito ou Debito */ AS DSLINHA,
                                I.CDITEMSTRU, S.VRITAPSPED
                           FROM ITEMDEMOF I, TIPODEMO T, SALDITAPSPED S
                          WHERE I.CDTIPODEMO = T.CDTIPODEMO
                            AND T.CDTIPODEMO = C_AUX.CDTIPODEMO
                            AND I.CDITEMSTRU = C_AUX.CDITEMSTRU
                            AND I.IDORIGVALOR = 'A'
                            AND I.CDTIPODEMO = S.CDDEMOSPED
                            AND I.CDITEMSTRU = S.CDITAPSPED
                            AND NVL(I.IDSTSALDOITSPED,'I') <> 'I'
                            AND S.NRITAPSPED = P_NRSEQARQMAG
                          ORDER BY I.CDTIPODEMO, I.CDITEMSTRU) LOOP

                        V_NRORDREGARQ := V_NRORDREGARQ + 1;
                        INSERT INTO ARQMAGNETICO
                          (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
                        VALUES
                          (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_J210.DSLINHA, P_NRSEQARQMAG);

                        FOR C_J215 IN
                           (SELECT DISTINCT '|J215|'   ||
                                   L.CDHISTPADR        ||'|'||
                                   REPLACE(LTRIM(TO_CHAR(NVL(ABS(SUM(L.VRLANCAMENT)),0), '9999999999990.00')),'.',',')||  '|'|| /* Valor do Item do Balanco Patrimonial */
                                   DECODE(SUM(L.VRLANCAMENT), ABS(SUM(L.VRLANCAMENT)), 'C', 'D') ||'|' DSLINHA, L.CDHISTPADR
                              FROM ITEMDEMOF I, ITEMAPUCTB IT, LANCCONT L
                             WHERE IT.CDTIPODEMO = C_AUX.CDTIPODEMO
                               AND IT.CDITEMSTRU = C_J210.CDITEMSTRU
                               AND IT.CDTIPODEMO = I.CDTIPODEMO
                               AND IT.CDITEMSTRU = I.CDITEMSTRU
                               AND I.IDORIGVALOR = 'A'
                               AND L.DTLANCCONT BETWEEN V_DATAINICIAL AND V_DATAFINAL
                               AND L.CDEMPRESA = P_CDEMPRESA
                               AND IT.IDTIPOORIG = 'S'
                               AND L.CDCONTCTBL LIKE IT.CDORIGDEMO ||'%'
                             GROUP BY L.CDHISTPADR, I.IDSTSALDOITSPED
                             ORDER BY L.CDHISTPADR) LOOP
                           V_NRORDREGARQ := V_NRORDREGARQ + 1;
                           INSERT INTO ARQMAGNETICO
                             (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
                           VALUES
                             (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_J215.DSLINHA, P_NRSEQARQMAG);
                        END LOOP;
                     END LOOP;
                  ELSE
                     FOR C_J210 IN   /*LAYOUT 7.00*/
                        (SELECT '|J210|'         ||
                                V_IDDLPADMPL     ||'|'||
                                T.IDREFESPED||I.IDGRUPOBALSPED||I.CDITEMSTRU||'|'|| /* Codigo de Aglutinacao */
                                I.NMITEMSTRU||'|'|| /* Nome do item */
                                REPLACE(LTRIM(TO_CHAR(NVL(ABS(S.VRITAPSPEDINI),0), '9999999999990.00')),'.',',')||  '|'|| /* Valor do inicial Item  */
                                DECODE(S.VRITAPSPEDINI, ABS(S.VRITAPSPEDINI), 'C', 'D') || '|'|| /* Identificador de valor Credito ou Debito */ 
                                REPLACE(LTRIM(TO_CHAR(NVL(ABS(S.VRITAPSPED + S.VRITAPSPEDINI),0), '9999999999990.00')),'.',',')||  '|'|| /* Valor do Item no final do periodo do J005 */
                                DECODE(NVL(S.VRITAPSPED, 0) + NVL(S.VRITAPSPEDINI, 0), ABS(NVL(S.VRITAPSPED, 0) + NVL(S.VRITAPSPEDINI, 0)), 'C', 'D')||'|'|| /* Identificador de valor Credito ou Debito */
                                CASE WHEN DSNOTAEXPITEM IS NULL THEN '' ELSE I.CDITEMSTRU END||                     '|' AS DSLINHA, /*NOTA_EXP_REF   */
                                I.CDITEMSTRU, S.VRITAPSPED
                           FROM ITEMDEMOF I, TIPODEMO T, SALDITAPSPED S
                          WHERE I.CDTIPODEMO = T.CDTIPODEMO
                            AND T.CDTIPODEMO = C_AUX.CDTIPODEMO
                            AND I.CDITEMSTRU = C_AUX.CDITEMSTRU
                            AND I.IDORIGVALOR = 'A'
                            AND I.CDTIPODEMO = S.CDDEMOSPED
                            AND I.CDITEMSTRU = S.CDITAPSPED
                            AND NVL(I.IDSTSALDOITSPED,'I') <> 'I'
                            AND S.NRITAPSPED = P_NRSEQARQMAG
                          ORDER BY I.CDTIPODEMO, I.CDITEMSTRU) LOOP

                        V_NRORDREGARQ := V_NRORDREGARQ + 1;
                        INSERT INTO ARQMAGNETICO
                          (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
                        VALUES
                          (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_J210.DSLINHA, P_NRSEQARQMAG);

                        FOR C_J215 IN
                           (SELECT DISTINCT '|J215|'   ||
                                   L.CDHISTPADR        ||'|'||
                                   MAX(L.DSHISTLANC)   ||'|'||
                                   REPLACE(LTRIM(TO_CHAR(NVL(ABS(SUM(L.VRLANCAMENT)),0), '9999999999990.00')),'.',',')||  '|'|| /* Valor do Item do Balanco Patrimonial */
                                   DECODE(SUM(L.VRLANCAMENT), ABS(SUM(L.VRLANCAMENT)), 'C', 'D') ||'|' DSLINHA, L.CDHISTPADR
                              FROM ITEMDEMOF I, ITEMAPUCTB IT, LANCCONT L
                             WHERE IT.CDTIPODEMO = C_AUX.CDTIPODEMO
                               AND IT.CDITEMSTRU = C_J210.CDITEMSTRU
                               AND IT.CDTIPODEMO = I.CDTIPODEMO
                               AND IT.CDITEMSTRU = I.CDITEMSTRU
                               AND I.IDORIGVALOR = 'A'
                               AND L.DTLANCCONT BETWEEN V_DATAINICIAL AND V_DATAFINAL
                               AND L.CDEMPRESA = P_CDEMPRESA
                               AND IT.IDTIPOORIG = 'S'
                               AND L.CDCONTCTBL LIKE IT.CDORIGDEMO ||'%'
                             GROUP BY L.CDHISTPADR, I.IDSTSALDOITSPED
                             ORDER BY L.CDHISTPADR) LOOP
                           V_NRORDREGARQ := V_NRORDREGARQ + 1;
                           INSERT INTO ARQMAGNETICO
                             (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
                           VALUES
                             (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_J215.DSLINHA, P_NRSEQARQMAG);
                        END LOOP;
                     END LOOP;

                  END IF;
               END LOOP;
            END IF;

         IF P_PERIODO = 'A' THEN /* ENCERRAMENTO ANUAL */
            V_TRIMESTRE := 5;
         ELSE
            V_TRIMESTRE := V_TRIMESTRE + 1;
            V_DATAINICIAL := ADD_MONTHS(V_DATAINICIAL, 3);
            V_DATAFINAL := LAST_DAY(ADD_MONTHS(V_DATAFINAL, 3));
         END IF;

         DELETE FROM SALDITAPSPED
          WHERE NRITAPSPED = P_NRSEQARQMAG;
      END LOOP;
   END IF;

   BEGIN
     SELECT NRLIVROESCRITU
       INTO V_NRLIVROESCRITU
       FROM TERMOABERT
      WHERE CDLIVRCONT = 'D'
        AND IDMODELO = 'E'
        AND CDEMPRESA = P_CDEMPRESA;
   EXCEPTION
    WHEN NO_DATA_FOUND THEN
       V_NRLIVROESCRITU := '1';
   END;
   SELECT '|J900|'||
          'TERMO DE ENCERRAMENTO|'||
          V_NRLIVROESCRITU||'|'||
          P_DSNATUREZA||'|'||
          E.NMRAZSOCEMPR||'|'||
          '#QTDE_TOTAL#|'||
          TO_CHAR(P_DTINICIAL, 'DDMMYYYY')||'|'||
          TO_CHAR(P_DTFINAL,'DDMMYYYY'  )||'|' AS DSLINHA
   INTO V_AUXILIAR
   FROM EMPRESA E
   WHERE E.CDEMPRESA = P_CDEMPRESA;
   V_NRORDREGARQ := V_NRORDREGARQ + 1;
   INSERT INTO ARQMAGNETICO
     (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
   VALUES
     (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);

   IF P_IDSPED = 'S' THEN
      BEGIN
         SELECT NVL(C.SGESTADOCRP, '')||'/'||NVL(NRANOCRP, '')||'/'||NVL(NRREGCRP, '')
           INTO V_SEQUENCIALCRP
           FROM CONTADOR C, EMPRESA E
          WHERE E.CDEMPRESA = P_CDEMPRESA
            AND E.CDCONTADOR2 = C.CDCONTADOR2;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_SEQUENCIALCRP := NULL;
      END;

      IF REPLACE(V_SEQUENCIALCRP, '/', NULL) IS NULL THEN
         V_SEQUENCIALCRP := NULL;
      END IF;

      BEGIN
         SELECT '|J930|'           || /* Texto fixo */
                NMCONTADOR||    '|'|| /* Nome do Contador */
                NRCPFRESPONS||  '|'|| /* CPF do contador */
                NVL(Q.NMQUALIFASSINA,'Contabilista')||                                  '|'|| /* Classificacao do contador */
                NVL(C.CDQUALIFASSINA,'900')||                                           '|'|| /* Codigo da qualificacao */
                NVL(NRCRCCONT2,'')||                                                    '|'|| /* Numero do CRC do contador*/
                NVL(DSENDINTERN, '')||                                                  '|'|| /* Email do contador. Obrigatorio */
                NVL(REPLACE(REPLACE(NRTELCONTATO, ')', ''), '(', ''), '')||             '|'|| /* Telefone do contador. Obrigatorio */
                NVL(C.SGESTADOCRC, '')||                                                '|'|| /* Estado de expedicao do CRC */
                NVL(V_SEQUENCIALCRP, '')||'|'|| /* Numero sequencial no seguinte formato: UF/ano/numero */
                NVL(TO_CHAR(DTVENCCRP, 'DDMMYYYY'), '')||                               '|'   /* Data de validade do CRP do contador */
                AS DSLINHA
           INTO V_AUXILIAR
           FROM EMPRESA E, CONTADOR C, QUALIFASSINANTE Q
          WHERE E.CDEMPRESA = P_CDEMPRESA
            AND E.CDCONTADOR2 = C.CDCONTADOR2
            AND Q.CDQUALIFASSINA = C.CDQUALIFASSINA;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_AUXILIAR := NULL;
      END;
      IF V_ANO >= 2015 THEN  /*Leiaute 5.0 E 7.00*/
        V_AUXILIAR := V_AUXILIAR||'N|';
      END IF;
      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_SIGNATARIO IN(
          SELECT '|J930|'                   || /* Texto fixo */
                 R.NMREPRES||            '|'|| /* Nome do Representante Legal */
                 R.NRCPFREPRES||         '|'|| /* CPF do Representatnte Legal */
                 Q.NMQUALIFASSINA||      '|'|| /* Classificacao do Representante Legal */
                 Q.CDQUALIFASSINA||      '|'|| /* Codigo da qualificacao */
                                         '|'|| /* Nulo quando Representante Legal. CRC do Contador */
                 NVL(DSEMAILREPRES, '')||'|'|| /* Email do Representante Legal */
                 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(NVL(NRDDDTELEREPRES1||NRTELEREPRES1, ''), ')', ''), '(', ''), '-', ''), '.', ''), ' ', '')  ||'|'|| /* Telefone do Representante Legal */
                 '|' || /* Estado de expedicao do CRC */
                 '|' || /* Numero sequencial no seguinte formato: UF/ano/numero */
                 '|'    /* Data de validade do CRC do contador */ AS DSLINHA
            FROM REPRESLEGAL R, QUALIFASSINANTE Q, REPRESEMPRESA RE
           WHERE RE.CDEMPRESA = P_CDEMPRESA
             AND RE.CDREPRES = R.CDREPRES
             AND RE.IDATIVO = 'S'
             AND R.CDQUALIFASSINA = Q.CDQUALIFASSINA
             AND V_ANO <= 2015
           UNION ALL
          SELECT '|J930|'                   || /* Texto fixo */
                 R.NMREPRES||            '|'|| /* Nome do Representante Legal */
                 R.NRCPFREPRES||         '|'|| /* CPF do Representatnte Legal */
                 Q.NMQUALIFASSINA||      '|'|| /* Classificacao do Representante Legal */
                 Q.CDQUALIFASSINA||      '|'|| /* Codigo da qualificacao */
                                         '|'|| /* Nulo quando Representante Legal. CRC do Contador */
                 NVL(DSEMAILREPRES, '')||'|'|| /* Email do Representante Legal */
                 REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(NVL(NRDDDTELEREPRES1||NRTELEREPRES1, ''), ')', ''), '(', ''), '-', ''), '.', ''), ' ', '')  ||'|'|| /* Telefone do Representante Legal */
                 '|' || /* Estado de expedicao do CRC */
                 '|' || /* Numero sequencial no seguinte formato: UF/ano/numero */
                 '|' ||   /* Data de validade do CRC do contador */
                 RE.IDATIVO||'|'AS DSLINHA
            FROM REPRESLEGAL R, QUALIFASSINANTE Q, REPRESEMPRESA RE
           WHERE RE.CDEMPRESA = P_CDEMPRESA
             AND RE.CDREPRES = R.CDREPRES
             AND RE.IDATIVO = 'S'
             AND R.CDQUALIFASSINA = Q.CDQUALIFASSINA
             AND V_ANO >= 2016
           UNION ALL
          SELECT '|J930|'                   || /* Texto fixo */
                 NMRAZSOCEMPR||            '|'|| /* Nome do Representante Legal */
                 NRINSJUREMPR||            '|'|| /* CPF do Representatnte Legal */
                 'Pessoa Juridica (e-CNPJ ou e-PJ)'||      '|'|| /* Classificacao do Representante Legal */
                 '001'       ||      '|'|| /* Codigo da qualificacao */
                                         '|'|| /* Nulo quando Representante Legal. CRC do Contador */
                 ''  ||'|'|| /* Email do Representante Legal */
                 ''  ||'|'|| /* Telefone do Representante Legal */
                 '|' || /* Estado de expedicao do CRC */
                 '|' || /* Numero sequencial no seguinte formato: UF/ano/numero */
                 '|' ||   /* Data de validade do CRC do contador */
                 'N'||'|'AS DSLINHA
            FROM EMPRESA
           WHERE CDEMPRESA = P_CDEMPRESA
             AND V_ANO >= 2016  ) LOOP
          V_NRORDREGARQ := V_NRORDREGARQ + 1;
          INSERT INTO ARQMAGNETICO
            (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
          VALUES
            (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_SIGNATARIO.DSLINHA, P_NRSEQARQMAG);
      END LOOP;

      IF P_PORTE = '1' THEN /* EMPRESA DE GRANDE PORTE */
         IF V_ANO <= 2017 THEN
            BEGIN
               SELECT '|J935|'          || /* Texto fixo */
                      NMAUDITOR||    '|'|| /* Nome do Auditor */
                      DSREGISTROCVM||'|'   /* Registro do Auditor na CVM */
                      AS DSLINHA
                 INTO V_AUXILIAR
                 FROM AUDINDEPENDENTE A, AUDINDEMPRESA AE
                WHERE AE.CDEMPRESA = P_CDEMPRESA
                  AND AE.NRSEQAUDITOR = A.NRSEQUENCIAL;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_AUXILIAR := NULL;
            END;
         ELSE
            BEGIN
               SELECT '|J935|'          || /* Texto fixo */
                      NRINSJURAUDI|| '|'||/*cpf do auditor*/
                      NMAUDITOR||    '|'|| /* Nome do Auditor */
                      DSREGISTROCVM||'|'   /* Registro do Auditor na CVM */
                      AS DSLINHA
                 INTO V_AUXILIAR
                 FROM AUDINDEPENDENTE A, AUDINDEMPRESA AE
                WHERE AE.CDEMPRESA = P_CDEMPRESA
                  AND AE.NRSEQAUDITOR = A.NRSEQUENCIAL;
            EXCEPTION
               WHEN NO_DATA_FOUND THEN
                  V_AUXILIAR := NULL;
            END;

         END IF;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);
      END IF;
   ELSE
      /* O leiaute referente ao FCont nao e o mesmo que o SPED Contabil. Sendo assim,
         foi preciso separar os blocos referentes ao signatario/contador */
      BEGIN
         SELECT '|J930|'||
                NMCONTADOR||'|'||
                NRCPFRESPONS||'|'||
                NVL(Q.NMQUALIFASSINA,'Contabilista')||'|'||
                NVL(C.CDQUALIFASSINA,'900')||'|'||
                NVL(NRCRCCONT2,'')||'|' AS DSLINHA
           INTO V_AUXILIAR
           FROM EMPRESA E, CONTADOR C, QUALIFASSINANTE Q
          WHERE E.CDEMPRESA = P_CDEMPRESA
            AND E.CDCONTADOR2 = C.CDCONTADOR2
            AND Q.CDQUALIFASSINA = C.CDQUALIFASSINA;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_AUXILIAR := NULL;
      END;
      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_SIGNATARIO IN(
          SELECT '|J930|'||
                 R.NMREPRES||'|'||
                 R.NRCPFREPRES||'|'||
                 Q.NMQUALIFASSINA||'|'||
                 Q.CDQUALIFASSINA||'||' AS DSLINHA
          FROM REPRESLEGAL R, QUALIFASSINANTE Q, REPRESEMPRESA RE
          WHERE RE.CDEMPRESA = P_CDEMPRESA
            AND RE.CDREPRES = R.CDREPRES
            AND RE.IDATIVO = 'S'
            AND R.CDQUALIFASSINA = Q.CDQUALIFASSINA) LOOP
          V_NRORDREGARQ := V_NRORDREGARQ + 1;
          INSERT INTO ARQMAGNETICO
            (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
          VALUES
            (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_SIGNATARIO.DSLINHA, P_NRSEQARQMAG);
      END LOOP;
   END IF;
   SELECT '|J990|'||
          TO_CHAR(COUNT(*) + 1)||'|' AS DSLINHA
   INTO V_AUXILIAR
   FROM ARQMAGNETICO
   WHERE NRSEQARQMAG = P_NRSEQARQMAG
     AND SUBSTR(DSREGARQMAG,2,1) = 'J';
   V_NRORDREGARQ := V_NRORDREGARQ + 1;
   INSERT INTO ARQMAGNETICO
     (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
   VALUES
     (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_AUXILIAR, P_NRSEQARQMAG);
   P_NRORDREGARQ := V_NRORDREGARQ;
END;
/