Olhando o tópico lembrei de que havia postado a tempos atrás um tópico relativo(
mas ao ver que a sessão era Clipper resolvi procurar um código que pudesse ajudar e que fosse mais compativel.
O código é repleto de funções de concatenação e tratamento portanto se parecer muito complicado me desculpem.
Código: Selecionar todos
*********************************************************************************************************
*** FUNCOES COMPATIVEIS COM NOTA FISCAL PREFEITURA PARA GERACAO DE REGISTROS
Function NFPInicia()
******************************************************************************************************
public aNFPRegistros := {}, aNFPListagem := {}
//nHandle := fCreate(_Arquivo_)
//fWrite( nHandle, "", LEN("") )
//fClose( nHandle )
return .t.
Function NFPRegistro10( p02,p03,p04,p05 )
local cCRLF := "chr(13)+chr(10)", cPIPE := "|"
*** Registro10 - Identificação do Arquivo (Cabeçalho)
*** 10|1,00|00000000000000|10/10/2007|17/10/2007
cTrailler := "10" // (X 2) Preencher com o valor "10" para indicar o tipo de registro
cTrailler := cTrailler + cPIPE + StrFill( p02, 02, " ", "R" ) // (N 2) Versão do leiaute do arquivo. Preencher com “1,00” nesta versão.
cTrailler := cTrailler + cPIPE + StrFill( p03, 14, " ", "L" ) // (X 14) Informar o CNPJ do emitente com os zeros não significativos. Preencher apenas com números, sem separadores.
cTrailler := cTrailler + cPIPE + StrFill( p04, 10, " ", "L" ) // (D 10) Menor data de emissão das notas fiscais transmitidas.
cTrailler := cTrailler + cPIPE + StrFill( p05, 10, " ", "L" ) // (D 10) Maior data de emissão das notas fiscais transmitidas.
cTrailler := alltrim( cTrailler ) + &(cCRLF)
return cTrailler
Function NFPRegistro20( p02,p03,p04,p05,p06,p07,p08,p09,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24 )
local cCRLF := "chr(13)+chr(10)", cPIPE := "|"
*** Registro20 - Identificação do Arquivo (Cabeçalho)
*** 20|I||Venda a Consumidor Final|0|20956|10/10/2007 10:00:00|10/10/2007 10:00:00|1|5102|000000000000|000000000000|00000000000000|Casa F|R São Manoel|176|apto 18|Centro|São Paulo|SP|10100000|Brasil|5550723|
cTrailler := "20" // (X 2) Preencher com o valor "20" para indicar o tipo de registro
cTrailler := cTrailler + cPIPE + StrFill( p02, 01, " ", "L" ) // (X 1) Informar conforme a função do registro:
// I – Inclusão do registro da NF
// R – Retificação do registro da NF
// C – Cancelamento da NF
cTrailler := cTrailler + cPIPE + StrFill( p03,255, " ", "L" ) // (X 15-255) Informar a justificativa do cancelamento. Campo obrigatório se campo 7 (Função do Registro) for igual a “C”.
cTrailler := cTrailler + cPIPE + StrFill( p04, 60, " ", "L" ) // (X 60) Informar a natureza da operação da qual decorreu a saída ou a entrada, tais como: venda, compra, transferência, devolução, importação, consignação, remessa (para fins de demonstração, de industrialização ou outra), conforme previsto na alínea 'i', inciso I, art. 19 do CONVÊNIO S/Nº, de 15 de dezembro de 1970.
cTrailler := cTrailler + cPIPE + StrFill( p05, 02, " ", "R" ) // (N 2) Série da Nota Fiscal. Informar 0 (zero) para série única.
cTrailler := cTrailler + cPIPE + StrFill( p06, 06, " ", "R" ) // (N 6) Número da Nota Fiscal.
cTrailler := cTrailler + cPIPE + StrFill( p07, 20, " ", "L" ) // (D 20) Data de Emissao Formato “DD/MM/AAAA HH:MM:SS” ; Hora: 0 a 23
cTrailler := cTrailler + cPIPE + StrFill( p08, 20, " ", "L" ) // (D 20) Data de Saida/Entrada Formato “DD/MM/AAAA HH:MM:SS ”.
cTrailler := cTrailler + cPIPE + StrFill( p09, 01, " ", "R" ) // (N 1) 0-entrada / 1-saída
cTrailler := cTrailler + cPIPE + StrFill( p10, 04, " ", "R" ) // (N 4) Utilizar Tabela de CFOP prevista no Anexo V do RICMS aprovado pelo decreto 45.490 de 30/11/2000 - Convênio s/nº de 15 de dezembro de 1970. Na hipótese de o documento fiscal conter mais de um Código Fiscal de Operações ou Prestação – CFOP, nesse campo deverá ser informado apenas o “CFOP” do item de maior valor; os demais “CFOP” deverão ser informados no campo “Descrição do produto ou serviço” conforme previsto no artigo 127, § 19, do RICMS/2000.
cTrailler := cTrailler + cPIPE + StrFill( p11, 14, " ", "R" ) // (X 14) Informar a IE do substituto tributário na UF de destino da mercadoria conforme previsto no artigo 127, inciso I, alínea “ l ” e § 5º do RICMS/2000. Preencher apenas com números, sem separadores.
cTrailler := cTrailler + cPIPE + StrFill( p12, 15, " ", "L" ) // (X 15) Este campo deve ser informado quando ocorrer a emissão de NF-e conjugada, com prestação de serviços sujeitos ao ISSQN e fornecimento sujeito ao ICMS. Deve ser preenchido apenas com números, sem separadores.
cTrailler := cTrailler + cPIPE + StrFill( p13, 14, " ", "R" ) // (X 11 ou 14) Informar o CNPJ ou o CPF do destinatário, preenchendo com os zeros não significativos.
// Deve ser preenchido apenas com números, sem separadores.
// Não informar se a operação for realizada com o exterior.
cTrailler := cTrailler + cPIPE + StrFill( p14,100, " ", "L" ) // (X Razão Social ou nome do destinatário
cTrailler := cTrailler + cPIPE + StrFill( p15,100, " ", "L" ) // (X Livre) Logradouro
cTrailler := cTrailler + cPIPE + StrFill( p16, 10, " ", "R" ) // (X Livre) Número
cTrailler := cTrailler + cPIPE + StrFill( p17, 50, " ", "L" ) // (X Livre) Complemento
cTrailler := cTrailler + cPIPE + StrFill( p18, 50, " ", "L" ) // (X Livre) Bairro
cTrailler := cTrailler + cPIPE + StrFill( p19, 08, " ", "L" ) // (X Livre) Informar “EXTERIOR” para operações com o exterior.
cTrailler := cTrailler + cPIPE + StrFill( p20, 02, " ", "L" ) // (X 2) Informar “EX” para operações com o exterior.
cTrailler := cTrailler + cPIPE + StrFill( p21, 08, "0", "R" ) // (N 8) CEP. Informar os zeros não significativos. Preencher apenas com números, sem separadores.
cTrailler := cTrailler + cPIPE + StrFill( p22, 10, " ", "L" ) // (X 20) Pais
cTrailler := cTrailler + cPIPE + StrFill( p23, 10, " ", "R" ) // (N Livre) Preencher o número do telefone com o respectivo código DDD, sem caracteres como hífens e parênteses.
cTrailler := cTrailler + cPIPE + StrFill( p24, 10, " ", "R" ) // (X 0-14) Informar a Inscrição Estadual quando o destinatário for inscrito no cadastro de contribuintes do ICMS. Preencher apenas com números, sem separadores.
cTrailler := alltrim( cTrailler ) + &(cCRLF)
return cTrailler
Function NFPRegistro30( p02,p03,p04,p05,p06,p07,p08,p09,p10,p11,p12 )
local cCRLF := "chr(13)+chr(10)", cPIPE := "|"
*** Registro30 - Mercadoria / Produto / Servico
*** 30|Produto 0|Pinga tipo 0|12345678|caixa|1,0000|5,0000|5,00|010|18,00|6,00|10,00
cTrailler := "30" // (X 2) Preencher com o valor "30" para indicar o tipo de registro
cTrailler := cTrailler + cPIPE + StrFill( p02, 20, "0", "L" ) // (X 16) Preencher com o código do produto ou serviço.
cTrailler := cTrailler + cPIPE + StrFill( p03,120, "0", "L" ) // (X 120) Nome, marca, tipo, modelo, série, espécie, qualidade e demais elementos que permitam sua perfeita identificação. Deve conter também os demais “CFOP” não informados no campo “CFOP”, na hipótese de o documento fiscal conter mais de um “CFOP”, conforme previsto no artigo 127, § 19, do RICMS/2000.
cTrailler := cTrailler + cPIPE + StrFill( p04, 08, "0", "L" ) // (X 8) Para mercadorias e produtos, preencher de acordo com a Tabela de Capítulos da NCM. Para serviços, não preencher o campo.
cTrailler := cTrailler + cPIPE + StrFill( p05, 03, "0", "L" ) // (X 3) Informar a unidade de comercialização da mercadoria / produto.
cTrailler := cTrailler + cPIPE + StrFill( p06, 12, "0", "R" ) // (N 12 4) Informar a quantidade de comercialização da mercadoria / produto.
cTrailler := cTrailler + cPIPE + StrFill( p07, 16, "0", "R" ) // (N 16 4) Informar o valor unitário de comercialização da mercadoria / produto
cTrailler := cTrailler + cPIPE + StrFill( p08, 15, "0", "R" ) // (N 15 2) Valor Total Bruto dos Produtos ou Serviços
cTrailler := cTrailler + cPIPE + StrFill( p09, 03, "0", "R" ) // (N 3) Código da Situação Tributária:
// 1° Dígito: Origem da mercadoria
// 0 – Nacional
// 1 – Estrangeira – Importação direta
// 2 – Estrangeira – Adquirida no mercado interno
// 2° e 3° Dígitos: Tributação pelo ICMS
// 00 – Tributada integralmente;
// 10 – Tributada e com cobrança de; ICMS por substituição tributária;
// 20 – Com redução de base de cálculo;
// 30 – Isenta ou não tributada e com cobrança do ICMS por substituição tributária;
// 40 – Isenta;
// 41 – Não tributada;
// 50 – Suspensão;
// 51 – Diferimento;
// 60 – ICMS cobrado anteriormente por substituição tributária;
// 70 – Com redução de base de cálculo e cobrança de ICMS substituição tributária;
// 90 - Outras.
cTrailler := cTrailler + cPIPE + StrFill( p10, 05, "0", "R" ) // (N 5 2) Alíquota do imposto ICMS
cTrailler := cTrailler + cPIPE + StrFill( p11, 05, "0", "R" ) // (N 5 2) Alíquota do IPI
cTrailler := cTrailler + cPIPE + StrFill( p12, 15, "0", "R" ) // (N 15 2) Valor do IPI
cTrailler := alltrim( cTrailler ) + &(cCRLF)
return cTrailler
Function NFPRegistro40( p02,p03,p04,p05,p06,p07,p08,p09,p10,p11,p12,p13,p14,p15 )
local cCRLF := "chr(13)+chr(10)", cPIPE := "|"
*** Registro40 - Valores Totais da NF
*** 40|69,01|1234,56|45,78|123,45|100,10|20,02|10,01|30,00|5,00|1,00|106,13|234,00|6,00|154,00
cTrailler := "40" // (X 2) Preencher com o valor "40" para indicar o tipo de registro
cTrailler := cTrailler + cPIPE + StrFill( p02, 15, "0", "R" ) // (N 15 2) Base de Calculo do ICMS
cTrailler := cTrailler + cPIPE + StrFill( p03, 15, "0", "R" ) // (N 15 2) Valor Total do ICMS
cTrailler := cTrailler + cPIPE + StrFill( p04, 15, "0", "R" ) // (N 15 2) Base de Cálculo do ICMS ST
cTrailler := cTrailler + cPIPE + StrFill( p05, 15, "0", "R" ) // (N 15 2) Valor Total do ICMS ST
cTrailler := cTrailler + cPIPE + StrFill( p06, 15, "0", "R" ) // (N 15 2) Valor Total dos produtos e serviços
cTrailler := cTrailler + cPIPE + StrFill( p07, 15, "0", "R" ) // (N 15 2) Valor Total do Frete
cTrailler := cTrailler + cPIPE + StrFill( p08, 15, "0", "R" ) // (N 15 2) Valor Total do Seguro
cTrailler := cTrailler + cPIPE + StrFill( p09, 15, "0", "R" ) // (N 15 2) Valor Total do Desconto
cTrailler := cTrailler + cPIPE + StrFill( p10, 15, "0", "R" ) // (N 15 2) Valor Total do IPI
cTrailler := cTrailler + cPIPE + StrFill( p11, 15, "0", "R" ) // (N 15 2) Outras Despesas acessórias
cTrailler := cTrailler + cPIPE + StrFill( p12, 15, "0", "R" ) // (N 15 2) Valor Total da NF
cTrailler := cTrailler + cPIPE + StrFill( p13, 15, "0", "R" ) // (N 15 2) Valor Total dos Serviços sob não-incidência ou não tributados pelo ICMS
cTrailler := cTrailler + cPIPE + StrFill( p14, 05, "0", "R" ) // (N 5 2) Alíquota do ISS
cTrailler := cTrailler + cPIPE + StrFill( p15, 15, "0", "R" ) // (N 15 2) Valor Total do ISS
cTrailler := alltrim( cTrailler ) + &(cCRLF)
return cTrailler
Function NFPRegistro50( p02,p03,p04,p05,p06,p07,p08,p09,p10,p11,p12,p13,p14,p15,p16 )
local cCRLF := "chr(13)+chr(10)", cPIPE := "|"
*** Registro50 - Informações do Transporte da NF
*** 50|0|00000000000000|Transportadora Xing Ling|000000000000|Av. da Lentidao, 321|Sao Paulo|SP|ABC1234|SP|123456789012345|litros|Xing Ling|123456789|123,000|154,064
cTrailler := "50" // (X 2) O tipo do registro deve ser “50”
cTrailler := cTrailler + cPIPE + StrFill( p02, 01, "0", "R" ) // (N 1) 0 – por conta do emitente; 1 – por conta do destinatário;
cTrailler := cTrailler + cPIPE + StrFill( p03, 14, " ", "R" ) // (X 14 ou 11) Informar o CNPJ ou o CPF do Transportador, preenchendo com os zeros não significativos.
cTrailler := cTrailler + cPIPE + StrFill( p04,100, " ", "L" ) // (X Livre) Razão Social ou nome
cTrailler := cTrailler + cPIPE + StrFill( p05, 14, " ", "L" ) // (X Livre) Inscrição Estadual
cTrailler := cTrailler + cPIPE + StrFill( p06,100, " ", "L" ) // (X Livre) Endereço Completo
cTrailler := cTrailler + cPIPE + StrFill( p07, 50, " ", "L" ) // (X Livre) Nome do município
cTrailler := cTrailler + cPIPE + StrFill( p08, 02, " ", "L" ) // (X 2) Sigla da UF
cTrailler := cTrailler + cPIPE + StrFill( p09, 08, " ", "L" ) // (X Livre) Placa do Veículo
cTrailler := cTrailler + cPIPE + StrFill( p10, 02, " ", "L" ) // (X 2) Sigla da UF da Placa
cTrailler := cTrailler + cPIPE + StrFill( p11, 15, " ", "R" ) // (N 15) Quantidade de volumes transportados
cTrailler := cTrailler + cPIPE + StrFill( p12, 20, " ", "L" ) // (X Livre) Especie dos volumes transportados
cTrailler := cTrailler + cPIPE + StrFill( p13, 20, " ", "L" ) // (X Livre) Marca dos volumes transportados
cTrailler := cTrailler + cPIPE + StrFill( p14, 10, " ", "L" ) // (X Livre) Numeração dos volumes transportados
cTrailler := cTrailler + cPIPE + StrFill( p15, 15, " ", "R" ) // (N 15 3) Peso Líquido (em kg)
cTrailler := cTrailler + cPIPE + StrFill( p16, 15, " ", "R" ) // (N 15 3) Peso Bruto (em kg)
cTrailler := alltrim( cTrailler ) + &(cCRLF)
return cTrailler
Function NFPRegistro60( p02,p03,p04 )
local cCRLF := "chr(13)+chr(10)", cPIPE := "|"
*** Registro60 - Informações Adicionais e de Cobrança
*** 60|Dados da fatura|Informacoes adicionais de interesse do Fisco|Informacoes complementares de interesse do contribuinte
cTrailler := "60" // (X 2) Preencher com o valor "60" para indicar o tipo de registro
cTrailler := cTrailler + cPIPE + StrFill( p02, 256, " ", "R" ) // (X 1-256) Preencher o campo com os dados da fatura
cTrailler := cTrailler + cPIPE + StrFill( p03, 256, " ", "R" ) // (X 1-256) Informacoes adicionais de interesse do Fisco
cTrailler := cTrailler + cPIPE + StrFill( p04, 256, " ", "R" ) // (X ...) Informacoes complementares de interesse do contribuinte
cTrailler := alltrim( cTrailler ) + &(cCRLF)
return cTrailler
Function NFPRegistro90()
local cCRLF := "chr(13)+chr(10)", cPIPE := "|"
*** Registro90 - Rodape
*** 90|00002|00010|00002|00002|00001
nSR20 := nSR30 := nSR40 := nSR50 := nSR60 := 0
for i = 1 to len( aNFPRegistros )
nSR20 := nSR20 + iif( "20" = aNFPRegistros[i], 1, 0 )
nSR30 := nSR30 + iif( "30" = aNFPRegistros[i], 1, 0 )
nSR40 := nSR40 + iif( "40" = aNFPRegistros[i], 1, 0 )
nSR50 := nSR50 + iif( "50" = aNFPRegistros[i], 1, 0 )
nSR60 := nSR60 + iif( "60" = aNFPRegistros[i], 1, 0 )
next
cTrailler := "90" // (X 2) Preencher com o valor "90" para indicar o tipo de registro
cTrailler := cTrailler + cPIPE + strZero( nSR20, 5 ) // (N 5) Indicar total de registros tipo 20 existentes no arquivo
cTrailler := cTrailler + cPIPE + strZero( nSR30, 5 ) // (N 5) Indicar total de registros tipo 30 existentes no arquivo
cTrailler := cTrailler + cPIPE + strZero( nSR40, 5 ) // (N 5) Indicar total de registros tipo 40 existentes no arquivo
cTrailler := cTrailler + cPIPE + strZero( nSR50, 5 ) // (N 5) Indicar total de registros tipo 50 existentes no arquivo
cTrailler := cTrailler + cPIPE + strZero( nSR60, 5 ) // (N 5) Indicar total de registros tipo 60 existentes no arquivo
cTrailler := alltrim( cTrailler ) + &(cCRLF)
return cTrailler
*********************************************************************************************************
*** Funcao Finalizadora - Salva os Registros no arquivo de Saida Padrao
Function NFPSalvaRegistro( _Trailler_ )
******************************************************************************************************
aadd( aNFPRegistros, substr( _Trailler_, 1, 2 ) )
aadd( aNFPListagem, _Trailler_ )
return ""
Function NFPFinaliza()
local aNFP := ASORT( aNFPListagem )
//local aNFP54 := ASORT( aNFPRegistro54,,,{|x,y|val(substr(x,35,3))<val(substr(y,35,3))} )
local nNFP := fCreate( "NFP.TXT" )
FOR I = 1 TO LEN(aNFP)
fWrite( nNFP, aNFP[I], LEN(aNFP[I]) )
NEXT
fClose( nNFP )
return .t.
STATIC Function StrFill( _string_, _tamanho_, _fill_, _direction_ )
default _fill_ := " ", _direction_ := "R"
cStrFill := alltrim( CharRem( "[<(-.)>]*&@", _string_ ) )
//if _direction_ = "R"
// cStrFill := PadR(SubStr(cStrFill,1,_tamanho_),_tamanho_,_fill_)
//else
// cStrFill := PadL(SubStr(cStrFill,1,_tamanho_),_tamanho_,_fill_)
//endif
return alltrim( cStrFill )
Como estao bem comentadas e relacionadas ao layout exigido ficará fácil entender o que deve ser passado.
boa sorte.