Ir para conteúdo
  • Cadastre-se

dev botao

Provedor CONAM implementado no Trunk2


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

Recommended Posts

31 minutos atrás, Italo Jurisato Junior disse:

Bom dia André,

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

Bom dia Italo

Eu que agradeço. 

Em suma o provedor conam fornece apenas 5 métodos

1) Envio de Lote de RPS. (Implementado)
Referencia no arquivo INI [SoapAction] Recepcionar = NFeaction/AWS_NFE.PROCESSARPS

2) Consulta Notas de um protocolo. Implementado localmente, mas ainda estou fazendo testes para tratamento de erros, estarei disponibilizando para avaliação até amanhã (24/03/16)
Referencia no arquivo INI [SoapAction] ConsLote = NFeaction/AWS_NFE.CONSULTANOTASPROTOCOLO

3) Consulta de Protocolo de RPS. Implementado localmente e já efetuei testes para validação do protocolo e tratamento de erros, estarei disponibilizando para sua avaliação até amanhã (24/03/16) 
Referencia no arquivo INI  [SoapAction] ConsSit = NFeaction/AWS_NFE.CONSULTAPROTOCOLO

4) Validação de lote de RPS
Não tem referencia no arquivo INI

5) Cancelamento de NFSe. A solicitação do cancelamento já esta implementado, mas não ha implementação da leitura do retorno ainda, estarei implementando e assim que estiver pronto disponibilizo para sua avaliação.  
Referencia no arquivo INI  [SoapAction] Cancelar=NFeaction/AWS_NFE.CANCELANOTAELETRONICA

Abraços,

 

 

André Medeiros

Link para o comentário
Compartilhar em outros sites

Olá Italo,

Tudo bem ?

Conforme prometido, estou enviando anexo os arquivos atualizados para sua avaliação para podermos consumir os métodos:
1) Envio de RPS.
2) Consulta a situação do protocolo.
3) Consulta resultado do processamento com as notas emitidas ou erros dos RPSs.
5) Cancela RPS/NFSe.

O método para validar o lote de RPS não foi implementado.

Caso tenha algum problema ou precise fazer alguma correção estou a disposição para ajudar.

Gostaria de agradecer aos outros membros que também colaboraram para o desenvolvimento deste provedor.

Abraços,

ACBrNFSe.zip

Frm_Demo_ACBrNFSe.pas

CONAM.ini

Cidades.ini

André Medeiros

Link para o comentário
Compartilhar em outros sites

Olá Italo,

Tudo bem ?

Adicionando mais uma pequena alteração no arquivo CONAM.ini, assim podemos resgatar o Link da NFSe. Apenas para documentar estou usando os parâmetros da seguinte forma:

1) %CodVerif% - O código de verificação é informado no retorno do método da consulta às NFEs, pegamos esta informação neste momento.
2) %NumeroNFSe% - O código de verificação é informado no retorno do método da consulta às NFEs, pegamos esta informação neste momento.
3) %InscMunic% - O Conam não usa está informação no link da NFSe, por isso estou usando este parâmetro para enviar o código do contribuinte. Este código pode ser adquirido no próprio link da NFSe, quando a prefeitura faz o envio do email para o contribuinte.

Segue a alteração necessária no arquivo CONAM.ini

[LinkNFSe]
Producao=https://nfe.etransparencia.com.br/%NomeURL_P%/nfe/stubimprimenfe.aspx?%NumeroNFSe%_%InscMunic%_%CodVerif%
Homologacao=https://nfehomologacao.etransparencia.com.br/%NomeURL_H%/nfe/stubimprimenfe.aspx?%NumeroNFSe%_%InscMunic%_%CodVerif%

Estou enviando o arquivo completo anexo caso queria disponibilizar no repositório

Abraços,

 

CONAM.ini

Editado por almp1
Esqueci o anexo

André Medeiros

Link para o comentário
Compartilhar em outros sites

