Página 1 de 1

NFS-e

Enviado: 13 Jun 2013 09:51
por jelias
Amiguinhos,

Um cliente me disse que as notas fiscais de serviços devem ser emitidas eletrônicamente (NFS-E). Sendo assim, entrei em contato com o setor responsável pelo processo de integração na Prejeitura e eles me passaram para a empresa ISSIntel que é responsável pelo sistema.
Após entrar em contato, recebi os manuais e estou estudando atentamente os detalhes de desenvolvimento.

No manual de integração pude perceber que o arquivo a ser enviado é em formato XML e confesso que não domino muito sobre este assunto. Atualmente estou emitindo NF-e usando o ACBRNfeMonitor, usando xHarbour 1.2.1 (simplex) + BCC. Existe um conselho (ABRASF) que é responsável pelo modelo de processo de integração.
http://suporte.issintel.com.br/attachme ... gracao.pdf

Existe alguém que já tenha desenvolvido NFS-e e pode me ajudar com os detalhes de integração? O projeto ACBr ou HbNFe tem algo já pronto para fim?

Saudações,

Júlio.

NFS-e

Enviado: 14 Jun 2013 23:09
por rochinha
Amiguinho,

Este manual parece muito antigo. Nem encontrei o layout nele.

Olhando no site da prefeitura aqui de São Paulo percebi que ainda se usa gerar o layout em formato de registros numerados em arquivo .TXT.

Em todo caso sugiro averiguar se no seu caso voce utilizaria o mesmo esquema e dê uma olhada em alguns de meus posts com código elucidativo.

NFS-SP

Nota Fiscal Paulista/Sergipana

A codificação nelas pode te ajudar a desenvolver mais rápido a sua nota.

Levando-se em consideração que o site da prefeitura qeu voce quer integrar pode possuir ambiente próprio para isto. A de Santana do Parnaíba tem um ambiente onde o usuário digita a nota ou envia um arquivo previamente formatado para o seu portal.

Em São Paulo pode se gerar o arquivo em .TXT, validar e enviar através de seu ambiente.

NFS-e

Enviado: 25 Jun 2013 09:11
por jelias
Amigo Rochinha,

Obrigado pela resposta.
Entrei em contato com o pessoal do suporte que me disseram que a integração via arquivo TXT ocorre da seguinte maneira. Gero o arquivo no formato TXT e depois o usuário tem que entrar na página da prefeitura, logar e enviar o arquivo TXT para validação. Após o envio o WEBSERVICE irá retornar via e-mail com o resultado da solicitação, neste caso homologado ou não. Se homologado o usuário pode imprimir a NFS-e no sistema deles, ou até mesmo gerar um PDF.
Uma coisa que não ficou clara foi como baixar o arquivo XML homologado, mais já enviei um e-mail para o suporte e estou aguardando um retorno.
Quanto a integração via XML ainda não entendi como fazê-la, mais estou estudando os manuais para entender melhor o processo que parecer ser parecido com a NF-e.
Confesso que não estou evoluindo muito neste projeto. :)

Manual http://suporte.issintel.com.br/attachme ... auto,0,842


Sds,

Júlio.

NFS-e

Enviado: 25 Jun 2013 09:53
por rochinha
Amiguinho,

Também estou trabalhando nisto e o que vejo em relação aos ambientes existentes, cada prefeitura adota um método, ora usando transferências em formato .TXT, ora usando transferênciasem formato .XML, ora os dois. Eu criei o código nos dois formatos.

Outra coisa que confunde ou dificulta é o fato das prefeituras usarem padrões distintos, ABRASF ou outros. Veja qual o padrão do RPS em texto de seu estado.

Link atualizado do Layout de São Paulo

Se o formato for idêntico ao do manual acima voce precisará somente dos registro 1, 2 e 9. Os registros 3 e 5 são especificos.

Logo mais apresento a codificação de meus registros conforme o manual acima.

NFS-e

Enviado: 28 Jun 2013 20:12
por jelias
Mestre Rochinha e amigos,

Confesso que não tive como dar continuidade na implantação da NFS-e devido ao volume de trabalho e viagens nesta semana, entretanto como dia 01/07/2013 tenho que colocar para funcionar terei um grande desafio para este final de semana.
Eu não estou entendendo o manual para fazer em XML, mais consegui pegar arquivos exemplos. http://suporte.issintel.com.br/entries/ ... e-retornos

Quanto a montar o arquivo XML até que consigo fazer imitando o formato do exemplo, pois pra mim o manual da ABRASF não explica de maneira clara como fazê-lo. Na verdade me sinto incapaz de entendê-lo, gerando até um pouco de frustação. Mais como não há tempo para isso, bola pra frente.
- Eu não sei como pegar e salvar no arquivo dados do certificado digital.
- Também não entendo muito sobre schemas.
Em resumo, é fácil reconhecer os dados no XML relacionados a NFS-e, mais os dados de certificados e demais dados não sei quanto irão mudar ou não.

