Amiguinhos,
Seguindo a linha de
SPED PIS COFINS sem mistério dou seguimento adicionando material para reforço do tema que entra em voga real logo mais.
PASSO 1Coloco o conjunto de funções que geram as tabelas conforme informações dos campos de cada registro do
layout FCI.
Código: Selecionar todos
FUNCTION FISCOTabelaR0000()
// *** Estrutura do Registro R0000 ***
LOCAL Estru := {}
AADD( Estru, { 'CAMPO01' , 'C', 0004, 00 } ) // 01 - Identifica o tipo de registro ?0000
AADD( Estru, { 'CAMPO02' , 'C', 0014, 00 } ) // 02 - CNPJ do estabelecimento
AADD( Estru, { 'CAMPO03' , 'C', 0255, 00 } ) // 03 - Nome (Fantasia) ou RazãoSocial do C
AADD( Estru, { 'CAMPO04' , 'C', 0004, 00 } ) // 04 - Versão de leiaute do arquivo
AADD( Estru, { 'CAMPO05' , 'C', 0047, 00 } ) // 05 - Hash Code do arquivo
AADD( Estru, { 'CAMPO06' , 'C', 0020, 00 } ) // 06 - Data em que o arquivo foi aceito
AADD( Estru, { 'CAMPO07' , 'C', 0036, 00 } ) // 07 - Código de recepção do
AADD( Estru, { 'CAMPO08' , 'C', 0020, 00 } ) // 08 - Data que o arquivo foi validado
AADD( Estru, { 'CAMPO09' , 'C', 0020, 00 } ) // 09 - Indicador de validação do arquivo
dbCreate( 'R0000.DBF', Estru )
RETURN NIL
FUNCTION FISCOTabelaR0001()
// *** Estrutura do Registro R0001 ***
LOCAL Estru := {}
AADD( Estru, { 'CAMPO01' , 'C', 0004, 00 } ) // 01 - Identifica o tipo de registro ?0001
AADD( Estru, { 'CAMPO02' , 'C', 0150, 00 } ) // 02 - Texto padrão em caracteres UTF-
dbCreate( 'R0001.DBF', Estru )
RETURN NIL
FUNCTION FISCOTabelaR0010()
// *** Estrutura do Registro R0010 ***
LOCAL Estru := {}
AADD( Estru, { 'CAMPO01' , 'C', 0004, 00 } ) // 01 - Identifica o tipo de registro ?0010
AADD( Estru, { 'CAMPO02' , 'C', 0014, 00 } ) // 02 - CNPJ do contribuinte
AADD( Estru, { 'CAMPO03' , 'C', 0255, 00 } ) // 03 - Razão Social do contribuinte
AADD( Estru, { 'CAMPO04' , 'C', 0020, 00 } ) // 04 - Inscrição Estadual
AADD( Estru, { 'CAMPO05' , 'C', 0255, 00 } ) // 05 - Endereço do estabelecimento
AADD( Estru, { 'CAMPO06' , 'C', 0008, 00 } ) // 06 - CEP do Estabelecimento
AADD( Estru, { 'CAMPO07' , 'C', 0255, 00 } ) // 07 - Município do estabelecimento
AADD( Estru, { 'CAMPO08' , 'C', 0002, 00 } ) // 08 - Unidade da Federação
dbCreate( 'R0010.DBF', Estru )
RETURN NIL
FUNCTION FISCOTabelaR0990()
// *** Estrutura do Registro R0990 ***
LOCAL Estru := {}
AADD( Estru, { 'CAMPO01' , 'C', 0004, 00 } ) // 01 - Carrega campo ?0990?
AADD( Estru, { 'CAMPO02' , 'C', 0002, 00 } ) // 02 - Quantidades
dbCreate( 'R0990.DBF', Estru )
RETURN NIL
FUNCTION FISCOTabelaR5001()
// *** Estrutura do Registro R5001 ***
LOCAL Estru := {}
AADD( Estru, { 'CAMPO01' , 'C', 0004, 00 } ) // 01 - Campo fixo "5001"
dbCreate( 'R5001.DBF', Estru )
RETURN NIL
FUNCTION FISCOTabelaR5020()
// *** Estrutura do Registro R5020 ***
LOCAL Estru := {}
AADD( Estru, { 'CAMPO01' , 'C', 0004, 00 } ) // 01 - Registro 5020:
AADD( Estru, { 'CAMPO02' , 'C', 0255, 00 } ) // 02 - Descrição da mercadoria
AADD( Estru, { 'CAMPO03' , 'C', 0008, 00 } ) // 03 - Código Comum do MERCOSUL
AADD( Estru, { 'CAMPO04' , 'C', 0050, 00 } ) // 04 - Código do produto no estabeleciment
AADD( Estru, { 'CAMPO05' , 'C', 0014, 00 } ) // 05 - Código
AADD( Estru, { 'CAMPO06' , 'C', 0006, 00 } ) // 06 - Unidade a que se refere
AADD( Estru, { 'CAMPO07' , 'C', 0015, 02 } ) // 07 - Valor
AADD( Estru, { 'CAMPO08' , 'C', 0015, 02 } ) // 08 - Valor
AADD( Estru, { 'CAMPO09' , 'C', 0006, 02 } ) // 09 - do
AADD( Estru, { 'CAMPO10' , 'C', 0036, 00 } ) // 10 - Código
AADD( Estru, { 'CAMPO11' , 'C', 0020, 00 } ) // 11 - Indicador
dbCreate( 'R5020.DBF', Estru )
RETURN NIL
FUNCTION FISCOTabelaR5990()
// *** Estrutura do Registro R5990 ***
LOCAL Estru := {}
AADD( Estru, { 'CAMPO01' , 'C', 0004, 00 } ) // 01 - Campo fixo ?5990?
AADD( Estru, { 'CAMPO02' , 'C', 0006, 00 } ) // 02 - Quantidades de linha do bloco 5
dbCreate( 'R5990.DBF', Estru )
RETURN NIL
FUNCTION FISCOTabelaR9001()
// *** Estrutura do Registro R9001 ***
LOCAL Estru := {}
AADD( Estru, { 'CAMPO01' , 'C', 0004, 00 } ) // 01 - Texto fixo contendo ?9001?
dbCreate( 'R9001.DBF', Estru )
RETURN NIL
FUNCTION FISCOTabelaR9900()
// *** Estrutura do Registro R9900 ***
LOCAL Estru := {}
AADD( Estru, { 'CAMPO01' , 'C', 0004, 00 } ) // 01 - Texto fixo
AADD( Estru, { 'CAMPO02' , 'C', 0004, 00 } ) // 02 - Tipo do registro
AADD( Estru, { 'CAMPO03' , 'C', 0008, 00 } ) // 03 - registros
dbCreate( 'R9900.DBF', Estru )
RETURN NIL
FUNCTION FISCOTabelaR9990()
// *** Estrutura do Registro R9990 ***
LOCAL Estru := {}
AADD( Estru, { 'CAMPO01' , 'C', 0004, 00 } ) // 01 - Texto fixo contendo ?9990?
AADD( Estru, { 'CAMPO02' , 'C', 0002, 00 } ) // 02 - Quantidade total de linhas
dbCreate( 'R9990.DBF', Estru )
RETURN NIL
FUNCTION FISCOTabelaR9999()
// *** Estrutura do Registro R9999 ***
LOCAL Estru := {}
AADD( Estru, { 'CAMPO01' , 'C', 0004, 00 } ) // 01 - Texto fixo contendo ?9999?
AADD( Estru, { 'CAMPO02' , 'C', 0008, 00 } ) // 02 - Quantidade total de linhas
dbCreate( 'R9999.DBF', Estru )
RETURN NIL
Rotina de uso:
Código: Selecionar todos
FUNCTION GeraFISCOTabelas()
FISCOTabelaR0000()
FISCOTabelaR0001()
FISCOTabelaR0010()
FISCOTabelaR0990()
FISCOTabelaR5001()
FISCOTabelaR5020()
FISCOTabelaR5990()
FISCOTabelaR9001()
FISCOTabelaR9900()
FISCOTabelaR9990()
FISCOTabelaR9999()
RETURN NIL
PASSO 2Conjunto de funções que salva os registros nas tabelas, conforme a sua rotina, laço de leitura, etc:
Código: Selecionar todos
FUNCTION FISCOSalvaR0000()
// *** Estrutura do Registro R0000 ***
R0000->( dbAppend() )
R0000->CAMPO01 := '0000' // 01 - Identifica o tipo de registro ?0000
R0000->CAMPO02 := M->CNPJ_CONTRIBUINTE // 02 - CNPJ do estabelecimento
R0000->CAMPO03 := M->NOME_CONTRIBUINTE // 03 - Nome (Fantasia) ou RazãoSocial do C
R0000->CAMPO04 := M->VERSAO_LEIAUTE // 04 - Versão de leiaute do arquivo
R0000->CAMPO05 := M->HASH_HASH CODE // 05 - Hash Code do arquivo
R0000->CAMPO06 := M->DT_RECEPCAO_ARQUIVO // 06 - Data em que o arquivo foi aceito
R0000->CAMPO07 := M->COD_RECEPCAO_ARQUIVO // 07 - Código de recepção do
R0000->CAMPO08 := M->DT_VALIDACAO_ARQUIVO // 08 - Data que o arquivo foi validado
R0000->CAMPO09 := M->IN_VALIDACAO_ARQUIVO // 09 - Indicador de validação do arquivo
R0000->( dbCommit() )
//
M->AREA0000 := Select()
M->QTD_LIN_0 := '1'
M->QTD_LIN_9 := '1'
M->QTD_REG_BLC := '1'
dbSelectArea('R0990')
FISCOSalvaR0990()
M->REG_BLC := '0000'
dbSelectArea('R9900')
FISCOSalvaR9900()
dbSelectArea(M->AREA0000)
RETURN nil
FUNCTION FISCOSalvaR0001()
// *** Estrutura do Registro R0001 ***
R0001->( dbAppend() )
R0001->CAMPO01 := '0001' // 01 - Identifica o tipo de registro ?0001
R0001->CAMPO02 := M->TEXTO_PADRAO_UTF8 // 02 - Texto padrão em caracteres UTF-
R0001->( dbCommit() )
//
M->AREA0001 := Select()
M->QTD_LIN_0 := '1'
M->QTD_LIN_9 := '1'
M->QTD_REG_BLC := '1'
dbSelectArea('R0990')
FISCOSalvaR0990()
M->REG_BLC := '0001'
dbSelectArea('R9900')
FISCOSalvaR9900()
dbSelectArea(M->AREA0001)
RETURN nil
FUNCTION FISCOSalvaR0010()
// *** Estrutura do Registro R0010 ***
R0010->( dbAppend() )
R0010->CAMPO01 := '0010' // 01 - Identifica o tipo de registro ?0010
R0010->CAMPO02 := M->CNPJ_CONTRIBUINTE // 02 - CNPJ do contribuinte
R0010->CAMPO03 := M->NOME_RAZAO_SOCIAL // 03 - Razão Social do contribuinte
R0010->CAMPO04 := M->INSCRI€ÇO_ESTADUAL // 04 - Inscrição Estadual
R0010->CAMPO05 := M->ENDERE€O_ESTABELECIMENTO // 05 - Endereço do estabelecimento
R0010->CAMPO06 := M->CEP // 06 - CEP do Estabelecimento
R0010->CAMPO07 := M->MUNICÖPIO // 07 - Município do estabelecimento
R0010->CAMPO08 := M->UF // 08 - Unidade da Federação
R0010->( dbCommit() )
//
M->AREA0010 := Select()
M->QTD_LIN_0 := '1'
M->QTD_LIN_9 := '1'
M->QTD_REG_BLC := '1'
dbSelectArea('R0990')
FISCOSalvaR0990()
M->REG_BLC := '0010'
dbSelectArea('R9900')
FISCOSalvaR9900()
dbSelectArea(M->AREA0010)
RETURN nil
FUNCTION FISCOSalvaR0990()
// *** Estrutura do Registro R0990 ***
if recco() = 0
M->QTD_LIN_0 := '1'
R0990->( dbAppend() )
else
M->QTD_LIN_0 := alltrim(str(val(R0990->CAMPO02) + 1,6))
R0990->( dbRLock() )
endif
R0990->CAMPO01 := '0990' // 01 - Carrega campo ?0990?
R0990->CAMPO02 := M->QUANTIDADE_LINHAS // 02 - Quantidades
R0990->( dbCommit() )
//
M->AREA0990 := Select()
M->QTD_LIN_0 := '1'
M->QTD_LIN_9 := '1'
M->QTD_REG_BLC := '1'
M->REG_BLC := '0990'
dbSelectArea('R9900')
FISCOSalvaR9900()
dbSelectArea(M->AREA0990)
RETURN nil
FUNCTION FISCOSalvaR5001()
// *** Estrutura do Registro R5001 ***
R5001->( dbAppend() )
R5001->CAMPO01 := '5001' // 01 - Campo fixo "5001"
R5001->( dbCommit() )
//
M->AREA5001 := Select()
M->QTD_LIN_5 := '1'
M->QTD_LIN_9 := '1'
M->QTD_REG_BLC := '1'
dbSelectArea('R5990')
FISCOSalvaR5990()
M->REG_BLC := '5001'
dbSelectArea('R9900')
FISCOSalvaR9900()
dbSelectArea(M->AREA5001)
RETURN nil
FUNCTION FISCOSalvaR5020()
// *** Estrutura do Registro R5020 ***
R5020->( dbAppend() )
R5020->CAMPO01 := '5020' // 01 - Registro 5020:
R5020->CAMPO02 := M->NOME_MERCADORIA // 02 - Descrição da mercadoria
R5020->CAMPO03 := M->CODIGO_NCM // 03 - Código Comum do MERCOSUL
R5020->CAMPO04 := M->CODIGO_MERCADORIA // 04 - Código do produto no estabeleciment
R5020->CAMPO05 := M->CODIGO_GTIN // 05 - Código
R5020->CAMPO06 := M->UNIDADE_MERCADORIA // 06 - Unidade a que se refere
R5020->CAMPO07 := M->VALOR_SAIDA_MERCADORIA_INTERESTADU // 07 - Valor
R5020->CAMPO08 := M->VALOR_PARCELA_IMPORTADA_EXTERIOR // 08 - Valor
R5020->CAMPO09 := M->CONTEUDO_IMPORTACAO_CI // 09 - do
R5020->CAMPO10 := M->CODIGO_FCI // 10 - Código
R5020->CAMPO11 := M->IN_VALIDACAO_FICHA // 11 - Indicador
R5020->( dbCommit() )
//
M->AREA5020 := Select()
M->QTD_LIN_5 := '1'
M->QTD_LIN_9 := '1'
M->QTD_REG_BLC := '1'
dbSelectArea('R5990')
FISCOSalvaR5990()
M->REG_BLC := '5020'
dbSelectArea('R9900')
FISCOSalvaR9900()
dbSelectArea(M->AREA5020)
RETURN nil
FUNCTION FISCOSalvaR5990()
// *** Estrutura do Registro R5990 ***
if recco() = 0
M->QTD_LIN_5 := '1'
R5990->( dbAppend() )
else
M->QTD_LIN_5 := alltrim(str(val(R5990->CAMPO02) + 1,6))
R5990->( dbRLock() )
endif
R5990->CAMPO01 := '5990' // 01 - Campo fixo ?5990?
R5990->CAMPO02 := M->QUANTIDADE_LINHAS // 02 - Quantidades de linha do bloco 5
R5990->( dbCommit() )
//
M->AREA5990 := Select()
M->QTD_LIN_5 := '1'
M->QTD_LIN_9 := '1'
M->QTD_REG_BLC := '1'
M->REG_BLC := '5990'
dbSelectArea('R9900')
FISCOSalvaR9900()
dbSelectArea(M->AREA5990)
RETURN nil
Rotina de uso, exemplificando somente a primeira função:
Código: Selecionar todos
FUNCTION GeraFISCOSalva()
// *** Estrutura do Registro R0000 ***
// Preencher as variaveis com dados antes de repassar
M->REG := '0000' // 01 - Identifica o tipo de registro ?0000
M->CNPJ_CONTRIBUINTE := '' // 02 - CNPJ do estabelecimento
M->NOME_CONTRIBUINTE := '' // 03 - Nome (Fantasia) ou RazãoSocial do C
M->VERSAO_LEIAUTE := '' // 04 - Versão de leiaute do arquivo
M->HASH_HASH CODE := '' // 05 - Hash Code do arquivo
M->DT_RECEPCAO_ARQUIVO := '' // 06 - Data em que o arquivo foi aceito
M->COD_RECEPCAO_ARQUIVO := '' // 07 - Código de recepção do
M->DT_VALIDACAO_ARQUIVO := '' // 08 - Data que o arquivo foi validado
M->IN_VALIDACAO_ARQUIVO := '' // 09 - Indicador de validação do arquivo
FISCOSalvaR0000()
...
FISCOSalvaR0001()
...
FISCOSalvaR0010()
...
FISCOSalvaR0990()
...
FISCOSalvaR5001()
...
do while ...
FISCOSalvaR5020()
...
FISCOSalvaR5990()
enddo
...
FISCOSalvaR9001()
...
FISCOSalvaR9900()
...
FISCOSalvaR9990()
RETURN NIL
PASSO 3Conjunto de funções que pegam os dados dos registros contidos em cada tabela, concatenado o resultado:
Código: Selecionar todos
FUNCTION FISCORegistroR0000()
// *** Estrutura do Registro R0000 ***
LOCAL cCRLF := chr(13)+chr(10), cSeparator := '|'
cTrailler := cSeparator
cTrailler := cTrailler + StrFill( R0000->CAMPO01 , 0004, ' ', 'R' ) + cSeparator // 01 - Identifica o tipo de registro ?0000
cTrailler := cTrailler + StrFill( R0000->CAMPO02 , 0014, ' ', 'R' ) + cSeparator // 02 - CNPJ do estabelecimento
cTrailler := cTrailler + StrFill( R0000->CAMPO03 , 0255, ' ', 'R' ) + cSeparator // 03 - Nome (Fantasia) ou RazãoSocial do C
cTrailler := cTrailler + StrFill( R0000->CAMPO04 , 0004, ' ', 'R' ) + cSeparator // 04 - Versão de leiaute do arquivo
cTrailler := cTrailler + StrFill( R0000->CAMPO05 , 0047, ' ', 'R' ) + cSeparator // 05 - Hash Code do arquivo
cTrailler := cTrailler + StrFill( R0000->CAMPO06 , 0020, ' ', 'R' ) + cSeparator // 06 - Data em que o arquivo foi aceito
cTrailler := cTrailler + StrFill( R0000->CAMPO07 , 0036, ' ', 'R' ) + cSeparator // 07 - Código de recepção do
cTrailler := cTrailler + StrFill( R0000->CAMPO08 , 0020, ' ', 'R' ) + cSeparator // 08 - Data que o arquivo foi validado
cTrailler := cTrailler + StrFill( R0000->CAMPO09 , 0020, ' ', 'R' ) + cSeparator // 09 - Indicador de validação do arquivo
cTrailler := cTrailler + cCRLF
RETURN cTrailler
FUNCTION FISCORegistroR0001()
// *** Estrutura do Registro R0001 ***
LOCAL cCRLF := chr(13)+chr(10), cSeparator := '|'
cTrailler := cSeparator
cTrailler := cTrailler + StrFill( R0001->CAMPO01 , 0004, ' ', 'R' ) + cSeparator // 01 - Identifica o tipo de registro ?0001
cTrailler := cTrailler + StrFill( R0001->CAMPO02 , 0150, ' ', 'R' ) + cSeparator // 02 - Texto padrão em caracteres UTF-
cTrailler := cTrailler + cCRLF
RETURN cTrailler
FUNCTION FISCORegistroR0010()
// *** Estrutura do Registro R0010 ***
LOCAL cCRLF := chr(13)+chr(10), cSeparator := '|'
cTrailler := cSeparator
cTrailler := cTrailler + StrFill( R0010->CAMPO01 , 0004, ' ', 'R' ) + cSeparator // 01 - Identifica o tipo de registro ?0010
cTrailler := cTrailler + StrFill( R0010->CAMPO02 , 0014, ' ', 'R' ) + cSeparator // 02 - CNPJ do contribuinte
cTrailler := cTrailler + StrFill( R0010->CAMPO03 , 0255, ' ', 'R' ) + cSeparator // 03 - Razão Social do contribuinte
cTrailler := cTrailler + StrFill( R0010->CAMPO04 , 0020, ' ', 'R' ) + cSeparator // 04 - Inscrição Estadual
cTrailler := cTrailler + StrFill( R0010->CAMPO05 , 0255, ' ', 'R' ) + cSeparator // 05 - Endereço do estabelecimento
cTrailler := cTrailler + StrFill( R0010->CAMPO06 , 0008, '0', 'L' ) + cSeparator // 06 - CEP do Estabelecimento
cTrailler := cTrailler + StrFill( R0010->CAMPO07 , 0255, ' ', 'R' ) + cSeparator // 07 - Município do estabelecimento
cTrailler := cTrailler + StrFill( R0010->CAMPO08 , 0002, ' ', 'R' ) + cSeparator // 08 - Unidade da Federação
cTrailler := cTrailler + cCRLF
RETURN cTrailler
FUNCTION FISCORegistroR0990()
// *** Estrutura do Registro R0990 ***
LOCAL cCRLF := chr(13)+chr(10), cSeparator := '|'
cTrailler := cSeparator
cTrailler := cTrailler + StrFill( R0990->CAMPO01 , 0004, ' ', 'R' ) + cSeparator // 01 - Carrega campo ?0990?
cTrailler := cTrailler + StrFill( R0990->CAMPO02 , 0002, '0', 'L' ) + cSeparator // 02 - Quantidades
cTrailler := cTrailler + cCRLF
RETURN cTrailler
FUNCTION FISCORegistroR5001()
// *** Estrutura do Registro R5001 ***
LOCAL cCRLF := chr(13)+chr(10), cSeparator := '|'
cTrailler := cSeparator
cTrailler := cTrailler + StrFill( R5001->CAMPO01 , 0004, ' ', 'R' ) + cSeparator // 01 - Campo fixo "5001"
cTrailler := cTrailler + cCRLF
RETURN cTrailler
FUNCTION FISCORegistroR5020()
// *** Estrutura do Registro R5020 ***
LOCAL cCRLF := chr(13)+chr(10), cSeparator := '|'
cTrailler := cSeparator
cTrailler := cTrailler + StrFill( R5020->CAMPO01 , 0004, ' ', 'R' ) + cSeparator // 01 - Registro 5020:
cTrailler := cTrailler + StrFill( R5020->CAMPO02 , 0255, ' ', 'R' ) + cSeparator // 02 - Descrição da mercadoria
cTrailler := cTrailler + StrFill( R5020->CAMPO03 , 0008, '0', 'L' ) + cSeparator // 03 - Código Comum do MERCOSUL
cTrailler := cTrailler + StrFill( R5020->CAMPO04 , 0050, ' ', 'R' ) + cSeparator // 04 - Código do produto no estabeleciment
cTrailler := cTrailler + StrFill( R5020->CAMPO05 , 0014, '0', 'L' ) + cSeparator // 05 - Código
cTrailler := cTrailler + StrFill( R5020->CAMPO06 , 0006, ' ', 'R' ) + cSeparator // 06 - Unidade a que se refere
cTrailler := cTrailler + StrFill( R5020->CAMPO07 , 0015, '0', 'L' ) + cSeparator // 07 - Valor
cTrailler := cTrailler + StrFill( R5020->CAMPO08 , 0015, '0', 'L' ) + cSeparator // 08 - Valor
cTrailler := cTrailler + StrFill( R5020->CAMPO09 , 0006, '0', 'L' ) + cSeparator // 09 - do
cTrailler := cTrailler + StrFill( R5020->CAMPO10 , 0036, ' ', 'R' ) + cSeparator // 10 - Código
cTrailler := cTrailler + StrFill( R5020->CAMPO11 , 0020, ' ', 'R' ) + cSeparator // 11 - Indicador
cTrailler := cTrailler + cCRLF
RETURN cTrailler
FUNCTION FISCORegistroR5990()
// *** Estrutura do Registro R5990 ***
LOCAL cCRLF := chr(13)+chr(10), cSeparator := '|'
cTrailler := cSeparator
cTrailler := cTrailler + StrFill( R5990->CAMPO01 , 0004, ' ', 'R' ) + cSeparator // 01 - Campo fixo ?5990?
cTrailler := cTrailler + StrFill( R5990->CAMPO02 , 0006, '0', 'L' ) + cSeparator // 02 - Quantidades de linha do bloco 5
cTrailler := cTrailler + cCRLF
RETURN cTrailler
FUNCTION FISCORegistroR9001()
// *** Estrutura do Registro R9001 ***
LOCAL cCRLF := chr(13)+chr(10), cSeparator := '|'
cTrailler := cSeparator
cTrailler := cTrailler + StrFill( R9001->CAMPO01 , 0004, ' ', 'R' ) + cSeparator // 01 - Texto fixo contendo ?9001?
cTrailler := cTrailler + cCRLF
RETURN cTrailler
FUNCTION FISCORegistroR9900()
// *** Estrutura do Registro R9900 ***
LOCAL cCRLF := chr(13)+chr(10), cSeparator := '|'
cTrailler := cSeparator
cTrailler := cTrailler + StrFill( R9900->CAMPO01 , 0004, ' ', 'R' ) + cSeparator // 01 - Texto fixo
cTrailler := cTrailler + StrFill( R9900->CAMPO02 , 0004, ' ', 'R' ) + cSeparator // 02 - Tipo do registro
cTrailler := cTrailler + StrFill( R9900->CAMPO03 , 0008, '0', 'L' ) + cSeparator // 03 - registros
cTrailler := cTrailler + cCRLF
RETURN cTrailler
FUNCTION FISCORegistroR9990()
// *** Estrutura do Registro R9990 ***
LOCAL cCRLF := chr(13)+chr(10), cSeparator := '|'
cTrailler := cSeparator
cTrailler := cTrailler + StrFill( R9990->CAMPO01 , 0004, ' ', 'R' ) + cSeparator // 01 - Texto fixo contendo ?9990?
cTrailler := cTrailler + StrFill( R9990->CAMPO02 , 0002, '0', 'L' ) + cSeparator // 02 - Quantidade total de linhas
cTrailler := cTrailler + cCRLF
RETURN cTrailler
FUNCTION FISCORegistroR9999()
// *** Estrutura do Registro R9999 ***
LOCAL cCRLF := chr(13)+chr(10), cSeparator := '|'
cTrailler := cSeparator
cTrailler := cTrailler + StrFill( R9999->CAMPO01 , 0004, ' ', 'R' ) + cSeparator // 01 - Texto fixo contendo ?9999?
cTrailler := cTrailler + StrFill( R9999->CAMPO02 , 0008, '0', 'L' ) + cSeparator // 02 - Quantidade total de linhas
cTrailler := cTrailler + cCRLF
RETURN cTrailler
Rotina de uso:
Código: Selecionar todos
FUNCTION GeraFISCORegistros(SPEDhandle)
dbSelectArea('R0000'); dbGotop(); do while .not. eof(); cFISCORegistro := alltrim( FISCORegistroR0000() ); fWrite( SPEDhandle, cFISCORegistro, len( cFISCORegistro ) ); dbSkip(); enddo
dbSelectArea('R0001'); dbGotop(); do while .not. eof(); cFISCORegistro := alltrim( FISCORegistroR0001() ); fWrite( SPEDhandle, cFISCORegistro, len( cFISCORegistro ) ); dbSkip(); enddo
dbSelectArea('R0010'); dbGotop(); do while .not. eof(); cFISCORegistro := alltrim( FISCORegistroR0010() ); fWrite( SPEDhandle, cFISCORegistro, len( cFISCORegistro ) ); dbSkip(); enddo
dbSelectArea('R0990'); dbGotop(); do while .not. eof(); cFISCORegistro := alltrim( FISCORegistroR0990() ); fWrite( SPEDhandle, cFISCORegistro, len( cFISCORegistro ) ); dbSkip(); enddo
dbSelectArea('R5001'); dbGotop(); do while .not. eof(); cFISCORegistro := alltrim( FISCORegistroR5001() ); fWrite( SPEDhandle, cFISCORegistro, len( cFISCORegistro ) ); dbSkip(); enddo
dbSelectArea('R5020'); dbGotop(); do while .not. eof(); cFISCORegistro := alltrim( FISCORegistroR5020() ); fWrite( SPEDhandle, cFISCORegistro, len( cFISCORegistro ) ); dbSkip(); enddo
dbSelectArea('R5990'); dbGotop(); do while .not. eof(); cFISCORegistro := alltrim( FISCORegistroR5990() ); fWrite( SPEDhandle, cFISCORegistro, len( cFISCORegistro ) ); dbSkip(); enddo
dbSelectArea('R9001'); dbGotop(); do while .not. eof(); cFISCORegistro := alltrim( FISCORegistroR9001() ); fWrite( SPEDhandle, cFISCORegistro, len( cFISCORegistro ) ); dbSkip(); enddo
dbSelectArea('R9900'); dbGotop(); do while .not. eof(); cFISCORegistro := alltrim( FISCORegistroR9900() ); fWrite( SPEDhandle, cFISCORegistro, len( cFISCORegistro ) ); dbSkip(); enddo
dbSelectArea('R9990'); dbGotop(); do while .not. eof(); cFISCORegistro := alltrim( FISCORegistroR9990() ); fWrite( SPEDhandle, cFISCORegistro, len( cFISCORegistro ) ); dbSkip(); enddo
dbSelectArea('R9999'); dbGotop(); do while .not. eof(); cFISCORegistro := alltrim( FISCORegistroR9999() ); fWrite( SPEDhandle, cFISCORegistro, len( cFISCORegistro ) ); dbSkip(); enddo
RETURN NIL
Com os trechos acima já é possivel gerar os registros que irão compor o arquivo digital FCI que deve ser validado, assinado e enviado a sistema da receita.
Alguma literatura relevante:
Como calcular o conteúdo de importação...
Algumas tabelas relevantes:
TIPI 2012,
outra tabela
NCM
Lista de Bens Sem Similar Nacional
Glossário:
TEC - Tarifa Externa Comum
NCM - Nomenclatura Comum do Mercosul
LETEC - Lista de Exceções à Tarifa Externa Comum
LEBIT - Lista de Exceções de Bens de Informática e de Telecomunicações