Ir para conteúdo
  • Cadastre-se

dev botao

Provedor CONAM implementado no Trunk2


Ver Solução Respondido por Italo Giurizzato Junior,
  • Este tópico foi criado há 3063 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado
Em 02/05/2016 at 11:37, almp1 disse:

 

Olá Rafael !

Nós ainda não estamos usando em ambiente de produção porque o sistema que irá utilizar o CONAM será disponibilizado para produção em Junho/2016, porém todos os métodos disponíveis pelo CONAM foram implementados e no ambiente de homologação do provedor temos tido sucesso.

Acredito que depois de validado em mais alguns ambientes de produção podemos ter tranquilidade de postar nos "provedores 100%"

Abraços

Olá @almp1,

Estou acompanhando a evolução do CONAM no projeto e recentemente resolvi fazer teste com ele junto ao portal.

Como eu envio os RPS em formato txt, ao começar realizar alguns testes, me deparei com alguns obstáculos que tomei a liberdade de acrescentar algumas correções no código fonte. Espero com isso ter colaborado com as melhorias. Todas as modificações foram testas e estão funcionando perfeitamente.

Nos trechos de código que foram colocados ou modificados, coloquei um "todo" para melhor localização e explicação do porque?.

As implementações, eu fiz analisando o manual da CONAM.

Segue os arquivos que sofreram as modificações.

Há, como código é gosto, fiquem a vontade para melhorá-los.

Qualquer dúvida, estou a disposição.

pnfsNFSeW_CONAM.pas

pnfsNFSe.pas

pnfsConversao.pas

  • Curtir 1

Mauro Augusto Souza Lima / Sócio Desenvolvedor

Tels : (24) 2246-0548 - 2246-3051

www.limatech.com.br

limatech.png

Postado
Em 09/05/2016 at 08:10, Italo Jurisato Junior disse:

Bom dia Mauro,

Muito obrigado pela colaboração, já esta disponível no repositório.

@Italo Jurisato Junior, Boa noite.

Eu atualizei os fontes, e acho que na hora de você versionar a classe pnfsNFSeW_CONAM, você deixo este linha   Gerador.wCampoNFSe(tcStr, '', 'CpfCnpTom'  , 01, 14, 1, OnlyNumber(NFSe.Tomador.IdentificacaoTomador.CpfCnpj), '');

Com este linha, não não é possível validar consumidor final. Dê uma olhada no anexo.

Obrigado.

 
 

Mauro Augusto Souza Lima / Sócio Desenvolvedor

Tels : (24) 2246-0548 - 2246-3051

www.limatech.com.br

limatech.png

  • 2 semanas depois ...
Postado (editado)

Olá Italo, tudo bem ?

Hoje atualizei o ACBr para a revisão 11805

Percebi que no ACBrNFSeWebServices.pas faltou uma instrução no método TNFSeCancelarNfse.DefinirDadosMsg para passar a Serie da Nota/RPS. Se não houver esta instrução o provedor CONAM pode não encontrar o registro e não efetua o cancelamento da NFSe.

Também no método TWebServices.CancelaNFSe se o servidor for conam não podemos efetuar a consulta da nfe, pois o conam não implemente este metodo.

No pnfsCancNfseResposta.pas adicionei uma linha para retornar a data e hora do cancelamento no método TretCancNFSe.LerXml_proCONAM. Isso foi necessário para podermos tratar as mensagens de retorno do webservice. Caso contrario as mensagens vão vir como exceções.

 

// Necessário para o provedor CONAM
SerieRps   := FNotasFiscais.Items[0].NFSe.IdentificacaoRps.Serie;

if not (TACBrNFSe(FACBrNFSe).Configuracoes.Geral.Provedor in [proABase, proEL, proISSNet, proCONAM]) then

FInfCanc.DataHora := Now;

Segue arquivo anexo

Abraços

 

ACBrNFSeWebServices.pas

pnfsCancNfseResposta.pas

