Ir para conteúdo
  • Cadastre-se

dev botao

Sequência lote Santander


Ver Solução Respondido por Lfm_,

Recommended Posts

Postado

Bom dia Pessoal,

estou gerando remessa CNAB240 para o Santander e o banco me retorna o seguinte:

Citar

Dentro de 1 lote, o número sequencial deve ser crescente sem repetição, que é o que esta ocorrendo.

Segue exemplo em anexo.

Porém no componente eu envio Lote 01 apenas, este sequencial devo informar tbm? É o único banco que tenho problemas.

Desde já agradeço a atenção,

Luiz

 

Exemplo.png

Postado (editado)

Bom dia, segue:
 

VACBrBoleto.Banco.TipoCobranca              := cobSantander;
with  VACBrBoleto.Cedente do
    begin
    Nome                            := VQueryTitulo.FieldByName('NM_CEDENTE').AsString;
    CodigoCedente                   := VQueryTitulo.FieldByName('CD_CEDENTE').AsString;
    CodigoTransmissao               := VQueryTitulo.FieldByName('CD_TRANSMISSAO_BOLETO').AsString;
    Agencia                         := VQueryTitulo.FieldByName('NR_BANCO_AGENCIA').AsString;
    AgenciaDigito                   := Geral.Decode((VACBrBoleto.Banco.TipoCobranca = cobBancoDoBrasil) and
                                                    (VQueryTitulo.FieldByName('NR_DIGITO_AGENCIA').AsString = '0'), 'X', VQueryTitulo.FieldByName('NR_DIGITO_AGENCIA').AsString);
    DigitoVerificadorAgenciaConta   := Geral.Decode(VACBrBoleto.Banco.Numero = 756, '0', '');
    Conta                           := VQueryTitulo.FieldByName('NR_CONTA_BANCO').AsString;
    ContaDigito                     := VQueryTitulo.FieldByName('NR_DIGITO').AsString;
    Modalidade                      := VQueryTitulo.FieldByName('TP_VARIACAO_CARTEIRA').AsString;
    Convenio                        := Geral.Decode(VACBrBoleto.Banco.Numero = 756, ' ', VQueryTitulo.FieldByName('CD_CONVENIO').AsString);
    TipoCarteira                    := tctRegistrada;
    TipoInscricao                   := pJuridica;
    CNPJCPF                         := VQueryTitulo.FieldByName('NR_CNPJ_CEDENTE').AsString;
    Nome                            := VQueryTitulo.FieldByName('NM_CEDENTE').AsString;
    Logradouro                      := VQueryTitulo.FieldByName('DS_ENDERECO_CEDENTE').AsString;
    NumeroRes                       := VQueryTitulo.FieldByName('NR_ENDERECO_CEDENTE').AsString;
    Bairro                          := VQueryTitulo.FieldByName('DS_BAIRRO_CEDENTE').AsString;
    UF                              := VQueryTitulo.FieldByName('CD_UF_CEDENTE').AsString;
    Cidade                          := VQueryTitulo.FieldByName('DS_MUNICIPIO_CEDENTE').AsString;
    Complemento                     := VQueryTitulo.FieldByName('DS_COMPLEMENTO_CEDENTE').AsString;
    end;
with  Titulo.Sacado do
    begin
    Pessoa        := Geral.Decode(VQueryTitulo.FieldByName('TP_SACADO').AsString = 'F', pFisica, pJuridica);
    NomeSacado    := VQueryTitulo.FieldByName('NM_SACADO').AsString;
    CNPJCPF       := VQueryTitulo.FieldByName('NR_DOCUMENTO_SACADO').AsString;
    Logradouro    := VQueryTitulo.FieldByName('DS_ENDERECO_SACADO').AsString;
    Numero        := VQueryTitulo.FieldByName('NR_ENDERECO_SACADO').AsString;
    Complemento   := VQueryTitulo.FieldByName('DS_COMPLEMENTO_SACADO').AsString;
    Bairro        := VQueryTitulo.FieldByName('DS_BAIRRO_SACADO').AsString;
    Cidade        := VQueryTitulo.FieldByName('DS_MUNICIPIO_SACADO').AsString;
    UF            := VQueryTitulo.FieldByName('CD_UF_SACADO').AsString;
    CEP           := VQueryTitulo.FieldByName('CD_CEP_SACADO').AsString;
    end;