Boa noite Italo.

Estou testando as alterações do CONAM, e ainda tive que fazer alguns ajustes:

 

1) Ao tentar enviar um RPS, ainda ocorre erro 'É necessário um certificado para concluir a autenticação do cliente.'

- Resolvido com a inclusão da função 'IgnoreCerticateErrors' na unit \Fontes\ACBrCapicom\ACBrHTTPReqResp.pas

Eu já tinha reportado/resolvido isto nos posts anteriores, mas acho que há um certo receio de alterações nas units da Capicom. Só pra tranquilizar, estou usando esta unit alterada e não tive nenhum problema com os outros componentes. Até porque a função entendo que só será disparada no caso específico do provedor CONAM, que acessa via https:// (SSL) e não requer certificado.

 

2) procedure TNFSeW_CONAM.GerarIdentificacaoRPS está gerando "AlqIssSN_IP" zerada,

- Corrigido na unit \Fontes\ACBrDFe\ACBrNFSe\PCNNFSe\pnfsNFSeW_CONAM.pas

 

3) Na impressão do DANFESe, as datas estão saindo tipo '2/31/0', porque no XML da NFSe, os campos do tipo 'Data' vem no formato dd/mm/aaaa e a função TLeitor.rCampo da unit \Fontes\PCNComum\pcnLeitor.pas só está tratando no formato aaaa-mm-dd,

Ajustei para converter corretamento nos dois formatos (os campos do tipo tcDat e tcDatHor).

 

[]´s

Edson.

pcnLeitor.pas

ACBrHTTPReqResp.pas

ErroNFSe.png

AliquotaZero.jpg

pnfsNFSeW_CONAM.pas

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Edson,

Tenho respostas positivas de que a versão atual dos fontes no SVN, funciona... Não vejo necessidade de modificação nas Units do DFe ou Capicom

  • Curtir 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

Em 01/04/2016 at 21:45, Edson.pol disse:

Boa noite Italo.

Estou testando as alterações do CONAM, e ainda tive que fazer alguns ajustes:

 

1) Ao tentar enviar um RPS, ainda ocorre erro 'É necessário um certificado para concluir a autenticação do cliente.'

- Resolvido com a inclusão da função 'IgnoreCerticateErrors' na unit \Fontes\ACBrCapicom\ACBrHTTPReqResp.pas

Eu já tinha reportado/resolvido isto nos posts anteriores, mas acho que há um certo receio de alterações nas units da Capicom. Só pra tranquilizar, estou usando esta unit alterada e não tive nenhum problema com os outros componentes. Até porque a função entendo que só será disparada no caso específico do provedor CONAM, que acessa via https:// (SSL) e não requer certificado.

 

2) procedure TNFSeW_CONAM.GerarIdentificacaoRPS está gerando "AlqIssSN_IP" zerada,

- Corrigido na unit \Fontes\ACBrDFe\ACBrNFSe\PCNNFSe\pnfsNFSeW_CONAM.pas

 

3) Na impressão do DANFESe, as datas estão saindo tipo '2/31/0', porque no XML da NFSe, os campos do tipo 'Data' vem no formato dd/mm/aaaa e a função TLeitor.rCampo da unit \Fontes\PCNComum\pcnLeitor.pas só está tratando no formato aaaa-mm-dd,

Ajustei para converter corretamento nos dois formatos (os campos do tipo tcDat e tcDatHor).

 

[]´s

Edson.

pcnLeitor.pas

ACBrHTTPReqResp.pas

ErroNFSe.png

AliquotaZero.jpg

pnfsNFSeW_CONAM.pas

Olá Edson, tudo bem ?

Eu pude perceber que a solicitação do certificado só ocorre se alguns parâmetros  das configurações forem passados, por exemplo. Quando eu uso um provedor que não necessita de certificado deixo o código assim.

ACBrNFSe.Configuracoes.Arquivos.AdicionarLiteral := False;
ACBrNFSe.Configuracoes.Arquivos.EmissaoPathNFSe  := False;
ACBrNFSe.Configuracoes.Arquivos.SepararPorMes    := False;
ACBrNFSe.Configuracoes.Arquivos.SepararPorCNPJ   := False;

Não sei se está é a solução mais inteligente, mas é a que funciona por enquanto. Apesar de eu usar o xmlsec no lugar da Capicom, o efeito é o mesmo se uma destas propriedades forem True, o uso do certificado é solicitado.

Em relação ao ISS do SN diferente do cadastro, ocorre porque o prestador de serviço está classificado como Simples Nacional, e no cadastro dele na prefeitura existe uma alíquota fixa, devemos informar a mesma alíquota que consta no cadastro da prefeitura.

Em relação a data eu estou passando a configuração DefaultFormatSettings.DateSeparator := '/'; na minha aplicação, provavelmente por isso não enfretei o problema que você enfrentou na impressão, mas acho mais elegante usar a sua solução.

Espero ter ajudado

Abraços

Editado por almp1
Corrigindo: somente o parâmetro SeparaPorCNPJ precisa esta false para que o certificado não seja solicitado

André Medeiros

Link para o comentário
Compartilhar em outros sites

Olá Italo,

Tudo bem ?

Estou enviando mais alguns ajustes para melhorar a integração com o provedor CONAM.

No método TNFSeR.LerNFSe_CONAM: Boolean; 

Adicionei as seguintes linhas

      dhRecebimento:=StrToDateTime(Leitor.rCampo(tcStr, 'DtHrGerNf'));
      DataEmissao:=StrToDateTime(Leitor.rCampo(tcStr, 'DtEmiNf'));
      DataEmissaoRps:=StrToDateTime(Leitor.rCampo(tcStr, 'DtEmiRps'));;

No arquivo CONAM.ini fiz uma mudança no link da NFSe, por algum motivo a forma anterior não funciona mais.

[LinkNFSe]
Producao=https://nfe.etransparencia.com.br/%NomeMunicipio%/nfe/stubimprimenfe.aspx?%NumeroNFSe%_%InscMunic%_%CodVerif%
Homologacao=https://nfehomologacao.etransparencia.com.br/%NomeMunicipio%/nfe/stubimprimenfe.aspx?%NumeroNFSe%_%InscMunic%_%CodVerif%

No método TNFSeW_CONAM.GerarListaServicos adicionei um recurso para aceitar mais dois emails previstos pelo provedor CONAM

  for i:=  to NFSe.email.Count - 1 do
    Gerador.wCampoNFSe(tcStr, '', 'Email'+IntToStr(i+2), 01, 120,  1, NFSe.email.Items[i].emailCC, '');

Para usar o recurso com vários emails é só adicionar os endereços de email na Add da NFSe, por exemplo

      with NotasFiscais.Add.NFSe do
        begin
          IdentificacaoRps.Numero:=FormatFloat('#########0', iRPS);
			.
			.
			.
			.
          email.Add.emailCC:='[email protected]';
          email.Add.emailCC:='[email protected]';

        end;

Lembrando que o CONAM faz validação de email, portanto não pode haver emails repetidos.

Fico a disposição se precisar fazer alguma correção.

Abraços, 

pnfsNFSeR.pas

pnfsNFSeW_CONAM.pas

Cidades.ini

CONAM.ini

André Medeiros

Link para o comentário
Compartilhar em outros sites

  • Consultores

Boa tarde André,

Muito obrigado pela colaboração, já enviei para o repositório, favor atualizar todos os fontes de todas as pastas e realizar novos testes.

  • 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

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Italo Jurisato Junior disse:

Boa tarde André,

Muito obrigado pela colaboração, já enviei para o repositório, favor atualizar todos os fontes de todas as pastas e realizar novos testes.

Olá Italo

