CREATE OR REPLACE PROCEDURE SPED_ECF_BLOCOP_LUCRO_PRES(
   P_CDEMPRESA IN EMPRESA.CDEMPRESA%TYPE,
   P_ANO IN VARCHAR,
   P_NRSEQARQMAG IN VARCHAR,
   P_NRORDEMATUAL IN NUMBER,
   P_NRORDENACAO OUT NUMBER)
IS
   V_LINHA VARCHAR2(4000);
   V_NRORDREGARQ NUMBER;
   V_COUNT NUMBER;
   V_DATAINICIAL DATE;
   V_DATAFINAL DATE;
   V_TEMP VARCHAR2(12);
   V_MES VARCHAR2(02);
   V_COUNTTRI NUMBER;
   V_GERAP NUMBER;
   
   FUNCTION GERA_P(P_CDEMPRESA IN VARCHAR) RETURN NUMBER
   AS
      V_RETORNO NUMBER;
   BEGIN
      V_RETORNO := 0;
      /* CONDICAO PARA GERAR O REGISTRO P230 e P130, DE ACORDO COM O LEIAUTE DO VALIDADOR
         A empresa deve ser optante pelo REFIS e ter alguma Reducao ou Isencao do imposto
         para Lucro Presumido  */
      BEGIN
         SELECT COUNT(*)
           INTO V_RETORNO
           FROM REG0020_ECF R, REG0010_ECF RE
          WHERE RE.CDEMPRESA = P_CDEMPRESA
            AND R.CDEMPRESA = RE.CDEMPRESA
            AND R.INDREDISEN = 'S'
            AND RE.OPTREFIS = 'S';
      EXCEPTION
         WHEN NO_DATA_FOUND THEN
            V_RETORNO := 0;
      END;
      RETURN(V_RETORNO);
   END;