with Titulo do
    begin
    SeuNumero                       := VQueryTitulo.FieldByName('CD_CONTA_RECEBER').AsString;
    Vencimento                      := VQueryTitulo.FieldByName('DT_VENCIMENTO').AsDateTime;
    DataDocumento                   := VQueryTitulo.FieldByName('DT_EMISSAO').AsDateTime;
    NumeroDocumento                 := VQueryTitulo.FieldByName('NR_DOCUMENTO').AsString;
    EspecieDoc                      := VQueryTitulo.FieldByName('DS_ESPECIE').AsString;
    EspecieMod                      := VQueryTitulo.FieldByName('TP_MOEDA').AsString;
    Aceite                          := Geral.Decode(VQueryTitulo.FieldByName('TP_ACEITE').AsString = 'S', atSim, atNao);
    DataProcessamento               := VQueryTitulo.FieldByName('DT_PROCESSAMENTO').AsDateTime;
    Carteira                        := VQueryTitulo.FieldByName('TP_CARTEIRA').AsString;
    CarteiraEnvio                   := tceCedente;
    CaracTitulo                     := ObterCaracTitulo(Titulo.Carteira);
    NossoNumero                     := VQueryTitulo.FieldByName('NR_NOSSO_NUMERO').AsString;
    ValorDocumento                  := VQueryTitulo.FieldByName('VL_DOCUMENTO').AsFloat;
    ValorMoraJuros                  := VQueryTitulo.FieldByName('VL_JUROS').AsFloat;
    ValorDesconto                   := 0;
    PercentualMulta                 := VQueryTitulo.FieldByName('VL_MULTA_ATRASO').AsFloat;
    OcorrenciaOriginal.Tipo         := TACBrTipoOcorrencia(VQueryTitulo.FieldByName('TP_OCORRENCIA_BOLETO').AsInteger);
    QtdePagamentoParcial            := 1;
    TipoPagamento                   := tpNao_Aceita_Valor_Divergente;
    PercentualMinPagamento          := 0;
    PercentualMaxPagamento          := 0;
    ValorMinPagamento               := 0;
    ValorMaxPagamento               := 0;
    Instrucao1                      := VQueryTitulo.FieldByName('CD_INSTRUCAO_1').AsString;
    Instrucao2                      := VQueryTitulo.FieldByName('CD_INSTRUCAO_2').AsString;
    Mensagem.Add(VQueryTitulo.FieldByName('DS_MENSAGEM').AsString);
    if  (VQueryTitulo.FieldByName('TP_CLIENTE_GERA_PROTESTO').AsString = 'S') and
        (VQueryTitulo.FieldByName('QT_DIAS_PROTESTO').AsInteger > 0) then
        begin
        DataProtesto          := IncDay(Vencimento, VQueryTitulo.FieldByName('QT_DIAS_PROTESTO').AsInteger);
        TipoDiasProtesto      := diCorridos;
        CodigoNegativacao     := cnProtestarCorrido;
        Mensagem.Add('PROTESTAR EM ' + VQueryTitulo.FieldByName('QT_DIAS_PROTESTO').AsString + ' DIAS CORRIDOS APOS O VENCIMENTO');
        end;
    if  (ValorMoraJuros > 0) then
        begin
        //CodigoMora  := '1';
        if  (VQueryTitulo.FieldByName('TP_VALOR_JUROS').AsString = 'P') then
            CodigoMoraJuros := Geral.Decode(VQueryTitulo.FieldByName('TP_JUROS').AsString = 'D', TACBrCodigoJuros.cjTaxaDiaria, TACBrCodigoJuros.cjTaxaMensal)
        else
            CodigoMoraJuros := Geral.Decode(VQueryTitulo.FieldByName('TP_JUROS').AsString = 'D', TACBrCodigoJuros.cjValorDia, TACBrCodigoJuros.cjValorMensal);

        if  (VQueryTitulo.FieldByName('QT_TOLERANCIA_PAGAMENTO').AsInteger > 0) then
            DataMoraJuros     := IncDay(Vencimento, VQueryTitulo.FieldByName('QT_TOLERANCIA_PAGAMENTO').AsInteger)
        else
            DataMoraJuros     := IncDay(Vencimento, 1);

        if  (VACBrBoleto.Banco.TipoCobranca = cobCaixaEconomica) then
            Mensagem.Add('COBRAR JUROS DE ' + FormatCurr('#,##0.00', ValorMoraJuros) + ' POR CENTO, POR ' + Geral.Decode(VQueryTitulo.FieldByName('TP_JUROS').AsString = 'D', 'DIA', 'MES') + ' DE ATRASO PARA PAGAMENTO ' + Geral.Decode(Vencimento = DataMoraJuros, 'APOS O VENCIMENTO', 'A PARTIR DE ' + FormatDateTime('dd/mm/yyyy', DataMoraJuros)))
        else
            Mensagem.Add('COBRAR JUROS DE ' + FormatCurr('#,##0.00 %', ValorMoraJuros) + ' POR ' + Geral.Decode(VQueryTitulo.FieldByName('TP_JUROS').AsString = 'D', 'DIA', 'MES') + ' DE ATRASO PARA PAGAMENTO ' + Geral.Decode(Vencimento = DataMoraJuros, 'APOS O VENCIMENTO', 'A PARTIR DE ' + FormatDateTime('dd/mm/yyyy', DataMoraJuros)))
        end;
    if  (PercentualMulta > 0) then
        begin
        CodigoMulta       := cmPercentual;
        if  (VQueryTitulo.FieldByName('QT_TOLERANCIA_PAGAMENTO').AsInteger > 0) then
            DataMulta     := IncDay(Vencimento, VQueryTitulo.FieldByName('QT_TOLERANCIA_PAGAMENTO').AsInteger)
        else
            DataMulta     := IncDay(Vencimento, 1);

        if  (VACBrBoleto.Banco.TipoCobranca = cobCaixaEconomica) then
            Mensagem.Add('COBRAR MULTA DE ' + FormatCurr('#,##0.00', PercentualMulta) + ' POR CENTO,' + Geral.Decode(Vencimento = DataMoraJuros, ' APOS O VENCIMENTO', ' A PARTIR DE ' + FormatDateTime('dd/mm/yyyy', DataMoraJuros)))
        else
            Mensagem.Add('COBRAR MULTA DE ' + FormatCurr('#,##0.00 %', PercentualMulta) + Geral.Decode(Vencimento = DataMoraJuros, ' APOS O VENCIMENTO', ' A PARTIR DE ' + FormatDateTime('dd/mm/yyyy', DataMoraJuros)));
        end;

    if  (VACBrBoleto.Banco.TipoCobranca = cobCaixaEconomica) then
        LocalPagamento    := 'EM TODA A REDE BANCÁRIA E SEUS CORRESPONDENTES ATÉ O VALOR LIMITE'
    else
        LocalPagamento    := VACBrBoleto.Banco.LocalPagamento;
    end;

 