O formato utilizado por eles para o arquivo TXT é diferente do arquivos de São Paulo, que pra mim é muito bom e o manual é claro e transparente para um iniciante como eu. :)
http://suporte.issintel.com.br/attachme ... ao_RPS.pdf

Hoje a noite irei fazer o arquivo TXT para que possam importar e evitar erros no momento da emissão da NFS-e. Todavia, tenho que fazer a integração do arquivo XML o cliente logo irá querer tudo integrado e sem ter que entrar no site da prefeitura para fazer a emissão.

Sds,

Júlio.

NFS-e

Enviado: 28 Jun 2013 21:16
por rochinha
Amiguinho,

Também esbarrei em problemas ao trabalhar no formato .XML.

Decidi gerar no formato lote, assinar e validar usando o aplicativo demo da FlexDocs. Gerei o .XML na cutícula e usei o aplicativo somente para validar e assinar.

No caso de lote, mesmo que só envie uma RPS é necessário assiná-la e assinar o lote, ou seja, duas assinaturas. Como o aplicativo me fez isso facilitou corrigir os problemas e chegar ao .XML limpo. Mas se for fazer na mão terá um belo trabalho.

A assinatura do RPS necessita de uma string montada com dados do mesmo, gerar conversão para byte, Hash e assinar o Hash. Fiquei boiando.

Então dei preferência por fazer baseado no layout .TXT e deixar o usuário importar direto no site da prefeitura.

Caso queira usar a FlexDocs para testar coloco abaixo o trecho que usei para acessar a .DLL/.OCX. É necessário registrá-la usando o .BAT que a acompanha.

Download

Código exemplo:

Código: Selecionar todos

#include "FiveWin.ch"

function Main()
   LOCAL oAcx, iNFeUtil := 0, msgResultado := "",qtdeErros := 0, erroXML := "", resultado := 0
   PUBLIC oNFeUtil 
			
   Registrado   := "00.000.000/0000-00 - EMPRESA DEMO LTDA ME"
   ChaveLicenca := "b06ccea9f950a4e62c2be9540efc61c3943736496e217adfff0ad7e925d84ec5bb9c21671ea91562dcc3419e99532c5725a23e3b3cfcc4c18c03e57c368e173a" // LICENCA DEMO
   nomeCert  := "ARQUIVO|C:\NFeUtil\CertificadoReal.pfx|senha123"
   xmlString := "C:\NFeUtil\50110903139066000155550010000500191000500199-nfe.XML"
   xmlFile   := MemoRead(xmlString)

   if empty(xmlFile)
      MsgStop( "XML nao foi encontrado." )
      return .f.
   endif
   
   ? objNFSeUtil := TOleAuto():New( "NFSe_Util.Util" )

   if MsgYesNo( "Enviar xml agora?" )

      //
      // informar licenca de uso para ambiente de produção
      //
      cMunicipio           := "3550830"
      certificado          := "CN=5V DevelopMent"
      ambiente             := "2"
      versao               := ""
      msgDados             := ""
      cResultado           := ""
      msgResultado         := ""
      CNPJPrestador        := "18066611000106" // CNPJ do cliente cadastrado no CCM
      numeroLote           := "1"
      dataRecebimento      := dtos( date() )
      protocolo            := ""
      ListaMensagemRetorno := ""
      proxy                := ""
      usuario              := ""
      senha                := ""
      ChaveLicenca         := "b06ccea9f950a4e62c2be9540efc61c3943736496e217adfff0ad7e925d84ec5bb9c21671ea91562dcc3419e99532c5725a23e3b3cfcc4c18c03e57c368e173a"
  
      //
      //   invoca Web Service
      //
      iNFeUtil := objNFSeUtil:EnviaLoteRPS( cMunicipio, ;
                                            certificado, ;
                                            ambiente, ;
                                            versao, ;
                                            msgDados, ;
                                            cResultado, ;
                                            msgResultado, ;
                                            CNPJPrestador, ;
                                            numeroLote, ;
                                            dataRecebimento, ;
                                            protocolo, ;
                                            ListaMensagemRetorno, ;
                                            proxy, ;
                                            usuario, ;
                                            senha, ;
                                            ChaveLicenca )
   
       if iNFeUtil <> 0
       endif
   
   endif
   return nil

NFS-e

Enviado: 16 Jul 2013 17:41
por jelias
Amiguinhos,

Não consegui desenvolver o processo de integração da NFS-e via XML. A solução que encontrei foi gerar um arquivo TXT e importar no site da prefeitura. Após a importação, é gerado um lote e a nota fiscal pode ser impressa direto do site e o arquivo XML é salvo na pasta determinada, onde faço a conferência e libero a NFS-e como emitida.

