Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adiciona digito verificador na remessa 400 do Santander #236

Closed
wants to merge 1 commit into from

Conversation

antoniospneto
Copy link
Contributor

Adiciona o calculo do digito verificador na remessa 400 do banco Santander.
(Segui a mesma logica já feito no do Bradesco)

Conforme especificado no manual do Santander:
image

@@ -202,6 +203,13 @@ def conta_padrao_novo?
conta_corrente.present? && conta_corrente.length > 8
end

def digito_nosso_numero(nosso_numero)
"#{nosso_numero.to_s.rjust(7, '0')}".modulo11(
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/UnneededInterpolation: Prefer to_s over string interpolation.

@@ -104,7 +104,8 @@ def monta_detalhe(pagamento, sequencial)
detalhe << documento_cedente.to_s.rjust(14, '0') # cpf/cnpj da empresa 9[14]
detalhe << codigo_transmissao # Código de Transmissão 9[20]
detalhe << pagamento.documento_ou_numero.to_s.ljust(25, ' ') # identificacao do tit. na empresa X[25]
detalhe << pagamento.nosso_numero.to_s.rjust(8, '0') # nosso numero 9[8]
detalhe << pagamento.nosso_numero.to_s.rjust(7, '0') # identificacao do titulo (nosso numero) 9[7]
detalhe << digito_nosso_numero(pagamento.nosso_numero).to_s # nosso numero (dv) 9[01]
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Metrics/LineLength: Line is too long. [121/80]

@@ -104,7 +104,8 @@ def monta_detalhe(pagamento, sequencial)
detalhe << documento_cedente.to_s.rjust(14, '0') # cpf/cnpj da empresa 9[14]
detalhe << codigo_transmissao # Código de Transmissão 9[20]
detalhe << pagamento.documento_ou_numero.to_s.ljust(25, ' ') # identificacao do tit. na empresa X[25]
detalhe << pagamento.nosso_numero.to_s.rjust(8, '0') # nosso numero 9[8]
detalhe << pagamento.nosso_numero.to_s.rjust(7, '0') # identificacao do titulo (nosso numero) 9[7]
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.
Metrics/LineLength: Line is too long. [128/80]
Layout/TrailingWhitespace: Trailing whitespace detected.

@antoniospneto
Copy link
Contributor Author

Esqueci dos testes, logo a noite atualizo aqui 👍🏻

@kivanio
Copy link
Owner

kivanio commented Jul 12, 2022

@netosjb entendi seu patch, mas vou recusá-lo.

A idéia ali é enviar o nosso número completo, já com o dígito.
Ele já foi calculado quando você gera o boleto, o boleto retorna o número completo.

Não seria necessário recalcular dentro da remessa,
até porque se você tem 5 mil boletos,
é cálculo demais para se fazer no momento de gerar a remessa.

Se no Bradesco está assim, devemos retirar.
E talvez mudar o nome para algo nosso_numero_com_dv.

@kivanio kivanio closed this Jul 12, 2022
@antoniospneto
Copy link
Contributor Author

@kivanio

Entendi, minha ideia inicial tbm era já trazer o nosso numero com dv calculado, mas olhando as outras implementações me levou a pensar que não era o padrão correto..
se for verificar no boleto a dv tá sendo calculado internamente pela lib:

# Dígito verificador do nosso número.
# @return [String] 1 caracteres numéricos.
def nosso_numero_dv
nosso_numero.modulo11(
multiplicador: (2..9).to_a,
mapeamento: { 10 => 0, 11 => 0 }
) { |total| 11 - (total % 11) }
end

Será que posso fazer a alteração pra já receber o nosso número com dv tanto pra remessa quanto pro boleto impresso ?

@antoniospneto
Copy link
Contributor Author

@kivanio ah eu acho que você quer dizer é que ao fazer a chamada para gerar o boleto (pdf) a lib retorna pra mim o nosso numero com o dv e eu posso me aproveitar disso para guardar as informações. vou verificar isso e depois faço uma nova PR, muito obrigado!

@kivanio
Copy link
Owner

kivanio commented Jul 12, 2022

Isso

def nosso_numero_boleto

Poderia até ter um nosso_numero_boleto_raw que retorna sem os -/.

@mbcosta
Copy link
Contributor

mbcosta commented Feb 1, 2024

@kivanio apenas para entender melhor essa questão, o calculo do Digito Verificador sendo feito aqui é importante para buscar deixar tudo que é referente ao CNAB dentro da biblioteca, claro que dentro do que for possível, é a ideia genérica de modularizar ou "encapsular" o que é especifico de cada funcionalidade, hoje a aplicação que usa a API https://github.com/akretion/boleto_cnab_api considera que esse calculo fica restrito ao BRCobranca, já que na emissão do Boleto não é necessário passar o "Nosso Número com o DV" e por isso ali simplesmente é devolvido o arquivo PDF a ser impresso, quer dizer toda a logica do DV fica restrita aqui e isso, mesmo para qualquer outra aplicação que usa o BRCobranca, pode ser importante porque ela não precisa se "preocupar" com o DV isso pode ser ignorado e fica "transparente" porque é tratado totalmente aqui, por isso pergunto não é melhor mesmo para outras aplicações e mesmo com a questão de desempenho que esse calculo do DV na geração do Arquivo de Remessa seja feito aqui? A alteração que pode ser feita para atender o caso do Santander 400 é o que está sendo feito no caso do Santander 240

https://github.com/kivanio/brcobranca/blob/master/lib/brcobranca/remessa/cnab240/santander.rb#L92

    def identificador_titulo(nosso_numero)
      nosso_numero_dv = nosso_numero.modulo11(
        multiplicador: (2..9).to_a,
        mapeamento: { 10 => 0, 11 => 0 }
      ) { |total| 11 - (total % 11) }

      "#{nosso_numero}#{nosso_numero_dv}".rjust(13, '0')
    end   

https://github.com/kivanio/brcobranca/blob/master/lib/brcobranca/remessa/cnab240/santander.rb#L42

    def complemento_p(pagamento)
      complemento_p = ''
      complemento_p += conta_corrente.rjust(9, '0')
      complemento_p << digito_conta.to_s
      complemento_p << conta_corrente.rjust(9, '0')
      complemento_p << digito_conta.to_s
      complemento_p << '  '
      complemento_p << identificador_titulo(pagamento.nosso_numero)
      complemento_p
    end

@kivanio
Copy link
Owner

kivanio commented Feb 1, 2024

@mbcosta Não lembro/Sei o motivo desse cálculo sendo feito na remessa.
Mas o que precisa ser feito na remessa é aceitar o que for passado, e nenhum cálculo ser feito.

Isso porque a remessa pode ser usada sem a parte do boleto.
As duas coisas são independentes.
Outro ponto é que a remessa varia de banco pra banco, uns vai com dígito, outros vai sem dígito, então é o bom o controle ficar com o cliente, nesse caso quem estiver usando a gem.
Até porque nesse ponto você já tem o boleto com nosso número calculado, então é só enviar esse mesmo nosso número como parâmetro pra remessa.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants