Ir para conteúdo
  • Cadastre-se

Maiquel

Membros
  • Total de ítens

    459
  • Registro em

  • Última visita

  • Days Won

    2

Tudo que Maiquel postou

  1. @Juliomar Marchetti Precisamos da alteração, sabe se vai ser disponibilizada?
  2. Olá. Alguma novidade @Juliomar Marchetti Precisamos dessa alteração.
  3. No arquivo de configuração, esta configurado para uso do provedor Nacional, porém esta cidade utilizada o provedor Abase. Implementado e testado; [4302907] Nome=Cacequi UF=RS Provedor=ABase
  4. Olá @Juliomar Marchetti Segue unit: ACBrBoletoRet_Sicredi_APIECOMM.pas
  5. @Juliomar Marchetti Segue função alterada e validada em versões inferiores: function TRetornoEnvio_Sicredi_APIECOMM.LerRetorno( const ARetornoWS: TACBrBoletoRetornoWS): Boolean; var LJsonObject: TACBrJsonObject; LJsonItem: TACBrJsonObject; LRejeicao: TACBrBoletoRejeicao; LJsonBoletos: TACBrJsonArray; LTipoOperacao: TOperacao; JsonStr: string; Ini, Fim: Integer; begin Result := True; LJsonObject := nil; LJsonBoletos := nil; LJsonItem := nil; LTipoOperacao := ACBrBoleto.Configuracoes.WebService.Operacao; ARetornoWS.HTTPResultCode := HTTPResultCode; ARetornoWS.JSONEnvio := EnvWs; ARetornoWS.Header.Operacao := LTipoOperacao; if RetWS <> '' then begin JsonStr := RetWS; if Pos('[', JsonStr) > 0 then JsonStr := Copy(JsonStr, Pos('[', JsonStr), MaxInt); if (Length(JsonStr) > 0) and (JsonStr[1] = '[') then begin Ini := Pos('{', JsonStr); Fim := LastDelimiter('}', JsonStr); if (Ini > 0) and (Fim > Ini) then JsonStr := Copy(JsonStr, Ini, Fim - Ini + 1); end; LJsonObject := TACBrJSONObject.Parse(JsonStr); try try ARetornoWS.JSON := LJsonObject.ToJSON; case HttpResultCode of 400, 404: begin if LJsonObject.ValueExists('codigo') then begin LRejeicao := ARetornoWS.CriarRejeicaoLista; LRejeicao.Codigo := LJsonObject.AsString['codigo']; LRejeicao.Versao := LJsonObject.AsString['parametro']; LRejeicao.Mensagem := LJsonObject.AsString['mensagem']; end; end; end; if (ARetornoWS.ListaRejeicao.Count = 0) then begin if (LTipoOperacao = tpInclui) then begin ARetornoWS.DadosRet.IDBoleto.CodBarras := LJsonObject.AsString['codigoBarra']; ARetornoWS.DadosRet.IDBoleto.LinhaDig := LJsonObject.AsString['linhaDigitavel']; ARetornoWS.DadosRet.IDBoleto.NossoNum := LJsonObject.AsString['nossoNumero']; ARetornoWS.DadosRet.TituloRet.CodBarras := ARetornoWS.DadosRet.IDBoleto.CodBarras; ARetornoWS.DadosRet.TituloRet.LinhaDig := ARetornoWS.DadosRet.IDBoleto.LinhaDig; ARetornoWS.DadosRet.TituloRet.NossoNumero := ARetornoWS.DadosRet.IDBoleto.NossoNum; end else if (LTipoOperacao in [tpConsultaDetalhe, tpConsulta]) then begin JsonStr := LJsonObject.ToJSON; if (Length(JsonStr) > 0) and (JsonStr[1] <> '[') then JsonStr := '[' + JsonStr + ']'; LJsonBoletos := TACBrJSONArray.Parse(JsonStr); try if (Assigned(LJsonBoletos)) and (LJsonBoletos.Count > 0) then begin LJsonItem := LJsonBoletos.ItemAsJSONObject[0]; ARetornoWS.DadosRet.IDBoleto.CodBarras := ''; ARetornoWS.DadosRet.IDBoleto.LinhaDig := ''; ARetornoWS.DadosRet.IDBoleto.NossoNum := LJsonItem.AsString['nossoNumero']; ARetornoWS.indicadorContinuidade := False; ARetornoWS.DadosRet.TituloRet.CodBarras := ARetornoWS.DadosRet.IDBoleto.CodBarras; ARetornoWS.DadosRet.TituloRet.LinhaDig := ARetornoWS.DadosRet.IDBoleto.LinhaDig; ARetornoWS.DadosRet.TituloRet.NossoNumero := ARetornoWS.DadosRet.IDBoleto.NossoNum; ARetornoWS.DadosRet.TituloRet.Vencimento := DateSicrediToDateTime(LJsonItem.AsString['dataVencimento']); ARetornoWS.DadosRet.TituloRet.ValorDocumento := LJsonItem.AsFloat['valor']; ARetornoWS.DadosRet.TituloRet.ValorAtual := LJsonItem.AsFloat['valor']; ARetornoWS.DadosRet.TituloRet.EstadoTituloCobranca := LJsonItem.AsString['situacao']; ARetornoWS.DadosRet.TituloRet.SeuNumero := LJsonItem.AsString['seuNumero']; if (LJsonItem.AsString['situacao'] = C_LIQUIDADO) or (LJsonItem.AsString['situacao'] = C_BAIXADO_POS_SOLICITACAO) then begin ARetornoWS.DadosRet.TituloRet.ValorPago := LJsonItem.AsFloat['valorLiquidado']; ARetornoWS.DadosRet.TituloRet.DataCredito := DateSicrediToDateTime( LJsonItem.AsString['dataliquidacao']); end; end; finally if Assigned(LJsonBoletos) then FreeAndNil(LJsonBoletos); end; end; end; except Result := False; end; finally if Assigned(LJsonObject) then FreeAndNil(LJsonObject); end; end; end;
  6. Não consigo testar aqui, mas não implementei nada de diferente que não tenha nas versões inferiores, é bem exclusivo nesta função, onde hoje pessoal que usa esta com problema. Precisaria de alguém que tenha versões anteriores para testar, mas não vejo necessidade, nesta alteração. Somente para versãos anteriores Delphi XE7, que não poderia criar a variável em tempo de execução: var JsonStr: string;
  7. Olá @Juliomar Marchetti Validei o código no Delphi 10.4. Aqui tudo funcionando perfeitamente. Acredito não ter problema em outras versões!
  8. Foi identificado um problema no método de leitura de retorno (LerRetorno) ao consumir a API do Sicredi (E-Comm), onde o conteúdo retornado pelo WebService nem sempre segue um padrão único de estrutura JSON. Erro: Invalid class typecast Problema encontrado O método original utiliza: TACBrJSONObject.Parse(RetWS) Entretanto, o retorno da API pode variar entre: Objeto JSON: { ... } Array JSON: [ { ... } ] Quando o retorno ocorre no formato de array, o método Parse gera exceção (Invalid class typecast), pois espera um objeto JSON. Além disso, em alguns cenários o retorno pode conter informações adicionais antes do JSON (ex: HTTP_Code=200 OK), o que também invalida o parse direto. Solução aplicada Foi implementado um tratamento prévio da string de retorno (RetWS) antes do parse, com os seguintes ajustes: Remoção de conteúdo não JSON Eliminação de prefixos como HTTP_Code=200 OK, mantendo apenas o conteúdo JSON válido. Normalização de estrutura Quando o retorno é um array ([]), é extraído o primeiro objeto ({}), mantendo compatibilidade com a lógica já existente. Quando necessário trabalhar com array posteriormente, o objeto é novamente encapsulado em []. Correção de gerenciamento de memória Evitada a sobrescrita da variável LJsonObject com itens provenientes de TACBrJSONArray. Criada variável auxiliar (LJsonItem) para manipulação dos dados do array, evitando Access Violation ao liberar memória. Considerações A alteração não impacta comportamentos anteriores, pois: Mantém o fluxo original quando o retorno já está no formato esperado ({}). Apenas adiciona robustez para cenários onde a API retorna []. O ajuste foi realizado localmente na rotina de leitura, sem alterar a estrutura interna das classes do ACBr, preservando compatibilidade com futuras atualizações. Resultado Eliminação de erros de parse (Invalid class typecast) Tratamento consistente para diferentes formatos de retorno da API Correção de possíveis falhas de memória (uso indevido de Free) Função alterada: function TRetornoEnvio_Sicredi_APIECOMM.LerRetorno(const ARetornoWS: TACBrBoletoRetornoWS): Boolean; var LJsonObject: TACBrJsonObject; LJsonItem: TACBrJsonObject; LRejeicao: TACBrBoletoRejeicao; LJsonBoletos: TACBrJsonArray; LTipoOperacao : TOperacao; begin Result := True; LTipoOperacao := ACBrBoleto.Configuracoes.WebService.Operacao; ARetornoWS.HTTPResultCode := HTTPResultCode; ARetornoWS.JSONEnvio := EnvWs; ARetornoWS.Header.Operacao := LTipoOperacao; if RetWS <> '' then begin var JsonStr: string; var Ini, Fim: Integer; JsonStr := RetWS; if Pos('[', JsonStr) > 0 then JsonStr := Copy(JsonStr, Pos('[', JsonStr), MaxInt); if (JsonStr <> '') and (JsonStr[1] = '[') then begin Ini := Pos('{', JsonStr); Fim := LastDelimiter('}', JsonStr); if (Ini > 0) and (Fim > Ini) then JsonStr := Copy(JsonStr, Ini, Fim - Ini + 1); end; //Retorno := ACBrBoleto.CriarRetornoWebNaLista; LJsonObject := TACBrJSONObject.Parse(JsonStr); try try ARetornoWS.JSON := LJsonObject.ToJSON; case HttpResultCode of 400, 404 : begin if( LJsonObject.ValueExists('codigo') ) then begin LRejeicao := ARetornoWS.CriarRejeicaoLista; LRejeicao.Codigo := LJsonObject.AsString['codigo']; LRejeicao.Versao := LJsonObject.AsString['parametro']; LRejeicao.Mensagem := LJsonObject.AsString['mensagem']; end; end; end; //retorna quando tiver sucesso if (ARetornoWS.ListaRejeicao.Count = 0) then begin if (LTipoOperacao = tpInclui) then begin ARetornoWS.DadosRet.IDBoleto.CodBarras := LJsonObject.AsString['codigoBarra']; ARetornoWS.DadosRet.IDBoleto.LinhaDig := LJsonObject.AsString['linhaDigitavel']; ARetornoWS.DadosRet.IDBoleto.NossoNum := LJsonObject.AsString['nossoNumero']; ARetornoWS.DadosRet.TituloRet.CodBarras := ARetornoWS.DadosRet.IDBoleto.CodBarras; ARetornoWS.DadosRet.TituloRet.LinhaDig := ARetornoWS.DadosRet.IDBoleto.LinhaDig; ARetornoWS.DadosRet.TituloRet.NossoNumero := ARetornoWS.DadosRet.IDBoleto.NossoNum; end else if (LTipoOperacao in [tpConsultaDetalhe,tpConsulta]) then begin JsonStr := LJsonObject.ToJSON; // se não for array, vira array if (JsonStr <> '') and (JsonStr[1] <> '[') then JsonStr := '[' + JsonStr + ']'; LJsonBoletos := TACBrJSONArray.Parse(JsonStr); try if (LJsonBoletos.Count > 0) then begin LJsonItem := LJsonBoletos.ItemAsJSONObject[0]; ARetornoWS.DadosRet.IDBoleto.CodBarras := ''; ARetornoWS.DadosRet.IDBoleto.LinhaDig := ''; ARetornoWS.DadosRet.IDBoleto.NossoNum := LJsonItem.AsString['nossoNumero']; ARetornoWS.indicadorContinuidade := false; ARetornoWS.DadosRet.TituloRet.CodBarras := ARetornoWS.DadosRet.IDBoleto.CodBarras; ARetornoWS.DadosRet.TituloRet.LinhaDig := ARetornoWS.DadosRet.IDBoleto.LinhaDig; ARetornoWS.DadosRet.TituloRet.NossoNumero := ARetornoWS.DadosRet.IDBoleto.NossoNum; ARetornoWS.DadosRet.TituloRet.Vencimento := DateSicrediToDateTime(LJsonItem.AsString['dataVencimento']); ARetornoWS.DadosRet.TituloRet.ValorDocumento := LJsonItem.AsFloat['valor']; ARetornoWS.DadosRet.TituloRet.ValorAtual := LJsonItem.AsFloat['valor']; ARetornoWS.DadosRet.TituloRet.EstadoTituloCobranca := LJsonItem.AsString['situacao']; ARetornoWS.DadosRet.TituloRet.SeuNumero := LJsonItem.AsString['seuNumero']; if( LJsonItem.AsString['situacao'] = C_LIQUIDADO ) or ( LJsonItem.AsString['situacao'] = C_BAIXADO_POS_SOLICITACAO ) then begin ARetornoWS.DadosRet.TituloRet.ValorPago := LJsonItem.AsFloat['valorLiquidado']; ARetornoWS.DadosRet.TituloRet.DataCredito := DateSicrediToDateTime(LJsonItem.AsString['dataliquidacao']); end; end; finally if Assigned(LJsonBoletos) then LJsonBoletos.Free; end; end else if (LTipoOperacao = tpBaixa) then begin // não possui dados de retorno.. end else if (LTipoOperacao = tpAltera) then begin // não possui dados de retorno.. end; end; except Result := False; end; finally LJsonObject.Free; end end; end; Segue a Unit alterada: ACBrBoletoRet_Sicredi_APIECOMM.pas
  9. Olá. Estavamos com problemas para emitir NFSe para cidade de Magé - RJ. Entramos em contato com a prefeitura que nos passaram os novos endereços para o provedor ModernizacaoPublica. Obtivemos o seguinte retorno: Homologação https://sis-nfs-e.mage.rj.gov.br/homologacao/webservices/NFEServices.jws?wsdl Produção https://sis-nfs-e.mage.rj.gov.br/ver20240921/webservices/NFEServices.jws?wsdl Reforma https://sis-nfs-e.mage.rj.gov.br/ver20240921/ReceberDPS.rule?sys=NFE Testei com o da reforma, que seria o atual e comunicou corretamente.
  10. Olá. A cidade de Americo Brasiliense, esta com o provedor incorreto. No arquivo oficial aparece como nacional, porém ao tentar emitir ocorre esse erro: O município emissor informado na DPS deve estar parametrizado para utilizar os emissores públicos nacionais, conforme parametrização do município no Sistema Nacional NFS-e. Verificando que a cidade é atendida pelo provedor IPM, e no monitor nacional também. Fiz o ajuste e validei, emitindo e cancelando corretamente. Segue a alteração: [3501707] Nome=Americo Brasiliense UF=SP Provedor=IPM Versao=2.04 Params=ServicosPadraoNacional:ObterDANFSE ProRecepcionar=https://americobrasiliense.atende.net/?pg=services&service=WNENotaFiscalEletronicaNfe
  11. Olá. Os endereços que constam no arquivo oficial para cidade de Seara/SC, estão incorretos. Segue os endereços testados: [4217501] Nome=Seara UF=SC Provedor=IPM Versao=1.01 ProRecepcionar=https://seara.atende.net/?pg=rest&service=WNERestServiceNFSe HomRecepcionar=https://seara.atende.net/?pg=rest&service=WNERestServiceNFSe Agradeço.
  12. @Italo Giurizzato Junior Para esta cidade, vamos precisar implementar o código de atividade, conforme relatada á cima: [4215802] Nome=Sao Bento do Sul UF=SC Provedor=IPM Versao=1.01 Params=GerarTag:codigo_atividade ProRecepcionar=https://saobentodosul.atende.net/?pg=rest&service=WNERestServiceNFSe HomRecepcionar=https://saobentodosul.atende.net/?pg=rest&service=WNERestServiceNFSe
  13. Obrigado @Italo Giurizzato Junior
  14. Boa tarde Italo. Segue em anexo os documentos que me enviaram. Integração Web Service IPM Fiscal_.zip
  15. Funcionou corretamente. Obrigado Italo.
  16. Olá; A documentação esta ácima. Mas mesmo assim solcitei via E-mail, segue: Segue informações solicitadas : Para liberação da base de homologação, é necessário solicitar a liberação no e-mail [email protected] com a informação do CNPJ da empresa emissora. Abaixo, deixo as informações acerca do sistema novo: URL de integração: https://saobentodosul.atende.net/?pg=rest&service=WNERestServiceNFSe URL de acesso ao sistema: https://nfse-saobentodosul.atende.net/autoatendimento/servicos/nfse
  17. Olá Pessoal. Recebemos um comunicado que a cidade de São Bento do Sul, que é atendida pelo IPM receberá atualização apartir de 11/11/2025. Segue a notificação: https://saobentodosul.atende.net/subportal/atualizacao-do-sistema-fiscal-web
  18. Só estou achando que a versão não esta correta, pois informando 2.04 esta retorando o arquivos xsd, isso ocorre quando o RPS enviando esta fora da estrutura. Quando altero para versão 1.01, apresenta Acesso Negado, mesmo tudo estando liberado. Vou anexar aqui os arquivos que o pessoal da IPM me enviou. Exemplo de Requisição ABRASF.json Exemplo de Requisição ABRASF.json schema nfse v2-04.xsd XML de Emissão - Lote com uma NFS-e.xml
  19. Olá. Pouso Alegre - MG alterou para o provedor IPM. Segue dados: [3152501] Nome=Pouso Alegre UF=MG Provedor=IPM Versao=2.04 ProRecepcionar=https://pousoalegre.atende.net/?pg=services&service=WNENotaFiscalEletronicaNfe&wsdl HomRecepcionar= No aguardo.
  20. Olá. Na tentativa de envio de RPS para provedor Pronin da cidade de Ijuí-RS, estamos obtendo o seguinte retorno: A alíquota do ISSQN só deve ser informada quando: o ISSQN for devido a outro município ou o prestador do serviço for optante pelo Simples Nacional e houver retenção do ISSQN ou permissão de editar a alíquota. Em outras situações a alíquota a ser aplicada será determinada pela Prefeitura. O problema é que sempre esta sendo gerado a tag aliquota, onde neste caso não deveria. Alterei dentro da unit Pronim.GravarXml para: NrOcorrAliquota := 0 Porém mesmo assim cria a tag alíquota, e isso é devido a uma verificação na função TNFSeW_Pronim202.GerarXml, dentro da mesma unit. Nela tem uma verificação que se for simples nacional, é alterado o NrOcorrAlqiuota para 1; if NFSe.OptanteSimplesNacional = snSim then NrOcorrAliquota := 1 Porém segundo o retorno, essa regra esta incorreta, falta a verificação se existe ISS retido. Fiz os ajuste e envio a unit em anexo, testei e funcionou perfeitamente. Agadeço. Pronim.GravarXml.pas
  21. Olá pessoal. A cidade Sao Goncalo Do Rio Preto/MG' esta convertendo para um código incorreto. Atual(incorreto) 3125507: CodTOM := '5238'; // Sao Goncalo Do Rio Preto/MG'; Corrigido 3125507: CodTOM := '4509'; // Sao Goncalo Do Rio Preto/MG'; Fiz a correção e testei, enviando normalmente.
  22. Olá @Italo Giurizzato Junior Se faz necessário ter o Parâmentro. Params=Assinar:AssRpsGerarNFSe
  23. @Italo Giurizzato Junior Hoje fiz o teste e exigiu o RPS com assinatura. Vai entender... Entrei em contato com o pessoal da prefeitura e comentaram que subiraram essa alteração ontem a noite. Então agora precisa informar: Params=Assinar:AssRpsGerarNFSe Agradeço.
  24. Olá @Italo Giurizzato Junior Será necessária mais uma alteração, esta cidade não permite o xml assinado: Informei o Parâmetro NaoAssinar. [3138401] Nome=Leopoldina UF=MG Provedor=Fiorilli Versao=2.00 ProRecepcionar=https://leopoldina2-web.sigmix.net/IssWeb-ejb/IssWebWS/IssWebWS Params=Assinar:NaoAssinar Obrigado.
×
×
  • 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.