Editado por almp1
  • Curtir 1

André Medeiros

Postado

Olá Italo, tudo bem ?

Obrigado por disponibilizar as alterações no SVN.

Esta semana nos dias 1, 2 e 3 de Junho/2016 colocamos a primeira versão do nosso sistema em produção. Por enquanto nossos clientes só consomem Webservice Municipal do provedor CONAM. 

É bem comum enfrentarmos problemas no inicio das operações, pois os testes nunca preveem todas as possibilidades em que os usuários podem operar.

Entre muitas situações, o maior inconveniente foi o recebimento da mensagem "Erro intereno: 110 / HTTP: 0". 

Pesquisando aqui no forum achei esta configuração

ACBrNFSe.Configuracoes.WebServices.AguardarConsultaRet:=5000;
ACBrNFSe.Configuracoes.WebServices.TimeOut:=15000;
ACBrNFSe.Configuracoes.WebServices.AjustaAguardaConsultaRet:=True;

Esta foi a unica alteração que precisamos fazer nas configurações do ACBr. Depois disso o envio das NFSes foram efetivados com 100% de sucesso.

Por isso gostaria de agradecer a todos que, de forma direta ou indireta, contribuíram para o desenvolvimento deste provedor no ACBr.

Porém não paramos por aqui. Acredito que nosso próximo desafio é permitir que o usuário envie varias notas em um único protocolo. A principio a alteração parece ser simples mas gostaria do parecer e de ajuda dos outros desenvolvedores para podermos caminhar na mesma linha.

Em suma a alteração consiste na alteração do método GerarValoresServico do TNFSeW_CONAM que devem montar um rodapé com o total das notas. 

No recurso atual este método é chamado a cada nota adicionada. Acredito que teríamos que chamar este método no final. 

Uma sugestão simples seria migrar o conteúdo deste método para o arquivo pnfsNFSeG.pas no método Gera_DadosMsgEnviarLote do TNFSeG.

    proCONAM: begin
                Gerador.Opcoes.DecimalChar := ',';
                Gerador.Prefixo := '';
                Gerador.wGrupoNFSe('Sdt_processarpsin xmlns="NFe"');
                Gerador.wGrupoNFSe('Login');
                Gerador.wGrupoNFSe('CodigoUsuario>' + UserWeb + '</CodigoUsuario');
                Gerador.wGrupoNFSe('CodigoContribuinte>' + SenhaWeb + '</CodigoContribuinte');
                Gerador.wGrupoNFSe('/Login');
                Gerador.ArquivoFormatoXML := Gerador.ArquivoFormatoXML + Notas;
                //Daqui para baixo é a alteração
                Gerador.wGrupoNFSe('Reg90');

                Gerador.wCampoNFSe(tcStr, '', 'QtdRegNormal'  , 01, 05, 1, QtdeNotas, '');
                Gerador.wCampoNFSe(tcStr, '', 'ValorNFS'      , 01, 02, 1, FormatFloat('############0.00', ValorTotalServicos), '');
                Gerador.wCampoNFSe(tcStr, '', 'ValorISS'      , 01, 02, 1, FormatFloat('############0.00', ValorIss), '');
                Gerador.wCampoNFSe(tcStr, '', 'ValorDed'      , 01, 02, 1, FormatFloat('############0.00', ValorTotalDeducoes), '');
                Gerador.wCampoNFSe(tcStr, '', 'ValorIssRetTom', 01, 02, 1, FormatFloat('############0.00', ValorIssRetido), '');
                Gerador.wCampoNFSe(tcStr, '', 'QtdReg30'      , 01, 05, 1, '0', '');
                Gerador.wCampoNFSe(tcStr, '', 'ValorTributos' , 01, 02, 1, '0,00', '');

                Gerador.wGrupoNFSe('/Reg90');

                Gerador.wGrupoNFSe('/Sdt_processarpsin');
              end;

Não fiz esta alteração de forma efetiva, mas acredito que podemos começar por aqui.