Obrigado mais uma vez, vou fazer atualização de tudo e realizo os testes sim. Reporto aqui o resultado.

Abraços,

André Medeiros

Link para o comentário
Compartilhar em outros sites

Olá Italo, tudo bem ?

Acredito que estamos finalizando o provedor CONAM. Depois da ultima atualização, fiz vários testes e a comunicação com o serviço deles a princípio esta correta.

Porém efetuei mais alguns ajustes que na maioria deles foram apenas para tratamento das respostas. Percebi que independente do processamento ter sido efetuado com sucesso, o ACBr sempre gerava uma exceção, impedindo o tratamento final da resposta por parte do programador.

Fiz o possível para não mexer muito nos métodos que são utilizados por outros provedores afim de não causar muito impacto no pacote. Estou listando abaixo as alterações que efetuei e o motivo. Caso algo não esteja no padrão correto, me informe para eu poder adequar da melhor maneira.

pnfsLerListaNFSe linha 436
FNFSe.DataEmissaoRps := NFSeLida.NFSe.DataEmissaoRps; //Caso o programador queira resgatar a data da emissão do rps vindo do provedor

pnfsNFSeG linha 1099
Gerador.wGrupoNFSe('SerieRPS>' + SerieRps + '</SerieRPS'); //Na ultima versão estavamos passando de forma fixa 'UNICA', mas este valor deve ser passado pelo usuário

ACBrNFSeWebServices linha 48, 3067, 3684
pnfsCancNfseResposta, pnfsSubsNfseResposta //apenas "case sensitive" para usuários Linux
SerieRps := FNotasFiscais.Items[0].NFSe.IdentificacaoRps.Serie; //Na ultima versão estavamos passando de forma fixa 'UNICA', mas este valor deve ser passado pelo usuário
if not (TACBrNFSe(FACBrNFSe).Configuracoes.Geral.Provedor in [proISSNet, proEL, proCONAM]) then //Adicionado o proCONAM pois sempre gerava exceção ao entrar nesta condição.

pnfsCancNfseResposta linha 734
FInfCanc.FSucesso := Leitor.rCampo(tcStr, 'Retorno'); //Preenche a propriedade FSucesso com true ou false, só não sei se este é o padrão para todos os provedores, se não for, devemos mudar para o padrão. 

pnfsConsSitLoteRpsResposta linha 301
if FInfSit.FSituacao <> '5' then begin //Caso a situação seja 5 é porque o lote foi processado com sucesso, neste caso não pode haver mensagens, pois as mensagens geram exceção.  

Desculpe enviar as alterações aos poucos, mas acho que fica mais fácil controlar :) 

Segue abaixo os arquivos alterados. 

Grande abraço,

 

 

ACBrNFSeWebServices.pas

pnfsConsSitLoteRpsResposta.pas

pnfsCancNfseResposta.pas

pnfsLerListaNFSe.pas

pnfsNFSeG.pas

André Medeiros

Link para o comentário
Compartilhar em outros sites

  • Consultores

Bom dia André,

Muito obrigado pela colaboração, já enviei para o repositório exceto o ACBrNFSeWebServices.pas pois este contem algumas alterações que fiz e estou esperando um aval do resto da equipe.

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

Link para o comentário
Compartilhar em outros sites

Bom dia André / Italo.

Atualizei os fontes, testei em homologação, e deu tudo certinho, da geração do RPS até a impressão.

Só um 'incoveniente': Eu fiz uns ajustes para a impressão dos serviços sair "colunada", em fonte fixa (Courier new).

Mas toda vez que atualizo, tenho que refazer alguns passos.

 

procedure TNFSeW_CONAM.GerarXML_CONAM;
begin
  Gerador.Opcoes.RetirarEspacos := False;  // para permitir que a impressão saia "colunada"

 

E na unit ACBrNFSeDANFSeRLClass.pas, altero a fonte:

