pjunior
Membros-
Total de ítens
53 -
Registro em
-
Última visita
Últimos Visitantes
O bloco dos últimos visitantes está desativado e não está sendo visualizado por outros usuários.
pjunior's Achievements
-
Beleza, é que como foi no meio do código, achei melhor colar ela toda, já na posição certa e marcar com negrito o que foi alterado. segue: var: LMensagem4, LMensagem5, LMensagem6 : String; linha 927: //2ª linha de mensagem LMensagem4 := ''; LMensagem5 := ''; LMensagem6 := ''; if Mensagem.Count >= 4 then LMensagem4 := TiraAcentos(Mensagem[3]); if Mensagem.Count >= 5 then LMensagem5 := TiraAcentos(Mensagem[4]); if Mensagem.Count >= 6 then LMensagem6 := TiraAcentos(Mensagem[5]); wLinha:= '2' + // 001-001 "2" - Recibo Pagador space(16) + // 002-017 Reservado Banco PadLeft(Cedente.CodigoTransmissao,20,'0') + // 018-037 Agencia / Conta Movimento / Conta Cobranca Space(10) + // 038-047 Reservado Banco '01' + // 048-049 SubRegistro "01" PadRight(LMensagem4, 50) + // 050-099 Mensagem Variavel '02' + // 100-101 SubSequencia "02" PadRight(LMensagem5, 50) + // 102-151 Mensagem Variavel '02' + // 152-153 SubSequencia "02" PadRight(LMensagem6, 50) + // 154-203 Mensagem Variavel Space(179) + // 204-382 Reservado Banco 'I' + // 383-383 Identificação do Complemento PadLeft(Copy( Cedente.Conta, length( Cedente.Conta ),1 ), 1, '0') + PadLeft( Cedente.ContaDigito, 1, '0' ) + // 384-385 Complemento Space(9) + // 386-394 Reservado Banco IntToStrZero( aRemessa.Count + 1 , 6 ); // 395-400 Sequencial de Registro if (LMensagem4 <> '') or (LMensagem5 <> '') or (LMensagem6 <> '') then aRemessa.Add(UpperCase(wLinha)); aí termina antes de começar a parte do PIX. segue o arquivo em anexo: ACBrBancoSantander.pas
-
pjunior started following Boleto Santander - Mensagens
-
Boa tarde, td bem ? Estou implementando o Santander no sistema, e estou com uma dúvida / diferença no segmento pra mensagem. Antes eu usava o código 6, e vi agora que o ACBr usa o 2. Até aí acho q OK. Mas em determinadas situações, preciso de 4 ou até 5 mensagens, e vi que o ACBR gera só 3. Fiz um ajuste na procedure, segue ela abaixo, e destacado os pontos alterados: procedure TACBrBancoSantander.GerarRegistroTransacao400(ACBrTitulo :TACBrTitulo; aRemessa: TStringList); var DigitoNossoNumero, Ocorrencia,aEspecie :String; Protesto, aAgencia, TipoSacado, wLinha :String; aCarteira, I: Integer; LMensagem1, LMensagem2, LMensagem3 : String; LMensagem4, LMensagem5, LMensagem6 : String; LTipoChaveDICT, Ltipopagamento : string; begin aCarteira := StrToIntDef( DefineCarteira(ACBrTitulo) , 0); if aCarteira = 5 then aAgencia := PadLeft(OnlyNumber(ACBrTitulo.ACBrBoleto.Cedente.Agencia) + ACBrTitulo.ACBrBoleto.Cedente.AgenciaDigito,5,'0') else aAgencia:= '00000'; FvTotalTitulos := FvTotalTitulos + ACBrTitulo.ValorDocumento; with ACBrTitulo do begin DigitoNossoNumero := CalcularDigitoVerificador(ACBrTitulo); {Tipo de Ocorrencia} ocorrencia := TipoOcorrenciaToCodRemessa(ACBrTitulo.OcorrenciaOriginal.Tipo); {Especie Documento} aEspecie := DefineEspecieDoc(ACBrTitulo); {Instruções} Protesto := InstrucoesProtesto(ACBrTitulo); {Pegando Tipo de Sacado} TipoSacado := DefineTipoSacado(ACBrTitulo); with ACBrBoleto do begin wLinha:= '1' + // 1- ID Registro IfThen(Cedente.TipoInscricao = pJuridica,'02','01') + // 2 a 3 PadLeft(trim(OnlyNumber(Cedente.CNPJCPF)),14,'0') + // 4 a 17 PadRight(trim(Cedente.CodigoTransmissao),20,'0') + // 18 a 37 PadRight( SeuNumero ,25,' ') + // 38 a 62 PadLeft(RightStr(NossoNumero,7),7,'0') + DigitoNossoNumero + // 63 a 70 IfThen(DataAbatimento < EncodeDate(2000,01,01), '000000', FormatDateTime( 'ddmmyy', DataAbatimento)) + // 71 a 76 ' '+IfThen(PercentualMulta > 0,'4','0') + // 77 a 78 IntToStrZero( round( PercentualMulta * 100 ), 4) + // 79 a 82 '00'+StringOfChar( '0', 13)+space(4) + // 83 a 101 IfThen((DataMulta <= 0),'000000', FormatDateTime( 'ddmmyy', DataMulta)) + // 102 a 107 IntToStr(aCarteira) + Ocorrencia + // 108 a 110 PadRight( NumeroDocumento,10,' ') + // 111 a 120 FormatDateTime( 'ddmmyy', Vencimento) + // 121 a 126 IntToStrZero( round( ValorDocumento * 100), 13) + // 127 a 139 '033' + aAgencia + // 140 a 147 PadLeft(aEspecie, 2) + 'N' + // 148 a 150 FormatDateTime( 'ddmmyy', DataDocumento ) + // 151 a 156 PadLeft(trim(Instrucao1),2,'0') + // 157 a 158 PadLeft(trim(Instrucao2),2,'0') + // 159 a 160 IntToStrZero( round(ValorMoraJuros * 100 ), 13) + // 161 a 173 IfThen(DataDesconto < EncodeDate(2000,01,01), '000000', FormatDateTime( 'ddmmyy', DataDesconto)) + // 174 a 179 IntToStrZero( round( ValorDesconto * 100), 13) + // 180 a 192 IntToStrZero( round( ValorIOF * 100 ), 13) + // 193 a 205 IntToStrZero( round( ValorAbatimento * 100 ), 13) + // 206 a 218 TipoSacado + PadLeft(OnlyNumber(Sacado.CNPJCPF),14,'0') + // 219 a 234 PadRight( Sacado.NomeSacado, 40, ' ') + // 235 a 274 PadRight( Sacado.Logradouro + ' '+ Sacado.Numero, 40, ' ') + // 275 a 314 PadRight( Sacado.Bairro,12,' ') + // 315 a 326 PadRight( OnlyNumber(Sacado.CEP) , 8, ' ' ) + // 327 a 334 PadRight( Sacado.Cidade, 15, ' ') + PadRight( Sacado.UF, 2 ) + // 335 a 351 Space(30) + // 352 a 381 ' I' + // 382 a 383 Copy( Cedente.Conta, length( Cedente.Conta ),1 ) + // PadLeft( Cedente.ContaDigito, 1 ) + // 384 a 385 Space(6) + // 386 a 391 Protesto + ' ' + // 392 a 394 IntToStrZero( aRemessa.Count + 1, 6 ); // 395 a 400 aRemessa.Add(UpperCase(wLinha)); LMensagem1 := ''; LMensagem2 := ''; LMensagem3 := ''; if Mensagem.Count >= 1 then LMensagem1 := TiraAcentos(Mensagem[0]); if Mensagem.Count >= 2 then LMensagem2 := TiraAcentos(Mensagem[1]); if Mensagem.Count >= 3 then LMensagem3 := TiraAcentos(Mensagem[2]); wLinha:= '2' + // 001-001 "2" - Recibo Pagador space(16) + // 002-017 Reservado Banco PadLeft(Cedente.CodigoTransmissao,20,'0') + // 018-037 Agencia / Conta Movimento / Conta Cobranca Space(10) + // 038-047 Reservado Banco '01' + // 048-049 SubRegistro "01" PadRight(LMensagem1, 50) + // 050-099 Mensagem Variavel '02' + // 100-101 SubSequencia "02" PadRight(LMensagem2, 50) + // 102-151 Mensagem Variavel '02' + // 152-153 SubSequencia "02" PadRight(LMensagem3, 50) + // 154-203 Mensagem Variavel Space(179) + // 204-382 Reservado Banco 'I' + // 383-383 Identificação do Complemento PadLeft(Copy( Cedente.Conta, length( Cedente.Conta ),1 ), 1, '0') + PadLeft( Cedente.ContaDigito, 1, '0' ) + // 384-385 Complemento Space(9) + // 386-394 Reservado Banco IntToStrZero( aRemessa.Count + 1 , 6 ); // 395-400 Sequencial de Registro aRemessa.Add(UpperCase(wLinha)); //2ª linha de mensagem LMensagem4 := ''; LMensagem5 := ''; LMensagem6 := ''; if Mensagem.Count >= 4 then LMensagem4 := TiraAcentos(Mensagem[3]); if Mensagem.Count >= 5 then LMensagem5 := TiraAcentos(Mensagem[4]); if Mensagem.Count >= 6 then LMensagem6 := TiraAcentos(Mensagem[5]); wLinha:= '2' + // 001-001 "2" - Recibo Pagador space(16) + // 002-017 Reservado Banco PadLeft(Cedente.CodigoTransmissao,20,'0') + // 018-037 Agencia / Conta Movimento / Conta Cobranca Space(10) + // 038-047 Reservado Banco '01' + // 048-049 SubRegistro "01" PadRight(LMensagem4, 50) + // 050-099 Mensagem Variavel '02' + // 100-101 SubSequencia "02" PadRight(LMensagem5, 50) + // 102-151 Mensagem Variavel '02' + // 152-153 SubSequencia "02" PadRight(LMensagem6, 50) + // 154-203 Mensagem Variavel Space(179) + // 204-382 Reservado Banco 'I' + // 383-383 Identificação do Complemento PadLeft(Copy( Cedente.Conta, length( Cedente.Conta ),1 ), 1, '0') + PadLeft( Cedente.ContaDigito, 1, '0' ) + // 384-385 Complemento Space(9) + // 386-394 Reservado Banco IntToStrZero( aRemessa.Count + 1 , 6 ); // 395-400 Sequencial de Registro if (LMensagem4 <> '') or (LMensagem5 <> '') or (LMensagem6 <> '') then aRemessa.Add(UpperCase(wLinha)); if (ACBrTitulo.ACBrBoleto.Cedente.PIX.TipoChavePIX <> tchNenhuma) then begin case ACBrTitulo.ACBrBoleto.Cedente.PIX.TipoChavePIX of tchCPF : LTipoChaveDICT := '1'; tchCNPJ : LTipoChaveDICT := '2'; tchCelular : LTipoChaveDICT := '3'; tchEmail : LTipoChaveDICT := '4'; tchAleatoria : LTipoChaveDICT := '5'; end; case tipopagamento of tpAceita_Qualquer_Valor : Ltipopagamento := '01'; tpAceita_Valores_entre_Minimo_Maximo: Ltipopagamento := '02'; tpNao_Aceita_Valor_Divergente: Ltipopagamento := '03'; end; wLinha:= '8' + // 001 - 001 PIX Ltipopagamento + // 002 - 003 Identificação do tipo de pagamento IntToStrZero(QtdeParcelas,2) + // 004 - 005 Quantidade de pagamento possíveis '2' + // 006 - 006 Tipo de valor informado (1=%, 2=Valor) IntToStrZero( round( ValorDocumento * 100), 13) + // 007 - 019 Valor Máximo PadLeft('0',5,'0') + // 020 - 024 % (Percentual) Máximo IntToStrZero( round( ValorDocumento * 100), 13) + // 025 - 037 Valor Mínimo PadLeft('0',5,'0') + // 038 - 042 % (Percentual) Mínimo LTipoChaveDICT + // 043 - 043 Tipo de Chave Pix PadRight(ACBrTitulo.ACBrBoleto.Cedente.PIX.Chave,77,' ') + // 044 - 120 Chave Pix PadRight(QrCode.txId,35,' ') + // 121 - 155 Código de identificação do Qr Code (TXID) Space(239) + // 156 - 394 Reservado (uso Banco) IntToStrZero( aRemessa.Count + 1 , 6 ); // 395 - 400 Sequencial de Registro aRemessa.Add(UpperCase(wLinha)); end; end; end; end;
-
Oi, boa tarde. Então, pelo que entendi seria da vontade do BB, pq andei acompanhando, e de tempos em tempos o início muda, meio que aleatoriamente.
-
Isso mesmo... Teria que iniciar da posição 38, nesse caso, pois esse início varia.
-
Boa tarde, td bem ? o BB me respondeu hoje sobre a questão: Prezada Erika, boa tarde. O tipo de convênio do Cliente é "1" (Bco: Numera, emite e expede). Nesse caso, excepcionalmente, o Sistema CBR não segue a regra orientada no Manual "Especificações Técnicas para Confecção de Boleto de Cobrança do Banco do Brasil", para composição do Nosso Número questionada na mensagem do TI Junior.
-
OK, obrigado. Eu fiz um ajuste temporário aqui, pra fazer funcionar esse caso, e vou testar. Vou cobrar a gerente novamente, pois já abri um chamado com ela faz um certo tempo, e não obtive retorno até agora
-
Boa tarde pessoal. Ref. ao tópico que abri nesse link: Eu estava com problemas na reimpressão de boletos. Consegui ganhar um tempo junto ao cliente, enquanto a gerente da conta verificava o caso ( que nunca mais me retornou ). Recapitulando esse caso, a empresa envia o arquivo de remessa para o banco ( sem o nosso número, e com convênio de 5 dígitos, carteira 31 ), e o banco gera o NN, registra, e despacha os boletos. Quando o retorno volta ( ocorrência 02 ), preciso vincular o NN do arquivo no sistema, para que, quando ocorra o pagamento, o título seja baixado. Agora, ocorre o seguinte, essa numeração que o banco gera, não entra nas regras que a função "NossoNumeroSemFormatacaoLerRetorno" cobre. Ou seja, tenho um caso específico aqui, onde 2 títulos tem os seguintes NNs: 06072113764 e 06098513764, e foram registrados em momentos e com arquivos diferentes. Quando passa pela função NossoNumeroSemFormatacaoLerRetorno em ambos casos é retornado somente 13764, e ocorreu do sistema localizar e baixar um título que não foi pago. Eu precisaria do número da posição 38 até a 48 nesse caso ( 11 dígitos ). O que podemos fazer ?
-
Opa, beleza, Não tinha atualizado. Vou fazer isso após almoço e recompilo tudo. Obrigado pelo retorno.
-
Bom dia. Não sei se alguém passou por isso, ao fazer um MFe1.Manifestos.LoadFromfile(), estou recebendo um erro: "List Index out of Bounds(0)". Isso foi após a atualização dos fontes no dia 06/03/19. Após verificar nos códigos, na function abaixo: function TinfContratanteCollection.New: TinfContratanteCollectionItem; begin Result := TinfContratanteCollectionItem.Create; end; Adicionei mais uma linha, ficando assim; function TinfContratanteCollection.New: TinfContratanteCollectionItem; begin Result := TinfContratanteCollectionItem.Create; Self.Add(Result); end; Feito isso, o problema foi resolvido.
-
Sim, o métoto LerRetorno240 usa a "NossoNumeroSemFormatacaoLerRetorno" para retornar o Nosso número. Eu só preciso saber se esse número "060752" é algum cadastro da conta do cedente, ou se é aleatório do banco na hora de gerar o Nosso número. Se for do cadastro, consigo resolver pelo cadastro da conta. Só tive problema com esse cliente, pelo fato do banco gerar o número pra ele. Dos demais está OK, conforme a Juliana passou antes.
-
Esqueci de mencionar um detalhe .. Nessa conta, o banco que gera o Nosso Número ... Mas acho que isso não influi, certo ?
-
Olá. Obrigado pela resposta. Eu pensei nisso, mas é que no caso dessa conta, o convênio é "36589", e no nosso número inicia com "060752"
-
Bom dia pessoal, Estou com uma dúvida no retorno do Banco do Brasil ( Cnab 240 ), quando faz a leitura do arquivo, a função "NossoNumeroSemFormatacaoLerRetorno" está parametrizada para montar o Nosso Número conforme o nº de dígitos do convênio. Mas está parecendo meio confuso, pois pelo que vi na documentação, não bate com o conteúdo que retorna na função. ex.: no arquivo anexo, o 1º título seria Nosso Número "06075265120" com DV "3", mas me retorna somente "65120". Caso eu precise montar uma impressão de boletos, ocorre uma divergência no código de barras/ linha digitável, em comparação ao boleto emitido pelo banco. Alguém mais tem tido algum problema quanto a isso ? IEDCBR45993007201822251.ret
-
Bom dia Italo !! Grato pela resposta .. Isso mesmo .. Essas tags q vc passou, antes de eu alterar, estavam vindo vazias .. Aí pra esse caso q eu precisava fazer a leitura, a alteração resolveu .. A função do componente será acertada para esses casos q vc me passou acima ?? []´s Junior.
-
Olá ... Preciso carregar um CTE ( loadfromfile ), para extrair os dados dele .. No CTe em anexo, como faço pra ver as tags cStat, xMotivo e nProt ? Pelo q vi ele não tem a tag </cteProc> somente a <procCTe> ... localizei e alterei no arquivo ACBrConhecimentos.pas, na função LoadFromFile, o seguinte trecho: if pos('</cteProc>', ArquivoXML.Text) > 0 then begin XML := copy(ArquivoXML.Text, 1, pos('</cteProc>', ArquivoXML.Text) + 5); ArquivoXML.Text := Trim(copy(ArquivoXML.Text, pos('</cteProc>', ArquivoXML.Text) + 10, length(ArquivoXML.Text))); end else begin XML := copy(ArquivoXML.Text, 1, pos('</CTe>', ArquivoXML.Text) + 5); ArquivoXML.Text := Trim(copy(ArquivoXML.Text, pos('</CTe>', ArquivoXML.Text) + 6,length(ArquivoXML.Text))); end; a alteração ficou: if pos('</cteProc>', ArquivoXML.Text) > 0 then begin XML := copy(ArquivoXML.Text, 1, pos('</cteProc>', ArquivoXML.Text) + 5); ArquivoXML.Text := Trim(copy(ArquivoXML.Text, pos('</cteProc>', ArquivoXML.Text) + 10, length(ArquivoXML.Text))); end else // começa aqui ... if pos('</procCTe>', ArquivoXML.Text) > 0 then begin XML := copy(ArquivoXML.Text, 1, pos('</procCTe>', ArquivoXML.Text) + 5); ArquivoXML.Text := Trim(copy(ArquivoXML.Text, pos('</procCTe>', ArquivoXML.Text) + 10, length(ArquivoXML.Text))); end else // termina aqui ... begin XML := copy(ArquivoXML.Text, 1, pos('</CTe>', ArquivoXML.Text) + 5); ArquivoXML.Text := Trim(copy(ArquivoXML.Text, pos('</CTe>', ArquivoXML.Text) + 6,length(ArquivoXML.Text))); end; A alteração resolveu o problema.. mas, está correto isso ?? Obrigado desde já !! 35140412700261000101570010000000451000700049-cte.xml