Edson.pol
Membros-
Total de ítens
196 -
Registro em
-
Última visita
-
Days Won
2
Tipo de Conteúdo
Blocks
Notes ACBrLibNFe
Fóruns
Downloads
Calendário
Tudo que Edson.pol postou
-
Boa tarde... Abri seu xml no Chrome e apontou erro na linha 37 (ncm) <NCM>99/NCM> o correto seria <NCM>99999999</NCM> Faça a correção e teste novamente. []´s Edson
-
Bom dia Não sei qual layout o seu provedor usa, mas se for ABRASF, você pode alterar na unit "pnfsNFSeW_ABRASFv1.pas" function TNFSeW_ABRASFv1.GerarXml: Boolean; var Gerar: Boolean; begin Gerador.Prefixo := FPrefixo4; Gerador.Opcoes.RetirarEspacos := False; Gerador.ArquivoFormatoXML := ''; Gere um novo RPS e teste pra ver como fica. []´s Edson
- 6 replies
-
- nfs-e
- fastreport
- (e 2 mais)
-
Boa tarde. Marcos: Pra qual cidade você está testando ? o provedor é CONAM ? Homologação ou Produção ? Daniel: Dentre as diversas alternativas que testei, essa que estou usando encontrei no "stack overflow" http://stackoverflow.com/questions/9861309/wininet-ssl-client-authenticate-oddness Pelo que percebi no seu código, os flags são setados antes do HttpSendRequest, e não sei porque, não fazem efeito. Na outra forma, verificando se o erro do HttpSendRequest é "ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED" e refazendo o "InternetSetOption" após o erro, dá tudo certo. []´s Edson.
-
Boa tarde Daniel. De quais Flags está falando ? Testei com a unit que você anexou, mas dá o erro da figura em anexo. "É necessário um certificado para concluir a autenticação do cliente". O erro é disparado porque a linha if HttpSendRequest(pRequest, nil, 0, Pointer(FData), Length(FData)) then resulta em False. Na unit que postei, o primeiro HttpSendRequest também retorna False (por causa da "falta" do certificado), mas o IgnoreCertificateErros corrige o problema e chama novamente o HttpSendRequest, desta vez sem erro. Ok := HttpSendRequest(pRequest, nil, 0, Pointer(FData), Length(FData)); if Ok = False then begin flags := GetLastError; if (flags = ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED) then begin IgnoreCerticateErrors(pRequest, Msg); Ok := HttpSendRequest(pRequest, nil, 0, Pointer(FData), Length(FData)) end; end; Já testei esta unit na emissão tanto de NFSe quanto de NFe, e não houve nenhum problema. []´s Edson. ACBrHTTPReqResp.pas
-
Boa noite Italo! Fiz um backup da minha pasta ACBr, e fiz vários testes com as units baixadas hoje: Vamos lá: Teste utilizando o demo do ACBrNFSe. "Gerar e Enviar Lote RPS" Teste 1: Erro no retorno: Error reading ws_nfe.PROCESSARPS --> Resolvido alterando o CONAM.INI [Recepcionar] IncluiEncodingCab=0 IncluiEncodingDados=0 Texto1=<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> Texto2=<SOAP-ENV:Body> Texto3=%DadosMsg% Texto4=</SOAP-ENV:Body> Texto5=</SOAP-ENV:Envelope> Para o tópico não ficar muito extenso, vou quebrar em alguns posts... Teste 2 Erro: O Sistema não pode encontrar o caminho especificado. O erro ocorre na procedure TDFeCapicom.CarregarCertificado; --> Resolvido alterando a procedure TDFeCapicom.CarregarCertificado; incluindo logo no início: begin // Provedor não usa certificado ? Assumir que certificado foi lido. if FpDFeSSL.NumeroSerie='' then begin FpCertificadoLido := True; exit; end; // Certificado já foi carregado ? if (FCertificado <> nil) and (FNumCertCarregado = FpDFeSSL.NumeroSerie) then begin FpCertificadoLido := True; exit; end; ----------------------------------------------------------------------------- Teste 3 Erro: Mesmo setando UseCertificado=0 no arquivo INI, a tela se seleção de certificados é aberta, forçando selecionar um certificado. Em ACBrHTTPReqResp, no trecho: if ((ShowCertStore) or ((FCertSerialNumber = '') and (FCertificate = nil))) then begin end; Deve ser alterado para: if (FUseCertificate) then if ((ShowCertStore) or ((FCertSerialNumber = '') and (FCertificate = nil))) then begin end; e no trecho: CertContext.Get_CertContext(HCertContext); pSession := InternetOpen(PChar('Borland SOAP 1.2'), AccessType, PChar(pProxy), nil, 0); alterar para: if (FUseCertificate) then CertContext.Get_CertContext(HCertContext); pSession := InternetOpen(PChar('Borland SOAP 1.2'), AccessType, PChar(pProxy), nil, 0); ----------------------------------------------------------------------------- Teste 4: Erro Interno: 12044 Erro HTTP: 0 Access violation at address 00562e12 in module 'Demo_ACBrNFSe.exe' --> Resolvido incluindo a function IgnoreCerticateErrors(oRequestHandle:HINTERNET; var aErrorMsg: ansistring): Boolean; e alterando o processo "HttpSendRequest" --> As alterações estão com marcação "//< * >//" procedure TACBrHTTPReqResp.Execute(Resp: TStream); const INTERNET_OPTION_CLIENT_CERT_CONTEXT = 84; var aBuffer: array[0..4096] of AnsiChar; BytesRead: cardinal; pSession: HINTERNET; pConnection: HINTERNET; pRequest: HINTERNET; flags: longword; Store: IStore; Certs: ICertificates; Cert: ICertificate2; Cert2: ICertificate2; CertContext: ICertContext; Ok: Boolean; i, AccessType, HCertContext: Integer; ANone, AHost, AProt, APort, APath, pProxy, Header, Msg: String; begin if (FUseCertificate) then FUseSSL := True; AProt := ''; APort := ''; APath := ''; ParseURL(FUrl, AProt, ANone, ANone, AHost, APort, APath, ANone); if (FUseCertificate) then //< * >// if ((ShowCertStore) or ((FCertSerialNumber = '') and (FCertificate = nil))) then begin FCertSerialNumber := OpenCertStore; if FCertSerialNumber <> '' then FCertificate := nil; end; if FCertSerialNumber <> '' then begin Store := CoStore.Create; Store.Open(CAPICOM_CURRENT_USER_STORE, FCertStoreName, CAPICOM_STORE_OPEN_READ_ONLY); Certs := Store.Certificates as ICertificates2; if Certs.Count > 0 then begin for i := 1 to Certs.Count do begin Cert2 := IInterface(Certs.Item) as ICertificate2; if Cert2.SerialNumber = FCertSerialNumber then begin Cert := Cert2; break; end; end; CertContext := Cert as ICertContext; end; end else begin CertContext := FCertificate as ICertContext; end; if FProxyHost <> '' then begin AccessType := INTERNET_OPEN_TYPE_PROXY; if (FProxyPort <> '') and (FProxyPort <> '0') then pProxy := FProxyHost + ':' + FProxyPort else pProxy := FProxyHost; end else AccessType := INTERNET_OPEN_TYPE_PRECONFIG; //DEBUG //WriteToTXT('c:\temp\httpreqresp.log', FormatDateTime('hh:nn:ss:zzz', Now)+ ' - Abrindo sessão'); if (FUseCertificate) then CertContext.Get_CertContext(HCertContext); pSession := InternetOpen(PChar('Borland SOAP 1.2'), AccessType, PChar(pProxy), nil, 0); try if not Assigned(pSession) then raise EACBrHTTPReqResp.Create('Erro: Internet Open or Proxy'); //DEBUG //WriteToTXT('c:\temp\httpreqresp.log', FormatDateTime('hh:nn:ss:zzz', Now)+ ' - Ajustando TimeOut: '+IntToStr(FTimeOut)); if not InternetSetOption(pSession, INTERNET_OPTION_CONNECT_TIMEOUT, @FTimeOut, SizeOf(FTimeOut)) then raise EACBrHTTPReqResp.Create('Erro ao definir TimeOut de Conexão'); if not InternetSetOption(pSession, INTERNET_OPTION_SEND_TIMEOUT, @FTimeOut, SizeOf(FTimeOut)) then raise EACBrHTTPReqResp.Create('Erro ao definir TimeOut de Envio'); if not InternetSetOption(pSession, INTERNET_OPTION_DATA_SEND_TIMEOUT, @FTimeOut, SizeOf(FTimeOut)) then raise EACBrHTTPReqResp.Create('Erro ao definir TimeOut de Envio'); if not InternetSetOption(pSession, INTERNET_OPTION_RECEIVE_TIMEOUT, @FTimeOut, SizeOf(FTimeOut)) then raise EACBrHTTPReqResp.Create('Erro ao definir TimeOut de Recebimento'); if not InternetSetOption(pSession, INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, @FTimeOut, SizeOf(FTimeOut)) then raise EACBrHTTPReqResp.Create('Erro ao definir TimeOut de Recebimento'); if APort = '' then begin if (FUseSSL) then APort := IntToStr(INTERNET_DEFAULT_HTTPS_PORT) else APort := IntToStr(INTERNET_DEFAULT_HTTP_PORT); end; //Debug, TimeOut Test //AHost := 'www.google.com'; //port := 81; //DEBUG //WriteToTXT('c:\temp\httpreqresp.log', FormatDateTime('hh:nn:ss:zzz', Now)+ ' - Abrindo Conexão: '+AHost+':'+APort); pConnection := InternetConnect(pSession, PChar(AHost), StrToInt(APort), PChar(FProxyUser), PChar(FProxyPass), INTERNET_SERVICE_HTTP, 0, 0{cardinal(Self)}); if not Assigned(pConnection) then raise EACBrHTTPReqResp.Create('Erro: Internet Connect or Host'); try if (FUseSSL) then begin flags := INTERNET_FLAG_KEEP_CONNECTION or INTERNET_FLAG_NO_CACHE_WRITE; flags := flags or INTERNET_FLAG_SECURE; if (FUseCertificate) then flags := flags or (INTERNET_FLAG_IGNORE_CERT_CN_INVALID or INTERNET_FLAG_IGNORE_CERT_DATE_INVALID); end else flags := INTERNET_SERVICE_HTTP; //DEBUG //WriteToTXT('c:\temp\httpreqresp.log', FormatDateTime('hh:nn:ss:zzz', Now)+ ' - Fazendo POST: '+APath); pRequest := HttpOpenRequest(pConnection, PChar('POST'), PChar(APath), nil, nil, nil, flags, 0); if not Assigned(pRequest) then raise EACBrHTTPReqResp.Create('Erro: Open Request'); UpdateErrorCodes(pRequest); try if ( (APort <> IntToStr(INTERNET_DEFAULT_HTTP_PORT)) and (UpperCase(AProt) = 'HTTP') ) or ( (APort <> IntToStr(INTERNET_DEFAULT_HTTPS_PORT)) and (UpperCase(AProt) = 'HTTPS') ) then AHost := AHost +':'+ APort; Header := 'Host: ' + AHost + sLineBreak + 'Content-Type: ' + FMimeType + '; charset='+FCharsets + SLineBreak + 'Accept-Charset: ' + FCharsets + SLineBreak + 'SOAPAction: "' + FSOAPAction + '"' +SLineBreak; if (FUseCertificate) then if not InternetSetOption(pRequest, INTERNET_OPTION_CLIENT_CERT_CONTEXT, Pointer(HCertContext), SizeOf(CERT_CONTEXT)) then raise EACBrHTTPReqResp.Create('Erro: Problema ao inserir o certificado'); if trim(FProxyUser) <> '' then if not InternetSetOption(pRequest, INTERNET_OPTION_PROXY_USERNAME, PChar(FProxyUser), Length(FProxyUser)) then raise EACBrHTTPReqResp.Create('Erro: Proxy User'); if trim(FProxyPass) <> '' then if not InternetSetOption(pRequest, INTERNET_OPTION_PROXY_PASSWORD, PChar(FProxyPass), Length(FProxyPass)) then raise EACBrHTTPReqResp.Create('Erro: Proxy Password'); HttpAddRequestHeaders(pRequest, PChar(Header), Length(Header), HTTP_ADDREQ_FLAG_ADD); if FEncodeDataToUTF8 then FData := UTF8Encode(FData); //DEBUG //WriteToTXT('c:\temp\httpreqresp.log', FormatDateTime('hh:nn:ss:zzz', Now)+ ' - Enviando Dados: '+APath); //WriteToTXT('c:\temp\httpreqresp.log', FData); //< * >// INÍCIO... Ok := False; Resp.Size := 0; Ok := HttpSendRequest(pRequest, nil, 0, Pointer(FData), Length(FData)); if Ok = False then begin flags := GetLastError; if (flags = ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED) then begin IgnoreCerticateErrors(pRequest, Msg); Ok := HttpSendRequest(pRequest, nil, 0, Pointer(FData), Length(FData)) end; end; if Ok then begin BytesRead := 0; //DEBUG //WriteToTXT('c:\temp\httpreqresp.log', FormatDateTime('hh:nn:ss:zzz', Now)+ ' - Lendo Dados'); while InternetReadFile(pRequest, @aBuffer, SizeOf(aBuffer), BytesRead) do begin //DEBUG //WriteToTXT('c:\temp\httpreqresp.log', FormatDateTime('hh:nn:ss:zzz', Now)+ ' - Bytes Lido: '+IntToStr(BytesRead)); if (BytesRead = 0) then Break; Resp.Write(aBuffer, BytesRead); end; if Resp.Size > 0 then begin Resp.Position := 0; //DEBUG //WriteToTXT('c:\temp\httpreqresp.log', FormatDateTime('hh:nn:ss:zzz', Now)+ ' - Total Lido: '+IntToStr(Resp.Size)); //Resp.Position := 0; //FData := ReadStrFromStream(Resp, Resp.Size); //Resp.Position := 0; //WriteToTXT('c:\temp\httpreqresp.log', FData); Ok := True; end; end; //< * >// FINAL... if not OK then begin UpdateErrorCodes(pRequest); //DEBUG //WriteToTXT('c:\temp\httpreqresp.log', FormatDateTime('hh:nn:ss:zzz', Now)+ // ' - Erro WinNetAPI: '+IntToStr(InternalErrorCode)+' HTTP: '+IntToStr(HTTPResultCode)); raise EACBrHTTPReqResp.Create('Erro: Requisição não enviada.' + sLineBreak + IntToStr(InternalErrorCode) + ' - ' + GetWinInetError(InternalErrorCode)); end; finally InternetCloseHandle(pRequest); end; finally InternetCloseHandle(pConnection); end; finally InternetCloseHandle(pSession); if HCertContext<>0 then //< * >// CertContext.FreeContext(HCertContext); end; end; ----------------------------------------------------------------------------- Teste 5 Aqui já ocorrem os erros "normais" de retorno do webservice. <Messages> <Message> <Id>20</Id> <Type>0</Type> <Description> Data de emissão (30/12/1899) do RPS deve pertencer ao intervalo de datas informado no registro 10. (Inicial: 07/03/2016 - Final: 07/03/2016) </Description> <LinErr>2</LinErr> </Message> <Message> <Id>20</Id> <Type>0</Type> <Description>Campo nome do município do tomador obrigatório.</Description> <LinErr>2</LinErr> </Message> </Messages> --> Resolvido incuindo: DataEmissao := Now; DataEmissaoRps := Now; //<*>// Tomador.Endereco.xMunicipio := 'JAU'; //<*>** ----------------------------------------------------------------------------- Teste 6 Erro de número do RPS inválido... <Messages> <Message> <Id>10</Id> <Type>0</Type> <Description> -Número do RPS incorreto. Valor informado: 800, Valor esperado: 805 </Description> <LinErr>0</LinErr> </Message> </Messages> Resolvido --> Alterando o número para 805 ----------------------------------------------------------------------------- Teste 7 Codigo do erro: Arquivo Aceito Mensagem: Arquivo Aceito. Protocolo em processamento. Consulte o protocolo para conferir o processamento A Situação [Consultar Situação do Lote] não foi disponibilizada pelo provedor CONAM. ... Agora preciso "debugar" com calma... mas a pilha acabou. Amanhã de manhã eu continuo... Anexando o CONAM.INI e ACBrHTTPReqResp.pas CONAM.INI ACBrHTTPReqResp.pas
-
Bom... desta vez a resposta veio "didática" ... "Boa tarde, A contingência da NFC-e é o SAT, o contribuinte que for utilizar a NFC-e deve possuir ao menos 1 SAT ativo. Evite reclamações de consumidores! Transmita os Cupons Eletrônicos para a Sefaz em menos de dez dias, caso contrário eles serão considerados inábeis. Verifique também se a comunicação com o qualquer endereço pertencente ao domínio "rnp.br" e "ntp.br" na porta NTP (UDP-123) está liberada. Consulte a legislação e os documentos: Acessando http://www.fazenda.sp.gov.br/sat/ , no menu lateral “Legislação”, opção “Legislação em Vigor” * Portaria CAT-147, de 05-11-2012 Acessando http://www.fazenda.sp.gov.br/sat/ , no menu lateral “Fale Conosco e Dúvidas Frequentes”, opção “Dúvidas Frequentes de Contribuintes” * Perguntas Frequentes de Contribuintes. Através do link: http://www.fazenda.sp.gov.br/guia/default.shtm * Diversos passo a passo, por exemplo, como fazer login no sistema, como ativar o SAT, etc Sobre a NFCe: http://www.nfce.fazenda.sp.gov.br/NFCePortal/Paginas/DuvidasFrequentes.aspx Atenciosamente, Secretaria da Fazenda do Estado de São Paulo" Nem sei porque estou perdendo tempo com isto... Enquanto eu esperava atendimento no posto fiscal, falando com o atendente, e tentando explicar pra ele como funciona o o SAT, e blá,blá,blá, ele me solta: Porque você não vende sem nota ? Bom, certamente é melhor escutar isso do que ser surdo... []´s Edson.
-
Boa tarde Italo. Atualizei agora via svn, mas percebi que você não "subiu" algumas units. - Units alteradas para Gerar/Ler XMLs no padrao CONAM: \ACBr\Fontes\ACBrDFe\ACBrNFSe\PCNNFSe pnfsConversao.pas pnfsNFSeG.pas pnfsNFSeR.pas pnfsConsSitLoteRpsResposta.pas pnfsLerListaNFSe.pas \ACBr\Fontes\ACBrDFe\ACBrDFeCapicom.pas - na procedure TDFeCapicom.CarregarCertificado, ignorar se provedor não utilizar certificado \ACBr\Fontes\PCNComum\pcnLeitor.pas - na function TLeitor.rCampo, adicionado suporte a data e data/hora fora de padrão \ACBr\Fontes\ACBrCapicom\ACBrHTTPReqResp.pas - na procedure TACBrHTTPReqResp.Execute, alteração para ignorar certificado - incluída a IgnoreCerticateErrors, para ignorar o erro ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED \ACBr\Fontes\ACBrDFe\ACBrNFSe\ACBrNFSeWebServices.pas - procedure TNFSeWebService.InicializarServico, setar UseCertificate=False para o CONAM (Talvez um boa ideia seja criar mais um campo no arquivo INI, tipo UsaCertificado=False) ==>> Esta vc já resolveu ! Na impressão dos ítens da NFSe, para funcionar corretamente a quebra de linha na impressão, alterei: \ACBr\Fontes\ACBrDFe\ACBrNFSe\DANFSE\Fortes\ACBrNFSeDANFSeRLClass.pas - procedure TACBrNFSeDANFSeRL.ImprimirDANFSe: de: frlDANFSeRLRetrato.QuebradeLinha(TACBrNFSe(ACBrNFSe).Configuracoes.WebServices.QuebradeLinha); para: frlDANFSeRLRetrato.QuebradeLinha(TACBrNFSe(ACBrNFSe).Configuracoes.Geral.ConfigGeral.QuebradeLinha); assim a quebra de linha vem do arquivo "PROVEDOR".INI -- Pra você ficar mais tranquilo sobre as alterações, testei emitindo 20 NFSe em produção, e em seguida emiti algumas NFe´s de venda, pra garantir que a alteração na ACBrDFeCapicom / ACBrHTTPRqResp não afetem os outros documentos. As units alteradas estão no post de cima: http://www.projetoacbr.com.br/forum/applications/core/interface/file/attachment.php?id=22586 []´s Edson.
-
Boa tarde Marcos. Uma das alterações / sugestões que fiz para o provedor CONAM: "\ACBr\Fontes\ACBrDFe\ACBrNFSe\ACBrNFSeWebServices.pas - procedure TNFSeWebService.InicializarServico, setar UseCertificate=False para o CONAM (Talvez um boa ideia seja criar mais um campo no arquivo INI, tipo UsaCertificado=False)" Se puder ajudar nos testes, as alterações estão no link: http://www.projetoacbr.com.br/forum/applications/core/interface/file/attachment.php?id=22586 A procedure alterada ficou assim: procedure TNFSeWebService.InicializarServico; begin { Sobrescrever apenas se necessário } inherited InicializarServico; FProvedor := FPConfiguracoesNFSe.Geral.Provedor; if FPConfiguracoesNFSe.Geral.ConfigGeral.VersaoSoap = '1.2' then FPMimeType := 'application/soap+xml' else FPMimeType := 'text/xml'; FPDFeOwner.SSL.UseCertificate := FPConfiguracoesNFSe.Geral.ConfigGeral.UseSSL; FPDFeOwner.SSL.UseSSL := FPConfiguracoesNFSe.Geral.ConfigGeral.UseSSL; if FProvedor=proCONAM then //Provedor CONAM não requer certificado, mas usa SSL (https) FPDFeOwner.SSL.UseCertificate := False; TACBrNFSe(FPDFeOwner).SetStatus(FPStatus); end; []´s Edson.
-
Acho que não estou sendo claro... O que estou falando não se aplica a estabelecimentos que atendem preferencialmente consumidor final (supermercados, farmácias, lojas de confecções), onde o pagamento normalmente é a vista (ou cartão). Não há necessidade de identificar o consumidor. Nestes casos, se o contribuinte passou a ser obrigado a emitir cupom fiscal, implanta-se o CFe-SAT. Estou falando de casos, como disse no primeiro post, em que o contribuinte já emite nota fiscal eletrônica - desde 2009 - (NFe 55), em média 350 notas por mês. Todos os clientes já tem cadastro previamente aprovado. Além da NFe, o contribuinte ainda usa o famoso talãozinho D1 - Venda ao consumidor (que é usado par emitir 4 ou 5 "notinhas" por mês), utilizado apenas para raras vendas a vista, em que não haja necessidade de cadastrar o consumidor final. (5 notas D1 / 350 NFe = 0,014% das notas são D1) É este "talãozinho" o causador do problema. O escritório contábil diz ao contribuinte que ele tem que implantar o SAT, porque o posto fiscal não está mais liberando a impressão dos "talãozinho D1". Então, por enquanto o contribuinte está cadastrando estes clientes, que geralmente nem querem ser cadastrados, só querem "uma notinha". Neste caso uma NFCe cairia bem. Se houver problemas de contingência aí sim emite-se uma NFe. O que questionei agora na SEFAZ é sobre: "Existe previsão na Portaria CAT 147 de 2012 que trata do SAT permitindo ao contribuinte optar por emitir NF-e (modelo 55) ou NFC-e (modelo 65) nas hipóteses em que a legislação prevê a emissão de Cupom Fiscal, ao invés de emitir CF-e-SAT. Assim, o contribuinte obrigado à emissão de CF-e-SAT poderá, alternativamente, emitir NF-e ou NFC-e." Percebe a falta de lógica ? - Se existe previsão na portaria CAT 147,que permite optar por NFC-e ao invés do CFe-SAT, porque eu tenho que ter um aparelho SAT vinculado ao CNPJ ? (sim, já sei que a contingência da NFCe é um SAT) Quem vai ser louco de optar por NFC-e (que é a quase que a mesma coisa que CFe) se tem que ter um aparelho SAT vinculado ? Então é só ir direto pro SAT. Esta "brecha" na portaria CAT fica sem sentido. Vou aguardar a resposta, depois posto aqui... []´s Edson.
-
Só ressaltando que no meu caso, seria para situações onde não há exigência de ECF ou CFe-SAT, o contribuinte já emite NFe. A NFCe seria para substituir o talão D1, que quase nem é usado. Seria "desperdício" tem um SAT pra emitir 4 ou 5 cupons por mês... "Existe previsão na Portaria CAT 147 de 2012 que trata do SAT permitindo ao contribuinte optar por emitir NF-e (modelo 55) ou NFC-e (modelo 65) nas hipóteses em que a legislação prevê a emissão de Cupom Fiscal, ao invés de emitir CF-e-SAT. Assim, o contribuinte obrigado à emissão de CF-e-SAT poderá, alternativamente, emitir NF-e ou NFC-e." Como o tema é contraditório e a lei é "interpretável", eu interpreto de um jeito, o chefe do posto fiscal de outro, e os nobres colegas de outro, fiz nova consulta, questionando a obrigatoriedade de um aparelho SAT, para poder emitir NFCe. Espero que a resposta deles não seja somente um Control C + Control V como tem geralmente ocorre. Assim que responderem, posto aqui. []´s Edson.
-
Bom dia. Fiz uma consulta ao SEFAZ/SP a resposta; "Em São Paulo o contribuinte poderá optar entre as duas soluções, uma não exclui a outra, o contribuinte, no entanto, se for utilizar a NFC-e deve possuir pelo menos um SAT ativo como contingência da NFC-e. Existe previsão na Portaria CAT 147 de 2012 que trata do SAT permitindo ao contribuinte optar por emitir NF-e (modelo 55) ou NFC-e (modelo 65) nas hipóteses em que a legislação prevê a emissão de Cupom Fiscal, ao invés de emitir CF-e-SAT. Assim, o contribuinte obrigado à emissão de CF-e-SAT poderá, alternativamente, emitir NF-e ou NFC-e. Base legal: Artigos 28 e 28-A da Portaria CAT 147 de 2012 e § 6º do Artigo 2° da Portaria CAT 12, de 04-02-2015. " Fui pessoalmente ao posto fiscal e falei com o chefe do posto. Ele me disse que nestas situações (contribuinte já emite NFe para a quase totalidade das operações, e mantém um talão D1-Consumidor que só é utilizado em vendas a vista, que são poucas), posso sim utilizar a NFCe, sem precisar do SAT-ECF, pois a emissão será esporádica, e se houver algum problema emite-se a NFe (55), não precisando do SAT para contingência. []´s Edson.
-
Questão do espaçamento resolvida. No meu caso, na unit do provedor CONAM (pnfsNFSeW_CONAM.pas) function TNFSeW_CONAM.GerarXml: Boolean; var Gerar: Boolean; begin Gerador.Opcoes.RetirarEspacos := False; Gerador.Opcoes.DecimalChar := ','; Gerador.ArquivoFormatoXML := ''; Desta forma o XML é gerado com os espaços duplos e a impressão sai da forma "correta". O problema é que alterei a fonte para "Courier New" na unit ACBrNFSeDANFSeRLClass, e toda vez que houver uma atualização, vou ter que refazer. procedure TACBrNFSeDANFSeRL.ImprimirDANFSe(NFSe: TNFSe = nil); var i: integer; frlDANFSeRLRetrato: TfrlDANFSeRLRetrato; begin frlDANFSeRLRetrato := TfrlDANFSeRLRetrato.Create(Self); try frlDANFSeRLRetrato.rlmDescricao.Font:='Courier New'; frlDANFSeRLRetrato.rllCodVerificacao.Font.Size:=9; frlDANFSeRLRetrato.QuebradeLinha(TACBrNFSe(ACBrNFSe).Configuracoes.Geral.ConfigGeral.QuebradeLinha); Uma sugestão seria criar mais uma propriedade no arquivo INI para "RemoverEspacos", outra para Fonte... e vai chegar um dia que o INI vai ter tantos parâmetros que... []´s Edson
-
Pegar as informações da NFS-e ao enviar o RPS (protocolo)
Edson.pol replied to walter faria's tópico in ACBrNFSe
Beleza Italo... Vou pro terceiro round contra o CONAM (o bárbaro)... Por enquanto é ele quem está ganhando... Vou ver se consigo pegar o protocolo em algum outro ponto. []´s Edson. -
Pegar as informações da NFS-e ao enviar o RPS (protocolo)
Edson.pol replied to walter faria's tópico in ACBrNFSe
Boa tarde ! Estou me baseando no demo do ACBrNFSe para pegar o número do protocolo, após o comando Enviar... (Provedor CONAM) AlimentaComponente(sAux); ACBrNFSe1.Enviar(vNumLote); sProtocolo := ACBrNFSe1.WebServices.EnviarLoteRPS.Protocolo; Ocorre que, se após o envio, recebo uma mensagem "Protocolo em processamento", e o fluxo não segue... é disparada uma exception com a mensagem e não consigo pegar o nr do protocolo para salvar no banco de dados. Mesmo ajustando: ConsultarLoteAposEnvio = True AjustaAguardaConsultaRet = True AguardarConsultaRet = 4000 (já tentei ir aumentando de mil em mil, até 10.000) IntervaloEntreTentativas = 1000 (também aumentei de mil em mil) Estou fazendo da forma correta ? []´s Edson -
Bom dia. DANFSe - Fortes Report. Um cliente precisa que a discriminação dos serviços saia com a fonte "Courier New", para que o serviço e valor individual fique alinhado, em colunas. Tipo: DISCRIMINAÇÃO QTD PREÇO UNITÁRIO PREÇO TOTAL TROCA DE ÓLEO............ 1 100,00 100,00 ALINHAMENTO DE PNEUS..... 4 20,00 80,00 Mas os espaços duplos estão sendo trocados por espaços simples, fica assim: DISCRIMINAÇÃO QTD PREÇO UNITÁRIO PREÇO TOTAL TROCA DE ÓLEO............ 1 100,00 100,00 ALINHAMENTO DE PNEUS..... 4 20,00 80,00 Não estou encontrando o "culpado"... Alguém já precisou fazer a impressão desta forma ? []´s Edson.
-
Bom dia Italo. Testei agora com emissão de NFe com certificado A3 e NFSe sem certificado (em produção), e deu tudo certo. Acho que a alteração não afetará o funcionamento em outras situações. O principal problema era com a " ACBrHTTPReqResp.pas ", que dava erro de certificado, mesmo quando o nr de séria estava em branco. Depois que acrescentei a função "IgnoreCerticateErrors", deu tudo certo (ela só entrará em ação se ocorrer o erro: ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED) []´s Edson.
-
Boa noite Italo. Você conseguiu analisar as units do provedor CONAM do primeiro post ? Atualizei o ACBr ontem e parou de funcionar o envio. Fiz um "debug" geral, e vi que faltam algumas rotinas, porque o CONAM não usa certificado, mas usa SSL. Vou postar aqui um resumo das units que alterei depois que fiz o update pelo svn, para que seja possível "consumir" o web-service deles. (e para facilitar um pouco o seu trabalho com o "merge") \ACBr\Fontes\ACBrDFe\ACBrDFeCapicom.pas - na procedure TDFeCapicom.CarregarCertificado, ignorar se provedor não utilizar certificado \ACBr\Fontes\PCNComum\pcnLeitor.pas - na function TLeitor.rCampo, adicionado suporte a data e data/hora fora de padrão \ACBr\Fontes\ACBrCapicom\ACBrHTTPReqResp.pas - na procedure TACBrHTTPReqResp.Execute, alteração para ignorar certificado - incluída a IgnoreCerticateErrors, para ignorar o erro ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED \ACBr\Fontes\ACBrDFe\ACBrNFSe\ACBrNFSeWebServices.pas - procedure TNFSeWebService.InicializarServico, setar UseCertificate=False para o CONAM (Talvez um boa ideia seja criar mais um campo no arquivo INI, tipo UsaCertificado=False) Units alteradas para Gerar/Ler XMLs no padrao CONAM: \ACBr\Fontes\ACBrDFe\ACBrNFSe\PCNNFSe pnfsConversao.pas pnfsNFSeG.pas pnfsNFSeR.pas pnfsConsSitLoteRpsResposta.pas pnfsLerListaNFSe.pas Na impressão dos ítens da NFSe, para funcionar corretamente a quebra de linha na impressão, alterei: \ACBr\Fontes\ACBrDFe\ACBrNFSe\DANFSE\Fortes\ACBrNFSeDANFSeRLClass.pas - procedure TACBrNFSeDANFSeRL.ImprimirDANFSe: de: frlDANFSeRLRetrato.QuebradeLinha(TACBrNFSe(ACBrNFSe).Configuracoes.WebServices.QuebradeLinha); para: frlDANFSeRLRetrato.QuebradeLinha(TACBrNFSe(ACBrNFSe).Configuracoes.Geral.ConfigGeral.QuebradeLinha); assim a quebra de linha vem do arquivo "PROVEDOR".INI e também o arquivo CONAM.INI, com alguns ajustes. -- Anexo arquivo com as units alteradas. []´s Edson Polonio. ACBrNFSe_CONAM 01_03_2016.rar
-
Boa tarde. O meu problema eram units em "conflito". Apaguei a pasta ACBr, e atualizei pelo SVN e está tudo OK agora. O conflito ocorreu porque eu estou testando alterações para a NFSe com provedor que não usa certificado, e alterei algo em algum lugar que "zicou" []´s Edson.
-
Wilson. Depois que fizer o rateio do desconto nos ítems, some os valores do desconto rateado. Se houver diferença comparando com o valor original do desconto, normalmente de centavos, diminua o valor do desconto (ou aumente) do ítem de maior valor. []´s Edson.
-
Bom dia. Desde ontem tem ocorrido um esporádico ao enviar NFe´s No botão "Criar e enviar": NFe não foi enviada. Erro: Não existem mais arquivos. URL:https://nfe.fazenda.sp.gov.br/ws/nfeautorizacao.asmx SOAPAction:http://www.portalfiscal.inf.br/nfe/wsdl/NfeAutorizacao Motivo: No botão "Consultar" a msg muda para: NFe não foi enviada. Erro: Não é possível criar um arquivo já existente URL:https://nfe.fazenda.sp.gov.br/ws/nfeautorizacao.asmx SOAPAction:http://www.portalfiscal.inf.br/nfe/wsdl/NfeAutorizacao Motivo: Nunca ocorreu este erro. Alguém tem alguma dica? []´s Edson
-
Moderador... Desculpe, postei no fórum errado... Procurei uma forma de mover ou excluir o tópico mas não encontrei. Estou postando no ACBrNFe...
-
Bom dia. Desde ontem tem ocorrido um esporádico ao enviar NFe´s No botão "Criar e enviar": NFe não foi enviada. Erro: Não existem mais arquivos. URL:https://nfe.fazenda.sp.gov.br/ws/nfeautorizacao.asmx SOAPAction:http://www.portalfiscal.inf.br/nfe/wsdl/NfeAutorizacao Motivo: No botão "Consultar" a msg muda para: NFe não foi enviada. Erro: Não é possível criar um arquivo já existente URL:https://nfe.fazenda.sp.gov.br/ws/nfeautorizacao.asmx SOAPAction:http://www.portalfiscal.inf.br/nfe/wsdl/NfeAutorizacao Motivo: Nunca ocorreu este erro. Alguém tem alguma dica? []´s Edson
-
Boa noite Italo. Estou anexando o único manual que recebi do suporte (.PDF) e um arquivo xml que foi gerado por um erro no site, mas serve pra ver a estrutura. Um ponto que percebi hoje é que enviando o RPS no Delphi, processando passo a passo com F8, da tudo certo, o RPS é recebido, gera o protocolo, consulta o protocolo e carrega a nota para impressão. Se executo no aplicativo, fora do Delphi, ao enviar um RPS, dá msg de arquivo aceito, "em processamento". Como está configurado para consultar o lote após o envio, achei que fosse por causa do nr de tentativas e intervalo entre tentativas, por isto criei o método FConsLote.Executar, para ficar igual ao TNFSeConsultarSituacaoLoteRPS.Executar, mas não sei se fiz da forma correta, porque não resolveu. Vou continuar tentando pra ver se entendo a causa disto. []´s Edson. webservicenfe2.pdf aws_nfe.aspx.xml
-
Boa noite. Fiz diversas alterações para incluir o provedor CONAM no trunk2. O envio de RPS, impressão e cancelamento estão funcionando. Segue um breve resumo: Cidades.INI - Alteração: [3525300] Nome=Jau UF=SP Provedor=CONAM Novo arquivo INI: CONAM.INI Unit nova: \ACBr\Fontes\ACBrDFe\ACBrNFSe\PCNNFSe\pnfsNFSeW_CONAM.pas Units alteradas para tratar os dados do provedor CONAM: \ACBr\Fontes\PCNComum\pcnConversao.pas \ACBr\Fontes\PCNComum\pcnGerador.pas \ACBr\Fontes\PCNComum\pcnLeitor.pas \ACBr\Fontes\PCNComum\pcnAuxiliar.pas \ACBr\Fontes\ACBrComun\ACBrUtil.pas \ACBr\Fontes\ACBrDFe\ACBrDFeWebService.pas \ACBr\Fontes\ACBrDFe\ACBrDFeUtil.pas \ACBr\Fontes\ACBrDFe\ACBrNFSe\ACBrNFSe.pas \ACBr\Fontes\ACBrDFe\ACBrNFSe\ACBrNFSeConfiguracoes.pas \ACBr\Fontes\ACBrDFe\ACBrNFSe\ACBrNFSeNotasFiscais.pas \ACBr\Fontes\ACBrDFe\ACBrNFSe\ACBrNFSeWebServices.pas \ACBr\Fontes\ACBrDFe\ACBrNFSe\PCNNFSe\pnfsEnvLoteRpsResposta.pas \ACBr\Fontes\ACBrDFe\ACBrNFSe\PCNNFSe\pnfsConversao.pas \ACBr\Fontes\ACBrDFe\ACBrNFSe\PCNNFSe\pnfsNFSeW.pas \ACBr\Fontes\ACBrCapicom\ACBrCapicomACBrHTTPReqResp.pas -------------------------------------- \ACBr\Fontes\ACBrCapicom\ACBrCapicomACBrHTTPReqResp.pas - Incluido: function IgnoreCerticateErrors para ignorar erros de certificado em provedor que não usa certificado, como o caso do CONAM -------------------------------------- \ACBr\Fontes\PCNComum\pclLeitor.pas - function TLeitor.rCampo - Alterado para suportar datas no formato dd/mm/aaa ou datas inválidas tcDat : begin if length(ConteudoTag)>0 then if Pos('/',ConteudoTag)=1 then // Data está errada result:=0 else if Pos('/',ConteudoTag)=3 then // Data está no formato dd/mm/aaaa result := EncodeDate(StrToInt(copy(ConteudoTag, 07, 4)), StrToInt(copy(ConteudoTag, 04, 2)), StrToInt(copy(ConteudoTag, 01, 2))) else // Data está no formato aaaa/mm/dd result := EncodeDate(StrToInt(copy(ConteudoTag, 01, 4)), StrToInt(copy(ConteudoTag, 06, 2)), StrToInt(copy(ConteudoTag, 09, 2))) else result:=0; end; - Em anexo, units alteradas. []´s Edson. Units provedor CONAM.rar
-
Boa tarde Juliana. Tenho problemas com rejeição de remessas sempre que atualizo o ACBrBoleto, por causa do Header da Remessa 400. Aí volto minha unit antiga e resolve. "027 a 046 – Códigos da Empresa Será informado pelo Bradesco, quando do cadastramento da Conta beneficiário na sua Agência. Esse código deve ser alinhado à direita com Zeros à esquerda." Repare que no header deve constar o código que o banco forneceu ao cliente : 00000000000004042751 (este não é o Codigo do Cedente) e na transação, vai Carteira+Agencia+Conta (ou seja, "CodigoCedente") 1 2 3 4 5 6 123456789012345678901234567890123456789012345678901234567890 01REMESSA01 COBRANCA00000000000004042751IND.COM.CALCAD 1000000000000000000000090006000584149 1000000000000000000000090006000584149 1000000000000000000000090006000584149 Veja a unit do Santander que também utiliza o "CodigoTransmissao" no header. []´s Edson