gutembergscosta Postado 22 Novembro Postado 22 Novembro Olá pessoal, homologuei o boleto Santander via cnab400 hibrido, contudo, para homologar o registro relacionado ao Pix, se fez necessário duas alterações, as quais reporto aqui para ajuste no projeto. Anexei duas imagens uma como o registro ficou, depois de alterado, e a outra com a nota/instrução do manual do banco onde fala sobre isso. 1) O registro=8, obrigatoriamente precisa ser inserido no arquivo logo depois do registro=1, e no caso antes do registro=2 (imagem anexada), somente assim o registro hibrido foi aceito pelo banco. 2) no registro 8 tem um uppercase, foi necessário retirar, uma vez que a chave pix passada foi um e-mail, e no caso o banco considera em minusculo. Abaixo a procedure TACBrBancoSantander.GerarRegistroTransacao400, modificada. procedure TACBrBancoSantander.GerarRegistroTransacao400(ACBrTitulo :TACBrTitulo; aRemessa: TStringList); var DigitoNossoNumero, Ocorrencia,aEspecie :String; Protesto, aAgencia, TipoSacado, wLinha :String; aCarteira, I: Integer; LMensagem1, LMensagem2, LMensagem3 : 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 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(wLinha); 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)); end; end; end; end;
Moderadores Juliomar Marchetti Postado 22 Novembro Moderadores Postado 22 Novembro por favor anexe suas units modificadas? Juliomar Marchetti skype: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br
gutembergscosta Postado 22 Novembro Autor Postado 22 Novembro (editado) 2 horas atrás, Juliomar Marchetti disse: por favor anexe suas units modificadas? Alteração na procedure TACBrBancoSantander.GerarRegistroTransacao400(ACBrTitulo :TACBrTitulo; aRemessa: TStringList); ACBrBancoSantander.pas Editado 22 Novembro por gutembergscosta
Moderadores Juliomar Marchetti Postado 22 Novembro Moderadores Postado 22 Novembro @Daniel InfoCotidiano Juliomar Marchetti skype: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br
gutembergscosta Postado 22 Novembro Autor Postado 22 Novembro 2 horas atrás, Juliomar Marchetti disse: @Daniel InfoCotidiano Favor desconsiderar esse .pas, por algum motivo não foi o completamente alterado, inclusive, estou agora alterando o retorno para contemplar o registro pix de retorno, desculpe, logo mais envio o atualizado, definitivo.
gutembergscosta Postado 22 Novembro Autor Postado 22 Novembro (editado) Olá, Segue o arquivo devidamente ajustado ... nesse caso houve mais ajustes, tanto no envio, quanto no retorno, então as alterações ocorreram nas seguintes procedures; procedure GerarRegistroTransacao400(ACBrTitulo : TACBrTitulo; aRemessa: TStringList); override; Procedure LerRetorno400(ARetorno:TStringList); override; Percebi que essa funcition que retorna a descrição da rejeição está desatualizada em conformidade com a documentação / layout, caso desejem atualizar. function TACBrBancoSantander.CodMotivoRejeicaoToDescricao( const TipoOcorrencia:TACBrTipoOcorrencia; CodMotivo: Integer) : String; Obrigado. ACBrBancoSantander.pas 24-08-05_132259_cobrancas_400_ptbr[1].pdf Editado 22 Novembro por gutembergscosta
Recommended Posts
Crie uma conta ou entre para comentar
Você precisar ser um membro para fazer um comentário
Criar uma conta
Crie uma nova conta em nossa comunidade. É fácil!
Crie uma nova contaEntrar
Já tem uma conta? Faça o login.
Entrar Agora