BEGIN
   /* PROCEDURE RESPONSAVEL POR GERAR AS INFORMACOES REFERENTES AO LUCRO PRESUMIDO */

   V_DATAINICIAL := TO_DATE('01/01/'||P_ANO);
   V_DATAFINAL := TO_DATE('31/12/'||P_ANO);
   V_NRORDREGARQ := P_NRORDEMATUAL;
   BEGIN
      SELECT '|P001' ||'|'|| /* NOME DO REGISTRO */
             '0'     ||'|'   /* INDICADOR DE MOVIMENTO
                             0- BLOCO COM DADOS INFORMADOS
                             1- BLOCO SEM 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);

   BEGIN
      SELECT FORMAAPUR
        INTO V_TEMP
        FROM REG0010_ECF
       WHERE CDEMPRESA = P_CDEMPRESA;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         V_TEMP := NULL;
   END;
   
   V_GERAP := GERA_P(P_CDEMPRESA);
   IF V_TEMP = 'A' THEN
      BEGIN
         SELECT '|P030'         ||'|'|| /* NOME DO REGISTRO */
                '0101'||P_ANO   ||'|'|| /* DATA INICIAL DO PERIODO */
                '3112'||P_ANO   ||'|'|| /* DATA FINAL DO PERIODO */
                'A00'           ||'|'   /* PERIODO DE APURACAO.
                                           NO CASO DE APURACAO ANUAL, E OBRIGATORIO O REGISTRO A00 */
           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);

      IF V_GERAP > 0 THEN
         /* REGISTRO P130: DEMONSTRACAO DAS RECEITAS INCENTIVADAS DO LUCRO PRESUMIDO */
         FOR REG130 IN (
            SELECT '|P130'              ||'|'|| /*  TEXTO FIXO P130 */
                   REG.CDREGP130        ||'|'|| /* CODIGO DA RECEITA INCENTIVDA */
                   REG.DSREGP130        ||'|'|| /* DESCRICAO DA RECEITA INCENTIVADA */
                   REPLACE(LTRIM(TO_CHAR(ABS(NVL(ROUND(SUM(R.VRRECINCEMPR), 2),0)),'9999999999990.00')), '.', ',')  ||'|' AS DSLINHA /* VALOR DA RECEITA INCENTIVADA */
              FROM RECINCEMPR R, REGP130ECF REG
             WHERE CDEMPRESA = P_CDEMPRESA
               AND DTRECINCEMPR BETWEEN V_DATAINICIAL AND V_DATAFINAL
               AND R.NRSEQREGP130 = REG.NRSEQREGP130
               AND REG.IDTIPOP130 <> 'R'
               AND R.DTREFERENCIA = TO_DATE('31/12/'||P_ANO)
             GROUP BY REG.DSREGP130, REG.CDREGP130
             ORDER BY REG.CDREGP130) LOOP
            V_NRORDREGARQ := V_NRORDREGARQ + 1;
            INSERT INTO ARQMAGNETICO
               (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
            VALUES
               (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), REG130.DSLINHA, P_NRSEQARQMAG);
         END LOOP;
      END IF;

      /* REGISTRO P200: APURACAO DA BASE DE CALCULO DO LUCRO PRESUMIDO */
      FOR REG200 IN (
         SELECT '|P200'              ||'|'|| /*  TEXTO FIXO P200 */
                REG.CDREGP200        ||'|'|| /* CODIGO DA BASE DE CALCULO DO LUCRO PRESUMIDO */
                REG.DSREGP200        ||'|'|| /* DESCRICAO DA BASE DE CALCULO DO LUCRO PRESUMIDO */
                REPLACE(LTRIM(TO_CHAR(ABS(NVL(ROUND(SUM(R.VRBASECALCPEMPR), 2),0)),'9999999999990.00')), '.', ',')  ||'|' AS DSLINHA /* VALOR DA BASE DE CALCULO */
           FROM BASECALCPEMPR R, REGP200ECF REG
          WHERE CDEMPRESA = P_CDEMPRESA
            AND DTBASECALCPEMPR BETWEEN V_DATAINICIAL AND V_DATAFINAL
            AND R.NRSEQREGP200 = REG.NRSEQREGP200
            AND REG.IDTIPOP200 <> 'R'
            AND R.DTREFERENCIA = TO_DATE('31/12/'||P_ANO)
          GROUP BY REG.CDREGP200, REG.DSREGP200
          ORDER BY REG.CDREGP200) LOOP
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
            (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
            (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), REG200.DSLINHA, P_NRSEQARQMAG);
      END LOOP;

      IF V_GERAP > 0 THEN
         /* REGISTRO P230: CALCULO DA ISENCAO E REDUCAO DO LUCRO PRESUMIDO */
         FOR REG230 IN (
            SELECT '|P230'              ||'|'|| /*  TEXTO FIXO P230 */
                   REG.CDREGP230        ||'|'|| /* CODIGO DA ISENCAO OU REDUCAO DO LUCRO PRESUMIDO */
                   REG.DSREGP230        ||'|'|| /* DESCRICAO DA ISENCAO OU REDUCAO DO LUCRO PRESUMIDO */
                   REPLACE(LTRIM(TO_CHAR(ABS(NVL(ROUND(SUM(R.VRCALCISEREDP), 2),0)),'9999999999990.00')), '.', ',')  ||'|' AS DSLINHA /* VALOR DA ISENCAO OU REDUCAO */
              FROM CALCISEREDP R, REGP230ECF REG
             WHERE CDEMPRESA = P_CDEMPRESA
               AND DTCALCISEREDP BETWEEN V_DATAINICIAL AND V_DATAFINAL
               AND R.NRSEQREGP230 = REG.NRSEQREGP230
               AND REG.IDTIPOP230 <> 'R'
               AND R.DTREFERENCIA = TO_DATE('31/12/'||P_ANO)
             GROUP BY REG.CDREGP230, REG.DSREGP230
             ORDER BY REG.CDREGP230) LOOP
            V_NRORDREGARQ := V_NRORDREGARQ + 1;
            INSERT INTO ARQMAGNETICO
               (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
            VALUES
               (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), REG230.DSLINHA, P_NRSEQARQMAG);
         END LOOP;
      END IF;

      /* REGISTRO P300: CALCULO DO IRPJ COM BASE DO LUCRO PRESUMIDO */
      FOR REG300 IN (
         SELECT '|P300'              ||'|'|| /*  TEXTO FIXO P300 */
                REG.CDREGP300        ||'|'|| /* CODIGO DA ISENCAO OU REDUCAO DO LUCRO PRESUMIDO */
                REG.DSREGP300        ||'|'|| /* DESCRICAO DA ISENCAO OU REDUCAO DO LUCRO PRESUMIDO */
                REPLACE(LTRIM(TO_CHAR(ABS(NVL(ROUND(SUM(R.VRCALCIRPJP), 2),0)),'9999999999990.00')), '.', ',')  ||'|' AS DSLINHA /* VALOR DO CALCULO DO IRPJ */
           FROM CALCIRPJP R, REGP300ECF REG
          WHERE CDEMPRESA = P_CDEMPRESA
            AND DTCALCIRPJP BETWEEN V_DATAINICIAL AND V_DATAFINAL
            AND R.NRSEQREGP300 = REG.NRSEQREGP300
            AND REG.IDTIPOP300 <> 'R'
            AND R.DTREFERENCIA = TO_DATE('31/12/'||P_ANO)
          GROUP BY REG.CDREGP300, REG.DSREGP300
          ORDER BY REG.CDREGP300) LOOP
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
            (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
            (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), REG300.DSLINHA, P_NRSEQARQMAG);
      END LOOP;

      /* REGISTRO P400: APURACAO DA BASE DE CALCULO DA CSLL COM BASE DO LUCRO PRESUMIDO */
      FOR REG400 IN (
         SELECT '|P400'              ||'|'|| /*  TEXTO FIXO P400 */
                REG.CDREGP400        ||'|'|| /* CODIGO DA BASE DE CALCULO DA CSLL DO LUCRO PRESUMIDO */
                REG.DSREGP400        ||'|'|| /* DESCRICAO DA BASE DE CALCULO DA CSLL DO LUCRO PRESUMIDO */
                REPLACE(LTRIM(TO_CHAR(ABS(NVL(ROUND(SUM(R.VRBASECSLLP), 2),0)),'9999999999990.00')), '.', ',')  ||'|' AS DSLINHA /* VALOR DA BASE DE CALCULO DA CSLL */
           FROM BASECSLLP R, REGP400ECF REG
          WHERE CDEMPRESA = P_CDEMPRESA
            AND DTBASECSLLP BETWEEN V_DATAINICIAL AND V_DATAFINAL
            AND R.NRSEQREGP400 = REG.NRSEQREGP400
            AND REG.IDTIPOP400 <> 'R'
            AND R.DTREFERENCIA = TO_DATE('31/12/'||P_ANO)
          GROUP BY REG.CDREGP400, REG.DSREGP400
          ORDER BY REG.CDREGP400) LOOP
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
            (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
            (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), REG400.DSLINHA, P_NRSEQARQMAG);
      END LOOP;

      /* REGISTRO P500: CALCULO DA CSLL COM BASE DO LUCRO PRESUMIDO */
      FOR REG500 IN (
         SELECT '|P500'              ||'|'|| /*  TEXTO FIXO P500 */
                REG.CDREGP500        ||'|'|| /* CODIGO DO CALCULO DA CSLL DO LUCRO PRESUMIDO */
                REG.DSREGP500        ||'|'|| /* DESCRICAO DO CALCULO DA CSLL DO LUCRO PRESUMIDO */
                REPLACE(LTRIM(TO_CHAR(ABS(NVL(ROUND(SUM(R.VRCALCCSLLP), 2),0)),'9999999999990.00')), '.', ',')  ||'|' AS DSLINHA /* VALOR DO CALCULO DA CSLL */
           FROM CALCCSLLP R, REGP500ECF REG
          WHERE CDEMPRESA = P_CDEMPRESA
            AND DTCALCCSLLP BETWEEN V_DATAINICIAL AND V_DATAFINAL
            AND R.NRSEQREGP500 = REG.NRSEQREGP500
            AND R.DTREFERENCIA = TO_DATE('31/12/'||P_ANO)
            AND REG.IDTIPOP500 <> 'R'
          GROUP BY REG.CDREGP500, REG.DSREGP500
          ORDER BY REG.CDREGP500) LOOP
         V_NRORDREGARQ := V_NRORDREGARQ + 1;
         INSERT INTO ARQMAGNETICO
            (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
         VALUES
            (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), REG500.DSLINHA, P_NRSEQARQMAG);
      END LOOP;
   ELSE
      /* Rotina de apuracao Trimestral */
      V_COUNT := 1;
      V_DATAINICIAL := TO_DATE('01/'||LPAD(TO_CHAR(V_COUNT),2,'0')||'/'||P_ANO);
      V_DATAFINAL := LAST_DAY(ADD_MONTHS(V_DATAINICIAL, 2));
      WHILE V_COUNT <= 4 LOOP
         V_COUNTTRI := 0;
         BEGIN
            SELECT COUNT(*)
              INTO V_COUNTTRI
              FROM REG0010_ECF
             WHERE CDEMPRESA = P_CDEMPRESA
               AND SUBSTR(FORMATRIBPER, V_COUNT, 1) = 'P';
         EXCEPTION
            WHEN NO_DATA_FOUND THEN
               V_COUNTTRI := 0;
         END;
         IF V_COUNTTRI <> 0 THEN
            V_MES := LPAD(TO_CHAR(V_COUNT),2,'0');
            BEGIN
               SELECT '|P030'         ||'|'|| /* NOME DO REGISTRO */
                       TO_CHAR(V_DATAINICIAL, 'DDMMYYYY')   ||'|'|| /* DATA INICIAL DO PERIODO */
                       TO_CHAR(V_DATAFINAL, 'DDMMYYYY')     ||'|'|| /* DATA FINAL DO PERIODO */
                       'T'||V_MES                           ||'|'   /* PERIODO DE APURACAO */
                 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);

            IF V_GERAP > 0 THEN
               /* REGISTRO P130: DEMONSTRACAO DAS RECEITAS INCENTIVADAS DO LUCRO PRESUMIDO */
               FOR REG130 IN (
                  SELECT '|P130'              ||'|'|| /*  TEXTO FIXO P130 */
                         REG.CDREGP130        ||'|'|| /* CODIGO DA RECEITA INCENTIVDA */
                         REG.DSREGP130        ||'|'|| /* DESCRICAO DA RECEITA INCENTIVADA */
                         REPLACE(LTRIM(TO_CHAR(ABS(NVL(ROUND(SUM(R.VRRECINCEMPR), 2),0)),'9999999999990.00')), '.', ',')  ||'|' AS DSLINHA /* VALOR DA RECEITA INCENTIVADA */
                    FROM RECINCEMPR R, REGP130ECF REG
                   WHERE CDEMPRESA = P_CDEMPRESA
                     AND DTRECINCEMPR BETWEEN V_DATAINICIAL AND V_DATAFINAL
                     AND R.NRSEQREGP130 = REG.NRSEQREGP130
                     AND REG.IDTIPOP130 <> 'R'
                     AND R.DTREFERENCIA = TO_DATE('31/12/'||P_ANO)
                   GROUP BY REG.CDREGP130, REG.DSREGP130
                   ORDER BY REG.CDREGP130) LOOP
                  V_NRORDREGARQ := V_NRORDREGARQ + 1;
                  INSERT INTO ARQMAGNETICO
                     (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
                  VALUES
                     (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), REG130.DSLINHA, P_NRSEQARQMAG);
               END LOOP;
            END IF;

            /* REGISTRO P200: APURACAO DA BASE DE CALCULO DO LUCRO PRESUMIDO */
            FOR REG200 IN (
               SELECT '|P200'              ||'|'|| /*  TEXTO FIXO P200 */
                      REG.CDREGP200        ||'|'|| /* CODIGO DA BASE DE CALCULO DO LUCRO PRESUMIDO */
                      REG.DSREGP200        ||'|'|| /* DESCRICAO DA BASE DE CALCULO DO LUCRO PRESUMIDO */
                      REPLACE(LTRIM(TO_CHAR(ABS(NVL(ROUND(SUM(R.VRBASECALCPEMPR), 2),0)),'9999999999990.00')), '.', ',')  ||'|' AS DSLINHA /* VALOR DA BASE DE CALCULO */
                 FROM BASECALCPEMPR R, REGP200ECF REG
                WHERE CDEMPRESA = P_CDEMPRESA
                  AND DTBASECALCPEMPR BETWEEN V_DATAINICIAL AND V_DATAFINAL
                  AND R.NRSEQREGP200 = REG.NRSEQREGP200
                  AND REG.IDTIPOP200 <> 'R'
                  AND R.DTREFERENCIA = TO_DATE('31/12/'||P_ANO)
                GROUP BY REG.CDREGP200, REG.DSREGP200
                ORDER BY REG.CDREGP200) LOOP
               V_NRORDREGARQ := V_NRORDREGARQ + 1;
               INSERT INTO ARQMAGNETICO
                  (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
               VALUES
                  (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), REG200.DSLINHA, P_NRSEQARQMAG);
            END LOOP;

            IF V_GERAP > 0 THEN
               /* REGISTRO P230: CALCULO DA ISENCAO E REDUCAO DO LUCRO PRESUMIDO */
               FOR REG230 IN (
                  SELECT '|P230'              ||'|'|| /*  TEXTO FIXO P230 */
                         REG.CDREGP230        ||'|'|| /* CODIGO DA ISENCAO OU REDUCAO DO LUCRO PRESUMIDO */
                         REG.DSREGP230        ||'|'|| /* DESCRICAO DA ISENCAO OU REDUCAO DO LUCRO PRESUMIDO */
                         REPLACE(LTRIM(TO_CHAR(ABS(NVL(ROUND(SUM(R.VRCALCISEREDP), 2),0)),'9999999999990.00')), '.', ',')  ||'|' AS DSLINHA /* VALOR DA ISENCAO OU REDUCAO */
                    FROM CALCISEREDP R, REGP230ECF REG
                   WHERE CDEMPRESA = P_CDEMPRESA
                     AND DTCALCISEREDP BETWEEN V_DATAINICIAL AND V_DATAFINAL
                     AND R.NRSEQREGP230 = REG.NRSEQREGP230
                     AND REG.IDTIPOP230 <> 'R'
                     AND R.DTREFERENCIA = TO_DATE('31/12/'||P_ANO)
                   GROUP BY REG.CDREGP230, REG.DSREGP230
                   ORDER BY REG.CDREGP230) LOOP
                  V_NRORDREGARQ := V_NRORDREGARQ + 1;
                  INSERT INTO ARQMAGNETICO
                     (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
                  VALUES
                     (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), REG230.DSLINHA, P_NRSEQARQMAG);
               END LOOP;
            END IF;

            /* REGISTRO P300: CALCULO DO IRPJ COM BASE DO LUCRO PRESUMIDO */
            FOR REG300 IN (
               SELECT '|P300'              ||'|'|| /*  TEXTO FIXO P300 */
                      REG.CDREGP300        ||'|'|| /* CODIGO DA ISENCAO OU REDUCAO DO LUCRO PRESUMIDO */
                      REG.DSREGP300        ||'|'|| /* DESCRICAO DA ISENCAO OU REDUCAO DO LUCRO PRESUMIDO */
                      REPLACE(LTRIM(TO_CHAR(ABS(NVL(ROUND(SUM(R.VRCALCIRPJP), 2),0)),'9999999999990.00')), '.', ',')  ||'|' AS DSLINHA /* VALOR DO CALCULO DO IRPJ */
                 FROM CALCIRPJP R, REGP300ECF REG
                WHERE CDEMPRESA = P_CDEMPRESA
                  AND DTCALCIRPJP BETWEEN V_DATAINICIAL AND V_DATAFINAL
                  AND R.NRSEQREGP300 = REG.NRSEQREGP300
                  AND REG.IDTIPOP300 <> 'R'
                GROUP BY REG.CDREGP300, REG.DSREGP300
                ORDER BY REG.CDREGP300) LOOP
               V_NRORDREGARQ := V_NRORDREGARQ + 1;
               INSERT INTO ARQMAGNETICO
                  (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
               VALUES
                  (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), REG300.DSLINHA, P_NRSEQARQMAG);
            END LOOP;

            /* REGISTRO P400: APURACAO DA BASE DE CALCULO DA CSLL COM BASE DO LUCRO PRESUMIDO */
            FOR REG400 IN (
               SELECT '|P400'              ||'|'|| /*  TEXTO FIXO P400 */
                      REG.CDREGP400        ||'|'|| /* CODIGO DA BASE DE CALCULO DA CSLL DO LUCRO PRESUMIDO */
                      REG.DSREGP400        ||'|'|| /* DESCRICAO DA BASE DE CALCULO DA CSLL DO LUCRO PRESUMIDO */
                      REPLACE(LTRIM(TO_CHAR(ABS(NVL(ROUND(SUM(R.VRBASECSLLP), 2),0)),'9999999999990.00')), '.', ',')  ||'|' AS DSLINHA /* VALOR DA BASE DE CALCULO DA CSLL */
                 FROM BASECSLLP R, REGP400ECF REG
                WHERE CDEMPRESA = P_CDEMPRESA
                  AND DTBASECSLLP BETWEEN V_DATAINICIAL AND V_DATAFINAL
                  AND R.NRSEQREGP400 = REG.NRSEQREGP400
                  AND REG.IDTIPOP400 <> 'R'
                  AND R.DTREFERENCIA = TO_DATE('31/12/'||P_ANO)
                GROUP BY REG.CDREGP400, REG.DSREGP400
                ORDER BY REG.CDREGP400) LOOP
               V_NRORDREGARQ := V_NRORDREGARQ + 1;
               INSERT INTO ARQMAGNETICO
                  (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
               VALUES
                  (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), REG400.DSLINHA, P_NRSEQARQMAG);
            END LOOP;

            /* REGISTRO P500: CALCULO DA CSLL COM BASE DO LUCRO PRESUMIDO */
            FOR REG500 IN (
               SELECT '|P500'              ||'|'|| /*  TEXTO FIXO P500 */
                      REG.CDREGP500        ||'|'|| /* CODIGO DO CALCULO DA CSLL DO LUCRO PRESUMIDO */
                      REG.DSREGP500        ||'|'|| /* DESCRICAO DO CALCULO DA CSLL DO LUCRO PRESUMIDO */
                      REPLACE(LTRIM(TO_CHAR(ABS(NVL(ROUND(SUM(R.VRCALCCSLLP), 2),0)),'9999999999990.00')), '.', ',')  ||'|' AS DSLINHA /* VALOR DO CALCULO DA CSLL */
                 FROM CALCCSLLP R, REGP500ECF REG
                WHERE CDEMPRESA = P_CDEMPRESA
                  AND DTCALCCSLLP BETWEEN V_DATAINICIAL AND V_DATAFINAL
                  AND R.NRSEQREGP500 = REG.NRSEQREGP500
                  AND DTREFERENCIA = TO_DATE('31/12/'||P_ANO)
                  AND REG.IDTIPOP500 <> 'R'
                GROUP BY REG.CDREGP500, REG.DSREGP500
                ORDER BY REG.CDREGP500) LOOP
               V_NRORDREGARQ := V_NRORDREGARQ + 1;
               INSERT INTO ARQMAGNETICO
                  (NRORDREGARQ, DSREGARQMAG, NRSEQARQMAG)
               VALUES
                  (LPAD(TO_CHAR(V_NRORDREGARQ),10,'0'), REG500.DSLINHA, P_NRSEQARQMAG);
            END LOOP;
         END IF;
         V_DATAINICIAL := ADD_MONTHS(V_DATAINICIAL, 3);
         V_DATAFINAL := LAST_DAY(ADD_MONTHS(V_DATAFINAL, 3));
         V_COUNT := V_COUNT + 1;
      END LOOP;
   END IF;

   BEGIN
      SELECT '|P990'            ||'|'||  /* NOME DO REGISTRO */
             TO_CHAR(COUNT(*)+1) ||'|'    /* QUANTIDADE DE REGISTROS DO BLOCO P */
        INTO V_LINHA
        FROM ARQMAGNETICO
       WHERE NRSEQARQMAG = P_NRSEQARQMAG
         AND SUBSTR(DSREGARQMAG, 2, 1) = 'P';
   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;
/