Aguardo comentários. :)

Abraços

André Medeiros

Postado
Em 03/06/2016 at 16:10, almp1 disse:

Olá Italo, tudo bem ?

Obrigado por disponibilizar as alterações no SVN.

Esta semana nos dias 1, 2 e 3 de Junho/2016 colocamos a primeira versão do nosso sistema em produção. Por enquanto nossos clientes só consomem Webservice Municipal do provedor CONAM. 

É bem comum enfrentarmos problemas no inicio das operações, pois os testes nunca preveem todas as possibilidades em que os usuários podem operar.

Entre muitas situações, o maior inconveniente foi o recebimento da mensagem "Erro intereno: 110 / HTTP: 0". 

Pesquisando aqui no forum achei esta configuração


ACBrNFSe.Configuracoes.WebServices.AguardarConsultaRet:=5000;
ACBrNFSe.Configuracoes.WebServices.TimeOut:=15000;
ACBrNFSe.Configuracoes.WebServices.AjustaAguardaConsultaRet:=True;

Esta foi a unica alteração que precisamos fazer nas configurações do ACBr. Depois disso o envio das NFSes foram efetivados com 100% de sucesso.

Por isso gostaria de agradecer a todos que, de forma direta ou indireta, contribuíram para o desenvolvimento deste provedor no ACBr.

Porém não paramos por aqui. Acredito que nosso próximo desafio é permitir que o usuário envie varias notas em um único protocolo. A principio a alteração parece ser simples mas gostaria do parecer e de ajuda dos outros desenvolvedores para podermos caminhar na mesma linha.

Em suma a alteração consiste na alteração do método GerarValoresServico do TNFSeW_CONAM que devem montar um rodapé com o total das notas. 

No recurso atual este método é chamado a cada nota adicionada. Acredito que teríamos que chamar este método no final. 

Uma sugestão simples seria migrar o conteúdo deste método para o arquivo pnfsNFSeG.pas no método Gera_DadosMsgEnviarLote do TNFSeG.


    proCONAM: begin
                Gerador.Opcoes.DecimalChar := ',';
                Gerador.Prefixo := '';
                Gerador.wGrupoNFSe('Sdt_processarpsin xmlns="NFe"');
                Gerador.wGrupoNFSe('Login');
                Gerador.wGrupoNFSe('CodigoUsuario>' + UserWeb + '</CodigoUsuario');
                Gerador.wGrupoNFSe('CodigoContribuinte>' + SenhaWeb + '</CodigoContribuinte');
                Gerador.wGrupoNFSe('/Login');
                Gerador.ArquivoFormatoXML := Gerador.ArquivoFormatoXML + Notas;
                //Daqui para baixo é a alteração
                Gerador.wGrupoNFSe('Reg90');

                Gerador.wCampoNFSe(tcStr, '', 'QtdRegNormal'  , 01, 05, 1, QtdeNotas, '');
                Gerador.wCampoNFSe(tcStr, '', 'ValorNFS'      , 01, 02, 1, FormatFloat('############0.00', ValorTotalServicos), '');
                Gerador.wCampoNFSe(tcStr, '', 'ValorISS'      , 01, 02, 1, FormatFloat('############0.00', ValorIss), '');
                Gerador.wCampoNFSe(tcStr, '', 'ValorDed'      , 01, 02, 1, FormatFloat('############0.00', ValorTotalDeducoes), '');
                Gerador.wCampoNFSe(tcStr, '', 'ValorIssRetTom', 01, 02, 1, FormatFloat('############0.00', ValorIssRetido), '');
                Gerador.wCampoNFSe(tcStr, '', 'QtdReg30'      , 01, 05, 1, '0', '');
                Gerador.wCampoNFSe(tcStr, '', 'ValorTributos' , 01, 02, 1, '0,00', '');

                Gerador.wGrupoNFSe('/Reg90');

                Gerador.wGrupoNFSe('/Sdt_processarpsin');
              end;

