Ir para conteúdo
  • Cadastre-se

mlgoncalves

Membros
  • Total de ítens

    66
  • Registro em

  • Última visita

Tudo que mlgoncalves postou

  1. Pessoal bom dia! Muito obrigado, Ítalo! Conferi as alterações e está tudo certo. Parabéns mais uma vez pelo excelente trabalho de vocês. Podem encerrar o tópico. Marcelo.
  2. Olá pessoal, Estamos implantando a emissão da NFS-e para a prefeitura de Três Rios/RJ e durante o desenvolvimento tivemos de fazer uns ajustes no ACBrNFSeX para o perfeito funcionamento da integração, e solicitamos que esses ajustes sejam revisados e incorporados no componente. Provedor: WEBFISCO / FGMAISS Units: 1) WebFisco.GravarXml.pas Completar preenchimento do XML com IR e CSLL NFSeNode.AppendChild(AddNode(tcDe2, '#', 'irrf', 1, 12, 1, NFSe.Servico.Valores.ValorIr, '', True, xAtrib)); NFSeNode.AppendChild(AddNode(tcDe2, '#', 'csll', 1, 12, 1, NFSe.Servico.Valores.ValorCsll, '', True, xAtrib)); 2) WebFisco.LerXml.pas Atribuir o ID da NFS-e retornada, que é chave utilizada para consultas no provedor InfID.ID := ObterConteudo(ANode.Childrens.FindAnyNs('nfecontrole'), tcStr); 3) FGMaiss.Provider.pas Corrigir a URL informando a porta 443 de acesso Result := 'https://www1.fgmaiss.com.br:443/issqn/wservice/'; Segue em anexo as units modificadas Atenciosamente, Marcelo Gonçalves FGMaiss.Provider.pas WebFisco.GravarXml.pas WebFisco.LerXml.pas
  3. Pessoal, obrigado pelo retorno. Segui a orieBoletos IMPRESSOS FastReports teste código de barras.rarntação do Alexandre de Paula e consegui ler no APP SICOOB a maioria dos códigos de barras impresso dos diversos layouts FastReports e FortsReports. Usando um leitor NoNus a experiência foi péssima onde não foram lidos a maioria dos códigos de barras e os que foram lidos foi com muita paciência. Ainda, seguindo a dica do Renato Rubinho, fiz experiências com resolução em 100%, 120% e 150% para os boletos do FastReports usando FoxIt e não consegui ler nenhum boleto, exceto o boleto carnê em resolução mais alta, sendo que em 100% não foi possível fazer a leitura. Finalmente a conclusão que consegui chegar foi de que se depender da leitura do código de barras para efetuar o pagamento, o usuário vai ficar estressado. Outro ponto que está fora de prática é imprimir boleto para pagar. Muitos usuários estão lendo o código de barras (ou pelo menos tentando ler) diretamente do monitor. É isso aí. Estou anexando os testes com os boletos impressos somente do FastReports. Do FortsReports o APP do Sicoob leu quase todos e o leitor Nonu não leu quase nenhum. Por mim podem fechar o tópico.
  4. Pessoal, boa tarde! Um cliente entrou em contato reclamando que não conseguia ler o código de barras do boleto. Fizemos testes aqui no escritório e também não conseguimos ler a maioria dos códigos de barras dos diversos layouts de boletos existentes. Investimos um tempinho para fazer testes e abaixo segue o resultado. Definições: 1) Utilizamos o programa de exemplo do acbr para gerar os boletos e fazer os testes 2) Não imprimimos os boletos. Os códigos de barras foram lidos diretamente na tela do preview do programa de exemplo e também do leitor de pdfs FoxIt 3) Utilizamos o APP do SICOOB para fazer as leituras. Conclusões dos testes 4) Testamos todos os layouts do FastReports e somente no BoletoCarne foi que conseguimos ler o código de barras 5) Testamos todos os layouts do FortesReports e conseguimos ler o código de barras em quase todos os layouts, exceto no layout BoletoA5 que não conseguimos ler. Estamos anexando todos os boletos dos testes gerados no FastReposts e apenas o boleto do FortsReports que deu problema. Pergunta: O que pode estar ocorrendo e como resolver isso? Ficamos no aguardo. Atenciosamente, Marcelo Gonçalves Boletos FortsReports teste código de barras.rar Boletos FastReports teste código de barras.rar
  5. Obrigado, senhores! Conseguimos implementar a codificação. Marcelo
  6. Boa tarde, Renato! Depuramos a rotina e descobrimos que o problema está na falta da URL do serviço de ConsultarNFSeRps no arquivo ACBrNFSeXServicos.ini conforme abaixo: ProConsultarNFSeRps=https://www1.fgmaiss.com.br:443/issqn/wservice/wsnfeconsultaxml.php Segue em anexo o arquivo corrigido. Obrigado pelo retorno. Marcelo.ACBrNFSeXServicos.ini
  7. Olá pessoal, Ao clicar no botão de Consultar NFS-e por RPS do programa de exemplo, está dando o erro abaixo. Já o botão Consultar NFS-e por Número está funcionando corretamente. O que pode estar ocorrendo? OpenSSL 1.1.1j 16 Feb 2021 01.01.01.0AF C:\WINDOWS\SYSTEM32\libcrypto-1_1.dll C:\WINDOWS\SYSTEM32\libssl-1_1.dll ------------------------------ Requisição Ambiente : 1 Cidade : Tres Rios/RJ Provedor : FGMaiss Versão: 1.00 Data/Hora: 11/12/2023 21:32:38 Método Executado: Consultar NFSe Por Rps Parâmetros de Envio Numero do Rps : 1 Série do Rps : 1 Parâmetros de Retorno Numero do Lote: Numero do Prot: Situação : Data : 30/12/1899 Desc. Situação: ID Nota : Link : Sucesso : False Erro(s): Código : X999 Mensagem: Erro de Conexão: Erro Interno: 12005 Erro HTTP: 0 URL: * Erro: 12005 - Falha abrindo Conexão HTTP. Erro: 12005 - Correção: ---------
  8. Prezados, boa noite! Precisamos de consultoria para implementar em Delphi o consumo de API do Banco Itaú que está funcionando no PostMan, e ainda algumas dicas sobre API. Fico no aguardo. Marcelo
  9. Prezados, bom dia! Quando enviamos um boleto já registrado anteriormente é retornado um JSON com a mensagem de erro que não está sendo devidamente tratado no componente. Fizemos o ajuste e anexamos aqui a unit para validação. Exemplo de JSON retornado: { "codigo": "", "mensagem": "Erro na validação de Campos", "detalhes": [{ "codigo": "", "mensagem": { "campo": "COD-RET", "mensagem": "Título já cadastrado na cobrança", "valor": "" } } ] } Atenciosamente, Marcelo Gonçalves ACBrBoletoRet_Itau.rar
  10. Boa noite! Resolvido. O problema estava na conversão da string acentuada para UTF8. Obrigado. Solução: Removido os acentos da string "reason" {"reason":"Texto livre indicando motivo da operacao","code":"UNAVAILABLE_ITEM","mode":"AUTO","outOfStockItems":[],"invalidItems":[]}
  11. Pessoal, bom dia! Não estou conseguindo utilizar o evento de cancelamento de pedido do OpenDelivery. Está dando erro no retorno e eu não consegui entender e resolver o problema. Vocês poderiam me ajudar? No postman está funcionando corretamente. ENDPOINT conferido: https://api.deliveryvip.com.br/merchant/v3/orders/0580de97-27fc-4388-b7e1-3339a5279c16/requestCancellation JSON gerado pelo ACBROpenDelivery que funciona corretamente no postman: {"reason":"Texto livre indicando motivo da operação","code":"UNAVAILABLE_ITEM","mode":"AUTO","outOfStockItems":[],"invalidItems":[]} RETORNADO: {"status":400,"error":"Bad Request"} No aguardo. Atc, Marcelo Gonçalves
  12. Olá pessoal, O código do juros continua errado. Segue a unit corrigida. Atenciosamente, ACBrBoletoW_Bancoob.pas
  13. Conferido e ok. Utilizar a mesma lógica no preenchimento de SeuNumero em outras partes da Unit. Segue em anexo unit corrigida. Atenciosamente, ACBrBoletoW_Bancoob.pas
  14. Olá Victor, na alteração ficou faltando uma correção. Segue a UNIT corrigida Marcelo ACBrBoletoRet_Bancoob.pas
  15. Olá Victor, Como saber se um boleto foi ou não registrado no banco Sicoob? Resposta: quando o codigo do objeto status estiver preenchido com 200; ou ACBrBoleto.Enviar retornar false. Como disse no post de abertura desse tópico, o Sicoob retorna sempre o código 207 (quando a comunicação é feita com sucesso) para boleto registrado ou não registrado, que retorna TRUE na função ACBrBoleto.Enviar Então não pode consultar esse valor retornado como indicador de registro de boleto. Entendo que a outra forma seria consultar a lista ListaRejeicao que, se contiver linha preenchida indicará o motivo da rejeição. Se não tiver linha preenchida indicará que o boleto foi registrado com sucesso. Nesse sentido estou anexando a Unit com a proposta de modificação. Agora, caso vocês interpretem uma lógica diferente, onde o programador deverá consultar obrigatoriamente a ListaRejeicao para saber se o boleto foi ou não registrado no banco, mesmo assim será necessário corrigir a programação que alimenta a lista pois não está funcionando corretamente. Estou anexando também um exemplo de retorno. No aguardo. retorno_boleto_registrado.json ACBrBoletoRet_Bancoob.pas
  16. Olá pessoal, Segue a Unit modificada. Atenciosamente, ACBrBoletoW_Bancoob.pas
  17. Olá Pessoal, Desculpe mas passei informação errada sobre o campo SeuNumero no banco Sicoob. Somente descobri quando peguei hoje o arquivo Retorno. O campo SeuNumero no Sicoob contém o número do documento a que o boleto se refere (ex. NF.393939, etc) que também é impresso no boleto. É um campo alfanumérico e é retornado nas posições 59 a 73 do segmento T do CNAB240. >> Entendo que o campo SeuNumero do Sicoob corresponde ao campo NumeroDocumento do ACBrBoleto. O campo identificacaoBoletoEmpresa no Sicoob é para ser utilizado pelo ERP anotando o ID do boleto, por exemplo e não é impresso no boleto. Também é um campo alfanumérico e é retornado nas posições 106 a 130 do segmento T do CNAB240. >> Entendo que o campo identificacaoBoletoEmpresa do Sicoob corresponde ao campo SeuNumero do ACBrBoleto. Segue abaixo a Unit modificada. Atenciosamente, ACBrBoletoW_Bancoob.pas
  18. Olá pessoal, O grupo GerarJuros do JSON está com erro no preenchimento do campo 'tipoJurosMora'. TACBrCodigoJuros = (cjValorDia, cjTaxaMensal, cjIsento, cjValorMensal, cjTaxaDiaria); Integer(aTitulo.CodigoMoraJuros) retorna cjValorDia = 0 -------->>>>> no JSON deve ser informado 1 vjTaxaMensal = 1 --------->>>>>>> no JSON deve ser informado 2 Transcrição do código que está no SVN com erro e a proposta de correção: case (StrToIntDef(aTitulo.CodigoMora, 0)) of 0: // Isento begin AJson.Add('tipoJurosMora').Value.AsInteger := 0; AJson.Add('valorJurosMora').Value.asNumber := 0; end; 1: // Dia begin // AJson.Add('taxa').Value.asNumber := aTitulo.ValorMoraJuros; AJson.Add('tipoJurosMora').Value.AsInteger := Integer(aTitulo.CodigoMoraJuros); <<<<<<----- Corrigir esta linha anotando o número 1 (um). A função retorna 0 (zero); AJson.Add('dataJurosMora').Value.asString := DateTimeToDateBancoob(aTitulo.DataMulta); AJson.Add('valorJurosMora').Value.asNumber := aTitulo.ValorMoraJuros; end; 2: // Mês begin AJson.Add('tipoJurosMora').Value.AsInteger := Integer(aTitulo.CodigoMoraJuros); <<<<<<<<------- Corrigir esta linha anotando o número 2 (dois). A função retorna 1 (um); AJson.Add('dataJurosMora').Value.asString := DateTimeToDateBancoob(aTitulo.DataMulta); AJson.Add('valorJurosMora').Value.asNumber := aTitulo.ValorMoraJuros; end; end; Atenciosamente, Marcelo Gonçalves
  19. Olá Victor, acabei de atualizar os fontes pelo SVN e entendo que a modificação feita não atende o requisito. Modificação feita: case HttpResultCode of 207: begin aJsonViolacoes := aJson.Values['resultado'].AsArray; for x := 0 to aJsonViolacoes.Count -1 do begin aJsonViolacao := aJsonViolacoes[x].AsObject; aJsonViolacoes := aJsonViolacao['status'].AsArray; ARejeicao := ARetornoWS.CriarRejeicaoLista; ARejeicao.Codigo := aJsonViolacao.Values['codigo'].AsString; ARejeicao.mensagem := aJsonViolacao.Values['mensagem'].AsString; end; end; 400,406,500 : begin aJsonViolacoes := aJson.Values['mensagens'].AsArray; for x := 0 to aJsonViolacoes.Count -1 do begin aJsonViolacao := aJsonViolacoes[x].AsObject; ARejeicao := ARetornoWS.CriarRejeicaoLista; ARejeicao.Codigo := AJsonViolacao.Values['codigo'].AsString; ARejeicao.mensagem := AJsonViolacao.Values['mensagem'].AsString; end; end; end; Onde está o problema no meu ponto de vista: HTTPResultCode=207 indica tanto sucesso de registro de boleto quanto erro. Não acho correto preencher a lista de violações de regras sendo que quando o boleto é registrado não houve violação de nenhuma regra. Insisto que quando aJsonViolacao.Values['codigo'].AsString estiver retormadp com 200, nada a fazer, boleto registrado com sucesso. Quando retornado com 400 aí sim tem problema a ser corrigido.
  20. Olá pessoal, Entendo que existe erro no preenchimento o campo SEUNUMERO no JSON gerado pela unid ACBrBoletoW_Bancoob.pas. Está preenchendo neste campo o valor de NossoNumero e entendo que deveria ser SeuNumero. Cópia das linhas o arquivo original: Json.Add('nossoNumero').Value.AsString := OnlyNumber(aTitulo.ACBrBoleto.Banco.MontarCampoNossoNumero(aTitulo)); Json.Add('seuNumero').Value.asString := OnlyNumber(aTitulo.ACBrBoleto.Banco.MontarCampoNossoNumero(aTitulo)); //ATitulo.SeuNumero; Json.Add('identificacaoBoletoEmpresa').Value.AsString := OnlyNumber(aTitulo.ACBrBoleto.Banco.MontarCampoNossoNumero(aTitulo)); Copia das linhas propostas para correção: Json.Add('nossoNumero').Value.AsString := OnlyNumber(aTitulo.ACBrBoleto.Banco.MontarCampoNossoNumero(aTitulo)); Json.Add('seuNumero').Value.asString := ATitulo.SeuNumero; Json.Add('identificacaoBoletoEmpresa').Value.AsString := ATitulo.SeuNumero; Entendo que o componente deva ser coerente no preenchimento dos campos. Se houver alguma necessidade de particularizar o conteúdo dos campos isso deve ser tratado na aplicação. ACBrTituloNaAplicacao.SeuNumero := 'ID DO BOLETO NO BANCO DE DADOS DA APLICACAO'; ou se preferir 'NOSSO NÚMERO DO BOLETO' ACBrTituloNaAplicacao.NossoNumero := 'NOSSO NÚMERO DO BOLETO'; IdentificacaoBoletoEmpresa Não existe na classe TACBrTitulo, então o componente pode arbitrar o que deve ser preenchido: ou o nosso número (acho isso menos lógico) ou o seu número (acho essa escolha a mais lógica) Atenciosamente, Marcelo Gonçalves
  21. Olá pessoal, O HttpResultCode=207 é código retornado com sucesso do banco Sicoob tanto para indicar registro de boleto quando para indicar erros de preenchimento. Então é necessário tratar corretamente o JSON retornado para o preenchimento da lista dos erros retornados, se houver. Arquivos anexados: ACBrBoletoRet_Bancoob.pas -> alterado com o ajuste JSON com erro de retorno.json -> arquivo original retornado pelo Sicoob no código HttpResultCode=207 porém informando rejeição por erro de preenchimento do boleto JSON de boleto registrado.json -> arquivo original retornado pelo Sicoob no código HttpResultCode=207 de boleto registrado Atenciosamente, Marcelo Gonçalves ACBrBoletoRet_Bancoob.pas JSON com erro de retorno.json JSON de boleto registrado.json
  22. Sergio_api, a unit que postei acima está redondinha. É pegar e usar. Vamos aguardar a revisão para disponibilizarem no repositório. Marcelo.
  23. Olá pessoal! Estou dedicado em tentar finalizar a cobrança Sicoob através de API e me deparei com as seguintes situações que entendo devam ser atualizadas no repositório (segue em anexo unit devidamente modificada): Arquivo: ACBrBoletoW_Bancoob.pas 1) Formato da data, linhas 269/270 SVN: result := FormatDateBr( aValue, 'YYYY-MM-DD') + 'T' + FormatDateTime('hh:nn:ss', AValue) + PegaTimeZone; //'2023-05-26T03:00:00.000Z' - versão acbr - fora do formato esperado SOLUÇÃO PROPOSTA (não é desenvolvimento meu, mas de versões anteriores que está funcionando corretamente): result := FormatDateBr( aValue, 'YYYY-MM-DD') + 'T' + FormatDateTime('hh:nn:ss', AValue) + PegaTimeZone; //'2023-05-26T00:00:00-03:00' - correto, dentro do padrão definido pelo SICOOB function TBoletoW_Bancoob.PegaTimeZone: string; var TimeZone: TTimeZoneInformation; begin GetTimeZoneInformation(TimeZone); Result := FormatFloat('00', TimeZone.Bias div -60) + ':00'; end; 2) Rotina de geração do juros de mora procedure TBoletoW_Bancoob.GerarJuros(AJson: TJsonObject); begin if Assigned(aTitulo) then begin if Assigned(AJson) then begin if (aTitulo.ValorMoraJuros > 0) then begin if ATitulo.CodigoMora = '' then begin case aTitulo.CodigoMoraJuros of cjValorDia : aTitulo.CodigoMora := '1'; cjTaxaMensal : aTitulo.CodigoMora := '2'; cjIsento : aTitulo.CodigoMora := '0'; end; end; case (StrToIntDef(aTitulo.CodigoMora, 0)) of 0: // Isento begin AJson.Add('tipoJurosMora').Value.AsInteger := 0; AJson.Add('valorJurosMora').Value.asNumber := 0; end; 1: // Dia begin // AJson.Add('taxa').Value.asNumber := aTitulo.ValorMoraJuros; AJson.Add('tipoJurosMora').Value.AsInteger := 1; <<<<<<------ Isso está correto. A função do repositório Integer(aTitulo.CodigoMoraJuros) retorna o valor 0 (zero) AJson.Add('dataJurosMora').Value.asString := DateTimeToDateBancoob(aTitulo.DataMulta); AJson.Add('valorJurosMora').Value.asNumber := aTitulo.ValorMoraJuros; end; 2: // Mês begin AJson.Add('tipoJurosMora').Value.AsInteger := 2; <<<<<<------ Isso está correto. A função do repositório Integer(aTitulo.CodigoMoraJuros) retorna o valor 1 (um) AJson.Add('dataJurosMora').Value.asString := DateTimeToDateBancoob(aTitulo.DataMulta); AJson.Add('valorJurosMora').Value.asNumber := aTitulo.ValorMoraJuros; end; end; end; end; end; end; Atenciosamente, ACBrBoletoW_Bancoob.pas
  24. Olá Pedro, Utilizei os fontes que você disponibilizou e ainda não consegui gerar o token de autorização, necessário para utilização da API. No Postman eu consigo gerar o token, mas para isso tive de configurar o certificado digital informando os arquivos .CRT e .KEY. Tentei fazer exatamente o mesmo nos exemplos do ACBR, mas parece que está faltando alguma coisa pois não gera o token de jeito nenhum. Você tem alguma dica pra passar? Desde já agradeço. Marcelo Gonçalves
×
×
  • 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.