Editado por Lfm_
Postado

Todo esse código é dividido em rotinas, juntei tudo em só pra mostrar aqui, antes dele eu faço isso:

 

Titulo    := VACBrBoleto.CriarTituloNaLista;

 

  • Moderadores
Postado
47 minutos atrás, Lfm_ disse:

Todo esse código é dividido em rotinas, juntei tudo em só pra mostrar aqui, antes dele eu faço isso:

 

Titulo    := VACBrBoleto.CriarTituloNaLista;

 

Cerot. então tu injeta o titulo para eles isso ?

remova os WITH e tente novamente

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

Postado
49 minutos atrás, Juliomar Marchetti disse:

Cerot. então tu injeta o titulo para eles isso ?

remova os WITH e tente novamente

Opa, removi aqui e a geração dos arquivos ficou idêntica. Fiz um antes e depois, pq de fato não compreendi o que poderia mudar removendo ele, vejo apenas para o debug uma melhoria.

Mas esse sequencial do arquivo, em algum lugar preciso informar?

  • Moderadores
Postado
3 horas atrás, Lfm_ disse:

Opa, removi aqui e a geração dos arquivos ficou idêntica. Fiz um antes e depois, pq de fato não compreendi o que poderia mudar removendo ele, vejo apenas para o debug uma melhoria.

Mas esse sequencial do arquivo, em algum lugar preciso informar?

Não lembro de precisar. chegou a depurar e ver onde ele gera e quem alimenta dentro do componente

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

Postado
9 minutos atrás, Juliomar Marchetti disse:

Não lembro de precisar. chegou a depurar e ver onde ele gera e quem alimenta dentro do componente

