CREATE OR REPLACE PROCEDURE SPED_ECF_BLOCOJ_CONTAS(
   P_CDEMPRESA IN EMPRESA.CDEMPRESA%TYPE,
   P_ANO IN VARCHAR,
   P_NRSEQARQMAG IN VARCHAR,
   P_NRORDEMATUAL IN NUMBER,
   P_NRORDENACAO OUT NUMBER)
IS
   V_NRORDREGARQ NUMBER;
   V_LINHA VARCHAR(4000);
BEGIN
   V_NRORDREGARQ := P_NRORDEMATUAL;

   /* PROCEDURE RESPONSAVEL PELO BLOCO J. BLOCO RESPONSAVEL
      PELAS CONTAS CONTABEIS E CENTROS DE CUSTOS */

   /* J001 - ABERTURA DO BLOCO J */
   BEGIN
      SELECT '|J001' || '|'||  /* NOME DO REGISTRO */
                 '0' || '|'    /* INDICADOR DE MOVIMENTO
                                  1 - SEM DADOS INFORMADOS
                                  0 - COM DADOS INFORMADOS */
        INTO V_LINHA
        FROM DUAL;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_LINHA := NULL;
   END;
   V_NRORDREGARQ := V_NRORDREGARQ + 1;
   INSERT INTO ARQMAGNETICO
      (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
   VALUES
      (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_LINHA, P_NRSEQARQMAG);

   /* J050: PLANO DE CONTAS DO CONTRIBUINTE */
   FOR C_J050 IN (
   SELECT '|J050'          ||'|'|| /* NOME DO REGISTRO */
          '0101'  || P_ANO ||'|'|| /* DATA DE ULTIMA ATUALIZACAO */
          (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')) ||'|'|| /* NATUREZA DA CONTA */
          C.IDTIPOCONT   ||'|'|| /* INDICADOR DA CONTA
                                    A- ANALITICA
                                    S- SINTETICA */
          C.CDNVCONTCTBL ||'|'|| /* NIVEL DA CONTA NA ARVORE */
          C.CDCONTCTBL   ||'|'|| /* CODIGO DA CONTA CONTABIL */
          C.CDCONTANTE   ||'|'|| /* CONTA DE NIVEL SUPERIOR */
          C.NMCONTCTBL   ||'|'   /* NOME DA CONTA CONTABIL */ AS DSLINHA,
          C.IDTIPOCONT,
          DECODE(R.FORMATRIB, '1', C.CDCONTPLANREFE, C.CDCONTREFEPRE) CDCONTPLANREFE,
          C.CDCONTCTBL
     FROM CONTCTBL C, REG0010_ECF R
    WHERE ((C.IDTIPOCONT = 'S') OR (C.CDCONTPLANREFE IS NOT NULL))
      AND (C.IDCONTCCUS <> 'R')
      AND R.CDEMPRESA = P_CDEMPRESA
    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_J050.DSLINHA, P_NRSEQARQMAG);


      IF C_J050.IDTIPOCONT = 'A' THEN
         /* REGISTRO J051: PLANO DE CONTAS REFERENCIAL */
         BEGIN
            SELECT '|J051'                || '|' || /* NOME DO REGISTRO */
                                             '|' || /* CENTRO DE CUSTO */
                    C_J050.CDCONTPLANREFE || '|'    /* CODIGO DA CONTA REFERENCIAL */
              INTO V_LINHA
              FROM DUAL;
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_LINHA := NULL;
         END;
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
            (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
            (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), V_LINHA, P_NRSEQARQMAG);
      END IF;
   END LOOP;

   /* REGISTRO J100: CENTRO DE CUSTOS */
   FOR C_J100 IN (
      SELECT '|J100'         ||'|'|| /* NOME DO REGISTRO */
              '3112'|| P_ANO ||'|'|| /* DATA DA ALTERACAO */
             C.CDCENTCUST    ||'|'|| /* CODIGO DO CENTRO DE CUSTO */
             RETIRA_CARACTER_ESPECIAL(C.NMCENTCUST,'S')||'|'  /* NOME DO CENTRO  DE CUSTO */ AS DSLINHA
      FROM CENTCUST C
      ORDER BY C.CDCENTCUST) 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;

   BEGIN
      SELECT '|J990'            ||'|'||  /* NOME DO REGISTRO */
             TO_CHAR(COUNT(*)+1) ||'|'    /* QUANTIDADE DE REGISTROS DO BLOCO J */
        INTO V_LINHA
        FROM ARQMAGNETICO
       WHERE NRSEQARQMAG = P_NRSEQARQMAG
         AND SUBSTR(DSREGARQMAG, 2, 1) = 'J';
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_LINHA := NULL;
   END;

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

   P_NRORDENACAO := V_NRORDREGARQ;
END;
/