Edson.pol
Membros-
Total de ítens
210 -
Registro em
-
Última visita
-
Days Won
2
Tipo de Conteúdo
Blocks
Notes ACBrLibNFe
Fóruns
Downloads
Calendário
Tudo que Edson.pol postou
-
Bom dia Graça. O estranho é que só uso campos "currency" para valores monetários, que só tem duas decimais. Emiti vários aqui, com valores parecidos, e com um um backup do cliente, e saíram todos certos.
-
Bom dia. Um cliente me reportou um problema, com o Bradesco, que por enquanto só ocorreu uma vez. Um boleto com valor de 92,52, na linha digitável saiu 92,53 Não estou conseguindo reproduzir o erro aqui. Alguém já passou por isto ? []´s Edson.
-
Problema de interpretação, isso pode Arnaldo?
Edson.pol replied to Hernani Prado Beira's tópico in Legislação Fiscal e Tributária
Bom dia Hernani. Na minha visão, se o emitente é optante pelo Simples Nacional, não há cobrança de DIFAL/FCEP. A cobrança foi suspensa pelo STF. http://www.contabilidadedeschamps.com.br/Noticias/STF-suspende-cobranca-do-diferencial-de-aliquota-do-ICMS/318/ Se não está conseguindo validar as notas, verifique se os Schemas não estão desatualizados. []´s Edson. -
Assinar um XML com as funções do DFeCapicom
Edson.pol replied to Edson.pol's tópico in Object Pascal - Delphi & Lazarus
Boa noite. Estou tentando assinar um arquivo XML com digest SHA256, mas está ocorrendo erro: The DigestMethod Algorithm "http://www.w3.org/2001/04/xmlenc#sha256" is not supported. Criei as funções Assinar256, SignatureElement256, AdicionarSignatureElement256 em ACBrDFeSSL, para não alterar as funções atuais, aí tento assinar com: FXMLAssinado := ACBrEFinanceira1.SSL.Assinar256(FXMLOriginal , 'eFinanceira', 'evtCadDeclarante'); e o erro é disparado. Será que o Delphi não assina com SHA256 ? A Receita Federal disponibilizou um programa assinador escrito em C#. Instalei o Visual Studio e testei, assina corretamente. function TDFeSSLClass.SignatureElement256(const URI: String; AddX509Data: Boolean; IdSignature: String; Digest:TSSLDgst): String; begin {(*} Result := '<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"' + IdSignature + '>' + '<SignedInfo>' + '<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />' + '<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig-more#rsa-sha256"/>' + //ALTERACAO PARA SHA256 '<Reference URI="' + IfThen(URI = '', '', '#' + URI) + '">' + '<Transforms>' + '<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />' + '<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />' + '</Transforms>' + '<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />'+ // ALTERACAO PARA SHA256 '<DigestValue></DigestValue>' + '</Reference>' + '</SignedInfo>' + '<SignatureValue></SignatureValue>' + '<KeyInfo>' + IfThen(AddX509Data, '<X509Data>' + '<X509Certificate></X509Certificate>' + '</X509Data>', '')+ '</KeyInfo>'+ '</Signature>'; {*)} end; CadDeclaranteLote-ASSINADO.xml -
Assinar um XML com as funções do DFeCapicom
Edson.pol replied to Edson.pol's tópico in Object Pascal - Delphi & Lazarus
Boa tarde Juliomar ! Era exatamente isto que eu precisava... Estava me matando tentando criar um componente baseado no ACBrCTe... mas ele é bem complexo. Este ACBrBlocoX tem a estrutura bem parecida com o que pede o SPED e-Financeira. O duro é que vou ter que gerar apenas arquivos vazios, somente a abertura e encerramento, sem movimento. Um trabalhão lascado, pra nada. A Receita Federal não tem mais plantão de dúvidas para pessoa jurídica, somente para pessoa física. Não responde os e-mails, ninguém nas agências orienta o contribuinte sobre SPED e-financeira (eles nem sabem do que se trata). Só sabem cobrar multa por atraso na entrega. Se tudo der certo, vou criar um componente "ACBrEFinanceira", e depois envio para análise. Muito obrigado. Edson. -
Assinar um XML com as funções do DFeCapicom
um tópico no fórum postou Edson.pol Object Pascal - Delphi & Lazarus
Boa noite. Preciso assinar arquivos XML (do SPED e-Financeira) com chave SHA-2 (imagino que seja SHA256) Tentei criar um componente baseado no ACBrDFe, mas o prazo está apertado, e foi mais fácil criar o XML "na mão". Estou tentando utilizar as funções da unit ACBrDFeCapicom para assinar o XML, mas não estou tendo sucesso. Exemplo: textoXML:= String com o conteúdo do arquivo xmlAssinado := Assinar( textoXML , 'evtCadDeclarante' , 'id' ); Esta provavelmente não é a forma correta. Alguém teria um exemplo de como chamar a função, se é que isto é possível ? Grato. Edson. -
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.
-
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.
-
Boa tarde Graça. Eu resolvi setado a propriedade 'CodigoCedente' com o 'código da empresa no banco'. (Código com 20 dígitos como este : 00000000000004042751) Assim a remessa e os boletos são gerados corretamente. []´s Edson.
-
Alterada também a unit ACBrNFSeDANFSeRLRetrato.pas, para corrigir a impressão do campo "competência". []´s Edson. ACBrNFSeDANFSeRLRetrato.pas
-
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 pnfsNFSeW_CONAM.pas
-
Boa tarde. Você chegou a ver se o xml foi gerado com os espaços ? Eu estou usando o Fortes e está funcionando (provedor CONAM) Tem como testar com o Fortes ? []´s Edson.
- 6 replies
-
- nfs-e
- fastreport
- (e 2 mais)
-
Boa tarde Roger. Tenho alguns clientes que se encaixam no 'rol' dos obrigados (cooperativas de crédito). Estava esperando algum milagre (prorrogação) e por falta ainda estou empurrando 'pra amanhã'. Agora o amanhã chegou. Se puder ajudar no desenvolvimento e testes, pode contar comigo. []´s Edson
-
Bom dia Frederico. Acho que não expliquei direito no post anterior. O que está errado, aparentemente é a tag NCM... está faltando 1 caracter. como está no arquivo: <NCM>99999999/NCM> como deveria estar: <NCM>99999999</NCM> []´s Edson.
-
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.
