CREATE OR REPLACE PROCEDURE GERA_FCI(
   P_CDFILIAL   IN MAPAFCI.CDFILIALFCI%TYPE,
   P_NRMAPAFCI  IN MAPAFCI.NRMAPAFCI%TYPE)

IS
   V_NRLINHA INTEGER;
   V_NRBLOCO INTEGER;
   V_NRINSJURFILI FILIAL.NRINSJURFILI%TYPE;
   V_NMRAZSOCFILI FILIAL.NMRAZSOCFILI%TYPE;
   V_CDINSCESTA   FILIAL.CDINSCESTA%TYPE;
   V_DSENDEFILI   ENDEFILI.DSENDEFILI%TYPE;
   V_NRCEPFILI    ENDEFILI.NRCEPFILI%TYPE;
   V_SGESTADO     ENDEFILI.SGESTADO%TYPE;
   V_NMMUNICIPIO  MUNICIPIO.NMMUNICIPIO%TYPE;
   V_EXITEPROD    INTEGER;
   V_NRLINHA5020  INTEGER;
   V_NRLINHATOTAL INTEGER;
BEGIN
   DELETE FROM ARQUIVOTXT
   WHERE CDFILIALFCI = P_CDFILIAL
     AND NRMAPAFCI = P_NRMAPAFCI;

   --BLOCO 0 - ABERTURA DO ARQUIVO
   V_NRBLOCO := 0;

   --REGISTRO 0000 - ABERTURA DO ARQUIVO E IDENTIFICACAO DO CONTRIBUINTE

   SELECT F.NRINSJURFILI, SUBSTR(F.NMRAZSOCFILI, 1, 255) AS NMRAZSOCFILI, SUBSTR(F.CDINSCESTA, 1, 20) AS CDINSCESTA,
          SUBSTR(E.DSENDEFILI, 1, 255) AS ENDERECO, SUBSTR(E.NRCEPFILI,1,8) AS NRCEPFILI, SUBSTR(M.NMMUNICIPIO, 1, 255), E.SGESTADO
     INTO V_NRINSJURFILI, V_NMRAZSOCFILI, V_CDINSCESTA,
          V_DSENDEFILI, V_NRCEPFILI, V_NMMUNICIPIO, V_SGESTADO
     FROM FILIAL F LEFT JOIN ENDEFILI E
                          ON F.CDFILIAL = E.CDFILIAL
                         AND E.IDTPENDEFILI = 'P'
                   INNER JOIN MUNICIPIO M
                           ON E.CDPAIS = M.CDPAIS
                          AND E.SGESTADO = M.SGESTADO
                          AND E.CDMUNICIPIO = M.CDMUNICIPIO
    WHERE F.CDFILIAL = P_CDFILIAL;


   IF V_NRINSJURFILI IS NOT NULL THEN
      V_NRLINHA := 1;
      V_NRLINHATOTAL := 1;
      INSERT INTO ARQUIVOTXT
      (CDFILIALFCI, NRMAPAFCI, NRBLOCO, NRLINHA, DSLINHA)
      VALUES
      (P_CDFILIAL, P_NRMAPAFCI, V_NRBLOCO, V_NRLINHA, '0000|'||V_NRINSJURFILI||'|'||V_NMRAZSOCFILI||'|'||'1.0');

      -- REGISTRO 0001 - ABERTURA DO BLOCO 0
      V_NRLINHA := V_NRLINHA +1;
      V_NRLINHATOTAL := V_NRLINHATOTAL +1;
      INSERT INTO ARQUIVOTXT
      (CDFILIALFCI, NRMAPAFCI, NRBLOCO, NRLINHA, DSLINHA)
      VALUES
      (P_CDFILIAL, P_NRMAPAFCI, V_NRBLOCO, V_NRLINHA, '0001|'||'Texto em caracteres UTF-8: (digrafo BR)'||''''||'cao'||''''||',(digrafo espanhol-enhe)'||''''||'n'||''''||',(trema)'||''''||'UE'||''''||',(ordinais)'||''''||''||''''||',(ligamento s+z alemao)'||''''||'SS'||''''||'.');

      -- REGISTRO 0010 - DADOS CADASTRAIS DO CONTRIBUINTE
      IF V_CDINSCESTA IS NOT NULL THEN
         V_NRLINHA := V_NRLINHA +1;
         V_NRLINHATOTAL := V_NRLINHATOTAL +1;
         INSERT INTO ARQUIVOTXT
         (CDFILIALFCI, NRMAPAFCI, NRBLOCO, NRLINHA, DSLINHA)
         VALUES
         (P_CDFILIAL, P_NRMAPAFCI, V_NRBLOCO, V_NRLINHA, '0010|'||V_NRINSJURFILI||'|'||V_NMRAZSOCFILI||'|'||V_CDINSCESTA||'|'||V_DSENDEFILI||'|'||V_NRCEPFILI||'|'||V_NMMUNICIPIO||'|'||V_SGESTADO);
      END IF;

      -- REGISTRO 0990 - ENCERRAMENTO DO BLOCO 0
      V_NRLINHA := V_NRLINHA +1;
      V_NRLINHATOTAL := V_NRLINHATOTAL +1;
      INSERT INTO ARQUIVOTXT
      (CDFILIALFCI, NRMAPAFCI, NRBLOCO, NRLINHA, DSLINHA)
      VALUES
      (P_CDFILIAL, P_NRMAPAFCI, V_NRBLOCO, V_NRLINHA, '0990|'||TO_CHAR(V_NRLINHA));
   END IF;

   --BLOCO 5 - DADOS DA MERCADORIA
   V_NRBLOCO := 5;

   SELECT COUNT(DISTINCT CDPRODUTOOP)
     INTO V_EXITEPROD
     FROM ITMAPAFCI I
    WHERE CDFILIALFCI = P_CDFILIAL
      AND NRMAPAFCI = P_NRMAPAFCI;

   --REGISTRO 5001 - ABERTURA DO BLOCO 5
   IF (V_EXITEPROD > 0) THEN
      V_NRLINHA := 1;
      V_NRLINHATOTAL := V_NRLINHATOTAL +1;
      INSERT INTO ARQUIVOTXT
      (CDFILIALFCI, NRMAPAFCI, NRBLOCO, NRLINHA, DSLINHA)
      VALUES
      (P_CDFILIAL, P_NRMAPAFCI, V_NRBLOCO, V_NRLINHA, '5001');


      --REGISTRO 5020 - DETALHAMENTO DAS MERCADORIAS
      V_NRLINHA5020 := 0;
      FOR C_ITEM IN (SELECT DISTINCT SUBSTR(P.NMPRODUTO, 1,255) AS NMPRODUTO, SUBSTR(P.CDCLASFISC, 1,8) AS CDCLASFISC, SUBSTR(P.CDARVPROD, 1,50) AS CDARVPROD,
                            SUBSTR(P.CDBARPRODUTO, 1, 14) AS CDBARPRODUTO, SUBSTR(P.SGUNIDADE, 1,6) AS SGUNIDADE,
                            LTRIM(TO_CHAR(ROUND(I.VRVENDAIE, 2), '9999999999990.99')) AS VRVENDAIE,
                            LTRIM(TO_CHAR(ROUND(I.VRPARCIMPO, 2), '9999999999990.99')) AS VRPARCIMPO,
                            LTRIM(TO_CHAR(ROUND(I.VRFCI, 2), '9999999999990.99')) AS VRFCI
                       FROM ITMAPAFCI I INNER JOIN PRODUTO P
                                                ON I.CDPRODUTOOP = P.CDPRODUTO
                      WHERE CDFILIALFCI = P_CDFILIAL
                        AND NRMAPAFCI = P_NRMAPAFCI)
      LOOP
         V_NRLINHA := V_NRLINHA +1;
         V_NRLINHATOTAL := V_NRLINHATOTAL +1;
         INSERT INTO ARQUIVOTXT
         (CDFILIALFCI, NRMAPAFCI, NRBLOCO, NRLINHA, DSLINHA)
         VALUES
         (P_CDFILIAL, P_NRMAPAFCI, V_NRBLOCO, V_NRLINHA, '5020|'||C_ITEM.NMPRODUTO||'|'||C_ITEM.CDCLASFISC||'|'||C_ITEM.CDARVPROD||'|'||
          C_ITEM.CDBARPRODUTO||'|'||C_ITEM.SGUNIDADE||'|'||C_ITEM.VRVENDAIE||'|'||C_ITEM.VRPARCIMPO||'|'||C_ITEM.VRFCI);
         V_NRLINHA5020 := V_NRLINHA5020+1;
      END LOOP;

      --REGISTRO 5990 - ENCERRAMENTO DO BLOCO 5
      V_NRLINHA := V_NRLINHA +1;
      V_NRLINHATOTAL := V_NRLINHATOTAL +1;
      INSERT INTO ARQUIVOTXT
      (CDFILIALFCI, NRMAPAFCI, NRBLOCO, NRLINHA, DSLINHA)
      VALUES
      (P_CDFILIAL, P_NRMAPAFCI, V_NRBLOCO, V_NRLINHA, '5990|'||TO_CHAR(V_NRLINHA));
   END IF;

   --BLOCO 9 - TOTALIZACAO DE REGISTROS
   V_NRBLOCO := 9;
   --REGISTRO 9001 - IDENTIFICACAO DO INICIO DO BLOCO 9
   IF V_NRLINHA > 0 THEN
      V_NRLINHA := 1;
      V_NRLINHATOTAL := V_NRLINHATOTAL +1;
      INSERT INTO ARQUIVOTXT
      (CDFILIALFCI, NRMAPAFCI, NRBLOCO, NRLINHA, DSLINHA)
      VALUES
      (P_CDFILIAL, P_NRMAPAFCI, V_NRBLOCO, V_NRLINHA, '9001');

      --REGISTRO 9900 - TOTALIZADORES DE REGISTROS ANTERIORES

      V_NRLINHA := V_NRLINHA +1;
      V_NRLINHATOTAL := V_NRLINHATOTAL +1;
      INSERT INTO ARQUIVOTXT
      (CDFILIALFCI, NRMAPAFCI, NRBLOCO, NRLINHA, DSLINHA)
      VALUES
      (P_CDFILIAL, P_NRMAPAFCI, V_NRBLOCO, V_NRLINHA, '9900|0000|1');

      V_NRLINHA := V_NRLINHA +1;
      V_NRLINHATOTAL := V_NRLINHATOTAL +1;
      INSERT INTO ARQUIVOTXT
      (CDFILIALFCI, NRMAPAFCI, NRBLOCO, NRLINHA, DSLINHA)
      VALUES
      (P_CDFILIAL, P_NRMAPAFCI, V_NRBLOCO, V_NRLINHA, '9900|0010|1');

      IF V_NRLINHA5020 > 0 THEN
         V_NRLINHA := V_NRLINHA +1;
         V_NRLINHATOTAL := V_NRLINHATOTAL +1;
         INSERT INTO ARQUIVOTXT
         (CDFILIALFCI, NRMAPAFCI, NRBLOCO, NRLINHA, DSLINHA)
         VALUES
         (P_CDFILIAL, P_NRMAPAFCI, V_NRBLOCO, V_NRLINHA, '9900|5020|'||V_NRLINHA5020);
      END IF;

      --REGISTRO 9990 - ENCERRAMENTO DO BLOCO 9
      V_NRLINHA := V_NRLINHA +1;
      V_NRLINHATOTAL := V_NRLINHATOTAL +1;
      INSERT INTO ARQUIVOTXT
      (CDFILIALFCI, NRMAPAFCI, NRBLOCO, NRLINHA, DSLINHA)
      VALUES
      (P_CDFILIAL, P_NRMAPAFCI, V_NRBLOCO, V_NRLINHA, '9900|'||V_NRLINHA);

      --REGISTRO 9999 - ENCERRAMENTO DO ARQUIVO
      V_NRLINHA := V_NRLINHA +1;
      V_NRLINHATOTAL := V_NRLINHATOTAL +1;
      INSERT INTO ARQUIVOTXT
      (CDFILIALFCI, NRMAPAFCI, NRBLOCO, NRLINHA, DSLINHA)
      VALUES
      (P_CDFILIAL, P_NRMAPAFCI, V_NRBLOCO, V_NRLINHA, '9999|'||V_NRLINHATOTAL);
   END IF;

END;
/