procedure TACBrNFSeDANFSeRL.ImprimirDANFSe(NFSe: TNFSe = nil);
var
  i: integer;
  frlDANFSeRLRetrato: TfrlDANFSeRLRetrato;
begin
  frlDANFSeRLRetrato := TfrlDANFSeRLRetrato.Create(Self);
  try
    frlDANFSeRLRetrato.rlmDescricao.Font.Name:='Courier New';

// a impressão do Código de verificação está estourando, portando diminui a fonte
    frlDANFSeRLRetrato.rllCodVerificacao.Font.Size:=9;

// para a quebra de linha funcionar, o correto é pegar Configuracoes.Geral.ConfigGeral, não de Configuracoes.WebServices                //frlDANFSeRLRetrato.QuebradeLinha(TACBrNFSe(ACBrNFSe).Configuracoes.WebServices.QuebradeLinha);     frlDANFSeRLRetrato.QuebradeLinha(TACBrNFSe(ACBrNFSe).Configuracoes.Geral.ConfigGeral.QuebradeLinha);
        if NFSe = nil then

Talvez o mais 'elegante' seria criar mais um parâmetro no arquivo INI, tipo "ImpressaoEmColunas", que setaria o "RetirarEspacos" para False, e usaria uma fonte de pontos fixos, como a Courier New.

O que vocês acham ?

[]´s

Edson.

CodVerificacao.png

DiscriminacaoServicos.png

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Olá Edson !

Tudo bem ?

Devido aos requisitos do projeto em que eu estou participando e usando o ACBr não prever a impressão da NFSe, eu acabei não me estendendo em detalhes até os métodos de impressão. 

Porém, como colaborador, acho válida a sua sugestão de usar o arquivo .ini para determinadas configurações independentes para cada provedor. Vamos aguardar um posicionamento dos administradores para a possibilidade de implementar desta forma.

Abraços,

André Medeiros

Link para o comentário
Compartilhar em outros sites

Bom dia André.

Um cliente me alertou sobre um problema: Gerou a NFSe pelo sistema, mas foi imprimir em outro local, pelo site.

Imprimindo pelo site, a descrição do serviço está saindo duas vezes.

Isto porque na procedure TNFSeW_CONAM.GerarListaServicos está assim:

  Gerador.wCampoNFSe(tcStr, '', 'DiscrSrv', 01, 4000, 1, StringReplace( NFSe.Servico.Discriminacao, ';', FQuebradeLinha, [rfReplaceAll, rfIgnoreCase] ), '');
  Gerador.wCampoNFSe(tcStr, '', 'VlNFS', 01, 16, 2, FormatFloat('############0.00', NFSe.Servico.Valores.ValorServicos), '');
  Gerador.wCampoNFSe(tcStr, '', 'VlDed', 01, 16, 2, FormatFloat('############0.00', NFSe.Servico.Valores.ValorDeducoes), '');
  Gerador.wCampoNFSe(tcStr, '', 'DiscrDed', 01, 4000, 1, StringReplace( NFSe.Servico.Discriminacao, ';', FQuebradeLinha, [rfReplaceAll, rfIgnoreCase] ), '');
  
  Uma solução seria alimentar o componente usando a propriedade "JustificativaDeducao"
  Gerador.wCampoNFSe(tcStr, '', 'DiscrDed', 01, 4000, 1,StringReplace( NFSe.Servico.Valores.JustificativaDeducao, ';', FQuebradeLinha, [rfReplaceAll, rfIgnoreCase] ), '');

 

  []´s

Edson.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...

 

Em 28/04/2016 at 16:18, rafiwks disse:

Melhor aguardar um OK dos amigos que estão mais envolvidos, pois estou implementando agora e ainda não posso afirmar 100%.

Imaginei que estivesse por já terem colocado no repositório, e por isto comentei.

Obrigado,

Rafael

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

André Medeiros

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 3035 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.

The popup will be closed in 10 segundos...