# encoding: utf-8 module BoletoBancario module Calculos # === Cálculo do Modulo 10 # # === Passos # # 1) Multiplica-se cada algarismo do campo pela seqüência de multiplicadores 2, 1, 2, 1, 2, 1 ..., posicionados da direita para a esquerda. # # 2) Some individualmente, os algarismos dos resultados dos produtos, obtendo-se o total (N). # # 3) Divida o total encontrado (N) por 10, e determine o resto da divisão como MOD 10 (N). # # 4) Encontre o DAC através da seguinte expressão: # # DAC = 10 - Mod 10 (n) # # OBS.: Se o resultado do passo 4 for 10, considere o DAC = 0. # # ==== Exemplos # # Considerando-se a seguinte representação numérica '12345'. # # 1) Multiplicando a seqüência de multiplicadores: # # 1 2 3 4 5 # * * * * * ===> Multiplicação. # 2 1 2 1 2 # # 2) Some, individualmente: # # 2 + 2 + 6 + 4 + 1 + 0 (Veja a observação abaixo explicando o '1' + '0'). # # => 15 # # OBS.:: Resultado da soma que possua 2 digitos deve somar cada dígito. # Exemplos: 10 -> 1 + 0. 11 -> 1 + 1, 28 -> 2 + 8, etc. # # 3) Divida o total encontrado por 10, a fim de determinar o resto da divisão: # # 15 % 10 # # => 5 # # 4) Calculando o DAC: # # 10 - 5 # # => 5 =======> Resultado final retornado. # class Modulo10 < String # @param [String ou Integer] number (Corresponde ao número a ser calculado pelo Módulo 10) # @return [String] # @example # # BoletoBancario::Calculos::Modulo10.new(1233) # # => "6" # # BoletoBancario::Calculos::Modulo10.new(4411) # # => "5" # # BoletoBancario::Calculos::Modulo10.new('9000') # # => "1" # # BoletoBancario::Calculos::Modulo10.new('6789') # # => "2" # def initialize(number) @number = number super(calculate.to_s) end # @return [String] Resultado final do cálculo do módulo 10. # def calculate sum_total = FatoresDeMultiplicacao.new(@number, fatores: [2, 1]).collect do |result_of_each_sum| Digitos.new(result_of_each_sum).sum end.sum total = 10 - (sum_total % 10) return 0 if total.equal?(10) total end end end end