Então, eu vi que ele faz isso aqui embaixo, mas não entendi pq faz, qual a regra disso:
ACBrBancoSantander.pas Linhas 641 à 816
 

 fpQtdRegsLote := 1;

    if sCodMovimento = '01' then
    begin
      if (PercentualMulta = 0) then
        fpQtdRegsLote := 3
      else
        fpQtdRegsLote := 4;

      if (ACBrTitulo.ACBrBoleto.Cedente.PIX.TipoChavePIX <> tchNenhuma) then
        fpQtdRegsLote := fpQtdRegsLote + 1;

    end;

    ISequencia := (ACBrBoleto.ListadeBoletos.IndexOf(ACBrTitulo) * fpQtdRegsLote) + 1;

...

 

  • Moderadores
Postado

ele tem o lote 1

se o SCodMOvimento = 01 que não sei de onde ele vem pois não olhei ocódigo ele vai modificar

dai ele trata se o percentuial igual zero 3 senão 4 para o lote

e se a chave pix for diferente ali ele soma mais um 

e ao final ele retorna. 

o que tu não entendeu ai, é um teste de mesa fácil de fazer. só falta ainda informações de onde vem o 01 do scodMovimento

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

  • Solution
Postado
1 hora atrás, Juliomar Marchetti disse:

ele tem o lote 1

se o SCodMOvimento = 01 que não sei de onde ele vem pois não olhei ocódigo ele vai modificar

dai ele trata se o percentuial igual zero 3 senão 4 para o lote

e se a chave pix for diferente ali ele soma mais um 

e ao final ele retorna. 

o que tu não entendeu ai, é um teste de mesa fácil de fazer. só falta ainda informações de onde vem o 01 do scodMovimento

Tá certo, pela educação não estão afim de resolver.

  • Moderadores
Postado
8 minutos atrás, Lfm_ disse:

Tá certo, pela educação não estão afim de resolver.

Não entendi.!?

tu viu que postei acima o que o código faz no teste de mesa. e aqui é um fórum gratuito e aberto e veja estou analisando contigo o que tem ali e o que tá sendo enviado e ainda assim está ruim?

conseguiu depurar. eu não estou usando o santander eu estou aqui tentando te ajudar e mesmo assim parece que não quero ajudar ?

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

Postado

Eu tbm não uso santander, é um cliente que passou a usar, e não conheço a lógica ou não-lógica do banco...

A forma como alimento o componente funciona bem gostoso pra todos os bancos, só pra essa coisa fofa ai que não...

Já busquei uma solução pra não ter que ficar depurando e perdendo tempo buscando... como vc disse o fórum é gratuito e aberto, ou seja, esperamos que alguém que conheça o banco ou as maluquices dele responda, se não responder, ai terei que correr atrás.. que pelo visto é o que vou ter que fazer

  • Moderadores
Postado
5 minutos atrás, Lfm_ disse:

Eu tbm não uso santander, é um cliente que passou a usar, e não conheço a lógica ou não-lógica do banco...

mas tu tem as credenciais e o código é pascal. ele também é bem fofo e dai é só depurar e entender oque está informando os fontes estão ai para isso por isso é gratuito. para que tu possa depurar 

é só usar o F7 e o F8 e garanto que 30 minutos tu já descobriu o que tá fazendo gerar esses lotes. claro que para tudo é preciso ler os manuais seja de qual banco ou implementação que for fazer. 

acho que é um bom caminho pra ti resolver , pois o código está pronto. é só depurar e resolve

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

Postado
15 minutos atrás, Juliomar Marchetti disse:

mas tu tem as credenciais e o código é pascal. ele também é bem fofo e dai é só depurar e entender oque está informando os fontes estão ai para isso por isso é gratuito. para que tu possa depurar 

é só usar o F7 e o F8 e garanto que 30 minutos tu já descobriu o que tá fazendo gerar esses lotes. claro que para tudo é preciso ler os manuais seja de qual banco ou implementação que for fazer. 

acho que é um bom caminho pra ti resolver , pois o código está pronto. é só depurar e resolve

A sequência, sai de sequência, se na remessa tiver boletos variados, um com multa e outro não, o certo era iniciar o ISequencia com a sequencia gerada no registro anterior.
 

 ISequencia := (ACBrBoleto.ListadeBoletos.IndexOf(ACBrTitulo) * fpQtdRegsLote) + 1; //AQUI TERIA QUE INICIAR COM A SEQUENCIA ANTERIOR


Terei que ver como resolver agora..
 

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.