Irei deixar o código abaixo, pois como tive muitos problemas com o manual que não está completo, na esperança que possa ajudar!

Código: Selecionar todos

///////////////////////////////////////////////////////////////////////////////
//
// Rotina para montagem do arquivo da NFS-e
//
//	      Autor: Julio Cezar Costa Elias
//     Lingagem: xBase
//  Plataformas: DOS, Windows
// Observacoes: O arquivo tem que ter campos sepadarados por virgulas (,)
//	               : Os dados dos campos tem que estar entre aspas ("")
//	               : As colunas obrigatorias nao podem ficar em branco
//////////////////////////////////////////////////////////////////////////////
STATIC FUNCTION CRIANFSE()
LOCAL nData:=RIGHT(DTOC(AL_SAIDA->datemi),4)+"-"+SUBS(DTOC(AL_SAIDA->datemi),4,2)+"-"+LEFT(DTOC(AL_SAIDA->datemi),2)
LOCAL nMeses:={"Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"}
LOCAL nAno:=RIGHT(DTOC(AL_SAIDA->datemi),4)
LOCAL nPath:=AW_NFSE+"\TXT\"+nMeses[MONTH(AL_SAIDA->datemi)]+nAno
LOCAL rPath:=AW_NFSE+"\XML\"+nMeses[MONTH(AL_SAIDA->datemi)]+nAno
LOCAL nDescricao:=ALLTRIM(AL_SAIDA->descm1)+ALLTRIM(AL_SAIDA->descm2)+ALLTRIM(AL_SAIDA->descm3)
LOCAL nServico:=IIF(aw_simples="S","14.01","14.01")
LOCAL nAliquota:=IIF(aw_simples="S","0.02","0.05")