Não fiz esta alteração de forma efetiva, mas acredito que podemos começar por aqui.

Aguardo comentários. :)

Abraços

@almp1, boa noite. Estive analisando sua idéia, e é poraí mesmo o raciocínio.

Vamos ver a opinião do @Italo Jurisato Junior

Mauro Augusto Souza Lima / Sócio Desenvolvedor

Tels : (24) 2246-0548 - 2246-3051

www.limatech.com.br

limatech.png

Postado

Olá Italo, tudo bem ?

Só mais um detalhe na atualização. No arquivo pnfsNFSeR.pas faltou uma linha no método LerNFSe_CONAM

IdentificacaoRps.Serie:= Leitor.rCampo(tcStr, 'SerRps');

Esta instrução define a pesquisa da nota no WS do provedor CONAM, pois a pesquisa é feita por Numero de RPS + Serie do RPS.

Se o numero de serie não for passado para pesquisar ou cancelar uma RPS/NFS o registro não é encontrado 

Estou enviando o arquivo anexo 

Abraços,

pnfsNFSeR.pas

André Medeiros

Postado

Olá Amigos que usam o provedor CONAM

Adicionei na construção do XML o registro 30. Este registro permite que os tributos adicionais alem do ISS sejam destacados na impressão da nota de forma separada conforme imagem anexa.

Para permitir a declaração do registro 30 foi necessário apenas alterações no arquivo pnfsNFSeW_CONAM.pas que também esta anexo.

Conforme a documentação do provedor, os tributos previstos são, PIS, COFINS, CSLL, INSS e IR, caso o prestador de serviço seja orientado a declarar outro tipo de tributo além dos citados, deve ser consultado na prefeitura local o suporte ao tributo no arquivo XML.

Outra alteração necessária foi o envio do nome das cidades que, são validadas de acordo com o CEP informado. Um exemplo é a cidade SANTA BARBARA D'OESTE, o apostrofo deve ser substituído pelo espaço. Por padrão o utilitário do ACBr faz faz a substituição pelo código do carácter, e isso causa exceção no WS CONAM, pois o retorno exibe que a cidade informada não se refere ao CEP informado.

Caso tenham alguma dúvida ou sugestão entrem em contato. 

Abraços 

tributos.png

pnfsNFSeW_CONAM.pas

André Medeiros

Postado

Olá Italo,

Tudo bem ?

Obrigado pelo "commit", vamos implementar o recurso para o envio de varias notas no mesmo lote. Provavelmente surgirão algumas dúvidas de como implementar sem afetar muito os arquivos principais do ACBr, conto com a ajuda de vocês :)

Abraços,

  • Curtir 2

André Medeiros

  • 2 semanas depois ...
Postado

Olá Amigos

Segue anexo alteração para envio e consulta de RPS em lote para o provedor CONAM.

Olá Italo, para facilitar a validação comentei as linhas que foram alteradas com //almp1. O arquivo pnfsNFSeW_CONAM.pas não foi comentado pois é o mais isolado e foi o que recebeu menos alterações, só foi preciso comentar algumas linhas.

Com estas alterações é possível enviar um lote de RPS(s) e, ao consultar as notas deste protocolo, se houver varias notas emitidas neste protocolo, o sistema ira popular uma lista de NFSe para leitura. Sendo assim após a consulta  

ACBrNFe.ConsultarLoteRps

É possível recuperar todas as notas emitidas

for i := 0 to ACBrNFe.NotasFiscais.Count - 1 do
  begin
    with ACBrNFe.NotasFiscais.Items[i] do 
      begin
        NFSe.Numero
        NFSe.Identificacao.Numero
       .
       .
       .
      end;
  end;
     

O método de cancelamento só permite o envio de um RPS, por isso não houve alterações neste método

Espero que ajude aos amigos que consomem o provedor CONAM

Qualquer dúvida estou a disposição

Abraços,

pnfsLerListaNFSe.pas

pnfsNFSeG.pas

pnfsNFSeR.pas

