Ir para conteúdo
  • Cadastre-se

dev botao

Recommended Posts

Postado

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;

acbr_santander1.png

acbr_santander2.png

Postado (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 por gutembergscosta

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 conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...
The popup will be closed in 10 segundos...