//Verifica se existe a pasta para salvar o arquivo
if !ISDIRECTORY(nPath+"\")
   nRet:=MAKEDIR(nPath+"\")
end
if !ISDIRECTORY(rPath+"\")
   nRet:=MAKEDIR(rPath+"\")
end

sele AL_CIDAD
DBSETORDER(1)
DBSEEK(AL_CLIEN->codmun)

sele AL_CLIEN
DBSETORDER(1)
DBSEEK(AL_SAIDA->codcli)


SELE AL_SAIDA
if AL_CLIEN->indent="01" .or. AL_CLIEN->indent="04"
   nCGC=ALLTRIM(AL_CLIEN->CPFCGC)
   nINS=ALLTRIM(AL_CLIEN->INSEST)
else
   nCGC=ALLTRIM(AL_CLIEN->CPFCGC)
   nINS="ISENTO"
end
do whil AT(".",nCGC)#0
   nCGC=STUFF(nCGC,AT(".",nCGC),1,"")
end
do whil AT("-",nCGC)#0
   nCGC=STUFF(nCGC,AT("-",nCGC),1,"")
end
do whil AT("/",nCGC)#0
   nCGC=STUFF(nCGC,AT("/",nCGC),1,"")
end
do whil AT(".",nINS)#0
   nINS=STUFF(nINS,AT(".",nINS),1,"")
end
do whil AT("-",nINS)#0
   nINS=STUFF(nINS,AT("-",nINS),1,"")
end
do whil AT("/",nINS)#0
   nINS=STUFF(nINS,AT("/",nINS),1,"")
end
do whil AT("P",nINS)#0
   nINS=STUFF(nINS,AT("P",nINS),1,"")
end
do whil AT("R",nINS)#0
   nINS=STUFF(nINS,AT("R",nINS),1,"")
end
do whil AT(":",nINS)#0
   nINS=STUFF(nINS,AT(":",nINS),1,"")
end
if LEN(ALLTRIM(nINS))<14
   nINS=nINS+SPAC(14-LEN(ALLTRIM(nINS)))
end
nTEL=ALLTRIM(AL_CLIEN->TELEF1)
do whil AT("(",nTEL)#0
   nTEL=STUFF(nTEL,AT("(",nTEL),1,"")
end
do whil AT(")",nTEL)#0
   nTEL=STUFF(nTEL,AT(")",nTEL),1,"")
end
do whil AT("-",nTEL)#0
   nTEL=STUFF(nTEL,AT("-",nTEL),1,"")
end
nTEL=ALLTRIM(nTEL)
if LEFT(nTEL,1)="0"
   nTEL=SUBS(nTEL,2,LEN(nTEL))
end

xTxt := ["]+AL_SAIDA->codigo+[",]                                       // Numero do RPS
xTxt += ["]+ALLTRIM(AL_SAIDA->serien)+[",]                        // Numero de Serie do RPS
xTxt += ["1",]                                                                      // Tipo do RPS 1-RPS, 2-Nota Fiscal Conjugada, 3-Cupom
xTxt += ["]+nData+[",]                                                          // Data Emissao formato AAAA-MM-DD
xTxt += ["1",]                                                                       // Natureza de operacao: 1 - Tributacao no municipio
xTxt += ["",]                                                                         // Codigo do Regime Especial
xTxt += ["]+IIF(aw_simples="S","1","N")+[",]                           // Optante de simples Nacional: 1-Sim, 2-Nao
xTxt += ["2",]                                                                       // Incentivo Cultural: 1-Sim, 2-Nao
xTxt += ["1",]                                                                       // Status do RPS: 1-Normal, 2-Cancelado
xTxt += ["",]                                                                        // Numero do RPS substituida
xTxt += ["",]                                                                        // Numero Serie RPS substituida
xTxt += ["",]                                                                        // Tipo RPS substituida
xTxt += ["]+ALLTRIM(STR(AL_SAIDA->vlrmao,15,2))+[",]       // Valor do Servico
xTxt += ["0",]                                                                      // Deducoes
xTxt += ["0",]                                                                      // Valor do PIS
xTxt += ["0",]                                                                      // Valor do COFINS
xTxt += ["0",]                                                                      // Valor do INSS
xTxt += ["0",]                                                                      // Valor do IR
xTxt += ["0",]                                                                      // Valor do CSLL
xTxt += ["2",]                                                                      // Indicador de retencao de ISS 1-SIM, 2-NAO
xTxt += ["]+ALLTRIM(STR(0,15))+[",]                                   // Valor do ISS
xTxt += ["0",]                                                                     // Outras Retencoes
xTxt += ["]+ALLTRIM(STR(AL_SAIDA->vlrmao,15,2))+[",]      // Base de Calculo
xTxt += ["]+nAliquota+[",]                                                  // Aliquota
xTxt += ["0",]                                                                    // Valor Liquido
xTxt += ["0",]                                                                    // Valor do ISS Retido
xTxt += ["0",]                                                                    // Desconto Condicionado
xTxt += ["0",]                                                                    // Desconto Incondicionado
xTxt += ["]+nServico+[",]                                                   // Item da Lista de Servico
xTxt += ["",]                                                                     // Codigo CNAE
xTxt += ["",]                                                                     // CodigoTributacao do Municipio
xTxt += ["]+nDescricao+[",]                                               // Descriminacao do servico
xTxt += ["3149903",]                                                       // Codigo Municipio IBGE
xTxt += ["]+STRZERO(VAL(RETNUM(AL_EMPRE->CGCEMP)),14)+[",]  // CNPJ do Prestador
xTxt += ["]+ALLTRIM(AL_EMPRE->insmun)+[",]                  // Inscricao Municipal do Prestador
xTxt += ["]+nCGC+[",]                                                      // CNPJ/CPF Cliente
xTxt += ["",]                                                                    // Inscricao Municipal do Tomador
xTxt += ["]+ALLTRIM(AL_CLIEN->nomecl)+[",]                  // Razao Social do cliente
xTxt += ["]+ALLTRIM(AL_CLIEN->endere)+[",]                  // Endereco do Cliente
xTxt += ["]+ALLTRIM(AL_CLIEN->numero)+[",]                  // Numero do Endereco
xTxt += ["",]                                                                   // Complemento
xTxt += ["]+ALLTRIM(AL_CLIEN->bairro)+[",]                    // Bairro do Cliente
xTxt += ["]+AL_CLIEN->codmun+[",]                                // Codigo Municipio-IBGE do cliente
xTxt += ["]+AL_CLIEN->estado+[",]                                  // UF do Cliente
xTxt += ["]+LEFT(AL_CLIEN->cepcli,2)+SUBS(AL_CLIEN->cepcli,4,3)+RIGHT(AL_CLIEN->cepcli,3)+[",]   // Cep do Cliente
xTxt += ["]+RETNUM(AL_CLIEN->telef1)+[",]                   // Telefone do cliente
xTxt += ["]+ALLTRIM(AL_CLIEN->emaild)+[",]                  // E-mail do Cliente
xTxt += ["",]                                                                 // Racao social intermediario
xTxt += ["",]                                                                 // CNPJ Intermediario
xTxt += ["",]                                                                 // Inscricao Municipal intermediario
xTxt += ["",]                                                                // Codigo Obra
xTxt += [""]                                                                 // Art

varq=nPath+"\SE"+AL_SAIDA->codigo+".TXT"
SETPRC(0,0)
set print on
set conso off
set print to &vArq
?? xTxt
? ""
set cons on
set print off
set print to

MENSAGEM("Nota fiscal de servico criada com SUCESSO!",4)
retu
Sds,

Júlio