Nota Fiscal Paulista/Sergipana

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
Cavalo Marinho
Usuário Nível 3
Usuário Nível 3
Mensagens: 156
Registrado em: 01 Ago 2009 10:01
Localização: Aracaju/Se

Nota Fiscal Paulista/Sergipana

Mensagem por Cavalo Marinho »

Bom dia pessoal, alguem ja desenvolveu a nota fiscal paulista totalmente em clipper? Aqui no meu estado está sendo implantado a nota fiscal sergipana que é praticamente um close da paulista, os mesmos registros etc. quero saber se existe alguma rotina para criar a chave e assinar o arquivo, ja tenho na minha base de dados todos os requesitos necessarios, no momento estou utilizando o acbrmonitor para gerar e assinar o arquivo, mas se por ventura eu necessitar gerar o meu arquivo por intervalo de datas preciso de um gerador de chave e assinador do arquivo.
Obrigado.
Jackson
Avatar do usuário
billy1943
Usuário Nível 4
Usuário Nível 4
Mensagens: 570
Registrado em: 12 Mai 2009 17:33
Localização: Bauru-SP

Nota Fiscal Paulista/Sergipana

Mensagem por billy1943 »

Aqui no Estado de São Paulo existe um programa da Secretaria da Fazenda e é por ele fazemos o envio e recebemos o protocolo.

Para a geração do arquivo em .TXT desenvolvi em Clipper, o que é bastante simples, em sua montagem, e uma vez validado pelo
citado programa basta enviá-lo colhendo o protocolo.

Como é um programa que interage com as Notas Fiscais emitidas e os ítens envolvidos, cada empresa terá sua própria sistemática, e acho não dá para haver uma rotina padrão para todas.

O conjunto de registros segue o modelo abaixo, onde:
10 - único registro onde consta o CNPJ e as datas inicial e final
20 - registro da NF com dados dela e do comprador
30 - dadados do produto vendido
40 - resumo fiscal da NF
50 -
60 -
90 - fecho do arquivo com totais

**********************************************************************************************************************************
10|1,00|00999999999999|01/04/2010|30/04/2010
20|I||VENDA|2|1|01/04/2010 09:21:14||1|5405|||05481391000127|APARECIDA MARIA SILVA -ME|R BRASIL |1600||CENTRO|IARAS|SP|18775000|BRASIL||
30|HL90LE|BATERIA CAMINHAO||PECA|1,0000|368,0000|368,00|060|0,00||
40|0,00|0,00|0,00|0,00|368,00|0,00|0,00|0,00|0,00|0,00|368,00|||
50|0||||||||||||||
60|34497||
90|00001|00001|00001|00001|00001

********************************************************************************************************************************
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Nota Fiscal Paulista/Sergipana

Mensagem por rochinha »

Amiguinhos,

Olhando o tópico lembrei de que havia postado a tempos atrás um tópico relativo(NFP com Classe 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.

Modo de uso simplificado:

Código: Selecionar todos

      Set Century On

      // Totalizadores necessarios
      nTOT20 := 0
      nTOT30 := 0
      nTOT40 := 0
      nTOT50 := 0
      nTOT60 := 0

      // Inicia geracao do arquivo
      NFPInicia( M->NPCAT102 )

      dbSelectArea( "PEDIDOS" )

      // Registro obrigatorio
      NFPSalvaRegistro( ;
                        NFPRegistro10( ... ) )
      // Registro obrigatorio
      NFPSalvaRegistro( ;
         NFPRegistro20( ... ) )

      // Selecione o arquivo que contenha os item do pedido atual
      dbSelectArea( "ITENS" )

      dbGoTop()
      do while .not. eof()
         // Monte as variaveis e repasse a funcao a seguir
         // Repita para cada item que exista no conjunto
         NFPSalvaRegistro( ;
            NFPRegistro30( ... )
         skip
      enddo

      // Finalize as informacoes do cupom com seus totalizadores no registro a seguir
      NFPSalvaRegistro( ;
         NFPRegistro40( ... ) )

      // Acrescente informacoes de transporte se necessario
      NFPSalvaRegistro( ;
         NFPRegistro50( ... ) )

      // Caso existam faturas vinculadas acrescente para gerar o proximo registro
      // Ele nao é obrigatorio
      _74_ := "" // X,N,1-256  Preencher o campo com os dados da fatura

      dbSelectArea( "CONTAS" )
      do while .not. eof()
         if for_o_pedido_atual
            _74_ := _74_ + dtoc(DATA_ARECEBER) + "-" + alltrim(transf(VALOR,"@E 99999999.99")) + " "
         endif
         Skip
      enddo
      _75_ := "" // X,N,1-256  Informacoes Adicionais de Interesse do Fisco
      _76_ := "" // X,N,1-5000 Informacoes Complementares de interesse do Contribuinte

      // Se existem faturas o registro 60 sera totalizado e escrito
      if len(alltrim(_74_)) > 0
         nTOT60 := nTOT60 + 1
         NFPSalvaRegistro( ;
            NFPRegistro60( _74_, _75_, _76_ ) )
      endif

      // Totaliza os registros 
      NFPSalvaRegistro( ;
      NFPRegistro90( strZero(nTOT20,5),; // N,S,5 Indicar total de registros tipo 20 existentes no arquivo 
                     strZero(nTOT30,5),; // N,S,5 Indicar total de registros tipo 30 existentes no arquivo 
                     strZero(nTOT40,5),; // N,S,5 Indicar total de registros tipo 40 existentes no arquivo 
                     strZero(nTOT50,5),; // N,S,5 Indicar total de registros tipo 50 existentes no arquivo 
                     strZero(nTOT60,5) ) ) // N,S,5 Indicar total de registros tipo 60 existentes no arquivo 
      Set Century Off
      NFPFinaliza()
Para mim, codificar é como cozinhar e pra voce?

boa sorte.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
HASA
Colaborador
Colaborador
Mensagens: 1088
Registrado em: 01 Set 2003 19:50
Localização: São Paulo
Contato:

Nota Fiscal Paulista/Sergipana

Mensagem por HASA »

:))
Nossa Rocha uma coisa é verdade não é NF-s e SIM NOTA FICAL PAULISTANA ( a NOTA FISCAL PAULISTA JÁ É OUTRA COISA) por esse motivo não localizei seu post, vou dar uma muito boa olhada e vou refazer as pesquisas PAULISTANAS ( que é a nossa nota fical de Serviços, que doidera), valeuuu mais uma vez(es) :-Y

Hasa
Responder