-
Total de ítens
111 -
Registro em
-
Última visita
Tipo de Conteúdo
Blocks
Notes ACBrLibNFe
Fóruns
Downloads
Calendário
Tudo que rodrigod6 postou
-
Bom dia, O Ajuste SINIEF nº 11/19 foi alterado de 01/01/2022 para 03/04/2023, conforme o Ajuste SINIEF nº 12/21! Correto !?!? AJUSTE SINIEF Nº 12, DE 08 DE JULHO DE 2021 Publicado no DOU de 12.07.21, pelo Despacho 50/21. Dispensada AIR, conforme Nota Técnica Ascif/Gab/RFB nº 1, de 07.07.21 Altera o Ajuste SINIEF nº 11/19, que altera o Convênio S/Nº, de 1970, que instituiu o Sistema Nacional Integrado de Informações Econômico-Fiscais – SINIEF, relativamente ao Código Fiscal de Operações e Prestações – CFOP. O Conselho Nacional de Política Fazendária - CONFAZ - e a Secretaria da Receita Federal do Brasil, na 181ª Reunião Ordinária do Conselho, realizada em Brasília, DF, no dia 08 de julho de 2021, tendo em vista o disposto no art. 199 do Código Tributário Nacional (Lei nº 5.172, de 25 de outubro de 1966), resolvem celebrar o seguinte A J U S T E Cláusula primeira O inciso I da cláusula quarta do Ajuste SINIEF nº 11, de 05 de julho de 2019, passa a vigorar com a seguinte redação: “I - de 03 de abril de 2023, em relação aos incisos I e III da cláusula primeira e ao inciso II da cláusula segunda deste ajuste;”. Cláusula segunda Este ajuste entra em vigor na data da sua publicação no Diário Oficial da União, produzindo efeitos a partir do primeiro dia do primeiro mês subsequente ao da publicação. Fontes: https://www.confaz.fazenda.gov.br/legislacao/ajustes/2019/ajuste-sinief-11-19 https://www.confaz.fazenda.gov.br/legislacao/ajustes/2021/ajuste-sinief-12-21
-
Boa tarde, Olhem que interessante, o (no seg. R, posição 66 (Código da multa)) código zero não consta no manual do Santander, mas vejam o retorno do pessoal do Santander: Prezados bom dia, como não há a intenção da cobrança da multa então é necessário manter: Posição 66 código 0 Posição 67-89 manter zerado Entrega Eletronica - Implantacao <[email protected]>; Com isso, entendo, que quando o percentual de multa for zero, teria que deixar como estava antes , 0 no campo do código da multa, apesar de não constar no manual. Citando o trecho que o Dercide tinha passado como estava o ACBr Antes: Antes: IfThen((PercentualMulta > 0), IfThen(MultaValorFixo,'1','2'), '0') + // 66 - 66 1-Cobrar Multa Valor Fixo / 2-Percentual / 0-Não cobrar multa Verificando a última versão, passada pelo Junior Santos, no dia 01/09/2020, vi que foi modificado no ACBr, para quando não tiver multa não gerar o SEGMENTO R. if (PercentualMulta > 0) then begin Inc(ISequencia); {SEGMENTO R} Ou seja só vai gerar o segmento R, quando tiver multa. Mas vejam que no segmento R, também temos as mensagens 3(posição 100 a 139) e mensagem 4 (posição 140 a 179) que são impressas nos boletos quando emissão pelo banco. Então no caso de um cliente que é o banco quem emite, e que não utiliza a multa, não vai mais sair as obs. Acho que somente, o que tinha antes já resolveria: IfThen((PercentualMulta > 0), IfThen(MultaValorFixo,'1','2'), '0') + // 66 - 66 1-Cobrar Multa Valor Fixo / 2-Percentual / 0-Não cobrar multa Acredito que não precisaria, remover o segmento R todo. Segue em anexo a sugestão de como estava antes, mas com a mudança para zero quando não tiver o percentual, sem ter que excluir o Segmento R. Abraços, ACBrBancoSantander.pas
-
É isso mesmo, a dúvida só era sobre a data e valor, que no meu caso o cliente não utiliza data e valor da multa. quando eu mando zerado os campos(data e valor da multa), o pessoal da homologação esta retornando como errado. por isso queria ver se no teu caso você tinha a data e valor e/ou percentual !! para comparar, mas eu acho que deve ter a ver com a terceirizada que esta obrigado o valor. Estou aguardando o retorno deles de como não informar se só temos o valor 1 e 2. Obrigado pelo retorno, abs
-
Boa tarde Dercide, Eu sempre enviei como 0, mesmo não tendo o campo como você citou. e que estava na versão antiga! Nesta semana estou homologando um cliente, e gerou com 2, e o pessoal da homologação retornou seg R posição 66 código 2)porem na posição 67 a 89 não informa data e valor que deseja para cobrança campos obrigatórios a serem preenchido quando informado código 1 ou 2 na posição 66. Mas não estou enviando a multa, pois o cliente não usa multa! No seu caso você utilizou 2 e preencheu estes campos data e valor? ou passou em branco?
-
Bom dia! A prefeitura de SJP me retornou que a consulta foi feita, seguindo o padrão deles de maneira correta! Obrigado, abs,
- 6 replies
-
- 1
-
- referenceuri
- prosjp
- (e 3 mais)
-
Boa tarde Italo, Atualizei os fontes, gerou conforme o exemplo da prefeitura. Vamos atualizar os clientes, e contactar a prefeitura para verificar se tudo ficou correto! Muito Obrigado pela ajuda,
- 6 replies
-
- 2
-
- referenceuri
- prosjp
- (e 3 mais)
-
Bom dia Italo, Estou anexando um XML de consulta. O arquivo de exemplo, entrei na página da prefeitura Primeiro a página principal https://nfe.sjp.pr.gov.br/servicos/issOnline2/ Acessando a página temos a área do desenvolvedor Nesta página https://nfe.sjp.pr.gov.br/servicos/issOnline2/desenvolvedor/ temos a seção XML de exemplo dos métodos, nela temos o exemplo ConsultarLoteRpsV3 https://nfe.sjp.pr.gov.br/servicos/issOnline2/ws/schemes/ConsultarLoteRpsEnvio.xml Mesmo assim vou realizar o download do exemplo deles e anexar aqui. 01-74580479-con-lot.xml (XML Gerado pelo ACBr) ExemploSJP-ConsultarLoteRpsEnvio.xml (Exemplo do Site) 01-74580479-con-lot.xml ExemploSJP-ConsultarLoteRpsEnvio.xml
- 6 replies
-
- referenceuri
- prosjp
- (e 3 mais)
-
Boa tarde, O Site da prefeitura de SJP(São José dos Pinhais), começou a mostrar uma mensagem em seu site: ASSINATURA DIGITAL WEB SERVICE Prezado usuario(a), Caso sua empresa consulte o Sistema de Nota Fiscal Eletronica via Web Service, verifique se os servicos abaixo relacionados estão com a assinatura digital conforme orientações disponiveis na área do desenvolvedor. Servicos utilizados sem a assinatura digital: ConsultarSituacaoLoteRpsEnvio - 03/02/2020 16:40:36 - 191.177.199.99 ConsultarLoteRpsEnvio - 03/02/2020 16:40:36 - 191.177.199.99 Informamos que os arquivos fora dos padrães estabelecidos na documentação serão bloqueados a partir de 31/03/2020. Mais informações sobre como assinar as consultas estão disponiveis em nossa area do desenvolvedor no link https://nfe.sjp.pr.gov.br/servicos/issOnline2/desenvolvedor Revisando a geração do arquivo XML de consulta, constatei que o mesmo já estava com a assinatura. Entrei em contato com a prefeitura para averiguar e me informaram que está faltando referenciar o que está assinando: Reference URI="" Analisando o exemplo que eles passaram esta dessa maneira <Reference URI="#consultar"> E no XML enviado esta -<Reference URI=""> Fiz uma revisão no Acbr, e vi que ele é gerado na ACBrDFeUtil.pas function SignatureElement(const URI: String; AddX509Data: Boolean; const IdSignature: String; const Digest: TSSLDgst): String; var MethodAlgorithm, DigestAlgorithm: String; begin case Digest of dgstSHA256: begin MethodAlgorithm := 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256'; DigestAlgorithm := 'http://www.w3.org/2001/04/xmlenc#sha256'; end; dgstSHA512: begin MethodAlgorithm := 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha512'; DigestAlgorithm := 'http://www.w3.org/2001/04/xmlenc#sha512'; end; else begin MethodAlgorithm := 'http://www.w3.org/2000/09/xmldsig#rsa-sha1'; DigestAlgorithm := 'http://www.w3.org/2000/09/xmldsig#sha1'; end; end; {(*} 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="'+MethodAlgorithm+'" />' + '<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="'+DigestAlgorithm+'" />' + '<DigestValue></DigestValue>' + '</Reference>' + '</SignedInfo>' + '<SignatureValue></SignatureValue>' + '<KeyInfo>' + IfThen(AddX509Data, '<X509Data>' + '<X509Certificate></X509Certificate>'+ '</X509Data>', '')+ '</KeyInfo>'+ '</Signature>'; {*)} end; Que é chamada da function AdicionarSignatureElement na ACBrDFeSSL.pas function TDFeSSLXmlSignClass.AdicionarSignatureElement(const ConteudoXML: String; AddX509Data: Boolean; const docElement, IdSignature: String; const IdAttr: String = ''): String; var URI, TagEndDocElement: String; I: Integer; begin URI := ExtraiURI(ConteudoXML, IdAttr); TagEndDocElement := '</' + docElement + '>'; I := PosLast(TagEndDocElement, ConteudoXML); if I = 0 then raise EACBrDFeException.Create('Não encontrei final do elemento: ' + TagEndDocElement); Result := copy(ConteudoXML, 1, I - 1) + SignatureElement(URI, AddX509Data, IdSignature, FpDFeSSL.SSLDgst) + copy(ConteudoXML, I, Length(ConteudoXML)); end; O que ocorre é que esse IdAttr, em determinado momento não é passado o valor para a rotina. Então não consegui identificar uma forma de passar a configuração para alterar esta informação. Alguém sabe como eu poderia gerar a tag Reference URI= com o valor #consultar? Obrigado
- 6 replies
-
- referenceuri
- prosjp
- (e 3 mais)
-
Bom dia, A título de comentário, no github temos o projeto Api-Boleto, que foi implementado em Linguagem Go. Podemos verificar como é a implementação de outros bancos. Eles já tem implementado os bancos: Banco do Brasil Caixa Citibank Santander BradescoShopFacil BradescoNetEmpresas Itau https://github.com/mundipagg/boleto-api Não encontrei o layout dos bancos no projeto, mas temos outros tópicos que temos referências com os manuais. Mas tem esse que o Davi coloca o fonte da Caixa no último comentário e alguns layouts (bradesco, caixa)
-
Recebemos este e-mail sobre a atualização do ws da GNRE para a versão 2.00 Prezado Contribuinte, Informamos que a partir do dia 01/04/2019, o Portal GNRE terá sua versão atualizada para 2.0. A versão 2.0 contemplará três opções para geração das guias: 1. GNRE Simples - esta opção equivale à geração da GNRE atual, ou seja, geração de guia para apenas um pagamento. 2. GNRE com Múltiplos Documentos de Origem - nesta opção poderão ser adicionados múltiplos documentos de origem, desde que mantida a mesma UF destinatária, o mesmo Contribuinte Emitente, o mesmo Código de Receita e o mesmo Tipo de Documento de Origem. 3. GNRE com Múltiplas Receitas - nesta opção poderão ser adicionados diversos códigos de receitas, desde que se mantenha a mesma UF destinatária e o mesmo Contribuinte Emitente. Nesta opção serão aceitos vários códigos de receita, inclusive podendo repetir o mesmo código de receita. Para os contribuintes que utilizam os serviços (webservices) de automação que o Portal disponibiliza, será necessário adequar suas aplicações para a nova estrutura do XML versão 2.0. Haverá um período em que o Portal da GNRE aceitará as duas versões simultaneamente.Este período será para que as UFs e os contribuintes possam fazer os ajustes necessários para utilização desta versão. Ao fim deste período só serão aceitas requisições, via webservice, na nova versão. O período inicial da versão 2.0 será informado no Portal GNRE (Testes/Homologação e Produção) em momento posterior. Para maiores detalhes, acessar o Portal GNRE no ambiente de Testes/Homologação (http://www.testegnre.pe.gov.br) e clicar no menu Automação. Neste link, você encontrará: • Manual para Preenchimento do Lote: o Formato do arquivo (versão 1.0 e 2.0) o Dicionário de dados do arquivo XML (versão 1.0 e 2.0) o Regras de Preenchimento • Anexos • Links para as empresas solicitarem a utilização dos webservices • Manual de Integração do Contribuinte (versão 2.0) • Endereço dos serviços (webservices) Em caso de dúvidas encaminhar e-mail para [email protected]. Atenciosamente, Gestor Nacional do GNRE Secretaria da Fazenda do Estado de Pernambuco Na encontrei mais informações sobre o período que inicia o ambiente de testes. E também não encontrei informações sobre até quando as duas irão funcionar em paralelo. Alguém tem mais informações a respeito? Obrigado,
-
Acho que falta o c10_valorTotal no seu arquivo: <c10_valorTotal>55.81</c10_valorTotal> with ACBrGNRE1.Guias.Add.GNRE do begin ... c10_valorTotal := c06_valorPrincipal; ... abs
- 1 reply
-
- 1
-
AcbrBancoBrasil CodMotivoRejeicaoToDescricao outros motivos
um tópico no fórum postou rodrigod6 ACBrBoleto
Modifiquei o AcbrBancoBrasil nos motivos do retorno para que não quando ache o motivo, retorne 00-Outros motivos. Fiz a modificação baseado no AcbrSantander que já possui a funcionalidade. 1) Primeira mudança - alinhamento do if que verifica CNAB 400 2) Alinhamento/padronização dos motivos do tipo da ocorrência: toRetornoComandoRecusado: //03 (Recusado) 3) Adicionado um retorno padrão (CNAB 400), semelhante ao que tem no fonte do AcbrSantander, para retornar outros motivos. 4) CNAB 240 - (toRetornoRegistroRecusado) - Alinhado case, e colocado no result os códigos junto com a descrição, seguindo o padrão existente: 5) CNAB 240 -(toRetornoLiquidado, toRetornoBaixaAutomatica, toRetornoLiquidadoSemRegistro: // 06, 09 e 17 (Liquidado)) Colocado no result os códigos junto com a descrição, seguindo o padrão existente: 6) Mesmo acima para toRetornoDebitoTarifas 7) Adicionado um retorno padrão (CNAB 240), semelhante ao que tem no fonte do AcbrSantander, para retornar outros motivos. Segue arquivo fonte para análise se pode ser alterado no Acbr. ACBrBancoBrasil.Acbr.2018.10.26-Correcao.pas Obrigado,- 2 replies
-
- 1
-
- acbrboleto
- acbrbancobrasil
- (e 2 mais)
-
Estou com o mesmo retorno do código A9 no motivo, também no arquivo de retorno do Banco do Brasil. Ele só retornar quando vem o retorno de entrada confirmada no código da ocorrência. No meu arquivo esta retorno assim: 0000000000000000000000161A9 11019088330 000 0000000000000000000000161A9A4 11019088330 000 Primeiro título veio A9 (Linha 1) No segundo veio A9A4 (Linha 3) No layout do CNAB 240 temos o campo 28.3T que identifica os códigos dos motivos das ocorrências Encontrei no final das notas do campo o seguinte trecho: Detalhamento para DDA: Para título DDA, o campo “Código de movimento de retorno”, posição 16 a 17, apresentará a mensagem “02 – Entrada confirmada”. Além disso, no campo “Motivo da Ocorrência”, posição 214 a 223, haverá a mensagem “A4 – Sacado DDA”. Entendo que quando no campo 16-17 vir 02 - Entrada confirmada No motivo da ocorrência vier A4, será A4 - Sacado DDA. Quanto ao A9 não consegui identificar qual o tratamento ou mensagem do mesmo. Teríamos que criar no ACBrBancoBrasil, um código assim: toRetornoRegistroConfirmado: //02 (Entrada) case CodMotivo of 00: Result:='00-Por meio magnético'; 11: Result:='11-Por via convencional'; 16: Result:='16-Por alteração do código do cedente'; 17: Result:='17-Por alteração da variação'; 18: Result:='18-Por alteração de carteira'; A4: Result:='A4-Sacado DDA' end; Mas o campo CodMotivo é do tipo System.Integer não sendo possível fazer isso. Se alguém tiver alguma ideia de como ajustar, pensei em algumas opções: 1 - Mudar a variável da Integer para String; 2 - Colocar o else do case semelhante ao do santander: else Result := IntToStrZero(CodMotivo, 3) + ' - Outros Motivos'; end; Só que ai com 2 e não apareceria o A4. O que acham, alguma ideia? Mais alguém recebeu retornos de entrada confirmadas com este código?
-
Na última versão já tem e diferença do CNAB 240 e 400. function TACBrBancoBrasil.CodMotivoRejeicaoToDescricao(const TipoOcorrencia: TACBrTipoOcorrencia; CodMotivo: Integer): String; begin if (ACBrBanco.ACBrBoleto.LayoutRemessa = c400) then begin // end else //240 // ... Somente para o banco do brasil, e como o colega citou, temos dois layouts (CNAB 240 e CNAB 400) Acho que são esses links BB - Leiaute CNAB 240 - Novembro 2016 BB - Layout de Arquivo - CNAB 400 - Março - 2018
-
Pesquisei e achei esses https://www.projetoacbr.com.br/forum/topic/35914-trasmissão-automática-remessa-e-retorno/?tab=comments#comment-285905
-
Segmento S - Santander e Banco do Brasil - Mensagem C 200
um tópico no fórum postou rodrigod6 ACBrBoleto
Boa tarde, Estou precisando enviar a mensagem do Segmento S, onde possui 200 colunas, para envio no Santander e no Banco do Brasil. Fiz uma análise do fonte da Caixa. Temos no Segmento R - de 40 colunas o campo mensagem 3 (Coluna 100 a 139 - Mensagem 3) - é enviado em branco. {SEGMENTO R} Result:= Result + #13#10 + IntToStrZero(ACBrBanco.Numero, 3) ... PadRight('', 40, ' ') + // 100 a 139 - Mensagem 3 No segmento S é enviado Mensagem 5, 6, 7, 8 e 9, totalizando 200 colunas de mensagem {SEGMENTO S} if (Mensagem.Count > 0) then begin Result := Result + #13#10 + ... MontarInstrucoes2 + // 019 - 058 / Mensagem 5 // 059 - 098 / Mensagem 6 // 099 - 138 / Mensagem 7 // 139 - 178 / Mensagem 8 // 179 - 218 / Mensagem 9 No Banco do Brasil e no Santander, não temos a programação das mensagens no segmento S. No Santander, no segmento S temos a rotina MontarInstrucoes2, mas gera as 200 colunas em branco. Seguindo o exemplo da Caixa, talvez mudando de: function MontarInstrucoes2: string; begin with ACBrTitulo do begin if Mensagem.Count <= 2 then begin // Somente duas linhas, foi montado o MonarInstrucoes1 Result := PadRight('', 200, ' '); // 5 registros Exit; end; Para: function MontarInstrucoes2: string; begin with ACBrTitulo do begin if (Mensagem.Count <= 2) then begin if (Mensagem.Count = 2) then Result := Copy(PadRight(Mensagem[0] +' / '+ Mensagem[1], 200, ' '), 1, 200) else Result := Copy(PadRight(Mensagem[0], 200, ' '), 1, 200); Exit; end; Já no Banco do Brasil, não é gerado nem a Mensagem 3 e nem a mensagem 5, 6, 7, 8 e 9, vejamos o Segmento R: {SEGMENTO R} Result:= Result + #13#10 + ... PadRight('',110,' ') + // 90 - 199 Obs.: Segmento S não tem. Então a sugestão de alteração seria mudar os 110 em branco para 10, 40 e 60: No segmento S: {SEGMENTO R} Result:= Result + #13#10 + ... PadRight('',10,' ') + // 90 - 99 - Informação ao Sacado PadRight(AMensagem,40,' ') + // 100 - 139 - Mensagem 3 PadRight('',60,' ') + // 140 - 199 - Não tratado Se no segmento S a nova programação: {SEGMENTO S} if (Mensagem.Count > 0) then begin Result := Result + #13#10 + IntToStrZero(ACBrBanco.Numero, 3) + // 001 a 003 - Código do banco '0001' + // 004 - 007 - Numero do lote remessa '3' + // 008 - 008 - Tipo de registro IntToStrZero((3 * ACBrBoleto.ListadeBoletos.IndexOf(ACBrTitulo))+ 4 ,5) + // 009 - 013 - Número seqüencial do registro no lote - Cada título tem 2 registros (P e Q) 'S' + // 014 - 014 - Cód. Segmento do registro detalhe Space(1) + // 015 - 015 - Reservado (uso Banco) ATipoOcorrencia + // 016 - 017 - Código de movimento remessa ifthen( (Mensagem.Count <= 2), '0', '8' ) + // 018 - 018 - Identificação da impressão ifthen( (Mensagem.Count <= 2), '00', '' ) + // 019 - 020 - Reservado (uso Banco) para tipo de impressão 1 e 2 MontarInstrucoes2 + // 019 - 058 - Mensagem 5 // 059 - 098 - Mensagem 6 // 099 - 138 - Mensagem 7 // 139 - 178 - Mensagem 8 // 179 - 218 - Mensagem 9 ifthen( (Mensagem.Count <= 2), '00' + Space(78) ,Space(22)); // 219 - 240 - Reservado (uso Banco) para tipo de impressão 3 end; // 161 - 240 - Reservado (uso Banco) para tipo de impressão 1 e 2 {SEGMENTO S - FIM} Segue os arquivos modificados, para verificar a possibilidade de alteração para o envio das Obs no Segmento S do Banco Santander e Banco do Brasil. Obrigado, Rodrigo ACBrBancoSantanderCorrecao.pas ACBrBancoBrasilCorrecao.pas- 1 reply
-
- 1
-
- acbrboleto
- acbrbancobrasil
- (e 3 mais)
-
Banco Santander LerRetorno240 Motivo da Ocorrência quando liquidação
um tópico no fórum postou rodrigod6 ACBrBoleto
Boa tarde Colegas, Estou utilizando o ACBr para envio da remessa e retorno do banco Santander, mas no processamento do retorno encontrei um problema, ou talvez foi feito para ser assim (MotivoRejeicaoComando - somente motivos de rejeição). Primeiro resumidamente é que o Motivo que vem no arquivo quando é liquidação ou baixa(Ocorrência 06 ou 09) ou não está entrando na rotina Titulo.MotivoRejeicaoComando.Add. Assim não temos disponíveis os motivos das ocorrências na baixa/liquidação. Versão mais detalhada: procedure TACBrBancoSantander.LerRetorno240 Layout: Santander - CNAB 240 - Layout de Arquivo - Padrão 240 – Cobrança - Versão 2.8.3 - Setembro/2017 Nota 41 - Indica que o código de ocorrência 03(03 - Entrada rejeitada), 26(26 - instrução rejeitada) e 30(30 - alteração de dados rejeitada) estão relacionados com a nota 41-a E os códigos 06(liquidação), 09(baixa) e 17 estão relacionados com a nota 41-C - Ai temos uma relação - Códigos de rejeições de 01 a 64 associados ao códigos de movimento 03, 26 e 30 - E temos uma relação de Código de liquidação/baixa de 01 a 13 associados ao código de movimento 06, 09 e 17 Bom, analisando um arquivo de retorno do Santander, no segmento, T, na coluna 209(Motivo), quando a ocorrência vem 06(Liquidação) veio os motivos 03(No próprio banco) e 04(Compensação eletrônica). Ai analisando o arquivo do Acbr ( ACBrBancoSantander.pas ) verifiquei que na leitura do retorno na procedure TACBrBancoSantander.LerRetorno240 - DoVerOcorrencia Só tem a tratativa dos motivos das ocorrências 03, 26 e 30, as quais estão ligadas somente as rejeições. if MatchText(AOcorrencia, ['03', '26', '30']) then Mas eu preciso dos motivos das ocorrências 06, 09 e 17, principalmente da 06 e 09 Então minha sugestão de alteração do código seria: if MatchText(AOcorrencia, ['03', '06', '09', '17', '26', '30']) then begin pMotivoRejeicao:= 209; for I:= 0 to 4 do begin CodMotivo:= StrToIntDef(copy(Linha,pMotivoRejeicao,2),0); if CodMotivo > 0 then begin Titulo.MotivoRejeicaoComando.Add(copy(Linha, pMotivoRejeicao, 2)); Titulo.DescricaoMotivoRejeicaoComando.Add(CodMotivoRejeicaoToDescricao( Titulo.OcorrenciaOriginal.Tipo,CodMotivo)); end; Inc(pMotivoRejeicao, 2); end; if AOcorrencia = '03' then Tipo:= toRetornoRegistroRecusado else if AOcorrencia = '26' then Tipo := toRetornoInstrucaoRejeitada else if AOcorrencia = '30' then Tipo := toRetornoAlteracaoDadosRejeitados else if MatchText(AOcorrencia, ['06', '09']) then Tipo := CodOcorrenciaToTipo(StrToInt(AOcorrencia)) else if AOcorrencia = '17' then Tipo := toRetornoLiquidadoAposBaixaOuNaoRegistro end Ou seja incluir no primeiro if o '06', '09', '17'... E colocar no if do Tipo adicionar o 06 , 09 e 17. os quais puxei de baixo onde ele entrava antes. Ver a possibilidade de alteração para que possamos ter os motivos nas ocorrências: (09-baixa ou 06-liquidação) ou se MotivoRejeicaoComando é somente para rejeições e não tem a opção de pegar o motivo quando da baixa. Mas iria enviar o arquivo em anexo do fonte atualizado (2018.05.30) com a alteração mencionada, caso MotivoRejeicaoComando não seja somente rejeição. Mas fui testar a modificação e ai descobri que os códigos de motivos que retornam são os códigos do layout 400. Layout: PRODUTOS RECEBIMENTOS - CNAB 400 (padrão Santander) - Com Registro - Versão 2.17 – Outubro/2017 Página 22 - Nota 13: Códigos de Ocorrências - temos os códigos com 3 dígitos - e na 240 temos com dois dígitos o motivo. Então, seguindo o padrão do ACBrBancoBrasil.pas eu cadastrei os códigos dos motivos para o CNAB 240. Então tive que mudar na procedure TACBrBancoSantander.LerRetorno240 - DoVerOcorrencia Esse código : if AOcorrencia = '03' then Tipo:= toRetornoRegistroRecusado else if AOcorrencia = '26' then Tipo := toRetornoInstrucaoRejeitada else if AOcorrencia = '30' then Tipo := toRetornoAlteracaoDadosRejeitados else if MatchText(AOcorrencia, ['06', '09']) then Tipo := CodOcorrenciaToTipo(StrToInt(AOcorrencia)) else if AOcorrencia = '17' then Tipo := toRetornoLiquidadoAposBaixaOuNaoRegistro; Antes do código da rejeição, pois é necessário saber o Tipo na rotina CodMotivoRejeicaoToDescricao, então ficou assim esse trecho: if MatchText(AOcorrencia, ['03', '06', '09', '17', '26', '30']) then begin if AOcorrencia = '03' then Tipo:= toRetornoRegistroRecusado else if AOcorrencia = '26' then Tipo := toRetornoInstrucaoRejeitada else if AOcorrencia = '30' then Tipo := toRetornoAlteracaoDadosRejeitados else if MatchText(AOcorrencia, ['06', '09']) then Tipo := CodOcorrenciaToTipo(StrToInt(AOcorrencia)) else if AOcorrencia = '17' then Tipo := toRetornoLiquidadoAposBaixaOuNaoRegistro; pMotivoRejeicao:= 209; for I:= 0 to 4 do begin CodMotivo:= StrToIntDef(copy(Linha,pMotivoRejeicao,2),0); if CodMotivo > 0 then begin Titulo.MotivoRejeicaoComando.Add(copy(Linha, pMotivoRejeicao, 2)); Titulo.DescricaoMotivoRejeicaoComando.Add(CodMotivoRejeicaoToDescricao( Titulo.OcorrenciaOriginal.Tipo,CodMotivo)); end; Inc(pMotivoRejeicao, 2); end; Bom agora a mudança no procedimento CodMotivoRejeicaoToDescricao somente a parte do else para o CNAB 240: else // 240 begin case TipoOcorrencia of toRetornoComandoRecusado: //03 (Entrada rejeitada) case CodMotivo of 01: Result:='Codigo do banco invalido'; 02: Result:='Codigo do registro detalhe invalido'; 03: Result:='Codigo do segmento invalido'; 04: Result:='Codigo do movimento nao permitido para carteira'; 05: Result:='Codigo de movimento invalido'; 06: Result:='Tipo/numero de inscricao do beneficiário invalidos'; 07: Result:='Agencia/Conta/DV invalido'; 08: Result:='Nosso numero invalido'; 09: Result:='Nosso numero duplicado'; 10: Result:='Carteira invalida'; 11: Result:='Forma de cadastramento do titulo invalido'; 12: Result:='Tipo de documento invalido'; 13: Result:='Identificacao da emissao do bloqueto invalida'; 14: Result:='Identificacao da distribuicao do bloqueto invalida'; 15: Result:='Caracteristicas da cobranca incompativeis'; 16: Result:='Data de vencimento invalida'; 17: Result:='Data de vencimento anterior a data de emissao'; 18: Result:='Vencimento fora do prazo de operacao'; 19: Result:='Titulo a cargo de Bancos Correspondentes com vencimento inferior XX dias'; 20: Result:='Valor do titulo invalido'; 21: Result:='Especie do titulo invalida'; 22: Result:='Especie nao permitida para a carteira'; 23: Result:='Aceite invalido'; 24: Result:='Data da emissao invalida'; 25: Result:='Data da emissao posterior a data'; 26: Result:='Codigo de juros de mora invalido'; 27: Result:='Valor/Taxa de juros de mora invalido'; 28: Result:='Codigo do desconto invalido'; 29: Result:='Valor do desconto maior ou igual ao valor do titulo '; 30: Result:='Desconto a conceder nao confere'; 31: Result:='Concessao de desconto - ja existe desconto anterior'; 32: Result:='Valor do IOF invalido'; 33: Result:='Valor do abatimento invalido'; 34: Result:='Valor do abatimento maior ou igual ao valor do titulo'; 35: Result:='Abatimento a conceder nao confere'; 36: Result:='Concessao de abatimento - ja existe abatimento anterior'; 37: Result:='Codigo para protesto invalido'; 38: Result:='Prazo para protesto invalido'; 39: Result:='Pedido de protesto nao permitido para o titulo'; 40: Result:='Titulo com ordem de protesto emitida'; 41: Result:='Pedido de cancelamento/sustacao para titulos sem instrucao de protesto'; 42: Result:='Codigo para baixa/devolucao invalido'; 43: Result:='Prazo para baixa/devolucao invalido'; 44: Result:='Codigo da moeda invalido'; 45: Result:='Nome do pagador nao informado'; 46: Result:='Tipo/numero de inscricao do pagador invalidos'; 47: Result:='Endereco do pagador nao informado'; 48: Result:='CEP invalido'; 49: Result:='CEP sem praca de cobranca /nao localizado'; 50: Result:='CEP referente a um Banco Correspondente'; 51: Result:='CEP incompativel com a unidade da federacao'; 52: Result:='Unidade da federacao invalida'; 53: Result:='Tipo/numero de inscricao do sacador/avalista invalidos'; 54: Result:='Sacador/Avalista nao informado'; 55: Result:='Nosso numero no Banco Correspondente nao informado'; 56: Result:='Codigo do Banco Correspondente nao informado'; 57: Result:='Codigo da multa invalido'; 58: Result:='Data da multa invalida'; 59: Result:='Valor/Percentual da multa invalido'; 60: Result:='Movimento para titulo nao cadastrado'; 61: Result:='Alteracao da agencia cobradora/dv invalida'; 62: Result:='Tipo de impressao invalido'; 63: Result:='Entrada para titulo ja cadastrado'; 64: Result:='Numero da linha invalido'; 65: Result:='A espécie de título não permite a instrução'; 72: Result:='Entrada de título Sem Registro'; 90: Result:='Identificador/Quantidade de Parcelas de carnê invalido'; 92: Result:='Data de Desconto Inválida'; end; toRetornoLiquidadoSemRegistro, toRetornoLiquidado, toRetornoLiquidadoPorConta, toRetornoLiquidadoSaldoRestante, toRetornoLiquidadoEmCartorio: // 05, 06, 07, 08 e 15 (Liquidado) case CodMotivo of 01: Result:='01-Por saldo'; 02: Result:='02-Por conta'; 03: Result:='03-No próprio banco'; 04: Result:='04-Compensação eletrônica'; 05: Result:='05-Compensação convencional'; 06: Result:='06-Arquivo magnético'; 07: Result:='07-Após feriado local'; 08: Result:='08-Em cartório'; 09: Result:='09-Pagamento Parcial'; end; else Result := IntToStrZero(CodMotivo, 2) + ' - Outros Motivos'; end; //case TipoOcorrencia end; //else 240 Assim eu consegui ler código do motivo quando a ocorrência vem como liquidado. Como disse não sei se o MotivoRejeicaoComando utiliza somente rejeição, mas a julgar pelo fonte do banco do Brasil, acredito que não, assim esse correção seria interessante. Estou enviando o fonte do Acbr do Santander para análise para verificar a possível alteração. Caso precisem dos manuais também posso disponibiliza-los aqui. Nos testes que fiz aqui deram certo. Abraços, Rodrigo ACBrBancoSantander.pas- 4 replies
-
- santander
- acbrboleto
- (e 3 mais)
-
Boa Tarde, Achei interessante o tópico, vou estudar mais a respeito. Realmente existe a opção citada ( http://docs.tecnospeed.com.br/boleto/BancosHomologados/) Alguns banco que achei em uma breve pesquisa: Banco - 237 - Bradesco Transmissão Automática de Arquivos A transmissão de arquivos ao Banco pode ser realizada automaticamente. Para manter toda a segurança no processo os arquivos devem ser criptografados. Após o envio ficam pendentes de aprovação.Fonte: https://banco.bradesco/html/pessoajuridica/ferramentas/net-empresa/produtos-e-servicos/transferencia-de-arquivos-webta.shtm Banco 104 – CEF Os boletos poderão ser registrados on-line para liquidação em qualquer banco? Sim. A Cobrança Bancária CAIXA permitirá o registro on-line de 3 formas: Integração via Webservice Há possibilidade de registro por meio de integração entre o sistema do Beneficiário e os sistemas da CAIXA via webservice. Este modelo é ideal para situações em que há necessidade de fornecer o boleto no ato de atendimento ao Pagador, seja em uma plataforma web (site) em que o próprio usuário é o Pagador ou em qualquer outro modelo em que um sistema do Beneficiário é utilizado para emissão de boleto em transações individuais (“boleto a boleto”). Fonte: https://www.caixa.gov.br/Downloads/cobranca-caixa/Perguntas_Frequentes-Nova_Plataforma_de_Cobranca_v1-05.pdf Abraços,
-
Importação de XML do Siscomex
rodrigod6 replied to valterpatrick's tópico in Object Pascal - Delphi & Lazarus
Bom Dia Fernando Rodrigo, Legal !! Eu também estou fazendo assim, mesclando os dados da DI e da planilha do Excel que contem os dados! Levante a questão da possibilidade da criação de um objeto no ACBr para todos conseguirem ler a DI! Inclusive , acredito, ter encontrado o layout técnico dos arquivos da DI e Adição no site da Receita Federal. http://idg.receita.fazenda.gov.br/orientacao/aduaneira/manuais/despacho-de-importacao/sistemas/siscomex-importacao-web/declaracao-de-importacao/funcionalidades/links-para-arquivos/ Abs- 23 replies
-
- siscomex
- importação
-
(e 2 mais)
Tags:
-
Importação de XML do Siscomex
rodrigod6 replied to valterpatrick's tópico in Object Pascal - Delphi & Lazarus
Boa Tarde Colegas, Eu também não achei a documentação do XML da DI do Siscomex! Fernando Rodrigo, peguei os seus fontes que usa o XMDocument para leitura, e consegui fazer a leitura do XML. No seu fonte na tag <declaracaoImportacao> coloquei alguns campos a mais: if NodeDeclaracao.ChildNodes[i].NodeName = 'numeroDI' then cNumeroDI := '2'+ NodeDeclaracao.ChildNodes[i].NodeValue; if NodeDeclaracao.ChildNodes[i].NodeName = 'dataRegistro' then dDataRegistroDI := formartDate(NodeDeclaracao.ChildNodes[i].NodeValue); if NodeDeclaracao.ChildNodes[i].NodeName = 'cargaUrfEntradaNome' then cLocalDesemb := NodeDeclaracao.ChildNodes[i].NodeValue; if NodeDeclaracao.ChildNodes[i].NodeName = 'dataDesembaraco' then dDataDesemb := formartDate(NodeDeclaracao.ChildNodes[i].NodeValue); if NodeDeclaracao.ChildNodes[i].NodeName = 'informacaoComplementar' then cObservacoes := NodeDeclaracao.ChildNodes[i].NodeValue; if NodeDeclaracao.ChildNodes[i].NodeName = 'importadorNumero' then // CNPJ cCnpj := NodeDeclaracao.ChildNodes[i].NodeValue; Mas verifiquei que a tag <numeroDI>, só consigo ler ao final , pois a lista de adições estão antes. Mas consegui contornar essa situação. Mas ai cheguei no nó da Adição, onde pode ter diversas mercadorias dentro de uma adição. Tentei fazer a consulta em dois passos, mas sem ter um objeto para guardar os dados ficou difícil, pois não consegui acessar o Nro da adição antes das adições. Então pensei em criar um objeto do ACBr para a leitura do arquivo de Registro de Importação. Agora precisava da ajuda para ver se estou fazendo da maneira correta, ou nos padrões do ACBr para envio. Não está completo, implementado somente com pouco campos para verificação. Baseado em um XML do SisComex: Eu criei um unit Chamada ACBrSiscomex Criei 4 classes(type) type TListaDeclaracoes = class; TdeclaracaoImportacao = class; TadicaoCollection = class; TadicaoCollectionItem = class; Classe raiz <TListaDeclaracoes> que tem dentro uma <TdeclaracaoImportacao> TListaDeclaracoes = class(TPersistent) private FdeclaracaoImportacao: TdeclaracaoImportacao; public constructor Create; destructor Destroy; override; procedure Assign(Source: TPersistent); override; published property declaracaoImportacao: TdeclaracaoImportacao read FdeclaracaoImportacao write FdeclaracaoImportacao; end; Ai criei a classe TdeclaracaoImportacao, a qual tem a coleção de adiçôes e outros atributos TdeclaracaoImportacao = class(TPersistent) private Fadicao: TadicaoCollection; FnumeroDI : String; FtotalAdicoes : Integer; procedure Setadicao(Value: TadicaoCollection); public constructor Create(AOwner: TListaDeclaracoes); destructor Destroy; override; published property adicao: TadicaoCollection read Fadicao write Setadicao; property numeroDI: String read FnumeroDI write FnumeroDI; property totalAdicoes: Integer read FtotalAdicoes write FtotalAdicoes; end; Ai cria a collection com as classes TadicaoCollection e TadicaoCollectionItem: TadicaoCollection = class(TCollection) private function GetItem(Index: Integer): TadicaoCollectionItem; procedure SetItem(Index: Integer; Value: TadicaoCollectionItem); public constructor Create(AOwner: TdeclaracaoImportacao); function Add: TadicaoCollectionItem; property Items[Index: Integer]: TadicaoCollectionItem read GetItem write SetItem; default; end; TadicaoCollectionItem = class(TCollectionItem) private FfornecedorCidade: String; FfornecedorEstado: String; FnumeroAdicao: String; public constructor Create(Collection: TCollection); override; destructor Destroy; override; procedure Assign(Source: TPersistent); override; published property fornecedorCidade: String read FfornecedorCidade write FfornecedorCidade; property fornecedorEstado: String read FfornecedorEstado write FfornecedorEstado; property numeroAdicao: String read FnumeroAdicao write FnumeroAdicao; end; O fonte inicial, de teste, somente com alguns campos para validação da forma de criação está em anexo. O resultado para utilização do objeto seria o seguinte: var ACBrSiscomex1 : TListaDeclaracoes; begin ACBrSiscomex1 := TListaDeclaracoes.Create; ACBrSiscomex1.declaracaoImportacao.numeroDI := '1893293210'; ACBrSiscomex1.declaracaoImportacao.adicao.Add; ACBrSiscomex1.declaracaoImportacao.adicao[0].numeroAdicao := '001'; ACBrSiscomex1.declaracaoImportacao.adicao[0].fornecedorCidade := 'FOR TST'; ACBrSiscomex1.declaracaoImportacao.adicao.Add; ACBrSiscomex1.declaracaoImportacao.adicao[1].numeroAdicao := '002'; ACBrSiscomex1.declaracaoImportacao.adicao[1].fornecedorCidade := 'FOR TST'; Gostaria de ver o que acham da rotina? Sei que tem bastante gente gente mexendo com importação. É viável a criação de um leitor de XML do SisComex nesses moldes? Pois seria muito mais fácil a leitura se tiver os dados dentro do objeto. A forma de criação esta nos padrões do Acbr? Mais um detalhe importante, neste arquivo não temos os cálculos de importação somente a leitura do arquivo do Registro de Importação gerado pelo SISCOMEX! Agradeço a atenção de todos, ACBrSiscomex.pas- 23 replies
-
- 1
-
- siscomex
- importação
-
(e 2 mais)
Tags:
-
Alguém usando Maravilha no NFSe com a Betha no trunk 2? No trunk antigo mudamos no pnfsConversao.pas do provedor Pronim para Betha e está em produção. Migrando para o trunk 2 ainda está como Pronim. [4210506] Nome=Maravilha UF=SC Provedor=Pronim Mudamos para Provedor=Betha Ainda não conseguimos validar, pois está retornando um erro de cadastro, que precisamos ver com a prefeitura que está de férias. Então ainda não posso validar o funcionamento. Temos até um post a respeito da mudança: http://www.projetoacbr.com.br/forum/topic/23943-novo-provedor-de-maravilha-nfse-betha-e-nota/ Alguém já está funcionando no trunk2? Precisamos passar para os moderadores para alterar. @Oneide Luiz Schneider já está no trunk 2? Abraços e feliz natal !!!!
-
Deu certo, Eu esta tentando com as propriedades MostrarStatus e MostrarPreview, Utilizando: ACBrNFeDANFEFR1.ShowDialog ACBrNFeDANFEFR1.ShowDialog := True; Deu certo !!!! Obrigado
- 3 replies
-
- frxreport
- fastreport
- (e 2 mais)
-
Boa Tarde Pessoal, Utilizamos a versão 4 do FR(FastReport), e no FR não tem a opção para selecionar a impressora quando mostramos o preview na tela, ou mesmo antes de imprimir. Isso é uma limitação do FR? Olhando a função: TACBrNFeDANFEFR.PrepareReport Vi que somente busca a impressora setada. FdmDanfe.frxReport.PrintOptions.Printer := FImpressora; Mas na visualização não tem opção de configurar a bandeja, ou trocar a impressora. Fiz um teste utilizando a printers do windows: function TACBrNFeDANFEFR.PrepareReport(NFE: TNFe): Boolean; var printDialog1 : TPrintDialog; //... printDialog1 := TPrintDialog.Create(Self); if PrintDialog1.Execute then begin FdmDanfe.frxReport.PrintOptions.Printer := Printer.Printers[Printer.PrinterIndex]; FdmDanfe.frxReport.PrintOptions.Copies := Printer.Copies; FdmDanfe.frxReport.PrintOptions.ShowDialog := False; end; Ele abre a caixa de diálogo posso escolher a impressora, etc. Ai fiquei na dúvida se não colocaram a uses printers por causa de uma compatibilidade com o Lazarus, ou algo assim? E se pretendem implementar algo assim? Abraços,
- 3 replies
-
- frxreport
- fastreport
- (e 2 mais)
-
Vejam se este vídeo ajuda: Como calcular a partilha do ICMS regulamentada pela NT 2015.003
-
Ainda estou confirmando, mas veja alguns campos como estou pensando em fazer: ICMSUFDest.pICMSInterPart //Percentual provisório de partilha do ICMS Interestadual NFe.Det[idx].Imposto.ICMSUFDest.pICMSInterPart := 0; if getAno(NFe.Ide.dEmi) = 2016 then // 40% em 2016; NFe.Det[idx].Imposto.ICMSUFDest.pICMSInterPart := 40; if getAno(NFe.Ide.dEmi) = 2017 then // 60% em 2017; NFe.Det[idx].Imposto.ICMSUFDest.pICMSInterPart := 60; if getAno(NFe.Ide.dEmi) = 2018 then // 80% em 2018; NFe.Det[idx].Imposto.ICMSUFDest.pICMSInterPart := 80; if getAno(NFe.Ide.dEmi) = 2019 then // 100% em 2018; NFe.Det[idx].Imposto.ICMSUFDest.pICMSInterPart := 100; ICMSUFDest.vICMSUFDest //Valor do ICMS Interestadual para a UF de destino NFe.Det[idx].Imposto.ICMSUFDest.vICMSUFDest := NFe.Det[idx].Imposto.ICMS.vICMS * NFe.Det[idx].Imposto.ICMSUFDest.pICMSInterPart / 100; Procurando tabela Percentual do ICMS relativo ao Fundo de Combate à Pobreza (FCP) na UF de destino ( ICMSUFDest.pFCPUFDest ) ICMSUFDest.pICMSUFDest //Alíquota interna da UF de destino NFe.Det[idx].Imposto.ICMSUFDest.pICMSUFDest := getAliqInterna(UF) - NFe.Det[idx].Imposto.ICMSUFDest.pFCPUFDest; Tudo a confirmar...