
edv4ld0
Membros-
Total de ítens
19 -
Registro em
-
Última visita
Tipo de Conteúdo
Blocks
Notes ACBrLibNFe
Fóruns
Downloads
Calendário
Tudo que edv4ld0 postou
-
Boa tarde, após as alterações sugeridas aqui: https://www.projetoacbr.com.br/forum/topic/65688-nfs-provedor-issdsf-campinas-units-com-corre%C3%A7%C3%B5es-para-ler-xml-de-nfs-e/ Estamos com problemas. Seguimos o seguinte fluxo: 1)Criar RPS 2)Emitir 3)Consultamos o Lote, que atualiza o RPS que esta carregado na memória com número da Nota, Código de Verificação, etc.. 4)Imprimimos/Geramos PDF Depois dessa alteração não são mais encontrados os campos. O amigo te enviou um XML que é exportado do site da prefeitura e não segue os padrão que recebemos via webservice. Revertemos para a revisão anterior para voltar a funcionar. Já havia te enviado em outro tópico os exemplos de XML desse provedor. Segue novamente em anexo. Em anexo também um arquivo exportador pelo site da prefeitura que nada tem haver com as operações do webservice. exemplosws.zip exportado_prefeitura.xml
-
Boa tarde, Compilamos nosso emissor com as última alterações feitas no componente e constamos um erro que já havia sido corrigido. procedure TACBrNFSeProviderISSDSF.TratarRetornoEmitir(Response: TNFSeEmiteResponse); var Document: TACBrXmlDocument; AErro: TNFSeEventoCollectionItem; ANode: TACBrXmlNode; AuxNode: TACBrXmlNode; begin Document := TACBrXmlDocument.Create; try try if Response.XmlRetorno = '' then begin AErro := Response.Erros.New; AErro.Codigo := Cod201; AErro.Descricao := Desc201; Exit end; Document.LoadFromXml(Response.XmlRetorno); ANode := Document.Root; ... Essa última linha "ANode := Document.Root;" já havíamos proposto a seguinte alteração: {No WS de Campo Grande/MS tem retornado: <?xml version="1.0" encoding="UTF-8"?> <enviarReturn type="xsd:string"> <ns1:RetornoEnvioLoteRPS xsi:schemaLocation="http://localhost:8080/WsNFe2/lote http://localhost:8080/WsNFe2/xsd/RetornoEnvioLoteRPS.xsd " xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tipos="http://localhost:8080/WsNFe2/tp" xmlns:ns1="http://localhost:8080/WsNFe2/lote"> <Cabecalho> <CodCidade>9051</CodCidade> <Sucesso>true</Sucesso> <NumeroLote>123456789</NumeroLote> <CPFCNPJRemetente>00000000000000</CPFCNPJRemetente> <DataEnvioLote>2021-07-08T16:12:00.0Z</DataEnvioLote> <QtdNotasProcessadas>0</QtdNotasProcessadas> <TempoProcessamento>0</TempoProcessamento> <ValorTotalServicos>0</ValorTotalServicos> <ValorTotalDeducoes>0</ValorTotalDeducoes> <Versao>1</Versao> <Assincrono>S</Assincrono> </Cabecalho> <Alertas/> <Erros/> <ChavesNFSeRPS/> </ns1:RetornoEnvioLoteRPS> </enviarReturn> } ANode := Document.Root.Childrens.FindAnyNs('RetornoEnvioLoteRPS'); if ANode = nil then ANode := Document.Root; Na revisão 23119 você novamente voltou para: ANode := Document.Root; Dessa forma não é localizado a tag "Cabecalho", por exemplo, onde esta o NumeroLote.
-
Favor ignorar o arquivo acima, segue novamente. ACBrDFeReportFortes.pas
-
Segue arquivo alterado ACBrDFeReportFortes.pas
-
É justamente do componente que estamos utilizando: DANFSE.ImprimirDANFSePDF(stream) Só que em: class procedure TDFeReportFortes.AjustarReport(FReport: TRLReport; AConfig: TACBrDFeReport); begin FReport.ShowProgress := AConfig.MostraStatus; FReport.PrintDialog := AConfig.MostraSetup and (not AConfig.MostraPreview); if NaoEstaVazio(AConfig.Impressora) then if RLPrinter.PrinterName <> AConfig.Impressora then RLPrinter.PrinterName := AConfig.Impressora; if RLPrinter.SupportsDuplex Then RLPrinter.Duplex := false; if (AConfig.NumCopias > 0) and (RLPrinter.Copies <> AConfig.NumCopias) then RLPrinter.Copies := AConfig.NumCopias; end; a linha, retorna o erro. if RLPrinter.SupportsDuplex Then Se você olhar abaixo já é verificado NumCopia > 0, proposto no tópico mencionado, para não setar o RLPrinter.Copies que dava o mesmo erro, só adicionamos para também não verificar o SupportsDuplex: if (AConfig.NumCopias > 0) and RLPrinter.SupportsDuplex Then RLPrinter.Duplex := false; Caso queira fazer um teste, basta excluir todas as impressoras do windows e chamar DANFSE.ImprimirDANFSePDF, vai retornar que não tem impressora padrão, altere a linha indica e o PDF é gerado normalmente.
-
Bom dia, abaixo algumas observações, unit ISSDSF.Provider: 1) Ainda continua verificando Erros e Alertas dentro da tag Cabecalho, no código abaixo já é chamada a procedure ProcessarMensagemErros e depois é chamada novamente usando a tag Cabecalho como RootNode: ... ProcessarMensagemErros(ANode, Response); AuxNode := ANode.Childrens.FindAnyNs('Cabecalho'); if AuxNode <> nil then begin ProcessarMensagemErros(AuxNode, Response); ... 2) Na alteração feita na procedure PrepararConsultaLoteRps agora só funciona passando o número do lote no parâmetro AProtocolo da TACBrNFSeX.ConsultarLoteRps. Se não for passado o protocolo retorno erro, o parâmetro ANumLote da função TACBrNFSeX.ConsultarLoteRps(const AProtocolo, ANumLote: String) perdeu o sentido. procedure TACBrNFSeProviderISSDSF.PrepararConsultaLoteRps(Response: TNFSeConsultaLoteRpsResponse); ... if EstaVazio(Response.Lote) then Response.Lote := Response.Protocolo; if EstaVazio(Response.Protocolo) then begin AErro := Response.Erros.New; AErro.Codigo := Cod111; AErro.Descricao := Desc111; Exit; end; ... 3) TratarRetornoConsultaNFSeporRps e TratarRetornoConsultaNFSe esta verificando a existência de erros usando Response.Erros.Count = 0, mas alguns erros vem dentro da tag Alertas Response.Sucesso := (Response.Erros.Count = 0) para Response.Sucesso := (Response.Erros.Count = 0) and (Response.Alertas.Count = 0);
-
Não, DANFE da NFSe. Nós não usamos ACBrLib, usamos uma DLL feita apenas para para gerar o PDF da nota. E essa DLL é chamada servidor IIS. Vi que em outros tópicos teve gente com o mesmo problema.
-
Bom dia, após tentar gerar o DANFE via servidor IIS, usando uma DLL recebemos a seguinte mensagem: There is no default printer currently selected No tópico: https://www.projetoacbr.com.br/forum/topic/52337-gerar-pdf-nfcenfe-danfe-aplica%C3%A7%C3%A3o-isapi-com-fortes-report/ foi proposto usar o NumCopias := 0, mas mesmo assim o erro continuava. Corrigimos o problema alterando a unit ACBrDFeReportFortes: class procedure TDFeReportFortes.AjustarReport(FReport: TRLReport; AConfig: TACBrDFeReport); ... if RLPrinter.SupportsDuplex Then RLPrinter.Duplex := false; ... para: class procedure TDFeReportFortes.AjustarReport(FReport: TRLReport; AConfig: TACBrDFeReport); ... if (AConfig.NumCopias > 0) and RLPrinter.SupportsDuplex Then RLPrinter.Duplex := false; ...
-
Boa tarde, usamos em Campo Grande / MS. Mas acredito que não, no primeiro post tem o arquivo "exemplosws.zip" nele tem os exemplos do próprio provedor para as cidades que ele atende. E as tags retiradas acima não aparecem em nenhum dos exemplos. Tanto que no arquivo "Leia-me.txt" presente no arquivo tem a seguinte observação: "Os exemplos de XML encontram-se nas pastas de acordo com a cidade de declaração. Para cada prefeitura existem exemplos para cada método do Web Service, o XML não tem difereça de uma Prefeitura para outra, o que irá mudar basicamente é o codigo da cidade indicado no cabeçalho do XML."
-
Boa tarde Italo, Atualizamos o ACBR e voltaram alguns problemas que já tínhamos corrigido. Na revisão 22644 acrescentaram novamente algumas tags. ISSDSF.GravarXml.pas ===A tag "CodigoServico" não existe nesse provedor, erro na hora de emitir. ISSDSF.Provider.pas ===Configuracao: ======Validar setado como "false". Com "true" esta dando erro na unit "ACBrDFeXsMsXml", funcao "TDFeSSLXmlSignMsXml.Validar" em "Schema.add(WideString(FpDFeSSL.NameSpaceURI), ArqSchema)"; ===TratarRetornoEmitir: ======As tags "Erros" e "Alertas" não existem dentro da tag "Cabecalho". ======O conteúdo da tag "Sucesso" é "true" ou "false" e esta sendo checado "not (xSucesso = 'N')". ======Response.Sucesso esta sendo setado novamente usando (Response.Erros.Count = 0), mas alguns erros vem dentro da tag "Alertas". ===TratarRetornoConsultaLoteRps: ======As tags "Erros" e "Alertas" não existem dentro da tag "Cabecalho". ======Response.Sucesso setado usando o conteúdo da tag "Sucesso". ===TratarRetornoConsultaNFSeporRps: ======As tags "Erros" e "Alertas" não existem dentro da tag "Cabecalho". ======Response.Sucesso acrescentado checagem da tag "Alertas". ===PrepararConsultaNFSe: ======A tag "NumeroLote" não existe, erro na hora de consultar. ===TratarRetornoConsultaNFSe: ======As tags "Erros" e "Alertas" não existem dentro da tag "Cabecalho". ======Response.Sucesso acrescentado checagem da tag "Alertas". ===PrepararCancelaNFSe: ======O Namespace "...ReqCancelamentoNFSe.xsd" deve estar presente. ===TratarRetornoCancelaNFSe: ======As tags "Erros" e "Alertas" não existem dentro da tag "Cabecalho". ======Response.Sucesso setado usando o conteúdo da tag "Sucesso". ===Recepcionar: ======Alterar de "XmlToStr(AMSG)" para "IncluirCDATA(AMSG)". Um exemplo foi uma razão social de um tomador "KAZUO & AOKI LTDA - ME" esse "&" é interpretado de maneira errada, pelo provedor, quando usamos "XmlToStr". ===Cancelar: ======Alterar de "XmlToStr(AMSG)" para "IncluirCDATA(AMSG)". No caso de alguma justificativa conter o caractere "&" por exemplo ocorre o mesmo erro acima. Em anexo arquivos alterados e manual do webservice. ISSDSF.Provider.pas ISSDSF.GravarXml.pas ManualNFSeWebService.pdf
-
Boa tarde, segue arquivo alterado. Funções: Recepcionar, RecepcionarSincrono, TesteEnvio, ConsultarLote, ConsultarNFSePorRps, ConsultarNFSe e Cancelar. Alterado de XmlToStr(AMSG) para IncluirCDATA(AMSG). ISSDSF.Provider.pas
-
Boa tarde, Tivemos problema com a Razão Social de um Tomador: "KAZUO & AOKI LTDA - ME" corrigimos alterando o arquivo ISSDSF.Provider.pas as funções Recepcionar, RecepcionarSincrono, TesteEnvio, ConsultarLote, ConsultarNFSePorRps, ConsultarNFSe e Cancelar de XmlToStr(AMSG) para IncluirCDATA(AMSG); O "&" estava sendo convertido corretamente para "&", mas como o webservice converte de volta o conteúdo da Tag "mensagemXml" esse "&" também era convertido o que causava o erro: "ERRO VALIDACAO XSD: (402)The entity name must immediately follow the '&' in the entity reference."
-
Bom dia, Você pode abrir o arquivo "ACBrNFSeXDANFSeRL.dfm", esta dentro da pasta "ACBR\Fontes\ACBrDFe\ACBrNFSeX\DANFSE\Fortes", em algum editor de texto e incluir as linhas abaixo no componente "RLNFSe": PreviewOptions.ShowModal = True PreviewOptions.Caption = 'DANFe' ShowProgress = False OnNeedData = RLNFSeNeedData ficando assim: object frlXDANFSeRL: TfrlXDANFSeRL Left = 280 Top = 152 Caption = 'frlXDANFSeRL' ClientHeight = 537 ClientWidth = 850 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = True OnCreate = FormCreate OnDestroy = FormDestroy PixelsPerInch = 96 TextHeight = 13 object RLNFSe: TRLReport Left = 8 Top = 8 Width = 794 Height = 1123 Font.Charset = DEFAULT_CHARSET Font.Color = clBlack Font.Height = -13 Font.Name = 'Arial' Font.Style = [] PreviewOptions.ShowModal = True PreviewOptions.Caption = 'DANFe' ShowProgress = False OnNeedData = RLNFSeNeedData end object RLPDFFilter1: TRLPDFFilter DocumentInfo.Author = 'FortesReport 3.23 - Copyright '#194#169' 1999-2009 Fortes Inform'#195#161'tica' DocumentInfo.Creator = 'Projeto ACBr (Componente NFS-e)' DisplayName = 'Documento PDF' Left = 120 Top = 24 end end
-
Bom dia, Segue em anexo arquivos alterados para o funcionamento do provedor ISSDSF: DANFSE: ACBrNFSeXDANFSeRL.dfm (estava faltando o evento OnNeedData no componente RLNFSe o que não gerava a lista de serviços) ACBrNFSeXDANFSeRLRetrato.dfm (caracteres estranhos no componente RLLabel66 "Descrição") Provedores: ISSDSF.GravarXml.pas ===A tag "CodigoServico" não faz parte desse provedor o que dava erro na hora de emitir. ISSDSF.LerXml.pas ===Alteração para não duplicar serviço/deduções depois de um RPS já carregado. ===Alteração para não substituir dados do RPS por "vazio", na consulta de lote por exemplo vários campos não são retornados o que deixa os campos em branco. ISSDSF.Provider.pas ===ConfigAssinar : ConsultarLote deve ser False, ConsultarNFSe deve ser True. ===ConfigSchemas: Validar setado como False. ===ProcessarMensagemErros: Adicionado para carregar os Alertas. ===PrepararEmitir: Adicionado namespace. ===TratarRetornoEmitir: No caso de Campo Grande/MS o "<ns1:RetornoEnvioLoteRPS" esta vindo dentro de "<enviarReturn". ===PrepararConsultaLoteRps: Adicionado namespace sem ele é retornado "ERRO VALIDACAO XSD: (400)error: org.xml.sax.SAXParseException". ===TratarRetornoConsultaLoteRps: o NodeArray deve ser a tag "ConsultaNFSe" e não "ListaNFSe". Esse provedor gera o número da nota no WS, alterado para localizar a nota pelo número do RPS. ===PrepararConsultaNFSeporRps: Adicionado namespace sem ele é retornado "ERRO VALIDACAO XSD: (400)error: org.xml.sax.SAXParseException". ===TratarRetornoConsultaNFSeporRps: A lista de notas deve ser a tag "Nota" e não "NFe". Alterado para localizar a nota pelo número do RPS. ===PrepararConsultaNFSe: Adicionado namespace e a tag "NotaInicial" deve ser incluída em vez de "NumeroLote". ===TratarRetornoConsultaNFSe: A lista de notas deve ser a tag "Nota" e não "NFe". Alterado para localizar a nota pelo número do RPS. ===PrepararCancelaNFSe: Adicionado namespace sem ele é retornado "ERRO VALIDACAO XSD: (400)error: org.xml.sax.SAXParseException". ===Recepcionar, RecepcionarSincrono, TesteEnvio, ConsultarLote, ConsultarNFSePorRps, ConsultarNFSe e Cancelar: Substituido "< e >" por "< e >". *OBS: Existe um bug nesse provedor, quando usamos "ConsultarNFSePorRps" o "BairroTomador" é retornado vazio, mas na "ConsultarNFSe" ele esta presente. ACBrNFSeX.zip exemplosws.zip
-
Se você quer saber apenas se houve saque e de quanto foi, basta você comparar se o valor que você passou para o CRT for menor que o ValorTotal. Quanto ao problema do Saque estar zerado, acredito que encontrei uma forma de resolver o problema e ainda corrigir outro provável erro. Notei que no componente existem as seguintes propriedades: property SaldoAPagar : Double read fSaldoAPagar write fSaldoAPagar ; property SaldoRestante : Double read GetSaldoRestante; function TACBrTEFDRespostasPendentes.GetSaldoRestante : Double; var I : Integer; TotalPagoENaoImpresso : Double ; begin TotalPagoENaoImpresso := 0 ; For I := 0 to Count-1 do begin with TACBrTEFDResp(Items[I]) do begin if OrdemPagamento = 0 then // Ainda nao imprimiu no ECF ? TotalPagoENaoImpresso := TotalPagoENaoImpresso + (ValorTotal - Saque) ; end ; end; TotalPagoENaoImpresso := RoundTo( TotalPagoENaoImpresso, -2); Result := RoundTo( SaldoAPagar - TotalPagoENaoImpresso, -2) ;} end; A função GetSaldoRestante não leva em consideração por exemplo o que eu paguei em dinheiro e ainda diminui do SaldoAPagar ficando um valor que não é o que realmente falta ser pago. Por exemplo: Compra R$23,00 Dinheiro R$3,00 1º Cartão R$5,00 Ao chamar o segundo cartão o SaldoAPagar é R$15,00, só que como a Função GetSaldoRestante desconta o TotalPagoENaoImpresso o valor retornado por ela é R$10,00, o que causa um erro aqui: Procedure TACBrTEFDClass.VerificarTransacaoPagamento(Valor : Double ); (...) if (Valor > RespostasPendentes.SaldoRestante ) then raise Exception.Create( ACBrStr( 'Operação TEF deve ser igual ao '+ 'Saldo a Pagar' ) ); (...) Uma vez que estou mandando R$15,00 só que a função retorna R$10,00. O que poderia ser feito era remover a propriedade SaldoRestante juntamente com a função GetSaldoRestante, usariámos apenas a propriedade SaldoAPagar, ficando a cargo do usuário passar o valor que realmente falta ser pago através OnInfoECF, como já é feito. Fiz essas modificações aqui e além de resolver o erro relatado acima referente a propriedade Saque, ainda resolveu esse segundo erro. Se quiser fazer um teste sem alterar muito os fontes, altere a função GetSaldoRestante para o seguinte: function TACBrTEFDRespostasPendentes.GetSaldoRestante : Double; {var I : Integer; TotalPagoENaoImpresso : Double ;} begin { TotalPagoENaoImpresso := 0 ; For I := 0 to Count-1 do begin with TACBrTEFDResp(Items[I]) do begin if OrdemPagamento = 0 then // Ainda nao imprimiu no ECF ? TotalPagoENaoImpresso := TotalPagoENaoImpresso + (ValorTotal - Saque) ; end ; end; TotalPagoENaoImpresso := RoundTo( TotalPagoENaoImpresso, -2); Result := RoundTo( SaldoAPagar - TotalPagoENaoImpresso, -2) ;} Result := SaldoAPagar; end;
-
Eu utilizo AutoEfetuarPagamento = False, e não utilizo o ECF do acbr, utilizo um próprio, sim abro apenas um vinculado. O problema não esta na hora de imprimir, o problema esta na hora de chamar o segundo cartão function TACBrTEFDRespostasPendentes.GetSaldoRestante : Double; var I : Integer; TotalPagoENaoImpresso : Double ; begin TotalPagoENaoImpresso := 0 ; For I := 0 to Count-1 do begin with TACBrTEFDResp(Items[I]) do begin if OrdemPagamento = 0 then // Ainda nao imprimiu no ECF ? TotalPagoENaoImpresso := TotalPagoENaoImpresso + (ValorTotal - Saque) ; end ; end; TotalPagoENaoImpresso := RoundTo( TotalPagoENaoImpresso, -2); Result := RoundTo( SaldoAPagar - TotalPagoENaoImpresso, -2) ; end; Como você disse a propriedade Saque só funciona em alguns TEFs Dedicado, nos outros vai estar com valor Zero, certo? No TEF discado ao chamar o segundo cartão, essa função GetSaldoRestante vai retorna o total ja passado em cartão, mas não vai descontar o valor do Saque que vai estar zero, dando a impressão que você ja passou R$2,00 e não R$1,00 como seria o correto.
-
Nesse caso, considere o seguinte: Venda R$3,00 1) Pagamento Cartão R$1,00, com saque R$1,00 (ValorTotal = R$2,00) 2) Pagamento Cartão R$2,00 (diferença) No segundo pagamento ao chamar a procedure: VerificarTransacaoPagamento (...) if (Valor > RespostasPendentes.SaldoRestante ) then raise Exception.Create( ACBrStr( 'Operação TEF deve ser igual ao '+ 'Saldo a Pagar' ) ); (...) Da erro porque a propriedade SaldoRestante, retorna R$1,00, ja que a propriedade Saque esta Zero. function TACBrTEFDRespostasPendentes.GetSaldoRestante : Double; var I : Integer; TotalPagoENaoImpresso : Double ; begin TotalPagoENaoImpresso := 0 ; For I := 0 to Count-1 do begin with TACBrTEFDResp(Items[I]) do begin if OrdemPagamento = 0 then // Ainda nao imprimiu no ECF ? TotalPagoENaoImpresso := TotalPagoENaoImpresso + (ValorTotal - Saque) ; end ; end; TotalPagoENaoImpresso := RoundTo( TotalPagoENaoImpresso, -2); Result := RoundTo( SaldoAPagar - TotalPagoENaoImpresso, -2) ; end; Aqui eu ja homologuei, só estou postando caso alguém passe pelo mesmo problema que o meu, pra não perder tempo no dia da homologação, apenas mudei a propriedade Saque que era readonly, e abasteci ao final de cada CRT, quando verifico se o valorTotal é maior que o valor solicitado. Seria muito complicado adicionar esse Saque pra ser preenchido no discado também? Um abraço, Edvaldo
-
Olá pessoal, boa tarde. A propriedade Saque funciona? Ou temos que fazer baseado no ValorTotal? Alguém teve problema fazendo multiplos cartões e saque ao mesmo tempo? Obrigado, Edvaldo
-
Olá pessoal, boa noite. Como é a primeira vez que estou postando, vamos a apresentação Sou o Edvaldo, moro na cidade de Ponta Porã - MS, 29 anos e também trabalho com automação. Estou usando o componente ACBrTEFD. Bom minha dúvida esta no Teste 31 do check list (visa): 31- Segunda parte do teste anterior – Abra o arquivo Intpos.001 da pasta teste e altere o valor do campo 001-000 para o mesmo do Intpos.001 da transação solicitada no momento e salve o arquivo, copie novamente o intpos.001 da pasta teste para o c:tef_dial\resp, a automação deverá realizar a impressão, visto que o valor do campo 001-000 retornado é igual ao que enviou ( Obs.: a AC deverá verificar apenas o campo 001-000 para fazer a impressão do comprovante TEF). Meu teste consistiu no seguinte: Primeira Venda com valor de R$4,00. (copiei o intpos.001) Segunda Venda com valor de R$26,00. (deixei o gp na janela de seleção de operadoras, alterei o campo 001-000, e copiei o intpos.001). O componente detecta isso muito bem. Primeira pergunta: Ao copiar esse intpos.001 (já modificado) o gp deve sair dessa tela de seleção de operadoras? (por quê aqui ele fica nessa tela e não fecha, a menos que eu clique em Encerra, isso é normal?) Como pretendo trabalhar com multiplos cartões, como o valor da Venda atual é R$26,00 e a venda anterior é R$4,00 o componente cai aqui: { Se é Multiplos Cartoes, e ainda Resta SALDO deve enviar um CNF } if MultiplosCartoes and (RespostasPendentes.SaldoRestante > 0) then begin self.CNF; Ele tenta mandar esse CNF, só que como o gp esta naquela tela de seleção de operadora ele não responde e o componente exibe a mensagem que o gp não esta ativo, ficando nesse loop, que gera uma exceção e não retorna nada no comando CRT que chamei lá atraz e estou esperando um True ou False, simplesmente sai de todo o código. Agradeço qualquer ajuda, Edvaldo