CREATE OR REPLACE
PROCEDURE SPED_CONTABIL_PLANOCONTA (
   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_TIPOLIVRO IN VARCHAR2,
   P_NRINIORDENA  IN INTEGER,
   P_IDSPED       IN VARCHAR2,
   P_CODPLANCTB   IN VARCHAR2,
   P_NRORDREGARQ  OUT INTEGER)
IS
   V_NRORDREGARQ INTEGER;
   V_AUXILIAR    VARCHAR2(200);
   V_NRLIVROESCRITU VARCHAR2(10);
   V_ANO NUMBER;
   V_IDFORMAPUR VARCHAR2(03);
   V_UTILSUBCONTA VARCHAR2(01);
   V_LIVRO VARCHAR2(01);
BEGIN
   V_NRORDREGARQ := P_NRINIORDENA;
   V_ANO := TO_NUMBER(TO_CHAR(P_DTFINAL, 'YYYY'));
   V_LIVRO := P_TIPOLIVRO;
   BEGIN
      SELECT FORMATRIB
        INTO V_IDFORMAPUR
        FROM REG0010_ECF
       WHERE CDEMPRESA = P_CDEMPRESA;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_IDFORMAPUR := NULL;
   END;
   IF V_IDFORMAPUR IS NULL THEN
      BEGIN
         SELECT IDFORMAPUR
           INTO V_IDFORMAPUR
           FROM EMPRESA
          WHERE CDEMPRESA = P_CDEMPRESA;
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_IDFORMAPUR := NULL;
      END;
   END IF;
   IF V_IDFORMAPUR IN ('1','2') THEN
      V_IDFORMAPUR := 'R';
   ELSIF V_IDFORMAPUR IN ('3', '4', '5', '7') THEN
      V_IDFORMAPUR := 'P';
   ELSIF V_IDFORMAPUR IN ('8','9') THEN
      V_IDFORMAPUR := 'I';
   END IF;
   IF V_IDFORMAPUR IN ('LPM', 'LPT') THEN
      V_IDFORMAPUR := 'P';
   ELSIF V_IDFORMAPUR IN ('LRM', 'LRT') THEN
      V_IDFORMAPUR := 'R';
   END IF;


   BEGIN
      SELECT NRLIVROESCRITU
        INTO V_NRLIVROESCRITU
        FROM TERMOABERT
       WHERE CDLIVRCONT = 'D'
         AND IDMODELO = 'A'
         AND CDEMPRESA = P_CDEMPRESA;
   EXCEPTION
    WHEN NO_DATA_FOUND THEN
       V_NRLIVROESCRITU := '1';
   END;

   IF P_IDSPED = 'S' THEN
      V_NRORDREGARQ := V_NRORDREGARQ + 1;
      INSERT INTO ARQMAGNETICO
        (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
      VALUES
        (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), '|I001|0|', P_NRSEQARQMAG);

      /* I010 - Registro que identifica a forma de escrituracao.
        Neste caso o G, de diario geral.  */
      V_NRORDREGARQ := V_NRORDREGARQ + 1;
      IF V_ANO = 2013 THEN
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), '|I010|'||V_LIVRO||'|2.00|', P_NRSEQARQMAG);
      ELSIF V_ANO = 2014 THEN
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), '|I010|'||V_LIVRO||'|3.00|', P_NRSEQARQMAG);
      ELSIF V_ANO = 2015 THEN
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), '|I010|'||V_LIVRO||'|4.00|', P_NRSEQARQMAG);
      ELSIF V_ANO IN (2016,2017,2018) THEN
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), '|I010|'||V_LIVRO||'|5.00|', P_NRSEQARQMAG);
      ELSIF V_ANO = 2019 THEN
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), '|I010|'||V_LIVRO||'|7.00|', P_NRSEQARQMAG);

      ELSIF V_ANO = 2020 THEN
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), '|I010|'||V_LIVRO||'|9.00|', P_NRSEQARQMAG);
      ELSE
         INSERT INTO ARQMAGNETICO
           (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
           (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), '|I010|'||V_LIVRO||'|9.00|', P_NRSEQARQMAG);

      END IF;

      IF V_LIVRO IN ('Z', 'R') THEN
         /* Leiaute do FCont difere do SPED Contabil. */
         SELECT '|I012'    ||'|'||
                             '|'||
                             '|'||
                             '|'||
                             '|'
          INTO V_AUXILIAR
          FROM EMPRESA E, MUNICIPIO M
         WHERE E.CDPAIS = M.CDPAIS
           AND E.SGESTADO = M.SGESTADO
           AND E.CDMUNICIPIO = M.CDMUNICIPIO
           AND 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 V_LIVRO = 'Z' THEN
            /* QUANDO O LIVRO E AUXILIAR AS CONTAS A IREM PARA O ARQUIVO DEVEM SER SINTETICAS */
            FOR C_I015 IN
               (SELECT DISTINCT DSLINHA
                  FROM (SELECT '|I015'         ||'|'|| /* REGISTRO */
                                 SINT.CDCONTCTBL  ||'|' AS DSLINHA
                          FROM CAPARAZAOAUXECD CAPA JOIN RAZAOAUXECD R JOIN CONTCTBLCORRE CC JOIN CONTCTBL ANALIT JOIN CONTCTBL SINT
                                                                                                                    ON ANALIT.CDCONTCTBL LIKE SINT.CDCONTCTBL||'%'
                                                                                               ON CC.CDCONTCTBL = ANALIT.CDCONTCTBL
                                                                         ON R.NRSEQSUBCONTA = CC.NRSEQUENCIAL
                                                      ON CAPA.NRSEQUENCIAL = R.NRSEQCAPARAZAO
                         WHERE CAPA.CDEMPRESA = P_CDEMPRESA
                           AND CAPA.DTECD BETWEEN P_DTINICIAL AND P_DTFINAL
                           AND SINT.CDNVCONTCTBL = ANALIT.CDNVCONTCTBL-1
                         ORDER BY CC.CDCONTCTBL))LOOP
               V_NRORDREGARQ := V_NRORDREGARQ + 1;
               INSERT INTO ARQMAGNETICO
                 (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
               VALUES
                 (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_I015.DSLINHA, P_NRSEQARQMAG);
            END LOOP;
         ELSE
            /* QUANDO O LIVRO E O PRINCIPAL E CONTEM LIVROS AUXILIARES AS CONTAS A IREM PARA O ARQUIVO DEVEM SER ANALITICAS */
            FOR C_I015 IN
               (SELECT DISTINCT DSLINHA
                  FROM (SELECT '|I015'            ||'|'|| /* REGISTRO */
                                 CC.CDCONTACORRE  ||'|' AS DSLINHA
                          FROM CAPARAZAOAUXECD CAPA JOIN RAZAOAUXECD R JOIN CONTCTBLCORRE CC
                                                                         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 CC.CDCONTCTBL))LOOP
               V_NRORDREGARQ := V_NRORDREGARQ + 1;
               INSERT INTO ARQMAGNETICO
                 (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
               VALUES
                 (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_I015.DSLINHA, P_NRSEQARQMAG);
            END LOOP;
         END IF;
      END IF;

      IF V_ANO <= 2013 THEN
         SELECT '|I030|'                              ||  /* Texto fixo contendo "I030". */
                'TERMO DE ABERTURA|'                  ||  /* Texto fixo contendo "TERMO DE ABERTURA". */
                V_NRLIVROESCRITU||                 '|'||  /* Numero de ordem do instrumento de escrituracao. */
                P_DSNATUREZA||                     '|'||  /* Natureza do livro. Finalidade a que se destina o instrumento. */
                '#QTDE_TOTAL#|'                       ||  /* Quantidade de Linhas */
                E.NMRAZSOCEMPR||                   '|'||  /* Nome da Empresa */
                NVL(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(E.NRREGJUNCOM, ' ', ''),'.',''),',',''),'-',''),'/',''),'')||'|'|| /* NIRE */
                E.NRINSJUREMPR||                   '|'|| /* CNPJ da Empresa */
                TO_CHAR(E.DTREGJUNCOM,'DDMMYYYY')||'|'|| /* Data de Registro na Junta Comercial */
                                                   '|'|| /* Data de arquivamento do ato de conversao de sociedade
                                                            simples em sociedade empresaria. */
                M.NMMUNICIPIO||                    '|'|| /* Nome do municipio */
                                                   '|'|| /* Data de encerramento do exercicio social. */
                                                   '|'|| /* Nome do auditor independente. */
                                                   '|'   /* Registro do auditor independente na CVM. */  AS DSLINHA
         INTO V_AUXILIAR
         FROM EMPRESA E, MUNICIPIO M
         WHERE E.CDPAIS = M.CDPAIS
           AND E.SGESTADO = M.SGESTADO
           AND E.CDMUNICIPIO = M.CDMUNICIPIO
           AND E.CDEMPRESA = P_CDEMPRESA;
      ELSIF V_ANO >= 2014 THEN
         SELECT '|I030|'                              ||  /* Texto fixo contendo "I030". */
                'TERMO DE ABERTURA|'                  ||  /* Texto fixo contendo "TERMO DE ABERTURA". */
                V_NRLIVROESCRITU||                 '|'||  /* Numero de ordem do instrumento de escrituracao. */
                P_DSNATUREZA||                     '|'||  /* Natureza do livro. Finalidade a que se destina o instrumento. */
                '#QTDE_TOTAL#|'                       ||  /* Quantidade de Linhas */
                E.NMRAZSOCEMPR||                   '|'||  /* Nome da Empresa */
                NVL(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(E.NRREGJUNCOM, ' ', ''),'.',''),',',''),'-',''),'/',''),'')||'|'|| /* NIRE */
                E.NRINSJUREMPR||                   '|'|| /* CNPJ da Empresa */
                TO_CHAR(E.DTREGJUNCOM,'DDMMYYYY')||'|'|| /* Data de Registro na Junta Comercial */
                                                   '|'|| /* Data de arquivamento do ato de conversao de sociedade
                                                            simples em sociedade empresaria. */
                M.NMMUNICIPIO||                    '|'|| /* Nome do municipio */
                TO_CHAR(P_DTFINAL,'DDMMYYYY')||    '|'   /* Data de encerramento do exercicio social. */  AS DSLINHA
         INTO V_AUXILIAR
         FROM EMPRESA E, MUNICIPIO M
         WHERE E.CDPAIS = M.CDPAIS
           AND E.SGESTADO = M.SGESTADO
           AND E.CDMUNICIPIO = M.CDMUNICIPIO
           AND E.CDEMPRESA = P_CDEMPRESA;
      END IF;
   ELSE
      /* Leiaute do FCont difere do SPED Contabil. */
      SELECT '|I030|'||
             'TERMO DE ABERTURA|'||
             V_NRLIVROESCRITU||'|'||
             P_DSNATUREZA||'|'||
             '#QTDE_TOTAL#|'||
             E.NMRAZSOCEMPR||'|'||
             NVL(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(E.NRREGJUNCOM, ' ', ''),'.',''),',',''),'-',''),'/',''),'')||'|'||
             E.NRINSJUREMPR||'|'||
             TO_CHAR(E.DTREGJUNCOM,'DDMMYYYY')||'||'||
             M.NMMUNICIPIO||'|' AS DSLINHA
       INTO V_AUXILIAR
       FROM EMPRESA E, MUNICIPIO M
      WHERE E.CDPAIS = M.CDPAIS
        AND E.SGESTADO = M.SGESTADO
        AND E.CDMUNICIPIO = M.CDMUNICIPIO
        AND E.CDEMPRESA = P_CDEMPRESA;
   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);

   /* CASO O LIVRO SEJA AUXILIAR, A GERACAO DO PLANO DE CONTAS E FACULTATIVA, SENDO ASSIM NAO SERA GERADO */
   FOR C_I050 IN (SELECT '|I050|'||
                         TO_CHAR(P_DTINICIAL,'DDMMYYYY')||'|'||
                         (SELECT NVL(MAX(A.IDNATUCONT),'')
                            FROM CONTCTBL A
                           WHERE (A.CDCONTCTBL = (SELECT MAX(B.CDCONTCTBL)
                                                    FROM CONTCTBL B
                                                   WHERE (C.CDCONTCTBL LIKE B.CDCONTCTBL||'%')
                                                     AND (NVL(B.IDNATUCONT,'00') <> '00')
                                                     AND (B.IDCONTCCUS <> 'R')))
                             AND (A.IDCONTCCUS <> 'R'))||'|'||
                         C.IDTIPOCONT||'|'||
                         C.CDNVCONTCTBL||'|'||
                         C.CDCONTCTBL||'|'||
                         C.CDCONTANTE||'|'||
                         C.NMCONTCTBL||'|' AS DSLINHA,
                         C.IDTIPOCONT,
                         DECODE(V_IDFORMAPUR, 'R', C.CDCONTPLANREFE, 'P',CDCONTREFEPRE, CDCONTREFEIMUISEN) CDCONTPLANREFE,
                         C.CDCONTCTBL,
                         C.CDCONTREFEAUX,
                         CDCONTREFEPRE,
                        -- CDCONTPLANREFE,
                         CDCONTREFEIMUISEN
                    FROM CONTCTBL C
                   WHERE ((C.IDTIPOCONT = 'S') OR (((CDCONTPLANREFE IS NOT NULL)    AND (V_IDFORMAPUR = 'R')) OR
                                                   ((CDCONTREFEPRE IS NOT NULL)     AND (V_IDFORMAPUR = 'P')) OR
                                                   ((CDCONTREFEIMUISEN IS NOT NULL) AND (V_IDFORMAPUR = 'I'))))
                     AND (C.IDCONTCCUS <> 'R')
                   ORDER BY C.CDCONTCTBL)LOOP
      V_NRORDREGARQ := V_NRORDREGARQ + 1;
      INSERT INTO ARQMAGNETICO
        (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
      VALUES
        (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_I050.DSLINHA, P_NRSEQARQMAG);
      IF C_I050.IDTIPOCONT = 'A' THEN
         IF C_I050.CDCONTPLANREFE IS NOT NULL THEN
            IF ((V_ANO >= 2019) AND (P_IDSPED = 'S')) THEN
               IF V_IDFORMAPUR = 'R' THEN /* PJ EM GERAL - ID TEM QUE SER 1 */
                  V_AUXILIAR := '|I051|'||'|'||C_I050.CDCONTPLANREFE||'|';
               ELSIF V_IDFORMAPUR = 'P' THEN /* LUCRO PRESUMIDO - O ID TEM QUE SER 2 */
                  V_AUXILIAR := '|I051|'||'|'||C_I050.CDCONTPLANREFE||'|';
               ELSIF V_IDFORMAPUR = 'I' THEN
                  V_AUXILIAR := '|I051|'||'|'||C_I050.CDCONTPLANREFE||'|';
               END IF;
            ELSIF ((V_ANO >= 2014) AND (P_IDSPED = 'S')) THEN
               IF V_IDFORMAPUR = 'R' THEN /* PJ EM GERAL - ID TEM QUE SER 1 */
                  V_AUXILIAR := '|I051|1||'||C_I050.CDCONTPLANREFE||'|';
               ELSIF V_IDFORMAPUR = 'P' THEN /* LUCRO PRESUMIDO - O ID TEM QUE SER 2 */
                  V_AUXILIAR := '|I051|2||'||C_I050.CDCONTPLANREFE||'|';
               ELSIF V_IDFORMAPUR = 'I' THEN
                  V_AUXILIAR := '|I051|5||'||C_I050.CDCONTPLANREFE||'|';
               END IF;
            ELSE
               V_AUXILIAR := '|I051|10||'||C_I050.CDCONTREFEAUX||'|';
            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;

         IF V_LIVRO <> 'Z' THEN
            /* IDENTIFICACAO DE QUAIS ITENS DE ESTRUTURA A CONTA CONTABIL E UTILIZADA */
            FOR C_I052 IN(
              /*  TIPO DEMONSTRATIVO  + GRUPO NO DEMONSTRATIVO + ITEM DE ESTRUTUAR */
              SELECT '|I052||'||T.IDREFESPED||I.IDGRUPOBALSPED||I.CDITEMSTRU||'|' AS DSLINHA
                FROM TIPODEMO T, ITEMDEMOF I, ITEMAPUCTB IA
               WHERE T.CDTIPODEMO = I.CDTIPODEMO
                 AND I.CDTIPODEMO = IA.CDTIPODEMO
                 AND I.CDITEMSTRU = IA.CDITEMSTRU
                 AND IA.IDTIPOORIG = 'S'
                 AND C_I050.CDCONTCTBL LIKE IA.CDORIGDEMO||'%'
                 AND I.IDSTSALDOITSPED NOT IN ('P','N')
                 AND T.IDREFESPED in ('B', 'D', 'L', 'M') -- DRE, BALANCO, DLPA, DMPL
                 AND I.IDGRUPOBALSPED IS NOT NULL) LOOP
                V_NRORDREGARQ := V_NRORDREGARQ + 1;
                INSERT INTO ARQMAGNETICO
                  (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
                VALUES
                  (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_I052.DSLINHA, P_NRSEQARQMAG);
            END LOOP;

            /* SUBCONTAS CORRELATAS */
            IF ((V_ANO >= 2014) AND (P_IDSPED = 'S') AND (V_UTILSUBCONTA = 'S')) THEN
               FOR C_I053 IN(
                  SELECT '|I053'        ||'|'|| /* NOME DO REGISTRO */
                         G.CDGRUPO      ||'|'|| /* CODIGO DO GRUPO DA SUBCONTA */
                         C.CDCONTACORRE ||'|'|| /* CODIGO DA SUBCONTA CORRELATA */
                         N.CDNATUCONT   ||'|'   /* CODIGO NA NATUREZA DA SUBCONTA CORRELATA */
                         AS DSLINHA
                    FROM CONTCTBLCORRE C, NATUCONTCORRE N, GRUPOCONTACORRE G
                   WHERE C.CDCONTCTBL = C_I050.CDCONTCTBL
                     AND C.NRSEQGRUPO = G.NRSEQUENCIAL
                     AND C.NRSEQNATU = N.NRSEQUENCIAL) LOOP
                  V_NRORDREGARQ := V_NRORDREGARQ + 1;
                  INSERT INTO ARQMAGNETICO
                     (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
                  VALUES
                     (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), C_I053.DSLINHA, P_NRSEQARQMAG);
               END LOOP;
            END IF;
         END IF;
      END IF;
   END LOOP;
   P_NRORDREGARQ := V_NRORDREGARQ;
END;
/