pnfsNFSeW_CONAM.pas

ACBrNFSeWebServices.pas

André Medeiros

  • Consultores
Postado

Boa tarde André,

Muito obrigado pela colaboração, já esta no repositório.

Fiz algumas pequenas alterações.

Favor atualizar todos os fontes de todas as pastas e realizar novos testes.

Caso todas funcionalidades estejam funcionando, favor me comunicar para que eu possa incluir o provedor Conam na lista de provedores que estão funcionando 100%.

  • Curtir 1
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado

Olá Italo

Fiz os testes a unica alteração que ficou pendente foi das linhas abaixo no ACBrNFSeWebServices. 

No lugar destas instruções       

ValorIss       := FNotasFiscais.Items[0].NFSe.Servico.Valores.ValorIss;
ValorIssRetido := FNotasFiscais.Items[0].NFSe.Servico.Valores.ValorIssRetido;

Precisa estar conforme abaixo, pois o ValorISS e ValorIssRetido é a soma destes valores utilizados nos RPS(s) do lote enviado, da forma acima estaríamos enviando apenas o valor da primeiro RPS

ValorIss       := TotalISS; //almp1
ValorIssRetido := TotalISSRetido; //almp1

Fiz o mesmo esquema da alteração anterior comentando com almp1 as linhas alteradas.

Segue o arquivo alterado anexo

Qualquer duvida estou a disposição

Abraços,

 

ACBrNFSeWebServices.pas

André Medeiros

  • Consultores
Postado

Bom dia André,

Muito obrigado, desculpe pela falha, já esta no repositório, favor atualizar pois a sua unit esta desatualizada.

Com essas alterações já podemos dizer que o provedor Conam esta funcionando 100% ?

  • Curtir 1
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado

Bom dia Italo, tudo bem ?

Obrigado pelo commit, fiz os testes aqui e todos os métodos do provedor estão funcionando. Com isso estamos 100% integrados com o CONAM. Eu já estou usando este provedor em ambiente de produção com os cliente que emitem nota por ele.

Só preciso fazer um ajuste na leitura do XML da Nota para impressão do DANFE usando o ACBr, pois incluímos o Registro 30.

Porém, se o programador utilizar a impressão da própria prefeitura, pode colocar o provedor em produção.

Assim que eu concluir o ajuste da leitura envio o arquivo.

Abraços

André Medeiros

Postado

Olá Italo

Segue pnfsNFSeR.pas com o método LerNFSe_CONAM atualizado. 

Com esta atualização agora é possível ter uma leitura mais completa do XML para efetuar a impressão local. 

Acredito que isso torna o Provedor Conam 100% funcional.

OBS: Não fiz nenhuma alteração nos recursos de impressão, caso tenham alguma dúvida que eu possa ajudar, fico a disposição.

Abraços,

 

pnfsNFSeR.pas

  • Curtir 1

André Medeiros

Postado

Bom dia Italo, tudo bem ?

Fiz vários testes para leitura do xml que contem a lista de notas de retorno, e acabei enfrentando problemas com o tratamento de datas.

Se eu uso a função nativa do acbr

Leitor.rCampo(tcDat, 'DtEmiNf');

Sempre recebo exceção ou do formato da data ou do uso de '/' de forma inválida. Acredito que isso ocorre porque o tcDat espera o formato yyyy/mm/dd

Por isso fiz mais alguns ajustes no pnfsNFSeR.pas no método LerNFSe_CONAM, e precisei tratar novamente primeiro os campos do tipo data como string e depois transforma-las em data. Sei que não é o mais correto, mas não consegui fazer de outra forma.

Alguns detalhes que podem ajudar, o XML das notas retornam com os campos data assim:

<DtEmiNf>11/07/2016</DtEmiNf>

Estou enviando o arquivo pnfsNFSeR.pas para sua analise.

Abraços,

 

pnfsNFSeR.pas

André Medeiros

  • Este tópico foi criado há 3063 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.